1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2015 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 * Currently, HIST_TYPE_CONST_DELTA is not implemented.
99 (This type of histogram was originally used to implement a form of
100 stride profiling based speculative prefetching to improve SPEC2000
101 scores for memory-bound benchmarks, mcf and equake. However, this
102 was an RTL value-profiling transformation, and those have all been
104 * Some value profile transformations are done in builtins.c (?!)
105 * Updating of histograms needs some TLC.
106 * The value profiling code could be used to record analysis results
107 from non-profiling (e.g. VRP).
108 * Adding new profilers should be simplified, starting with a cleanup
109 of what-happens-where andwith making gimple_find_values_to_profile
110 and gimple_value_profile_transformations table-driven, perhaps...
113 static tree
gimple_divmod_fixed_value (gassign
*, tree
, int, gcov_type
,
115 static tree
gimple_mod_pow2 (gassign
*, int, gcov_type
, gcov_type
);
116 static tree
gimple_mod_subtract (gassign
*, int, int, int, gcov_type
,
117 gcov_type
, gcov_type
);
118 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*);
119 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator
*);
120 static bool gimple_mod_subtract_transform (gimple_stmt_iterator
*);
121 static bool gimple_stringops_transform (gimple_stmt_iterator
*);
122 static bool gimple_ic_transform (gimple_stmt_iterator
*);
124 /* Allocate histogram value. */
127 gimple_alloc_histogram_value (struct function
*fun ATTRIBUTE_UNUSED
,
128 enum hist_type type
, gimple
*stmt
, tree value
)
130 histogram_value hist
= (histogram_value
) xcalloc (1, sizeof (*hist
));
131 hist
->hvalue
.value
= value
;
132 hist
->hvalue
.stmt
= stmt
;
137 /* Hash value for histogram. */
140 histogram_hash (const void *x
)
142 return htab_hash_pointer (((const_histogram_value
)x
)->hvalue
.stmt
);
145 /* Return nonzero if statement for histogram_value X is Y. */
148 histogram_eq (const void *x
, const void *y
)
150 return ((const_histogram_value
) x
)->hvalue
.stmt
== (const gimple
*) y
;
153 /* Set histogram for STMT. */
156 set_histogram_value (struct function
*fun
, gimple
*stmt
, histogram_value hist
)
159 if (!hist
&& !VALUE_HISTOGRAMS (fun
))
161 if (!VALUE_HISTOGRAMS (fun
))
162 VALUE_HISTOGRAMS (fun
) = htab_create (1, histogram_hash
,
164 loc
= htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
165 htab_hash_pointer (stmt
),
166 hist
? INSERT
: NO_INSERT
);
170 htab_clear_slot (VALUE_HISTOGRAMS (fun
), loc
);
176 /* Get histogram list for STMT. */
179 gimple_histogram_value (struct function
*fun
, gimple
*stmt
)
181 if (!VALUE_HISTOGRAMS (fun
))
183 return (histogram_value
) htab_find_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
184 htab_hash_pointer (stmt
));
187 /* Add histogram for STMT. */
190 gimple_add_histogram_value (struct function
*fun
, gimple
*stmt
,
191 histogram_value hist
)
193 hist
->hvalue
.next
= gimple_histogram_value (fun
, stmt
);
194 set_histogram_value (fun
, stmt
, hist
);
198 /* Remove histogram HIST from STMT's histogram list. */
201 gimple_remove_histogram_value (struct function
*fun
, gimple
*stmt
,
202 histogram_value hist
)
204 histogram_value hist2
= gimple_histogram_value (fun
, stmt
);
207 set_histogram_value (fun
, stmt
, hist
->hvalue
.next
);
211 while (hist2
->hvalue
.next
!= hist
)
212 hist2
= hist2
->hvalue
.next
;
213 hist2
->hvalue
.next
= hist
->hvalue
.next
;
215 free (hist
->hvalue
.counters
);
217 memset (hist
, 0xab, sizeof (*hist
));
221 /* Lookup histogram of type TYPE in the STMT. */
224 gimple_histogram_value_of_type (struct function
*fun
, gimple
*stmt
,
227 histogram_value hist
;
228 for (hist
= gimple_histogram_value (fun
, stmt
); hist
;
229 hist
= hist
->hvalue
.next
)
230 if (hist
->type
== type
)
235 /* Dump information about HIST to DUMP_FILE. */
238 dump_histogram_value (FILE *dump_file
, histogram_value hist
)
242 case HIST_TYPE_INTERVAL
:
243 fprintf (dump_file
, "Interval counter range %d -- %d",
244 hist
->hdata
.intvl
.int_start
,
245 (hist
->hdata
.intvl
.int_start
246 + hist
->hdata
.intvl
.steps
- 1));
247 if (hist
->hvalue
.counters
)
250 fprintf (dump_file
, " [");
251 for (i
= 0; i
< hist
->hdata
.intvl
.steps
; i
++)
252 fprintf (dump_file
, " %d:%" PRId64
,
253 hist
->hdata
.intvl
.int_start
+ i
,
254 (int64_t) hist
->hvalue
.counters
[i
]);
255 fprintf (dump_file
, " ] outside range:%" PRId64
,
256 (int64_t) hist
->hvalue
.counters
[i
]);
258 fprintf (dump_file
, ".\n");
262 fprintf (dump_file
, "Pow2 counter ");
263 if (hist
->hvalue
.counters
)
265 fprintf (dump_file
, "pow2:%" PRId64
267 (int64_t) hist
->hvalue
.counters
[0],
268 (int64_t) hist
->hvalue
.counters
[1]);
270 fprintf (dump_file
, ".\n");
273 case HIST_TYPE_SINGLE_VALUE
:
274 fprintf (dump_file
, "Single value ");
275 if (hist
->hvalue
.counters
)
277 fprintf (dump_file
, "value:%" PRId64
280 (int64_t) hist
->hvalue
.counters
[0],
281 (int64_t) hist
->hvalue
.counters
[1],
282 (int64_t) hist
->hvalue
.counters
[2]);
284 fprintf (dump_file
, ".\n");
287 case HIST_TYPE_AVERAGE
:
288 fprintf (dump_file
, "Average value ");
289 if (hist
->hvalue
.counters
)
291 fprintf (dump_file
, "sum:%" PRId64
293 (int64_t) hist
->hvalue
.counters
[0],
294 (int64_t) hist
->hvalue
.counters
[1]);
296 fprintf (dump_file
, ".\n");
300 fprintf (dump_file
, "IOR value ");
301 if (hist
->hvalue
.counters
)
303 fprintf (dump_file
, "ior:%" PRId64
,
304 (int64_t) hist
->hvalue
.counters
[0]);
306 fprintf (dump_file
, ".\n");
309 case HIST_TYPE_CONST_DELTA
:
310 fprintf (dump_file
, "Constant delta ");
311 if (hist
->hvalue
.counters
)
313 fprintf (dump_file
, "value:%" PRId64
316 (int64_t) hist
->hvalue
.counters
[0],
317 (int64_t) hist
->hvalue
.counters
[1],
318 (int64_t) hist
->hvalue
.counters
[2]);
320 fprintf (dump_file
, ".\n");
322 case HIST_TYPE_INDIR_CALL
:
323 fprintf (dump_file
, "Indirect call ");
324 if (hist
->hvalue
.counters
)
326 fprintf (dump_file
, "value:%" PRId64
329 (int64_t) hist
->hvalue
.counters
[0],
330 (int64_t) hist
->hvalue
.counters
[1],
331 (int64_t) hist
->hvalue
.counters
[2]);
333 fprintf (dump_file
, ".\n");
335 case HIST_TYPE_TIME_PROFILE
:
336 fprintf (dump_file
, "Time profile ");
337 if (hist
->hvalue
.counters
)
339 fprintf (dump_file
, "time:%" PRId64
,
340 (int64_t) hist
->hvalue
.counters
[0]);
342 fprintf (dump_file
, ".\n");
344 case HIST_TYPE_INDIR_CALL_TOPN
:
345 fprintf (dump_file
, "Indirect call topn ");
346 if (hist
->hvalue
.counters
)
350 fprintf (dump_file
, "accu:%" PRId64
, hist
->hvalue
.counters
[0]);
351 for (i
= 1; i
< (GCOV_ICALL_TOPN_VAL
<< 2); i
+= 2)
353 fprintf (dump_file
, " target:%" PRId64
" value:%" PRId64
,
354 (int64_t) hist
->hvalue
.counters
[i
],
355 (int64_t) hist
->hvalue
.counters
[i
+1]);
358 fprintf (dump_file
, ".\n");
365 /* Dump information about HIST to DUMP_FILE. */
368 stream_out_histogram_value (struct output_block
*ob
, histogram_value hist
)
373 bp
= bitpack_create (ob
->main_stream
);
374 bp_pack_enum (&bp
, hist_type
, HIST_TYPE_MAX
, hist
->type
);
375 bp_pack_value (&bp
, hist
->hvalue
.next
!= NULL
, 1);
376 streamer_write_bitpack (&bp
);
379 case HIST_TYPE_INTERVAL
:
380 streamer_write_hwi (ob
, hist
->hdata
.intvl
.int_start
);
381 streamer_write_uhwi (ob
, hist
->hdata
.intvl
.steps
);
386 for (i
= 0; i
< hist
->n_counters
; i
++)
387 streamer_write_gcov_count (ob
, hist
->hvalue
.counters
[i
]);
388 if (hist
->hvalue
.next
)
389 stream_out_histogram_value (ob
, hist
->hvalue
.next
);
392 /* Dump information about HIST to DUMP_FILE. */
395 stream_in_histogram_value (struct lto_input_block
*ib
, gimple
*stmt
)
398 unsigned int ncounters
= 0;
401 histogram_value new_val
;
403 histogram_value
*next_p
= NULL
;
407 bp
= streamer_read_bitpack (ib
);
408 type
= bp_unpack_enum (&bp
, hist_type
, HIST_TYPE_MAX
);
409 next
= bp_unpack_value (&bp
, 1);
410 new_val
= gimple_alloc_histogram_value (cfun
, type
, stmt
, NULL
);
413 case HIST_TYPE_INTERVAL
:
414 new_val
->hdata
.intvl
.int_start
= streamer_read_hwi (ib
);
415 new_val
->hdata
.intvl
.steps
= streamer_read_uhwi (ib
);
416 ncounters
= new_val
->hdata
.intvl
.steps
+ 2;
420 case HIST_TYPE_AVERAGE
:
424 case HIST_TYPE_SINGLE_VALUE
:
425 case HIST_TYPE_INDIR_CALL
:
429 case HIST_TYPE_CONST_DELTA
:
434 case HIST_TYPE_TIME_PROFILE
:
438 case HIST_TYPE_INDIR_CALL_TOPN
:
439 ncounters
= (GCOV_ICALL_TOPN_VAL
<< 2) + 1;
445 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * ncounters
);
446 new_val
->n_counters
= ncounters
;
447 for (i
= 0; i
< ncounters
; i
++)
448 new_val
->hvalue
.counters
[i
] = streamer_read_gcov_count (ib
);
450 gimple_add_histogram_value (cfun
, stmt
, new_val
);
453 next_p
= &new_val
->hvalue
.next
;
458 /* Dump all histograms attached to STMT to DUMP_FILE. */
461 dump_histograms_for_stmt (struct function
*fun
, FILE *dump_file
, gimple
*stmt
)
463 histogram_value hist
;
464 for (hist
= gimple_histogram_value (fun
, stmt
); hist
; hist
= hist
->hvalue
.next
)
465 dump_histogram_value (dump_file
, hist
);
468 /* Remove all histograms associated with STMT. */
471 gimple_remove_stmt_histograms (struct function
*fun
, gimple
*stmt
)
474 while ((val
= gimple_histogram_value (fun
, stmt
)) != NULL
)
475 gimple_remove_histogram_value (fun
, stmt
, val
);
478 /* Duplicate all histograms associates with OSTMT to STMT. */
481 gimple_duplicate_stmt_histograms (struct function
*fun
, gimple
*stmt
,
482 struct function
*ofun
, gimple
*ostmt
)
485 for (val
= gimple_histogram_value (ofun
, ostmt
); val
!= NULL
; val
= val
->hvalue
.next
)
487 histogram_value new_val
= gimple_alloc_histogram_value (fun
, val
->type
, NULL
, NULL
);
488 memcpy (new_val
, val
, sizeof (*val
));
489 new_val
->hvalue
.stmt
= stmt
;
490 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
491 memcpy (new_val
->hvalue
.counters
, val
->hvalue
.counters
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
492 gimple_add_histogram_value (fun
, stmt
, new_val
);
496 /* Move all histograms associated with OSTMT to STMT. */
499 gimple_move_stmt_histograms (struct function
*fun
, gimple
*stmt
, gimple
*ostmt
)
501 histogram_value val
= gimple_histogram_value (fun
, ostmt
);
504 /* The following three statements can't be reordered,
505 because histogram hashtab relies on stmt field value
506 for finding the exact slot. */
507 set_histogram_value (fun
, ostmt
, NULL
);
508 for (; val
!= NULL
; val
= val
->hvalue
.next
)
509 val
->hvalue
.stmt
= stmt
;
510 set_histogram_value (fun
, stmt
, val
);
514 static bool error_found
= false;
516 /* Helper function for verify_histograms. For each histogram reachable via htab
517 walk verify that it was reached via statement walk. */
520 visit_hist (void **slot
, void *data
)
522 hash_set
<histogram_value
> *visited
= (hash_set
<histogram_value
> *) data
;
523 histogram_value hist
= *(histogram_value
*) slot
;
525 if (!visited
->contains (hist
)
526 && hist
->type
!= HIST_TYPE_TIME_PROFILE
)
528 error ("dead histogram");
529 dump_histogram_value (stderr
, hist
);
530 debug_gimple_stmt (hist
->hvalue
.stmt
);
536 /* Verify sanity of the histograms. */
539 verify_histograms (void)
542 gimple_stmt_iterator gsi
;
543 histogram_value hist
;
546 hash_set
<histogram_value
> visited_hists
;
547 FOR_EACH_BB_FN (bb
, cfun
)
548 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
550 gimple
*stmt
= gsi_stmt (gsi
);
552 for (hist
= gimple_histogram_value (cfun
, stmt
); hist
;
553 hist
= hist
->hvalue
.next
)
555 if (hist
->hvalue
.stmt
!= stmt
)
557 error ("Histogram value statement does not correspond to "
558 "the statement it is associated with");
559 debug_gimple_stmt (stmt
);
560 dump_histogram_value (stderr
, hist
);
563 visited_hists
.add (hist
);
566 if (VALUE_HISTOGRAMS (cfun
))
567 htab_traverse (VALUE_HISTOGRAMS (cfun
), visit_hist
, &visited_hists
);
569 internal_error ("verify_histograms failed");
572 /* Helper function for verify_histograms. For each histogram reachable via htab
573 walk verify that it was reached via statement walk. */
576 free_hist (void **slot
, void *data ATTRIBUTE_UNUSED
)
578 histogram_value hist
= *(histogram_value
*) slot
;
579 free (hist
->hvalue
.counters
);
581 memset (hist
, 0xab, sizeof (*hist
));
587 free_histograms (struct function
*fn
)
589 if (VALUE_HISTOGRAMS (fn
))
591 htab_traverse (VALUE_HISTOGRAMS (fn
), free_hist
, NULL
);
592 htab_delete (VALUE_HISTOGRAMS (fn
));
593 VALUE_HISTOGRAMS (fn
) = NULL
;
597 /* The overall number of invocations of the counter should match
598 execution count of basic block. Report it as error rather than
599 internal error as it might mean that user has misused the profile
603 check_counter (gimple
*stmt
, const char * name
,
604 gcov_type
*count
, gcov_type
*all
, gcov_type bb_count
)
606 if (*all
!= bb_count
|| *count
> *all
)
609 locus
= (stmt
!= NULL
)
610 ? gimple_location (stmt
)
611 : DECL_SOURCE_LOCATION (current_function_decl
);
612 if (flag_profile_correction
)
614 if (dump_enabled_p ())
615 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
616 "correcting inconsistent value profile: %s "
617 "profiler overall count (%d) does not match BB "
618 "count (%d)\n", name
, (int)*all
, (int)bb_count
);
626 error_at (locus
, "corrupted value profile: %s "
627 "profile counter (%d out of %d) inconsistent with "
628 "basic-block count (%d)",
640 /* GIMPLE based transformations. */
643 gimple_value_profile_transformations (void)
646 gimple_stmt_iterator gsi
;
647 bool changed
= false;
648 FOR_EACH_BB_FN (bb
, cfun
)
650 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
652 gimple
*stmt
= gsi_stmt (gsi
);
653 histogram_value th
= gimple_histogram_value (cfun
, stmt
);
659 fprintf (dump_file
, "Trying transformations on stmt ");
660 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
661 dump_histograms_for_stmt (cfun
, dump_file
, stmt
);
664 /* Transformations: */
665 /* The order of things in this conditional controls which
666 transformation is used when more than one is applicable. */
667 /* It is expected that any code added by the transformations
668 will be added before the current statement, and that the
669 current statement remain valid (although possibly
670 modified) upon return. */
671 if (gimple_mod_subtract_transform (&gsi
)
672 || gimple_divmod_fixed_value_transform (&gsi
)
673 || gimple_mod_pow2_value_transform (&gsi
)
674 || gimple_stringops_transform (&gsi
)
675 || gimple_ic_transform (&gsi
))
677 stmt
= gsi_stmt (gsi
);
679 /* Original statement may no longer be in the same block. */
680 if (bb
!= gimple_bb (stmt
))
682 bb
= gimple_bb (stmt
);
683 gsi
= gsi_for_stmt (stmt
);
697 /* Generate code for transformation 1 (with parent gimple assignment
698 STMT and probability of taking the optimal path PROB, which is
699 equivalent to COUNT/ALL within roundoff error). This generates the
700 result into a temp and returns the temp; it does not replace or
701 alter the original STMT. */
704 gimple_divmod_fixed_value (gassign
*stmt
, tree value
, int prob
,
705 gcov_type count
, gcov_type all
)
707 gassign
*stmt1
, *stmt2
;
709 tree tmp0
, tmp1
, tmp2
;
710 gimple
*bb1end
, *bb2end
, *bb3end
;
711 basic_block bb
, bb2
, bb3
, bb4
;
712 tree optype
, op1
, op2
;
713 edge e12
, e13
, e23
, e24
, e34
;
714 gimple_stmt_iterator gsi
;
716 gcc_assert (is_gimple_assign (stmt
)
717 && (gimple_assign_rhs_code (stmt
) == TRUNC_DIV_EXPR
718 || gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
));
720 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
721 op1
= gimple_assign_rhs1 (stmt
);
722 op2
= gimple_assign_rhs2 (stmt
);
724 bb
= gimple_bb (stmt
);
725 gsi
= gsi_for_stmt (stmt
);
727 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
728 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
729 stmt1
= gimple_build_assign (tmp0
, fold_convert (optype
, value
));
730 stmt2
= gimple_build_assign (tmp1
, op2
);
731 stmt3
= gimple_build_cond (NE_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
732 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
733 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
734 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
737 tmp2
= create_tmp_reg (optype
, "PROF");
738 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, tmp0
);
739 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
742 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, op2
);
743 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
747 /* Edge e23 connects bb2 to bb3, etc. */
748 e12
= split_block (bb
, bb1end
);
751 e23
= split_block (bb2
, bb2end
);
753 bb3
->count
= all
- count
;
754 e34
= split_block (bb3
, bb3end
);
758 e12
->flags
&= ~EDGE_FALLTHRU
;
759 e12
->flags
|= EDGE_FALSE_VALUE
;
760 e12
->probability
= prob
;
763 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
764 e13
->probability
= REG_BR_PROB_BASE
- prob
;
765 e13
->count
= all
- count
;
769 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
770 e24
->probability
= REG_BR_PROB_BASE
;
773 e34
->probability
= REG_BR_PROB_BASE
;
774 e34
->count
= all
- count
;
779 /* Do transform 1) on INSN if applicable. */
782 gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*si
)
784 histogram_value histogram
;
786 gcov_type val
, count
, all
;
787 tree result
, value
, tree_val
;
791 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
795 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt
))))
798 code
= gimple_assign_rhs_code (stmt
);
800 if (code
!= TRUNC_DIV_EXPR
&& code
!= TRUNC_MOD_EXPR
)
803 histogram
= gimple_histogram_value_of_type (cfun
, stmt
,
804 HIST_TYPE_SINGLE_VALUE
);
808 value
= histogram
->hvalue
.value
;
809 val
= histogram
->hvalue
.counters
[0];
810 count
= histogram
->hvalue
.counters
[1];
811 all
= histogram
->hvalue
.counters
[2];
812 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
814 /* We require that count is at least half of all; this means
815 that for the transformation to fire the value must be constant
816 at least 50% of time (and 75% gives the guarantee of usage). */
817 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
819 || optimize_bb_for_size_p (gimple_bb (stmt
)))
822 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
825 /* Compute probability of taking the optimal path. */
827 prob
= GCOV_COMPUTE_SCALE (count
, all
);
831 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
832 tree_val
= build_int_cst (get_gcov_type (), val
);
836 a
[0] = (unsigned HOST_WIDE_INT
) val
;
837 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
839 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
840 TYPE_PRECISION (get_gcov_type ()), false));
842 result
= gimple_divmod_fixed_value (stmt
, tree_val
, prob
, count
, all
);
846 fprintf (dump_file
, "Div/mod by constant ");
847 print_generic_expr (dump_file
, value
, TDF_SLIM
);
848 fprintf (dump_file
, "=");
849 print_generic_expr (dump_file
, tree_val
, TDF_SLIM
);
850 fprintf (dump_file
, " transformation on insn ");
851 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
854 gimple_assign_set_rhs_from_tree (si
, result
);
855 update_stmt (gsi_stmt (*si
));
860 /* Generate code for transformation 2 (with parent gimple assign STMT and
861 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
862 within roundoff error). This generates the result into a temp and returns
863 the temp; it does not replace or alter the original STMT. */
866 gimple_mod_pow2 (gassign
*stmt
, int prob
, gcov_type count
, gcov_type all
)
868 gassign
*stmt1
, *stmt2
, *stmt3
;
871 gimple
*bb1end
, *bb2end
, *bb3end
;
872 basic_block bb
, bb2
, bb3
, bb4
;
873 tree optype
, op1
, op2
;
874 edge e12
, e13
, e23
, e24
, e34
;
875 gimple_stmt_iterator gsi
;
878 gcc_assert (is_gimple_assign (stmt
)
879 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
881 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
882 op1
= gimple_assign_rhs1 (stmt
);
883 op2
= gimple_assign_rhs2 (stmt
);
885 bb
= gimple_bb (stmt
);
886 gsi
= gsi_for_stmt (stmt
);
888 result
= create_tmp_reg (optype
, "PROF");
889 tmp2
= make_temp_ssa_name (optype
, NULL
, "PROF");
890 tmp3
= make_temp_ssa_name (optype
, NULL
, "PROF");
891 stmt2
= gimple_build_assign (tmp2
, PLUS_EXPR
, op2
,
892 build_int_cst (optype
, -1));
893 stmt3
= gimple_build_assign (tmp3
, BIT_AND_EXPR
, tmp2
, op2
);
894 stmt4
= gimple_build_cond (NE_EXPR
, tmp3
, build_int_cst (optype
, 0),
895 NULL_TREE
, NULL_TREE
);
896 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
897 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
898 gsi_insert_before (&gsi
, stmt4
, GSI_SAME_STMT
);
901 /* tmp2 == op2-1 inherited from previous block. */
902 stmt1
= gimple_build_assign (result
, BIT_AND_EXPR
, op1
, tmp2
);
903 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
906 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
908 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
912 /* Edge e23 connects bb2 to bb3, etc. */
913 e12
= split_block (bb
, bb1end
);
916 e23
= split_block (bb2
, bb2end
);
918 bb3
->count
= all
- count
;
919 e34
= split_block (bb3
, bb3end
);
923 e12
->flags
&= ~EDGE_FALLTHRU
;
924 e12
->flags
|= EDGE_FALSE_VALUE
;
925 e12
->probability
= prob
;
928 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
929 e13
->probability
= REG_BR_PROB_BASE
- prob
;
930 e13
->count
= all
- count
;
934 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
935 e24
->probability
= REG_BR_PROB_BASE
;
938 e34
->probability
= REG_BR_PROB_BASE
;
939 e34
->count
= all
- count
;
944 /* Do transform 2) on INSN if applicable. */
947 gimple_mod_pow2_value_transform (gimple_stmt_iterator
*si
)
949 histogram_value histogram
;
951 gcov_type count
, wrong_values
, all
;
952 tree lhs_type
, result
, value
;
956 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
960 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
961 if (!INTEGRAL_TYPE_P (lhs_type
))
964 code
= gimple_assign_rhs_code (stmt
);
966 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
969 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_POW2
);
973 value
= histogram
->hvalue
.value
;
974 wrong_values
= histogram
->hvalue
.counters
[0];
975 count
= histogram
->hvalue
.counters
[1];
977 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
979 /* We require that we hit a power of 2 at least half of all evaluations. */
980 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
981 || count
< wrong_values
982 || optimize_bb_for_size_p (gimple_bb (stmt
)))
987 fprintf (dump_file
, "Mod power of 2 transformation on insn ");
988 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
991 /* Compute probability of taking the optimal path. */
992 all
= count
+ wrong_values
;
994 if (check_counter (stmt
, "pow2", &count
, &all
, gimple_bb (stmt
)->count
))
998 prob
= GCOV_COMPUTE_SCALE (count
, all
);
1002 result
= gimple_mod_pow2 (stmt
, prob
, count
, all
);
1004 gimple_assign_set_rhs_from_tree (si
, result
);
1005 update_stmt (gsi_stmt (*si
));
1010 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
1011 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
1012 supported and this is built into this interface. The probabilities of taking
1013 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
1014 COUNT2/ALL respectively within roundoff error). This generates the
1015 result into a temp and returns the temp; it does not replace or alter
1016 the original STMT. */
1017 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1020 gimple_mod_subtract (gassign
*stmt
, int prob1
, int prob2
, int ncounts
,
1021 gcov_type count1
, gcov_type count2
, gcov_type all
)
1027 gimple
*bb1end
, *bb2end
= NULL
, *bb3end
;
1028 basic_block bb
, bb2
, bb3
, bb4
;
1029 tree optype
, op1
, op2
;
1030 edge e12
, e23
= 0, e24
, e34
, e14
;
1031 gimple_stmt_iterator gsi
;
1034 gcc_assert (is_gimple_assign (stmt
)
1035 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
1037 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
1038 op1
= gimple_assign_rhs1 (stmt
);
1039 op2
= gimple_assign_rhs2 (stmt
);
1041 bb
= gimple_bb (stmt
);
1042 gsi
= gsi_for_stmt (stmt
);
1044 result
= create_tmp_reg (optype
, "PROF");
1045 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1046 stmt1
= gimple_build_assign (result
, op1
);
1047 stmt2
= gimple_build_assign (tmp1
, op2
);
1048 stmt3
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1049 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1050 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1051 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
1054 if (ncounts
) /* Assumed to be 0 or 1 */
1056 stmt1
= gimple_build_assign (result
, MINUS_EXPR
, result
, tmp1
);
1057 stmt2
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1058 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1059 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1063 /* Fallback case. */
1064 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
1066 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1070 /* Edge e23 connects bb2 to bb3, etc. */
1071 /* However block 3 is optional; if it is not there, references
1072 to 3 really refer to block 2. */
1073 e12
= split_block (bb
, bb1end
);
1075 bb2
->count
= all
- count1
;
1077 if (ncounts
) /* Assumed to be 0 or 1. */
1079 e23
= split_block (bb2
, bb2end
);
1081 bb3
->count
= all
- count1
- count2
;
1084 e34
= split_block (ncounts
? bb3
: bb2
, bb3end
);
1088 e12
->flags
&= ~EDGE_FALLTHRU
;
1089 e12
->flags
|= EDGE_FALSE_VALUE
;
1090 e12
->probability
= REG_BR_PROB_BASE
- prob1
;
1091 e12
->count
= all
- count1
;
1093 e14
= make_edge (bb
, bb4
, EDGE_TRUE_VALUE
);
1094 e14
->probability
= prob1
;
1095 e14
->count
= count1
;
1097 if (ncounts
) /* Assumed to be 0 or 1. */
1099 e23
->flags
&= ~EDGE_FALLTHRU
;
1100 e23
->flags
|= EDGE_FALSE_VALUE
;
1101 e23
->count
= all
- count1
- count2
;
1102 e23
->probability
= REG_BR_PROB_BASE
- prob2
;
1104 e24
= make_edge (bb2
, bb4
, EDGE_TRUE_VALUE
);
1105 e24
->probability
= prob2
;
1106 e24
->count
= count2
;
1109 e34
->probability
= REG_BR_PROB_BASE
;
1110 e34
->count
= all
- count1
- count2
;
1115 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1118 gimple_mod_subtract_transform (gimple_stmt_iterator
*si
)
1120 histogram_value histogram
;
1121 enum tree_code code
;
1122 gcov_type count
, wrong_values
, all
;
1123 tree lhs_type
, result
;
1124 gcov_type prob1
, prob2
;
1125 unsigned int i
, steps
;
1126 gcov_type count1
, count2
;
1128 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
1132 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
1133 if (!INTEGRAL_TYPE_P (lhs_type
))
1136 code
= gimple_assign_rhs_code (stmt
);
1138 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
1141 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INTERVAL
);
1147 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1148 all
+= histogram
->hvalue
.counters
[i
];
1150 wrong_values
+= histogram
->hvalue
.counters
[i
];
1151 wrong_values
+= histogram
->hvalue
.counters
[i
+1];
1152 steps
= histogram
->hdata
.intvl
.steps
;
1153 all
+= wrong_values
;
1154 count1
= histogram
->hvalue
.counters
[0];
1155 count2
= histogram
->hvalue
.counters
[1];
1157 /* Compute probability of taking the optimal path. */
1158 if (check_counter (stmt
, "interval", &count1
, &all
, gimple_bb (stmt
)->count
))
1160 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1164 if (flag_profile_correction
&& count1
+ count2
> all
)
1165 all
= count1
+ count2
;
1167 gcc_assert (count1
+ count2
<= all
);
1169 /* We require that we use just subtractions in at least 50% of all
1172 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1174 count
+= histogram
->hvalue
.counters
[i
];
1175 if (count
* 2 >= all
)
1179 || optimize_bb_for_size_p (gimple_bb (stmt
)))
1182 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1185 fprintf (dump_file
, "Mod subtract transformation on insn ");
1186 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1189 /* Compute probability of taking the optimal path(s). */
1192 prob1
= GCOV_COMPUTE_SCALE (count1
, all
);
1193 prob2
= GCOV_COMPUTE_SCALE (count2
, all
);
1200 /* In practice, "steps" is always 2. This interface reflects this,
1201 and will need to be changed if "steps" can change. */
1202 result
= gimple_mod_subtract (stmt
, prob1
, prob2
, i
, count1
, count2
, all
);
1204 gimple_assign_set_rhs_from_tree (si
, result
);
1205 update_stmt (gsi_stmt (*si
));
1210 typedef int_hash
<unsigned int, 0, UINT_MAX
> profile_id_hash
;
1212 static hash_map
<profile_id_hash
, cgraph_node
*> *cgraph_node_map
= 0;
1214 /* Returns true if node graph is initialized. This
1215 is used to test if profile_id has been created
1216 for cgraph_nodes. */
1219 coverage_node_map_initialized_p (void)
1221 return cgraph_node_map
!= 0;
1224 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1225 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1226 that the PROFILE_IDs was already assigned. */
1229 init_node_map (bool local
)
1231 struct cgraph_node
*n
;
1232 cgraph_node_map
= new hash_map
<profile_id_hash
, cgraph_node
*>;
1234 FOR_EACH_DEFINED_FUNCTION (n
)
1235 if (n
->has_gimple_body_p ())
1240 n
->profile_id
= coverage_compute_profile_id (n
);
1241 while ((val
= cgraph_node_map
->get (n
->profile_id
))
1245 fprintf (dump_file
, "Local profile-id %i conflict"
1246 " with nodes %s/%i %s/%i\n",
1252 n
->profile_id
= (n
->profile_id
+ 1) & 0x7fffffff;
1255 else if (!n
->profile_id
)
1259 "Node %s/%i has no profile-id"
1260 " (profile feedback missing?)\n",
1265 else if ((val
= cgraph_node_map
->get (n
->profile_id
)))
1269 "Node %s/%i has IP profile-id %i conflict. "
1277 cgraph_node_map
->put (n
->profile_id
, n
);
1281 /* Delete the CGRAPH_NODE_MAP. */
1286 delete cgraph_node_map
;
1289 /* Return cgraph node for function with pid */
1292 find_func_by_profile_id (int profile_id
)
1294 cgraph_node
**val
= cgraph_node_map
->get (profile_id
);
1301 /* Perform sanity check on the indirect call target. Due to race conditions,
1302 false function target may be attributed to an indirect call site. If the
1303 call expression type mismatches with the target function's type, expand_call
1304 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1305 Returns true if TARGET is considered ok for call CALL_STMT. */
1308 check_ic_target (gcall
*call_stmt
, struct cgraph_node
*target
)
1311 if (gimple_check_call_matching_types (call_stmt
, target
->decl
, true))
1314 locus
= gimple_location (call_stmt
);
1315 if (dump_enabled_p ())
1316 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
1317 "Skipping target %s with mismatching types for icall\n",
1322 /* Do transformation
1324 if (actual_callee_address == address_of_most_common_function/method)
1331 gimple_ic (gcall
*icall_stmt
, struct cgraph_node
*direct_call
,
1332 int prob
, gcov_type count
, gcov_type all
)
1337 gcall
*iretbnd_stmt
= NULL
;
1338 tree tmp0
, tmp1
, tmp
;
1339 basic_block cond_bb
, dcall_bb
, icall_bb
, join_bb
= NULL
;
1340 tree optype
= build_pointer_type (void_type_node
);
1341 edge e_cd
, e_ci
, e_di
, e_dj
= NULL
, e_ij
;
1342 gimple_stmt_iterator gsi
;
1346 gimple_stmt_iterator psi
;
1348 cond_bb
= gimple_bb (icall_stmt
);
1349 gsi
= gsi_for_stmt (icall_stmt
);
1351 if (gimple_call_with_bounds_p (icall_stmt
) && gimple_call_lhs (icall_stmt
))
1352 iretbnd_stmt
= chkp_retbnd_call_by_val (gimple_call_lhs (icall_stmt
));
1354 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1355 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1356 tmp
= unshare_expr (gimple_call_fn (icall_stmt
));
1357 load_stmt
= gimple_build_assign (tmp0
, tmp
);
1358 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1360 tmp
= fold_convert (optype
, build_addr (direct_call
->decl
));
1361 load_stmt
= gimple_build_assign (tmp1
, tmp
);
1362 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1364 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1365 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1367 if (TREE_CODE (gimple_vdef (icall_stmt
)) == SSA_NAME
)
1369 unlink_stmt_vdef (icall_stmt
);
1370 release_ssa_name (gimple_vdef (icall_stmt
));
1372 gimple_set_vdef (icall_stmt
, NULL_TREE
);
1373 gimple_set_vuse (icall_stmt
, NULL_TREE
);
1374 update_stmt (icall_stmt
);
1375 dcall_stmt
= as_a
<gcall
*> (gimple_copy (icall_stmt
));
1376 gimple_call_set_fndecl (dcall_stmt
, direct_call
->decl
);
1377 dflags
= flags_from_decl_or_type (direct_call
->decl
);
1378 if ((dflags
& ECF_NORETURN
) != 0)
1379 gimple_call_set_lhs (dcall_stmt
, NULL_TREE
);
1380 gsi_insert_before (&gsi
, dcall_stmt
, GSI_SAME_STMT
);
1383 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1384 e_cd
= split_block (cond_bb
, cond_stmt
);
1385 dcall_bb
= e_cd
->dest
;
1386 dcall_bb
->count
= count
;
1388 e_di
= split_block (dcall_bb
, dcall_stmt
);
1389 icall_bb
= e_di
->dest
;
1390 icall_bb
->count
= all
- count
;
1392 /* Do not disturb existing EH edges from the indirect call. */
1393 if (!stmt_ends_bb_p (icall_stmt
))
1394 e_ij
= split_block (icall_bb
, icall_stmt
);
1397 e_ij
= find_fallthru_edge (icall_bb
->succs
);
1398 /* The indirect call might be noreturn. */
1401 e_ij
->probability
= REG_BR_PROB_BASE
;
1402 e_ij
->count
= all
- count
;
1403 e_ij
= single_pred_edge (split_edge (e_ij
));
1408 join_bb
= e_ij
->dest
;
1409 join_bb
->count
= all
;
1412 e_cd
->flags
= (e_cd
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1413 e_cd
->probability
= prob
;
1414 e_cd
->count
= count
;
1416 e_ci
= make_edge (cond_bb
, icall_bb
, EDGE_FALSE_VALUE
);
1417 e_ci
->probability
= REG_BR_PROB_BASE
- prob
;
1418 e_ci
->count
= all
- count
;
1424 if ((dflags
& ECF_NORETURN
) != 0)
1428 e_dj
= make_edge (dcall_bb
, join_bb
, EDGE_FALLTHRU
);
1429 e_dj
->probability
= REG_BR_PROB_BASE
;
1430 e_dj
->count
= count
;
1432 e_ij
->count
= all
- count
;
1434 e_ij
->probability
= REG_BR_PROB_BASE
;
1437 /* Insert PHI node for the call result if necessary. */
1438 if (gimple_call_lhs (icall_stmt
)
1439 && TREE_CODE (gimple_call_lhs (icall_stmt
)) == SSA_NAME
1440 && (dflags
& ECF_NORETURN
) == 0)
1442 tree result
= gimple_call_lhs (icall_stmt
);
1443 gphi
*phi
= create_phi_node (result
, join_bb
);
1444 gimple_call_set_lhs (icall_stmt
,
1445 duplicate_ssa_name (result
, icall_stmt
));
1446 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1447 gimple_call_set_lhs (dcall_stmt
,
1448 duplicate_ssa_name (result
, dcall_stmt
));
1449 add_phi_arg (phi
, gimple_call_lhs (dcall_stmt
), e_dj
, UNKNOWN_LOCATION
);
1451 /* If indirect call has following BUILT_IN_CHKP_BNDRET
1452 call then we need to make it's copy for the direct
1456 if (gimple_call_lhs (iretbnd_stmt
))
1460 if (TREE_CODE (gimple_vdef (iretbnd_stmt
)) == SSA_NAME
)
1462 unlink_stmt_vdef (iretbnd_stmt
);
1463 release_ssa_name (gimple_vdef (iretbnd_stmt
));
1465 gimple_set_vdef (iretbnd_stmt
, NULL_TREE
);
1466 gimple_set_vuse (iretbnd_stmt
, NULL_TREE
);
1467 update_stmt (iretbnd_stmt
);
1469 result
= gimple_call_lhs (iretbnd_stmt
);
1470 phi
= create_phi_node (result
, join_bb
);
1472 copy
= gimple_copy (iretbnd_stmt
);
1473 gimple_call_set_arg (copy
, 0,
1474 gimple_call_lhs (dcall_stmt
));
1475 gimple_call_set_lhs (copy
, duplicate_ssa_name (result
, copy
));
1476 gsi_insert_on_edge (e_dj
, copy
);
1477 add_phi_arg (phi
, gimple_call_lhs (copy
),
1478 e_dj
, UNKNOWN_LOCATION
);
1480 gimple_call_set_arg (iretbnd_stmt
, 0,
1481 gimple_call_lhs (icall_stmt
));
1482 gimple_call_set_lhs (iretbnd_stmt
,
1483 duplicate_ssa_name (result
, iretbnd_stmt
));
1484 psi
= gsi_for_stmt (iretbnd_stmt
);
1485 gsi_remove (&psi
, false);
1486 gsi_insert_on_edge (e_ij
, iretbnd_stmt
);
1487 add_phi_arg (phi
, gimple_call_lhs (iretbnd_stmt
),
1488 e_ij
, UNKNOWN_LOCATION
);
1490 gsi_commit_one_edge_insert (e_dj
, NULL
);
1491 gsi_commit_one_edge_insert (e_ij
, NULL
);
1495 psi
= gsi_for_stmt (iretbnd_stmt
);
1496 gsi_remove (&psi
, true);
1501 /* Build an EH edge for the direct call if necessary. */
1502 lp_nr
= lookup_stmt_eh_lp (icall_stmt
);
1503 if (lp_nr
> 0 && stmt_could_throw_p (dcall_stmt
))
1505 add_stmt_to_eh_lp (dcall_stmt
, lp_nr
);
1508 FOR_EACH_EDGE (e_eh
, ei
, icall_bb
->succs
)
1509 if (e_eh
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
1511 e
= make_edge (dcall_bb
, e_eh
->dest
, e_eh
->flags
);
1512 for (gphi_iterator psi
= gsi_start_phis (e_eh
->dest
);
1513 !gsi_end_p (psi
); gsi_next (&psi
))
1515 gphi
*phi
= psi
.phi ();
1516 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi
, e
),
1517 PHI_ARG_DEF_FROM_EDGE (phi
, e_eh
));
1520 if (!stmt_could_throw_p (dcall_stmt
))
1521 gimple_purge_dead_eh_edges (dcall_bb
);
1526 For every checked indirect/virtual call determine if most common pid of
1527 function/class method has probability more than 50%. If yes modify code of
1532 gimple_ic_transform (gimple_stmt_iterator
*gsi
)
1535 histogram_value histogram
;
1536 gcov_type val
, count
, all
, bb_all
;
1537 struct cgraph_node
*direct_call
;
1539 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1543 if (gimple_call_fndecl (stmt
) != NULL_TREE
)
1546 if (gimple_call_internal_p (stmt
))
1549 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INDIR_CALL
);
1553 val
= histogram
->hvalue
.counters
[0];
1554 count
= histogram
->hvalue
.counters
[1];
1555 all
= histogram
->hvalue
.counters
[2];
1557 bb_all
= gimple_bb (stmt
)->count
;
1558 /* The order of CHECK_COUNTER calls is important -
1559 since check_counter can correct the third parameter
1560 and we want to make count <= all <= bb_all. */
1561 if ( check_counter (stmt
, "ic", &all
, &bb_all
, bb_all
)
1562 || check_counter (stmt
, "ic", &count
, &all
, all
))
1564 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1568 if (4 * count
<= 3 * all
)
1571 direct_call
= find_func_by_profile_id ((int)val
);
1573 if (direct_call
== NULL
)
1579 fprintf (dump_file
, "Indirect call -> direct call from other module");
1580 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1581 fprintf (dump_file
, "=> %i (will resolve only with LTO)\n", (int)val
);
1587 if (!check_ic_target (stmt
, direct_call
))
1591 fprintf (dump_file
, "Indirect call -> direct call ");
1592 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1593 fprintf (dump_file
, "=> ");
1594 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1595 fprintf (dump_file
, " transformation skipped because of type mismatch");
1596 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1598 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1604 fprintf (dump_file
, "Indirect call -> direct call ");
1605 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1606 fprintf (dump_file
, "=> ");
1607 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1608 fprintf (dump_file
, " transformation on insn postponned to ipa-profile");
1609 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1610 fprintf (dump_file
, "hist->count %" PRId64
1611 " hist->all %" PRId64
"\n", count
, all
);
1617 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1618 set to the argument index for the size of the string operation. */
1621 interesting_stringop_to_profile_p (gcall
*call
, int *size_arg
)
1623 enum built_in_function fcode
;
1625 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (call
));
1626 if (fcode
!= BUILT_IN_MEMCPY
&& fcode
!= BUILT_IN_MEMPCPY
1627 && fcode
!= BUILT_IN_MEMSET
&& fcode
!= BUILT_IN_BZERO
)
1632 case BUILT_IN_MEMCPY
:
1633 case BUILT_IN_MEMPCPY
:
1635 return validate_gimple_arglist (call
, POINTER_TYPE
, POINTER_TYPE
,
1636 INTEGER_TYPE
, VOID_TYPE
);
1637 case BUILT_IN_MEMSET
:
1639 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1640 INTEGER_TYPE
, VOID_TYPE
);
1641 case BUILT_IN_BZERO
:
1643 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1650 /* Convert stringop (..., vcall_size)
1652 if (vcall_size == icall_size)
1653 stringop (..., icall_size);
1655 stringop (..., vcall_size);
1656 assuming we'll propagate a true constant into ICALL_SIZE later. */
1659 gimple_stringop_fixed_value (gcall
*vcall_stmt
, tree icall_size
, int prob
,
1660 gcov_type count
, gcov_type all
)
1665 tree tmp0
, tmp1
, vcall_size
, optype
;
1666 basic_block cond_bb
, icall_bb
, vcall_bb
, join_bb
;
1667 edge e_ci
, e_cv
, e_iv
, e_ij
, e_vj
;
1668 gimple_stmt_iterator gsi
;
1671 if (!interesting_stringop_to_profile_p (vcall_stmt
, &size_arg
))
1674 cond_bb
= gimple_bb (vcall_stmt
);
1675 gsi
= gsi_for_stmt (vcall_stmt
);
1677 vcall_size
= gimple_call_arg (vcall_stmt
, size_arg
);
1678 optype
= TREE_TYPE (vcall_size
);
1680 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1681 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1682 tmp_stmt
= gimple_build_assign (tmp0
, fold_convert (optype
, icall_size
));
1683 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1685 tmp_stmt
= gimple_build_assign (tmp1
, vcall_size
);
1686 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1688 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1689 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1691 if (TREE_CODE (gimple_vdef (vcall_stmt
)) == SSA_NAME
)
1693 unlink_stmt_vdef (vcall_stmt
);
1694 release_ssa_name (gimple_vdef (vcall_stmt
));
1696 gimple_set_vdef (vcall_stmt
, NULL
);
1697 gimple_set_vuse (vcall_stmt
, NULL
);
1698 update_stmt (vcall_stmt
);
1699 icall_stmt
= as_a
<gcall
*> (gimple_copy (vcall_stmt
));
1700 gimple_call_set_arg (icall_stmt
, size_arg
, icall_size
);
1701 gsi_insert_before (&gsi
, icall_stmt
, GSI_SAME_STMT
);
1704 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1705 e_ci
= split_block (cond_bb
, cond_stmt
);
1706 icall_bb
= e_ci
->dest
;
1707 icall_bb
->count
= count
;
1709 e_iv
= split_block (icall_bb
, icall_stmt
);
1710 vcall_bb
= e_iv
->dest
;
1711 vcall_bb
->count
= all
- count
;
1713 e_vj
= split_block (vcall_bb
, vcall_stmt
);
1714 join_bb
= e_vj
->dest
;
1715 join_bb
->count
= all
;
1717 e_ci
->flags
= (e_ci
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1718 e_ci
->probability
= prob
;
1719 e_ci
->count
= count
;
1721 e_cv
= make_edge (cond_bb
, vcall_bb
, EDGE_FALSE_VALUE
);
1722 e_cv
->probability
= REG_BR_PROB_BASE
- prob
;
1723 e_cv
->count
= all
- count
;
1727 e_ij
= make_edge (icall_bb
, join_bb
, EDGE_FALLTHRU
);
1728 e_ij
->probability
= REG_BR_PROB_BASE
;
1729 e_ij
->count
= count
;
1731 e_vj
->probability
= REG_BR_PROB_BASE
;
1732 e_vj
->count
= all
- count
;
1734 /* Insert PHI node for the call result if necessary. */
1735 if (gimple_call_lhs (vcall_stmt
)
1736 && TREE_CODE (gimple_call_lhs (vcall_stmt
)) == SSA_NAME
)
1738 tree result
= gimple_call_lhs (vcall_stmt
);
1739 gphi
*phi
= create_phi_node (result
, join_bb
);
1740 gimple_call_set_lhs (vcall_stmt
,
1741 duplicate_ssa_name (result
, vcall_stmt
));
1742 add_phi_arg (phi
, gimple_call_lhs (vcall_stmt
), e_vj
, UNKNOWN_LOCATION
);
1743 gimple_call_set_lhs (icall_stmt
,
1744 duplicate_ssa_name (result
, icall_stmt
));
1745 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1748 /* Because these are all string op builtins, they're all nothrow. */
1749 gcc_assert (!stmt_could_throw_p (vcall_stmt
));
1750 gcc_assert (!stmt_could_throw_p (icall_stmt
));
1753 /* Find values inside STMT for that we want to measure histograms for
1754 division/modulo optimization. */
1757 gimple_stringops_transform (gimple_stmt_iterator
*gsi
)
1761 enum built_in_function fcode
;
1762 histogram_value histogram
;
1763 gcov_type count
, all
, val
;
1765 unsigned int dest_align
, src_align
;
1770 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1774 if (!gimple_call_builtin_p (gsi_stmt (*gsi
), BUILT_IN_NORMAL
))
1777 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
1780 blck_size
= gimple_call_arg (stmt
, size_arg
);
1781 if (TREE_CODE (blck_size
) == INTEGER_CST
)
1784 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_SINGLE_VALUE
);
1788 val
= histogram
->hvalue
.counters
[0];
1789 count
= histogram
->hvalue
.counters
[1];
1790 all
= histogram
->hvalue
.counters
[2];
1791 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1793 /* We require that count is at least half of all; this means
1794 that for the transformation to fire the value must be constant
1795 at least 80% of time. */
1796 if ((6 * count
/ 5) < all
|| optimize_bb_for_size_p (gimple_bb (stmt
)))
1798 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
1801 prob
= GCOV_COMPUTE_SCALE (count
, all
);
1805 dest
= gimple_call_arg (stmt
, 0);
1806 dest_align
= get_pointer_alignment (dest
);
1807 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (stmt
));
1810 case BUILT_IN_MEMCPY
:
1811 case BUILT_IN_MEMPCPY
:
1812 src
= gimple_call_arg (stmt
, 1);
1813 src_align
= get_pointer_alignment (src
);
1814 if (!can_move_by_pieces (val
, MIN (dest_align
, src_align
)))
1817 case BUILT_IN_MEMSET
:
1818 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1819 gimple_call_arg (stmt
, 1),
1823 case BUILT_IN_BZERO
:
1824 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1833 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
1834 tree_val
= build_int_cst (get_gcov_type (), val
);
1838 a
[0] = (unsigned HOST_WIDE_INT
) val
;
1839 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
1841 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
1842 TYPE_PRECISION (get_gcov_type ()), false));
1847 fprintf (dump_file
, "Single value %i stringop transformation on ",
1849 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1852 gimple_stringop_fixed_value (stmt
, tree_val
, prob
, count
, all
);
1858 stringop_block_profile (gimple
*stmt
, unsigned int *expected_align
,
1859 HOST_WIDE_INT
*expected_size
)
1861 histogram_value histogram
;
1862 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_AVERAGE
);
1865 *expected_size
= -1;
1866 else if (!histogram
->hvalue
.counters
[1])
1868 *expected_size
= -1;
1869 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1874 size
= ((histogram
->hvalue
.counters
[0]
1875 + histogram
->hvalue
.counters
[1] / 2)
1876 / histogram
->hvalue
.counters
[1]);
1877 /* Even if we can hold bigger value in SIZE, INT_MAX
1878 is safe "infinity" for code generation strategies. */
1881 *expected_size
= size
;
1882 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1885 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_IOR
);
1888 *expected_align
= 0;
1889 else if (!histogram
->hvalue
.counters
[0])
1891 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1892 *expected_align
= 0;
1899 count
= histogram
->hvalue
.counters
[0];
1901 while (!(count
& alignment
)
1902 && (alignment
* 2 * BITS_PER_UNIT
))
1904 *expected_align
= alignment
* BITS_PER_UNIT
;
1905 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1910 /* Find values inside STMT for that we want to measure histograms for
1911 division/modulo optimization. */
1914 gimple_divmod_values_to_profile (gimple
*stmt
, histogram_values
*values
)
1916 tree lhs
, divisor
, op0
, type
;
1917 histogram_value hist
;
1919 if (gimple_code (stmt
) != GIMPLE_ASSIGN
)
1922 lhs
= gimple_assign_lhs (stmt
);
1923 type
= TREE_TYPE (lhs
);
1924 if (!INTEGRAL_TYPE_P (type
))
1927 switch (gimple_assign_rhs_code (stmt
))
1929 case TRUNC_DIV_EXPR
:
1930 case TRUNC_MOD_EXPR
:
1931 divisor
= gimple_assign_rhs2 (stmt
);
1932 op0
= gimple_assign_rhs1 (stmt
);
1934 values
->reserve (3);
1936 if (TREE_CODE (divisor
) == SSA_NAME
)
1937 /* Check for the case where the divisor is the same value most
1939 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1940 HIST_TYPE_SINGLE_VALUE
,
1943 /* For mod, check whether it is not often a noop (or replaceable by
1944 a few subtractions). */
1945 if (gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
1946 && TYPE_UNSIGNED (type
))
1949 /* Check for a special case where the divisor is power of 2. */
1950 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1954 val
= build2 (TRUNC_DIV_EXPR
, type
, op0
, divisor
);
1955 hist
= gimple_alloc_histogram_value (cfun
, HIST_TYPE_INTERVAL
,
1957 hist
->hdata
.intvl
.int_start
= 0;
1958 hist
->hdata
.intvl
.steps
= 2;
1959 values
->quick_push (hist
);
1968 /* Find calls inside STMT for that we want to measure histograms for
1969 indirect/virtual call optimization. */
1972 gimple_indirect_call_to_profile (gimple
*stmt
, histogram_values
*values
)
1976 if (gimple_code (stmt
) != GIMPLE_CALL
1977 || gimple_call_internal_p (stmt
)
1978 || gimple_call_fndecl (stmt
) != NULL_TREE
)
1981 callee
= gimple_call_fn (stmt
);
1983 values
->reserve (3);
1985 values
->quick_push (gimple_alloc_histogram_value (
1987 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE
) ?
1988 HIST_TYPE_INDIR_CALL_TOPN
:
1989 HIST_TYPE_INDIR_CALL
,
1995 /* Find values inside STMT for that we want to measure histograms for
1996 string operations. */
1999 gimple_stringops_values_to_profile (gimple
*gs
, histogram_values
*values
)
2006 stmt
= dyn_cast
<gcall
*> (gs
);
2010 if (!gimple_call_builtin_p (gs
, BUILT_IN_NORMAL
))
2013 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
2016 dest
= gimple_call_arg (stmt
, 0);
2017 blck_size
= gimple_call_arg (stmt
, size_arg
);
2019 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2021 values
->safe_push (gimple_alloc_histogram_value (cfun
,
2022 HIST_TYPE_SINGLE_VALUE
,
2024 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_AVERAGE
,
2028 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2029 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_IOR
,
2033 /* Find values inside STMT for that we want to measure histograms and adds
2034 them to list VALUES. */
2037 gimple_values_to_profile (gimple
*stmt
, histogram_values
*values
)
2039 gimple_divmod_values_to_profile (stmt
, values
);
2040 gimple_stringops_values_to_profile (stmt
, values
);
2041 gimple_indirect_call_to_profile (stmt
, values
);
2045 gimple_find_values_to_profile (histogram_values
*values
)
2048 gimple_stmt_iterator gsi
;
2050 histogram_value hist
= NULL
;
2053 FOR_EACH_BB_FN (bb
, cfun
)
2054 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2055 gimple_values_to_profile (gsi_stmt (gsi
), values
);
2057 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_TIME_PROFILE
, 0, 0));
2059 FOR_EACH_VEC_ELT (*values
, i
, hist
)
2063 case HIST_TYPE_INTERVAL
:
2064 hist
->n_counters
= hist
->hdata
.intvl
.steps
+ 2;
2067 case HIST_TYPE_POW2
:
2068 hist
->n_counters
= 2;
2071 case HIST_TYPE_SINGLE_VALUE
:
2072 hist
->n_counters
= 3;
2075 case HIST_TYPE_CONST_DELTA
:
2076 hist
->n_counters
= 4;
2079 case HIST_TYPE_INDIR_CALL
:
2080 hist
->n_counters
= 3;
2083 case HIST_TYPE_TIME_PROFILE
:
2084 hist
->n_counters
= 1;
2087 case HIST_TYPE_AVERAGE
:
2088 hist
->n_counters
= 2;
2092 hist
->n_counters
= 1;
2095 case HIST_TYPE_INDIR_CALL_TOPN
:
2096 hist
->n_counters
= GCOV_ICALL_TOPN_NCOUNTS
;
2104 fprintf (dump_file
, "Stmt ");
2105 print_gimple_stmt (dump_file
, hist
->hvalue
.stmt
, 0, TDF_SLIM
);
2106 dump_histogram_value (dump_file
, hist
);