1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2016 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
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
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/>. */
22 #include "coretypes.h"
31 #include "data-streamer.h"
32 #include "diagnostic.h"
33 #include "fold-const.h"
34 #include "tree-nested.h"
37 #include "value-prof.h"
40 #include "gimple-iterator.h"
42 #include "gimple-pretty-print.h"
46 #include "tree-chkp.h"
48 /* In this file value profile based optimizations are placed. Currently the
49 following optimizations are implemented (for more detailed descriptions
50 see comments at value_profile_transformations):
52 1) Division/modulo specialization. Provided that we can determine that the
53 operands of the division have some special properties, we may use it to
54 produce more effective code.
56 2) Indirect/virtual call specialization. If we can determine most
57 common function callee in indirect/virtual call. We can use this
58 information to improve code effectiveness (especially info for
61 3) Speculative prefetching. If we are able to determine that the difference
62 between addresses accessed by a memory reference is usually constant, we
63 may add the prefetch instructions.
64 FIXME: This transformation was removed together with RTL based value
68 Value profiling internals
69 ==========================
71 Every value profiling transformation starts with defining what values
72 to profile. There are different histogram types (see HIST_TYPE_* in
73 value-prof.h) and each transformation can request one or more histogram
74 types per GIMPLE statement. The function gimple_find_values_to_profile()
75 collects the values to profile in a vec, and adds the number of counters
76 required for the different histogram types.
78 For a -fprofile-generate run, the statements for which values should be
79 recorded, are instrumented in instrument_values(). The instrumentation
80 is done by helper functions that can be found in tree-profile.c, where
81 new types of histograms can be added if necessary.
83 After a -fprofile-use, the value profiling data is read back in by
84 compute_value_histograms() that translates the collected data to
85 histograms and attaches them to the profiled statements via
86 gimple_add_histogram_value(). Histograms are stored in a hash table
87 that is attached to every intrumented function, see VALUE_HISTOGRAMS
90 The value-profile transformations driver is the function
91 gimple_value_profile_transformations(). It traverses all statements in
92 the to-be-transformed function, and looks for statements with one or
93 more histograms attached to it. If a statement has histograms, the
94 transformation functions are called on the statement.
96 Limitations / FIXME / TODO:
97 * Only one histogram of each type can be associated with a statement.
98 * Some value profile transformations are done in builtins.c (?!)
99 * Updating of histograms needs some TLC.
100 * The value profiling code could be used to record analysis results
101 from non-profiling (e.g. VRP).
102 * Adding new profilers should be simplified, starting with a cleanup
103 of what-happens-where andwith making gimple_find_values_to_profile
104 and gimple_value_profile_transformations table-driven, perhaps...
107 static tree
gimple_divmod_fixed_value (gassign
*, tree
, int, gcov_type
,
109 static tree
gimple_mod_pow2 (gassign
*, int, gcov_type
, gcov_type
);
110 static tree
gimple_mod_subtract (gassign
*, int, int, int, gcov_type
,
111 gcov_type
, gcov_type
);
112 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*);
113 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator
*);
114 static bool gimple_mod_subtract_transform (gimple_stmt_iterator
*);
115 static bool gimple_stringops_transform (gimple_stmt_iterator
*);
116 static bool gimple_ic_transform (gimple_stmt_iterator
*);
118 /* Allocate histogram value. */
121 gimple_alloc_histogram_value (struct function
*fun ATTRIBUTE_UNUSED
,
122 enum hist_type type
, gimple
*stmt
, tree value
)
124 histogram_value hist
= (histogram_value
) xcalloc (1, sizeof (*hist
));
125 hist
->hvalue
.value
= value
;
126 hist
->hvalue
.stmt
= stmt
;
131 /* Hash value for histogram. */
134 histogram_hash (const void *x
)
136 return htab_hash_pointer (((const_histogram_value
)x
)->hvalue
.stmt
);
139 /* Return nonzero if statement for histogram_value X is Y. */
142 histogram_eq (const void *x
, const void *y
)
144 return ((const_histogram_value
) x
)->hvalue
.stmt
== (const gimple
*) y
;
147 /* Set histogram for STMT. */
150 set_histogram_value (struct function
*fun
, gimple
*stmt
, histogram_value hist
)
153 if (!hist
&& !VALUE_HISTOGRAMS (fun
))
155 if (!VALUE_HISTOGRAMS (fun
))
156 VALUE_HISTOGRAMS (fun
) = htab_create (1, histogram_hash
,
158 loc
= htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
159 htab_hash_pointer (stmt
),
160 hist
? INSERT
: NO_INSERT
);
164 htab_clear_slot (VALUE_HISTOGRAMS (fun
), loc
);
170 /* Get histogram list for STMT. */
173 gimple_histogram_value (struct function
*fun
, gimple
*stmt
)
175 if (!VALUE_HISTOGRAMS (fun
))
177 return (histogram_value
) htab_find_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
178 htab_hash_pointer (stmt
));
181 /* Add histogram for STMT. */
184 gimple_add_histogram_value (struct function
*fun
, gimple
*stmt
,
185 histogram_value hist
)
187 hist
->hvalue
.next
= gimple_histogram_value (fun
, stmt
);
188 set_histogram_value (fun
, stmt
, hist
);
192 /* Remove histogram HIST from STMT's histogram list. */
195 gimple_remove_histogram_value (struct function
*fun
, gimple
*stmt
,
196 histogram_value hist
)
198 histogram_value hist2
= gimple_histogram_value (fun
, stmt
);
201 set_histogram_value (fun
, stmt
, hist
->hvalue
.next
);
205 while (hist2
->hvalue
.next
!= hist
)
206 hist2
= hist2
->hvalue
.next
;
207 hist2
->hvalue
.next
= hist
->hvalue
.next
;
209 free (hist
->hvalue
.counters
);
211 memset (hist
, 0xab, sizeof (*hist
));
215 /* Lookup histogram of type TYPE in the STMT. */
218 gimple_histogram_value_of_type (struct function
*fun
, gimple
*stmt
,
221 histogram_value hist
;
222 for (hist
= gimple_histogram_value (fun
, stmt
); hist
;
223 hist
= hist
->hvalue
.next
)
224 if (hist
->type
== type
)
229 /* Dump information about HIST to DUMP_FILE. */
232 dump_histogram_value (FILE *dump_file
, histogram_value hist
)
236 case HIST_TYPE_INTERVAL
:
237 fprintf (dump_file
, "Interval counter range %d -- %d",
238 hist
->hdata
.intvl
.int_start
,
239 (hist
->hdata
.intvl
.int_start
240 + hist
->hdata
.intvl
.steps
- 1));
241 if (hist
->hvalue
.counters
)
244 fprintf (dump_file
, " [");
245 for (i
= 0; i
< hist
->hdata
.intvl
.steps
; i
++)
246 fprintf (dump_file
, " %d:%" PRId64
,
247 hist
->hdata
.intvl
.int_start
+ i
,
248 (int64_t) hist
->hvalue
.counters
[i
]);
249 fprintf (dump_file
, " ] outside range:%" PRId64
,
250 (int64_t) hist
->hvalue
.counters
[i
]);
252 fprintf (dump_file
, ".\n");
256 fprintf (dump_file
, "Pow2 counter ");
257 if (hist
->hvalue
.counters
)
259 fprintf (dump_file
, "pow2:%" PRId64
261 (int64_t) hist
->hvalue
.counters
[1],
262 (int64_t) hist
->hvalue
.counters
[0]);
264 fprintf (dump_file
, ".\n");
267 case HIST_TYPE_SINGLE_VALUE
:
268 fprintf (dump_file
, "Single value ");
269 if (hist
->hvalue
.counters
)
271 fprintf (dump_file
, "value:%" PRId64
274 (int64_t) hist
->hvalue
.counters
[0],
275 (int64_t) hist
->hvalue
.counters
[1],
276 (int64_t) hist
->hvalue
.counters
[2]);
278 fprintf (dump_file
, ".\n");
281 case HIST_TYPE_AVERAGE
:
282 fprintf (dump_file
, "Average value ");
283 if (hist
->hvalue
.counters
)
285 fprintf (dump_file
, "sum:%" PRId64
287 (int64_t) hist
->hvalue
.counters
[0],
288 (int64_t) hist
->hvalue
.counters
[1]);
290 fprintf (dump_file
, ".\n");
294 fprintf (dump_file
, "IOR value ");
295 if (hist
->hvalue
.counters
)
297 fprintf (dump_file
, "ior:%" PRId64
,
298 (int64_t) hist
->hvalue
.counters
[0]);
300 fprintf (dump_file
, ".\n");
303 case HIST_TYPE_INDIR_CALL
:
304 fprintf (dump_file
, "Indirect call ");
305 if (hist
->hvalue
.counters
)
307 fprintf (dump_file
, "value:%" PRId64
310 (int64_t) hist
->hvalue
.counters
[0],
311 (int64_t) hist
->hvalue
.counters
[1],
312 (int64_t) hist
->hvalue
.counters
[2]);
314 fprintf (dump_file
, ".\n");
316 case HIST_TYPE_TIME_PROFILE
:
317 fprintf (dump_file
, "Time profile ");
318 if (hist
->hvalue
.counters
)
320 fprintf (dump_file
, "time:%" PRId64
,
321 (int64_t) hist
->hvalue
.counters
[0]);
323 fprintf (dump_file
, ".\n");
325 case HIST_TYPE_INDIR_CALL_TOPN
:
326 fprintf (dump_file
, "Indirect call topn ");
327 if (hist
->hvalue
.counters
)
331 fprintf (dump_file
, "accu:%" PRId64
, hist
->hvalue
.counters
[0]);
332 for (i
= 1; i
< (GCOV_ICALL_TOPN_VAL
<< 2); i
+= 2)
334 fprintf (dump_file
, " target:%" PRId64
" value:%" PRId64
,
335 (int64_t) hist
->hvalue
.counters
[i
],
336 (int64_t) hist
->hvalue
.counters
[i
+1]);
339 fprintf (dump_file
, ".\n");
346 /* Dump information about HIST to DUMP_FILE. */
349 stream_out_histogram_value (struct output_block
*ob
, histogram_value hist
)
354 bp
= bitpack_create (ob
->main_stream
);
355 bp_pack_enum (&bp
, hist_type
, HIST_TYPE_MAX
, hist
->type
);
356 bp_pack_value (&bp
, hist
->hvalue
.next
!= NULL
, 1);
357 streamer_write_bitpack (&bp
);
360 case HIST_TYPE_INTERVAL
:
361 streamer_write_hwi (ob
, hist
->hdata
.intvl
.int_start
);
362 streamer_write_uhwi (ob
, hist
->hdata
.intvl
.steps
);
367 for (i
= 0; i
< hist
->n_counters
; i
++)
368 streamer_write_gcov_count (ob
, hist
->hvalue
.counters
[i
]);
369 if (hist
->hvalue
.next
)
370 stream_out_histogram_value (ob
, hist
->hvalue
.next
);
373 /* Dump information about HIST to DUMP_FILE. */
376 stream_in_histogram_value (struct lto_input_block
*ib
, gimple
*stmt
)
379 unsigned int ncounters
= 0;
382 histogram_value new_val
;
384 histogram_value
*next_p
= NULL
;
388 bp
= streamer_read_bitpack (ib
);
389 type
= bp_unpack_enum (&bp
, hist_type
, HIST_TYPE_MAX
);
390 next
= bp_unpack_value (&bp
, 1);
391 new_val
= gimple_alloc_histogram_value (cfun
, type
, stmt
, NULL
);
394 case HIST_TYPE_INTERVAL
:
395 new_val
->hdata
.intvl
.int_start
= streamer_read_hwi (ib
);
396 new_val
->hdata
.intvl
.steps
= streamer_read_uhwi (ib
);
397 ncounters
= new_val
->hdata
.intvl
.steps
+ 2;
401 case HIST_TYPE_AVERAGE
:
405 case HIST_TYPE_SINGLE_VALUE
:
406 case HIST_TYPE_INDIR_CALL
:
411 case HIST_TYPE_TIME_PROFILE
:
415 case HIST_TYPE_INDIR_CALL_TOPN
:
416 ncounters
= (GCOV_ICALL_TOPN_VAL
<< 2) + 1;
422 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * ncounters
);
423 new_val
->n_counters
= ncounters
;
424 for (i
= 0; i
< ncounters
; i
++)
425 new_val
->hvalue
.counters
[i
] = streamer_read_gcov_count (ib
);
427 gimple_add_histogram_value (cfun
, stmt
, new_val
);
430 next_p
= &new_val
->hvalue
.next
;
435 /* Dump all histograms attached to STMT to DUMP_FILE. */
438 dump_histograms_for_stmt (struct function
*fun
, FILE *dump_file
, gimple
*stmt
)
440 histogram_value hist
;
441 for (hist
= gimple_histogram_value (fun
, stmt
); hist
; hist
= hist
->hvalue
.next
)
442 dump_histogram_value (dump_file
, hist
);
445 /* Remove all histograms associated with STMT. */
448 gimple_remove_stmt_histograms (struct function
*fun
, gimple
*stmt
)
451 while ((val
= gimple_histogram_value (fun
, stmt
)) != NULL
)
452 gimple_remove_histogram_value (fun
, stmt
, val
);
455 /* Duplicate all histograms associates with OSTMT to STMT. */
458 gimple_duplicate_stmt_histograms (struct function
*fun
, gimple
*stmt
,
459 struct function
*ofun
, gimple
*ostmt
)
462 for (val
= gimple_histogram_value (ofun
, ostmt
); val
!= NULL
; val
= val
->hvalue
.next
)
464 histogram_value new_val
= gimple_alloc_histogram_value (fun
, val
->type
, NULL
, NULL
);
465 memcpy (new_val
, val
, sizeof (*val
));
466 new_val
->hvalue
.stmt
= stmt
;
467 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
468 memcpy (new_val
->hvalue
.counters
, val
->hvalue
.counters
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
469 gimple_add_histogram_value (fun
, stmt
, new_val
);
473 /* Move all histograms associated with OSTMT to STMT. */
476 gimple_move_stmt_histograms (struct function
*fun
, gimple
*stmt
, gimple
*ostmt
)
478 histogram_value val
= gimple_histogram_value (fun
, ostmt
);
481 /* The following three statements can't be reordered,
482 because histogram hashtab relies on stmt field value
483 for finding the exact slot. */
484 set_histogram_value (fun
, ostmt
, NULL
);
485 for (; val
!= NULL
; val
= val
->hvalue
.next
)
486 val
->hvalue
.stmt
= stmt
;
487 set_histogram_value (fun
, stmt
, val
);
491 static bool error_found
= false;
493 /* Helper function for verify_histograms. For each histogram reachable via htab
494 walk verify that it was reached via statement walk. */
497 visit_hist (void **slot
, void *data
)
499 hash_set
<histogram_value
> *visited
= (hash_set
<histogram_value
> *) data
;
500 histogram_value hist
= *(histogram_value
*) slot
;
502 if (!visited
->contains (hist
)
503 && hist
->type
!= HIST_TYPE_TIME_PROFILE
)
505 error ("dead histogram");
506 dump_histogram_value (stderr
, hist
);
507 debug_gimple_stmt (hist
->hvalue
.stmt
);
513 /* Verify sanity of the histograms. */
516 verify_histograms (void)
519 gimple_stmt_iterator gsi
;
520 histogram_value hist
;
523 hash_set
<histogram_value
> visited_hists
;
524 FOR_EACH_BB_FN (bb
, cfun
)
525 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
527 gimple
*stmt
= gsi_stmt (gsi
);
529 for (hist
= gimple_histogram_value (cfun
, stmt
); hist
;
530 hist
= hist
->hvalue
.next
)
532 if (hist
->hvalue
.stmt
!= stmt
)
534 error ("Histogram value statement does not correspond to "
535 "the statement it is associated with");
536 debug_gimple_stmt (stmt
);
537 dump_histogram_value (stderr
, hist
);
540 visited_hists
.add (hist
);
543 if (VALUE_HISTOGRAMS (cfun
))
544 htab_traverse (VALUE_HISTOGRAMS (cfun
), visit_hist
, &visited_hists
);
546 internal_error ("verify_histograms failed");
549 /* Helper function for verify_histograms. For each histogram reachable via htab
550 walk verify that it was reached via statement walk. */
553 free_hist (void **slot
, void *data ATTRIBUTE_UNUSED
)
555 histogram_value hist
= *(histogram_value
*) slot
;
556 free (hist
->hvalue
.counters
);
558 memset (hist
, 0xab, sizeof (*hist
));
564 free_histograms (struct function
*fn
)
566 if (VALUE_HISTOGRAMS (fn
))
568 htab_traverse (VALUE_HISTOGRAMS (fn
), free_hist
, NULL
);
569 htab_delete (VALUE_HISTOGRAMS (fn
));
570 VALUE_HISTOGRAMS (fn
) = NULL
;
574 /* The overall number of invocations of the counter should match
575 execution count of basic block. Report it as error rather than
576 internal error as it might mean that user has misused the profile
580 check_counter (gimple
*stmt
, const char * name
,
581 gcov_type
*count
, gcov_type
*all
, gcov_type bb_count
)
583 if (*all
!= bb_count
|| *count
> *all
)
586 locus
= (stmt
!= NULL
)
587 ? gimple_location (stmt
)
588 : DECL_SOURCE_LOCATION (current_function_decl
);
589 if (flag_profile_correction
)
591 if (dump_enabled_p ())
592 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
593 "correcting inconsistent value profile: %s "
594 "profiler overall count (%d) does not match BB "
595 "count (%d)\n", name
, (int)*all
, (int)bb_count
);
603 error_at (locus
, "corrupted value profile: %s "
604 "profile counter (%d out of %d) inconsistent with "
605 "basic-block count (%d)",
617 /* GIMPLE based transformations. */
620 gimple_value_profile_transformations (void)
623 gimple_stmt_iterator gsi
;
624 bool changed
= false;
626 /* Autofdo does its own transformations for indirect calls,
627 and otherwise does not support value profiling. */
628 if (flag_auto_profile
)
631 FOR_EACH_BB_FN (bb
, cfun
)
633 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
635 gimple
*stmt
= gsi_stmt (gsi
);
636 histogram_value th
= gimple_histogram_value (cfun
, stmt
);
642 fprintf (dump_file
, "Trying transformations on stmt ");
643 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
644 dump_histograms_for_stmt (cfun
, dump_file
, stmt
);
647 /* Transformations: */
648 /* The order of things in this conditional controls which
649 transformation is used when more than one is applicable. */
650 /* It is expected that any code added by the transformations
651 will be added before the current statement, and that the
652 current statement remain valid (although possibly
653 modified) upon return. */
654 if (gimple_mod_subtract_transform (&gsi
)
655 || gimple_divmod_fixed_value_transform (&gsi
)
656 || gimple_mod_pow2_value_transform (&gsi
)
657 || gimple_stringops_transform (&gsi
)
658 || gimple_ic_transform (&gsi
))
660 stmt
= gsi_stmt (gsi
);
662 /* Original statement may no longer be in the same block. */
663 if (bb
!= gimple_bb (stmt
))
665 bb
= gimple_bb (stmt
);
666 gsi
= gsi_for_stmt (stmt
);
680 /* Generate code for transformation 1 (with parent gimple assignment
681 STMT and probability of taking the optimal path PROB, which is
682 equivalent to COUNT/ALL within roundoff error). This generates the
683 result into a temp and returns the temp; it does not replace or
684 alter the original STMT. */
687 gimple_divmod_fixed_value (gassign
*stmt
, tree value
, int prob
,
688 gcov_type count
, gcov_type all
)
690 gassign
*stmt1
, *stmt2
;
692 tree tmp0
, tmp1
, tmp2
;
693 gimple
*bb1end
, *bb2end
, *bb3end
;
694 basic_block bb
, bb2
, bb3
, bb4
;
695 tree optype
, op1
, op2
;
696 edge e12
, e13
, e23
, e24
, e34
;
697 gimple_stmt_iterator gsi
;
699 gcc_assert (is_gimple_assign (stmt
)
700 && (gimple_assign_rhs_code (stmt
) == TRUNC_DIV_EXPR
701 || gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
));
703 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
704 op1
= gimple_assign_rhs1 (stmt
);
705 op2
= gimple_assign_rhs2 (stmt
);
707 bb
= gimple_bb (stmt
);
708 gsi
= gsi_for_stmt (stmt
);
710 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
711 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
712 stmt1
= gimple_build_assign (tmp0
, fold_convert (optype
, value
));
713 stmt2
= gimple_build_assign (tmp1
, op2
);
714 stmt3
= gimple_build_cond (NE_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
715 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
716 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
717 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
720 tmp2
= create_tmp_reg (optype
, "PROF");
721 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, tmp0
);
722 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
725 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, op2
);
726 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
730 /* Edge e23 connects bb2 to bb3, etc. */
731 e12
= split_block (bb
, bb1end
);
734 e23
= split_block (bb2
, bb2end
);
736 bb3
->count
= all
- count
;
737 e34
= split_block (bb3
, bb3end
);
741 e12
->flags
&= ~EDGE_FALLTHRU
;
742 e12
->flags
|= EDGE_FALSE_VALUE
;
743 e12
->probability
= prob
;
746 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
747 e13
->probability
= REG_BR_PROB_BASE
- prob
;
748 e13
->count
= all
- count
;
752 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
753 e24
->probability
= REG_BR_PROB_BASE
;
756 e34
->probability
= REG_BR_PROB_BASE
;
757 e34
->count
= all
- count
;
762 /* Do transform 1) on INSN if applicable. */
765 gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*si
)
767 histogram_value histogram
;
769 gcov_type val
, count
, all
;
770 tree result
, value
, tree_val
;
774 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
778 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt
))))
781 code
= gimple_assign_rhs_code (stmt
);
783 if (code
!= TRUNC_DIV_EXPR
&& code
!= TRUNC_MOD_EXPR
)
786 histogram
= gimple_histogram_value_of_type (cfun
, stmt
,
787 HIST_TYPE_SINGLE_VALUE
);
791 value
= histogram
->hvalue
.value
;
792 val
= histogram
->hvalue
.counters
[0];
793 count
= histogram
->hvalue
.counters
[1];
794 all
= histogram
->hvalue
.counters
[2];
795 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
797 /* We require that count is at least half of all; this means
798 that for the transformation to fire the value must be constant
799 at least 50% of time (and 75% gives the guarantee of usage). */
800 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
802 || optimize_bb_for_size_p (gimple_bb (stmt
)))
805 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
808 /* Compute probability of taking the optimal path. */
810 prob
= GCOV_COMPUTE_SCALE (count
, all
);
814 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
815 tree_val
= build_int_cst (get_gcov_type (), val
);
819 a
[0] = (unsigned HOST_WIDE_INT
) val
;
820 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
822 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
823 TYPE_PRECISION (get_gcov_type ()), false));
825 result
= gimple_divmod_fixed_value (stmt
, tree_val
, prob
, count
, all
);
829 fprintf (dump_file
, "Div/mod by constant ");
830 print_generic_expr (dump_file
, value
, TDF_SLIM
);
831 fprintf (dump_file
, "=");
832 print_generic_expr (dump_file
, tree_val
, TDF_SLIM
);
833 fprintf (dump_file
, " transformation on insn ");
834 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
837 gimple_assign_set_rhs_from_tree (si
, result
);
838 update_stmt (gsi_stmt (*si
));
843 /* Generate code for transformation 2 (with parent gimple assign STMT and
844 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
845 within roundoff error). This generates the result into a temp and returns
846 the temp; it does not replace or alter the original STMT. */
849 gimple_mod_pow2 (gassign
*stmt
, int prob
, gcov_type count
, gcov_type all
)
851 gassign
*stmt1
, *stmt2
, *stmt3
;
854 gimple
*bb1end
, *bb2end
, *bb3end
;
855 basic_block bb
, bb2
, bb3
, bb4
;
856 tree optype
, op1
, op2
;
857 edge e12
, e13
, e23
, e24
, e34
;
858 gimple_stmt_iterator gsi
;
861 gcc_assert (is_gimple_assign (stmt
)
862 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
864 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
865 op1
= gimple_assign_rhs1 (stmt
);
866 op2
= gimple_assign_rhs2 (stmt
);
868 bb
= gimple_bb (stmt
);
869 gsi
= gsi_for_stmt (stmt
);
871 result
= create_tmp_reg (optype
, "PROF");
872 tmp2
= make_temp_ssa_name (optype
, NULL
, "PROF");
873 tmp3
= make_temp_ssa_name (optype
, NULL
, "PROF");
874 stmt2
= gimple_build_assign (tmp2
, PLUS_EXPR
, op2
,
875 build_int_cst (optype
, -1));
876 stmt3
= gimple_build_assign (tmp3
, BIT_AND_EXPR
, tmp2
, op2
);
877 stmt4
= gimple_build_cond (NE_EXPR
, tmp3
, build_int_cst (optype
, 0),
878 NULL_TREE
, NULL_TREE
);
879 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
880 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
881 gsi_insert_before (&gsi
, stmt4
, GSI_SAME_STMT
);
884 /* tmp2 == op2-1 inherited from previous block. */
885 stmt1
= gimple_build_assign (result
, BIT_AND_EXPR
, op1
, tmp2
);
886 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
889 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
891 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
895 /* Edge e23 connects bb2 to bb3, etc. */
896 e12
= split_block (bb
, bb1end
);
899 e23
= split_block (bb2
, bb2end
);
901 bb3
->count
= all
- count
;
902 e34
= split_block (bb3
, bb3end
);
906 e12
->flags
&= ~EDGE_FALLTHRU
;
907 e12
->flags
|= EDGE_FALSE_VALUE
;
908 e12
->probability
= prob
;
911 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
912 e13
->probability
= REG_BR_PROB_BASE
- prob
;
913 e13
->count
= all
- count
;
917 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
918 e24
->probability
= REG_BR_PROB_BASE
;
921 e34
->probability
= REG_BR_PROB_BASE
;
922 e34
->count
= all
- count
;
927 /* Do transform 2) on INSN if applicable. */
930 gimple_mod_pow2_value_transform (gimple_stmt_iterator
*si
)
932 histogram_value histogram
;
934 gcov_type count
, wrong_values
, all
;
935 tree lhs_type
, result
, value
;
939 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
943 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
944 if (!INTEGRAL_TYPE_P (lhs_type
))
947 code
= gimple_assign_rhs_code (stmt
);
949 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
952 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_POW2
);
956 value
= histogram
->hvalue
.value
;
957 wrong_values
= histogram
->hvalue
.counters
[0];
958 count
= histogram
->hvalue
.counters
[1];
960 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
962 /* We require that we hit a power of 2 at least half of all evaluations. */
963 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
964 || count
< wrong_values
965 || optimize_bb_for_size_p (gimple_bb (stmt
)))
970 fprintf (dump_file
, "Mod power of 2 transformation on insn ");
971 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
974 /* Compute probability of taking the optimal path. */
975 all
= count
+ wrong_values
;
977 if (check_counter (stmt
, "pow2", &count
, &all
, gimple_bb (stmt
)->count
))
981 prob
= GCOV_COMPUTE_SCALE (count
, all
);
985 result
= gimple_mod_pow2 (stmt
, prob
, count
, all
);
987 gimple_assign_set_rhs_from_tree (si
, result
);
988 update_stmt (gsi_stmt (*si
));
993 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
994 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
995 supported and this is built into this interface. The probabilities of taking
996 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
997 COUNT2/ALL respectively within roundoff error). This generates the
998 result into a temp and returns the temp; it does not replace or alter
999 the original STMT. */
1000 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1003 gimple_mod_subtract (gassign
*stmt
, int prob1
, int prob2
, int ncounts
,
1004 gcov_type count1
, gcov_type count2
, gcov_type all
)
1010 gimple
*bb1end
, *bb2end
= NULL
, *bb3end
;
1011 basic_block bb
, bb2
, bb3
, bb4
;
1012 tree optype
, op1
, op2
;
1013 edge e12
, e23
= 0, e24
, e34
, e14
;
1014 gimple_stmt_iterator gsi
;
1017 gcc_assert (is_gimple_assign (stmt
)
1018 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
1020 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
1021 op1
= gimple_assign_rhs1 (stmt
);
1022 op2
= gimple_assign_rhs2 (stmt
);
1024 bb
= gimple_bb (stmt
);
1025 gsi
= gsi_for_stmt (stmt
);
1027 result
= create_tmp_reg (optype
, "PROF");
1028 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1029 stmt1
= gimple_build_assign (result
, op1
);
1030 stmt2
= gimple_build_assign (tmp1
, op2
);
1031 stmt3
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1032 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1033 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1034 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
1037 if (ncounts
) /* Assumed to be 0 or 1 */
1039 stmt1
= gimple_build_assign (result
, MINUS_EXPR
, result
, tmp1
);
1040 stmt2
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1041 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1042 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1046 /* Fallback case. */
1047 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
1049 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1053 /* Edge e23 connects bb2 to bb3, etc. */
1054 /* However block 3 is optional; if it is not there, references
1055 to 3 really refer to block 2. */
1056 e12
= split_block (bb
, bb1end
);
1058 bb2
->count
= all
- count1
;
1060 if (ncounts
) /* Assumed to be 0 or 1. */
1062 e23
= split_block (bb2
, bb2end
);
1064 bb3
->count
= all
- count1
- count2
;
1067 e34
= split_block (ncounts
? bb3
: bb2
, bb3end
);
1071 e12
->flags
&= ~EDGE_FALLTHRU
;
1072 e12
->flags
|= EDGE_FALSE_VALUE
;
1073 e12
->probability
= REG_BR_PROB_BASE
- prob1
;
1074 e12
->count
= all
- count1
;
1076 e14
= make_edge (bb
, bb4
, EDGE_TRUE_VALUE
);
1077 e14
->probability
= prob1
;
1078 e14
->count
= count1
;
1080 if (ncounts
) /* Assumed to be 0 or 1. */
1082 e23
->flags
&= ~EDGE_FALLTHRU
;
1083 e23
->flags
|= EDGE_FALSE_VALUE
;
1084 e23
->count
= all
- count1
- count2
;
1085 e23
->probability
= REG_BR_PROB_BASE
- prob2
;
1087 e24
= make_edge (bb2
, bb4
, EDGE_TRUE_VALUE
);
1088 e24
->probability
= prob2
;
1089 e24
->count
= count2
;
1092 e34
->probability
= REG_BR_PROB_BASE
;
1093 e34
->count
= all
- count1
- count2
;
1098 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1101 gimple_mod_subtract_transform (gimple_stmt_iterator
*si
)
1103 histogram_value histogram
;
1104 enum tree_code code
;
1105 gcov_type count
, wrong_values
, all
;
1106 tree lhs_type
, result
;
1107 gcov_type prob1
, prob2
;
1108 unsigned int i
, steps
;
1109 gcov_type count1
, count2
;
1111 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
1115 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
1116 if (!INTEGRAL_TYPE_P (lhs_type
))
1119 code
= gimple_assign_rhs_code (stmt
);
1121 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
1124 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INTERVAL
);
1130 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1131 all
+= histogram
->hvalue
.counters
[i
];
1133 wrong_values
+= histogram
->hvalue
.counters
[i
];
1134 wrong_values
+= histogram
->hvalue
.counters
[i
+1];
1135 steps
= histogram
->hdata
.intvl
.steps
;
1136 all
+= wrong_values
;
1137 count1
= histogram
->hvalue
.counters
[0];
1138 count2
= histogram
->hvalue
.counters
[1];
1140 /* Compute probability of taking the optimal path. */
1141 if (check_counter (stmt
, "interval", &count1
, &all
, gimple_bb (stmt
)->count
))
1143 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1147 if (flag_profile_correction
&& count1
+ count2
> all
)
1148 all
= count1
+ count2
;
1150 gcc_assert (count1
+ count2
<= all
);
1152 /* We require that we use just subtractions in at least 50% of all
1155 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1157 count
+= histogram
->hvalue
.counters
[i
];
1158 if (count
* 2 >= all
)
1162 || optimize_bb_for_size_p (gimple_bb (stmt
)))
1165 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1168 fprintf (dump_file
, "Mod subtract transformation on insn ");
1169 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1172 /* Compute probability of taking the optimal path(s). */
1175 prob1
= GCOV_COMPUTE_SCALE (count1
, all
);
1176 prob2
= GCOV_COMPUTE_SCALE (count2
, all
);
1183 /* In practice, "steps" is always 2. This interface reflects this,
1184 and will need to be changed if "steps" can change. */
1185 result
= gimple_mod_subtract (stmt
, prob1
, prob2
, i
, count1
, count2
, all
);
1187 gimple_assign_set_rhs_from_tree (si
, result
);
1188 update_stmt (gsi_stmt (*si
));
1193 typedef int_hash
<unsigned int, 0, UINT_MAX
> profile_id_hash
;
1195 static hash_map
<profile_id_hash
, cgraph_node
*> *cgraph_node_map
= 0;
1197 /* Returns true if node graph is initialized. This
1198 is used to test if profile_id has been created
1199 for cgraph_nodes. */
1202 coverage_node_map_initialized_p (void)
1204 return cgraph_node_map
!= 0;
1207 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1208 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1209 that the PROFILE_IDs was already assigned. */
1212 init_node_map (bool local
)
1214 struct cgraph_node
*n
;
1215 cgraph_node_map
= new hash_map
<profile_id_hash
, cgraph_node
*>;
1217 FOR_EACH_DEFINED_FUNCTION (n
)
1218 if (n
->has_gimple_body_p ())
1223 n
->profile_id
= coverage_compute_profile_id (n
);
1224 while ((val
= cgraph_node_map
->get (n
->profile_id
))
1228 fprintf (dump_file
, "Local profile-id %i conflict"
1229 " with nodes %s/%i %s/%i\n",
1235 n
->profile_id
= (n
->profile_id
+ 1) & 0x7fffffff;
1238 else if (!n
->profile_id
)
1242 "Node %s/%i has no profile-id"
1243 " (profile feedback missing?)\n",
1248 else if ((val
= cgraph_node_map
->get (n
->profile_id
)))
1252 "Node %s/%i has IP profile-id %i conflict. "
1260 cgraph_node_map
->put (n
->profile_id
, n
);
1264 /* Delete the CGRAPH_NODE_MAP. */
1269 delete cgraph_node_map
;
1272 /* Return cgraph node for function with pid */
1275 find_func_by_profile_id (int profile_id
)
1277 cgraph_node
**val
= cgraph_node_map
->get (profile_id
);
1284 /* Perform sanity check on the indirect call target. Due to race conditions,
1285 false function target may be attributed to an indirect call site. If the
1286 call expression type mismatches with the target function's type, expand_call
1287 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1288 Returns true if TARGET is considered ok for call CALL_STMT. */
1291 check_ic_target (gcall
*call_stmt
, struct cgraph_node
*target
)
1294 if (gimple_check_call_matching_types (call_stmt
, target
->decl
, true))
1297 locus
= gimple_location (call_stmt
);
1298 if (dump_enabled_p ())
1299 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
1300 "Skipping target %s with mismatching types for icall\n",
1305 /* Do transformation
1307 if (actual_callee_address == address_of_most_common_function/method)
1314 gimple_ic (gcall
*icall_stmt
, struct cgraph_node
*direct_call
,
1315 int prob
, gcov_type count
, gcov_type all
)
1320 gcall
*iretbnd_stmt
= NULL
;
1321 tree tmp0
, tmp1
, tmp
;
1322 basic_block cond_bb
, dcall_bb
, icall_bb
, join_bb
= NULL
;
1323 tree optype
= build_pointer_type (void_type_node
);
1324 edge e_cd
, e_ci
, e_di
, e_dj
= NULL
, e_ij
;
1325 gimple_stmt_iterator gsi
;
1329 gimple_stmt_iterator psi
;
1331 cond_bb
= gimple_bb (icall_stmt
);
1332 gsi
= gsi_for_stmt (icall_stmt
);
1334 if (gimple_call_with_bounds_p (icall_stmt
) && gimple_call_lhs (icall_stmt
))
1335 iretbnd_stmt
= chkp_retbnd_call_by_val (gimple_call_lhs (icall_stmt
));
1337 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1338 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1339 tmp
= unshare_expr (gimple_call_fn (icall_stmt
));
1340 load_stmt
= gimple_build_assign (tmp0
, tmp
);
1341 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1343 tmp
= fold_convert (optype
, build_addr (direct_call
->decl
));
1344 load_stmt
= gimple_build_assign (tmp1
, tmp
);
1345 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1347 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1348 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1350 if (TREE_CODE (gimple_vdef (icall_stmt
)) == SSA_NAME
)
1352 unlink_stmt_vdef (icall_stmt
);
1353 release_ssa_name (gimple_vdef (icall_stmt
));
1355 gimple_set_vdef (icall_stmt
, NULL_TREE
);
1356 gimple_set_vuse (icall_stmt
, NULL_TREE
);
1357 update_stmt (icall_stmt
);
1358 dcall_stmt
= as_a
<gcall
*> (gimple_copy (icall_stmt
));
1359 gimple_call_set_fndecl (dcall_stmt
, direct_call
->decl
);
1360 dflags
= flags_from_decl_or_type (direct_call
->decl
);
1361 if ((dflags
& ECF_NORETURN
) != 0)
1362 gimple_call_set_lhs (dcall_stmt
, NULL_TREE
);
1363 gsi_insert_before (&gsi
, dcall_stmt
, GSI_SAME_STMT
);
1366 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1367 e_cd
= split_block (cond_bb
, cond_stmt
);
1368 dcall_bb
= e_cd
->dest
;
1369 dcall_bb
->count
= count
;
1371 e_di
= split_block (dcall_bb
, dcall_stmt
);
1372 icall_bb
= e_di
->dest
;
1373 icall_bb
->count
= all
- count
;
1375 /* Do not disturb existing EH edges from the indirect call. */
1376 if (!stmt_ends_bb_p (icall_stmt
))
1377 e_ij
= split_block (icall_bb
, icall_stmt
);
1380 e_ij
= find_fallthru_edge (icall_bb
->succs
);
1381 /* The indirect call might be noreturn. */
1384 e_ij
->probability
= REG_BR_PROB_BASE
;
1385 e_ij
->count
= all
- count
;
1386 e_ij
= single_pred_edge (split_edge (e_ij
));
1391 join_bb
= e_ij
->dest
;
1392 join_bb
->count
= all
;
1395 e_cd
->flags
= (e_cd
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1396 e_cd
->probability
= prob
;
1397 e_cd
->count
= count
;
1399 e_ci
= make_edge (cond_bb
, icall_bb
, EDGE_FALSE_VALUE
);
1400 e_ci
->probability
= REG_BR_PROB_BASE
- prob
;
1401 e_ci
->count
= all
- count
;
1407 if ((dflags
& ECF_NORETURN
) != 0)
1411 e_dj
= make_edge (dcall_bb
, join_bb
, EDGE_FALLTHRU
);
1412 e_dj
->probability
= REG_BR_PROB_BASE
;
1413 e_dj
->count
= count
;
1415 e_ij
->count
= all
- count
;
1417 e_ij
->probability
= REG_BR_PROB_BASE
;
1420 /* Insert PHI node for the call result if necessary. */
1421 if (gimple_call_lhs (icall_stmt
)
1422 && TREE_CODE (gimple_call_lhs (icall_stmt
)) == SSA_NAME
1423 && (dflags
& ECF_NORETURN
) == 0)
1425 tree result
= gimple_call_lhs (icall_stmt
);
1426 gphi
*phi
= create_phi_node (result
, join_bb
);
1427 gimple_call_set_lhs (icall_stmt
,
1428 duplicate_ssa_name (result
, icall_stmt
));
1429 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1430 gimple_call_set_lhs (dcall_stmt
,
1431 duplicate_ssa_name (result
, dcall_stmt
));
1432 add_phi_arg (phi
, gimple_call_lhs (dcall_stmt
), e_dj
, UNKNOWN_LOCATION
);
1434 /* If indirect call has following BUILT_IN_CHKP_BNDRET
1435 call then we need to make it's copy for the direct
1439 if (gimple_call_lhs (iretbnd_stmt
))
1443 if (TREE_CODE (gimple_vdef (iretbnd_stmt
)) == SSA_NAME
)
1445 unlink_stmt_vdef (iretbnd_stmt
);
1446 release_ssa_name (gimple_vdef (iretbnd_stmt
));
1448 gimple_set_vdef (iretbnd_stmt
, NULL_TREE
);
1449 gimple_set_vuse (iretbnd_stmt
, NULL_TREE
);
1450 update_stmt (iretbnd_stmt
);
1452 result
= gimple_call_lhs (iretbnd_stmt
);
1453 phi
= create_phi_node (result
, join_bb
);
1455 copy
= gimple_copy (iretbnd_stmt
);
1456 gimple_call_set_arg (copy
, 0,
1457 gimple_call_lhs (dcall_stmt
));
1458 gimple_call_set_lhs (copy
, duplicate_ssa_name (result
, copy
));
1459 gsi_insert_on_edge (e_dj
, copy
);
1460 add_phi_arg (phi
, gimple_call_lhs (copy
),
1461 e_dj
, UNKNOWN_LOCATION
);
1463 gimple_call_set_arg (iretbnd_stmt
, 0,
1464 gimple_call_lhs (icall_stmt
));
1465 gimple_call_set_lhs (iretbnd_stmt
,
1466 duplicate_ssa_name (result
, iretbnd_stmt
));
1467 psi
= gsi_for_stmt (iretbnd_stmt
);
1468 gsi_remove (&psi
, false);
1469 gsi_insert_on_edge (e_ij
, iretbnd_stmt
);
1470 add_phi_arg (phi
, gimple_call_lhs (iretbnd_stmt
),
1471 e_ij
, UNKNOWN_LOCATION
);
1473 gsi_commit_one_edge_insert (e_dj
, NULL
);
1474 gsi_commit_one_edge_insert (e_ij
, NULL
);
1478 psi
= gsi_for_stmt (iretbnd_stmt
);
1479 gsi_remove (&psi
, true);
1484 /* Build an EH edge for the direct call if necessary. */
1485 lp_nr
= lookup_stmt_eh_lp (icall_stmt
);
1486 if (lp_nr
> 0 && stmt_could_throw_p (dcall_stmt
))
1488 add_stmt_to_eh_lp (dcall_stmt
, lp_nr
);
1491 FOR_EACH_EDGE (e_eh
, ei
, icall_bb
->succs
)
1492 if (e_eh
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
1494 e
= make_edge (dcall_bb
, e_eh
->dest
, e_eh
->flags
);
1495 for (gphi_iterator psi
= gsi_start_phis (e_eh
->dest
);
1496 !gsi_end_p (psi
); gsi_next (&psi
))
1498 gphi
*phi
= psi
.phi ();
1499 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi
, e
),
1500 PHI_ARG_DEF_FROM_EDGE (phi
, e_eh
));
1503 if (!stmt_could_throw_p (dcall_stmt
))
1504 gimple_purge_dead_eh_edges (dcall_bb
);
1509 For every checked indirect/virtual call determine if most common pid of
1510 function/class method has probability more than 50%. If yes modify code of
1515 gimple_ic_transform (gimple_stmt_iterator
*gsi
)
1518 histogram_value histogram
;
1519 gcov_type val
, count
, all
, bb_all
;
1520 struct cgraph_node
*direct_call
;
1522 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1526 if (gimple_call_fndecl (stmt
) != NULL_TREE
)
1529 if (gimple_call_internal_p (stmt
))
1532 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INDIR_CALL
);
1536 val
= histogram
->hvalue
.counters
[0];
1537 count
= histogram
->hvalue
.counters
[1];
1538 all
= histogram
->hvalue
.counters
[2];
1540 bb_all
= gimple_bb (stmt
)->count
;
1541 /* The order of CHECK_COUNTER calls is important -
1542 since check_counter can correct the third parameter
1543 and we want to make count <= all <= bb_all. */
1544 if ( check_counter (stmt
, "ic", &all
, &bb_all
, bb_all
)
1545 || check_counter (stmt
, "ic", &count
, &all
, all
))
1547 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1551 if (4 * count
<= 3 * all
)
1554 direct_call
= find_func_by_profile_id ((int)val
);
1556 if (direct_call
== NULL
)
1562 fprintf (dump_file
, "Indirect call -> direct call from other module");
1563 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1564 fprintf (dump_file
, "=> %i (will resolve only with LTO)\n", (int)val
);
1570 if (!check_ic_target (stmt
, direct_call
))
1574 fprintf (dump_file
, "Indirect call -> direct call ");
1575 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1576 fprintf (dump_file
, "=> ");
1577 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1578 fprintf (dump_file
, " transformation skipped because of type mismatch");
1579 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1581 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1587 fprintf (dump_file
, "Indirect call -> direct call ");
1588 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1589 fprintf (dump_file
, "=> ");
1590 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1591 fprintf (dump_file
, " transformation on insn postponned to ipa-profile");
1592 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1593 fprintf (dump_file
, "hist->count %" PRId64
1594 " hist->all %" PRId64
"\n", count
, all
);
1600 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1601 set to the argument index for the size of the string operation. */
1604 interesting_stringop_to_profile_p (gcall
*call
, int *size_arg
)
1606 enum built_in_function fcode
;
1608 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (call
));
1609 if (fcode
!= BUILT_IN_MEMCPY
&& fcode
!= BUILT_IN_MEMPCPY
1610 && fcode
!= BUILT_IN_MEMSET
&& fcode
!= BUILT_IN_BZERO
)
1615 case BUILT_IN_MEMCPY
:
1616 case BUILT_IN_MEMPCPY
:
1618 return validate_gimple_arglist (call
, POINTER_TYPE
, POINTER_TYPE
,
1619 INTEGER_TYPE
, VOID_TYPE
);
1620 case BUILT_IN_MEMSET
:
1622 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1623 INTEGER_TYPE
, VOID_TYPE
);
1624 case BUILT_IN_BZERO
:
1626 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1633 /* Convert stringop (..., vcall_size)
1635 if (vcall_size == icall_size)
1636 stringop (..., icall_size);
1638 stringop (..., vcall_size);
1639 assuming we'll propagate a true constant into ICALL_SIZE later. */
1642 gimple_stringop_fixed_value (gcall
*vcall_stmt
, tree icall_size
, int prob
,
1643 gcov_type count
, gcov_type all
)
1648 tree tmp0
, tmp1
, vcall_size
, optype
;
1649 basic_block cond_bb
, icall_bb
, vcall_bb
, join_bb
;
1650 edge e_ci
, e_cv
, e_iv
, e_ij
, e_vj
;
1651 gimple_stmt_iterator gsi
;
1654 if (!interesting_stringop_to_profile_p (vcall_stmt
, &size_arg
))
1657 cond_bb
= gimple_bb (vcall_stmt
);
1658 gsi
= gsi_for_stmt (vcall_stmt
);
1660 vcall_size
= gimple_call_arg (vcall_stmt
, size_arg
);
1661 optype
= TREE_TYPE (vcall_size
);
1663 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1664 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1665 tmp_stmt
= gimple_build_assign (tmp0
, fold_convert (optype
, icall_size
));
1666 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1668 tmp_stmt
= gimple_build_assign (tmp1
, vcall_size
);
1669 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1671 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1672 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1674 if (TREE_CODE (gimple_vdef (vcall_stmt
)) == SSA_NAME
)
1676 unlink_stmt_vdef (vcall_stmt
);
1677 release_ssa_name (gimple_vdef (vcall_stmt
));
1679 gimple_set_vdef (vcall_stmt
, NULL
);
1680 gimple_set_vuse (vcall_stmt
, NULL
);
1681 update_stmt (vcall_stmt
);
1682 icall_stmt
= as_a
<gcall
*> (gimple_copy (vcall_stmt
));
1683 gimple_call_set_arg (icall_stmt
, size_arg
,
1684 fold_convert (optype
, icall_size
));
1685 gsi_insert_before (&gsi
, icall_stmt
, GSI_SAME_STMT
);
1688 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1689 e_ci
= split_block (cond_bb
, cond_stmt
);
1690 icall_bb
= e_ci
->dest
;
1691 icall_bb
->count
= count
;
1693 e_iv
= split_block (icall_bb
, icall_stmt
);
1694 vcall_bb
= e_iv
->dest
;
1695 vcall_bb
->count
= all
- count
;
1697 e_vj
= split_block (vcall_bb
, vcall_stmt
);
1698 join_bb
= e_vj
->dest
;
1699 join_bb
->count
= all
;
1701 e_ci
->flags
= (e_ci
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1702 e_ci
->probability
= prob
;
1703 e_ci
->count
= count
;
1705 e_cv
= make_edge (cond_bb
, vcall_bb
, EDGE_FALSE_VALUE
);
1706 e_cv
->probability
= REG_BR_PROB_BASE
- prob
;
1707 e_cv
->count
= all
- count
;
1711 e_ij
= make_edge (icall_bb
, join_bb
, EDGE_FALLTHRU
);
1712 e_ij
->probability
= REG_BR_PROB_BASE
;
1713 e_ij
->count
= count
;
1715 e_vj
->probability
= REG_BR_PROB_BASE
;
1716 e_vj
->count
= all
- count
;
1718 /* Insert PHI node for the call result if necessary. */
1719 if (gimple_call_lhs (vcall_stmt
)
1720 && TREE_CODE (gimple_call_lhs (vcall_stmt
)) == SSA_NAME
)
1722 tree result
= gimple_call_lhs (vcall_stmt
);
1723 gphi
*phi
= create_phi_node (result
, join_bb
);
1724 gimple_call_set_lhs (vcall_stmt
,
1725 duplicate_ssa_name (result
, vcall_stmt
));
1726 add_phi_arg (phi
, gimple_call_lhs (vcall_stmt
), e_vj
, UNKNOWN_LOCATION
);
1727 gimple_call_set_lhs (icall_stmt
,
1728 duplicate_ssa_name (result
, icall_stmt
));
1729 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1732 /* Because these are all string op builtins, they're all nothrow. */
1733 gcc_assert (!stmt_could_throw_p (vcall_stmt
));
1734 gcc_assert (!stmt_could_throw_p (icall_stmt
));
1737 /* Find values inside STMT for that we want to measure histograms for
1738 division/modulo optimization. */
1741 gimple_stringops_transform (gimple_stmt_iterator
*gsi
)
1745 enum built_in_function fcode
;
1746 histogram_value histogram
;
1747 gcov_type count
, all
, val
;
1749 unsigned int dest_align
, src_align
;
1754 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1758 if (!gimple_call_builtin_p (gsi_stmt (*gsi
), BUILT_IN_NORMAL
))
1761 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
1764 blck_size
= gimple_call_arg (stmt
, size_arg
);
1765 if (TREE_CODE (blck_size
) == INTEGER_CST
)
1768 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_SINGLE_VALUE
);
1772 val
= histogram
->hvalue
.counters
[0];
1773 count
= histogram
->hvalue
.counters
[1];
1774 all
= histogram
->hvalue
.counters
[2];
1775 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1777 /* We require that count is at least half of all; this means
1778 that for the transformation to fire the value must be constant
1779 at least 80% of time. */
1780 if ((6 * count
/ 5) < all
|| optimize_bb_for_size_p (gimple_bb (stmt
)))
1782 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
1785 prob
= GCOV_COMPUTE_SCALE (count
, all
);
1789 dest
= gimple_call_arg (stmt
, 0);
1790 dest_align
= get_pointer_alignment (dest
);
1791 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (stmt
));
1794 case BUILT_IN_MEMCPY
:
1795 case BUILT_IN_MEMPCPY
:
1796 src
= gimple_call_arg (stmt
, 1);
1797 src_align
= get_pointer_alignment (src
);
1798 if (!can_move_by_pieces (val
, MIN (dest_align
, src_align
)))
1801 case BUILT_IN_MEMSET
:
1802 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1803 gimple_call_arg (stmt
, 1),
1807 case BUILT_IN_BZERO
:
1808 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1817 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
1818 tree_val
= build_int_cst (get_gcov_type (), val
);
1822 a
[0] = (unsigned HOST_WIDE_INT
) val
;
1823 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
1825 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
1826 TYPE_PRECISION (get_gcov_type ()), false));
1831 fprintf (dump_file
, "Single value %i stringop transformation on ",
1833 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1836 gimple_stringop_fixed_value (stmt
, tree_val
, prob
, count
, all
);
1842 stringop_block_profile (gimple
*stmt
, unsigned int *expected_align
,
1843 HOST_WIDE_INT
*expected_size
)
1845 histogram_value histogram
;
1846 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_AVERAGE
);
1849 *expected_size
= -1;
1850 else if (!histogram
->hvalue
.counters
[1])
1852 *expected_size
= -1;
1853 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1858 size
= ((histogram
->hvalue
.counters
[0]
1859 + histogram
->hvalue
.counters
[1] / 2)
1860 / histogram
->hvalue
.counters
[1]);
1861 /* Even if we can hold bigger value in SIZE, INT_MAX
1862 is safe "infinity" for code generation strategies. */
1865 *expected_size
= size
;
1866 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1869 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_IOR
);
1872 *expected_align
= 0;
1873 else if (!histogram
->hvalue
.counters
[0])
1875 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1876 *expected_align
= 0;
1881 unsigned int alignment
;
1883 count
= histogram
->hvalue
.counters
[0];
1885 while (!(count
& alignment
)
1886 && (alignment
<= UINT_MAX
/ 2 / BITS_PER_UNIT
))
1888 *expected_align
= alignment
* BITS_PER_UNIT
;
1889 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1894 /* Find values inside STMT for that we want to measure histograms for
1895 division/modulo optimization. */
1898 gimple_divmod_values_to_profile (gimple
*stmt
, histogram_values
*values
)
1900 tree lhs
, divisor
, op0
, type
;
1901 histogram_value hist
;
1903 if (gimple_code (stmt
) != GIMPLE_ASSIGN
)
1906 lhs
= gimple_assign_lhs (stmt
);
1907 type
= TREE_TYPE (lhs
);
1908 if (!INTEGRAL_TYPE_P (type
))
1911 switch (gimple_assign_rhs_code (stmt
))
1913 case TRUNC_DIV_EXPR
:
1914 case TRUNC_MOD_EXPR
:
1915 divisor
= gimple_assign_rhs2 (stmt
);
1916 op0
= gimple_assign_rhs1 (stmt
);
1918 values
->reserve (3);
1920 if (TREE_CODE (divisor
) == SSA_NAME
)
1921 /* Check for the case where the divisor is the same value most
1923 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1924 HIST_TYPE_SINGLE_VALUE
,
1927 /* For mod, check whether it is not often a noop (or replaceable by
1928 a few subtractions). */
1929 if (gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
1930 && TYPE_UNSIGNED (type
)
1931 && TREE_CODE (divisor
) == SSA_NAME
)
1934 /* Check for a special case where the divisor is power of 2. */
1935 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1939 val
= build2 (TRUNC_DIV_EXPR
, type
, op0
, divisor
);
1940 hist
= gimple_alloc_histogram_value (cfun
, HIST_TYPE_INTERVAL
,
1942 hist
->hdata
.intvl
.int_start
= 0;
1943 hist
->hdata
.intvl
.steps
= 2;
1944 values
->quick_push (hist
);
1953 /* Find calls inside STMT for that we want to measure histograms for
1954 indirect/virtual call optimization. */
1957 gimple_indirect_call_to_profile (gimple
*stmt
, histogram_values
*values
)
1961 if (gimple_code (stmt
) != GIMPLE_CALL
1962 || gimple_call_internal_p (stmt
)
1963 || gimple_call_fndecl (stmt
) != NULL_TREE
)
1966 callee
= gimple_call_fn (stmt
);
1968 values
->reserve (3);
1970 values
->quick_push (gimple_alloc_histogram_value (
1972 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE
) ?
1973 HIST_TYPE_INDIR_CALL_TOPN
:
1974 HIST_TYPE_INDIR_CALL
,
1980 /* Find values inside STMT for that we want to measure histograms for
1981 string operations. */
1984 gimple_stringops_values_to_profile (gimple
*gs
, histogram_values
*values
)
1991 stmt
= dyn_cast
<gcall
*> (gs
);
1995 if (!gimple_call_builtin_p (gs
, BUILT_IN_NORMAL
))
1998 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
2001 dest
= gimple_call_arg (stmt
, 0);
2002 blck_size
= gimple_call_arg (stmt
, size_arg
);
2004 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2006 values
->safe_push (gimple_alloc_histogram_value (cfun
,
2007 HIST_TYPE_SINGLE_VALUE
,
2009 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_AVERAGE
,
2013 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2014 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_IOR
,
2018 /* Find values inside STMT for that we want to measure histograms and adds
2019 them to list VALUES. */
2022 gimple_values_to_profile (gimple
*stmt
, histogram_values
*values
)
2024 gimple_divmod_values_to_profile (stmt
, values
);
2025 gimple_stringops_values_to_profile (stmt
, values
);
2026 gimple_indirect_call_to_profile (stmt
, values
);
2030 gimple_find_values_to_profile (histogram_values
*values
)
2033 gimple_stmt_iterator gsi
;
2035 histogram_value hist
= NULL
;
2038 FOR_EACH_BB_FN (bb
, cfun
)
2039 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2040 gimple_values_to_profile (gsi_stmt (gsi
), values
);
2042 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_TIME_PROFILE
, 0, 0));
2044 FOR_EACH_VEC_ELT (*values
, i
, hist
)
2048 case HIST_TYPE_INTERVAL
:
2049 hist
->n_counters
= hist
->hdata
.intvl
.steps
+ 2;
2052 case HIST_TYPE_POW2
:
2053 hist
->n_counters
= 2;
2056 case HIST_TYPE_SINGLE_VALUE
:
2057 hist
->n_counters
= 3;
2060 case HIST_TYPE_INDIR_CALL
:
2061 hist
->n_counters
= 3;
2064 case HIST_TYPE_TIME_PROFILE
:
2065 hist
->n_counters
= 1;
2068 case HIST_TYPE_AVERAGE
:
2069 hist
->n_counters
= 2;
2073 hist
->n_counters
= 1;
2076 case HIST_TYPE_INDIR_CALL_TOPN
:
2077 hist
->n_counters
= GCOV_ICALL_TOPN_NCOUNTS
;
2085 fprintf (dump_file
, "Stmt ");
2086 print_gimple_stmt (dump_file
, hist
->hvalue
.stmt
, 0, TDF_SLIM
);
2087 dump_histogram_value (dump_file
, hist
);