Introduce gimple_call
[official-gcc.git] / gcc / value-prof.c
blobe8f9f733076b1087e9eb6e926dc0185e9346eb24
1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2014 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 "tm.h"
24 #include "tree.h"
25 #include "tree-nested.h"
26 #include "calls.h"
27 #include "rtl.h"
28 #include "expr.h"
29 #include "hard-reg-set.h"
30 #include "basic-block.h"
31 #include "value-prof.h"
32 #include "flags.h"
33 #include "insn-config.h"
34 #include "recog.h"
35 #include "optabs.h"
36 #include "regs.h"
37 #include "tree-ssa-alias.h"
38 #include "internal-fn.h"
39 #include "tree-eh.h"
40 #include "gimple-expr.h"
41 #include "is-a.h"
42 #include "gimple.h"
43 #include "gimplify.h"
44 #include "gimple-iterator.h"
45 #include "gimple-ssa.h"
46 #include "tree-cfg.h"
47 #include "tree-phinodes.h"
48 #include "ssa-iterators.h"
49 #include "stringpool.h"
50 #include "tree-ssanames.h"
51 #include "diagnostic.h"
52 #include "gimple-pretty-print.h"
53 #include "coverage.h"
54 #include "tree.h"
55 #include "gcov-io.h"
56 #include "timevar.h"
57 #include "dumpfile.h"
58 #include "profile.h"
59 #include "data-streamer.h"
60 #include "builtins.h"
61 #include "tree-nested.h"
62 #include "hash-set.h"
63 #include "params.h"
65 /* In this file value profile based optimizations are placed. Currently the
66 following optimizations are implemented (for more detailed descriptions
67 see comments at value_profile_transformations):
69 1) Division/modulo specialization. Provided that we can determine that the
70 operands of the division have some special properties, we may use it to
71 produce more effective code.
73 2) Indirect/virtual call specialization. If we can determine most
74 common function callee in indirect/virtual call. We can use this
75 information to improve code effectiveness (especially info for
76 the inliner).
78 3) Speculative prefetching. If we are able to determine that the difference
79 between addresses accessed by a memory reference is usually constant, we
80 may add the prefetch instructions.
81 FIXME: This transformation was removed together with RTL based value
82 profiling.
85 Value profiling internals
86 ==========================
88 Every value profiling transformation starts with defining what values
89 to profile. There are different histogram types (see HIST_TYPE_* in
90 value-prof.h) and each transformation can request one or more histogram
91 types per GIMPLE statement. The function gimple_find_values_to_profile()
92 collects the values to profile in a vec, and adds the number of counters
93 required for the different histogram types.
95 For a -fprofile-generate run, the statements for which values should be
96 recorded, are instrumented in instrument_values(). The instrumentation
97 is done by helper functions that can be found in tree-profile.c, where
98 new types of histograms can be added if necessary.
100 After a -fprofile-use, the value profiling data is read back in by
101 compute_value_histograms() that translates the collected data to
102 histograms and attaches them to the profiled statements via
103 gimple_add_histogram_value(). Histograms are stored in a hash table
104 that is attached to every intrumented function, see VALUE_HISTOGRAMS
105 in function.h.
107 The value-profile transformations driver is the function
108 gimple_value_profile_transformations(). It traverses all statements in
109 the to-be-transformed function, and looks for statements with one or
110 more histograms attached to it. If a statement has histograms, the
111 transformation functions are called on the statement.
113 Limitations / FIXME / TODO:
114 * Only one histogram of each type can be associated with a statement.
115 * Currently, HIST_TYPE_CONST_DELTA is not implemented.
116 (This type of histogram was originally used to implement a form of
117 stride profiling based speculative prefetching to improve SPEC2000
118 scores for memory-bound benchmarks, mcf and equake. However, this
119 was an RTL value-profiling transformation, and those have all been
120 removed.)
121 * Some value profile transformations are done in builtins.c (?!)
122 * Updating of histograms needs some TLC.
123 * The value profiling code could be used to record analysis results
124 from non-profiling (e.g. VRP).
125 * Adding new profilers should be simplified, starting with a cleanup
126 of what-happens-where andwith making gimple_find_values_to_profile
127 and gimple_value_profile_transformations table-driven, perhaps...
130 static tree gimple_divmod_fixed_value (gimple, tree, int, gcov_type, gcov_type);
131 static tree gimple_mod_pow2 (gimple, int, gcov_type, gcov_type);
132 static tree gimple_mod_subtract (gimple, int, int, int, gcov_type, gcov_type,
133 gcov_type);
134 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
135 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
136 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
137 static bool gimple_stringops_transform (gimple_stmt_iterator *);
138 static bool gimple_ic_transform (gimple_stmt_iterator *);
140 /* Allocate histogram value. */
142 static histogram_value
143 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
144 enum hist_type type, gimple stmt, tree value)
146 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
147 hist->hvalue.value = value;
148 hist->hvalue.stmt = stmt;
149 hist->type = type;
150 return hist;
153 /* Hash value for histogram. */
155 static hashval_t
156 histogram_hash (const void *x)
158 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
161 /* Return nonzero if statement for histogram_value X is Y. */
163 static int
164 histogram_eq (const void *x, const void *y)
166 return ((const_histogram_value) x)->hvalue.stmt == (const_gimple) y;
169 /* Set histogram for STMT. */
171 static void
172 set_histogram_value (struct function *fun, gimple stmt, histogram_value hist)
174 void **loc;
175 if (!hist && !VALUE_HISTOGRAMS (fun))
176 return;
177 if (!VALUE_HISTOGRAMS (fun))
178 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
179 histogram_eq, NULL);
180 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
181 htab_hash_pointer (stmt),
182 hist ? INSERT : NO_INSERT);
183 if (!hist)
185 if (loc)
186 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
187 return;
189 *loc = hist;
192 /* Get histogram list for STMT. */
194 histogram_value
195 gimple_histogram_value (struct function *fun, gimple stmt)
197 if (!VALUE_HISTOGRAMS (fun))
198 return NULL;
199 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
200 htab_hash_pointer (stmt));
203 /* Add histogram for STMT. */
205 void
206 gimple_add_histogram_value (struct function *fun, gimple stmt,
207 histogram_value hist)
209 hist->hvalue.next = gimple_histogram_value (fun, stmt);
210 set_histogram_value (fun, stmt, hist);
211 hist->fun = fun;
215 /* Remove histogram HIST from STMT's histogram list. */
217 void
218 gimple_remove_histogram_value (struct function *fun, gimple stmt,
219 histogram_value hist)
221 histogram_value hist2 = gimple_histogram_value (fun, stmt);
222 if (hist == hist2)
224 set_histogram_value (fun, stmt, hist->hvalue.next);
226 else
228 while (hist2->hvalue.next != hist)
229 hist2 = hist2->hvalue.next;
230 hist2->hvalue.next = hist->hvalue.next;
232 free (hist->hvalue.counters);
233 #ifdef ENABLE_CHECKING
234 memset (hist, 0xab, sizeof (*hist));
235 #endif
236 free (hist);
240 /* Lookup histogram of type TYPE in the STMT. */
242 histogram_value
243 gimple_histogram_value_of_type (struct function *fun, gimple stmt,
244 enum hist_type type)
246 histogram_value hist;
247 for (hist = gimple_histogram_value (fun, stmt); hist;
248 hist = hist->hvalue.next)
249 if (hist->type == type)
250 return hist;
251 return NULL;
254 /* Dump information about HIST to DUMP_FILE. */
256 static void
257 dump_histogram_value (FILE *dump_file, histogram_value hist)
259 switch (hist->type)
261 case HIST_TYPE_INTERVAL:
262 fprintf (dump_file, "Interval counter range %d -- %d",
263 hist->hdata.intvl.int_start,
264 (hist->hdata.intvl.int_start
265 + hist->hdata.intvl.steps - 1));
266 if (hist->hvalue.counters)
268 unsigned int i;
269 fprintf (dump_file, " [");
270 for (i = 0; i < hist->hdata.intvl.steps; i++)
271 fprintf (dump_file, " %d:%"PRId64,
272 hist->hdata.intvl.int_start + i,
273 (int64_t) hist->hvalue.counters[i]);
274 fprintf (dump_file, " ] outside range:%"PRId64,
275 (int64_t) hist->hvalue.counters[i]);
277 fprintf (dump_file, ".\n");
278 break;
280 case HIST_TYPE_POW2:
281 fprintf (dump_file, "Pow2 counter ");
282 if (hist->hvalue.counters)
284 fprintf (dump_file, "pow2:%"PRId64
285 " nonpow2:%"PRId64,
286 (int64_t) hist->hvalue.counters[0],
287 (int64_t) hist->hvalue.counters[1]);
289 fprintf (dump_file, ".\n");
290 break;
292 case HIST_TYPE_SINGLE_VALUE:
293 fprintf (dump_file, "Single value ");
294 if (hist->hvalue.counters)
296 fprintf (dump_file, "value:%"PRId64
297 " match:%"PRId64
298 " wrong:%"PRId64,
299 (int64_t) hist->hvalue.counters[0],
300 (int64_t) hist->hvalue.counters[1],
301 (int64_t) hist->hvalue.counters[2]);
303 fprintf (dump_file, ".\n");
304 break;
306 case HIST_TYPE_AVERAGE:
307 fprintf (dump_file, "Average value ");
308 if (hist->hvalue.counters)
310 fprintf (dump_file, "sum:%"PRId64
311 " times:%"PRId64,
312 (int64_t) hist->hvalue.counters[0],
313 (int64_t) hist->hvalue.counters[1]);
315 fprintf (dump_file, ".\n");
316 break;
318 case HIST_TYPE_IOR:
319 fprintf (dump_file, "IOR value ");
320 if (hist->hvalue.counters)
322 fprintf (dump_file, "ior:%"PRId64,
323 (int64_t) hist->hvalue.counters[0]);
325 fprintf (dump_file, ".\n");
326 break;
328 case HIST_TYPE_CONST_DELTA:
329 fprintf (dump_file, "Constant delta ");
330 if (hist->hvalue.counters)
332 fprintf (dump_file, "value:%"PRId64
333 " match:%"PRId64
334 " wrong:%"PRId64,
335 (int64_t) hist->hvalue.counters[0],
336 (int64_t) hist->hvalue.counters[1],
337 (int64_t) hist->hvalue.counters[2]);
339 fprintf (dump_file, ".\n");
340 break;
341 case HIST_TYPE_INDIR_CALL:
342 fprintf (dump_file, "Indirect call ");
343 if (hist->hvalue.counters)
345 fprintf (dump_file, "value:%"PRId64
346 " match:%"PRId64
347 " all:%"PRId64,
348 (int64_t) hist->hvalue.counters[0],
349 (int64_t) hist->hvalue.counters[1],
350 (int64_t) hist->hvalue.counters[2]);
352 fprintf (dump_file, ".\n");
353 break;
354 case HIST_TYPE_TIME_PROFILE:
355 fprintf (dump_file, "Time profile ");
356 if (hist->hvalue.counters)
358 fprintf (dump_file, "time:%"PRId64,
359 (int64_t) hist->hvalue.counters[0]);
361 fprintf (dump_file, ".\n");
362 break;
363 case HIST_TYPE_INDIR_CALL_TOPN:
364 fprintf (dump_file, "Indirect call topn ");
365 if (hist->hvalue.counters)
367 int i;
369 fprintf (dump_file, "accu:%"PRId64, hist->hvalue.counters[0]);
370 for (i = 1; i < (GCOV_ICALL_TOPN_VAL << 2); i += 2)
372 fprintf (dump_file, " target:%"PRId64 " value:%"PRId64,
373 (int64_t) hist->hvalue.counters[i],
374 (int64_t) hist->hvalue.counters[i+1]);
377 fprintf (dump_file, ".\n");
378 break;
379 case HIST_TYPE_MAX:
380 gcc_unreachable ();
384 /* Dump information about HIST to DUMP_FILE. */
386 void
387 stream_out_histogram_value (struct output_block *ob, histogram_value hist)
389 struct bitpack_d bp;
390 unsigned int i;
392 bp = bitpack_create (ob->main_stream);
393 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type);
394 bp_pack_value (&bp, hist->hvalue.next != NULL, 1);
395 streamer_write_bitpack (&bp);
396 switch (hist->type)
398 case HIST_TYPE_INTERVAL:
399 streamer_write_hwi (ob, hist->hdata.intvl.int_start);
400 streamer_write_uhwi (ob, hist->hdata.intvl.steps);
401 break;
402 default:
403 break;
405 for (i = 0; i < hist->n_counters; i++)
406 streamer_write_gcov_count (ob, hist->hvalue.counters[i]);
407 if (hist->hvalue.next)
408 stream_out_histogram_value (ob, hist->hvalue.next);
410 /* Dump information about HIST to DUMP_FILE. */
412 void
413 stream_in_histogram_value (struct lto_input_block *ib, gimple stmt)
415 enum hist_type type;
416 unsigned int ncounters = 0;
417 struct bitpack_d bp;
418 unsigned int i;
419 histogram_value new_val;
420 bool next;
421 histogram_value *next_p = NULL;
425 bp = streamer_read_bitpack (ib);
426 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
427 next = bp_unpack_value (&bp, 1);
428 new_val = gimple_alloc_histogram_value (cfun, type, stmt, NULL);
429 switch (type)
431 case HIST_TYPE_INTERVAL:
432 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
433 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
434 ncounters = new_val->hdata.intvl.steps + 2;
435 break;
437 case HIST_TYPE_POW2:
438 case HIST_TYPE_AVERAGE:
439 ncounters = 2;
440 break;
442 case HIST_TYPE_SINGLE_VALUE:
443 case HIST_TYPE_INDIR_CALL:
444 ncounters = 3;
445 break;
447 case HIST_TYPE_CONST_DELTA:
448 ncounters = 4;
449 break;
451 case HIST_TYPE_IOR:
452 case HIST_TYPE_TIME_PROFILE:
453 ncounters = 1;
454 break;
456 case HIST_TYPE_INDIR_CALL_TOPN:
457 ncounters = (GCOV_ICALL_TOPN_VAL << 2) + 1;
458 break;
460 case HIST_TYPE_MAX:
461 gcc_unreachable ();
463 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * ncounters);
464 new_val->n_counters = ncounters;
465 for (i = 0; i < ncounters; i++)
466 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
467 if (!next_p)
468 gimple_add_histogram_value (cfun, stmt, new_val);
469 else
470 *next_p = new_val;
471 next_p = &new_val->hvalue.next;
473 while (next);
476 /* Dump all histograms attached to STMT to DUMP_FILE. */
478 void
479 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple stmt)
481 histogram_value hist;
482 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
483 dump_histogram_value (dump_file, hist);
486 /* Remove all histograms associated with STMT. */
488 void
489 gimple_remove_stmt_histograms (struct function *fun, gimple stmt)
491 histogram_value val;
492 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
493 gimple_remove_histogram_value (fun, stmt, val);
496 /* Duplicate all histograms associates with OSTMT to STMT. */
498 void
499 gimple_duplicate_stmt_histograms (struct function *fun, gimple stmt,
500 struct function *ofun, gimple ostmt)
502 histogram_value val;
503 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
505 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type, NULL, NULL);
506 memcpy (new_val, val, sizeof (*val));
507 new_val->hvalue.stmt = stmt;
508 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
509 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
510 gimple_add_histogram_value (fun, stmt, new_val);
515 /* Move all histograms associated with OSTMT to STMT. */
517 void
518 gimple_move_stmt_histograms (struct function *fun, gimple stmt, gimple ostmt)
520 histogram_value val = gimple_histogram_value (fun, ostmt);
521 if (val)
523 /* The following three statements can't be reordered,
524 because histogram hashtab relies on stmt field value
525 for finding the exact slot. */
526 set_histogram_value (fun, ostmt, NULL);
527 for (; val != NULL; val = val->hvalue.next)
528 val->hvalue.stmt = stmt;
529 set_histogram_value (fun, stmt, val);
533 static bool error_found = false;
535 /* Helper function for verify_histograms. For each histogram reachable via htab
536 walk verify that it was reached via statement walk. */
538 static int
539 visit_hist (void **slot, void *data)
541 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
542 histogram_value hist = *(histogram_value *) slot;
544 if (!visited->contains (hist)
545 && hist->type != HIST_TYPE_TIME_PROFILE)
547 error ("dead histogram");
548 dump_histogram_value (stderr, hist);
549 debug_gimple_stmt (hist->hvalue.stmt);
550 error_found = true;
552 return 1;
556 /* Verify sanity of the histograms. */
558 DEBUG_FUNCTION void
559 verify_histograms (void)
561 basic_block bb;
562 gimple_stmt_iterator gsi;
563 histogram_value hist;
565 error_found = false;
566 hash_set<histogram_value> visited_hists;
567 FOR_EACH_BB_FN (bb, cfun)
568 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
570 gimple stmt = gsi_stmt (gsi);
572 for (hist = gimple_histogram_value (cfun, stmt); hist;
573 hist = hist->hvalue.next)
575 if (hist->hvalue.stmt != stmt)
577 error ("Histogram value statement does not correspond to "
578 "the statement it is associated with");
579 debug_gimple_stmt (stmt);
580 dump_histogram_value (stderr, hist);
581 error_found = true;
583 visited_hists.add (hist);
586 if (VALUE_HISTOGRAMS (cfun))
587 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
588 if (error_found)
589 internal_error ("verify_histograms failed");
592 /* Helper function for verify_histograms. For each histogram reachable via htab
593 walk verify that it was reached via statement walk. */
595 static int
596 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
598 histogram_value hist = *(histogram_value *) slot;
599 free (hist->hvalue.counters);
600 #ifdef ENABLE_CHECKING
601 memset (hist, 0xab, sizeof (*hist));
602 #endif
603 free (hist);
604 return 1;
607 void
608 free_histograms (void)
610 if (VALUE_HISTOGRAMS (cfun))
612 htab_traverse (VALUE_HISTOGRAMS (cfun), free_hist, NULL);
613 htab_delete (VALUE_HISTOGRAMS (cfun));
614 VALUE_HISTOGRAMS (cfun) = NULL;
619 /* The overall number of invocations of the counter should match
620 execution count of basic block. Report it as error rather than
621 internal error as it might mean that user has misused the profile
622 somehow. */
624 static bool
625 check_counter (gimple stmt, const char * name,
626 gcov_type *count, gcov_type *all, gcov_type bb_count)
628 if (*all != bb_count || *count > *all)
630 location_t locus;
631 locus = (stmt != NULL)
632 ? gimple_location (stmt)
633 : DECL_SOURCE_LOCATION (current_function_decl);
634 if (flag_profile_correction)
636 if (dump_enabled_p ())
637 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
638 "correcting inconsistent value profile: %s "
639 "profiler overall count (%d) does not match BB "
640 "count (%d)\n", name, (int)*all, (int)bb_count);
641 *all = bb_count;
642 if (*count > *all)
643 *count = *all;
644 return false;
646 else
648 error_at (locus, "corrupted value profile: %s "
649 "profile counter (%d out of %d) inconsistent with "
650 "basic-block count (%d)",
651 name,
652 (int) *count,
653 (int) *all,
654 (int) bb_count);
655 return true;
659 return false;
663 /* GIMPLE based transformations. */
665 bool
666 gimple_value_profile_transformations (void)
668 basic_block bb;
669 gimple_stmt_iterator gsi;
670 bool changed = false;
672 FOR_EACH_BB_FN (bb, cfun)
674 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
676 gimple stmt = gsi_stmt (gsi);
677 histogram_value th = gimple_histogram_value (cfun, stmt);
678 if (!th)
679 continue;
681 if (dump_file)
683 fprintf (dump_file, "Trying transformations on stmt ");
684 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
685 dump_histograms_for_stmt (cfun, dump_file, stmt);
688 /* Transformations: */
689 /* The order of things in this conditional controls which
690 transformation is used when more than one is applicable. */
691 /* It is expected that any code added by the transformations
692 will be added before the current statement, and that the
693 current statement remain valid (although possibly
694 modified) upon return. */
695 if (gimple_mod_subtract_transform (&gsi)
696 || gimple_divmod_fixed_value_transform (&gsi)
697 || gimple_mod_pow2_value_transform (&gsi)
698 || gimple_stringops_transform (&gsi)
699 || gimple_ic_transform (&gsi))
701 stmt = gsi_stmt (gsi);
702 changed = true;
703 /* Original statement may no longer be in the same block. */
704 if (bb != gimple_bb (stmt))
706 bb = gimple_bb (stmt);
707 gsi = gsi_for_stmt (stmt);
713 if (changed)
715 counts_to_freqs ();
718 return changed;
722 /* Generate code for transformation 1 (with parent gimple assignment
723 STMT and probability of taking the optimal path PROB, which is
724 equivalent to COUNT/ALL within roundoff error). This generates the
725 result into a temp and returns the temp; it does not replace or
726 alter the original STMT. */
728 static tree
729 gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count,
730 gcov_type all)
732 gimple stmt1, stmt2, stmt3;
733 tree tmp0, tmp1, tmp2;
734 gimple bb1end, bb2end, bb3end;
735 basic_block bb, bb2, bb3, bb4;
736 tree optype, op1, op2;
737 edge e12, e13, e23, e24, e34;
738 gimple_stmt_iterator gsi;
740 gcc_assert (is_gimple_assign (stmt)
741 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
742 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
744 optype = TREE_TYPE (gimple_assign_lhs (stmt));
745 op1 = gimple_assign_rhs1 (stmt);
746 op2 = gimple_assign_rhs2 (stmt);
748 bb = gimple_bb (stmt);
749 gsi = gsi_for_stmt (stmt);
751 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
752 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
753 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
754 stmt2 = gimple_build_assign (tmp1, op2);
755 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
756 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
757 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
758 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
759 bb1end = stmt3;
761 tmp2 = create_tmp_reg (optype, "PROF");
762 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
763 op1, tmp0);
764 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
765 bb2end = stmt1;
767 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
768 op1, op2);
769 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
770 bb3end = stmt1;
772 /* Fix CFG. */
773 /* Edge e23 connects bb2 to bb3, etc. */
774 e12 = split_block (bb, bb1end);
775 bb2 = e12->dest;
776 bb2->count = count;
777 e23 = split_block (bb2, bb2end);
778 bb3 = e23->dest;
779 bb3->count = all - count;
780 e34 = split_block (bb3, bb3end);
781 bb4 = e34->dest;
782 bb4->count = all;
784 e12->flags &= ~EDGE_FALLTHRU;
785 e12->flags |= EDGE_FALSE_VALUE;
786 e12->probability = prob;
787 e12->count = count;
789 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
790 e13->probability = REG_BR_PROB_BASE - prob;
791 e13->count = all - count;
793 remove_edge (e23);
795 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
796 e24->probability = REG_BR_PROB_BASE;
797 e24->count = count;
799 e34->probability = REG_BR_PROB_BASE;
800 e34->count = all - count;
802 return tmp2;
806 /* Do transform 1) on INSN if applicable. */
808 static bool
809 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
811 histogram_value histogram;
812 enum tree_code code;
813 gcov_type val, count, all;
814 tree result, value, tree_val;
815 gcov_type prob;
816 gimple stmt;
818 stmt = gsi_stmt (*si);
819 if (gimple_code (stmt) != GIMPLE_ASSIGN)
820 return false;
822 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
823 return false;
825 code = gimple_assign_rhs_code (stmt);
827 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
828 return false;
830 histogram = gimple_histogram_value_of_type (cfun, stmt,
831 HIST_TYPE_SINGLE_VALUE);
832 if (!histogram)
833 return false;
835 value = histogram->hvalue.value;
836 val = histogram->hvalue.counters[0];
837 count = histogram->hvalue.counters[1];
838 all = histogram->hvalue.counters[2];
839 gimple_remove_histogram_value (cfun, stmt, histogram);
841 /* We require that count is at least half of all; this means
842 that for the transformation to fire the value must be constant
843 at least 50% of time (and 75% gives the guarantee of usage). */
844 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
845 || 2 * count < all
846 || optimize_bb_for_size_p (gimple_bb (stmt)))
847 return false;
849 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
850 return false;
852 /* Compute probability of taking the optimal path. */
853 if (all > 0)
854 prob = GCOV_COMPUTE_SCALE (count, all);
855 else
856 prob = 0;
858 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
859 tree_val = build_int_cst (get_gcov_type (), val);
860 else
862 HOST_WIDE_INT a[2];
863 a[0] = (unsigned HOST_WIDE_INT) val;
864 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
866 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
867 TYPE_PRECISION (get_gcov_type ()), false));
869 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
871 if (dump_file)
873 fprintf (dump_file, "Div/mod by constant ");
874 print_generic_expr (dump_file, value, TDF_SLIM);
875 fprintf (dump_file, "=");
876 print_generic_expr (dump_file, tree_val, TDF_SLIM);
877 fprintf (dump_file, " transformation on insn ");
878 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
881 gimple_assign_set_rhs_from_tree (si, result);
882 update_stmt (gsi_stmt (*si));
884 return true;
887 /* Generate code for transformation 2 (with parent gimple assign STMT and
888 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
889 within roundoff error). This generates the result into a temp and returns
890 the temp; it does not replace or alter the original STMT. */
891 static tree
892 gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
894 gimple stmt1, stmt2, stmt3, stmt4;
895 tree tmp2, tmp3;
896 gimple bb1end, bb2end, bb3end;
897 basic_block bb, bb2, bb3, bb4;
898 tree optype, op1, op2;
899 edge e12, e13, e23, e24, e34;
900 gimple_stmt_iterator gsi;
901 tree result;
903 gcc_assert (is_gimple_assign (stmt)
904 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
906 optype = TREE_TYPE (gimple_assign_lhs (stmt));
907 op1 = gimple_assign_rhs1 (stmt);
908 op2 = gimple_assign_rhs2 (stmt);
910 bb = gimple_bb (stmt);
911 gsi = gsi_for_stmt (stmt);
913 result = create_tmp_reg (optype, "PROF");
914 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
915 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
916 stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
917 build_int_cst (optype, -1));
918 stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
919 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
920 NULL_TREE, NULL_TREE);
921 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
922 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
923 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
924 bb1end = stmt4;
926 /* tmp2 == op2-1 inherited from previous block. */
927 stmt1 = gimple_build_assign_with_ops (BIT_AND_EXPR, result, op1, tmp2);
928 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
929 bb2end = stmt1;
931 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
932 op1, op2);
933 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
934 bb3end = stmt1;
936 /* Fix CFG. */
937 /* Edge e23 connects bb2 to bb3, etc. */
938 e12 = split_block (bb, bb1end);
939 bb2 = e12->dest;
940 bb2->count = count;
941 e23 = split_block (bb2, bb2end);
942 bb3 = e23->dest;
943 bb3->count = all - count;
944 e34 = split_block (bb3, bb3end);
945 bb4 = e34->dest;
946 bb4->count = all;
948 e12->flags &= ~EDGE_FALLTHRU;
949 e12->flags |= EDGE_FALSE_VALUE;
950 e12->probability = prob;
951 e12->count = count;
953 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
954 e13->probability = REG_BR_PROB_BASE - prob;
955 e13->count = all - count;
957 remove_edge (e23);
959 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
960 e24->probability = REG_BR_PROB_BASE;
961 e24->count = count;
963 e34->probability = REG_BR_PROB_BASE;
964 e34->count = all - count;
966 return result;
969 /* Do transform 2) on INSN if applicable. */
970 static bool
971 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
973 histogram_value histogram;
974 enum tree_code code;
975 gcov_type count, wrong_values, all;
976 tree lhs_type, result, value;
977 gcov_type prob;
978 gimple stmt;
980 stmt = gsi_stmt (*si);
981 if (gimple_code (stmt) != GIMPLE_ASSIGN)
982 return false;
984 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
985 if (!INTEGRAL_TYPE_P (lhs_type))
986 return false;
988 code = gimple_assign_rhs_code (stmt);
990 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
991 return false;
993 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
994 if (!histogram)
995 return false;
997 value = histogram->hvalue.value;
998 wrong_values = histogram->hvalue.counters[0];
999 count = histogram->hvalue.counters[1];
1001 gimple_remove_histogram_value (cfun, stmt, histogram);
1003 /* We require that we hit a power of 2 at least half of all evaluations. */
1004 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
1005 || count < wrong_values
1006 || optimize_bb_for_size_p (gimple_bb (stmt)))
1007 return false;
1009 if (dump_file)
1011 fprintf (dump_file, "Mod power of 2 transformation on insn ");
1012 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1015 /* Compute probability of taking the optimal path. */
1016 all = count + wrong_values;
1018 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
1019 return false;
1021 if (all > 0)
1022 prob = GCOV_COMPUTE_SCALE (count, all);
1023 else
1024 prob = 0;
1026 result = gimple_mod_pow2 (stmt, prob, count, all);
1028 gimple_assign_set_rhs_from_tree (si, result);
1029 update_stmt (gsi_stmt (*si));
1031 return true;
1034 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
1035 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
1036 supported and this is built into this interface. The probabilities of taking
1037 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
1038 COUNT2/ALL respectively within roundoff error). This generates the
1039 result into a temp and returns the temp; it does not replace or alter
1040 the original STMT. */
1041 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1043 static tree
1044 gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts,
1045 gcov_type count1, gcov_type count2, gcov_type all)
1047 gimple stmt1, stmt2, stmt3;
1048 tree tmp1;
1049 gimple bb1end, bb2end = NULL, bb3end;
1050 basic_block bb, bb2, bb3, bb4;
1051 tree optype, op1, op2;
1052 edge e12, e23 = 0, e24, e34, e14;
1053 gimple_stmt_iterator gsi;
1054 tree result;
1056 gcc_assert (is_gimple_assign (stmt)
1057 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
1059 optype = TREE_TYPE (gimple_assign_lhs (stmt));
1060 op1 = gimple_assign_rhs1 (stmt);
1061 op2 = gimple_assign_rhs2 (stmt);
1063 bb = gimple_bb (stmt);
1064 gsi = gsi_for_stmt (stmt);
1066 result = create_tmp_reg (optype, "PROF");
1067 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1068 stmt1 = gimple_build_assign (result, op1);
1069 stmt2 = gimple_build_assign (tmp1, op2);
1070 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1071 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1072 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1073 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
1074 bb1end = stmt3;
1076 if (ncounts) /* Assumed to be 0 or 1 */
1078 stmt1 = gimple_build_assign_with_ops (MINUS_EXPR, result, result, tmp1);
1079 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1080 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1081 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1082 bb2end = stmt2;
1085 /* Fallback case. */
1086 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
1087 result, tmp1);
1088 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1089 bb3end = stmt1;
1091 /* Fix CFG. */
1092 /* Edge e23 connects bb2 to bb3, etc. */
1093 /* However block 3 is optional; if it is not there, references
1094 to 3 really refer to block 2. */
1095 e12 = split_block (bb, bb1end);
1096 bb2 = e12->dest;
1097 bb2->count = all - count1;
1099 if (ncounts) /* Assumed to be 0 or 1. */
1101 e23 = split_block (bb2, bb2end);
1102 bb3 = e23->dest;
1103 bb3->count = all - count1 - count2;
1106 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
1107 bb4 = e34->dest;
1108 bb4->count = all;
1110 e12->flags &= ~EDGE_FALLTHRU;
1111 e12->flags |= EDGE_FALSE_VALUE;
1112 e12->probability = REG_BR_PROB_BASE - prob1;
1113 e12->count = all - count1;
1115 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
1116 e14->probability = prob1;
1117 e14->count = count1;
1119 if (ncounts) /* Assumed to be 0 or 1. */
1121 e23->flags &= ~EDGE_FALLTHRU;
1122 e23->flags |= EDGE_FALSE_VALUE;
1123 e23->count = all - count1 - count2;
1124 e23->probability = REG_BR_PROB_BASE - prob2;
1126 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
1127 e24->probability = prob2;
1128 e24->count = count2;
1131 e34->probability = REG_BR_PROB_BASE;
1132 e34->count = all - count1 - count2;
1134 return result;
1138 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1140 static bool
1141 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
1143 histogram_value histogram;
1144 enum tree_code code;
1145 gcov_type count, wrong_values, all;
1146 tree lhs_type, result;
1147 gcov_type prob1, prob2;
1148 unsigned int i, steps;
1149 gcov_type count1, count2;
1150 gimple stmt;
1152 stmt = gsi_stmt (*si);
1153 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1154 return false;
1156 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
1157 if (!INTEGRAL_TYPE_P (lhs_type))
1158 return false;
1160 code = gimple_assign_rhs_code (stmt);
1162 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
1163 return false;
1165 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
1166 if (!histogram)
1167 return false;
1169 all = 0;
1170 wrong_values = 0;
1171 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1172 all += histogram->hvalue.counters[i];
1174 wrong_values += histogram->hvalue.counters[i];
1175 wrong_values += histogram->hvalue.counters[i+1];
1176 steps = histogram->hdata.intvl.steps;
1177 all += wrong_values;
1178 count1 = histogram->hvalue.counters[0];
1179 count2 = histogram->hvalue.counters[1];
1181 /* Compute probability of taking the optimal path. */
1182 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1184 gimple_remove_histogram_value (cfun, stmt, histogram);
1185 return false;
1188 if (flag_profile_correction && count1 + count2 > all)
1189 all = count1 + count2;
1191 gcc_assert (count1 + count2 <= all);
1193 /* We require that we use just subtractions in at least 50% of all
1194 evaluations. */
1195 count = 0;
1196 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1198 count += histogram->hvalue.counters[i];
1199 if (count * 2 >= all)
1200 break;
1202 if (i == steps
1203 || optimize_bb_for_size_p (gimple_bb (stmt)))
1204 return false;
1206 gimple_remove_histogram_value (cfun, stmt, histogram);
1207 if (dump_file)
1209 fprintf (dump_file, "Mod subtract transformation on insn ");
1210 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1213 /* Compute probability of taking the optimal path(s). */
1214 if (all > 0)
1216 prob1 = GCOV_COMPUTE_SCALE (count1, all);
1217 prob2 = GCOV_COMPUTE_SCALE (count2, all);
1219 else
1221 prob1 = prob2 = 0;
1224 /* In practice, "steps" is always 2. This interface reflects this,
1225 and will need to be changed if "steps" can change. */
1226 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1228 gimple_assign_set_rhs_from_tree (si, result);
1229 update_stmt (gsi_stmt (*si));
1231 return true;
1234 struct profile_id_traits : default_hashmap_traits
1236 template<typename T>
1237 static bool
1238 is_deleted (T &e)
1240 return e.m_key == UINT_MAX;
1243 template<typename T> static bool is_empty (T &e) { return e.m_key == 0; }
1244 template<typename T> static void mark_deleted (T &e) { e.m_key = UINT_MAX; }
1245 template<typename T> static void mark_empty (T &e) { e.m_key = 0; }
1248 static hash_map<unsigned int, cgraph_node *, profile_id_traits> *
1249 cgraph_node_map = 0;
1251 /* Returns true if node graph is initialized. This
1252 is used to test if profile_id has been created
1253 for cgraph_nodes. */
1255 bool
1256 coverage_node_map_initialized_p (void)
1258 return cgraph_node_map != 0;
1261 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1262 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1263 that the PROFILE_IDs was already assigned. */
1265 void
1266 init_node_map (bool local)
1268 struct cgraph_node *n;
1269 cgraph_node_map
1270 = new hash_map<unsigned int, cgraph_node *, profile_id_traits>;
1272 FOR_EACH_DEFINED_FUNCTION (n)
1273 if (n->has_gimple_body_p ())
1275 cgraph_node **val;
1276 if (local)
1278 n->profile_id = coverage_compute_profile_id (n);
1279 while ((val = cgraph_node_map->get (n->profile_id))
1280 || !n->profile_id)
1282 if (dump_file)
1283 fprintf (dump_file, "Local profile-id %i conflict"
1284 " with nodes %s/%i %s/%i\n",
1285 n->profile_id,
1286 n->name (),
1287 n->order,
1288 (*val)->name (),
1289 (*val)->order);
1290 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
1293 else if (!n->profile_id)
1295 if (dump_file)
1296 fprintf (dump_file,
1297 "Node %s/%i has no profile-id"
1298 " (profile feedback missing?)\n",
1299 n->name (),
1300 n->order);
1301 continue;
1303 else if ((val = cgraph_node_map->get (n->profile_id)))
1305 if (dump_file)
1306 fprintf (dump_file,
1307 "Node %s/%i has IP profile-id %i conflict. "
1308 "Giving up.\n",
1309 n->name (),
1310 n->order,
1311 n->profile_id);
1312 *val = NULL;
1313 continue;
1315 cgraph_node_map->put (n->profile_id, n);
1319 /* Delete the CGRAPH_NODE_MAP. */
1321 void
1322 del_node_map (void)
1324 delete cgraph_node_map;
1327 /* Return cgraph node for function with pid */
1329 struct cgraph_node*
1330 find_func_by_profile_id (int profile_id)
1332 cgraph_node **val = cgraph_node_map->get (profile_id);
1333 if (val)
1334 return *val;
1335 else
1336 return NULL;
1339 /* Perform sanity check on the indirect call target. Due to race conditions,
1340 false function target may be attributed to an indirect call site. If the
1341 call expression type mismatches with the target function's type, expand_call
1342 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1343 Returns true if TARGET is considered ok for call CALL_STMT. */
1345 static bool
1346 check_ic_target (gimple_call call_stmt, struct cgraph_node *target)
1348 location_t locus;
1349 if (gimple_check_call_matching_types (call_stmt, target->decl, true))
1350 return true;
1352 locus = gimple_location (call_stmt);
1353 if (dump_enabled_p ())
1354 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
1355 "Skipping target %s with mismatching types for icall\n",
1356 target->name ());
1357 return false;
1360 /* Do transformation
1362 if (actual_callee_address == address_of_most_common_function/method)
1363 do direct call
1364 else
1365 old call
1368 gimple
1369 gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
1370 int prob, gcov_type count, gcov_type all)
1372 gimple dcall_stmt, load_stmt, cond_stmt;
1373 tree tmp0, tmp1, tmp;
1374 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1375 tree optype = build_pointer_type (void_type_node);
1376 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1377 gimple_stmt_iterator gsi;
1378 int lp_nr, dflags;
1379 edge e_eh, e;
1380 edge_iterator ei;
1381 gimple_phi_iterator psi;
1383 cond_bb = gimple_bb (icall_stmt);
1384 gsi = gsi_for_stmt (icall_stmt);
1386 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1387 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1388 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1389 load_stmt = gimple_build_assign (tmp0, tmp);
1390 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1392 tmp = fold_convert (optype, build_addr (direct_call->decl,
1393 current_function_decl));
1394 load_stmt = gimple_build_assign (tmp1, tmp);
1395 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1397 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1398 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1400 gimple_set_vdef (icall_stmt, NULL_TREE);
1401 gimple_set_vuse (icall_stmt, NULL_TREE);
1402 update_stmt (icall_stmt);
1403 dcall_stmt = gimple_copy (icall_stmt);
1404 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1405 dflags = flags_from_decl_or_type (direct_call->decl);
1406 if ((dflags & ECF_NORETURN) != 0)
1407 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1408 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1410 /* Fix CFG. */
1411 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1412 e_cd = split_block (cond_bb, cond_stmt);
1413 dcall_bb = e_cd->dest;
1414 dcall_bb->count = count;
1416 e_di = split_block (dcall_bb, dcall_stmt);
1417 icall_bb = e_di->dest;
1418 icall_bb->count = all - count;
1420 /* Do not disturb existing EH edges from the indirect call. */
1421 if (!stmt_ends_bb_p (icall_stmt))
1422 e_ij = split_block (icall_bb, icall_stmt);
1423 else
1425 e_ij = find_fallthru_edge (icall_bb->succs);
1426 /* The indirect call might be noreturn. */
1427 if (e_ij != NULL)
1429 e_ij->probability = REG_BR_PROB_BASE;
1430 e_ij->count = all - count;
1431 e_ij = single_pred_edge (split_edge (e_ij));
1434 if (e_ij != NULL)
1436 join_bb = e_ij->dest;
1437 join_bb->count = all;
1440 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1441 e_cd->probability = prob;
1442 e_cd->count = count;
1444 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1445 e_ci->probability = REG_BR_PROB_BASE - prob;
1446 e_ci->count = all - count;
1448 remove_edge (e_di);
1450 if (e_ij != NULL)
1452 if ((dflags & ECF_NORETURN) != 0)
1453 e_ij->count = all;
1454 else
1456 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1457 e_dj->probability = REG_BR_PROB_BASE;
1458 e_dj->count = count;
1460 e_ij->count = all - count;
1462 e_ij->probability = REG_BR_PROB_BASE;
1465 /* Insert PHI node for the call result if necessary. */
1466 if (gimple_call_lhs (icall_stmt)
1467 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1468 && (dflags & ECF_NORETURN) == 0)
1470 tree result = gimple_call_lhs (icall_stmt);
1471 gimple phi = create_phi_node (result, join_bb);
1472 gimple_call_set_lhs (icall_stmt,
1473 duplicate_ssa_name (result, icall_stmt));
1474 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1475 gimple_call_set_lhs (dcall_stmt,
1476 duplicate_ssa_name (result, dcall_stmt));
1477 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1480 /* Build an EH edge for the direct call if necessary. */
1481 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1482 if (lp_nr > 0 && stmt_could_throw_p (dcall_stmt))
1484 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1487 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1488 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
1490 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
1491 for (psi = gsi_start_phis (e_eh->dest);
1492 !gsi_end_p (psi); gsi_next (&psi))
1494 gimple_phi phi = psi.phi ();
1495 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1496 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1499 return dcall_stmt;
1503 For every checked indirect/virtual call determine if most common pid of
1504 function/class method has probability more than 50%. If yes modify code of
1505 this call to:
1508 static bool
1509 gimple_ic_transform (gimple_stmt_iterator *gsi)
1511 gimple_call stmt;
1512 histogram_value histogram;
1513 gcov_type val, count, all, bb_all;
1514 struct cgraph_node *direct_call;
1516 stmt = dyn_cast <gimple_call> (gsi_stmt (*gsi));
1517 if (!stmt)
1518 return false;
1520 if (gimple_call_fndecl (stmt) != NULL_TREE)
1521 return false;
1523 if (gimple_call_internal_p (stmt))
1524 return false;
1526 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1527 if (!histogram)
1528 return false;
1530 val = histogram->hvalue.counters [0];
1531 count = histogram->hvalue.counters [1];
1532 all = histogram->hvalue.counters [2];
1534 bb_all = gimple_bb (stmt)->count;
1535 /* The order of CHECK_COUNTER calls is important -
1536 since check_counter can correct the third parameter
1537 and we want to make count <= all <= bb_all. */
1538 if ( check_counter (stmt, "ic", &all, &bb_all, bb_all)
1539 || check_counter (stmt, "ic", &count, &all, all))
1541 gimple_remove_histogram_value (cfun, stmt, histogram);
1542 return false;
1545 if (4 * count <= 3 * all)
1546 return false;
1548 direct_call = find_func_by_profile_id ((int)val);
1550 if (direct_call == NULL)
1552 if (val)
1554 if (dump_file)
1556 fprintf (dump_file, "Indirect call -> direct call from other module");
1557 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1558 fprintf (dump_file, "=> %i (will resolve only with LTO)\n", (int)val);
1561 return false;
1564 if (!check_ic_target (stmt, direct_call))
1566 if (dump_file)
1568 fprintf (dump_file, "Indirect call -> direct call ");
1569 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1570 fprintf (dump_file, "=> ");
1571 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1572 fprintf (dump_file, " transformation skipped because of type mismatch");
1573 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1575 gimple_remove_histogram_value (cfun, stmt, histogram);
1576 return false;
1579 if (dump_file)
1581 fprintf (dump_file, "Indirect call -> direct call ");
1582 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1583 fprintf (dump_file, "=> ");
1584 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1585 fprintf (dump_file, " transformation on insn postponned to ipa-profile");
1586 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1587 fprintf (dump_file, "hist->count %"PRId64
1588 " hist->all %"PRId64"\n", count, all);
1591 return true;
1594 /* Return true if the stringop CALL with FNDECL shall be profiled.
1595 SIZE_ARG be set to the argument index for the size of the string
1596 operation.
1598 static bool
1599 interesting_stringop_to_profile_p (tree fndecl, gimple_call call, int *size_arg)
1601 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
1603 if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
1604 && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
1605 return false;
1607 switch (fcode)
1609 case BUILT_IN_MEMCPY:
1610 case BUILT_IN_MEMPCPY:
1611 *size_arg = 2;
1612 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1613 INTEGER_TYPE, VOID_TYPE);
1614 case BUILT_IN_MEMSET:
1615 *size_arg = 2;
1616 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1617 INTEGER_TYPE, VOID_TYPE);
1618 case BUILT_IN_BZERO:
1619 *size_arg = 1;
1620 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1621 VOID_TYPE);
1622 default:
1623 gcc_unreachable ();
1627 /* Convert stringop (..., vcall_size)
1628 into
1629 if (vcall_size == icall_size)
1630 stringop (..., icall_size);
1631 else
1632 stringop (..., vcall_size);
1633 assuming we'll propagate a true constant into ICALL_SIZE later. */
1635 static void
1636 gimple_stringop_fixed_value (gimple_call vcall_stmt, tree icall_size, int prob,
1637 gcov_type count, gcov_type all)
1639 gimple tmp_stmt, cond_stmt, icall_stmt;
1640 tree tmp0, tmp1, vcall_size, optype;
1641 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1642 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1643 gimple_stmt_iterator gsi;
1644 tree fndecl;
1645 int size_arg;
1647 fndecl = gimple_call_fndecl (vcall_stmt);
1648 if (!interesting_stringop_to_profile_p (fndecl, vcall_stmt, &size_arg))
1649 gcc_unreachable ();
1651 cond_bb = gimple_bb (vcall_stmt);
1652 gsi = gsi_for_stmt (vcall_stmt);
1654 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1655 optype = TREE_TYPE (vcall_size);
1657 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1658 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1659 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1660 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1662 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1663 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1665 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1666 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1668 gimple_set_vdef (vcall_stmt, NULL);
1669 gimple_set_vuse (vcall_stmt, NULL);
1670 update_stmt (vcall_stmt);
1671 icall_stmt = gimple_copy (vcall_stmt);
1672 gimple_call_set_arg (icall_stmt, size_arg, icall_size);
1673 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1675 /* Fix CFG. */
1676 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1677 e_ci = split_block (cond_bb, cond_stmt);
1678 icall_bb = e_ci->dest;
1679 icall_bb->count = count;
1681 e_iv = split_block (icall_bb, icall_stmt);
1682 vcall_bb = e_iv->dest;
1683 vcall_bb->count = all - count;
1685 e_vj = split_block (vcall_bb, vcall_stmt);
1686 join_bb = e_vj->dest;
1687 join_bb->count = all;
1689 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1690 e_ci->probability = prob;
1691 e_ci->count = count;
1693 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1694 e_cv->probability = REG_BR_PROB_BASE - prob;
1695 e_cv->count = all - count;
1697 remove_edge (e_iv);
1699 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1700 e_ij->probability = REG_BR_PROB_BASE;
1701 e_ij->count = count;
1703 e_vj->probability = REG_BR_PROB_BASE;
1704 e_vj->count = all - count;
1706 /* Insert PHI node for the call result if necessary. */
1707 if (gimple_call_lhs (vcall_stmt)
1708 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1710 tree result = gimple_call_lhs (vcall_stmt);
1711 gimple phi = create_phi_node (result, join_bb);
1712 gimple_call_set_lhs (vcall_stmt,
1713 duplicate_ssa_name (result, vcall_stmt));
1714 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1715 gimple_call_set_lhs (icall_stmt,
1716 duplicate_ssa_name (result, icall_stmt));
1717 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1720 /* Because these are all string op builtins, they're all nothrow. */
1721 gcc_assert (!stmt_could_throw_p (vcall_stmt));
1722 gcc_assert (!stmt_could_throw_p (icall_stmt));
1725 /* Find values inside STMT for that we want to measure histograms for
1726 division/modulo optimization. */
1727 static bool
1728 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1730 gimple_call stmt;
1731 tree fndecl;
1732 tree blck_size;
1733 enum built_in_function fcode;
1734 histogram_value histogram;
1735 gcov_type count, all, val;
1736 tree dest, src;
1737 unsigned int dest_align, src_align;
1738 gcov_type prob;
1739 tree tree_val;
1740 int size_arg;
1742 stmt = dyn_cast <gimple_call> (gsi_stmt (*gsi));
1743 if (!stmt)
1744 return false;
1745 fndecl = gimple_call_fndecl (stmt);
1746 if (!fndecl)
1747 return false;
1748 fcode = DECL_FUNCTION_CODE (fndecl);
1749 if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1750 return false;
1752 blck_size = gimple_call_arg (stmt, size_arg);
1753 if (TREE_CODE (blck_size) == INTEGER_CST)
1754 return false;
1756 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_SINGLE_VALUE);
1757 if (!histogram)
1758 return false;
1759 val = histogram->hvalue.counters[0];
1760 count = histogram->hvalue.counters[1];
1761 all = histogram->hvalue.counters[2];
1762 gimple_remove_histogram_value (cfun, stmt, histogram);
1763 /* We require that count is at least half of all; this means
1764 that for the transformation to fire the value must be constant
1765 at least 80% of time. */
1766 if ((6 * count / 5) < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1767 return false;
1768 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1769 return false;
1770 if (all > 0)
1771 prob = GCOV_COMPUTE_SCALE (count, all);
1772 else
1773 prob = 0;
1774 dest = gimple_call_arg (stmt, 0);
1775 dest_align = get_pointer_alignment (dest);
1776 switch (fcode)
1778 case BUILT_IN_MEMCPY:
1779 case BUILT_IN_MEMPCPY:
1780 src = gimple_call_arg (stmt, 1);
1781 src_align = get_pointer_alignment (src);
1782 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1783 return false;
1784 break;
1785 case BUILT_IN_MEMSET:
1786 if (!can_store_by_pieces (val, builtin_memset_read_str,
1787 gimple_call_arg (stmt, 1),
1788 dest_align, true))
1789 return false;
1790 break;
1791 case BUILT_IN_BZERO:
1792 if (!can_store_by_pieces (val, builtin_memset_read_str,
1793 integer_zero_node,
1794 dest_align, true))
1795 return false;
1796 break;
1797 default:
1798 gcc_unreachable ();
1800 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
1801 tree_val = build_int_cst (get_gcov_type (), val);
1802 else
1804 HOST_WIDE_INT a[2];
1805 a[0] = (unsigned HOST_WIDE_INT) val;
1806 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
1808 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
1809 TYPE_PRECISION (get_gcov_type ()), false));
1812 if (dump_file)
1814 fprintf (dump_file, "Single value %i stringop transformation on ",
1815 (int)val);
1816 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1818 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1820 return true;
1823 void
1824 stringop_block_profile (gimple stmt, unsigned int *expected_align,
1825 HOST_WIDE_INT *expected_size)
1827 histogram_value histogram;
1828 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1829 if (!histogram)
1830 *expected_size = -1;
1831 else if (!histogram->hvalue.counters[1])
1833 *expected_size = -1;
1834 gimple_remove_histogram_value (cfun, stmt, histogram);
1836 else
1838 gcov_type size;
1839 size = ((histogram->hvalue.counters[0]
1840 + histogram->hvalue.counters[1] / 2)
1841 / histogram->hvalue.counters[1]);
1842 /* Even if we can hold bigger value in SIZE, INT_MAX
1843 is safe "infinity" for code generation strategies. */
1844 if (size > INT_MAX)
1845 size = INT_MAX;
1846 *expected_size = size;
1847 gimple_remove_histogram_value (cfun, stmt, histogram);
1849 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1850 if (!histogram)
1851 *expected_align = 0;
1852 else if (!histogram->hvalue.counters[0])
1854 gimple_remove_histogram_value (cfun, stmt, histogram);
1855 *expected_align = 0;
1857 else
1859 gcov_type count;
1860 int alignment;
1862 count = histogram->hvalue.counters[0];
1863 alignment = 1;
1864 while (!(count & alignment)
1865 && (alignment * 2 * BITS_PER_UNIT))
1866 alignment <<= 1;
1867 *expected_align = alignment * BITS_PER_UNIT;
1868 gimple_remove_histogram_value (cfun, stmt, histogram);
1873 /* Find values inside STMT for that we want to measure histograms for
1874 division/modulo optimization. */
1875 static void
1876 gimple_divmod_values_to_profile (gimple stmt, histogram_values *values)
1878 tree lhs, divisor, op0, type;
1879 histogram_value hist;
1881 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1882 return;
1884 lhs = gimple_assign_lhs (stmt);
1885 type = TREE_TYPE (lhs);
1886 if (!INTEGRAL_TYPE_P (type))
1887 return;
1889 switch (gimple_assign_rhs_code (stmt))
1891 case TRUNC_DIV_EXPR:
1892 case TRUNC_MOD_EXPR:
1893 divisor = gimple_assign_rhs2 (stmt);
1894 op0 = gimple_assign_rhs1 (stmt);
1896 values->reserve (3);
1898 if (TREE_CODE (divisor) == SSA_NAME)
1899 /* Check for the case where the divisor is the same value most
1900 of the time. */
1901 values->quick_push (gimple_alloc_histogram_value (cfun,
1902 HIST_TYPE_SINGLE_VALUE,
1903 stmt, divisor));
1905 /* For mod, check whether it is not often a noop (or replaceable by
1906 a few subtractions). */
1907 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1908 && TYPE_UNSIGNED (type))
1910 tree val;
1911 /* Check for a special case where the divisor is power of 2. */
1912 values->quick_push (gimple_alloc_histogram_value (cfun,
1913 HIST_TYPE_POW2,
1914 stmt, divisor));
1916 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1917 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1918 stmt, val);
1919 hist->hdata.intvl.int_start = 0;
1920 hist->hdata.intvl.steps = 2;
1921 values->quick_push (hist);
1923 return;
1925 default:
1926 return;
1930 /* Find calls inside STMT for that we want to measure histograms for
1931 indirect/virtual call optimization. */
1933 static void
1934 gimple_indirect_call_to_profile (gimple stmt, histogram_values *values)
1936 tree callee;
1938 if (gimple_code (stmt) != GIMPLE_CALL
1939 || gimple_call_internal_p (stmt)
1940 || gimple_call_fndecl (stmt) != NULL_TREE)
1941 return;
1943 callee = gimple_call_fn (stmt);
1945 values->reserve (3);
1947 values->quick_push (gimple_alloc_histogram_value (
1948 cfun,
1949 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) ?
1950 HIST_TYPE_INDIR_CALL_TOPN :
1951 HIST_TYPE_INDIR_CALL,
1952 stmt, callee));
1954 return;
1957 /* Find values inside STMT for that we want to measure histograms for
1958 string operations. */
1959 static void
1960 gimple_stringops_values_to_profile (gimple gs, histogram_values *values)
1962 gimple_call stmt;
1963 tree fndecl;
1964 tree blck_size;
1965 tree dest;
1966 int size_arg;
1968 stmt = dyn_cast <gimple_call> (gs);
1969 if (!stmt)
1970 return;
1971 fndecl = gimple_call_fndecl (stmt);
1972 if (!fndecl)
1973 return;
1975 if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1976 return;
1978 dest = gimple_call_arg (stmt, 0);
1979 blck_size = gimple_call_arg (stmt, size_arg);
1981 if (TREE_CODE (blck_size) != INTEGER_CST)
1983 values->safe_push (gimple_alloc_histogram_value (cfun,
1984 HIST_TYPE_SINGLE_VALUE,
1985 stmt, blck_size));
1986 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1987 stmt, blck_size));
1989 if (TREE_CODE (blck_size) != INTEGER_CST)
1990 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1991 stmt, dest));
1994 /* Find values inside STMT for that we want to measure histograms and adds
1995 them to list VALUES. */
1997 static void
1998 gimple_values_to_profile (gimple stmt, histogram_values *values)
2000 gimple_divmod_values_to_profile (stmt, values);
2001 gimple_stringops_values_to_profile (stmt, values);
2002 gimple_indirect_call_to_profile (stmt, values);
2005 void
2006 gimple_find_values_to_profile (histogram_values *values)
2008 basic_block bb;
2009 gimple_stmt_iterator gsi;
2010 unsigned i;
2011 histogram_value hist = NULL;
2012 values->create (0);
2014 FOR_EACH_BB_FN (bb, cfun)
2015 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2016 gimple_values_to_profile (gsi_stmt (gsi), values);
2018 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_TIME_PROFILE, 0, 0));
2020 FOR_EACH_VEC_ELT (*values, i, hist)
2022 switch (hist->type)
2024 case HIST_TYPE_INTERVAL:
2025 hist->n_counters = hist->hdata.intvl.steps + 2;
2026 break;
2028 case HIST_TYPE_POW2:
2029 hist->n_counters = 2;
2030 break;
2032 case HIST_TYPE_SINGLE_VALUE:
2033 hist->n_counters = 3;
2034 break;
2036 case HIST_TYPE_CONST_DELTA:
2037 hist->n_counters = 4;
2038 break;
2040 case HIST_TYPE_INDIR_CALL:
2041 hist->n_counters = 3;
2042 break;
2044 case HIST_TYPE_TIME_PROFILE:
2045 hist->n_counters = 1;
2046 break;
2048 case HIST_TYPE_AVERAGE:
2049 hist->n_counters = 2;
2050 break;
2052 case HIST_TYPE_IOR:
2053 hist->n_counters = 1;
2054 break;
2056 case HIST_TYPE_INDIR_CALL_TOPN:
2057 hist->n_counters = GCOV_ICALL_TOPN_NCOUNTS;
2058 break;
2060 default:
2061 gcc_unreachable ();
2063 if (dump_file)
2065 fprintf (dump_file, "Stmt ");
2066 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
2067 dump_histogram_value (dump_file, hist);