re PR debug/91929 (missing inline subroutine information in build using sin/cos)
[official-gcc.git] / gcc / value-prof.c
blob55ea0973a038adddd1728505423d5fe3aa44d11d
1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2019 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"
45 #include "params.h"
47 /* In this file value profile based optimizations are placed. Currently the
48 following optimizations are implemented (for more detailed descriptions
49 see comments at value_profile_transformations):
51 1) Division/modulo specialization. Provided that we can determine that the
52 operands of the division have some special properties, we may use it to
53 produce more effective code.
55 2) Indirect/virtual call specialization. If we can determine most
56 common function callee in indirect/virtual call. We can use this
57 information to improve code effectiveness (especially info for
58 the inliner).
60 3) Speculative prefetching. If we are able to determine that the difference
61 between addresses accessed by a memory reference is usually constant, we
62 may add the prefetch instructions.
63 FIXME: This transformation was removed together with RTL based value
64 profiling.
67 Value profiling internals
68 ==========================
70 Every value profiling transformation starts with defining what values
71 to profile. There are different histogram types (see HIST_TYPE_* in
72 value-prof.h) and each transformation can request one or more histogram
73 types per GIMPLE statement. The function gimple_find_values_to_profile()
74 collects the values to profile in a vec, and adds the number of counters
75 required for the different histogram types.
77 For a -fprofile-generate run, the statements for which values should be
78 recorded, are instrumented in instrument_values(). The instrumentation
79 is done by helper functions that can be found in tree-profile.c, where
80 new types of histograms can be added if necessary.
82 After a -fprofile-use, the value profiling data is read back in by
83 compute_value_histograms() that translates the collected data to
84 histograms and attaches them to the profiled statements via
85 gimple_add_histogram_value(). Histograms are stored in a hash table
86 that is attached to every intrumented function, see VALUE_HISTOGRAMS
87 in function.h.
89 The value-profile transformations driver is the function
90 gimple_value_profile_transformations(). It traverses all statements in
91 the to-be-transformed function, and looks for statements with one or
92 more histograms attached to it. If a statement has histograms, the
93 transformation functions are called on the statement.
95 Limitations / FIXME / TODO:
96 * Only one histogram of each type can be associated with a statement.
97 * Some value profile transformations are done in builtins.c (?!)
98 * Updating of histograms needs some TLC.
99 * The value profiling code could be used to record analysis results
100 from non-profiling (e.g. VRP).
101 * Adding new profilers should be simplified, starting with a cleanup
102 of what-happens-where and with making gimple_find_values_to_profile
103 and gimple_value_profile_transformations table-driven, perhaps...
106 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
107 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
108 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
109 static bool gimple_stringops_transform (gimple_stmt_iterator *);
110 static bool gimple_ic_transform (gimple_stmt_iterator *);
112 /* Allocate histogram value. */
114 histogram_value
115 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
116 enum hist_type type, gimple *stmt, tree value)
118 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
119 hist->hvalue.value = value;
120 hist->hvalue.stmt = stmt;
121 hist->type = type;
122 return hist;
125 /* Hash value for histogram. */
127 static hashval_t
128 histogram_hash (const void *x)
130 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
133 /* Return nonzero if statement for histogram_value X is Y. */
135 static int
136 histogram_eq (const void *x, const void *y)
138 return ((const_histogram_value) x)->hvalue.stmt == (const gimple *) y;
141 /* Set histogram for STMT. */
143 static void
144 set_histogram_value (struct function *fun, gimple *stmt, histogram_value hist)
146 void **loc;
147 if (!hist && !VALUE_HISTOGRAMS (fun))
148 return;
149 if (!VALUE_HISTOGRAMS (fun))
150 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
151 histogram_eq, NULL);
152 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
153 htab_hash_pointer (stmt),
154 hist ? INSERT : NO_INSERT);
155 if (!hist)
157 if (loc)
158 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
159 return;
161 *loc = hist;
164 /* Get histogram list for STMT. */
166 histogram_value
167 gimple_histogram_value (struct function *fun, gimple *stmt)
169 if (!VALUE_HISTOGRAMS (fun))
170 return NULL;
171 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
172 htab_hash_pointer (stmt));
175 /* Add histogram for STMT. */
177 void
178 gimple_add_histogram_value (struct function *fun, gimple *stmt,
179 histogram_value hist)
181 hist->hvalue.next = gimple_histogram_value (fun, stmt);
182 set_histogram_value (fun, stmt, hist);
183 hist->fun = fun;
186 /* Remove histogram HIST from STMT's histogram list. */
188 void
189 gimple_remove_histogram_value (struct function *fun, gimple *stmt,
190 histogram_value hist)
192 histogram_value hist2 = gimple_histogram_value (fun, stmt);
193 if (hist == hist2)
195 set_histogram_value (fun, stmt, hist->hvalue.next);
197 else
199 while (hist2->hvalue.next != hist)
200 hist2 = hist2->hvalue.next;
201 hist2->hvalue.next = hist->hvalue.next;
203 free (hist->hvalue.counters);
204 if (flag_checking)
205 memset (hist, 0xab, sizeof (*hist));
206 free (hist);
209 /* Lookup histogram of type TYPE in the STMT. */
211 histogram_value
212 gimple_histogram_value_of_type (struct function *fun, gimple *stmt,
213 enum hist_type type)
215 histogram_value hist;
216 for (hist = gimple_histogram_value (fun, stmt); hist;
217 hist = hist->hvalue.next)
218 if (hist->type == type)
219 return hist;
220 return NULL;
223 /* Dump information about HIST to DUMP_FILE. */
225 static void
226 dump_histogram_value (FILE *dump_file, histogram_value hist)
228 switch (hist->type)
230 case HIST_TYPE_INTERVAL:
231 if (hist->hvalue.counters)
233 fprintf (dump_file, "Interval counter range [%d,%d]: [",
234 hist->hdata.intvl.int_start,
235 (hist->hdata.intvl.int_start
236 + hist->hdata.intvl.steps - 1));
238 unsigned int i;
239 for (i = 0; i < hist->hdata.intvl.steps; i++)
241 fprintf (dump_file, "%d:%" PRId64,
242 hist->hdata.intvl.int_start + i,
243 (int64_t) hist->hvalue.counters[i]);
244 if (i != hist->hdata.intvl.steps - 1)
245 fprintf (dump_file, ", ");
247 fprintf (dump_file, "] outside range: %" PRId64 ".\n",
248 (int64_t) hist->hvalue.counters[i]);
250 break;
252 case HIST_TYPE_POW2:
253 if (hist->hvalue.counters)
254 fprintf (dump_file, "Pow2 counter pow2:%" PRId64
255 " nonpow2:%" PRId64 ".\n",
256 (int64_t) hist->hvalue.counters[1],
257 (int64_t) hist->hvalue.counters[0]);
258 break;
260 case HIST_TYPE_TOPN_VALUES:
261 case HIST_TYPE_INDIR_CALL:
262 if (hist->hvalue.counters)
264 fprintf (dump_file,
265 (hist->type == HIST_TYPE_TOPN_VALUES
266 ? "Top N value counter " : "Indirect call counter"));
267 if (hist->hvalue.counters)
269 fprintf (dump_file, "all: %" PRId64 ", values: ",
270 (int64_t) hist->hvalue.counters[0]);
271 for (unsigned i = 0; i < GCOV_TOPN_VALUES; i++)
273 fprintf (dump_file, "[%" PRId64 ":%" PRId64 "]",
274 (int64_t) hist->hvalue.counters[2 * i + 1],
275 (int64_t) hist->hvalue.counters[2 * i + 2]);
276 if (i != GCOV_TOPN_VALUES - 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 && i > 0)
336 else
337 gcc_assert (value >= 0);
339 streamer_write_gcov_count (ob, value);
341 if (hist->hvalue.next)
342 stream_out_histogram_value (ob, hist->hvalue.next);
345 /* Dump information about HIST to DUMP_FILE. */
347 void
348 stream_in_histogram_value (class lto_input_block *ib, gimple *stmt)
350 enum hist_type type;
351 unsigned int ncounters = 0;
352 struct bitpack_d bp;
353 unsigned int i;
354 histogram_value new_val;
355 bool next;
356 histogram_value *next_p = NULL;
360 bp = streamer_read_bitpack (ib);
361 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
362 next = bp_unpack_value (&bp, 1);
363 new_val = gimple_alloc_histogram_value (cfun, type, stmt);
364 switch (type)
366 case HIST_TYPE_INTERVAL:
367 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
368 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
369 ncounters = new_val->hdata.intvl.steps + 2;
370 break;
372 case HIST_TYPE_POW2:
373 case HIST_TYPE_AVERAGE:
374 ncounters = 2;
375 break;
377 case HIST_TYPE_TOPN_VALUES:
378 case HIST_TYPE_INDIR_CALL:
379 ncounters = GCOV_TOPN_VALUES_COUNTERS;
380 break;
382 case HIST_TYPE_IOR:
383 case HIST_TYPE_TIME_PROFILE:
384 ncounters = 1;
385 break;
387 default:
388 gcc_unreachable ();
390 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * ncounters);
391 new_val->n_counters = ncounters;
392 for (i = 0; i < ncounters; i++)
393 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
394 if (!next_p)
395 gimple_add_histogram_value (cfun, stmt, new_val);
396 else
397 *next_p = new_val;
398 next_p = &new_val->hvalue.next;
400 while (next);
403 /* Dump all histograms attached to STMT to DUMP_FILE. */
405 void
406 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt)
408 histogram_value hist;
409 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
410 dump_histogram_value (dump_file, hist);
413 /* Remove all histograms associated with STMT. */
415 void
416 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt)
418 histogram_value val;
419 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
420 gimple_remove_histogram_value (fun, stmt, val);
423 /* Duplicate all histograms associates with OSTMT to STMT. */
425 void
426 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt,
427 struct function *ofun, gimple *ostmt)
429 histogram_value val;
430 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
432 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type);
433 memcpy (new_val, val, sizeof (*val));
434 new_val->hvalue.stmt = stmt;
435 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
436 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
437 gimple_add_histogram_value (fun, stmt, new_val);
441 /* Move all histograms associated with OSTMT to STMT. */
443 void
444 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt)
446 histogram_value val = gimple_histogram_value (fun, ostmt);
447 if (val)
449 /* The following three statements can't be reordered,
450 because histogram hashtab relies on stmt field value
451 for finding the exact slot. */
452 set_histogram_value (fun, ostmt, NULL);
453 for (; val != NULL; val = val->hvalue.next)
454 val->hvalue.stmt = stmt;
455 set_histogram_value (fun, stmt, val);
459 static bool error_found = false;
461 /* Helper function for verify_histograms. For each histogram reachable via htab
462 walk verify that it was reached via statement walk. */
464 static int
465 visit_hist (void **slot, void *data)
467 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
468 histogram_value hist = *(histogram_value *) slot;
470 if (!visited->contains (hist)
471 && hist->type != HIST_TYPE_TIME_PROFILE)
473 error ("dead histogram");
474 dump_histogram_value (stderr, hist);
475 debug_gimple_stmt (hist->hvalue.stmt);
476 error_found = true;
478 return 1;
481 /* Verify sanity of the histograms. */
483 DEBUG_FUNCTION void
484 verify_histograms (void)
486 basic_block bb;
487 gimple_stmt_iterator gsi;
488 histogram_value hist;
490 error_found = false;
491 hash_set<histogram_value> visited_hists;
492 FOR_EACH_BB_FN (bb, cfun)
493 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
495 gimple *stmt = gsi_stmt (gsi);
497 for (hist = gimple_histogram_value (cfun, stmt); hist;
498 hist = hist->hvalue.next)
500 if (hist->hvalue.stmt != stmt)
502 error ("histogram value statement does not correspond to "
503 "the statement it is associated with");
504 debug_gimple_stmt (stmt);
505 dump_histogram_value (stderr, hist);
506 error_found = true;
508 visited_hists.add (hist);
511 if (VALUE_HISTOGRAMS (cfun))
512 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
513 if (error_found)
514 internal_error ("%qs failed", __func__);
517 /* Helper function for verify_histograms. For each histogram reachable via htab
518 walk verify that it was reached via statement walk. */
520 static int
521 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
523 histogram_value hist = *(histogram_value *) slot;
524 free (hist->hvalue.counters);
525 free (hist);
526 return 1;
529 void
530 free_histograms (struct function *fn)
532 if (VALUE_HISTOGRAMS (fn))
534 htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL);
535 htab_delete (VALUE_HISTOGRAMS (fn));
536 VALUE_HISTOGRAMS (fn) = NULL;
540 /* The overall number of invocations of the counter should match
541 execution count of basic block. Report it as error rather than
542 internal error as it might mean that user has misused the profile
543 somehow. */
545 static bool
546 check_counter (gimple *stmt, const char * name,
547 gcov_type *count, gcov_type *all, profile_count bb_count_d)
549 gcov_type bb_count = bb_count_d.ipa ().to_gcov_type ();
550 if (*all != bb_count || *count > *all)
552 dump_user_location_t locus;
553 locus = ((stmt != NULL)
554 ? dump_user_location_t (stmt)
555 : dump_user_location_t::from_function_decl
556 (current_function_decl));
557 if (flag_profile_correction)
559 if (dump_enabled_p ())
560 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
561 "correcting inconsistent value profile: %s "
562 "profiler overall count (%d) does not match BB "
563 "count (%d)\n", name, (int)*all, (int)bb_count);
564 *all = bb_count;
565 if (*count > *all)
566 *count = *all;
567 return false;
569 else
571 error_at (locus.get_location_t (), "corrupted value profile: %s "
572 "profile counter (%d out of %d) inconsistent with "
573 "basic-block count (%d)",
574 name,
575 (int) *count,
576 (int) *all,
577 (int) bb_count);
578 return true;
582 return false;
585 /* GIMPLE based transformations. */
587 bool
588 gimple_value_profile_transformations (void)
590 basic_block bb;
591 gimple_stmt_iterator gsi;
592 bool changed = false;
594 FOR_EACH_BB_FN (bb, cfun)
596 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
598 gimple *stmt = gsi_stmt (gsi);
599 histogram_value th = gimple_histogram_value (cfun, stmt);
600 if (!th)
601 continue;
603 if (dump_file)
605 fprintf (dump_file, "Trying transformations on stmt ");
606 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
607 dump_histograms_for_stmt (cfun, dump_file, stmt);
610 /* Transformations: */
611 /* The order of things in this conditional controls which
612 transformation is used when more than one is applicable. */
613 /* It is expected that any code added by the transformations
614 will be added before the current statement, and that the
615 current statement remain valid (although possibly
616 modified) upon return. */
617 if (gimple_mod_subtract_transform (&gsi)
618 || gimple_divmod_fixed_value_transform (&gsi)
619 || gimple_mod_pow2_value_transform (&gsi)
620 || gimple_stringops_transform (&gsi)
621 || gimple_ic_transform (&gsi))
623 stmt = gsi_stmt (gsi);
624 changed = true;
625 /* Original statement may no longer be in the same block. */
626 if (bb != gimple_bb (stmt))
628 bb = gimple_bb (stmt);
629 gsi = gsi_for_stmt (stmt);
635 return changed;
638 /* Generate code for transformation 1 (with parent gimple assignment
639 STMT and probability of taking the optimal path PROB, which is
640 equivalent to COUNT/ALL within roundoff error). This generates the
641 result into a temp and returns the temp; it does not replace or
642 alter the original STMT. */
644 static tree
645 gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob,
646 gcov_type count, gcov_type all)
648 gassign *stmt1, *stmt2;
649 gcond *stmt3;
650 tree tmp0, tmp1, tmp2;
651 gimple *bb1end, *bb2end, *bb3end;
652 basic_block bb, bb2, bb3, bb4;
653 tree optype, op1, op2;
654 edge e12, e13, e23, e24, e34;
655 gimple_stmt_iterator gsi;
657 gcc_assert (is_gimple_assign (stmt)
658 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
659 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
661 optype = TREE_TYPE (gimple_assign_lhs (stmt));
662 op1 = gimple_assign_rhs1 (stmt);
663 op2 = gimple_assign_rhs2 (stmt);
665 bb = gimple_bb (stmt);
666 gsi = gsi_for_stmt (stmt);
668 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
669 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
670 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
671 stmt2 = gimple_build_assign (tmp1, op2);
672 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
673 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
674 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
675 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
676 bb1end = stmt3;
678 tmp2 = create_tmp_reg (optype, "PROF");
679 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0);
680 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
681 bb2end = stmt1;
683 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2);
684 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
685 bb3end = stmt1;
687 /* Fix CFG. */
688 /* Edge e23 connects bb2 to bb3, etc. */
689 e12 = split_block (bb, bb1end);
690 bb2 = e12->dest;
691 bb2->count = profile_count::from_gcov_type (count);
692 e23 = split_block (bb2, bb2end);
693 bb3 = e23->dest;
694 bb3->count = profile_count::from_gcov_type (all - count);
695 e34 = split_block (bb3, bb3end);
696 bb4 = e34->dest;
697 bb4->count = profile_count::from_gcov_type (all);
699 e12->flags &= ~EDGE_FALLTHRU;
700 e12->flags |= EDGE_FALSE_VALUE;
701 e12->probability = prob;
703 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
704 e13->probability = prob.invert ();
706 remove_edge (e23);
708 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
709 e24->probability = profile_probability::always ();
711 e34->probability = profile_probability::always ();
713 return tmp2;
716 /* Return the n-th value count of TOPN_VALUE histogram. If
717 there's a value, return true and set VALUE and COUNT
718 arguments. */
720 bool
721 get_nth_most_common_value (gimple *stmt, const char *counter_type,
722 histogram_value hist, gcov_type *value,
723 gcov_type *count, gcov_type *all, unsigned n)
725 if (hist->hvalue.counters[2] == -1)
726 return false;
728 gcc_assert (n < GCOV_TOPN_VALUES);
730 *count = 0;
731 *value = 0;
733 gcov_type read_all = hist->hvalue.counters[0];
735 gcov_type v = hist->hvalue.counters[2 * n + 1];
736 gcov_type c = hist->hvalue.counters[2 * n + 2];
738 /* Indirect calls can't be verified. */
739 if (stmt
740 && check_counter (stmt, counter_type, &c, &read_all,
741 gimple_bb (stmt)->count))
742 return false;
744 *all = read_all;
746 *value = v;
747 *count = c;
748 return true;
751 /* Do transform 1) on INSN if applicable. */
753 static bool
754 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
756 histogram_value histogram;
757 enum tree_code code;
758 gcov_type val, count, all;
759 tree result, value, tree_val;
760 profile_probability prob;
761 gassign *stmt;
763 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
764 if (!stmt)
765 return false;
767 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
768 return false;
770 code = gimple_assign_rhs_code (stmt);
772 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
773 return false;
775 histogram = gimple_histogram_value_of_type (cfun, stmt,
776 HIST_TYPE_TOPN_VALUES);
777 if (!histogram)
778 return false;
780 if (!get_nth_most_common_value (stmt, "divmod", histogram, &val, &count,
781 &all))
782 return false;
784 value = histogram->hvalue.value;
785 gimple_remove_histogram_value (cfun, stmt, histogram);
787 /* We require that count is at least half of all. */
788 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
789 || 2 * count < all
790 || optimize_bb_for_size_p (gimple_bb (stmt)))
791 return false;
793 /* Compute probability of taking the optimal path. */
794 if (all > 0)
795 prob = profile_probability::probability_in_gcov_type (count, all);
796 else
797 prob = profile_probability::never ();
799 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
800 tree_val = build_int_cst (get_gcov_type (), val);
801 else
803 HOST_WIDE_INT a[2];
804 a[0] = (unsigned HOST_WIDE_INT) val;
805 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
807 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
808 TYPE_PRECISION (get_gcov_type ()), false));
810 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
812 if (dump_enabled_p ())
813 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
814 "Transformation done: div/mod by constant %T\n", tree_val);
816 gimple_assign_set_rhs_from_tree (si, result);
817 update_stmt (gsi_stmt (*si));
819 return true;
822 /* Generate code for transformation 2 (with parent gimple assign STMT and
823 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
824 within roundoff error). This generates the result into a temp and returns
825 the temp; it does not replace or alter the original STMT. */
827 static tree
828 gimple_mod_pow2 (gassign *stmt, profile_probability prob, gcov_type count, gcov_type all)
830 gassign *stmt1, *stmt2, *stmt3;
831 gcond *stmt4;
832 tree tmp2, tmp3;
833 gimple *bb1end, *bb2end, *bb3end;
834 basic_block bb, bb2, bb3, bb4;
835 tree optype, op1, op2;
836 edge e12, e13, e23, e24, e34;
837 gimple_stmt_iterator gsi;
838 tree result;
840 gcc_assert (is_gimple_assign (stmt)
841 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
843 optype = TREE_TYPE (gimple_assign_lhs (stmt));
844 op1 = gimple_assign_rhs1 (stmt);
845 op2 = gimple_assign_rhs2 (stmt);
847 bb = gimple_bb (stmt);
848 gsi = gsi_for_stmt (stmt);
850 result = create_tmp_reg (optype, "PROF");
851 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
852 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
853 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2,
854 build_int_cst (optype, -1));
855 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2);
856 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
857 NULL_TREE, NULL_TREE);
858 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
859 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
860 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
861 bb1end = stmt4;
863 /* tmp2 == op2-1 inherited from previous block. */
864 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2);
865 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
866 bb2end = stmt1;
868 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
869 op1, op2);
870 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
871 bb3end = stmt1;
873 /* Fix CFG. */
874 /* Edge e23 connects bb2 to bb3, etc. */
875 e12 = split_block (bb, bb1end);
876 bb2 = e12->dest;
877 bb2->count = profile_count::from_gcov_type (count);
878 e23 = split_block (bb2, bb2end);
879 bb3 = e23->dest;
880 bb3->count = profile_count::from_gcov_type (all - count);
881 e34 = split_block (bb3, bb3end);
882 bb4 = e34->dest;
883 bb4->count = profile_count::from_gcov_type (all);
885 e12->flags &= ~EDGE_FALLTHRU;
886 e12->flags |= EDGE_FALSE_VALUE;
887 e12->probability = prob;
889 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
890 e13->probability = prob.invert ();
892 remove_edge (e23);
894 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
895 e24->probability = profile_probability::always ();
897 e34->probability = profile_probability::always ();
899 return result;
902 /* Do transform 2) on INSN if applicable. */
904 static bool
905 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
907 histogram_value histogram;
908 enum tree_code code;
909 gcov_type count, wrong_values, all;
910 tree lhs_type, result, value;
911 profile_probability prob;
912 gassign *stmt;
914 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
915 if (!stmt)
916 return false;
918 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
919 if (!INTEGRAL_TYPE_P (lhs_type))
920 return false;
922 code = gimple_assign_rhs_code (stmt);
924 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
925 return false;
927 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
928 if (!histogram)
929 return false;
931 value = histogram->hvalue.value;
932 wrong_values = histogram->hvalue.counters[0];
933 count = histogram->hvalue.counters[1];
935 gimple_remove_histogram_value (cfun, stmt, histogram);
937 /* We require that we hit a power of 2 at least half of all evaluations. */
938 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
939 || count < wrong_values
940 || optimize_bb_for_size_p (gimple_bb (stmt)))
941 return false;
943 /* Compute probability of taking the optimal path. */
944 all = count + wrong_values;
946 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
947 return false;
949 if (dump_enabled_p ())
950 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
951 "Transformation done: mod power of 2\n");
953 if (all > 0)
954 prob = profile_probability::probability_in_gcov_type (count, all);
955 else
956 prob = profile_probability::never ();
958 result = gimple_mod_pow2 (stmt, prob, count, all);
960 gimple_assign_set_rhs_from_tree (si, result);
961 update_stmt (gsi_stmt (*si));
963 return true;
966 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
967 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
968 supported and this is built into this interface. The probabilities of taking
969 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
970 COUNT2/ALL respectively within roundoff error). This generates the
971 result into a temp and returns the temp; it does not replace or alter
972 the original STMT. */
973 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
975 static tree
976 gimple_mod_subtract (gassign *stmt, profile_probability prob1,
977 profile_probability prob2, int ncounts,
978 gcov_type count1, gcov_type count2, gcov_type all)
980 gassign *stmt1;
981 gimple *stmt2;
982 gcond *stmt3;
983 tree tmp1;
984 gimple *bb1end, *bb2end = NULL, *bb3end;
985 basic_block bb, bb2, bb3, bb4;
986 tree optype, op1, op2;
987 edge e12, e23 = 0, e24, e34, e14;
988 gimple_stmt_iterator gsi;
989 tree result;
991 gcc_assert (is_gimple_assign (stmt)
992 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
994 optype = TREE_TYPE (gimple_assign_lhs (stmt));
995 op1 = gimple_assign_rhs1 (stmt);
996 op2 = gimple_assign_rhs2 (stmt);
998 bb = gimple_bb (stmt);
999 gsi = gsi_for_stmt (stmt);
1001 result = create_tmp_reg (optype, "PROF");
1002 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1003 stmt1 = gimple_build_assign (result, op1);
1004 stmt2 = gimple_build_assign (tmp1, op2);
1005 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1006 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1007 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1008 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
1009 bb1end = stmt3;
1011 if (ncounts) /* Assumed to be 0 or 1 */
1013 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1);
1014 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1015 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1016 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1017 bb2end = stmt2;
1020 /* Fallback case. */
1021 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
1022 result, tmp1);
1023 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1024 bb3end = stmt1;
1026 /* Fix CFG. */
1027 /* Edge e23 connects bb2 to bb3, etc. */
1028 /* However block 3 is optional; if it is not there, references
1029 to 3 really refer to block 2. */
1030 e12 = split_block (bb, bb1end);
1031 bb2 = e12->dest;
1032 bb2->count = profile_count::from_gcov_type (all - count1);
1034 if (ncounts) /* Assumed to be 0 or 1. */
1036 e23 = split_block (bb2, bb2end);
1037 bb3 = e23->dest;
1038 bb3->count = profile_count::from_gcov_type (all - count1 - count2);
1041 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
1042 bb4 = e34->dest;
1043 bb4->count = profile_count::from_gcov_type (all);
1045 e12->flags &= ~EDGE_FALLTHRU;
1046 e12->flags |= EDGE_FALSE_VALUE;
1047 e12->probability = prob1.invert ();
1049 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
1050 e14->probability = prob1;
1052 if (ncounts) /* Assumed to be 0 or 1. */
1054 e23->flags &= ~EDGE_FALLTHRU;
1055 e23->flags |= EDGE_FALSE_VALUE;
1056 e23->probability = prob2.invert ();
1058 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
1059 e24->probability = prob2;
1062 e34->probability = profile_probability::always ();
1064 return result;
1067 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1069 static bool
1070 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
1072 histogram_value histogram;
1073 enum tree_code code;
1074 gcov_type count, wrong_values, all;
1075 tree lhs_type, result;
1076 profile_probability prob1, prob2;
1077 unsigned int i, steps;
1078 gcov_type count1, count2;
1079 gassign *stmt;
1080 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
1081 if (!stmt)
1082 return false;
1084 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
1085 if (!INTEGRAL_TYPE_P (lhs_type))
1086 return false;
1088 code = gimple_assign_rhs_code (stmt);
1090 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
1091 return false;
1093 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
1094 if (!histogram)
1095 return false;
1097 all = 0;
1098 wrong_values = 0;
1099 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1100 all += histogram->hvalue.counters[i];
1102 wrong_values += histogram->hvalue.counters[i];
1103 wrong_values += histogram->hvalue.counters[i+1];
1104 steps = histogram->hdata.intvl.steps;
1105 all += wrong_values;
1106 count1 = histogram->hvalue.counters[0];
1107 count2 = histogram->hvalue.counters[1];
1109 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1111 gimple_remove_histogram_value (cfun, stmt, histogram);
1112 return false;
1115 if (flag_profile_correction && count1 + count2 > all)
1116 all = count1 + count2;
1118 gcc_assert (count1 + count2 <= all);
1120 /* We require that we use just subtractions in at least 50% of all
1121 evaluations. */
1122 count = 0;
1123 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1125 count += histogram->hvalue.counters[i];
1126 if (count * 2 >= all)
1127 break;
1129 if (i == steps
1130 || optimize_bb_for_size_p (gimple_bb (stmt)))
1131 return false;
1133 gimple_remove_histogram_value (cfun, stmt, histogram);
1134 if (dump_enabled_p ())
1135 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1136 "Transformation done: mod subtract\n");
1138 /* Compute probability of taking the optimal path(s). */
1139 if (all > 0)
1141 prob1 = profile_probability::probability_in_gcov_type (count1, all);
1142 prob2 = profile_probability::probability_in_gcov_type (count2, all);
1144 else
1146 prob1 = prob2 = profile_probability::never ();
1149 /* In practice, "steps" is always 2. This interface reflects this,
1150 and will need to be changed if "steps" can change. */
1151 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1153 gimple_assign_set_rhs_from_tree (si, result);
1154 update_stmt (gsi_stmt (*si));
1156 return true;
1159 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
1161 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0;
1163 /* Returns true if node graph is initialized. This
1164 is used to test if profile_id has been created
1165 for cgraph_nodes. */
1167 bool
1168 coverage_node_map_initialized_p (void)
1170 return cgraph_node_map != 0;
1173 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1174 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1175 that the PROFILE_IDs was already assigned. */
1177 void
1178 init_node_map (bool local)
1180 struct cgraph_node *n;
1181 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>;
1183 FOR_EACH_DEFINED_FUNCTION (n)
1184 if (n->has_gimple_body_p () || n->thunk.thunk_p)
1186 cgraph_node **val;
1187 dump_user_location_t loc
1188 = dump_user_location_t::from_function_decl (n->decl);
1189 if (local)
1191 n->profile_id = coverage_compute_profile_id (n);
1192 while ((val = cgraph_node_map->get (n->profile_id))
1193 || !n->profile_id)
1195 if (dump_enabled_p ())
1196 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1197 "Local profile-id %i conflict"
1198 " with nodes %s %s\n",
1199 n->profile_id,
1200 n->dump_name (),
1201 (*val)->dump_name ());
1202 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
1205 else if (!n->profile_id)
1207 if (dump_enabled_p ())
1208 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1209 "Node %s has no profile-id"
1210 " (profile feedback missing?)\n",
1211 n->dump_name ());
1212 continue;
1214 else if ((val = cgraph_node_map->get (n->profile_id)))
1216 if (dump_enabled_p ())
1217 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc,
1218 "Node %s has IP profile-id %i conflict. "
1219 "Giving up.\n",
1220 n->dump_name (), n->profile_id);
1221 *val = NULL;
1222 continue;
1224 cgraph_node_map->put (n->profile_id, n);
1228 /* Delete the CGRAPH_NODE_MAP. */
1230 void
1231 del_node_map (void)
1233 delete cgraph_node_map;
1236 /* Return cgraph node for function with pid */
1238 struct cgraph_node*
1239 find_func_by_profile_id (int profile_id)
1241 cgraph_node **val = cgraph_node_map->get (profile_id);
1242 if (val)
1243 return *val;
1244 else
1245 return NULL;
1248 /* Perform sanity check on the indirect call target. Due to race conditions,
1249 false function target may be attributed to an indirect call site. If the
1250 call expression type mismatches with the target function's type, expand_call
1251 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1252 Returns true if TARGET is considered ok for call CALL_STMT. */
1254 bool
1255 check_ic_target (gcall *call_stmt, struct cgraph_node *target)
1257 if (gimple_check_call_matching_types (call_stmt, target->decl, true))
1258 return true;
1260 if (dump_enabled_p ())
1261 dump_printf_loc (MSG_MISSED_OPTIMIZATION, call_stmt,
1262 "Skipping target %s with mismatching types for icall\n",
1263 target->name ());
1264 return false;
1267 /* Do transformation
1269 if (actual_callee_address == address_of_most_common_function/method)
1270 do direct call
1271 else
1272 old call
1275 gcall *
1276 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call,
1277 profile_probability prob)
1279 gcall *dcall_stmt;
1280 gassign *load_stmt;
1281 gcond *cond_stmt;
1282 tree tmp0, tmp1, tmp;
1283 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1284 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1285 gimple_stmt_iterator gsi;
1286 int lp_nr, dflags;
1287 edge e_eh, e;
1288 edge_iterator ei;
1290 cond_bb = gimple_bb (icall_stmt);
1291 gsi = gsi_for_stmt (icall_stmt);
1293 tmp0 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
1294 tmp1 = make_temp_ssa_name (ptr_type_node, NULL, "PROF");
1295 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1296 load_stmt = gimple_build_assign (tmp0, tmp);
1297 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1299 tmp = fold_convert (ptr_type_node, build_addr (direct_call->decl));
1300 load_stmt = gimple_build_assign (tmp1, tmp);
1301 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1303 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1304 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1306 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME)
1308 unlink_stmt_vdef (icall_stmt);
1309 release_ssa_name (gimple_vdef (icall_stmt));
1311 gimple_set_vdef (icall_stmt, NULL_TREE);
1312 gimple_set_vuse (icall_stmt, NULL_TREE);
1313 update_stmt (icall_stmt);
1314 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
1315 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1316 dflags = flags_from_decl_or_type (direct_call->decl);
1317 if ((dflags & ECF_NORETURN) != 0
1318 && should_remove_lhs_p (gimple_call_lhs (dcall_stmt)))
1319 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1320 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1322 /* Fix CFG. */
1323 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1324 e_cd = split_block (cond_bb, cond_stmt);
1325 dcall_bb = e_cd->dest;
1326 dcall_bb->count = cond_bb->count.apply_probability (prob);
1328 e_di = split_block (dcall_bb, dcall_stmt);
1329 icall_bb = e_di->dest;
1330 icall_bb->count = cond_bb->count - dcall_bb->count;
1332 /* Do not disturb existing EH edges from the indirect call. */
1333 if (!stmt_ends_bb_p (icall_stmt))
1334 e_ij = split_block (icall_bb, icall_stmt);
1335 else
1337 e_ij = find_fallthru_edge (icall_bb->succs);
1338 /* The indirect call might be noreturn. */
1339 if (e_ij != NULL)
1341 e_ij->probability = profile_probability::always ();
1342 e_ij = single_pred_edge (split_edge (e_ij));
1345 if (e_ij != NULL)
1347 join_bb = e_ij->dest;
1348 join_bb->count = cond_bb->count;
1351 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1352 e_cd->probability = prob;
1354 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1355 e_ci->probability = prob.invert ();
1357 remove_edge (e_di);
1359 if (e_ij != NULL)
1361 if ((dflags & ECF_NORETURN) == 0)
1363 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1364 e_dj->probability = profile_probability::always ();
1366 e_ij->probability = profile_probability::always ();
1369 /* Insert PHI node for the call result if necessary. */
1370 if (gimple_call_lhs (icall_stmt)
1371 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1372 && (dflags & ECF_NORETURN) == 0)
1374 tree result = gimple_call_lhs (icall_stmt);
1375 gphi *phi = create_phi_node (result, join_bb);
1376 gimple_call_set_lhs (icall_stmt,
1377 duplicate_ssa_name (result, icall_stmt));
1378 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1379 gimple_call_set_lhs (dcall_stmt,
1380 duplicate_ssa_name (result, dcall_stmt));
1381 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1384 /* Build an EH edge for the direct call if necessary. */
1385 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1386 if (lp_nr > 0 && stmt_could_throw_p (cfun, dcall_stmt))
1388 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1391 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1392 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
1394 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
1395 e->probability = e_eh->probability;
1396 for (gphi_iterator psi = gsi_start_phis (e_eh->dest);
1397 !gsi_end_p (psi); gsi_next (&psi))
1399 gphi *phi = psi.phi ();
1400 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1401 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1404 if (!stmt_could_throw_p (cfun, dcall_stmt))
1405 gimple_purge_dead_eh_edges (dcall_bb);
1406 return dcall_stmt;
1410 For every checked indirect/virtual call determine if most common pid of
1411 function/class method has probability more than 50%. If yes modify code of
1412 this call to:
1415 static bool
1416 gimple_ic_transform (gimple_stmt_iterator *gsi)
1418 gcall *stmt;
1419 histogram_value histogram;
1420 gcov_type val, count, all;
1421 struct cgraph_node *direct_call;
1423 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1424 if (!stmt)
1425 return false;
1427 if (gimple_call_fndecl (stmt) != NULL_TREE)
1428 return false;
1430 if (gimple_call_internal_p (stmt))
1431 return false;
1433 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1434 if (!histogram)
1435 return false;
1437 if (!get_nth_most_common_value (NULL, "indirect call", histogram, &val,
1438 &count, &all))
1439 return false;
1441 if (4 * count <= 3 * all)
1442 return false;
1444 direct_call = find_func_by_profile_id ((int)val);
1446 if (direct_call == NULL)
1448 if (val)
1450 if (dump_enabled_p ())
1451 dump_printf_loc (MSG_MISSED_OPTIMIZATION, stmt,
1452 "Indirect call -> direct call from other "
1453 "module %T=> %i (will resolve only with LTO)\n",
1454 gimple_call_fn (stmt), (int)val);
1456 return false;
1459 if (!check_ic_target (stmt, direct_call))
1461 if (dump_enabled_p ())
1462 dump_printf_loc (MSG_MISSED_OPTIMIZATION, stmt,
1463 "Indirect call -> direct call %T => %T "
1464 "transformation skipped because of type mismatch: %G",
1465 gimple_call_fn (stmt), direct_call->decl, stmt);
1466 gimple_remove_histogram_value (cfun, stmt, histogram);
1467 return false;
1470 if (dump_enabled_p ())
1472 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1473 "Indirect call -> direct call "
1474 "%T => %T transformation on insn postponed\n",
1475 gimple_call_fn (stmt), direct_call->decl);
1476 dump_printf_loc (MSG_NOTE, stmt,
1477 "hist->count %" PRId64
1478 " hist->all %" PRId64"\n", count, all);
1481 return true;
1484 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1485 set to the argument index for the size of the string operation. */
1487 static bool
1488 interesting_stringop_to_profile_p (gcall *call, int *size_arg)
1490 enum built_in_function fcode;
1492 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
1493 switch (fcode)
1495 case BUILT_IN_MEMCPY:
1496 case BUILT_IN_MEMPCPY:
1497 case BUILT_IN_MEMMOVE:
1498 *size_arg = 2;
1499 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1500 INTEGER_TYPE, VOID_TYPE);
1501 case BUILT_IN_MEMSET:
1502 *size_arg = 2;
1503 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1504 INTEGER_TYPE, VOID_TYPE);
1505 case BUILT_IN_BZERO:
1506 *size_arg = 1;
1507 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1508 VOID_TYPE);
1509 default:
1510 return false;
1514 /* Convert stringop (..., vcall_size)
1515 into
1516 if (vcall_size == icall_size)
1517 stringop (..., icall_size);
1518 else
1519 stringop (..., vcall_size);
1520 assuming we'll propagate a true constant into ICALL_SIZE later. */
1522 static void
1523 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, profile_probability prob,
1524 gcov_type count, gcov_type all)
1526 gassign *tmp_stmt;
1527 gcond *cond_stmt;
1528 gcall *icall_stmt;
1529 tree tmp0, tmp1, vcall_size, optype;
1530 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1531 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1532 gimple_stmt_iterator gsi;
1533 int size_arg;
1535 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg))
1536 gcc_unreachable ();
1538 cond_bb = gimple_bb (vcall_stmt);
1539 gsi = gsi_for_stmt (vcall_stmt);
1541 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1542 optype = TREE_TYPE (vcall_size);
1544 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1545 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1546 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1547 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1549 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1550 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1552 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1553 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1555 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME)
1557 unlink_stmt_vdef (vcall_stmt);
1558 release_ssa_name (gimple_vdef (vcall_stmt));
1560 gimple_set_vdef (vcall_stmt, NULL);
1561 gimple_set_vuse (vcall_stmt, NULL);
1562 update_stmt (vcall_stmt);
1563 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
1564 gimple_call_set_arg (icall_stmt, size_arg,
1565 fold_convert (optype, icall_size));
1566 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1568 /* Fix CFG. */
1569 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1570 e_ci = split_block (cond_bb, cond_stmt);
1571 icall_bb = e_ci->dest;
1572 icall_bb->count = profile_count::from_gcov_type (count);
1574 e_iv = split_block (icall_bb, icall_stmt);
1575 vcall_bb = e_iv->dest;
1576 vcall_bb->count = profile_count::from_gcov_type (all - count);
1578 e_vj = split_block (vcall_bb, vcall_stmt);
1579 join_bb = e_vj->dest;
1580 join_bb->count = profile_count::from_gcov_type (all);
1582 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1583 e_ci->probability = prob;
1585 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1586 e_cv->probability = prob.invert ();
1588 remove_edge (e_iv);
1590 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1591 e_ij->probability = profile_probability::always ();
1593 e_vj->probability = profile_probability::always ();
1595 /* Insert PHI node for the call result if necessary. */
1596 if (gimple_call_lhs (vcall_stmt)
1597 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1599 tree result = gimple_call_lhs (vcall_stmt);
1600 gphi *phi = create_phi_node (result, join_bb);
1601 gimple_call_set_lhs (vcall_stmt,
1602 duplicate_ssa_name (result, vcall_stmt));
1603 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1604 gimple_call_set_lhs (icall_stmt,
1605 duplicate_ssa_name (result, icall_stmt));
1606 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1609 /* Because these are all string op builtins, they're all nothrow. */
1610 gcc_assert (!stmt_could_throw_p (cfun, vcall_stmt));
1611 gcc_assert (!stmt_could_throw_p (cfun, icall_stmt));
1614 /* Find values inside STMT for that we want to measure histograms for
1615 division/modulo optimization. */
1617 static bool
1618 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1620 gcall *stmt;
1621 tree blck_size;
1622 enum built_in_function fcode;
1623 histogram_value histogram;
1624 gcov_type count, all, val;
1625 tree dest, src;
1626 unsigned int dest_align, src_align;
1627 profile_probability prob;
1628 tree tree_val;
1629 int size_arg;
1631 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1632 if (!stmt)
1633 return false;
1635 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL))
1636 return false;
1638 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1639 return false;
1641 blck_size = gimple_call_arg (stmt, size_arg);
1642 if (TREE_CODE (blck_size) == INTEGER_CST)
1643 return false;
1645 histogram = gimple_histogram_value_of_type (cfun, stmt,
1646 HIST_TYPE_TOPN_VALUES);
1647 if (!histogram)
1648 return false;
1650 if (!get_nth_most_common_value (stmt, "stringops", histogram, &val, &count,
1651 &all))
1652 return false;
1654 gimple_remove_histogram_value (cfun, stmt, histogram);
1656 /* We require that count is at least half of all. */
1657 if (2 * count < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1658 return false;
1659 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1660 return false;
1661 if (all > 0)
1662 prob = profile_probability::probability_in_gcov_type (count, all);
1663 else
1664 prob = profile_probability::never ();
1666 dest = gimple_call_arg (stmt, 0);
1667 dest_align = get_pointer_alignment (dest);
1668 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt));
1669 switch (fcode)
1671 case BUILT_IN_MEMCPY:
1672 case BUILT_IN_MEMPCPY:
1673 case BUILT_IN_MEMMOVE:
1674 src = gimple_call_arg (stmt, 1);
1675 src_align = get_pointer_alignment (src);
1676 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1677 return false;
1678 break;
1679 case BUILT_IN_MEMSET:
1680 if (!can_store_by_pieces (val, builtin_memset_read_str,
1681 gimple_call_arg (stmt, 1),
1682 dest_align, true))
1683 return false;
1684 break;
1685 case BUILT_IN_BZERO:
1686 if (!can_store_by_pieces (val, builtin_memset_read_str,
1687 integer_zero_node,
1688 dest_align, true))
1689 return false;
1690 break;
1691 default:
1692 gcc_unreachable ();
1695 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
1696 tree_val = build_int_cst (get_gcov_type (), val);
1697 else
1699 HOST_WIDE_INT a[2];
1700 a[0] = (unsigned HOST_WIDE_INT) val;
1701 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
1703 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
1704 TYPE_PRECISION (get_gcov_type ()), false));
1707 if (dump_enabled_p ())
1708 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt,
1709 "Transformation done: single value %i stringop for %s\n",
1710 (int)val, built_in_names[(int)fcode]);
1712 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1714 return true;
1717 void
1718 stringop_block_profile (gimple *stmt, unsigned int *expected_align,
1719 HOST_WIDE_INT *expected_size)
1721 histogram_value histogram;
1722 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1724 if (!histogram)
1725 *expected_size = -1;
1726 else if (!histogram->hvalue.counters[1])
1728 *expected_size = -1;
1729 gimple_remove_histogram_value (cfun, stmt, histogram);
1731 else
1733 gcov_type size;
1734 size = ((histogram->hvalue.counters[0]
1735 + histogram->hvalue.counters[1] / 2)
1736 / histogram->hvalue.counters[1]);
1737 /* Even if we can hold bigger value in SIZE, INT_MAX
1738 is safe "infinity" for code generation strategies. */
1739 if (size > INT_MAX)
1740 size = INT_MAX;
1741 *expected_size = size;
1742 gimple_remove_histogram_value (cfun, stmt, histogram);
1745 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1747 if (!histogram)
1748 *expected_align = 0;
1749 else if (!histogram->hvalue.counters[0])
1751 gimple_remove_histogram_value (cfun, stmt, histogram);
1752 *expected_align = 0;
1754 else
1756 gcov_type count;
1757 unsigned int alignment;
1759 count = histogram->hvalue.counters[0];
1760 alignment = 1;
1761 while (!(count & alignment)
1762 && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT))
1763 alignment <<= 1;
1764 *expected_align = alignment * BITS_PER_UNIT;
1765 gimple_remove_histogram_value (cfun, stmt, histogram);
1770 /* Find values inside STMT for that we want to measure histograms for
1771 division/modulo optimization. */
1773 static void
1774 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
1776 tree lhs, divisor, op0, type;
1777 histogram_value hist;
1779 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1780 return;
1782 lhs = gimple_assign_lhs (stmt);
1783 type = TREE_TYPE (lhs);
1784 if (!INTEGRAL_TYPE_P (type))
1785 return;
1787 switch (gimple_assign_rhs_code (stmt))
1789 case TRUNC_DIV_EXPR:
1790 case TRUNC_MOD_EXPR:
1791 divisor = gimple_assign_rhs2 (stmt);
1792 op0 = gimple_assign_rhs1 (stmt);
1794 if (TREE_CODE (divisor) == SSA_NAME)
1795 /* Check for the case where the divisor is the same value most
1796 of the time. */
1797 values->safe_push (gimple_alloc_histogram_value (cfun,
1798 HIST_TYPE_TOPN_VALUES,
1799 stmt, divisor));
1801 /* For mod, check whether it is not often a noop (or replaceable by
1802 a few subtractions). */
1803 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1804 && TYPE_UNSIGNED (type)
1805 && TREE_CODE (divisor) == SSA_NAME)
1807 tree val;
1808 /* Check for a special case where the divisor is power of 2. */
1809 values->safe_push (gimple_alloc_histogram_value (cfun,
1810 HIST_TYPE_POW2,
1811 stmt, divisor));
1812 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1813 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1814 stmt, val);
1815 hist->hdata.intvl.int_start = 0;
1816 hist->hdata.intvl.steps = 2;
1817 values->safe_push (hist);
1819 return;
1821 default:
1822 return;
1826 /* Find calls inside STMT for that we want to measure histograms for
1827 indirect/virtual call optimization. */
1829 static void
1830 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values)
1832 tree callee;
1834 if (gimple_code (stmt) != GIMPLE_CALL
1835 || gimple_call_internal_p (stmt)
1836 || gimple_call_fndecl (stmt) != NULL_TREE)
1837 return;
1839 callee = gimple_call_fn (stmt);
1840 histogram_value v = gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL,
1841 stmt, callee);
1842 values->safe_push (v);
1844 return;
1847 /* Find values inside STMT for that we want to measure histograms for
1848 string operations. */
1850 static void
1851 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
1853 gcall *stmt;
1854 tree blck_size;
1855 tree dest;
1856 int size_arg;
1858 stmt = dyn_cast <gcall *> (gs);
1859 if (!stmt)
1860 return;
1862 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL))
1863 return;
1865 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1866 return;
1868 dest = gimple_call_arg (stmt, 0);
1869 blck_size = gimple_call_arg (stmt, size_arg);
1871 if (TREE_CODE (blck_size) != INTEGER_CST)
1873 values->safe_push (gimple_alloc_histogram_value (cfun,
1874 HIST_TYPE_TOPN_VALUES,
1875 stmt, blck_size));
1876 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1877 stmt, blck_size));
1880 if (TREE_CODE (blck_size) != INTEGER_CST)
1881 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1882 stmt, dest));
1885 /* Find values inside STMT for that we want to measure histograms and adds
1886 them to list VALUES. */
1888 static void
1889 gimple_values_to_profile (gimple *stmt, histogram_values *values)
1891 gimple_divmod_values_to_profile (stmt, values);
1892 gimple_stringops_values_to_profile (stmt, values);
1893 gimple_indirect_call_to_profile (stmt, values);
1896 void
1897 gimple_find_values_to_profile (histogram_values *values)
1899 basic_block bb;
1900 gimple_stmt_iterator gsi;
1901 unsigned i;
1902 histogram_value hist = NULL;
1903 values->create (0);
1905 FOR_EACH_BB_FN (bb, cfun)
1906 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1907 gimple_values_to_profile (gsi_stmt (gsi), values);
1909 values->safe_push (gimple_alloc_histogram_value (cfun,
1910 HIST_TYPE_TIME_PROFILE));
1912 FOR_EACH_VEC_ELT (*values, i, hist)
1914 switch (hist->type)
1916 case HIST_TYPE_INTERVAL:
1917 hist->n_counters = hist->hdata.intvl.steps + 2;
1918 break;
1920 case HIST_TYPE_POW2:
1921 hist->n_counters = 2;
1922 break;
1924 case HIST_TYPE_TOPN_VALUES:
1925 case HIST_TYPE_INDIR_CALL:
1926 hist->n_counters = GCOV_TOPN_VALUES_COUNTERS;
1927 break;
1929 case HIST_TYPE_TIME_PROFILE:
1930 hist->n_counters = 1;
1931 break;
1933 case HIST_TYPE_AVERAGE:
1934 hist->n_counters = 2;
1935 break;
1937 case HIST_TYPE_IOR:
1938 hist->n_counters = 1;
1939 break;
1941 default:
1942 gcc_unreachable ();
1944 if (dump_file && hist->hvalue.stmt != NULL)
1946 fprintf (dump_file, "Stmt ");
1947 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
1948 dump_histogram_value (dump_file, hist);