Fix warnings building linux-atomic.c and fptr.c on hppa64-linux
[official-gcc.git] / gcc / value-prof.c
blob42748771192f8302cfe637d23d589848d9b8fcb7
1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2021 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "cfghooks.h"
28 #include "ssa.h"
29 #include "cgraph.h"
30 #include "coverage.h"
31 #include "data-streamer.h"
32 #include "diagnostic.h"
33 #include "fold-const.h"
34 #include "tree-nested.h"
35 #include "calls.h"
36 #include "expr.h"
37 #include "value-prof.h"
38 #include "tree-eh.h"
39 #include "gimplify.h"
40 #include "gimple-iterator.h"
41 #include "tree-cfg.h"
42 #include "gimple-pretty-print.h"
43 #include "dumpfile.h"
44 #include "builtins.h"
46 /* In this file value profile based optimizations are placed. Currently the
47 following optimizations are implemented (for more detailed descriptions
48 see comments at value_profile_transformations):
50 1) Division/modulo specialization. Provided that we can determine that the
51 operands of the division have some special properties, we may use it to
52 produce more effective code.
54 2) Indirect/virtual call specialization. If we can determine most
55 common function callee in indirect/virtual call. We can use this
56 information to improve code effectiveness (especially info for
57 the inliner).
59 3) Speculative prefetching. If we are able to determine that the difference
60 between addresses accessed by a memory reference is usually constant, we
61 may add the prefetch instructions.
62 FIXME: This transformation was removed together with RTL based value
63 profiling.
66 Value profiling internals
67 ==========================
69 Every value profiling transformation starts with defining what values
70 to profile. There are different histogram types (see HIST_TYPE_* in
71 value-prof.h) and each transformation can request one or more histogram
72 types per GIMPLE statement. The function gimple_find_values_to_profile()
73 collects the values to profile in a vec, and adds the number of counters
74 required for the different histogram types.
76 For a -fprofile-generate run, the statements for which values should be
77 recorded, are instrumented in instrument_values(). The instrumentation
78 is done by helper functions that can be found in tree-profile.c, where
79 new types of histograms can be added if necessary.
81 After a -fprofile-use, the value profiling data is read back in by
82 compute_value_histograms() that translates the collected data to
83 histograms and attaches them to the profiled statements via
84 gimple_add_histogram_value(). Histograms are stored in a hash table
85 that is attached to every intrumented function, see VALUE_HISTOGRAMS
86 in function.h.
88 The value-profile transformations driver is the function
89 gimple_value_profile_transformations(). It traverses all statements in
90 the to-be-transformed function, and looks for statements with one or
91 more histograms attached to it. If a statement has histograms, the
92 transformation functions are called on the statement.
94 Limitations / FIXME / TODO:
95 * Only one histogram of each type can be associated with a statement.
96 * Some value profile transformations are done in builtins.c (?!)
97 * Updating of histograms needs some TLC.
98 * The value profiling code could be used to record analysis results
99 from non-profiling (e.g. VRP).
100 * Adding new profilers should be simplified, starting with a cleanup
101 of what-happens-where and with making gimple_find_values_to_profile
102 and gimple_value_profile_transformations table-driven, perhaps...
105 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
106 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
107 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
108 static bool gimple_stringops_transform (gimple_stmt_iterator *);
109 static void dump_ic_profile (gimple_stmt_iterator *gsi);
111 /* Allocate histogram value. */
113 histogram_value
114 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
115 enum hist_type type, gimple *stmt, tree value)
117 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
118 hist->hvalue.value = value;
119 hist->hvalue.stmt = stmt;
120 hist->type = type;
121 return hist;
124 /* Hash value for histogram. */
126 static hashval_t
127 histogram_hash (const void *x)
129 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
132 /* Return nonzero if statement for histogram_value X is Y. */
134 static int
135 histogram_eq (const void *x, const void *y)
137 return ((const_histogram_value) x)->hvalue.stmt == (const gimple *) y;
140 /* Set histogram for STMT. */
142 static void
143 set_histogram_value (struct function *fun, gimple *stmt, histogram_value hist)
145 void **loc;
146 if (!hist && !VALUE_HISTOGRAMS (fun))
147 return;
148 if (!VALUE_HISTOGRAMS (fun))
149 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
150 histogram_eq, NULL);
151 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
152 htab_hash_pointer (stmt),
153 hist ? INSERT : NO_INSERT);
154 if (!hist)
156 if (loc)
157 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
158 return;
160 *loc = hist;
163 /* Get histogram list for STMT. */
165 histogram_value
166 gimple_histogram_value (struct function *fun, gimple *stmt)
168 if (!VALUE_HISTOGRAMS (fun))
169 return NULL;
170 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
171 htab_hash_pointer (stmt));
174 /* Add histogram for STMT. */
176 void
177 gimple_add_histogram_value (struct function *fun, gimple *stmt,
178 histogram_value hist)
180 hist->hvalue.next = gimple_histogram_value (fun, stmt);
181 set_histogram_value (fun, stmt, hist);
182 hist->fun = fun;
185 /* Remove histogram HIST from STMT's histogram list. */
187 void
188 gimple_remove_histogram_value (struct function *fun, gimple *stmt,
189 histogram_value hist)
191 histogram_value hist2 = gimple_histogram_value (fun, stmt);
192 if (hist == hist2)
194 set_histogram_value (fun, stmt, hist->hvalue.next);
196 else
198 while (hist2->hvalue.next != hist)
199 hist2 = hist2->hvalue.next;
200 hist2->hvalue.next = hist->hvalue.next;
202 free (hist->hvalue.counters);
203 if (flag_checking)
204 memset (hist, 0xab, sizeof (*hist));
205 free (hist);
208 /* Lookup histogram of type TYPE in the STMT. */
210 histogram_value
211 gimple_histogram_value_of_type (struct function *fun, gimple *stmt,
212 enum hist_type type)
214 histogram_value hist;
215 for (hist = gimple_histogram_value (fun, stmt); hist;
216 hist = hist->hvalue.next)
217 if (hist->type == type)
218 return hist;
219 return NULL;
222 /* Dump information about HIST to DUMP_FILE. */
224 static void
225 dump_histogram_value (FILE *dump_file, histogram_value hist)
227 switch (hist->type)
229 case HIST_TYPE_INTERVAL:
230 if (hist->hvalue.counters)
232 fprintf (dump_file, "Interval counter range [%d,%d]: [",
233 hist->hdata.intvl.int_start,
234 (hist->hdata.intvl.int_start
235 + hist->hdata.intvl.steps - 1));
237 unsigned int i;
238 for (i = 0; i < hist->hdata.intvl.steps; i++)
240 fprintf (dump_file, "%d:%" PRId64,
241 hist->hdata.intvl.int_start + i,
242 (int64_t) hist->hvalue.counters[i]);
243 if (i != hist->hdata.intvl.steps - 1)
244 fprintf (dump_file, ", ");
246 fprintf (dump_file, "] outside range: %" PRId64 ".\n",
247 (int64_t) hist->hvalue.counters[i]);
249 break;
251 case HIST_TYPE_POW2:
252 if (hist->hvalue.counters)
253 fprintf (dump_file, "Pow2 counter pow2:%" PRId64
254 " nonpow2:%" PRId64 ".\n",
255 (int64_t) hist->hvalue.counters[1],
256 (int64_t) hist->hvalue.counters[0]);
257 break;
259 case HIST_TYPE_TOPN_VALUES:
260 case HIST_TYPE_INDIR_CALL:
261 if (hist->hvalue.counters)
263 fprintf (dump_file,
264 (hist->type == HIST_TYPE_TOPN_VALUES
265 ? "Top N value counter" : "Indirect call counter"));
266 if (hist->hvalue.counters)
268 unsigned count = hist->hvalue.counters[1];
269 fprintf (dump_file, " all: %" PRId64 ", %" PRId64 " values: ",
270 (int64_t) hist->hvalue.counters[0], (int64_t) count);
271 for (unsigned i = 0; i < count; i++)
273 fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]",
274 (int64_t) hist->hvalue.counters[2 * i + 2],
275 (int64_t) hist->hvalue.counters[2 * i + 3]);
276 if (i != count - 1)
277 fprintf (dump_file, ", ");
279 fprintf (dump_file, ".\n");
282 break;
284 case HIST_TYPE_AVERAGE:
285 if (hist->hvalue.counters)
286 fprintf (dump_file, "Average value sum:%" PRId64
287 " times:%" PRId64 ".\n",
288 (int64_t) hist->hvalue.counters[0],
289 (int64_t) hist->hvalue.counters[1]);
290 break;
292 case HIST_TYPE_IOR:
293 if (hist->hvalue.counters)
294 fprintf (dump_file, "IOR value ior:%" PRId64 ".\n",
295 (int64_t) hist->hvalue.counters[0]);
296 break;
298 case HIST_TYPE_TIME_PROFILE:
299 if (hist->hvalue.counters)
300 fprintf (dump_file, "Time profile time:%" PRId64 ".\n",
301 (int64_t) hist->hvalue.counters[0]);
302 break;
303 default:
304 gcc_unreachable ();
308 /* Dump information about HIST to DUMP_FILE. */
310 void
311 stream_out_histogram_value (struct output_block *ob, histogram_value hist)
313 struct bitpack_d bp;
314 unsigned int i;
316 bp = bitpack_create (ob->main_stream);
317 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type);
318 bp_pack_value (&bp, hist->hvalue.next != NULL, 1);
319 streamer_write_bitpack (&bp);
320 switch (hist->type)
322 case HIST_TYPE_INTERVAL:
323 streamer_write_hwi (ob, hist->hdata.intvl.int_start);
324 streamer_write_uhwi (ob, hist->hdata.intvl.steps);
325 break;
326 default:
327 break;
329 for (i = 0; i < hist->n_counters; i++)
331 /* When user uses an unsigned type with a big value, constant converted
332 to gcov_type (a signed type) can be negative. */
333 gcov_type value = hist->hvalue.counters[i];
334 if (hist->type == HIST_TYPE_TOPN_VALUES
335 || hist->type == HIST_TYPE_IOR)
336 /* Note that the IOR counter tracks pointer values and these can have
337 sign bit set. */
339 else
340 gcc_assert (value >= 0);
342 streamer_write_gcov_count (ob, value);
344 if (hist->hvalue.next)
345 stream_out_histogram_value (ob, hist->hvalue.next);
348 /* Dump information about HIST to DUMP_FILE. */
350 void
351 stream_in_histogram_value (class lto_input_block *ib, gimple *stmt)
353 enum hist_type type;
354 unsigned int ncounters = 0;
355 struct bitpack_d bp;
356 unsigned int i;
357 histogram_value new_val;
358 bool next;
359 histogram_value *next_p = NULL;
363 bp = streamer_read_bitpack (ib);
364 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
365 next = bp_unpack_value (&bp, 1);
366 new_val = gimple_alloc_histogram_value (cfun, type, stmt);
367 switch (type)
369 case HIST_TYPE_INTERVAL:
370 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
371 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
372 ncounters = new_val->hdata.intvl.steps + 2;
373 break;
375 case HIST_TYPE_POW2:
376 case HIST_TYPE_AVERAGE:
377 ncounters = 2;
378 break;
380 case HIST_TYPE_TOPN_VALUES:
381 case HIST_TYPE_INDIR_CALL:
382 break;
384 case HIST_TYPE_IOR:
385 case HIST_TYPE_TIME_PROFILE:
386 ncounters = 1;
387 break;
389 default:
390 gcc_unreachable ();
393 /* TOP N counters have variable number of counters. */
394 if (type == HIST_TYPE_INDIR_CALL || type == HIST_TYPE_TOPN_VALUES)
396 gcov_type total = streamer_read_gcov_count (ib);
397 gcov_type ncounters = streamer_read_gcov_count (ib);
398 new_val->hvalue.counters = XNEWVAR (gcov_type,
399 sizeof (*new_val->hvalue.counters)
400 * (2 + 2 * ncounters));
401 new_val->hvalue.counters[0] = total;
402 new_val->hvalue.counters[1] = ncounters;
403 new_val->n_counters = 2 + 2 * ncounters;
404 for (i = 0; i < 2 * ncounters; i++)
405 new_val->hvalue.counters[2 + i] = streamer_read_gcov_count (ib);
407 else
409 new_val->hvalue.counters = XNEWVAR (gcov_type,
410 sizeof (*new_val->hvalue.counters)
411 * ncounters);
412 new_val->n_counters = ncounters;
413 for (i = 0; i < ncounters; i++)
414 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
417 if (!next_p)
418 gimple_add_histogram_value (cfun, stmt, new_val);
419 else
420 *next_p = new_val;
421 next_p = &new_val->hvalue.next;
423 while (next);
426 /* Dump all histograms attached to STMT to DUMP_FILE. */
428 void
429 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt)
431 histogram_value hist;
432 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
433 dump_histogram_value (dump_file, hist);
436 /* Remove all histograms associated with STMT. */
438 void
439 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt)
441 histogram_value val;
442 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
443 gimple_remove_histogram_value (fun, stmt, val);
446 /* Duplicate all histograms associates with OSTMT to STMT. */
448 void
449 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt,
450 struct function *ofun, gimple *ostmt)
452 histogram_value val;
453 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
455 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type);
456 memcpy (new_val, val, sizeof (*val));
457 new_val->hvalue.stmt = stmt;
458 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
459 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
460 gimple_add_histogram_value (fun, stmt, new_val);
464 /* Move all histograms associated with OSTMT to STMT. */
466 void
467 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt)
469 histogram_value val = gimple_histogram_value (fun, ostmt);
470 if (val)
472 /* The following three statements can't be reordered,
473 because histogram hashtab relies on stmt field value
474 for finding the exact slot. */
475 set_histogram_value (fun, ostmt, NULL);
476 for (; val != NULL; val = val->hvalue.next)
477 val->hvalue.stmt = stmt;
478 set_histogram_value (fun, stmt, val);
482 static bool error_found = false;
484 /* Helper function for verify_histograms. For each histogram reachable via htab
485 walk verify that it was reached via statement walk. */
487 static int
488 visit_hist (void **slot, void *data)
490 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
491 histogram_value hist = *(histogram_value *) slot;
493 if (!visited->contains (hist)
494 && hist->type != HIST_TYPE_TIME_PROFILE)
496 error ("dead histogram");
497 dump_histogram_value (stderr, hist);
498 debug_gimple_stmt (hist->hvalue.stmt);
499 error_found = true;
501 return 1;
504 /* Verify sanity of the histograms. */
506 DEBUG_FUNCTION void
507 verify_histograms (void)
509 basic_block bb;
510 gimple_stmt_iterator gsi;
511 histogram_value hist;
513 error_found = false;
514 hash_set<histogram_value> visited_hists;
515 FOR_EACH_BB_FN (bb, cfun)
516 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
518 gimple *stmt = gsi_stmt (gsi);
520 for (hist = gimple_histogram_value (cfun, stmt); hist;
521 hist = hist->hvalue.next)
523 if (hist->hvalue.stmt != stmt)
525 error ("histogram value statement does not correspond to "
526 "the statement it is associated with");
527 debug_gimple_stmt (stmt);
528 dump_histogram_value (stderr, hist);
529 error_found = true;
531 visited_hists.add (hist);
534 if (VALUE_HISTOGRAMS (cfun))
535 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
536 if (error_found)
537 internal_error ("%qs failed", __func__);
540 /* Helper function for verify_histograms. For each histogram reachable via htab
541 walk verify that it was reached via statement walk. */
543 static int
544 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
546 histogram_value hist = *(histogram_value *) slot;
547 free (hist->hvalue.counters);
548 free (hist);
549 return 1;
552 void
553 free_histograms (struct function *fn)
555 if (VALUE_HISTOGRAMS (fn))
557 htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL);
558 htab_delete (VALUE_HISTOGRAMS (fn));
559 VALUE_HISTOGRAMS (fn) = NULL;
563 /* The overall number of invocations of the counter should match
564 execution count of basic block. Report it as error rather than
565 internal error as it might mean that user has misused the profile
566 somehow. */
568 static bool
569 check_counter (gimple *stmt, const char * name,
570 gcov_type *count, gcov_type *all, profile_count bb_count_d)
572 gcov_type bb_count = bb_count_d.ipa ().to_gcov_type ();
573 if (*all != bb_count || *count > *all)
575 dump_user_location_t locus;
576 locus = ((stmt != NULL)
577 ? dump_user_location_t (stmt)
578 : dump_user_location_t::from_function_decl
579 (current_function_decl));
580 if (flag_profile_correction)
582 if (dump_enabled_p ())
583 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
584 "correcting inconsistent value profile: %s "
585 "profiler overall count (%d) does not match BB "
586 "count (%d)\n", name, (int)*all, (int)bb_count);
587 *all = bb_count;
588 if (*count > *all)
589 *count = *all;
590 return false;
592 else
594 error_at (locus.get_location_t (), "corrupted value profile: %s "
595 "profile counter (%d out of %d) inconsistent with "
596 "basic-block count (%d)",
597 name,
598 (int) *count,
599 (int) *all,
600 (int) bb_count);
601 return true;
605 return false;
608 /* GIMPLE based transformations. */
610 bool
611 gimple_value_profile_transformations (void)
613 basic_block bb;
614 gimple_stmt_iterator gsi;
615 bool changed = false;
617 FOR_EACH_BB_FN (bb, cfun)
619 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
621 gimple *stmt = gsi_stmt (gsi);
622 histogram_value th = gimple_histogram_value (cfun, stmt);
623 if (!th)
624 continue;
626 if (dump_file)
628 fprintf (dump_file, "Trying transformations on stmt ");
629 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
630 dump_histograms_for_stmt (cfun, dump_file, stmt);
633 /* Transformations: */
634 /* The order of things in this conditional controls which
635 transformation is used when more than one is applicable. */
636 /* It is expected that any code added by the transformations
637 will be added before the current statement, and that the
638 current statement remain valid (although possibly
639 modified) upon return. */
640 if (gimple_mod_subtract_transform (&gsi)
641 || gimple_divmod_fixed_value_transform (&gsi)
642 || gimple_mod_pow2_value_transform (&gsi)
643 || gimple_stringops_transform (&gsi))
645 stmt = gsi_stmt (gsi);
646 changed = true;
647 /* Original statement may no longer be in the same block. */
648 if (bb != gimple_bb (stmt))
650 bb = gimple_bb (stmt);
651 gsi = gsi_for_stmt (stmt);
655 /* The function never thansforms a GIMPLE statement. */
656 if (dump_enabled_p ())
657 dump_ic_profile (&gsi);
661 return changed;
664 /* Generate code for transformation 1 (with parent gimple assignment
665 STMT and probability of taking the optimal path PROB, which is
666 equivalent to COUNT/ALL within roundoff error). This generates the
667 result into a temp and returns the temp; it does not replace or
668 alter the original STMT. */
670 static tree
671 gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob,
672 gcov_type count, gcov_type all)
674 gassign *stmt1, *stmt2;
675 gcond *stmt3;
676 tree tmp0, tmp1, tmp2;
677 gimple *bb1end, *bb2end, *bb3end;
678 basic_block bb, bb2, bb3, bb4;
679 tree optype, op1, op2;
680 edge e12, e13, e23, e24, e34;
681 gimple_stmt_iterator gsi;
683 gcc_assert (is_gimple_assign (stmt)
684 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
685 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
687 optype = TREE_TYPE (gimple_assign_lhs (stmt));
688 op1 = gimple_assign_rhs1 (stmt);
689 op2 = gimple_assign_rhs2 (stmt);
691 bb = gimple_bb (stmt);
692 gsi = gsi_for_stmt (stmt);
694 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
695 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
696 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
697 stmt2 = gimple_build_assign (tmp1, op2);
698 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
699 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
700 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
701 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
702 bb1end = stmt3;
704 tmp2 = create_tmp_reg (optype, "PROF");
705 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0);
706 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
707 bb2end = stmt1;
709 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2);
710 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
711 bb3end = stmt1;
713 /* Fix CFG. */
714 /* Edge e23 connects bb2 to bb3, etc. */
715 e12 = split_block (bb, bb1end);
716 bb2 = e12->dest;
717 bb2->count = profile_count::from_gcov_type (count);
718 e23 = split_block (bb2, bb2end);
719 bb3 = e23->dest;
720 bb3->count = profile_count::from_gcov_type (all - count);
721 e34 = split_block (bb3, bb3end);
722 bb4 = e34->dest;
723 bb4->count = profile_count::from_gcov_type (all);
725 e12->flags &= ~EDGE_FALLTHRU;
726 e12->flags |= EDGE_FALSE_VALUE;
727 e12->probability = prob;
729 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
730 e13->probability = prob.invert ();
732 remove_edge (e23);
734 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
735 e24->probability = profile_probability::always ();
737 e34->probability = profile_probability::always ();
739 return tmp2;
742 /* Return the n-th value count of TOPN_VALUE histogram. If
743 there's a value, return true and set VALUE and COUNT
744 arguments.
746 Counters have the following meaning.
748 abs (counters[0]) is the number of executions
749 for i in 0 ... TOPN-1
750 counters[2 * i + 2] is target
751 counters[2 * i + 3] is corresponding hitrate counter.
753 Value of counters[0] negative when counter became
754 full during merging and some values are lost. */
756 bool
757 get_nth_most_common_value (gimple *stmt, const char *counter_type,
758 histogram_value hist, gcov_type *value,
759 gcov_type *count, gcov_type *all, unsigned n)
761 unsigned counters = hist->hvalue.counters[1];
762 if (n >= counters)
763 return false;
765 *count = 0;
766 *value = 0;
768 gcov_type read_all = abs_hwi (hist->hvalue.counters[0]);
769 gcov_type covered = 0;
770 for (unsigned i = 0; i < counters; ++i)
771 covered += hist->hvalue.counters[2 * i + 3];
773 gcov_type v = hist->hvalue.counters[2 * n + 2];
774 gcov_type c = hist->hvalue.counters[2 * n + 3];
776 if (hist->hvalue.counters[0] < 0
777 && flag_profile_reproducible == PROFILE_REPRODUCIBILITY_PARALLEL_RUNS)
779 if (dump_file)
780 fprintf (dump_file, "Histogram value dropped in '%s' mode\n",
781 "-fprofile-reproducible=parallel-runs");
782 return false;
784 else if (covered != read_all
785 && flag_profile_reproducible == PROFILE_REPRODUCIBILITY_MULTITHREADED)
787 if (dump_file)
788 fprintf (dump_file, "Histogram value dropped in '%s' mode\n",
789 "-fprofile-reproducible=multithreaded");
790 return false;
793 /* Indirect calls can't be verified. */
794 if (stmt
795 && check_counter (stmt, counter_type, &c, &read_all,
796 gimple_bb (stmt)->count))
797 return false;
799 *all = read_all;
801 *value = v;
802 *count = c;
803 return true;
806 /* Do transform 1) on INSN if applicable. */
808 static bool
809 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
811 histogram_value histogram;
812 enum tree_code code;
813 gcov_type val, count, all;
814 tree result, value, tree_val;
815 profile_probability prob;
816 gassign *stmt;
818 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
819 if (!stmt)
820 return false;
822 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
823 return false;
825 code = gimple_assign_rhs_code (stmt);
827 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
828 return false;
830 histogram = gimple_histogram_value_of_type (cfun, stmt,
831 HIST_TYPE_TOPN_VALUES);
832 if (!histogram)
833 return false;
835 if (!get_nth_most_common_value (stmt, "divmod", histogram, &val, &count,
836 &all))
837 return false;
839 value = histogram->hvalue.value;
840 gimple_remove_histogram_value (cfun, stmt, histogram);
842 /* We require that count is at least half of all. */
843 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
844 || 2 * count < all
845 || optimize_bb_for_size_p (gimple_bb (stmt)))
846 return false;
848 /* Compute probability of taking the optimal path. */
849 if (all > 0)
850 prob = profile_probability::probability_in_gcov_type (count, all);
851 else
852 prob = profile_probability::never ();
854 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
855 tree_val = build_int_cst (get_gcov_type (), val);
856 else
858 HOST_WIDE_INT a[2];
859 a[0] = (unsigned HOST_WIDE_INT) val;
860 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
862 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
863 TYPE_PRECISION (get_gcov_type ()), false));
865 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
867 if (dump_enabled_p ())
868 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
869 "Transformation done: div/mod by constant %T\n", tree_val);
871 gimple_assign_set_rhs_from_tree (si, result);
872 update_stmt (gsi_stmt (*si));
874 return true;
877 /* Generate code for transformation 2 (with parent gimple assign STMT and
878 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
879 within roundoff error). This generates the result into a temp and returns
880 the temp; it does not replace or alter the original STMT. */
882 static tree
883 gimple_mod_pow2 (gassign *stmt, profile_probability prob, gcov_type count, gcov_type all)
885 gassign *stmt1, *stmt2, *stmt3;
886 gcond *stmt4;
887 tree tmp2, tmp3;
888 gimple *bb1end, *bb2end, *bb3end;
889 basic_block bb, bb2, bb3, bb4;
890 tree optype, op1, op2;
891 edge e12, e13, e23, e24, e34;
892 gimple_stmt_iterator gsi;
893 tree result;
895 gcc_assert (is_gimple_assign (stmt)
896 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
898 optype = TREE_TYPE (gimple_assign_lhs (stmt));
899 op1 = gimple_assign_rhs1 (stmt);
900 op2 = gimple_assign_rhs2 (stmt);
902 bb = gimple_bb (stmt);
903 gsi = gsi_for_stmt (stmt);
905 result = create_tmp_reg (optype, "PROF");
906 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
907 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
908 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2,
909 build_int_cst (optype, -1));
910 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2);
911 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
912 NULL_TREE, NULL_TREE);
913 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
914 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
915 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
916 bb1end = stmt4;
918 /* tmp2 == op2-1 inherited from previous block. */
919 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2);
920 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
921 bb2end = stmt1;
923 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
924 op1, op2);
925 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
926 bb3end = stmt1;
928 /* Fix CFG. */
929 /* Edge e23 connects bb2 to bb3, etc. */
930 e12 = split_block (bb, bb1end);
931 bb2 = e12->dest;
932 bb2->count = profile_count::from_gcov_type (count);
933 e23 = split_block (bb2, bb2end);
934 bb3 = e23->dest;
935 bb3->count = profile_count::from_gcov_type (all - count);
936 e34 = split_block (bb3, bb3end);
937 bb4 = e34->dest;
938 bb4->count = profile_count::from_gcov_type (all);
940 e12->flags &= ~EDGE_FALLTHRU;
941 e12->flags |= EDGE_FALSE_VALUE;
942 e12->probability = prob;
944 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
945 e13->probability = prob.invert ();
947 remove_edge (e23);
949 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
950 e24->probability = profile_probability::always ();
952 e34->probability = profile_probability::always ();
954 return result;
957 /* Do transform 2) on INSN if applicable. */
959 static bool
960 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
962 histogram_value histogram;
963 enum tree_code code;
964 gcov_type count, wrong_values, all;
965 tree lhs_type, result, value;
966 profile_probability prob;
967 gassign *stmt;
969 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
970 if (!stmt)
971 return false;
973 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
974 if (!INTEGRAL_TYPE_P (lhs_type))
975 return false;
977 code = gimple_assign_rhs_code (stmt);
979 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
980 return false;
982 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
983 if (!histogram)
984 return false;
986 value = histogram->hvalue.value;
987 wrong_values = histogram->hvalue.counters[0];
988 count = histogram->hvalue.counters[1];
990 gimple_remove_histogram_value (cfun, stmt, histogram);
992 /* We require that we hit a power of 2 at least half of all evaluations. */
993 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
994 || count < wrong_values
995 || optimize_bb_for_size_p (gimple_bb (stmt)))
996 return false;
998 /* Compute probability of taking the optimal path. */
999 all = count + wrong_values;
1001 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
1002 return false;
1004 if (dump_enabled_p ())
1005 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1006 "Transformation done: mod power of 2\n");
1008 if (all > 0)
1009 prob = profile_probability::probability_in_gcov_type (count, all);
1010 else
1011 prob = profile_probability::never ();
1013 result = gimple_mod_pow2 (stmt, prob, count, all);
1015 gimple_assign_set_rhs_from_tree (si, result);
1016 update_stmt (gsi_stmt (*si));
1018 return true;
1021 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
1022 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
1023 supported and this is built into this interface. The probabilities of taking
1024 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
1025 COUNT2/ALL respectively within roundoff error). This generates the
1026 result into a temp and returns the temp; it does not replace or alter
1027 the original STMT. */
1028 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1030 static tree
1031 gimple_mod_subtract (gassign *stmt, profile_probability prob1,
1032 profile_probability prob2, int ncounts,
1033 gcov_type count1, gcov_type count2, gcov_type all)
1035 gassign *stmt1;
1036 gimple *stmt2;
1037 gcond *stmt3;
1038 tree tmp1;
1039 gimple *bb1end, *bb2end = NULL, *bb3end;
1040 basic_block bb, bb2, bb3, bb4;
1041 tree optype, op1, op2;
1042 edge e12, e23 = 0, e24, e34, e14;
1043 gimple_stmt_iterator gsi;
1044 tree result;
1046 gcc_assert (is_gimple_assign (stmt)
1047 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
1049 optype = TREE_TYPE (gimple_assign_lhs (stmt));
1050 op1 = gimple_assign_rhs1 (stmt);
1051 op2 = gimple_assign_rhs2 (stmt);
1053 bb = gimple_bb (stmt);
1054 gsi = gsi_for_stmt (stmt);
1056 result = create_tmp_reg (optype, "PROF");
1057 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1058 stmt1 = gimple_build_assign (result, op1);
1059 stmt2 = gimple_build_assign (tmp1, op2);
1060 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1061 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1062 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1063 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
1064 bb1end = stmt3;
1066 if (ncounts) /* Assumed to be 0 or 1 */
1068 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1);
1069 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1070 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1071 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1072 bb2end = stmt2;
1075 /* Fallback case. */
1076 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
1077 result, tmp1);
1078 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1079 bb3end = stmt1;
1081 /* Fix CFG. */
1082 /* Edge e23 connects bb2 to bb3, etc. */
1083 /* However block 3 is optional; if it is not there, references
1084 to 3 really refer to block 2. */
1085 e12 = split_block (bb, bb1end);
1086 bb2 = e12->dest;
1087 bb2->count = profile_count::from_gcov_type (all - count1);
1089 if (ncounts) /* Assumed to be 0 or 1. */
1091 e23 = split_block (bb2, bb2end);
1092 bb3 = e23->dest;
1093 bb3->count = profile_count::from_gcov_type (all - count1 - count2);
1096 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
1097 bb4 = e34->dest;
1098 bb4->count = profile_count::from_gcov_type (all);
1100 e12->flags &= ~EDGE_FALLTHRU;
1101 e12->flags |= EDGE_FALSE_VALUE;
1102 e12->probability = prob1.invert ();
1104 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
1105 e14->probability = prob1;
1107 if (ncounts) /* Assumed to be 0 or 1. */
1109 e23->flags &= ~EDGE_FALLTHRU;
1110 e23->flags |= EDGE_FALSE_VALUE;
1111 e23->probability = prob2.invert ();
1113 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
1114 e24->probability = prob2;
1117 e34->probability = profile_probability::always ();
1119 return result;
1122 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1124 static bool
1125 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
1127 histogram_value histogram;
1128 enum tree_code code;
1129 gcov_type count, wrong_values, all;
1130 tree lhs_type, result;
1131 profile_probability prob1, prob2;
1132 unsigned int i, steps;
1133 gcov_type count1, count2;
1134 gassign *stmt;
1135 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
1136 if (!stmt)
1137 return false;
1139 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
1140 if (!INTEGRAL_TYPE_P (lhs_type))
1141 return false;
1143 code = gimple_assign_rhs_code (stmt);
1145 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
1146 return false;
1148 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
1149 if (!histogram)
1150 return false;
1152 all = 0;
1153 wrong_values = 0;
1154 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1155 all += histogram->hvalue.counters[i];
1157 wrong_values += histogram->hvalue.counters[i];
1158 wrong_values += histogram->hvalue.counters[i+1];
1159 steps = histogram->hdata.intvl.steps;
1160 all += wrong_values;
1161 count1 = histogram->hvalue.counters[0];
1162 count2 = histogram->hvalue.counters[1];
1164 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1166 gimple_remove_histogram_value (cfun, stmt, histogram);
1167 return false;
1170 if (flag_profile_correction && count1 + count2 > all)
1171 all = count1 + count2;
1173 gcc_assert (count1 + count2 <= all);
1175 /* We require that we use just subtractions in at least 50% of all
1176 evaluations. */
1177 count = 0;
1178 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1180 count += histogram->hvalue.counters[i];
1181 if (count * 2 >= all)
1182 break;
1184 if (i == steps
1185 || optimize_bb_for_size_p (gimple_bb (stmt)))
1186 return false;
1188 gimple_remove_histogram_value (cfun, stmt, histogram);
1189 if (dump_enabled_p ())
1190 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1191 "Transformation done: mod subtract\n");
1193 /* Compute probability of taking the optimal path(s). */
1194 if (all > 0)
1196 prob1 = profile_probability::probability_in_gcov_type (count1, all);
1197 prob2 = profile_probability::probability_in_gcov_type (count2, all);
1199 else
1201 prob1 = prob2 = profile_probability::never ();
1204 /* In practice, "steps" is always 2. This interface reflects this,
1205 and will need to be changed if "steps" can change. */
1206 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1208 gimple_assign_set_rhs_from_tree (si, result);
1209 update_stmt (gsi_stmt (*si));
1211 return true;
1214 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
1216 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0;
1218 /* Returns true if node graph is initialized. This
1219 is used to test if profile_id has been created
1220 for cgraph_nodes. */
1222 bool
1223 coverage_node_map_initialized_p (void)
1225 return cgraph_node_map != 0;
1228 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1229 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1230 that the PROFILE_IDs was already assigned. */
1232 void
1233 init_node_map (bool local)
1235 struct cgraph_node *n;
1236 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>;
1238 FOR_EACH_DEFINED_FUNCTION (n)
1239 if (n->has_gimple_body_p () || n->thunk)
1241 cgraph_node **val;
1242 dump_user_location_t loc
1243 = dump_user_location_t::from_function_decl (n->decl);
1244 if (local)
1246 n->profile_id = coverage_compute_profile_id (n);
1247 while ((val = cgraph_node_map->get (n->profile_id))
1248 || !n->profile_id)
1250 if (dump_enabled_p ())
1251 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1252 "Local profile-id %i conflict"
1253 " with nodes %s %s\n",
1254 n->profile_id,
1255 n->dump_name (),
1256 (*val)->dump_name ());
1257 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
1260 else if (!n->profile_id)
1262 if (dump_enabled_p ())
1263 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1264 "Node %s has no profile-id"
1265 " (profile feedback missing?)\n",
1266 n->dump_name ());
1267 continue;
1269 else if ((val = cgraph_node_map->get (n->profile_id)))
1271 if (dump_enabled_p ())
1272 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1273 "Node %s has IP profile-id %i conflict. "
1274 "Giving up.\n",
1275 n->dump_name (), n->profile_id);
1276 *val = NULL;
1277 continue;
1279 cgraph_node_map->put (n->profile_id, n);
1283 /* Delete the CGRAPH_NODE_MAP. */
1285 void
1286 del_node_map (void)
1288 delete cgraph_node_map;
1291 /* Return cgraph node for function with pid */
1293 struct cgraph_node*
1294 find_func_by_profile_id (int profile_id)
1296 cgraph_node **val = cgraph_node_map->get (profile_id);
1297 if (val)
1298 return *val;
1299 else
1300 return NULL;
1303 /* Do transformation
1305 if (actual_callee_address == address_of_most_common_function/method)
1306 do direct call
1307 else
1308 old call
1311 gcall *
1312 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call,
1313 profile_probability prob)
1315 gcall *dcall_stmt;
1316 gassign *load_stmt;
1317 gcond *cond_stmt;
1318 tree tmp0, tmp1, tmp;
1319 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1320 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1321 gimple_stmt_iterator gsi;
1322 int lp_nr, dflags;
1323 edge e_eh, e;
1324 edge_iterator ei;
1326 cond_bb = gimple_bb (icall_stmt);
1327 gsi = gsi_for_stmt (icall_stmt);
1329 tmp0 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
1330 tmp1 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
1331 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1332 load_stmt = gimple_build_assign (tmp0, tmp);
1333 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1335 tmp = fold_convert (ptr_type_node, build_addr (direct_call->decl));
1336 load_stmt = gimple_build_assign (tmp1, tmp);
1337 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1339 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1340 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1342 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME)
1344 unlink_stmt_vdef (icall_stmt);
1345 release_ssa_name (gimple_vdef (icall_stmt));
1347 gimple_set_vdef (icall_stmt, NULL_TREE);
1348 gimple_set_vuse (icall_stmt, NULL_TREE);
1349 update_stmt (icall_stmt);
1350 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
1351 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1352 dflags = flags_from_decl_or_type (direct_call->decl);
1353 if ((dflags & ECF_NORETURN) != 0
1354 && should_remove_lhs_p (gimple_call_lhs (dcall_stmt)))
1355 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1356 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1358 /* Fix CFG. */
1359 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1360 e_cd = split_block (cond_bb, cond_stmt);
1361 dcall_bb = e_cd->dest;
1362 dcall_bb->count = cond_bb->count.apply_probability (prob);
1364 e_di = split_block (dcall_bb, dcall_stmt);
1365 icall_bb = e_di->dest;
1366 icall_bb->count = cond_bb->count - dcall_bb->count;
1368 /* Do not disturb existing EH edges from the indirect call. */
1369 if (!stmt_ends_bb_p (icall_stmt))
1370 e_ij = split_block (icall_bb, icall_stmt);
1371 else
1373 e_ij = find_fallthru_edge (icall_bb->succs);
1374 /* The indirect call might be noreturn. */
1375 if (e_ij != NULL)
1377 e_ij->probability = profile_probability::always ();
1378 e_ij = single_pred_edge (split_edge (e_ij));
1381 if (e_ij != NULL)
1383 join_bb = e_ij->dest;
1384 join_bb->count = cond_bb->count;
1387 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1388 e_cd->probability = prob;
1390 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1391 e_ci->probability = prob.invert ();
1393 remove_edge (e_di);
1395 if (e_ij != NULL)
1397 if ((dflags & ECF_NORETURN) == 0)
1399 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1400 e_dj->probability = profile_probability::always ();
1402 e_ij->probability = profile_probability::always ();
1405 /* Insert PHI node for the call result if necessary. */
1406 if (gimple_call_lhs (icall_stmt)
1407 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1408 && (dflags & ECF_NORETURN) == 0)
1410 tree result = gimple_call_lhs (icall_stmt);
1411 gphi *phi = create_phi_node (result, join_bb);
1412 gimple_call_set_lhs (icall_stmt,
1413 duplicate_ssa_name (result, icall_stmt));
1414 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1415 gimple_call_set_lhs (dcall_stmt,
1416 duplicate_ssa_name (result, dcall_stmt));
1417 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1420 /* Build an EH edge for the direct call if necessary. */
1421 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1422 if (lp_nr > 0 && stmt_could_throw_p (cfun, dcall_stmt))
1424 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1427 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1428 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
1430 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
1431 e->probability = e_eh->probability;
1432 for (gphi_iterator psi = gsi_start_phis (e_eh->dest);
1433 !gsi_end_p (psi); gsi_next (&psi))
1435 gphi *phi = psi.phi ();
1436 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1437 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1440 if (!stmt_could_throw_p (cfun, dcall_stmt))
1441 gimple_purge_dead_eh_edges (dcall_bb);
1442 return dcall_stmt;
1445 /* Dump info about indirect call profile. */
1447 static void
1448 dump_ic_profile (gimple_stmt_iterator *gsi)
1450 gcall *stmt;
1451 histogram_value histogram;
1452 gcov_type val, count, all;
1453 struct cgraph_node *direct_call;
1455 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1456 if (!stmt)
1457 return;
1459 if (gimple_call_fndecl (stmt) != NULL_TREE)
1460 return;
1462 if (gimple_call_internal_p (stmt))
1463 return;
1465 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1466 if (!histogram)
1467 return;
1469 count = 0;
1470 all = histogram->hvalue.counters[0];
1472 for (unsigned j = 0; j < GCOV_TOPN_MAXIMUM_TRACKED_VALUES; j++)
1474 if (!get_nth_most_common_value (NULL, "indirect call", histogram, &val,
1475 &count, &all, j))
1476 return;
1477 if (!count)
1478 continue;
1480 direct_call = find_func_by_profile_id ((int) val);
1482 if (direct_call == NULL)
1483 dump_printf_loc (
1484 MSG_MISSED_OPTIMIZATION, stmt,
1485 "Indirect call -> direct call from other "
1486 "module %T=> %i (will resolve by ipa-profile only with LTO)\n",
1487 gimple_call_fn (stmt), (int) val);
1488 else
1489 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1490 "Indirect call -> direct call "
1491 "%T => %T (will resolve by ipa-profile)\n",
1492 gimple_call_fn (stmt), direct_call->decl);
1493 dump_printf_loc (MSG_NOTE, stmt,
1494 "hist->count %" PRId64 " hist->all %" PRId64 "\n",
1495 count, all);
1499 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1500 set to the argument index for the size of the string operation. */
1502 static bool
1503 interesting_stringop_to_profile_p (gcall *call, int *size_arg)
1505 enum built_in_function fcode;
1507 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
1508 switch (fcode)
1510 case BUILT_IN_MEMCPY:
1511 case BUILT_IN_MEMPCPY:
1512 case BUILT_IN_MEMMOVE:
1513 *size_arg = 2;
1514 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1515 INTEGER_TYPE, VOID_TYPE);
1516 case BUILT_IN_MEMSET:
1517 *size_arg = 2;
1518 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1519 INTEGER_TYPE, VOID_TYPE);
1520 case BUILT_IN_BZERO:
1521 *size_arg = 1;
1522 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1523 VOID_TYPE);
1524 default:
1525 return false;
1529 /* Convert stringop (..., vcall_size)
1530 into
1531 if (vcall_size == icall_size)
1532 stringop (..., icall_size);
1533 else
1534 stringop (..., vcall_size);
1535 assuming we'll propagate a true constant into ICALL_SIZE later. */
1537 static void
1538 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, profile_probability prob,
1539 gcov_type count, gcov_type all)
1541 gassign *tmp_stmt;
1542 gcond *cond_stmt;
1543 gcall *icall_stmt;
1544 tree tmp0, tmp1, vcall_size, optype;
1545 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1546 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1547 gimple_stmt_iterator gsi;
1548 int size_arg;
1550 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg))
1551 gcc_unreachable ();
1553 cond_bb = gimple_bb (vcall_stmt);
1554 gsi = gsi_for_stmt (vcall_stmt);
1556 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1557 optype = TREE_TYPE (vcall_size);
1559 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1560 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1561 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1562 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1564 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1565 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1567 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1568 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1570 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME)
1572 unlink_stmt_vdef (vcall_stmt);
1573 release_ssa_name (gimple_vdef (vcall_stmt));
1575 gimple_set_vdef (vcall_stmt, NULL);
1576 gimple_set_vuse (vcall_stmt, NULL);
1577 update_stmt (vcall_stmt);
1578 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
1579 gimple_call_set_arg (icall_stmt, size_arg,
1580 fold_convert (optype, icall_size));
1581 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1583 /* Fix CFG. */
1584 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1585 e_ci = split_block (cond_bb, cond_stmt);
1586 icall_bb = e_ci->dest;
1587 icall_bb->count = profile_count::from_gcov_type (count);
1589 e_iv = split_block (icall_bb, icall_stmt);
1590 vcall_bb = e_iv->dest;
1591 vcall_bb->count = profile_count::from_gcov_type (all - count);
1593 e_vj = split_block (vcall_bb, vcall_stmt);
1594 join_bb = e_vj->dest;
1595 join_bb->count = profile_count::from_gcov_type (all);
1597 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1598 e_ci->probability = prob;
1600 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1601 e_cv->probability = prob.invert ();
1603 remove_edge (e_iv);
1605 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1606 e_ij->probability = profile_probability::always ();
1608 e_vj->probability = profile_probability::always ();
1610 /* Insert PHI node for the call result if necessary. */
1611 if (gimple_call_lhs (vcall_stmt)
1612 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1614 tree result = gimple_call_lhs (vcall_stmt);
1615 gphi *phi = create_phi_node (result, join_bb);
1616 gimple_call_set_lhs (vcall_stmt,
1617 duplicate_ssa_name (result, vcall_stmt));
1618 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1619 gimple_call_set_lhs (icall_stmt,
1620 duplicate_ssa_name (result, icall_stmt));
1621 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1624 /* Because these are all string op builtins, they're all nothrow. */
1625 gcc_assert (!stmt_could_throw_p (cfun, vcall_stmt));
1626 gcc_assert (!stmt_could_throw_p (cfun, icall_stmt));
1629 /* Find values inside STMT for that we want to measure histograms for
1630 division/modulo optimization. */
1632 static bool
1633 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1635 gcall *stmt;
1636 tree blck_size;
1637 enum built_in_function fcode;
1638 histogram_value histogram;
1639 gcov_type count, all, val;
1640 tree dest, src;
1641 unsigned int dest_align, src_align;
1642 profile_probability prob;
1643 tree tree_val;
1644 int size_arg;
1646 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1647 if (!stmt)
1648 return false;
1650 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL))
1651 return false;
1653 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1654 return false;
1656 blck_size = gimple_call_arg (stmt, size_arg);
1657 if (TREE_CODE (blck_size) == INTEGER_CST)
1658 return false;
1660 histogram = gimple_histogram_value_of_type (cfun, stmt,
1661 HIST_TYPE_TOPN_VALUES);
1662 if (!histogram)
1663 return false;
1665 if (!get_nth_most_common_value (stmt, "stringops", histogram, &val, &count,
1666 &all))
1667 return false;
1669 gimple_remove_histogram_value (cfun, stmt, histogram);
1671 /* We require that count is at least half of all. */
1672 if (2 * count < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1673 return false;
1674 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1675 return false;
1676 if (all > 0)
1677 prob = profile_probability::probability_in_gcov_type (count, all);
1678 else
1679 prob = profile_probability::never ();
1681 dest = gimple_call_arg (stmt, 0);
1682 dest_align = get_pointer_alignment (dest);
1683 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt));
1684 switch (fcode)
1686 case BUILT_IN_MEMCPY:
1687 case BUILT_IN_MEMPCPY:
1688 case BUILT_IN_MEMMOVE:
1689 src = gimple_call_arg (stmt, 1);
1690 src_align = get_pointer_alignment (src);
1691 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1692 return false;
1693 break;
1694 case BUILT_IN_MEMSET:
1695 if (!can_store_by_pieces (val, builtin_memset_read_str,
1696 gimple_call_arg (stmt, 1),
1697 dest_align, true))
1698 return false;
1699 break;
1700 case BUILT_IN_BZERO:
1701 if (!can_store_by_pieces (val, builtin_memset_read_str,
1702 integer_zero_node,
1703 dest_align, true))
1704 return false;
1705 break;
1706 default:
1707 gcc_unreachable ();
1710 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
1711 tree_val = build_int_cst (get_gcov_type (), val);
1712 else
1714 HOST_WIDE_INT a[2];
1715 a[0] = (unsigned HOST_WIDE_INT) val;
1716 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
1718 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
1719 TYPE_PRECISION (get_gcov_type ()), false));
1722 if (dump_enabled_p ())
1723 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1724 "Transformation done: single value %i stringop for %s\n",
1725 (int)val, built_in_names[(int)fcode]);
1727 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1729 return true;
1732 void
1733 stringop_block_profile (gimple *stmt, unsigned int *expected_align,
1734 HOST_WIDE_INT *expected_size)
1736 histogram_value histogram;
1737 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1739 if (!histogram)
1740 *expected_size = -1;
1741 else if (!histogram->hvalue.counters[1])
1743 *expected_size = -1;
1744 gimple_remove_histogram_value (cfun, stmt, histogram);
1746 else
1748 gcov_type size;
1749 size = ((histogram->hvalue.counters[0]
1750 + histogram->hvalue.counters[1] / 2)
1751 / histogram->hvalue.counters[1]);
1752 /* Even if we can hold bigger value in SIZE, INT_MAX
1753 is safe "infinity" for code generation strategies. */
1754 if (size > INT_MAX)
1755 size = INT_MAX;
1756 *expected_size = size;
1757 gimple_remove_histogram_value (cfun, stmt, histogram);
1760 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1762 if (!histogram)
1763 *expected_align = 0;
1764 else if (!histogram->hvalue.counters[0])
1766 gimple_remove_histogram_value (cfun, stmt, histogram);
1767 *expected_align = 0;
1769 else
1771 gcov_type count;
1772 unsigned int alignment;
1774 count = histogram->hvalue.counters[0];
1775 alignment = 1;
1776 while (!(count & alignment)
1777 && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT))
1778 alignment <<= 1;
1779 *expected_align = alignment * BITS_PER_UNIT;
1780 gimple_remove_histogram_value (cfun, stmt, histogram);
1785 /* Find values inside STMT for that we want to measure histograms for
1786 division/modulo optimization. */
1788 static void
1789 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
1791 tree lhs, divisor, op0, type;
1792 histogram_value hist;
1794 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1795 return;
1797 lhs = gimple_assign_lhs (stmt);
1798 type = TREE_TYPE (lhs);
1799 if (!INTEGRAL_TYPE_P (type))
1800 return;
1802 switch (gimple_assign_rhs_code (stmt))
1804 case TRUNC_DIV_EXPR:
1805 case TRUNC_MOD_EXPR:
1806 divisor = gimple_assign_rhs2 (stmt);
1807 op0 = gimple_assign_rhs1 (stmt);
1809 if (TREE_CODE (divisor) == SSA_NAME)
1810 /* Check for the case where the divisor is the same value most
1811 of the time. */
1812 values->safe_push (gimple_alloc_histogram_value (cfun,
1813 HIST_TYPE_TOPN_VALUES,
1814 stmt, divisor));
1816 /* For mod, check whether it is not often a noop (or replaceable by
1817 a few subtractions). */
1818 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1819 && TYPE_UNSIGNED (type)
1820 && TREE_CODE (divisor) == SSA_NAME)
1822 tree val;
1823 /* Check for a special case where the divisor is power of 2. */
1824 values->safe_push (gimple_alloc_histogram_value (cfun,
1825 HIST_TYPE_POW2,
1826 stmt, divisor));
1827 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1828 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1829 stmt, val);
1830 hist->hdata.intvl.int_start = 0;
1831 hist->hdata.intvl.steps = 2;
1832 values->safe_push (hist);
1834 return;
1836 default:
1837 return;
1841 /* Find calls inside STMT for that we want to measure histograms for
1842 indirect/virtual call optimization. */
1844 static void
1845 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values)
1847 tree callee;
1849 if (gimple_code (stmt) != GIMPLE_CALL
1850 || gimple_call_internal_p (stmt)
1851 || gimple_call_fndecl (stmt) != NULL_TREE)
1852 return;
1854 callee = gimple_call_fn (stmt);
1855 histogram_value v = gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL,
1856 stmt, callee);
1857 values->safe_push (v);
1859 return;
1862 /* Find values inside STMT for that we want to measure histograms for
1863 string operations. */
1865 static void
1866 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
1868 gcall *stmt;
1869 tree blck_size;
1870 tree dest;
1871 int size_arg;
1873 stmt = dyn_cast <gcall *> (gs);
1874 if (!stmt)
1875 return;
1877 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL))
1878 return;
1880 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1881 return;
1883 dest = gimple_call_arg (stmt, 0);
1884 blck_size = gimple_call_arg (stmt, size_arg);
1886 if (TREE_CODE (blck_size) != INTEGER_CST)
1888 values->safe_push (gimple_alloc_histogram_value (cfun,
1889 HIST_TYPE_TOPN_VALUES,
1890 stmt, blck_size));
1891 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1892 stmt, blck_size));
1895 if (TREE_CODE (blck_size) != INTEGER_CST)
1896 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1897 stmt, dest));
1900 /* Find values inside STMT for that we want to measure histograms and adds
1901 them to list VALUES. */
1903 static void
1904 gimple_values_to_profile (gimple *stmt, histogram_values *values)
1906 gimple_divmod_values_to_profile (stmt, values);
1907 gimple_stringops_values_to_profile (stmt, values);
1908 gimple_indirect_call_to_profile (stmt, values);
1911 void
1912 gimple_find_values_to_profile (histogram_values *values)
1914 basic_block bb;
1915 gimple_stmt_iterator gsi;
1916 unsigned i;
1917 histogram_value hist = NULL;
1918 values->create (0);
1920 FOR_EACH_BB_FN (bb, cfun)
1921 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1922 gimple_values_to_profile (gsi_stmt (gsi), values);
1924 values->safe_push (gimple_alloc_histogram_value (cfun,
1925 HIST_TYPE_TIME_PROFILE));
1927 FOR_EACH_VEC_ELT (*values, i, hist)
1929 switch (hist->type)
1931 case HIST_TYPE_INTERVAL:
1932 hist->n_counters = hist->hdata.intvl.steps + 2;
1933 break;
1935 case HIST_TYPE_POW2:
1936 hist->n_counters = 2;
1937 break;
1939 case HIST_TYPE_TOPN_VALUES:
1940 case HIST_TYPE_INDIR_CALL:
1941 hist->n_counters = GCOV_TOPN_MEM_COUNTERS;
1942 break;
1944 case HIST_TYPE_TIME_PROFILE:
1945 hist->n_counters = 1;
1946 break;
1948 case HIST_TYPE_AVERAGE:
1949 hist->n_counters = 2;
1950 break;
1952 case HIST_TYPE_IOR:
1953 hist->n_counters = 1;
1954 break;
1956 default:
1957 gcc_unreachable ();
1959 if (dump_file && hist->hvalue.stmt != NULL)
1961 fprintf (dump_file, "Stmt ");
1962 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
1963 dump_histogram_value (dump_file, hist);