[42/46] Add vec_info::replace_stmt
[official-gcc.git] / gcc / value-prof.c
blob77d4849d5b1047a39390fdb93e06ee184fc7423e
1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2018 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 fprintf (dump_file, "Interval counter range %d -- %d",
232 hist->hdata.intvl.int_start,
233 (hist->hdata.intvl.int_start
234 + hist->hdata.intvl.steps - 1));
235 if (hist->hvalue.counters)
237 unsigned int i;
238 fprintf (dump_file, " [");
239 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 fprintf (dump_file, " ] outside range:%" PRId64,
244 (int64_t) hist->hvalue.counters[i]);
246 fprintf (dump_file, ".\n");
247 break;
249 case HIST_TYPE_POW2:
250 fprintf (dump_file, "Pow2 counter ");
251 if (hist->hvalue.counters)
253 fprintf (dump_file, "pow2:%" PRId64
254 " nonpow2:%" PRId64,
255 (int64_t) hist->hvalue.counters[1],
256 (int64_t) hist->hvalue.counters[0]);
258 fprintf (dump_file, ".\n");
259 break;
261 case HIST_TYPE_SINGLE_VALUE:
262 fprintf (dump_file, "Single value ");
263 if (hist->hvalue.counters)
265 fprintf (dump_file, "value:%" PRId64
266 " match:%" PRId64
267 " wrong:%" PRId64,
268 (int64_t) hist->hvalue.counters[0],
269 (int64_t) hist->hvalue.counters[1],
270 (int64_t) hist->hvalue.counters[2]);
272 fprintf (dump_file, ".\n");
273 break;
275 case HIST_TYPE_AVERAGE:
276 fprintf (dump_file, "Average value ");
277 if (hist->hvalue.counters)
279 fprintf (dump_file, "sum:%" PRId64
280 " times:%" PRId64,
281 (int64_t) hist->hvalue.counters[0],
282 (int64_t) hist->hvalue.counters[1]);
284 fprintf (dump_file, ".\n");
285 break;
287 case HIST_TYPE_IOR:
288 fprintf (dump_file, "IOR value ");
289 if (hist->hvalue.counters)
291 fprintf (dump_file, "ior:%" PRId64,
292 (int64_t) hist->hvalue.counters[0]);
294 fprintf (dump_file, ".\n");
295 break;
297 case HIST_TYPE_INDIR_CALL:
298 fprintf (dump_file, "Indirect call ");
299 if (hist->hvalue.counters)
301 fprintf (dump_file, "value:%" PRId64
302 " match:%" PRId64
303 " all:%" PRId64,
304 (int64_t) hist->hvalue.counters[0],
305 (int64_t) hist->hvalue.counters[1],
306 (int64_t) hist->hvalue.counters[2]);
308 fprintf (dump_file, ".\n");
309 break;
310 case HIST_TYPE_TIME_PROFILE:
311 fprintf (dump_file, "Time profile ");
312 if (hist->hvalue.counters)
314 fprintf (dump_file, "time:%" PRId64,
315 (int64_t) hist->hvalue.counters[0]);
317 fprintf (dump_file, ".\n");
318 break;
319 case HIST_TYPE_INDIR_CALL_TOPN:
320 fprintf (dump_file, "Indirect call topn ");
321 if (hist->hvalue.counters)
323 int i;
325 fprintf (dump_file, "accu:%" PRId64, hist->hvalue.counters[0]);
326 for (i = 1; i < (GCOV_ICALL_TOPN_VAL << 2); i += 2)
328 fprintf (dump_file, " target:%" PRId64 " value:%" PRId64,
329 (int64_t) hist->hvalue.counters[i],
330 (int64_t) hist->hvalue.counters[i+1]);
333 fprintf (dump_file, ".\n");
334 break;
335 case HIST_TYPE_MAX:
336 gcc_unreachable ();
340 /* Dump information about HIST to DUMP_FILE. */
342 void
343 stream_out_histogram_value (struct output_block *ob, histogram_value hist)
345 struct bitpack_d bp;
346 unsigned int i;
348 bp = bitpack_create (ob->main_stream);
349 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type);
350 bp_pack_value (&bp, hist->hvalue.next != NULL, 1);
351 streamer_write_bitpack (&bp);
352 switch (hist->type)
354 case HIST_TYPE_INTERVAL:
355 streamer_write_hwi (ob, hist->hdata.intvl.int_start);
356 streamer_write_uhwi (ob, hist->hdata.intvl.steps);
357 break;
358 default:
359 break;
361 for (i = 0; i < hist->n_counters; i++)
363 /* When user uses an unsigned type with a big value, constant converted
364 to gcov_type (a signed type) can be negative. */
365 gcov_type value = hist->hvalue.counters[i];
366 if (hist->type == HIST_TYPE_SINGLE_VALUE && i == 0)
368 else
369 gcc_assert (value >= 0);
371 streamer_write_gcov_count (ob, value);
373 if (hist->hvalue.next)
374 stream_out_histogram_value (ob, hist->hvalue.next);
377 /* Dump information about HIST to DUMP_FILE. */
379 void
380 stream_in_histogram_value (struct lto_input_block *ib, gimple *stmt)
382 enum hist_type type;
383 unsigned int ncounters = 0;
384 struct bitpack_d bp;
385 unsigned int i;
386 histogram_value new_val;
387 bool next;
388 histogram_value *next_p = NULL;
392 bp = streamer_read_bitpack (ib);
393 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
394 next = bp_unpack_value (&bp, 1);
395 new_val = gimple_alloc_histogram_value (cfun, type, stmt, NULL);
396 switch (type)
398 case HIST_TYPE_INTERVAL:
399 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
400 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
401 ncounters = new_val->hdata.intvl.steps + 2;
402 break;
404 case HIST_TYPE_POW2:
405 case HIST_TYPE_AVERAGE:
406 ncounters = 2;
407 break;
409 case HIST_TYPE_SINGLE_VALUE:
410 case HIST_TYPE_INDIR_CALL:
411 ncounters = 3;
412 break;
414 case HIST_TYPE_IOR:
415 case HIST_TYPE_TIME_PROFILE:
416 ncounters = 1;
417 break;
419 case HIST_TYPE_INDIR_CALL_TOPN:
420 ncounters = (GCOV_ICALL_TOPN_VAL << 2) + 1;
421 break;
423 case HIST_TYPE_MAX:
424 gcc_unreachable ();
426 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * ncounters);
427 new_val->n_counters = ncounters;
428 for (i = 0; i < ncounters; i++)
429 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
430 if (!next_p)
431 gimple_add_histogram_value (cfun, stmt, new_val);
432 else
433 *next_p = new_val;
434 next_p = &new_val->hvalue.next;
436 while (next);
439 /* Dump all histograms attached to STMT to DUMP_FILE. */
441 void
442 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt)
444 histogram_value hist;
445 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
446 dump_histogram_value (dump_file, hist);
449 /* Remove all histograms associated with STMT. */
451 void
452 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt)
454 histogram_value val;
455 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
456 gimple_remove_histogram_value (fun, stmt, val);
459 /* Duplicate all histograms associates with OSTMT to STMT. */
461 void
462 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt,
463 struct function *ofun, gimple *ostmt)
465 histogram_value val;
466 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
468 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type, NULL, NULL);
469 memcpy (new_val, val, sizeof (*val));
470 new_val->hvalue.stmt = stmt;
471 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
472 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
473 gimple_add_histogram_value (fun, stmt, new_val);
477 /* Move all histograms associated with OSTMT to STMT. */
479 void
480 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt)
482 histogram_value val = gimple_histogram_value (fun, ostmt);
483 if (val)
485 /* The following three statements can't be reordered,
486 because histogram hashtab relies on stmt field value
487 for finding the exact slot. */
488 set_histogram_value (fun, ostmt, NULL);
489 for (; val != NULL; val = val->hvalue.next)
490 val->hvalue.stmt = stmt;
491 set_histogram_value (fun, stmt, val);
495 static bool error_found = false;
497 /* Helper function for verify_histograms. For each histogram reachable via htab
498 walk verify that it was reached via statement walk. */
500 static int
501 visit_hist (void **slot, void *data)
503 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
504 histogram_value hist = *(histogram_value *) slot;
506 if (!visited->contains (hist)
507 && hist->type != HIST_TYPE_TIME_PROFILE)
509 error ("dead histogram");
510 dump_histogram_value (stderr, hist);
511 debug_gimple_stmt (hist->hvalue.stmt);
512 error_found = true;
514 return 1;
517 /* Verify sanity of the histograms. */
519 DEBUG_FUNCTION void
520 verify_histograms (void)
522 basic_block bb;
523 gimple_stmt_iterator gsi;
524 histogram_value hist;
526 error_found = false;
527 hash_set<histogram_value> visited_hists;
528 FOR_EACH_BB_FN (bb, cfun)
529 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
531 gimple *stmt = gsi_stmt (gsi);
533 for (hist = gimple_histogram_value (cfun, stmt); hist;
534 hist = hist->hvalue.next)
536 if (hist->hvalue.stmt != stmt)
538 error ("Histogram value statement does not correspond to "
539 "the statement it is associated with");
540 debug_gimple_stmt (stmt);
541 dump_histogram_value (stderr, hist);
542 error_found = true;
544 visited_hists.add (hist);
547 if (VALUE_HISTOGRAMS (cfun))
548 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
549 if (error_found)
550 internal_error ("verify_histograms failed");
553 /* Helper function for verify_histograms. For each histogram reachable via htab
554 walk verify that it was reached via statement walk. */
556 static int
557 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
559 histogram_value hist = *(histogram_value *) slot;
560 free (hist->hvalue.counters);
561 free (hist);
562 return 1;
565 void
566 free_histograms (struct function *fn)
568 if (VALUE_HISTOGRAMS (fn))
570 htab_traverse (VALUE_HISTOGRAMS (fn), free_hist, NULL);
571 htab_delete (VALUE_HISTOGRAMS (fn));
572 VALUE_HISTOGRAMS (fn) = NULL;
576 /* The overall number of invocations of the counter should match
577 execution count of basic block. Report it as error rather than
578 internal error as it might mean that user has misused the profile
579 somehow. */
581 static bool
582 check_counter (gimple *stmt, const char * name,
583 gcov_type *count, gcov_type *all, profile_count bb_count_d)
585 gcov_type bb_count = bb_count_d.ipa ().to_gcov_type ();
586 if (*all != bb_count || *count > *all)
588 dump_user_location_t locus;
589 locus = ((stmt != NULL)
590 ? dump_user_location_t (stmt)
591 : dump_user_location_t::from_function_decl
592 (current_function_decl));
593 if (flag_profile_correction)
595 if (dump_enabled_p ())
596 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
597 "correcting inconsistent value profile: %s "
598 "profiler overall count (%d) does not match BB "
599 "count (%d)\n", name, (int)*all, (int)bb_count);
600 *all = bb_count;
601 if (*count > *all)
602 *count = *all;
603 return false;
605 else
607 error_at (locus.get_location_t (), "corrupted value profile: %s "
608 "profile counter (%d out of %d) inconsistent with "
609 "basic-block count (%d)",
610 name,
611 (int) *count,
612 (int) *all,
613 (int) bb_count);
614 return true;
618 return false;
621 /* GIMPLE based transformations. */
623 bool
624 gimple_value_profile_transformations (void)
626 basic_block bb;
627 gimple_stmt_iterator gsi;
628 bool changed = false;
630 /* Autofdo does its own transformations for indirect calls,
631 and otherwise does not support value profiling. */
632 if (flag_auto_profile)
633 return false;
635 FOR_EACH_BB_FN (bb, cfun)
637 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
639 gimple *stmt = gsi_stmt (gsi);
640 histogram_value th = gimple_histogram_value (cfun, stmt);
641 if (!th)
642 continue;
644 if (dump_file)
646 fprintf (dump_file, "Trying transformations on stmt ");
647 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
648 dump_histograms_for_stmt (cfun, dump_file, stmt);
651 /* Transformations: */
652 /* The order of things in this conditional controls which
653 transformation is used when more than one is applicable. */
654 /* It is expected that any code added by the transformations
655 will be added before the current statement, and that the
656 current statement remain valid (although possibly
657 modified) upon return. */
658 if (gimple_mod_subtract_transform (&gsi)
659 || gimple_divmod_fixed_value_transform (&gsi)
660 || gimple_mod_pow2_value_transform (&gsi)
661 || gimple_stringops_transform (&gsi)
662 || gimple_ic_transform (&gsi))
664 stmt = gsi_stmt (gsi);
665 changed = true;
666 /* Original statement may no longer be in the same block. */
667 if (bb != gimple_bb (stmt))
669 bb = gimple_bb (stmt);
670 gsi = gsi_for_stmt (stmt);
676 return changed;
679 /* Generate code for transformation 1 (with parent gimple assignment
680 STMT and probability of taking the optimal path PROB, which is
681 equivalent to COUNT/ALL within roundoff error). This generates the
682 result into a temp and returns the temp; it does not replace or
683 alter the original STMT. */
685 static tree
686 gimple_divmod_fixed_value (gassign *stmt, tree value, profile_probability prob,
687 gcov_type count, gcov_type all)
689 gassign *stmt1, *stmt2;
690 gcond *stmt3;
691 tree tmp0, tmp1, tmp2;
692 gimple *bb1end, *bb2end, *bb3end;
693 basic_block bb, bb2, bb3, bb4;
694 tree optype, op1, op2;
695 edge e12, e13, e23, e24, e34;
696 gimple_stmt_iterator gsi;
698 gcc_assert (is_gimple_assign (stmt)
699 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
700 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
702 optype = TREE_TYPE (gimple_assign_lhs (stmt));
703 op1 = gimple_assign_rhs1 (stmt);
704 op2 = gimple_assign_rhs2 (stmt);
706 bb = gimple_bb (stmt);
707 gsi = gsi_for_stmt (stmt);
709 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
710 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
711 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
712 stmt2 = gimple_build_assign (tmp1, op2);
713 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
714 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
715 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
716 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
717 bb1end = stmt3;
719 tmp2 = create_tmp_reg (optype, "PROF");
720 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0);
721 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
722 bb2end = stmt1;
724 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2);
725 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
726 bb3end = stmt1;
728 /* Fix CFG. */
729 /* Edge e23 connects bb2 to bb3, etc. */
730 e12 = split_block (bb, bb1end);
731 bb2 = e12->dest;
732 bb2->count = profile_count::from_gcov_type (count);
733 e23 = split_block (bb2, bb2end);
734 bb3 = e23->dest;
735 bb3->count = profile_count::from_gcov_type (all - count);
736 e34 = split_block (bb3, bb3end);
737 bb4 = e34->dest;
738 bb4->count = profile_count::from_gcov_type (all);
740 e12->flags &= ~EDGE_FALLTHRU;
741 e12->flags |= EDGE_FALSE_VALUE;
742 e12->probability = prob;
744 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
745 e13->probability = prob.invert ();
747 remove_edge (e23);
749 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
750 e24->probability = profile_probability::always ();
752 e34->probability = profile_probability::always ();
754 return tmp2;
757 /* Do transform 1) on INSN if applicable. */
759 static bool
760 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
762 histogram_value histogram;
763 enum tree_code code;
764 gcov_type val, count, all;
765 tree result, value, tree_val;
766 profile_probability prob;
767 gassign *stmt;
769 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
770 if (!stmt)
771 return false;
773 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
774 return false;
776 code = gimple_assign_rhs_code (stmt);
778 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
779 return false;
781 histogram = gimple_histogram_value_of_type (cfun, stmt,
782 HIST_TYPE_SINGLE_VALUE);
783 if (!histogram)
784 return false;
786 value = histogram->hvalue.value;
787 val = histogram->hvalue.counters[0];
788 count = histogram->hvalue.counters[1];
789 all = histogram->hvalue.counters[2];
790 gimple_remove_histogram_value (cfun, stmt, histogram);
792 /* We require that count is at least half of all; this means
793 that for the transformation to fire the value must be constant
794 at least 50% of time (and 75% gives the guarantee of usage). */
795 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
796 || 2 * count < all
797 || optimize_bb_for_size_p (gimple_bb (stmt)))
798 return false;
800 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
801 return false;
803 /* Compute probability of taking the optimal path. */
804 if (all > 0)
805 prob = profile_probability::probability_in_gcov_type (count, all);
806 else
807 prob = profile_probability::never ();
809 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
810 tree_val = build_int_cst (get_gcov_type (), val);
811 else
813 HOST_WIDE_INT a[2];
814 a[0] = (unsigned HOST_WIDE_INT) val;
815 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
817 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
818 TYPE_PRECISION (get_gcov_type ()), false));
820 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
822 if (dump_file)
824 fprintf (dump_file, "Div/mod by constant ");
825 print_generic_expr (dump_file, value, TDF_SLIM);
826 fprintf (dump_file, "=");
827 print_generic_expr (dump_file, tree_val, TDF_SLIM);
828 fprintf (dump_file, " transformation on insn ");
829 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
832 gimple_assign_set_rhs_from_tree (si, result);
833 update_stmt (gsi_stmt (*si));
835 return true;
838 /* Generate code for transformation 2 (with parent gimple assign STMT and
839 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
840 within roundoff error). This generates the result into a temp and returns
841 the temp; it does not replace or alter the original STMT. */
843 static tree
844 gimple_mod_pow2 (gassign *stmt, profile_probability prob, gcov_type count, gcov_type all)
846 gassign *stmt1, *stmt2, *stmt3;
847 gcond *stmt4;
848 tree tmp2, tmp3;
849 gimple *bb1end, *bb2end, *bb3end;
850 basic_block bb, bb2, bb3, bb4;
851 tree optype, op1, op2;
852 edge e12, e13, e23, e24, e34;
853 gimple_stmt_iterator gsi;
854 tree result;
856 gcc_assert (is_gimple_assign (stmt)
857 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
859 optype = TREE_TYPE (gimple_assign_lhs (stmt));
860 op1 = gimple_assign_rhs1 (stmt);
861 op2 = gimple_assign_rhs2 (stmt);
863 bb = gimple_bb (stmt);
864 gsi = gsi_for_stmt (stmt);
866 result = create_tmp_reg (optype, "PROF");
867 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
868 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
869 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2,
870 build_int_cst (optype, -1));
871 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2);
872 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
873 NULL_TREE, NULL_TREE);
874 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
875 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
876 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
877 bb1end = stmt4;
879 /* tmp2 == op2-1 inherited from previous block. */
880 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2);
881 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
882 bb2end = stmt1;
884 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
885 op1, op2);
886 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
887 bb3end = stmt1;
889 /* Fix CFG. */
890 /* Edge e23 connects bb2 to bb3, etc. */
891 e12 = split_block (bb, bb1end);
892 bb2 = e12->dest;
893 bb2->count = profile_count::from_gcov_type (count);
894 e23 = split_block (bb2, bb2end);
895 bb3 = e23->dest;
896 bb3->count = profile_count::from_gcov_type (all - count);
897 e34 = split_block (bb3, bb3end);
898 bb4 = e34->dest;
899 bb4->count = profile_count::from_gcov_type (all);
901 e12->flags &= ~EDGE_FALLTHRU;
902 e12->flags |= EDGE_FALSE_VALUE;
903 e12->probability = prob;
905 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
906 e13->probability = prob.invert ();
908 remove_edge (e23);
910 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
911 e24->probability = profile_probability::always ();
913 e34->probability = profile_probability::always ();
915 return result;
918 /* Do transform 2) on INSN if applicable. */
920 static bool
921 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
923 histogram_value histogram;
924 enum tree_code code;
925 gcov_type count, wrong_values, all;
926 tree lhs_type, result, value;
927 profile_probability prob;
928 gassign *stmt;
930 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
931 if (!stmt)
932 return false;
934 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
935 if (!INTEGRAL_TYPE_P (lhs_type))
936 return false;
938 code = gimple_assign_rhs_code (stmt);
940 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
941 return false;
943 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
944 if (!histogram)
945 return false;
947 value = histogram->hvalue.value;
948 wrong_values = histogram->hvalue.counters[0];
949 count = histogram->hvalue.counters[1];
951 gimple_remove_histogram_value (cfun, stmt, histogram);
953 /* We require that we hit a power of 2 at least half of all evaluations. */
954 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
955 || count < wrong_values
956 || optimize_bb_for_size_p (gimple_bb (stmt)))
957 return false;
959 if (dump_file)
961 fprintf (dump_file, "Mod power of 2 transformation on insn ");
962 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
965 /* Compute probability of taking the optimal path. */
966 all = count + wrong_values;
968 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
969 return false;
971 if (all > 0)
972 prob = profile_probability::probability_in_gcov_type (count, all);
973 else
974 prob = profile_probability::never ();
976 result = gimple_mod_pow2 (stmt, prob, count, all);
978 gimple_assign_set_rhs_from_tree (si, result);
979 update_stmt (gsi_stmt (*si));
981 return true;
984 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
985 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
986 supported and this is built into this interface. The probabilities of taking
987 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
988 COUNT2/ALL respectively within roundoff error). This generates the
989 result into a temp and returns the temp; it does not replace or alter
990 the original STMT. */
991 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
993 static tree
994 gimple_mod_subtract (gassign *stmt, profile_probability prob1,
995 profile_probability prob2, int ncounts,
996 gcov_type count1, gcov_type count2, gcov_type all)
998 gassign *stmt1;
999 gimple *stmt2;
1000 gcond *stmt3;
1001 tree tmp1;
1002 gimple *bb1end, *bb2end = NULL, *bb3end;
1003 basic_block bb, bb2, bb3, bb4;
1004 tree optype, op1, op2;
1005 edge e12, e23 = 0, e24, e34, e14;
1006 gimple_stmt_iterator gsi;
1007 tree result;
1009 gcc_assert (is_gimple_assign (stmt)
1010 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
1012 optype = TREE_TYPE (gimple_assign_lhs (stmt));
1013 op1 = gimple_assign_rhs1 (stmt);
1014 op2 = gimple_assign_rhs2 (stmt);
1016 bb = gimple_bb (stmt);
1017 gsi = gsi_for_stmt (stmt);
1019 result = create_tmp_reg (optype, "PROF");
1020 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1021 stmt1 = gimple_build_assign (result, op1);
1022 stmt2 = gimple_build_assign (tmp1, op2);
1023 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1024 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1025 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1026 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
1027 bb1end = stmt3;
1029 if (ncounts) /* Assumed to be 0 or 1 */
1031 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1);
1032 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1033 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1034 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1035 bb2end = stmt2;
1038 /* Fallback case. */
1039 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
1040 result, tmp1);
1041 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1042 bb3end = stmt1;
1044 /* Fix CFG. */
1045 /* Edge e23 connects bb2 to bb3, etc. */
1046 /* However block 3 is optional; if it is not there, references
1047 to 3 really refer to block 2. */
1048 e12 = split_block (bb, bb1end);
1049 bb2 = e12->dest;
1050 bb2->count = profile_count::from_gcov_type (all - count1);
1052 if (ncounts) /* Assumed to be 0 or 1. */
1054 e23 = split_block (bb2, bb2end);
1055 bb3 = e23->dest;
1056 bb3->count = profile_count::from_gcov_type (all - count1 - count2);
1059 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
1060 bb4 = e34->dest;
1061 bb4->count = profile_count::from_gcov_type (all);
1063 e12->flags &= ~EDGE_FALLTHRU;
1064 e12->flags |= EDGE_FALSE_VALUE;
1065 e12->probability = prob1.invert ();
1067 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
1068 e14->probability = prob1;
1070 if (ncounts) /* Assumed to be 0 or 1. */
1072 e23->flags &= ~EDGE_FALLTHRU;
1073 e23->flags |= EDGE_FALSE_VALUE;
1074 e23->probability = prob2.invert ();
1076 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
1077 e24->probability = prob2;
1080 e34->probability = profile_probability::always ();
1082 return result;
1085 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1087 static bool
1088 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
1090 histogram_value histogram;
1091 enum tree_code code;
1092 gcov_type count, wrong_values, all;
1093 tree lhs_type, result;
1094 profile_probability prob1, prob2;
1095 unsigned int i, steps;
1096 gcov_type count1, count2;
1097 gassign *stmt;
1098 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
1099 if (!stmt)
1100 return false;
1102 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
1103 if (!INTEGRAL_TYPE_P (lhs_type))
1104 return false;
1106 code = gimple_assign_rhs_code (stmt);
1108 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
1109 return false;
1111 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
1112 if (!histogram)
1113 return false;
1115 all = 0;
1116 wrong_values = 0;
1117 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1118 all += histogram->hvalue.counters[i];
1120 wrong_values += histogram->hvalue.counters[i];
1121 wrong_values += histogram->hvalue.counters[i+1];
1122 steps = histogram->hdata.intvl.steps;
1123 all += wrong_values;
1124 count1 = histogram->hvalue.counters[0];
1125 count2 = histogram->hvalue.counters[1];
1127 /* Compute probability of taking the optimal path. */
1128 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1130 gimple_remove_histogram_value (cfun, stmt, histogram);
1131 return false;
1134 if (flag_profile_correction && count1 + count2 > all)
1135 all = count1 + count2;
1137 gcc_assert (count1 + count2 <= all);
1139 /* We require that we use just subtractions in at least 50% of all
1140 evaluations. */
1141 count = 0;
1142 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1144 count += histogram->hvalue.counters[i];
1145 if (count * 2 >= all)
1146 break;
1148 if (i == steps
1149 || optimize_bb_for_size_p (gimple_bb (stmt)))
1150 return false;
1152 gimple_remove_histogram_value (cfun, stmt, histogram);
1153 if (dump_file)
1155 fprintf (dump_file, "Mod subtract transformation on insn ");
1156 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1159 /* Compute probability of taking the optimal path(s). */
1160 if (all > 0)
1162 prob1 = profile_probability::probability_in_gcov_type (count1, all);
1163 prob2 = profile_probability::probability_in_gcov_type (count2, all);
1165 else
1167 prob1 = prob2 = profile_probability::never ();
1170 /* In practice, "steps" is always 2. This interface reflects this,
1171 and will need to be changed if "steps" can change. */
1172 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1174 gimple_assign_set_rhs_from_tree (si, result);
1175 update_stmt (gsi_stmt (*si));
1177 return true;
1180 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
1182 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0;
1184 /* Returns true if node graph is initialized. This
1185 is used to test if profile_id has been created
1186 for cgraph_nodes. */
1188 bool
1189 coverage_node_map_initialized_p (void)
1191 return cgraph_node_map != 0;
1194 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1195 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1196 that the PROFILE_IDs was already assigned. */
1198 void
1199 init_node_map (bool local)
1201 struct cgraph_node *n;
1202 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>;
1204 FOR_EACH_DEFINED_FUNCTION (n)
1205 if (n->has_gimple_body_p ())
1207 cgraph_node **val;
1208 if (local)
1210 n->profile_id = coverage_compute_profile_id (n);
1211 while ((val = cgraph_node_map->get (n->profile_id))
1212 || !n->profile_id)
1214 if (dump_file)
1215 fprintf (dump_file, "Local profile-id %i conflict"
1216 " with nodes %s %s\n",
1217 n->profile_id,
1218 n->dump_name (),
1219 (*val)->dump_name ());
1220 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
1223 else if (!n->profile_id)
1225 if (dump_file)
1226 fprintf (dump_file,
1227 "Node %s has no profile-id"
1228 " (profile feedback missing?)\n",
1229 n->dump_name ());
1230 continue;
1232 else if ((val = cgraph_node_map->get (n->profile_id)))
1234 if (dump_file)
1235 fprintf (dump_file,
1236 "Node %s has IP profile-id %i conflict. "
1237 "Giving up.\n",
1238 n->dump_name (), n->profile_id);
1239 *val = NULL;
1240 continue;
1242 cgraph_node_map->put (n->profile_id, n);
1246 /* Delete the CGRAPH_NODE_MAP. */
1248 void
1249 del_node_map (void)
1251 delete cgraph_node_map;
1254 /* Return cgraph node for function with pid */
1256 struct cgraph_node*
1257 find_func_by_profile_id (int profile_id)
1259 cgraph_node **val = cgraph_node_map->get (profile_id);
1260 if (val)
1261 return *val;
1262 else
1263 return NULL;
1266 /* Perform sanity check on the indirect call target. Due to race conditions,
1267 false function target may be attributed to an indirect call site. If the
1268 call expression type mismatches with the target function's type, expand_call
1269 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1270 Returns true if TARGET is considered ok for call CALL_STMT. */
1272 bool
1273 check_ic_target (gcall *call_stmt, struct cgraph_node *target)
1275 if (gimple_check_call_matching_types (call_stmt, target->decl, true))
1276 return true;
1278 if (dump_enabled_p ())
1279 dump_printf_loc (MSG_MISSED_OPTIMIZATION, call_stmt,
1280 "Skipping target %s with mismatching types for icall\n",
1281 target->name ());
1282 return false;
1285 /* Do transformation
1287 if (actual_callee_address == address_of_most_common_function/method)
1288 do direct call
1289 else
1290 old call
1293 gcall *
1294 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call,
1295 profile_probability prob)
1297 gcall *dcall_stmt;
1298 gassign *load_stmt;
1299 gcond *cond_stmt;
1300 tree tmp0, tmp1, tmp;
1301 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1302 tree optype = build_pointer_type (void_type_node);
1303 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1304 gimple_stmt_iterator gsi;
1305 int lp_nr, dflags;
1306 edge e_eh, e;
1307 edge_iterator ei;
1309 cond_bb = gimple_bb (icall_stmt);
1310 gsi = gsi_for_stmt (icall_stmt);
1312 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1313 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1314 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1315 load_stmt = gimple_build_assign (tmp0, tmp);
1316 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1318 tmp = fold_convert (optype, build_addr (direct_call->decl));
1319 load_stmt = gimple_build_assign (tmp1, tmp);
1320 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1322 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1323 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1325 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME)
1327 unlink_stmt_vdef (icall_stmt);
1328 release_ssa_name (gimple_vdef (icall_stmt));
1330 gimple_set_vdef (icall_stmt, NULL_TREE);
1331 gimple_set_vuse (icall_stmt, NULL_TREE);
1332 update_stmt (icall_stmt);
1333 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
1334 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1335 dflags = flags_from_decl_or_type (direct_call->decl);
1336 if ((dflags & ECF_NORETURN) != 0
1337 && should_remove_lhs_p (gimple_call_lhs (dcall_stmt)))
1338 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1339 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1341 /* Fix CFG. */
1342 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1343 e_cd = split_block (cond_bb, cond_stmt);
1344 dcall_bb = e_cd->dest;
1345 dcall_bb->count = cond_bb->count.apply_probability (prob);
1347 e_di = split_block (dcall_bb, dcall_stmt);
1348 icall_bb = e_di->dest;
1349 icall_bb->count = cond_bb->count - dcall_bb->count;
1351 /* Do not disturb existing EH edges from the indirect call. */
1352 if (!stmt_ends_bb_p (icall_stmt))
1353 e_ij = split_block (icall_bb, icall_stmt);
1354 else
1356 e_ij = find_fallthru_edge (icall_bb->succs);
1357 /* The indirect call might be noreturn. */
1358 if (e_ij != NULL)
1360 e_ij->probability = profile_probability::always ();
1361 e_ij = single_pred_edge (split_edge (e_ij));
1364 if (e_ij != NULL)
1366 join_bb = e_ij->dest;
1367 join_bb->count = cond_bb->count;
1370 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1371 e_cd->probability = prob;
1373 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1374 e_ci->probability = prob.invert ();
1376 remove_edge (e_di);
1378 if (e_ij != NULL)
1380 if ((dflags & ECF_NORETURN) == 0)
1382 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1383 e_dj->probability = profile_probability::always ();
1385 e_ij->probability = profile_probability::always ();
1388 /* Insert PHI node for the call result if necessary. */
1389 if (gimple_call_lhs (icall_stmt)
1390 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1391 && (dflags & ECF_NORETURN) == 0)
1393 tree result = gimple_call_lhs (icall_stmt);
1394 gphi *phi = create_phi_node (result, join_bb);
1395 gimple_call_set_lhs (icall_stmt,
1396 duplicate_ssa_name (result, icall_stmt));
1397 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1398 gimple_call_set_lhs (dcall_stmt,
1399 duplicate_ssa_name (result, dcall_stmt));
1400 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1403 /* Build an EH edge for the direct call if necessary. */
1404 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1405 if (lp_nr > 0 && stmt_could_throw_p (dcall_stmt))
1407 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1410 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1411 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
1413 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
1414 e->probability = e_eh->probability;
1415 for (gphi_iterator psi = gsi_start_phis (e_eh->dest);
1416 !gsi_end_p (psi); gsi_next (&psi))
1418 gphi *phi = psi.phi ();
1419 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1420 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1423 if (!stmt_could_throw_p (dcall_stmt))
1424 gimple_purge_dead_eh_edges (dcall_bb);
1425 return dcall_stmt;
1429 For every checked indirect/virtual call determine if most common pid of
1430 function/class method has probability more than 50%. If yes modify code of
1431 this call to:
1434 static bool
1435 gimple_ic_transform (gimple_stmt_iterator *gsi)
1437 gcall *stmt;
1438 histogram_value histogram;
1439 gcov_type val, count, all, bb_all;
1440 struct cgraph_node *direct_call;
1442 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1443 if (!stmt)
1444 return false;
1446 if (gimple_call_fndecl (stmt) != NULL_TREE)
1447 return false;
1449 if (gimple_call_internal_p (stmt))
1450 return false;
1452 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1453 if (!histogram)
1454 return false;
1456 val = histogram->hvalue.counters [0];
1457 count = histogram->hvalue.counters [1];
1458 all = histogram->hvalue.counters [2];
1460 bb_all = gimple_bb (stmt)->count.ipa ().to_gcov_type ();
1461 /* The order of CHECK_COUNTER calls is important -
1462 since check_counter can correct the third parameter
1463 and we want to make count <= all <= bb_all. */
1464 if (check_counter (stmt, "ic", &all, &bb_all, gimple_bb (stmt)->count)
1465 || check_counter (stmt, "ic", &count, &all,
1466 profile_count::from_gcov_type (all)))
1468 gimple_remove_histogram_value (cfun, stmt, histogram);
1469 return false;
1472 if (4 * count <= 3 * all)
1473 return false;
1475 direct_call = find_func_by_profile_id ((int)val);
1477 if (direct_call == NULL)
1479 if (val)
1481 if (dump_file)
1483 fprintf (dump_file, "Indirect call -> direct call from other module");
1484 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1485 fprintf (dump_file, "=> %i (will resolve only with LTO)\n", (int)val);
1488 return false;
1491 if (!check_ic_target (stmt, direct_call))
1493 if (dump_file)
1495 fprintf (dump_file, "Indirect call -> direct call ");
1496 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1497 fprintf (dump_file, "=> ");
1498 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1499 fprintf (dump_file, " transformation skipped because of type mismatch");
1500 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1502 gimple_remove_histogram_value (cfun, stmt, histogram);
1503 return false;
1506 if (dump_file)
1508 fprintf (dump_file, "Indirect call -> direct call ");
1509 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1510 fprintf (dump_file, "=> ");
1511 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1512 fprintf (dump_file, " transformation on insn postponned to ipa-profile");
1513 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1514 fprintf (dump_file, "hist->count %" PRId64
1515 " hist->all %" PRId64"\n", count, all);
1518 return true;
1521 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1522 set to the argument index for the size of the string operation. */
1524 static bool
1525 interesting_stringop_to_profile_p (gcall *call, int *size_arg)
1527 enum built_in_function fcode;
1529 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
1530 if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
1531 && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
1532 return false;
1534 switch (fcode)
1536 case BUILT_IN_MEMCPY:
1537 case BUILT_IN_MEMPCPY:
1538 *size_arg = 2;
1539 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1540 INTEGER_TYPE, VOID_TYPE);
1541 case BUILT_IN_MEMSET:
1542 *size_arg = 2;
1543 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1544 INTEGER_TYPE, VOID_TYPE);
1545 case BUILT_IN_BZERO:
1546 *size_arg = 1;
1547 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1548 VOID_TYPE);
1549 default:
1550 gcc_unreachable ();
1554 /* Convert stringop (..., vcall_size)
1555 into
1556 if (vcall_size == icall_size)
1557 stringop (..., icall_size);
1558 else
1559 stringop (..., vcall_size);
1560 assuming we'll propagate a true constant into ICALL_SIZE later. */
1562 static void
1563 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, profile_probability prob,
1564 gcov_type count, gcov_type all)
1566 gassign *tmp_stmt;
1567 gcond *cond_stmt;
1568 gcall *icall_stmt;
1569 tree tmp0, tmp1, vcall_size, optype;
1570 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1571 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1572 gimple_stmt_iterator gsi;
1573 int size_arg;
1575 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg))
1576 gcc_unreachable ();
1578 cond_bb = gimple_bb (vcall_stmt);
1579 gsi = gsi_for_stmt (vcall_stmt);
1581 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1582 optype = TREE_TYPE (vcall_size);
1584 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1585 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1586 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1587 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1589 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1590 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1592 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1593 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1595 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME)
1597 unlink_stmt_vdef (vcall_stmt);
1598 release_ssa_name (gimple_vdef (vcall_stmt));
1600 gimple_set_vdef (vcall_stmt, NULL);
1601 gimple_set_vuse (vcall_stmt, NULL);
1602 update_stmt (vcall_stmt);
1603 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
1604 gimple_call_set_arg (icall_stmt, size_arg,
1605 fold_convert (optype, icall_size));
1606 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1608 /* Fix CFG. */
1609 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1610 e_ci = split_block (cond_bb, cond_stmt);
1611 icall_bb = e_ci->dest;
1612 icall_bb->count = profile_count::from_gcov_type (count);
1614 e_iv = split_block (icall_bb, icall_stmt);
1615 vcall_bb = e_iv->dest;
1616 vcall_bb->count = profile_count::from_gcov_type (all - count);
1618 e_vj = split_block (vcall_bb, vcall_stmt);
1619 join_bb = e_vj->dest;
1620 join_bb->count = profile_count::from_gcov_type (all);
1622 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1623 e_ci->probability = prob;
1625 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1626 e_cv->probability = prob.invert ();
1628 remove_edge (e_iv);
1630 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1631 e_ij->probability = profile_probability::always ();
1633 e_vj->probability = profile_probability::always ();
1635 /* Insert PHI node for the call result if necessary. */
1636 if (gimple_call_lhs (vcall_stmt)
1637 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1639 tree result = gimple_call_lhs (vcall_stmt);
1640 gphi *phi = create_phi_node (result, join_bb);
1641 gimple_call_set_lhs (vcall_stmt,
1642 duplicate_ssa_name (result, vcall_stmt));
1643 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1644 gimple_call_set_lhs (icall_stmt,
1645 duplicate_ssa_name (result, icall_stmt));
1646 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1649 /* Because these are all string op builtins, they're all nothrow. */
1650 gcc_assert (!stmt_could_throw_p (vcall_stmt));
1651 gcc_assert (!stmt_could_throw_p (icall_stmt));
1654 /* Find values inside STMT for that we want to measure histograms for
1655 division/modulo optimization. */
1657 static bool
1658 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1660 gcall *stmt;
1661 tree blck_size;
1662 enum built_in_function fcode;
1663 histogram_value histogram;
1664 gcov_type count, all, val;
1665 tree dest, src;
1666 unsigned int dest_align, src_align;
1667 profile_probability prob;
1668 tree tree_val;
1669 int size_arg;
1671 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1672 if (!stmt)
1673 return false;
1675 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL))
1676 return false;
1678 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1679 return false;
1681 blck_size = gimple_call_arg (stmt, size_arg);
1682 if (TREE_CODE (blck_size) == INTEGER_CST)
1683 return false;
1685 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_SINGLE_VALUE);
1686 if (!histogram)
1687 return false;
1689 val = histogram->hvalue.counters[0];
1690 count = histogram->hvalue.counters[1];
1691 all = histogram->hvalue.counters[2];
1692 gimple_remove_histogram_value (cfun, stmt, histogram);
1694 /* We require that count is at least half of all; this means
1695 that for the transformation to fire the value must be constant
1696 at least 80% of time. */
1697 if ((6 * count / 5) < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1698 return false;
1699 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1700 return false;
1701 if (all > 0)
1702 prob = profile_probability::probability_in_gcov_type (count, all);
1703 else
1704 prob = profile_probability::never ();
1706 dest = gimple_call_arg (stmt, 0);
1707 dest_align = get_pointer_alignment (dest);
1708 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt));
1709 switch (fcode)
1711 case BUILT_IN_MEMCPY:
1712 case BUILT_IN_MEMPCPY:
1713 src = gimple_call_arg (stmt, 1);
1714 src_align = get_pointer_alignment (src);
1715 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1716 return false;
1717 break;
1718 case BUILT_IN_MEMSET:
1719 if (!can_store_by_pieces (val, builtin_memset_read_str,
1720 gimple_call_arg (stmt, 1),
1721 dest_align, true))
1722 return false;
1723 break;
1724 case BUILT_IN_BZERO:
1725 if (!can_store_by_pieces (val, builtin_memset_read_str,
1726 integer_zero_node,
1727 dest_align, true))
1728 return false;
1729 break;
1730 default:
1731 gcc_unreachable ();
1734 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
1735 tree_val = build_int_cst (get_gcov_type (), val);
1736 else
1738 HOST_WIDE_INT a[2];
1739 a[0] = (unsigned HOST_WIDE_INT) val;
1740 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
1742 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
1743 TYPE_PRECISION (get_gcov_type ()), false));
1746 if (dump_file)
1748 fprintf (dump_file, "Single value %i stringop transformation on ",
1749 (int)val);
1750 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1753 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1755 return true;
1758 void
1759 stringop_block_profile (gimple *stmt, unsigned int *expected_align,
1760 HOST_WIDE_INT *expected_size)
1762 histogram_value histogram;
1763 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1765 if (!histogram)
1766 *expected_size = -1;
1767 else if (!histogram->hvalue.counters[1])
1769 *expected_size = -1;
1770 gimple_remove_histogram_value (cfun, stmt, histogram);
1772 else
1774 gcov_type size;
1775 size = ((histogram->hvalue.counters[0]
1776 + histogram->hvalue.counters[1] / 2)
1777 / histogram->hvalue.counters[1]);
1778 /* Even if we can hold bigger value in SIZE, INT_MAX
1779 is safe "infinity" for code generation strategies. */
1780 if (size > INT_MAX)
1781 size = INT_MAX;
1782 *expected_size = size;
1783 gimple_remove_histogram_value (cfun, stmt, histogram);
1786 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1788 if (!histogram)
1789 *expected_align = 0;
1790 else if (!histogram->hvalue.counters[0])
1792 gimple_remove_histogram_value (cfun, stmt, histogram);
1793 *expected_align = 0;
1795 else
1797 gcov_type count;
1798 unsigned int alignment;
1800 count = histogram->hvalue.counters[0];
1801 alignment = 1;
1802 while (!(count & alignment)
1803 && (alignment <= UINT_MAX / 2 / BITS_PER_UNIT))
1804 alignment <<= 1;
1805 *expected_align = alignment * BITS_PER_UNIT;
1806 gimple_remove_histogram_value (cfun, stmt, histogram);
1811 /* Find values inside STMT for that we want to measure histograms for
1812 division/modulo optimization. */
1814 static void
1815 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
1817 tree lhs, divisor, op0, type;
1818 histogram_value hist;
1820 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1821 return;
1823 lhs = gimple_assign_lhs (stmt);
1824 type = TREE_TYPE (lhs);
1825 if (!INTEGRAL_TYPE_P (type))
1826 return;
1828 switch (gimple_assign_rhs_code (stmt))
1830 case TRUNC_DIV_EXPR:
1831 case TRUNC_MOD_EXPR:
1832 divisor = gimple_assign_rhs2 (stmt);
1833 op0 = gimple_assign_rhs1 (stmt);
1835 values->reserve (3);
1837 if (TREE_CODE (divisor) == SSA_NAME)
1838 /* Check for the case where the divisor is the same value most
1839 of the time. */
1840 values->quick_push (gimple_alloc_histogram_value (cfun,
1841 HIST_TYPE_SINGLE_VALUE,
1842 stmt, divisor));
1844 /* For mod, check whether it is not often a noop (or replaceable by
1845 a few subtractions). */
1846 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1847 && TYPE_UNSIGNED (type)
1848 && TREE_CODE (divisor) == SSA_NAME)
1850 tree val;
1851 /* Check for a special case where the divisor is power of 2. */
1852 values->quick_push (gimple_alloc_histogram_value (cfun,
1853 HIST_TYPE_POW2,
1854 stmt, divisor));
1856 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1857 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1858 stmt, val);
1859 hist->hdata.intvl.int_start = 0;
1860 hist->hdata.intvl.steps = 2;
1861 values->quick_push (hist);
1863 return;
1865 default:
1866 return;
1870 /* Find calls inside STMT for that we want to measure histograms for
1871 indirect/virtual call optimization. */
1873 static void
1874 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values)
1876 tree callee;
1878 if (gimple_code (stmt) != GIMPLE_CALL
1879 || gimple_call_internal_p (stmt)
1880 || gimple_call_fndecl (stmt) != NULL_TREE)
1881 return;
1883 callee = gimple_call_fn (stmt);
1885 values->reserve (3);
1887 values->quick_push (gimple_alloc_histogram_value (
1888 cfun,
1889 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) ?
1890 HIST_TYPE_INDIR_CALL_TOPN :
1891 HIST_TYPE_INDIR_CALL,
1892 stmt, callee));
1894 return;
1897 /* Find values inside STMT for that we want to measure histograms for
1898 string operations. */
1900 static void
1901 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
1903 gcall *stmt;
1904 tree blck_size;
1905 tree dest;
1906 int size_arg;
1908 stmt = dyn_cast <gcall *> (gs);
1909 if (!stmt)
1910 return;
1912 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL))
1913 return;
1915 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1916 return;
1918 dest = gimple_call_arg (stmt, 0);
1919 blck_size = gimple_call_arg (stmt, size_arg);
1921 if (TREE_CODE (blck_size) != INTEGER_CST)
1923 values->safe_push (gimple_alloc_histogram_value (cfun,
1924 HIST_TYPE_SINGLE_VALUE,
1925 stmt, blck_size));
1926 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1927 stmt, blck_size));
1930 if (TREE_CODE (blck_size) != INTEGER_CST)
1931 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1932 stmt, dest));
1935 /* Find values inside STMT for that we want to measure histograms and adds
1936 them to list VALUES. */
1938 static void
1939 gimple_values_to_profile (gimple *stmt, histogram_values *values)
1941 gimple_divmod_values_to_profile (stmt, values);
1942 gimple_stringops_values_to_profile (stmt, values);
1943 gimple_indirect_call_to_profile (stmt, values);
1946 void
1947 gimple_find_values_to_profile (histogram_values *values)
1949 basic_block bb;
1950 gimple_stmt_iterator gsi;
1951 unsigned i;
1952 histogram_value hist = NULL;
1953 values->create (0);
1955 FOR_EACH_BB_FN (bb, cfun)
1956 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1957 gimple_values_to_profile (gsi_stmt (gsi), values);
1959 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_TIME_PROFILE, 0, 0));
1961 FOR_EACH_VEC_ELT (*values, i, hist)
1963 switch (hist->type)
1965 case HIST_TYPE_INTERVAL:
1966 hist->n_counters = hist->hdata.intvl.steps + 2;
1967 break;
1969 case HIST_TYPE_POW2:
1970 hist->n_counters = 2;
1971 break;
1973 case HIST_TYPE_SINGLE_VALUE:
1974 hist->n_counters = 3;
1975 break;
1977 case HIST_TYPE_INDIR_CALL:
1978 hist->n_counters = 3;
1979 break;
1981 case HIST_TYPE_TIME_PROFILE:
1982 hist->n_counters = 1;
1983 break;
1985 case HIST_TYPE_AVERAGE:
1986 hist->n_counters = 2;
1987 break;
1989 case HIST_TYPE_IOR:
1990 hist->n_counters = 1;
1991 break;
1993 case HIST_TYPE_INDIR_CALL_TOPN:
1994 hist->n_counters = GCOV_ICALL_TOPN_NCOUNTS;
1995 break;
1997 default:
1998 gcc_unreachable ();
2000 if (dump_file && hist->hvalue.stmt != NULL)
2002 fprintf (dump_file, "Stmt ");
2003 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
2004 dump_histogram_value (dump_file, hist);