1 /* Transformations based on profile information for values.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
27 #include "hard-reg-set.h"
28 #include "basic-block.h"
29 #include "value-prof.h"
32 #include "insn-config.h"
37 #include "tree-flow.h"
38 #include "tree-flow-inline.h"
39 #include "diagnostic.h"
40 #include "tree-pretty-print.h"
41 #include "gimple-pretty-print.h"
47 #include "tree-pass.h"
48 #include "pointer-set.h"
50 /* In this file value profile based optimizations are placed. Currently the
51 following optimizations are implemented (for more detailed descriptions
52 see comments at value_profile_transformations):
54 1) Division/modulo specialization. Provided that we can determine that the
55 operands of the division have some special properties, we may use it to
56 produce more effective code.
57 2) Speculative prefetching. If we are able to determine that the difference
58 between addresses accessed by a memory reference is usually constant, we
59 may add the prefetch instructions.
60 FIXME: This transformation was removed together with RTL based value
63 3) Indirect/virtual call specialization. If we can determine most
64 common function callee in indirect/virtual call. We can use this
65 information to improve code effectiveness (especially info for
68 Every such optimization should add its requirements for profiled values to
69 insn_values_to_profile function. This function is called from branch_prob
70 in profile.c and the requested values are instrumented by it in the first
71 compilation with -fprofile-arcs. The optimization may then read the
72 gathered data in the second compilation with -fbranch-probabilities.
74 The measured data is pointed to from the histograms
75 field of the statement annotation of the instrumented insns. It is
76 kept as a linked list of struct histogram_value_t's, which contain the
77 same information as above. */
80 static tree gimple_divmod_fixed_value (gimple, tree, int, gcov_type, gcov_type);
81 static tree gimple_mod_pow2 (gimple, int, gcov_type, gcov_type);
82 static tree gimple_mod_subtract (gimple, int, int, int, gcov_type, gcov_type,
84 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
85 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
86 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
87 static bool gimple_stringops_transform (gimple_stmt_iterator *);
88 static bool gimple_ic_transform (gimple);
90 /* Allocate histogram value. */
92 static histogram_value
93 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
94 enum hist_type type, gimple stmt, tree value)
96 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
97 hist->hvalue.value = value;
98 hist->hvalue.stmt = stmt;
103 /* Hash value for histogram. */
106 histogram_hash (const void *x)
108 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
111 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y. */
114 histogram_eq (const void *x, const void *y)
116 return ((const_histogram_value) x)->hvalue.stmt == (const_gimple) y;
119 /* Set histogram for STMT. */
122 set_histogram_value (struct function *fun, gimple stmt, histogram_value hist)
125 if (!hist && !VALUE_HISTOGRAMS (fun))
127 if (!VALUE_HISTOGRAMS (fun))
128 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
130 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
131 htab_hash_pointer (stmt),
132 hist ? INSERT : NO_INSERT);
136 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
142 /* Get histogram list for STMT. */
145 gimple_histogram_value (struct function *fun, gimple stmt)
147 if (!VALUE_HISTOGRAMS (fun))
149 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
150 htab_hash_pointer (stmt));
153 /* Add histogram for STMT. */
156 gimple_add_histogram_value (struct function *fun, gimple stmt,
157 histogram_value hist)
159 hist->hvalue.next = gimple_histogram_value (fun, stmt);
160 set_histogram_value (fun, stmt, hist);
164 /* Remove histogram HIST from STMT's histogram list. */
167 gimple_remove_histogram_value (struct function *fun, gimple stmt,
168 histogram_value hist)
170 histogram_value hist2 = gimple_histogram_value (fun, stmt);
173 set_histogram_value (fun, stmt, hist->hvalue.next);
177 while (hist2->hvalue.next != hist)
178 hist2 = hist2->hvalue.next;
179 hist2->hvalue.next = hist->hvalue.next;
181 free (hist->hvalue.counters);
182 #ifdef ENABLE_CHECKING
183 memset (hist, 0xab, sizeof (*hist));
189 /* Lookup histogram of type TYPE in the STMT. */
192 gimple_histogram_value_of_type (struct function *fun, gimple stmt,
195 histogram_value hist;
196 for (hist = gimple_histogram_value (fun, stmt); hist;
197 hist = hist->hvalue.next)
198 if (hist->type == type)
203 /* Dump information about HIST to DUMP_FILE. */
206 dump_histogram_value (FILE *dump_file, histogram_value hist)
210 case HIST_TYPE_INTERVAL:
211 fprintf (dump_file, "Interval counter range %d -- %d",
212 hist->hdata.intvl.int_start,
213 (hist->hdata.intvl.int_start
214 + hist->hdata.intvl.steps - 1));
215 if (hist->hvalue.counters)
218 fprintf(dump_file, " [");
219 for (i = 0; i < hist->hdata.intvl.steps; i++)
220 fprintf (dump_file, " %d:"HOST_WIDEST_INT_PRINT_DEC,
221 hist->hdata.intvl.int_start + i,
222 (HOST_WIDEST_INT) hist->hvalue.counters[i]);
223 fprintf (dump_file, " ] outside range:"HOST_WIDEST_INT_PRINT_DEC,
224 (HOST_WIDEST_INT) hist->hvalue.counters[i]);
226 fprintf (dump_file, ".\n");
230 fprintf (dump_file, "Pow2 counter ");
231 if (hist->hvalue.counters)
233 fprintf (dump_file, "pow2:"HOST_WIDEST_INT_PRINT_DEC
234 " nonpow2:"HOST_WIDEST_INT_PRINT_DEC,
235 (HOST_WIDEST_INT) hist->hvalue.counters[0],
236 (HOST_WIDEST_INT) hist->hvalue.counters[1]);
238 fprintf (dump_file, ".\n");
241 case HIST_TYPE_SINGLE_VALUE:
242 fprintf (dump_file, "Single value ");
243 if (hist->hvalue.counters)
245 fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
246 " match:"HOST_WIDEST_INT_PRINT_DEC
247 " wrong:"HOST_WIDEST_INT_PRINT_DEC,
248 (HOST_WIDEST_INT) hist->hvalue.counters[0],
249 (HOST_WIDEST_INT) hist->hvalue.counters[1],
250 (HOST_WIDEST_INT) hist->hvalue.counters[2]);
252 fprintf (dump_file, ".\n");
255 case HIST_TYPE_AVERAGE:
256 fprintf (dump_file, "Average value ");
257 if (hist->hvalue.counters)
259 fprintf (dump_file, "sum:"HOST_WIDEST_INT_PRINT_DEC
260 " times:"HOST_WIDEST_INT_PRINT_DEC,
261 (HOST_WIDEST_INT) hist->hvalue.counters[0],
262 (HOST_WIDEST_INT) hist->hvalue.counters[1]);
264 fprintf (dump_file, ".\n");
268 fprintf (dump_file, "IOR value ");
269 if (hist->hvalue.counters)
271 fprintf (dump_file, "ior:"HOST_WIDEST_INT_PRINT_DEC,
272 (HOST_WIDEST_INT) hist->hvalue.counters[0]);
274 fprintf (dump_file, ".\n");
277 case HIST_TYPE_CONST_DELTA:
278 fprintf (dump_file, "Constant delta ");
279 if (hist->hvalue.counters)
281 fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
282 " match:"HOST_WIDEST_INT_PRINT_DEC
283 " wrong:"HOST_WIDEST_INT_PRINT_DEC,
284 (HOST_WIDEST_INT) hist->hvalue.counters[0],
285 (HOST_WIDEST_INT) hist->hvalue.counters[1],
286 (HOST_WIDEST_INT) hist->hvalue.counters[2]);
288 fprintf (dump_file, ".\n");
290 case HIST_TYPE_INDIR_CALL:
291 fprintf (dump_file, "Indirect call ");
292 if (hist->hvalue.counters)
294 fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
295 " match:"HOST_WIDEST_INT_PRINT_DEC
296 " all:"HOST_WIDEST_INT_PRINT_DEC,
297 (HOST_WIDEST_INT) hist->hvalue.counters[0],
298 (HOST_WIDEST_INT) hist->hvalue.counters[1],
299 (HOST_WIDEST_INT) hist->hvalue.counters[2]);
301 fprintf (dump_file, ".\n");
306 /* Dump all histograms attached to STMT to DUMP_FILE. */
309 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple stmt)
311 histogram_value hist;
312 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
313 dump_histogram_value (dump_file, hist);
316 /* Remove all histograms associated with STMT. */
319 gimple_remove_stmt_histograms (struct function *fun, gimple stmt)
322 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
323 gimple_remove_histogram_value (fun, stmt, val);
326 /* Duplicate all histograms associates with OSTMT to STMT. */
329 gimple_duplicate_stmt_histograms (struct function *fun, gimple stmt,
330 struct function *ofun, gimple ostmt)
333 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
335 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type, NULL, NULL);
336 memcpy (new_val, val, sizeof (*val));
337 new_val->hvalue.stmt = stmt;
338 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
339 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
340 gimple_add_histogram_value (fun, stmt, new_val);
345 /* Move all histograms associated with OSTMT to STMT. */
348 gimple_move_stmt_histograms (struct function *fun, gimple stmt, gimple ostmt)
350 histogram_value val = gimple_histogram_value (fun, ostmt);
353 /* The following three statements can't be reordered,
354 because histogram hashtab relies on stmt field value
355 for finding the exact slot. */
356 set_histogram_value (fun, ostmt, NULL);
357 for (; val != NULL; val = val->hvalue.next)
358 val->hvalue.stmt = stmt;
359 set_histogram_value (fun, stmt, val);
363 static bool error_found = false;
365 /* Helper function for verify_histograms. For each histogram reachable via htab
366 walk verify that it was reached via statement walk. */
369 visit_hist (void **slot, void *data)
371 struct pointer_set_t *visited = (struct pointer_set_t *) data;
372 histogram_value hist = *(histogram_value *) slot;
373 if (!pointer_set_contains (visited, hist))
375 error ("dead histogram");
376 dump_histogram_value (stderr, hist);
377 debug_gimple_stmt (hist->hvalue.stmt);
384 /* Verify sanity of the histograms. */
387 verify_histograms (void)
390 gimple_stmt_iterator gsi;
391 histogram_value hist;
392 struct pointer_set_t *visited_hists;
395 visited_hists = pointer_set_create ();
397 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
399 gimple stmt = gsi_stmt (gsi);
401 for (hist = gimple_histogram_value (cfun, stmt); hist;
402 hist = hist->hvalue.next)
404 if (hist->hvalue.stmt != stmt)
406 error ("Histogram value statement does not correspond to "
407 "the statement it is associated with");
408 debug_gimple_stmt (stmt);
409 dump_histogram_value (stderr, hist);
412 pointer_set_insert (visited_hists, hist);
415 if (VALUE_HISTOGRAMS (cfun))
416 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, visited_hists);
417 pointer_set_destroy (visited_hists);
419 internal_error ("verify_histograms failed");
422 /* Helper function for verify_histograms. For each histogram reachable via htab
423 walk verify that it was reached via statement walk. */
426 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
428 histogram_value hist = *(histogram_value *) slot;
429 free (hist->hvalue.counters);
430 #ifdef ENABLE_CHECKING
431 memset (hist, 0xab, sizeof (*hist));
438 free_histograms (void)
440 if (VALUE_HISTOGRAMS (cfun))
442 htab_traverse (VALUE_HISTOGRAMS (cfun), free_hist, NULL);
443 htab_delete (VALUE_HISTOGRAMS (cfun));
444 VALUE_HISTOGRAMS (cfun) = NULL;
449 /* The overall number of invocations of the counter should match
450 execution count of basic block. Report it as error rather than
451 internal error as it might mean that user has misused the profile
455 check_counter (gimple stmt, const char * name,
456 gcov_type *count, gcov_type *all, gcov_type bb_count)
458 if (*all != bb_count || *count > *all)
461 locus = (stmt != NULL)
462 ? gimple_location (stmt)
463 : DECL_SOURCE_LOCATION (current_function_decl);
464 if (flag_profile_correction)
466 inform (locus, "correcting inconsistent value profile: "
467 "%s profiler overall count (%d) does not match BB count "
468 "(%d)", name, (int)*all, (int)bb_count);
476 error_at (locus, "corrupted value profile: %s "
477 "profiler overall count (%d) does not match BB count (%d)",
478 name, (int)*all, (int)bb_count);
487 /* GIMPLE based transformations. */
490 gimple_value_profile_transformations (void)
493 gimple_stmt_iterator gsi;
494 bool changed = false;
498 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
500 gimple stmt = gsi_stmt (gsi);
501 histogram_value th = gimple_histogram_value (cfun, stmt);
507 fprintf (dump_file, "Trying transformations on stmt ");
508 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
509 dump_histograms_for_stmt (cfun, dump_file, stmt);
512 /* Transformations: */
513 /* The order of things in this conditional controls which
514 transformation is used when more than one is applicable. */
515 /* It is expected that any code added by the transformations
516 will be added before the current statement, and that the
517 current statement remain valid (although possibly
518 modified) upon return. */
519 if (flag_value_profile_transformations
520 && (gimple_mod_subtract_transform (&gsi)
521 || gimple_divmod_fixed_value_transform (&gsi)
522 || gimple_mod_pow2_value_transform (&gsi)
523 || gimple_stringops_transform (&gsi)
524 || gimple_ic_transform (stmt)))
526 stmt = gsi_stmt (gsi);
528 /* Original statement may no longer be in the same block. */
529 if (bb != gimple_bb (stmt))
531 bb = gimple_bb (stmt);
532 gsi = gsi_for_stmt (stmt);
547 /* Generate code for transformation 1 (with parent gimple assignment
548 STMT and probability of taking the optimal path PROB, which is
549 equivalent to COUNT/ALL within roundoff error). This generates the
550 result into a temp and returns the temp; it does not replace or
551 alter the original STMT. */
554 gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count,
557 gimple stmt1, stmt2, stmt3;
558 tree tmp0, tmp1, tmp2, tmpv;
559 gimple bb1end, bb2end, bb3end;
560 basic_block bb, bb2, bb3, bb4;
561 tree optype, op1, op2;
562 edge e12, e13, e23, e24, e34;
563 gimple_stmt_iterator gsi;
565 gcc_assert (is_gimple_assign (stmt)
566 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
567 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
569 optype = TREE_TYPE (gimple_assign_lhs (stmt));
570 op1 = gimple_assign_rhs1 (stmt);
571 op2 = gimple_assign_rhs2 (stmt);
573 bb = gimple_bb (stmt);
574 gsi = gsi_for_stmt (stmt);
576 tmpv = create_tmp_reg (optype, "PROF");
577 tmp0 = make_ssa_name (tmpv, NULL);
578 tmp1 = make_ssa_name (tmpv, NULL);
579 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
580 SSA_NAME_DEF_STMT (tmp0) = stmt1;
581 stmt2 = gimple_build_assign (tmp1, op2);
582 SSA_NAME_DEF_STMT (tmp1) = stmt2;
583 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
584 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
585 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
586 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
589 tmp2 = make_rename_temp (optype, "PROF");
590 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
592 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
595 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
597 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
601 /* Edge e23 connects bb2 to bb3, etc. */
602 e12 = split_block (bb, bb1end);
605 e23 = split_block (bb2, bb2end);
607 bb3->count = all - count;
608 e34 = split_block (bb3, bb3end);
612 e12->flags &= ~EDGE_FALLTHRU;
613 e12->flags |= EDGE_FALSE_VALUE;
614 e12->probability = prob;
617 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
618 e13->probability = REG_BR_PROB_BASE - prob;
619 e13->count = all - count;
623 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
624 e24->probability = REG_BR_PROB_BASE;
627 e34->probability = REG_BR_PROB_BASE;
628 e34->count = all - count;
634 /* Do transform 1) on INSN if applicable. */
637 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
639 histogram_value histogram;
641 gcov_type val, count, all;
642 tree result, value, tree_val;
646 stmt = gsi_stmt (*si);
647 if (gimple_code (stmt) != GIMPLE_ASSIGN)
650 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
653 code = gimple_assign_rhs_code (stmt);
655 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
658 histogram = gimple_histogram_value_of_type (cfun, stmt,
659 HIST_TYPE_SINGLE_VALUE);
663 value = histogram->hvalue.value;
664 val = histogram->hvalue.counters[0];
665 count = histogram->hvalue.counters[1];
666 all = histogram->hvalue.counters[2];
667 gimple_remove_histogram_value (cfun, stmt, histogram);
669 /* We require that count is at least half of all; this means
670 that for the transformation to fire the value must be constant
671 at least 50% of time (and 75% gives the guarantee of usage). */
672 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
674 || optimize_bb_for_size_p (gimple_bb (stmt)))
677 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
680 /* Compute probability of taking the optimal path. */
682 prob = (count * REG_BR_PROB_BASE + all / 2) / all;
686 tree_val = build_int_cst_wide (get_gcov_type (),
687 (unsigned HOST_WIDE_INT) val,
688 val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
689 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
693 fprintf (dump_file, "Div/mod by constant ");
694 print_generic_expr (dump_file, value, TDF_SLIM);
695 fprintf (dump_file, "=");
696 print_generic_expr (dump_file, tree_val, TDF_SLIM);
697 fprintf (dump_file, " transformation on insn ");
698 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
701 gimple_assign_set_rhs_from_tree (si, result);
702 update_stmt (gsi_stmt (*si));
707 /* Generate code for transformation 2 (with parent gimple assign STMT and
708 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
709 within roundoff error). This generates the result into a temp and returns
710 the temp; it does not replace or alter the original STMT. */
712 gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
714 gimple stmt1, stmt2, stmt3, stmt4;
715 tree tmp2, tmp3, tmpv;
716 gimple bb1end, bb2end, bb3end;
717 basic_block bb, bb2, bb3, bb4;
718 tree optype, op1, op2;
719 edge e12, e13, e23, e24, e34;
720 gimple_stmt_iterator gsi;
723 gcc_assert (is_gimple_assign (stmt)
724 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
726 optype = TREE_TYPE (gimple_assign_lhs (stmt));
727 op1 = gimple_assign_rhs1 (stmt);
728 op2 = gimple_assign_rhs2 (stmt);
730 bb = gimple_bb (stmt);
731 gsi = gsi_for_stmt (stmt);
733 result = make_rename_temp (optype, "PROF");
734 tmpv = create_tmp_var (optype, "PROF");
735 tmp2 = make_ssa_name (tmpv, NULL);
736 tmp3 = make_ssa_name (tmpv, NULL);
737 stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
738 build_int_cst (optype, -1));
739 SSA_NAME_DEF_STMT (tmp2) = stmt2;
740 stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
741 SSA_NAME_DEF_STMT (tmp3) = stmt3;
742 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
743 NULL_TREE, NULL_TREE);
744 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
745 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
746 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
749 /* tmp2 == op2-1 inherited from previous block. */
750 stmt1 = gimple_build_assign_with_ops (BIT_AND_EXPR, result, op1, tmp2);
751 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
754 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
756 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
760 /* Edge e23 connects bb2 to bb3, etc. */
761 e12 = split_block (bb, bb1end);
764 e23 = split_block (bb2, bb2end);
766 bb3->count = all - count;
767 e34 = split_block (bb3, bb3end);
771 e12->flags &= ~EDGE_FALLTHRU;
772 e12->flags |= EDGE_FALSE_VALUE;
773 e12->probability = prob;
776 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
777 e13->probability = REG_BR_PROB_BASE - prob;
778 e13->count = all - count;
782 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
783 e24->probability = REG_BR_PROB_BASE;
786 e34->probability = REG_BR_PROB_BASE;
787 e34->count = all - count;
792 /* Do transform 2) on INSN if applicable. */
794 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
796 histogram_value histogram;
798 gcov_type count, wrong_values, all;
799 tree lhs_type, result, value;
803 stmt = gsi_stmt (*si);
804 if (gimple_code (stmt) != GIMPLE_ASSIGN)
807 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
808 if (!INTEGRAL_TYPE_P (lhs_type))
811 code = gimple_assign_rhs_code (stmt);
813 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
816 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
820 value = histogram->hvalue.value;
821 wrong_values = histogram->hvalue.counters[0];
822 count = histogram->hvalue.counters[1];
824 gimple_remove_histogram_value (cfun, stmt, histogram);
826 /* We require that we hit a power of 2 at least half of all evaluations. */
827 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
828 || count < wrong_values
829 || optimize_bb_for_size_p (gimple_bb (stmt)))
834 fprintf (dump_file, "Mod power of 2 transformation on insn ");
835 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
838 /* Compute probability of taking the optimal path. */
839 all = count + wrong_values;
841 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
845 prob = (count * REG_BR_PROB_BASE + all / 2) / all;
849 result = gimple_mod_pow2 (stmt, prob, count, all);
851 gimple_assign_set_rhs_from_tree (si, result);
852 update_stmt (gsi_stmt (*si));
857 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
858 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
859 supported and this is built into this interface. The probabilities of taking
860 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
861 COUNT2/ALL respectively within roundoff error). This generates the
862 result into a temp and returns the temp; it does not replace or alter
863 the original STMT. */
864 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
867 gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts,
868 gcov_type count1, gcov_type count2, gcov_type all)
870 gimple stmt1, stmt2, stmt3;
872 gimple bb1end, bb2end = NULL, bb3end;
873 basic_block bb, bb2, bb3, bb4;
874 tree optype, op1, op2;
875 edge e12, e23 = 0, e24, e34, e14;
876 gimple_stmt_iterator gsi;
879 gcc_assert (is_gimple_assign (stmt)
880 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
882 optype = TREE_TYPE (gimple_assign_lhs (stmt));
883 op1 = gimple_assign_rhs1 (stmt);
884 op2 = gimple_assign_rhs2 (stmt);
886 bb = gimple_bb (stmt);
887 gsi = gsi_for_stmt (stmt);
889 result = make_rename_temp (optype, "PROF");
890 tmp1 = make_ssa_name (create_tmp_var (optype, "PROF"), NULL);
891 stmt1 = gimple_build_assign (result, op1);
892 stmt2 = gimple_build_assign (tmp1, op2);
893 SSA_NAME_DEF_STMT (tmp1) = stmt2;
894 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
895 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
896 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
897 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
900 if (ncounts) /* Assumed to be 0 or 1 */
902 stmt1 = gimple_build_assign_with_ops (MINUS_EXPR, result, result, tmp1);
903 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
904 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
905 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
910 stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
912 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
916 /* Edge e23 connects bb2 to bb3, etc. */
917 /* However block 3 is optional; if it is not there, references
918 to 3 really refer to block 2. */
919 e12 = split_block (bb, bb1end);
921 bb2->count = all - count1;
923 if (ncounts) /* Assumed to be 0 or 1. */
925 e23 = split_block (bb2, bb2end);
927 bb3->count = all - count1 - count2;
930 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
934 e12->flags &= ~EDGE_FALLTHRU;
935 e12->flags |= EDGE_FALSE_VALUE;
936 e12->probability = REG_BR_PROB_BASE - prob1;
937 e12->count = all - count1;
939 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
940 e14->probability = prob1;
943 if (ncounts) /* Assumed to be 0 or 1. */
945 e23->flags &= ~EDGE_FALLTHRU;
946 e23->flags |= EDGE_FALSE_VALUE;
947 e23->count = all - count1 - count2;
948 e23->probability = REG_BR_PROB_BASE - prob2;
950 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
951 e24->probability = prob2;
955 e34->probability = REG_BR_PROB_BASE;
956 e34->count = all - count1 - count2;
962 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
965 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
967 histogram_value histogram;
969 gcov_type count, wrong_values, all;
970 tree lhs_type, result;
971 gcov_type prob1, prob2;
972 unsigned int i, steps;
973 gcov_type count1, count2;
976 stmt = gsi_stmt (*si);
977 if (gimple_code (stmt) != GIMPLE_ASSIGN)
980 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
981 if (!INTEGRAL_TYPE_P (lhs_type))
984 code = gimple_assign_rhs_code (stmt);
986 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
989 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
995 for (i = 0; i < histogram->hdata.intvl.steps; i++)
996 all += histogram->hvalue.counters[i];
998 wrong_values += histogram->hvalue.counters[i];
999 wrong_values += histogram->hvalue.counters[i+1];
1000 steps = histogram->hdata.intvl.steps;
1001 all += wrong_values;
1002 count1 = histogram->hvalue.counters[0];
1003 count2 = histogram->hvalue.counters[1];
1005 /* Compute probability of taking the optimal path. */
1006 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1008 gimple_remove_histogram_value (cfun, stmt, histogram);
1012 if (flag_profile_correction && count1 + count2 > all)
1013 all = count1 + count2;
1015 gcc_assert (count1 + count2 <= all);
1017 /* We require that we use just subtractions in at least 50% of all
1020 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1022 count += histogram->hvalue.counters[i];
1023 if (count * 2 >= all)
1027 || optimize_bb_for_size_p (gimple_bb (stmt)))
1030 gimple_remove_histogram_value (cfun, stmt, histogram);
1033 fprintf (dump_file, "Mod subtract transformation on insn ");
1034 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1037 /* Compute probability of taking the optimal path(s). */
1040 prob1 = (count1 * REG_BR_PROB_BASE + all / 2) / all;
1041 prob2 = (count2 * REG_BR_PROB_BASE + all / 2) / all;
1048 /* In practice, "steps" is always 2. This interface reflects this,
1049 and will need to be changed if "steps" can change. */
1050 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1052 gimple_assign_set_rhs_from_tree (si, result);
1053 update_stmt (gsi_stmt (*si));
1058 static struct cgraph_node** pid_map = NULL;
1060 /* Initialize map of pids (pid -> cgraph node) */
1065 struct cgraph_node *n;
1067 if (pid_map != NULL)
1070 pid_map = XCNEWVEC (struct cgraph_node*, cgraph_max_pid);
1072 for (n = cgraph_nodes; n; n = n->next)
1075 pid_map [n->pid] = n;
1079 /* Return cgraph node for function with pid */
1081 static inline struct cgraph_node*
1082 find_func_by_pid (int pid)
1086 return pid_map [pid];
1089 /* Do transformation
1091 if (actual_callee_address == address_of_most_common_function/method)
1098 gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
1099 int prob, gcov_type count, gcov_type all)
1101 gimple dcall_stmt, load_stmt, cond_stmt;
1102 tree tmp0, tmp1, tmpv, tmp;
1103 basic_block cond_bb, dcall_bb, icall_bb, join_bb;
1104 tree optype = build_pointer_type (void_type_node);
1105 edge e_cd, e_ci, e_di, e_dj, e_ij;
1106 gimple_stmt_iterator gsi;
1109 cond_bb = gimple_bb (icall_stmt);
1110 gsi = gsi_for_stmt (icall_stmt);
1112 tmpv = create_tmp_reg (optype, "PROF");
1113 tmp0 = make_ssa_name (tmpv, NULL);
1114 tmp1 = make_ssa_name (tmpv, NULL);
1115 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1116 load_stmt = gimple_build_assign (tmp0, tmp);
1117 SSA_NAME_DEF_STMT (tmp0) = load_stmt;
1118 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1120 tmp = fold_convert (optype, build_addr (direct_call->decl,
1121 current_function_decl));
1122 load_stmt = gimple_build_assign (tmp1, tmp);
1123 SSA_NAME_DEF_STMT (tmp1) = load_stmt;
1124 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1126 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1127 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1129 gimple_set_vdef (icall_stmt, NULL_TREE);
1130 gimple_set_vuse (icall_stmt, NULL_TREE);
1131 update_stmt (icall_stmt);
1132 dcall_stmt = gimple_copy (icall_stmt);
1133 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1134 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1137 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1138 e_cd = split_block (cond_bb, cond_stmt);
1139 dcall_bb = e_cd->dest;
1140 dcall_bb->count = count;
1142 e_di = split_block (dcall_bb, dcall_stmt);
1143 icall_bb = e_di->dest;
1144 icall_bb->count = all - count;
1146 /* Do not disturb existing EH edges from the indirect call. */
1147 if (!stmt_ends_bb_p (icall_stmt))
1148 e_ij = split_block (icall_bb, icall_stmt);
1151 e_ij = find_fallthru_edge (icall_bb->succs);
1152 e_ij->probability = REG_BR_PROB_BASE;
1153 e_ij->count = all - count;
1154 e_ij = single_pred_edge (split_edge (e_ij));
1156 join_bb = e_ij->dest;
1157 join_bb->count = all;
1159 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1160 e_cd->probability = prob;
1161 e_cd->count = count;
1163 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1164 e_ci->probability = REG_BR_PROB_BASE - prob;
1165 e_ci->count = all - count;
1169 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1170 e_dj->probability = REG_BR_PROB_BASE;
1171 e_dj->count = count;
1173 e_ij->probability = REG_BR_PROB_BASE;
1174 e_ij->count = all - count;
1176 /* Insert PHI node for the call result if necessary. */
1177 if (gimple_call_lhs (icall_stmt)
1178 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME)
1180 tree result = gimple_call_lhs (icall_stmt);
1181 gimple phi = create_phi_node (result, join_bb);
1182 SSA_NAME_DEF_STMT (result) = phi;
1183 gimple_call_set_lhs (icall_stmt,
1184 make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
1185 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1186 gimple_call_set_lhs (dcall_stmt,
1187 make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
1188 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1191 /* Build an EH edge for the direct call if necessary. */
1192 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1194 && stmt_could_throw_p (dcall_stmt))
1198 gimple_stmt_iterator psi;
1200 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1201 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1202 if (e_eh->flags & EDGE_EH)
1204 e = make_edge (dcall_bb, e_eh->dest, EDGE_EH);
1205 for (psi = gsi_start_phis (e_eh->dest);
1206 !gsi_end_p (psi); gsi_next (&psi))
1208 gimple phi = gsi_stmt (psi);
1209 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1210 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1218 For every checked indirect/virtual call determine if most common pid of
1219 function/class method has probability more than 50%. If yes modify code of
1224 gimple_ic_transform (gimple stmt)
1226 histogram_value histogram;
1227 gcov_type val, count, all, bb_all;
1231 struct cgraph_node *direct_call;
1233 if (gimple_code (stmt) != GIMPLE_CALL)
1236 callee = gimple_call_fn (stmt);
1238 if (TREE_CODE (callee) == FUNCTION_DECL)
1241 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1245 val = histogram->hvalue.counters [0];
1246 count = histogram->hvalue.counters [1];
1247 all = histogram->hvalue.counters [2];
1248 gimple_remove_histogram_value (cfun, stmt, histogram);
1250 if (4 * count <= 3 * all)
1253 bb_all = gimple_bb (stmt)->count;
1254 /* The order of CHECK_COUNTER calls is important -
1255 since check_counter can correct the third parameter
1256 and we want to make count <= all <= bb_all. */
1257 if ( check_counter (stmt, "ic", &all, &bb_all, bb_all)
1258 || check_counter (stmt, "ic", &count, &all, all))
1262 prob = (count * REG_BR_PROB_BASE + all / 2) / all;
1265 direct_call = find_func_by_pid ((int)val);
1267 if (direct_call == NULL)
1270 modify = gimple_ic (stmt, direct_call, prob, count, all);
1274 fprintf (dump_file, "Indirect call -> direct call ");
1275 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1276 fprintf (dump_file, "=> ");
1277 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1278 fprintf (dump_file, " transformation on insn ");
1279 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1280 fprintf (dump_file, " to ");
1281 print_gimple_stmt (dump_file, modify, 0, TDF_SLIM);
1282 fprintf (dump_file, "hist->count "HOST_WIDEST_INT_PRINT_DEC
1283 " hist->all "HOST_WIDEST_INT_PRINT_DEC"\n", count, all);
1289 /* Return true if the stringop CALL with FNDECL shall be profiled.
1290 SIZE_ARG be set to the argument index for the size of the string
1294 interesting_stringop_to_profile_p (tree fndecl, gimple call, int *size_arg)
1296 enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
1298 if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
1299 && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
1304 case BUILT_IN_MEMCPY:
1305 case BUILT_IN_MEMPCPY:
1307 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1308 INTEGER_TYPE, VOID_TYPE);
1309 case BUILT_IN_MEMSET:
1311 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1312 INTEGER_TYPE, VOID_TYPE);
1313 case BUILT_IN_BZERO:
1315 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1322 /* Convert stringop (..., vcall_size)
1324 if (vcall_size == icall_size)
1325 stringop (..., icall_size);
1327 stringop (..., vcall_size);
1328 assuming we'll propagate a true constant into ICALL_SIZE later. */
1331 gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob,
1332 gcov_type count, gcov_type all)
1334 gimple tmp_stmt, cond_stmt, icall_stmt;
1335 tree tmp0, tmp1, tmpv, vcall_size, optype;
1336 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1337 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1338 gimple_stmt_iterator gsi;
1342 fndecl = gimple_call_fndecl (vcall_stmt);
1343 if (!interesting_stringop_to_profile_p (fndecl, vcall_stmt, &size_arg))
1346 cond_bb = gimple_bb (vcall_stmt);
1347 gsi = gsi_for_stmt (vcall_stmt);
1349 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1350 optype = TREE_TYPE (vcall_size);
1352 tmpv = create_tmp_var (optype, "PROF");
1353 tmp0 = make_ssa_name (tmpv, NULL);
1354 tmp1 = make_ssa_name (tmpv, NULL);
1355 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1356 SSA_NAME_DEF_STMT (tmp0) = tmp_stmt;
1357 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1359 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1360 SSA_NAME_DEF_STMT (tmp1) = tmp_stmt;
1361 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1363 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1364 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1366 gimple_set_vdef (vcall_stmt, NULL);
1367 gimple_set_vuse (vcall_stmt, NULL);
1368 update_stmt (vcall_stmt);
1369 icall_stmt = gimple_copy (vcall_stmt);
1370 gimple_call_set_arg (icall_stmt, size_arg, icall_size);
1371 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1374 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1375 e_ci = split_block (cond_bb, cond_stmt);
1376 icall_bb = e_ci->dest;
1377 icall_bb->count = count;
1379 e_iv = split_block (icall_bb, icall_stmt);
1380 vcall_bb = e_iv->dest;
1381 vcall_bb->count = all - count;
1383 e_vj = split_block (vcall_bb, vcall_stmt);
1384 join_bb = e_vj->dest;
1385 join_bb->count = all;
1387 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1388 e_ci->probability = prob;
1389 e_ci->count = count;
1391 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1392 e_cv->probability = REG_BR_PROB_BASE - prob;
1393 e_cv->count = all - count;
1397 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1398 e_ij->probability = REG_BR_PROB_BASE;
1399 e_ij->count = count;
1401 e_vj->probability = REG_BR_PROB_BASE;
1402 e_vj->count = all - count;
1404 /* Insert PHI node for the call result if necessary. */
1405 if (gimple_call_lhs (vcall_stmt)
1406 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1408 tree result = gimple_call_lhs (vcall_stmt);
1409 gimple phi = create_phi_node (result, join_bb);
1410 SSA_NAME_DEF_STMT (result) = phi;
1411 gimple_call_set_lhs (vcall_stmt,
1412 make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
1413 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1414 gimple_call_set_lhs (icall_stmt,
1415 make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
1416 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1419 /* Because these are all string op builtins, they're all nothrow. */
1420 gcc_assert (!stmt_could_throw_p (vcall_stmt));
1421 gcc_assert (!stmt_could_throw_p (icall_stmt));
1424 /* Find values inside STMT for that we want to measure histograms for
1425 division/modulo optimization. */
1427 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1429 gimple stmt = gsi_stmt (*gsi);
1432 enum built_in_function fcode;
1433 histogram_value histogram;
1434 gcov_type count, all, val;
1436 unsigned int dest_align, src_align;
1441 if (gimple_code (stmt) != GIMPLE_CALL)
1443 fndecl = gimple_call_fndecl (stmt);
1446 fcode = DECL_FUNCTION_CODE (fndecl);
1447 if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1450 blck_size = gimple_call_arg (stmt, size_arg);
1451 if (TREE_CODE (blck_size) == INTEGER_CST)
1454 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_SINGLE_VALUE);
1457 val = histogram->hvalue.counters[0];
1458 count = histogram->hvalue.counters[1];
1459 all = histogram->hvalue.counters[2];
1460 gimple_remove_histogram_value (cfun, stmt, histogram);
1461 /* We require that count is at least half of all; this means
1462 that for the transformation to fire the value must be constant
1463 at least 80% of time. */
1464 if ((6 * count / 5) < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1466 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1469 prob = (count * REG_BR_PROB_BASE + all / 2) / all;
1472 dest = gimple_call_arg (stmt, 0);
1473 dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
1476 case BUILT_IN_MEMCPY:
1477 case BUILT_IN_MEMPCPY:
1478 src = gimple_call_arg (stmt, 1);
1479 src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
1480 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1483 case BUILT_IN_MEMSET:
1484 if (!can_store_by_pieces (val, builtin_memset_read_str,
1485 gimple_call_arg (stmt, 1),
1489 case BUILT_IN_BZERO:
1490 if (!can_store_by_pieces (val, builtin_memset_read_str,
1498 tree_val = build_int_cst_wide (get_gcov_type (),
1499 (unsigned HOST_WIDE_INT) val,
1500 val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
1503 fprintf (dump_file, "Single value %i stringop transformation on ",
1505 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1507 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1513 stringop_block_profile (gimple stmt, unsigned int *expected_align,
1514 HOST_WIDE_INT *expected_size)
1516 histogram_value histogram;
1517 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1519 *expected_size = -1;
1520 else if (!histogram->hvalue.counters[1])
1522 *expected_size = -1;
1523 gimple_remove_histogram_value (cfun, stmt, histogram);
1528 size = ((histogram->hvalue.counters[0]
1529 + histogram->hvalue.counters[1] / 2)
1530 / histogram->hvalue.counters[1]);
1531 /* Even if we can hold bigger value in SIZE, INT_MAX
1532 is safe "infinity" for code generation strategies. */
1535 *expected_size = size;
1536 gimple_remove_histogram_value (cfun, stmt, histogram);
1538 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1540 *expected_align = 0;
1541 else if (!histogram->hvalue.counters[0])
1543 gimple_remove_histogram_value (cfun, stmt, histogram);
1544 *expected_align = 0;
1551 count = histogram->hvalue.counters[0];
1553 while (!(count & alignment)
1554 && (alignment * 2 * BITS_PER_UNIT))
1556 *expected_align = alignment * BITS_PER_UNIT;
1557 gimple_remove_histogram_value (cfun, stmt, histogram);
1562 /* Find values inside STMT for that we want to measure histograms for
1563 division/modulo optimization. */
1565 gimple_divmod_values_to_profile (gimple stmt, histogram_values *values)
1567 tree lhs, divisor, op0, type;
1568 histogram_value hist;
1570 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1573 lhs = gimple_assign_lhs (stmt);
1574 type = TREE_TYPE (lhs);
1575 if (!INTEGRAL_TYPE_P (type))
1578 switch (gimple_assign_rhs_code (stmt))
1580 case TRUNC_DIV_EXPR:
1581 case TRUNC_MOD_EXPR:
1582 divisor = gimple_assign_rhs2 (stmt);
1583 op0 = gimple_assign_rhs1 (stmt);
1585 VEC_reserve (histogram_value, heap, *values, 3);
1587 if (is_gimple_reg (divisor))
1588 /* Check for the case where the divisor is the same value most
1590 VEC_quick_push (histogram_value, *values,
1591 gimple_alloc_histogram_value (cfun,
1592 HIST_TYPE_SINGLE_VALUE,
1595 /* For mod, check whether it is not often a noop (or replaceable by
1596 a few subtractions). */
1597 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1598 && TYPE_UNSIGNED (type))
1601 /* Check for a special case where the divisor is power of 2. */
1602 VEC_quick_push (histogram_value, *values,
1603 gimple_alloc_histogram_value (cfun, HIST_TYPE_POW2,
1606 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1607 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1609 hist->hdata.intvl.int_start = 0;
1610 hist->hdata.intvl.steps = 2;
1611 VEC_quick_push (histogram_value, *values, hist);
1620 /* Find calls inside STMT for that we want to measure histograms for
1621 indirect/virtual call optimization. */
1624 gimple_indirect_call_to_profile (gimple stmt, histogram_values *values)
1628 if (gimple_code (stmt) != GIMPLE_CALL
1629 || gimple_call_fndecl (stmt) != NULL_TREE)
1632 callee = gimple_call_fn (stmt);
1634 VEC_reserve (histogram_value, heap, *values, 3);
1636 VEC_quick_push (histogram_value, *values,
1637 gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL,
1643 /* Find values inside STMT for that we want to measure histograms for
1644 string operations. */
1646 gimple_stringops_values_to_profile (gimple stmt, histogram_values *values)
1653 if (gimple_code (stmt) != GIMPLE_CALL)
1655 fndecl = gimple_call_fndecl (stmt);
1659 if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1662 dest = gimple_call_arg (stmt, 0);
1663 blck_size = gimple_call_arg (stmt, size_arg);
1665 if (TREE_CODE (blck_size) != INTEGER_CST)
1667 VEC_safe_push (histogram_value, heap, *values,
1668 gimple_alloc_histogram_value (cfun, HIST_TYPE_SINGLE_VALUE,
1670 VEC_safe_push (histogram_value, heap, *values,
1671 gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1674 if (TREE_CODE (blck_size) != INTEGER_CST)
1675 VEC_safe_push (histogram_value, heap, *values,
1676 gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1680 /* Find values inside STMT for that we want to measure histograms and adds
1681 them to list VALUES. */
1684 gimple_values_to_profile (gimple stmt, histogram_values *values)
1686 if (flag_value_profile_transformations)
1688 gimple_divmod_values_to_profile (stmt, values);
1689 gimple_stringops_values_to_profile (stmt, values);
1690 gimple_indirect_call_to_profile (stmt, values);
1695 gimple_find_values_to_profile (histogram_values *values)
1698 gimple_stmt_iterator gsi;
1700 histogram_value hist = NULL;
1704 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1705 gimple_values_to_profile (gsi_stmt (gsi), values);
1707 FOR_EACH_VEC_ELT (histogram_value, *values, i, hist)
1711 case HIST_TYPE_INTERVAL:
1712 hist->n_counters = hist->hdata.intvl.steps + 2;
1715 case HIST_TYPE_POW2:
1716 hist->n_counters = 2;
1719 case HIST_TYPE_SINGLE_VALUE:
1720 hist->n_counters = 3;
1723 case HIST_TYPE_CONST_DELTA:
1724 hist->n_counters = 4;
1727 case HIST_TYPE_INDIR_CALL:
1728 hist->n_counters = 3;
1731 case HIST_TYPE_AVERAGE:
1732 hist->n_counters = 2;
1736 hist->n_counters = 1;
1744 fprintf (dump_file, "Stmt ");
1745 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
1746 dump_histogram_value (dump_file, hist);