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"
30 #include "fold-const.h"
31 #include "tree-nested.h"
34 #include "insn-config.h"
42 #include "value-prof.h"
44 #include "insn-codes.h"
47 #include "internal-fn.h"
50 #include "gimple-iterator.h"
52 #include "diagnostic.h"
53 #include "gimple-pretty-print.h"
60 #include "data-streamer.h"
63 #include "tree-chkp.h"
65 /* In this file value profile based optimizations are placed. Currently the
66 following optimizations are implemented (for more detailed descriptions
67 see comments at value_profile_transformations):
69 1) Division/modulo specialization. Provided that we can determine that the
70 operands of the division have some special properties, we may use it to
71 produce more effective code.
73 2) Indirect/virtual call specialization. If we can determine most
74 common function callee in indirect/virtual call. We can use this
75 information to improve code effectiveness (especially info for
78 3) Speculative prefetching. If we are able to determine that the difference
79 between addresses accessed by a memory reference is usually constant, we
80 may add the prefetch instructions.
81 FIXME: This transformation was removed together with RTL based value
85 Value profiling internals
86 ==========================
88 Every value profiling transformation starts with defining what values
89 to profile. There are different histogram types (see HIST_TYPE_* in
90 value-prof.h) and each transformation can request one or more histogram
91 types per GIMPLE statement. The function gimple_find_values_to_profile()
92 collects the values to profile in a vec, and adds the number of counters
93 required for the different histogram types.
95 For a -fprofile-generate run, the statements for which values should be
96 recorded, are instrumented in instrument_values(). The instrumentation
97 is done by helper functions that can be found in tree-profile.c, where
98 new types of histograms can be added if necessary.
100 After a -fprofile-use, the value profiling data is read back in by
101 compute_value_histograms() that translates the collected data to
102 histograms and attaches them to the profiled statements via
103 gimple_add_histogram_value(). Histograms are stored in a hash table
104 that is attached to every intrumented function, see VALUE_HISTOGRAMS
107 The value-profile transformations driver is the function
108 gimple_value_profile_transformations(). It traverses all statements in
109 the to-be-transformed function, and looks for statements with one or
110 more histograms attached to it. If a statement has histograms, the
111 transformation functions are called on the statement.
113 Limitations / FIXME / TODO:
114 * Only one histogram of each type can be associated with a statement.
115 * Currently, HIST_TYPE_CONST_DELTA is not implemented.
116 (This type of histogram was originally used to implement a form of
117 stride profiling based speculative prefetching to improve SPEC2000
118 scores for memory-bound benchmarks, mcf and equake. However, this
119 was an RTL value-profiling transformation, and those have all been
121 * Some value profile transformations are done in builtins.c (?!)
122 * Updating of histograms needs some TLC.
123 * The value profiling code could be used to record analysis results
124 from non-profiling (e.g. VRP).
125 * Adding new profilers should be simplified, starting with a cleanup
126 of what-happens-where andwith making gimple_find_values_to_profile
127 and gimple_value_profile_transformations table-driven, perhaps...
130 static tree
gimple_divmod_fixed_value (gassign
*, tree
, int, gcov_type
,
132 static tree
gimple_mod_pow2 (gassign
*, int, gcov_type
, gcov_type
);
133 static tree
gimple_mod_subtract (gassign
*, int, int, int, gcov_type
,
134 gcov_type
, gcov_type
);
135 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*);
136 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator
*);
137 static bool gimple_mod_subtract_transform (gimple_stmt_iterator
*);
138 static bool gimple_stringops_transform (gimple_stmt_iterator
*);
139 static bool gimple_ic_transform (gimple_stmt_iterator
*);
141 /* Allocate histogram value. */
144 gimple_alloc_histogram_value (struct function
*fun ATTRIBUTE_UNUSED
,
145 enum hist_type type
, gimple
*stmt
, tree value
)
147 histogram_value hist
= (histogram_value
) xcalloc (1, sizeof (*hist
));
148 hist
->hvalue
.value
= value
;
149 hist
->hvalue
.stmt
= stmt
;
154 /* Hash value for histogram. */
157 histogram_hash (const void *x
)
159 return htab_hash_pointer (((const_histogram_value
)x
)->hvalue
.stmt
);
162 /* Return nonzero if statement for histogram_value X is Y. */
165 histogram_eq (const void *x
, const void *y
)
167 return ((const_histogram_value
) x
)->hvalue
.stmt
== (const gimple
*) y
;
170 /* Set histogram for STMT. */
173 set_histogram_value (struct function
*fun
, gimple
*stmt
, histogram_value hist
)
176 if (!hist
&& !VALUE_HISTOGRAMS (fun
))
178 if (!VALUE_HISTOGRAMS (fun
))
179 VALUE_HISTOGRAMS (fun
) = htab_create (1, histogram_hash
,
181 loc
= htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
182 htab_hash_pointer (stmt
),
183 hist
? INSERT
: NO_INSERT
);
187 htab_clear_slot (VALUE_HISTOGRAMS (fun
), loc
);
193 /* Get histogram list for STMT. */
196 gimple_histogram_value (struct function
*fun
, gimple
*stmt
)
198 if (!VALUE_HISTOGRAMS (fun
))
200 return (histogram_value
) htab_find_with_hash (VALUE_HISTOGRAMS (fun
), stmt
,
201 htab_hash_pointer (stmt
));
204 /* Add histogram for STMT. */
207 gimple_add_histogram_value (struct function
*fun
, gimple
*stmt
,
208 histogram_value hist
)
210 hist
->hvalue
.next
= gimple_histogram_value (fun
, stmt
);
211 set_histogram_value (fun
, stmt
, hist
);
215 /* Remove histogram HIST from STMT's histogram list. */
218 gimple_remove_histogram_value (struct function
*fun
, gimple
*stmt
,
219 histogram_value hist
)
221 histogram_value hist2
= gimple_histogram_value (fun
, stmt
);
224 set_histogram_value (fun
, stmt
, hist
->hvalue
.next
);
228 while (hist2
->hvalue
.next
!= hist
)
229 hist2
= hist2
->hvalue
.next
;
230 hist2
->hvalue
.next
= hist
->hvalue
.next
;
232 free (hist
->hvalue
.counters
);
233 #ifdef ENABLE_CHECKING
234 memset (hist
, 0xab, sizeof (*hist
));
239 /* Lookup histogram of type TYPE in the STMT. */
242 gimple_histogram_value_of_type (struct function
*fun
, gimple
*stmt
,
245 histogram_value hist
;
246 for (hist
= gimple_histogram_value (fun
, stmt
); hist
;
247 hist
= hist
->hvalue
.next
)
248 if (hist
->type
== type
)
253 /* Dump information about HIST to DUMP_FILE. */
256 dump_histogram_value (FILE *dump_file
, histogram_value hist
)
260 case HIST_TYPE_INTERVAL
:
261 fprintf (dump_file
, "Interval counter range %d -- %d",
262 hist
->hdata
.intvl
.int_start
,
263 (hist
->hdata
.intvl
.int_start
264 + hist
->hdata
.intvl
.steps
- 1));
265 if (hist
->hvalue
.counters
)
268 fprintf (dump_file
, " [");
269 for (i
= 0; i
< hist
->hdata
.intvl
.steps
; i
++)
270 fprintf (dump_file
, " %d:%" PRId64
,
271 hist
->hdata
.intvl
.int_start
+ i
,
272 (int64_t) hist
->hvalue
.counters
[i
]);
273 fprintf (dump_file
, " ] outside range:%" PRId64
,
274 (int64_t) hist
->hvalue
.counters
[i
]);
276 fprintf (dump_file
, ".\n");
280 fprintf (dump_file
, "Pow2 counter ");
281 if (hist
->hvalue
.counters
)
283 fprintf (dump_file
, "pow2:%" PRId64
285 (int64_t) hist
->hvalue
.counters
[0],
286 (int64_t) hist
->hvalue
.counters
[1]);
288 fprintf (dump_file
, ".\n");
291 case HIST_TYPE_SINGLE_VALUE
:
292 fprintf (dump_file
, "Single value ");
293 if (hist
->hvalue
.counters
)
295 fprintf (dump_file
, "value:%" PRId64
298 (int64_t) hist
->hvalue
.counters
[0],
299 (int64_t) hist
->hvalue
.counters
[1],
300 (int64_t) hist
->hvalue
.counters
[2]);
302 fprintf (dump_file
, ".\n");
305 case HIST_TYPE_AVERAGE
:
306 fprintf (dump_file
, "Average value ");
307 if (hist
->hvalue
.counters
)
309 fprintf (dump_file
, "sum:%" PRId64
311 (int64_t) hist
->hvalue
.counters
[0],
312 (int64_t) hist
->hvalue
.counters
[1]);
314 fprintf (dump_file
, ".\n");
318 fprintf (dump_file
, "IOR value ");
319 if (hist
->hvalue
.counters
)
321 fprintf (dump_file
, "ior:%" PRId64
,
322 (int64_t) hist
->hvalue
.counters
[0]);
324 fprintf (dump_file
, ".\n");
327 case HIST_TYPE_CONST_DELTA
:
328 fprintf (dump_file
, "Constant delta ");
329 if (hist
->hvalue
.counters
)
331 fprintf (dump_file
, "value:%" PRId64
334 (int64_t) hist
->hvalue
.counters
[0],
335 (int64_t) hist
->hvalue
.counters
[1],
336 (int64_t) hist
->hvalue
.counters
[2]);
338 fprintf (dump_file
, ".\n");
340 case HIST_TYPE_INDIR_CALL
:
341 fprintf (dump_file
, "Indirect call ");
342 if (hist
->hvalue
.counters
)
344 fprintf (dump_file
, "value:%" PRId64
347 (int64_t) hist
->hvalue
.counters
[0],
348 (int64_t) hist
->hvalue
.counters
[1],
349 (int64_t) hist
->hvalue
.counters
[2]);
351 fprintf (dump_file
, ".\n");
353 case HIST_TYPE_TIME_PROFILE
:
354 fprintf (dump_file
, "Time profile ");
355 if (hist
->hvalue
.counters
)
357 fprintf (dump_file
, "time:%" PRId64
,
358 (int64_t) hist
->hvalue
.counters
[0]);
360 fprintf (dump_file
, ".\n");
362 case HIST_TYPE_INDIR_CALL_TOPN
:
363 fprintf (dump_file
, "Indirect call topn ");
364 if (hist
->hvalue
.counters
)
368 fprintf (dump_file
, "accu:%" PRId64
, hist
->hvalue
.counters
[0]);
369 for (i
= 1; i
< (GCOV_ICALL_TOPN_VAL
<< 2); i
+= 2)
371 fprintf (dump_file
, " target:%" PRId64
" value:%" PRId64
,
372 (int64_t) hist
->hvalue
.counters
[i
],
373 (int64_t) hist
->hvalue
.counters
[i
+1]);
376 fprintf (dump_file
, ".\n");
383 /* Dump information about HIST to DUMP_FILE. */
386 stream_out_histogram_value (struct output_block
*ob
, histogram_value hist
)
391 bp
= bitpack_create (ob
->main_stream
);
392 bp_pack_enum (&bp
, hist_type
, HIST_TYPE_MAX
, hist
->type
);
393 bp_pack_value (&bp
, hist
->hvalue
.next
!= NULL
, 1);
394 streamer_write_bitpack (&bp
);
397 case HIST_TYPE_INTERVAL
:
398 streamer_write_hwi (ob
, hist
->hdata
.intvl
.int_start
);
399 streamer_write_uhwi (ob
, hist
->hdata
.intvl
.steps
);
404 for (i
= 0; i
< hist
->n_counters
; i
++)
405 streamer_write_gcov_count (ob
, hist
->hvalue
.counters
[i
]);
406 if (hist
->hvalue
.next
)
407 stream_out_histogram_value (ob
, hist
->hvalue
.next
);
410 /* Dump information about HIST to DUMP_FILE. */
413 stream_in_histogram_value (struct lto_input_block
*ib
, gimple
*stmt
)
416 unsigned int ncounters
= 0;
419 histogram_value new_val
;
421 histogram_value
*next_p
= NULL
;
425 bp
= streamer_read_bitpack (ib
);
426 type
= bp_unpack_enum (&bp
, hist_type
, HIST_TYPE_MAX
);
427 next
= bp_unpack_value (&bp
, 1);
428 new_val
= gimple_alloc_histogram_value (cfun
, type
, stmt
, NULL
);
431 case HIST_TYPE_INTERVAL
:
432 new_val
->hdata
.intvl
.int_start
= streamer_read_hwi (ib
);
433 new_val
->hdata
.intvl
.steps
= streamer_read_uhwi (ib
);
434 ncounters
= new_val
->hdata
.intvl
.steps
+ 2;
438 case HIST_TYPE_AVERAGE
:
442 case HIST_TYPE_SINGLE_VALUE
:
443 case HIST_TYPE_INDIR_CALL
:
447 case HIST_TYPE_CONST_DELTA
:
452 case HIST_TYPE_TIME_PROFILE
:
456 case HIST_TYPE_INDIR_CALL_TOPN
:
457 ncounters
= (GCOV_ICALL_TOPN_VAL
<< 2) + 1;
463 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * ncounters
);
464 new_val
->n_counters
= ncounters
;
465 for (i
= 0; i
< ncounters
; i
++)
466 new_val
->hvalue
.counters
[i
] = streamer_read_gcov_count (ib
);
468 gimple_add_histogram_value (cfun
, stmt
, new_val
);
471 next_p
= &new_val
->hvalue
.next
;
476 /* Dump all histograms attached to STMT to DUMP_FILE. */
479 dump_histograms_for_stmt (struct function
*fun
, FILE *dump_file
, gimple
*stmt
)
481 histogram_value hist
;
482 for (hist
= gimple_histogram_value (fun
, stmt
); hist
; hist
= hist
->hvalue
.next
)
483 dump_histogram_value (dump_file
, hist
);
486 /* Remove all histograms associated with STMT. */
489 gimple_remove_stmt_histograms (struct function
*fun
, gimple
*stmt
)
492 while ((val
= gimple_histogram_value (fun
, stmt
)) != NULL
)
493 gimple_remove_histogram_value (fun
, stmt
, val
);
496 /* Duplicate all histograms associates with OSTMT to STMT. */
499 gimple_duplicate_stmt_histograms (struct function
*fun
, gimple
*stmt
,
500 struct function
*ofun
, gimple
*ostmt
)
503 for (val
= gimple_histogram_value (ofun
, ostmt
); val
!= NULL
; val
= val
->hvalue
.next
)
505 histogram_value new_val
= gimple_alloc_histogram_value (fun
, val
->type
, NULL
, NULL
);
506 memcpy (new_val
, val
, sizeof (*val
));
507 new_val
->hvalue
.stmt
= stmt
;
508 new_val
->hvalue
.counters
= XNEWVAR (gcov_type
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
509 memcpy (new_val
->hvalue
.counters
, val
->hvalue
.counters
, sizeof (*new_val
->hvalue
.counters
) * new_val
->n_counters
);
510 gimple_add_histogram_value (fun
, stmt
, new_val
);
514 /* Move all histograms associated with OSTMT to STMT. */
517 gimple_move_stmt_histograms (struct function
*fun
, gimple
*stmt
, gimple
*ostmt
)
519 histogram_value val
= gimple_histogram_value (fun
, ostmt
);
522 /* The following three statements can't be reordered,
523 because histogram hashtab relies on stmt field value
524 for finding the exact slot. */
525 set_histogram_value (fun
, ostmt
, NULL
);
526 for (; val
!= NULL
; val
= val
->hvalue
.next
)
527 val
->hvalue
.stmt
= stmt
;
528 set_histogram_value (fun
, stmt
, val
);
532 static bool error_found
= false;
534 /* Helper function for verify_histograms. For each histogram reachable via htab
535 walk verify that it was reached via statement walk. */
538 visit_hist (void **slot
, void *data
)
540 hash_set
<histogram_value
> *visited
= (hash_set
<histogram_value
> *) data
;
541 histogram_value hist
= *(histogram_value
*) slot
;
543 if (!visited
->contains (hist
)
544 && hist
->type
!= HIST_TYPE_TIME_PROFILE
)
546 error ("dead histogram");
547 dump_histogram_value (stderr
, hist
);
548 debug_gimple_stmt (hist
->hvalue
.stmt
);
554 /* Verify sanity of the histograms. */
557 verify_histograms (void)
560 gimple_stmt_iterator gsi
;
561 histogram_value hist
;
564 hash_set
<histogram_value
> visited_hists
;
565 FOR_EACH_BB_FN (bb
, cfun
)
566 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
568 gimple
*stmt
= gsi_stmt (gsi
);
570 for (hist
= gimple_histogram_value (cfun
, stmt
); hist
;
571 hist
= hist
->hvalue
.next
)
573 if (hist
->hvalue
.stmt
!= stmt
)
575 error ("Histogram value statement does not correspond to "
576 "the statement it is associated with");
577 debug_gimple_stmt (stmt
);
578 dump_histogram_value (stderr
, hist
);
581 visited_hists
.add (hist
);
584 if (VALUE_HISTOGRAMS (cfun
))
585 htab_traverse (VALUE_HISTOGRAMS (cfun
), visit_hist
, &visited_hists
);
587 internal_error ("verify_histograms failed");
590 /* Helper function for verify_histograms. For each histogram reachable via htab
591 walk verify that it was reached via statement walk. */
594 free_hist (void **slot
, void *data ATTRIBUTE_UNUSED
)
596 histogram_value hist
= *(histogram_value
*) slot
;
597 free (hist
->hvalue
.counters
);
598 #ifdef ENABLE_CHECKING
599 memset (hist
, 0xab, sizeof (*hist
));
606 free_histograms (void)
608 if (VALUE_HISTOGRAMS (cfun
))
610 htab_traverse (VALUE_HISTOGRAMS (cfun
), free_hist
, NULL
);
611 htab_delete (VALUE_HISTOGRAMS (cfun
));
612 VALUE_HISTOGRAMS (cfun
) = NULL
;
616 /* The overall number of invocations of the counter should match
617 execution count of basic block. Report it as error rather than
618 internal error as it might mean that user has misused the profile
622 check_counter (gimple
*stmt
, const char * name
,
623 gcov_type
*count
, gcov_type
*all
, gcov_type bb_count
)
625 if (*all
!= bb_count
|| *count
> *all
)
628 locus
= (stmt
!= NULL
)
629 ? gimple_location (stmt
)
630 : DECL_SOURCE_LOCATION (current_function_decl
);
631 if (flag_profile_correction
)
633 if (dump_enabled_p ())
634 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
635 "correcting inconsistent value profile: %s "
636 "profiler overall count (%d) does not match BB "
637 "count (%d)\n", name
, (int)*all
, (int)bb_count
);
645 error_at (locus
, "corrupted value profile: %s "
646 "profile counter (%d out of %d) inconsistent with "
647 "basic-block count (%d)",
659 /* GIMPLE based transformations. */
662 gimple_value_profile_transformations (void)
665 gimple_stmt_iterator gsi
;
666 bool changed
= false;
667 FOR_EACH_BB_FN (bb
, cfun
)
669 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
671 gimple
*stmt
= gsi_stmt (gsi
);
672 histogram_value th
= gimple_histogram_value (cfun
, stmt
);
678 fprintf (dump_file
, "Trying transformations on stmt ");
679 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
680 dump_histograms_for_stmt (cfun
, dump_file
, stmt
);
683 /* Transformations: */
684 /* The order of things in this conditional controls which
685 transformation is used when more than one is applicable. */
686 /* It is expected that any code added by the transformations
687 will be added before the current statement, and that the
688 current statement remain valid (although possibly
689 modified) upon return. */
690 if (gimple_mod_subtract_transform (&gsi
)
691 || gimple_divmod_fixed_value_transform (&gsi
)
692 || gimple_mod_pow2_value_transform (&gsi
)
693 || gimple_stringops_transform (&gsi
)
694 || gimple_ic_transform (&gsi
))
696 stmt
= gsi_stmt (gsi
);
698 /* Original statement may no longer be in the same block. */
699 if (bb
!= gimple_bb (stmt
))
701 bb
= gimple_bb (stmt
);
702 gsi
= gsi_for_stmt (stmt
);
716 /* Generate code for transformation 1 (with parent gimple assignment
717 STMT and probability of taking the optimal path PROB, which is
718 equivalent to COUNT/ALL within roundoff error). This generates the
719 result into a temp and returns the temp; it does not replace or
720 alter the original STMT. */
723 gimple_divmod_fixed_value (gassign
*stmt
, tree value
, int prob
,
724 gcov_type count
, gcov_type all
)
726 gassign
*stmt1
, *stmt2
;
728 tree tmp0
, tmp1
, tmp2
;
729 gimple
*bb1end
, *bb2end
, *bb3end
;
730 basic_block bb
, bb2
, bb3
, bb4
;
731 tree optype
, op1
, op2
;
732 edge e12
, e13
, e23
, e24
, e34
;
733 gimple_stmt_iterator gsi
;
735 gcc_assert (is_gimple_assign (stmt
)
736 && (gimple_assign_rhs_code (stmt
) == TRUNC_DIV_EXPR
737 || gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
));
739 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
740 op1
= gimple_assign_rhs1 (stmt
);
741 op2
= gimple_assign_rhs2 (stmt
);
743 bb
= gimple_bb (stmt
);
744 gsi
= gsi_for_stmt (stmt
);
746 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
747 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
748 stmt1
= gimple_build_assign (tmp0
, fold_convert (optype
, value
));
749 stmt2
= gimple_build_assign (tmp1
, op2
);
750 stmt3
= gimple_build_cond (NE_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
751 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
752 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
753 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
756 tmp2
= create_tmp_reg (optype
, "PROF");
757 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, tmp0
);
758 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
761 stmt1
= gimple_build_assign (tmp2
, gimple_assign_rhs_code (stmt
), op1
, op2
);
762 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
766 /* Edge e23 connects bb2 to bb3, etc. */
767 e12
= split_block (bb
, bb1end
);
770 e23
= split_block (bb2
, bb2end
);
772 bb3
->count
= all
- count
;
773 e34
= split_block (bb3
, bb3end
);
777 e12
->flags
&= ~EDGE_FALLTHRU
;
778 e12
->flags
|= EDGE_FALSE_VALUE
;
779 e12
->probability
= prob
;
782 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
783 e13
->probability
= REG_BR_PROB_BASE
- prob
;
784 e13
->count
= all
- count
;
788 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
789 e24
->probability
= REG_BR_PROB_BASE
;
792 e34
->probability
= REG_BR_PROB_BASE
;
793 e34
->count
= all
- count
;
798 /* Do transform 1) on INSN if applicable. */
801 gimple_divmod_fixed_value_transform (gimple_stmt_iterator
*si
)
803 histogram_value histogram
;
805 gcov_type val
, count
, all
;
806 tree result
, value
, tree_val
;
810 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
814 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt
))))
817 code
= gimple_assign_rhs_code (stmt
);
819 if (code
!= TRUNC_DIV_EXPR
&& code
!= TRUNC_MOD_EXPR
)
822 histogram
= gimple_histogram_value_of_type (cfun
, stmt
,
823 HIST_TYPE_SINGLE_VALUE
);
827 value
= histogram
->hvalue
.value
;
828 val
= histogram
->hvalue
.counters
[0];
829 count
= histogram
->hvalue
.counters
[1];
830 all
= histogram
->hvalue
.counters
[2];
831 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
833 /* We require that count is at least half of all; this means
834 that for the transformation to fire the value must be constant
835 at least 50% of time (and 75% gives the guarantee of usage). */
836 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
838 || optimize_bb_for_size_p (gimple_bb (stmt
)))
841 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
844 /* Compute probability of taking the optimal path. */
846 prob
= GCOV_COMPUTE_SCALE (count
, all
);
850 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
851 tree_val
= build_int_cst (get_gcov_type (), val
);
855 a
[0] = (unsigned HOST_WIDE_INT
) val
;
856 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
858 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
859 TYPE_PRECISION (get_gcov_type ()), false));
861 result
= gimple_divmod_fixed_value (stmt
, tree_val
, prob
, count
, all
);
865 fprintf (dump_file
, "Div/mod by constant ");
866 print_generic_expr (dump_file
, value
, TDF_SLIM
);
867 fprintf (dump_file
, "=");
868 print_generic_expr (dump_file
, tree_val
, TDF_SLIM
);
869 fprintf (dump_file
, " transformation on insn ");
870 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
873 gimple_assign_set_rhs_from_tree (si
, result
);
874 update_stmt (gsi_stmt (*si
));
879 /* Generate code for transformation 2 (with parent gimple assign STMT and
880 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
881 within roundoff error). This generates the result into a temp and returns
882 the temp; it does not replace or alter the original STMT. */
885 gimple_mod_pow2 (gassign
*stmt
, int prob
, gcov_type count
, gcov_type all
)
887 gassign
*stmt1
, *stmt2
, *stmt3
;
890 gimple
*bb1end
, *bb2end
, *bb3end
;
891 basic_block bb
, bb2
, bb3
, bb4
;
892 tree optype
, op1
, op2
;
893 edge e12
, e13
, e23
, e24
, e34
;
894 gimple_stmt_iterator gsi
;
897 gcc_assert (is_gimple_assign (stmt
)
898 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
900 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
901 op1
= gimple_assign_rhs1 (stmt
);
902 op2
= gimple_assign_rhs2 (stmt
);
904 bb
= gimple_bb (stmt
);
905 gsi
= gsi_for_stmt (stmt
);
907 result
= create_tmp_reg (optype
, "PROF");
908 tmp2
= make_temp_ssa_name (optype
, NULL
, "PROF");
909 tmp3
= make_temp_ssa_name (optype
, NULL
, "PROF");
910 stmt2
= gimple_build_assign (tmp2
, PLUS_EXPR
, op2
,
911 build_int_cst (optype
, -1));
912 stmt3
= gimple_build_assign (tmp3
, BIT_AND_EXPR
, tmp2
, op2
);
913 stmt4
= gimple_build_cond (NE_EXPR
, tmp3
, build_int_cst (optype
, 0),
914 NULL_TREE
, NULL_TREE
);
915 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
916 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
917 gsi_insert_before (&gsi
, stmt4
, GSI_SAME_STMT
);
920 /* tmp2 == op2-1 inherited from previous block. */
921 stmt1
= gimple_build_assign (result
, BIT_AND_EXPR
, op1
, tmp2
);
922 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
925 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
927 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
931 /* Edge e23 connects bb2 to bb3, etc. */
932 e12
= split_block (bb
, bb1end
);
935 e23
= split_block (bb2
, bb2end
);
937 bb3
->count
= all
- count
;
938 e34
= split_block (bb3
, bb3end
);
942 e12
->flags
&= ~EDGE_FALLTHRU
;
943 e12
->flags
|= EDGE_FALSE_VALUE
;
944 e12
->probability
= prob
;
947 e13
= make_edge (bb
, bb3
, EDGE_TRUE_VALUE
);
948 e13
->probability
= REG_BR_PROB_BASE
- prob
;
949 e13
->count
= all
- count
;
953 e24
= make_edge (bb2
, bb4
, EDGE_FALLTHRU
);
954 e24
->probability
= REG_BR_PROB_BASE
;
957 e34
->probability
= REG_BR_PROB_BASE
;
958 e34
->count
= all
- count
;
963 /* Do transform 2) on INSN if applicable. */
966 gimple_mod_pow2_value_transform (gimple_stmt_iterator
*si
)
968 histogram_value histogram
;
970 gcov_type count
, wrong_values
, all
;
971 tree lhs_type
, result
, value
;
975 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
979 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
980 if (!INTEGRAL_TYPE_P (lhs_type
))
983 code
= gimple_assign_rhs_code (stmt
);
985 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
988 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_POW2
);
992 value
= histogram
->hvalue
.value
;
993 wrong_values
= histogram
->hvalue
.counters
[0];
994 count
= histogram
->hvalue
.counters
[1];
996 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
998 /* We require that we hit a power of 2 at least half of all evaluations. */
999 if (simple_cst_equal (gimple_assign_rhs2 (stmt
), value
) != 1
1000 || count
< wrong_values
1001 || optimize_bb_for_size_p (gimple_bb (stmt
)))
1006 fprintf (dump_file
, "Mod power of 2 transformation on insn ");
1007 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1010 /* Compute probability of taking the optimal path. */
1011 all
= count
+ wrong_values
;
1013 if (check_counter (stmt
, "pow2", &count
, &all
, gimple_bb (stmt
)->count
))
1017 prob
= GCOV_COMPUTE_SCALE (count
, all
);
1021 result
= gimple_mod_pow2 (stmt
, prob
, count
, all
);
1023 gimple_assign_set_rhs_from_tree (si
, result
);
1024 update_stmt (gsi_stmt (*si
));
1029 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
1030 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
1031 supported and this is built into this interface. The probabilities of taking
1032 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
1033 COUNT2/ALL respectively within roundoff error). This generates the
1034 result into a temp and returns the temp; it does not replace or alter
1035 the original STMT. */
1036 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1039 gimple_mod_subtract (gassign
*stmt
, int prob1
, int prob2
, int ncounts
,
1040 gcov_type count1
, gcov_type count2
, gcov_type all
)
1046 gimple
*bb1end
, *bb2end
= NULL
, *bb3end
;
1047 basic_block bb
, bb2
, bb3
, bb4
;
1048 tree optype
, op1
, op2
;
1049 edge e12
, e23
= 0, e24
, e34
, e14
;
1050 gimple_stmt_iterator gsi
;
1053 gcc_assert (is_gimple_assign (stmt
)
1054 && gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
);
1056 optype
= TREE_TYPE (gimple_assign_lhs (stmt
));
1057 op1
= gimple_assign_rhs1 (stmt
);
1058 op2
= gimple_assign_rhs2 (stmt
);
1060 bb
= gimple_bb (stmt
);
1061 gsi
= gsi_for_stmt (stmt
);
1063 result
= create_tmp_reg (optype
, "PROF");
1064 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1065 stmt1
= gimple_build_assign (result
, op1
);
1066 stmt2
= gimple_build_assign (tmp1
, op2
);
1067 stmt3
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1068 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1069 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1070 gsi_insert_before (&gsi
, stmt3
, GSI_SAME_STMT
);
1073 if (ncounts
) /* Assumed to be 0 or 1 */
1075 stmt1
= gimple_build_assign (result
, MINUS_EXPR
, result
, tmp1
);
1076 stmt2
= gimple_build_cond (LT_EXPR
, result
, tmp1
, NULL_TREE
, NULL_TREE
);
1077 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1078 gsi_insert_before (&gsi
, stmt2
, GSI_SAME_STMT
);
1082 /* Fallback case. */
1083 stmt1
= gimple_build_assign (result
, gimple_assign_rhs_code (stmt
),
1085 gsi_insert_before (&gsi
, stmt1
, GSI_SAME_STMT
);
1089 /* Edge e23 connects bb2 to bb3, etc. */
1090 /* However block 3 is optional; if it is not there, references
1091 to 3 really refer to block 2. */
1092 e12
= split_block (bb
, bb1end
);
1094 bb2
->count
= all
- count1
;
1096 if (ncounts
) /* Assumed to be 0 or 1. */
1098 e23
= split_block (bb2
, bb2end
);
1100 bb3
->count
= all
- count1
- count2
;
1103 e34
= split_block (ncounts
? bb3
: bb2
, bb3end
);
1107 e12
->flags
&= ~EDGE_FALLTHRU
;
1108 e12
->flags
|= EDGE_FALSE_VALUE
;
1109 e12
->probability
= REG_BR_PROB_BASE
- prob1
;
1110 e12
->count
= all
- count1
;
1112 e14
= make_edge (bb
, bb4
, EDGE_TRUE_VALUE
);
1113 e14
->probability
= prob1
;
1114 e14
->count
= count1
;
1116 if (ncounts
) /* Assumed to be 0 or 1. */
1118 e23
->flags
&= ~EDGE_FALLTHRU
;
1119 e23
->flags
|= EDGE_FALSE_VALUE
;
1120 e23
->count
= all
- count1
- count2
;
1121 e23
->probability
= REG_BR_PROB_BASE
- prob2
;
1123 e24
= make_edge (bb2
, bb4
, EDGE_TRUE_VALUE
);
1124 e24
->probability
= prob2
;
1125 e24
->count
= count2
;
1128 e34
->probability
= REG_BR_PROB_BASE
;
1129 e34
->count
= all
- count1
- count2
;
1134 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1137 gimple_mod_subtract_transform (gimple_stmt_iterator
*si
)
1139 histogram_value histogram
;
1140 enum tree_code code
;
1141 gcov_type count
, wrong_values
, all
;
1142 tree lhs_type
, result
;
1143 gcov_type prob1
, prob2
;
1144 unsigned int i
, steps
;
1145 gcov_type count1
, count2
;
1147 stmt
= dyn_cast
<gassign
*> (gsi_stmt (*si
));
1151 lhs_type
= TREE_TYPE (gimple_assign_lhs (stmt
));
1152 if (!INTEGRAL_TYPE_P (lhs_type
))
1155 code
= gimple_assign_rhs_code (stmt
);
1157 if (code
!= TRUNC_MOD_EXPR
|| !TYPE_UNSIGNED (lhs_type
))
1160 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INTERVAL
);
1166 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1167 all
+= histogram
->hvalue
.counters
[i
];
1169 wrong_values
+= histogram
->hvalue
.counters
[i
];
1170 wrong_values
+= histogram
->hvalue
.counters
[i
+1];
1171 steps
= histogram
->hdata
.intvl
.steps
;
1172 all
+= wrong_values
;
1173 count1
= histogram
->hvalue
.counters
[0];
1174 count2
= histogram
->hvalue
.counters
[1];
1176 /* Compute probability of taking the optimal path. */
1177 if (check_counter (stmt
, "interval", &count1
, &all
, gimple_bb (stmt
)->count
))
1179 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1183 if (flag_profile_correction
&& count1
+ count2
> all
)
1184 all
= count1
+ count2
;
1186 gcc_assert (count1
+ count2
<= all
);
1188 /* We require that we use just subtractions in at least 50% of all
1191 for (i
= 0; i
< histogram
->hdata
.intvl
.steps
; i
++)
1193 count
+= histogram
->hvalue
.counters
[i
];
1194 if (count
* 2 >= all
)
1198 || optimize_bb_for_size_p (gimple_bb (stmt
)))
1201 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1204 fprintf (dump_file
, "Mod subtract transformation on insn ");
1205 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1208 /* Compute probability of taking the optimal path(s). */
1211 prob1
= GCOV_COMPUTE_SCALE (count1
, all
);
1212 prob2
= GCOV_COMPUTE_SCALE (count2
, all
);
1219 /* In practice, "steps" is always 2. This interface reflects this,
1220 and will need to be changed if "steps" can change. */
1221 result
= gimple_mod_subtract (stmt
, prob1
, prob2
, i
, count1
, count2
, all
);
1223 gimple_assign_set_rhs_from_tree (si
, result
);
1224 update_stmt (gsi_stmt (*si
));
1229 typedef int_hash
<unsigned int, 0, UINT_MAX
> profile_id_hash
;
1231 static hash_map
<profile_id_hash
, cgraph_node
*> *cgraph_node_map
= 0;
1233 /* Returns true if node graph is initialized. This
1234 is used to test if profile_id has been created
1235 for cgraph_nodes. */
1238 coverage_node_map_initialized_p (void)
1240 return cgraph_node_map
!= 0;
1243 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1244 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1245 that the PROFILE_IDs was already assigned. */
1248 init_node_map (bool local
)
1250 struct cgraph_node
*n
;
1251 cgraph_node_map
= new hash_map
<profile_id_hash
, cgraph_node
*>;
1253 FOR_EACH_DEFINED_FUNCTION (n
)
1254 if (n
->has_gimple_body_p ())
1259 n
->profile_id
= coverage_compute_profile_id (n
);
1260 while ((val
= cgraph_node_map
->get (n
->profile_id
))
1264 fprintf (dump_file
, "Local profile-id %i conflict"
1265 " with nodes %s/%i %s/%i\n",
1271 n
->profile_id
= (n
->profile_id
+ 1) & 0x7fffffff;
1274 else if (!n
->profile_id
)
1278 "Node %s/%i has no profile-id"
1279 " (profile feedback missing?)\n",
1284 else if ((val
= cgraph_node_map
->get (n
->profile_id
)))
1288 "Node %s/%i has IP profile-id %i conflict. "
1296 cgraph_node_map
->put (n
->profile_id
, n
);
1300 /* Delete the CGRAPH_NODE_MAP. */
1305 delete cgraph_node_map
;
1308 /* Return cgraph node for function with pid */
1311 find_func_by_profile_id (int profile_id
)
1313 cgraph_node
**val
= cgraph_node_map
->get (profile_id
);
1320 /* Perform sanity check on the indirect call target. Due to race conditions,
1321 false function target may be attributed to an indirect call site. If the
1322 call expression type mismatches with the target function's type, expand_call
1323 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1324 Returns true if TARGET is considered ok for call CALL_STMT. */
1327 check_ic_target (gcall
*call_stmt
, struct cgraph_node
*target
)
1330 if (gimple_check_call_matching_types (call_stmt
, target
->decl
, true))
1333 locus
= gimple_location (call_stmt
);
1334 if (dump_enabled_p ())
1335 dump_printf_loc (MSG_MISSED_OPTIMIZATION
, locus
,
1336 "Skipping target %s with mismatching types for icall\n",
1341 /* Do transformation
1343 if (actual_callee_address == address_of_most_common_function/method)
1350 gimple_ic (gcall
*icall_stmt
, struct cgraph_node
*direct_call
,
1351 int prob
, gcov_type count
, gcov_type all
)
1356 gcall
*iretbnd_stmt
= NULL
;
1357 tree tmp0
, tmp1
, tmp
;
1358 basic_block cond_bb
, dcall_bb
, icall_bb
, join_bb
= NULL
;
1359 tree optype
= build_pointer_type (void_type_node
);
1360 edge e_cd
, e_ci
, e_di
, e_dj
= NULL
, e_ij
;
1361 gimple_stmt_iterator gsi
;
1365 gimple_stmt_iterator psi
;
1367 cond_bb
= gimple_bb (icall_stmt
);
1368 gsi
= gsi_for_stmt (icall_stmt
);
1370 if (gimple_call_with_bounds_p (icall_stmt
) && gimple_call_lhs (icall_stmt
))
1371 iretbnd_stmt
= chkp_retbnd_call_by_val (gimple_call_lhs (icall_stmt
));
1373 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1374 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1375 tmp
= unshare_expr (gimple_call_fn (icall_stmt
));
1376 load_stmt
= gimple_build_assign (tmp0
, tmp
);
1377 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1379 tmp
= fold_convert (optype
, build_addr (direct_call
->decl
,
1380 current_function_decl
));
1381 load_stmt
= gimple_build_assign (tmp1
, tmp
);
1382 gsi_insert_before (&gsi
, load_stmt
, GSI_SAME_STMT
);
1384 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1385 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1387 gimple_set_vdef (icall_stmt
, NULL_TREE
);
1388 gimple_set_vuse (icall_stmt
, NULL_TREE
);
1389 update_stmt (icall_stmt
);
1390 dcall_stmt
= as_a
<gcall
*> (gimple_copy (icall_stmt
));
1391 gimple_call_set_fndecl (dcall_stmt
, direct_call
->decl
);
1392 dflags
= flags_from_decl_or_type (direct_call
->decl
);
1393 if ((dflags
& ECF_NORETURN
) != 0)
1394 gimple_call_set_lhs (dcall_stmt
, NULL_TREE
);
1395 gsi_insert_before (&gsi
, dcall_stmt
, GSI_SAME_STMT
);
1398 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1399 e_cd
= split_block (cond_bb
, cond_stmt
);
1400 dcall_bb
= e_cd
->dest
;
1401 dcall_bb
->count
= count
;
1403 e_di
= split_block (dcall_bb
, dcall_stmt
);
1404 icall_bb
= e_di
->dest
;
1405 icall_bb
->count
= all
- count
;
1407 /* Do not disturb existing EH edges from the indirect call. */
1408 if (!stmt_ends_bb_p (icall_stmt
))
1409 e_ij
= split_block (icall_bb
, icall_stmt
);
1412 e_ij
= find_fallthru_edge (icall_bb
->succs
);
1413 /* The indirect call might be noreturn. */
1416 e_ij
->probability
= REG_BR_PROB_BASE
;
1417 e_ij
->count
= all
- count
;
1418 e_ij
= single_pred_edge (split_edge (e_ij
));
1423 join_bb
= e_ij
->dest
;
1424 join_bb
->count
= all
;
1427 e_cd
->flags
= (e_cd
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1428 e_cd
->probability
= prob
;
1429 e_cd
->count
= count
;
1431 e_ci
= make_edge (cond_bb
, icall_bb
, EDGE_FALSE_VALUE
);
1432 e_ci
->probability
= REG_BR_PROB_BASE
- prob
;
1433 e_ci
->count
= all
- count
;
1439 if ((dflags
& ECF_NORETURN
) != 0)
1443 e_dj
= make_edge (dcall_bb
, join_bb
, EDGE_FALLTHRU
);
1444 e_dj
->probability
= REG_BR_PROB_BASE
;
1445 e_dj
->count
= count
;
1447 e_ij
->count
= all
- count
;
1449 e_ij
->probability
= REG_BR_PROB_BASE
;
1452 /* Insert PHI node for the call result if necessary. */
1453 if (gimple_call_lhs (icall_stmt
)
1454 && TREE_CODE (gimple_call_lhs (icall_stmt
)) == SSA_NAME
1455 && (dflags
& ECF_NORETURN
) == 0)
1457 tree result
= gimple_call_lhs (icall_stmt
);
1458 gphi
*phi
= create_phi_node (result
, join_bb
);
1459 gimple_call_set_lhs (icall_stmt
,
1460 duplicate_ssa_name (result
, icall_stmt
));
1461 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1462 gimple_call_set_lhs (dcall_stmt
,
1463 duplicate_ssa_name (result
, dcall_stmt
));
1464 add_phi_arg (phi
, gimple_call_lhs (dcall_stmt
), e_dj
, UNKNOWN_LOCATION
);
1466 /* If indirect call has following BUILT_IN_CHKP_BNDRET
1467 call then we need to make it's copy for the direct
1471 if (gimple_call_lhs (iretbnd_stmt
))
1475 gimple_set_vdef (iretbnd_stmt
, NULL_TREE
);
1476 gimple_set_vuse (iretbnd_stmt
, NULL_TREE
);
1477 update_stmt (iretbnd_stmt
);
1479 result
= gimple_call_lhs (iretbnd_stmt
);
1480 phi
= create_phi_node (result
, join_bb
);
1482 copy
= gimple_copy (iretbnd_stmt
);
1483 gimple_call_set_arg (copy
, 0,
1484 gimple_call_lhs (dcall_stmt
));
1485 gimple_call_set_lhs (copy
, duplicate_ssa_name (result
, copy
));
1486 gsi_insert_on_edge (e_dj
, copy
);
1487 add_phi_arg (phi
, gimple_call_lhs (copy
),
1488 e_dj
, UNKNOWN_LOCATION
);
1490 gimple_call_set_arg (iretbnd_stmt
, 0,
1491 gimple_call_lhs (icall_stmt
));
1492 gimple_call_set_lhs (iretbnd_stmt
,
1493 duplicate_ssa_name (result
, iretbnd_stmt
));
1494 psi
= gsi_for_stmt (iretbnd_stmt
);
1495 gsi_remove (&psi
, false);
1496 gsi_insert_on_edge (e_ij
, iretbnd_stmt
);
1497 add_phi_arg (phi
, gimple_call_lhs (iretbnd_stmt
),
1498 e_ij
, UNKNOWN_LOCATION
);
1500 gsi_commit_one_edge_insert (e_dj
, NULL
);
1501 gsi_commit_one_edge_insert (e_ij
, NULL
);
1505 psi
= gsi_for_stmt (iretbnd_stmt
);
1506 gsi_remove (&psi
, true);
1511 /* Build an EH edge for the direct call if necessary. */
1512 lp_nr
= lookup_stmt_eh_lp (icall_stmt
);
1513 if (lp_nr
> 0 && stmt_could_throw_p (dcall_stmt
))
1515 add_stmt_to_eh_lp (dcall_stmt
, lp_nr
);
1518 FOR_EACH_EDGE (e_eh
, ei
, icall_bb
->succs
)
1519 if (e_eh
->flags
& (EDGE_EH
| EDGE_ABNORMAL
))
1521 e
= make_edge (dcall_bb
, e_eh
->dest
, e_eh
->flags
);
1522 for (gphi_iterator psi
= gsi_start_phis (e_eh
->dest
);
1523 !gsi_end_p (psi
); gsi_next (&psi
))
1525 gphi
*phi
= psi
.phi ();
1526 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi
, e
),
1527 PHI_ARG_DEF_FROM_EDGE (phi
, e_eh
));
1530 if (!stmt_could_throw_p (dcall_stmt
))
1531 gimple_purge_dead_eh_edges (dcall_bb
);
1536 For every checked indirect/virtual call determine if most common pid of
1537 function/class method has probability more than 50%. If yes modify code of
1542 gimple_ic_transform (gimple_stmt_iterator
*gsi
)
1545 histogram_value histogram
;
1546 gcov_type val
, count
, all
, bb_all
;
1547 struct cgraph_node
*direct_call
;
1549 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1553 if (gimple_call_fndecl (stmt
) != NULL_TREE
)
1556 if (gimple_call_internal_p (stmt
))
1559 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_INDIR_CALL
);
1563 val
= histogram
->hvalue
.counters
[0];
1564 count
= histogram
->hvalue
.counters
[1];
1565 all
= histogram
->hvalue
.counters
[2];
1567 bb_all
= gimple_bb (stmt
)->count
;
1568 /* The order of CHECK_COUNTER calls is important -
1569 since check_counter can correct the third parameter
1570 and we want to make count <= all <= bb_all. */
1571 if ( check_counter (stmt
, "ic", &all
, &bb_all
, bb_all
)
1572 || check_counter (stmt
, "ic", &count
, &all
, all
))
1574 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1578 if (4 * count
<= 3 * all
)
1581 direct_call
= find_func_by_profile_id ((int)val
);
1583 if (direct_call
== NULL
)
1589 fprintf (dump_file
, "Indirect call -> direct call from other module");
1590 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1591 fprintf (dump_file
, "=> %i (will resolve only with LTO)\n", (int)val
);
1597 if (!check_ic_target (stmt
, direct_call
))
1601 fprintf (dump_file
, "Indirect call -> direct call ");
1602 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1603 fprintf (dump_file
, "=> ");
1604 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1605 fprintf (dump_file
, " transformation skipped because of type mismatch");
1606 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1608 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1614 fprintf (dump_file
, "Indirect call -> direct call ");
1615 print_generic_expr (dump_file
, gimple_call_fn (stmt
), TDF_SLIM
);
1616 fprintf (dump_file
, "=> ");
1617 print_generic_expr (dump_file
, direct_call
->decl
, TDF_SLIM
);
1618 fprintf (dump_file
, " transformation on insn postponned to ipa-profile");
1619 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1620 fprintf (dump_file
, "hist->count %" PRId64
1621 " hist->all %" PRId64
"\n", count
, all
);
1627 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1628 set to the argument index for the size of the string operation. */
1631 interesting_stringop_to_profile_p (gcall
*call
, int *size_arg
)
1633 enum built_in_function fcode
;
1635 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (call
));
1636 if (fcode
!= BUILT_IN_MEMCPY
&& fcode
!= BUILT_IN_MEMPCPY
1637 && fcode
!= BUILT_IN_MEMSET
&& fcode
!= BUILT_IN_BZERO
)
1642 case BUILT_IN_MEMCPY
:
1643 case BUILT_IN_MEMPCPY
:
1645 return validate_gimple_arglist (call
, POINTER_TYPE
, POINTER_TYPE
,
1646 INTEGER_TYPE
, VOID_TYPE
);
1647 case BUILT_IN_MEMSET
:
1649 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1650 INTEGER_TYPE
, VOID_TYPE
);
1651 case BUILT_IN_BZERO
:
1653 return validate_gimple_arglist (call
, POINTER_TYPE
, INTEGER_TYPE
,
1660 /* Convert stringop (..., vcall_size)
1662 if (vcall_size == icall_size)
1663 stringop (..., icall_size);
1665 stringop (..., vcall_size);
1666 assuming we'll propagate a true constant into ICALL_SIZE later. */
1669 gimple_stringop_fixed_value (gcall
*vcall_stmt
, tree icall_size
, int prob
,
1670 gcov_type count
, gcov_type all
)
1675 tree tmp0
, tmp1
, vcall_size
, optype
;
1676 basic_block cond_bb
, icall_bb
, vcall_bb
, join_bb
;
1677 edge e_ci
, e_cv
, e_iv
, e_ij
, e_vj
;
1678 gimple_stmt_iterator gsi
;
1681 if (!interesting_stringop_to_profile_p (vcall_stmt
, &size_arg
))
1684 cond_bb
= gimple_bb (vcall_stmt
);
1685 gsi
= gsi_for_stmt (vcall_stmt
);
1687 vcall_size
= gimple_call_arg (vcall_stmt
, size_arg
);
1688 optype
= TREE_TYPE (vcall_size
);
1690 tmp0
= make_temp_ssa_name (optype
, NULL
, "PROF");
1691 tmp1
= make_temp_ssa_name (optype
, NULL
, "PROF");
1692 tmp_stmt
= gimple_build_assign (tmp0
, fold_convert (optype
, icall_size
));
1693 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1695 tmp_stmt
= gimple_build_assign (tmp1
, vcall_size
);
1696 gsi_insert_before (&gsi
, tmp_stmt
, GSI_SAME_STMT
);
1698 cond_stmt
= gimple_build_cond (EQ_EXPR
, tmp1
, tmp0
, NULL_TREE
, NULL_TREE
);
1699 gsi_insert_before (&gsi
, cond_stmt
, GSI_SAME_STMT
);
1701 gimple_set_vdef (vcall_stmt
, NULL
);
1702 gimple_set_vuse (vcall_stmt
, NULL
);
1703 update_stmt (vcall_stmt
);
1704 icall_stmt
= as_a
<gcall
*> (gimple_copy (vcall_stmt
));
1705 gimple_call_set_arg (icall_stmt
, size_arg
, icall_size
);
1706 gsi_insert_before (&gsi
, icall_stmt
, GSI_SAME_STMT
);
1709 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1710 e_ci
= split_block (cond_bb
, cond_stmt
);
1711 icall_bb
= e_ci
->dest
;
1712 icall_bb
->count
= count
;
1714 e_iv
= split_block (icall_bb
, icall_stmt
);
1715 vcall_bb
= e_iv
->dest
;
1716 vcall_bb
->count
= all
- count
;
1718 e_vj
= split_block (vcall_bb
, vcall_stmt
);
1719 join_bb
= e_vj
->dest
;
1720 join_bb
->count
= all
;
1722 e_ci
->flags
= (e_ci
->flags
& ~EDGE_FALLTHRU
) | EDGE_TRUE_VALUE
;
1723 e_ci
->probability
= prob
;
1724 e_ci
->count
= count
;
1726 e_cv
= make_edge (cond_bb
, vcall_bb
, EDGE_FALSE_VALUE
);
1727 e_cv
->probability
= REG_BR_PROB_BASE
- prob
;
1728 e_cv
->count
= all
- count
;
1732 e_ij
= make_edge (icall_bb
, join_bb
, EDGE_FALLTHRU
);
1733 e_ij
->probability
= REG_BR_PROB_BASE
;
1734 e_ij
->count
= count
;
1736 e_vj
->probability
= REG_BR_PROB_BASE
;
1737 e_vj
->count
= all
- count
;
1739 /* Insert PHI node for the call result if necessary. */
1740 if (gimple_call_lhs (vcall_stmt
)
1741 && TREE_CODE (gimple_call_lhs (vcall_stmt
)) == SSA_NAME
)
1743 tree result
= gimple_call_lhs (vcall_stmt
);
1744 gphi
*phi
= create_phi_node (result
, join_bb
);
1745 gimple_call_set_lhs (vcall_stmt
,
1746 duplicate_ssa_name (result
, vcall_stmt
));
1747 add_phi_arg (phi
, gimple_call_lhs (vcall_stmt
), e_vj
, UNKNOWN_LOCATION
);
1748 gimple_call_set_lhs (icall_stmt
,
1749 duplicate_ssa_name (result
, icall_stmt
));
1750 add_phi_arg (phi
, gimple_call_lhs (icall_stmt
), e_ij
, UNKNOWN_LOCATION
);
1753 /* Because these are all string op builtins, they're all nothrow. */
1754 gcc_assert (!stmt_could_throw_p (vcall_stmt
));
1755 gcc_assert (!stmt_could_throw_p (icall_stmt
));
1758 /* Find values inside STMT for that we want to measure histograms for
1759 division/modulo optimization. */
1762 gimple_stringops_transform (gimple_stmt_iterator
*gsi
)
1766 enum built_in_function fcode
;
1767 histogram_value histogram
;
1768 gcov_type count
, all
, val
;
1770 unsigned int dest_align
, src_align
;
1775 stmt
= dyn_cast
<gcall
*> (gsi_stmt (*gsi
));
1779 if (!gimple_call_builtin_p (gsi_stmt (*gsi
), BUILT_IN_NORMAL
))
1782 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
1785 blck_size
= gimple_call_arg (stmt
, size_arg
);
1786 if (TREE_CODE (blck_size
) == INTEGER_CST
)
1789 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_SINGLE_VALUE
);
1793 val
= histogram
->hvalue
.counters
[0];
1794 count
= histogram
->hvalue
.counters
[1];
1795 all
= histogram
->hvalue
.counters
[2];
1796 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1798 /* We require that count is at least half of all; this means
1799 that for the transformation to fire the value must be constant
1800 at least 80% of time. */
1801 if ((6 * count
/ 5) < all
|| optimize_bb_for_size_p (gimple_bb (stmt
)))
1803 if (check_counter (stmt
, "value", &count
, &all
, gimple_bb (stmt
)->count
))
1806 prob
= GCOV_COMPUTE_SCALE (count
, all
);
1810 dest
= gimple_call_arg (stmt
, 0);
1811 dest_align
= get_pointer_alignment (dest
);
1812 fcode
= DECL_FUNCTION_CODE (gimple_call_fndecl (stmt
));
1815 case BUILT_IN_MEMCPY
:
1816 case BUILT_IN_MEMPCPY
:
1817 src
= gimple_call_arg (stmt
, 1);
1818 src_align
= get_pointer_alignment (src
);
1819 if (!can_move_by_pieces (val
, MIN (dest_align
, src_align
)))
1822 case BUILT_IN_MEMSET
:
1823 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1824 gimple_call_arg (stmt
, 1),
1828 case BUILT_IN_BZERO
:
1829 if (!can_store_by_pieces (val
, builtin_memset_read_str
,
1838 if (sizeof (gcov_type
) == sizeof (HOST_WIDE_INT
))
1839 tree_val
= build_int_cst (get_gcov_type (), val
);
1843 a
[0] = (unsigned HOST_WIDE_INT
) val
;
1844 a
[1] = val
>> (HOST_BITS_PER_WIDE_INT
- 1) >> 1;
1846 tree_val
= wide_int_to_tree (get_gcov_type (), wide_int::from_array (a
, 2,
1847 TYPE_PRECISION (get_gcov_type ()), false));
1852 fprintf (dump_file
, "Single value %i stringop transformation on ",
1854 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
1857 gimple_stringop_fixed_value (stmt
, tree_val
, prob
, count
, all
);
1863 stringop_block_profile (gimple
*stmt
, unsigned int *expected_align
,
1864 HOST_WIDE_INT
*expected_size
)
1866 histogram_value histogram
;
1867 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_AVERAGE
);
1870 *expected_size
= -1;
1871 else if (!histogram
->hvalue
.counters
[1])
1873 *expected_size
= -1;
1874 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1879 size
= ((histogram
->hvalue
.counters
[0]
1880 + histogram
->hvalue
.counters
[1] / 2)
1881 / histogram
->hvalue
.counters
[1]);
1882 /* Even if we can hold bigger value in SIZE, INT_MAX
1883 is safe "infinity" for code generation strategies. */
1886 *expected_size
= size
;
1887 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1890 histogram
= gimple_histogram_value_of_type (cfun
, stmt
, HIST_TYPE_IOR
);
1893 *expected_align
= 0;
1894 else if (!histogram
->hvalue
.counters
[0])
1896 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1897 *expected_align
= 0;
1904 count
= histogram
->hvalue
.counters
[0];
1906 while (!(count
& alignment
)
1907 && (alignment
* 2 * BITS_PER_UNIT
))
1909 *expected_align
= alignment
* BITS_PER_UNIT
;
1910 gimple_remove_histogram_value (cfun
, stmt
, histogram
);
1915 /* Find values inside STMT for that we want to measure histograms for
1916 division/modulo optimization. */
1919 gimple_divmod_values_to_profile (gimple
*stmt
, histogram_values
*values
)
1921 tree lhs
, divisor
, op0
, type
;
1922 histogram_value hist
;
1924 if (gimple_code (stmt
) != GIMPLE_ASSIGN
)
1927 lhs
= gimple_assign_lhs (stmt
);
1928 type
= TREE_TYPE (lhs
);
1929 if (!INTEGRAL_TYPE_P (type
))
1932 switch (gimple_assign_rhs_code (stmt
))
1934 case TRUNC_DIV_EXPR
:
1935 case TRUNC_MOD_EXPR
:
1936 divisor
= gimple_assign_rhs2 (stmt
);
1937 op0
= gimple_assign_rhs1 (stmt
);
1939 values
->reserve (3);
1941 if (TREE_CODE (divisor
) == SSA_NAME
)
1942 /* Check for the case where the divisor is the same value most
1944 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1945 HIST_TYPE_SINGLE_VALUE
,
1948 /* For mod, check whether it is not often a noop (or replaceable by
1949 a few subtractions). */
1950 if (gimple_assign_rhs_code (stmt
) == TRUNC_MOD_EXPR
1951 && TYPE_UNSIGNED (type
))
1954 /* Check for a special case where the divisor is power of 2. */
1955 values
->quick_push (gimple_alloc_histogram_value (cfun
,
1959 val
= build2 (TRUNC_DIV_EXPR
, type
, op0
, divisor
);
1960 hist
= gimple_alloc_histogram_value (cfun
, HIST_TYPE_INTERVAL
,
1962 hist
->hdata
.intvl
.int_start
= 0;
1963 hist
->hdata
.intvl
.steps
= 2;
1964 values
->quick_push (hist
);
1973 /* Find calls inside STMT for that we want to measure histograms for
1974 indirect/virtual call optimization. */
1977 gimple_indirect_call_to_profile (gimple
*stmt
, histogram_values
*values
)
1981 if (gimple_code (stmt
) != GIMPLE_CALL
1982 || gimple_call_internal_p (stmt
)
1983 || gimple_call_fndecl (stmt
) != NULL_TREE
)
1986 callee
= gimple_call_fn (stmt
);
1988 values
->reserve (3);
1990 values
->quick_push (gimple_alloc_histogram_value (
1992 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE
) ?
1993 HIST_TYPE_INDIR_CALL_TOPN
:
1994 HIST_TYPE_INDIR_CALL
,
2000 /* Find values inside STMT for that we want to measure histograms for
2001 string operations. */
2004 gimple_stringops_values_to_profile (gimple
*gs
, histogram_values
*values
)
2011 stmt
= dyn_cast
<gcall
*> (gs
);
2015 if (!gimple_call_builtin_p (gs
, BUILT_IN_NORMAL
))
2018 if (!interesting_stringop_to_profile_p (stmt
, &size_arg
))
2021 dest
= gimple_call_arg (stmt
, 0);
2022 blck_size
= gimple_call_arg (stmt
, size_arg
);
2024 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2026 values
->safe_push (gimple_alloc_histogram_value (cfun
,
2027 HIST_TYPE_SINGLE_VALUE
,
2029 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_AVERAGE
,
2033 if (TREE_CODE (blck_size
) != INTEGER_CST
)
2034 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_IOR
,
2038 /* Find values inside STMT for that we want to measure histograms and adds
2039 them to list VALUES. */
2042 gimple_values_to_profile (gimple
*stmt
, histogram_values
*values
)
2044 gimple_divmod_values_to_profile (stmt
, values
);
2045 gimple_stringops_values_to_profile (stmt
, values
);
2046 gimple_indirect_call_to_profile (stmt
, values
);
2050 gimple_find_values_to_profile (histogram_values
*values
)
2053 gimple_stmt_iterator gsi
;
2055 histogram_value hist
= NULL
;
2058 FOR_EACH_BB_FN (bb
, cfun
)
2059 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2060 gimple_values_to_profile (gsi_stmt (gsi
), values
);
2062 values
->safe_push (gimple_alloc_histogram_value (cfun
, HIST_TYPE_TIME_PROFILE
, 0, 0));
2064 FOR_EACH_VEC_ELT (*values
, i
, hist
)
2068 case HIST_TYPE_INTERVAL
:
2069 hist
->n_counters
= hist
->hdata
.intvl
.steps
+ 2;
2072 case HIST_TYPE_POW2
:
2073 hist
->n_counters
= 2;
2076 case HIST_TYPE_SINGLE_VALUE
:
2077 hist
->n_counters
= 3;
2080 case HIST_TYPE_CONST_DELTA
:
2081 hist
->n_counters
= 4;
2084 case HIST_TYPE_INDIR_CALL
:
2085 hist
->n_counters
= 3;
2088 case HIST_TYPE_TIME_PROFILE
:
2089 hist
->n_counters
= 1;
2092 case HIST_TYPE_AVERAGE
:
2093 hist
->n_counters
= 2;
2097 hist
->n_counters
= 1;
2100 case HIST_TYPE_INDIR_CALL_TOPN
:
2101 hist
->n_counters
= GCOV_ICALL_TOPN_NCOUNTS
;
2109 fprintf (dump_file
, "Stmt ");
2110 print_gimple_stmt (dump_file
, hist
->hvalue
.stmt
, 0, TDF_SLIM
);
2111 dump_histogram_value (dump_file
, hist
);