xref: /dragonfly/contrib/gcc-4.7/gcc/value-prof.c (revision 37de577a)
1 /* Transformations based on profile information for values.
2    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
3    Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
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
10 version.
11 
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
15 for more details.
16 
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/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "rtl.h"
26 #include "expr.h"
27 #include "hard-reg-set.h"
28 #include "basic-block.h"
29 #include "value-prof.h"
30 #include "output.h"
31 #include "flags.h"
32 #include "insn-config.h"
33 #include "recog.h"
34 #include "optabs.h"
35 #include "regs.h"
36 #include "ggc.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"
42 #include "coverage.h"
43 #include "tree.h"
44 #include "gcov-io.h"
45 #include "cgraph.h"
46 #include "timevar.h"
47 #include "tree-pass.h"
48 #include "pointer-set.h"
49 #include "profile.h"
50 
51 /* In this file value profile based optimizations are placed.  Currently the
52    following optimizations are implemented (for more detailed descriptions
53    see comments at value_profile_transformations):
54 
55    1) Division/modulo specialization.  Provided that we can determine that the
56       operands of the division have some special properties, we may use it to
57       produce more effective code.
58    2) Speculative prefetching.  If we are able to determine that the difference
59       between addresses accessed by a memory reference is usually constant, we
60       may add the prefetch instructions.
61       FIXME: This transformation was removed together with RTL based value
62       profiling.
63 
64    3) Indirect/virtual call specialization. If we can determine most
65       common function callee in indirect/virtual call. We can use this
66       information to improve code effectiveness (especially info for
67       inliner).
68 
69    Every such optimization should add its requirements for profiled values to
70    insn_values_to_profile function.  This function is called from branch_prob
71    in profile.c and the requested values are instrumented by it in the first
72    compilation with -fprofile-arcs.  The optimization may then read the
73    gathered data in the second compilation with -fbranch-probabilities.
74 
75    The measured data is pointed to from the histograms
76    field of the statement annotation of the instrumented insns.  It is
77    kept as a linked list of struct histogram_value_t's, which contain the
78    same information as above.  */
79 
80 
81 static tree gimple_divmod_fixed_value (gimple, tree, int, gcov_type, gcov_type);
82 static tree gimple_mod_pow2 (gimple, int, gcov_type, gcov_type);
83 static tree gimple_mod_subtract (gimple, int, int, int, gcov_type, gcov_type,
84 				 gcov_type);
85 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
86 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
87 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
88 static bool gimple_stringops_transform (gimple_stmt_iterator *);
89 static bool gimple_ic_transform (gimple);
90 
91 /* Allocate histogram value.  */
92 
93 static histogram_value
94 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
95 			      enum hist_type type, gimple stmt, tree value)
96 {
97    histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
98    hist->hvalue.value = value;
99    hist->hvalue.stmt = stmt;
100    hist->type = type;
101    return hist;
102 }
103 
104 /* Hash value for histogram.  */
105 
106 static hashval_t
107 histogram_hash (const void *x)
108 {
109   return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
110 }
111 
112 /* Return nonzero if decl_id of die_struct X is the same as UID of decl *Y.  */
113 
114 static int
115 histogram_eq (const void *x, const void *y)
116 {
117   return ((const_histogram_value) x)->hvalue.stmt == (const_gimple) y;
118 }
119 
120 /* Set histogram for STMT.  */
121 
122 static void
123 set_histogram_value (struct function *fun, gimple stmt, histogram_value hist)
124 {
125   void **loc;
126   if (!hist && !VALUE_HISTOGRAMS (fun))
127     return;
128   if (!VALUE_HISTOGRAMS (fun))
129     VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
130 				           histogram_eq, NULL);
131   loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
132                                   htab_hash_pointer (stmt),
133 				  hist ? INSERT : NO_INSERT);
134   if (!hist)
135     {
136       if (loc)
137 	htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
138       return;
139     }
140   *loc = hist;
141 }
142 
143 /* Get histogram list for STMT.  */
144 
145 histogram_value
146 gimple_histogram_value (struct function *fun, gimple stmt)
147 {
148   if (!VALUE_HISTOGRAMS (fun))
149     return NULL;
150   return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
151 						htab_hash_pointer (stmt));
152 }
153 
154 /* Add histogram for STMT.  */
155 
156 void
157 gimple_add_histogram_value (struct function *fun, gimple stmt,
158 			    histogram_value hist)
159 {
160   hist->hvalue.next = gimple_histogram_value (fun, stmt);
161   set_histogram_value (fun, stmt, hist);
162 }
163 
164 
165 /* Remove histogram HIST from STMT's histogram list.  */
166 
167 void
168 gimple_remove_histogram_value (struct function *fun, gimple stmt,
169 			       histogram_value hist)
170 {
171   histogram_value hist2 = gimple_histogram_value (fun, stmt);
172   if (hist == hist2)
173     {
174       set_histogram_value (fun, stmt, hist->hvalue.next);
175     }
176   else
177     {
178       while (hist2->hvalue.next != hist)
179 	hist2 = hist2->hvalue.next;
180       hist2->hvalue.next = hist->hvalue.next;
181     }
182   free (hist->hvalue.counters);
183 #ifdef ENABLE_CHECKING
184   memset (hist, 0xab, sizeof (*hist));
185 #endif
186   free (hist);
187 }
188 
189 
190 /* Lookup histogram of type TYPE in the STMT.  */
191 
192 histogram_value
193 gimple_histogram_value_of_type (struct function *fun, gimple stmt,
194 				enum hist_type type)
195 {
196   histogram_value hist;
197   for (hist = gimple_histogram_value (fun, stmt); hist;
198        hist = hist->hvalue.next)
199     if (hist->type == type)
200       return hist;
201   return NULL;
202 }
203 
204 /* Dump information about HIST to DUMP_FILE.  */
205 
206 static void
207 dump_histogram_value (FILE *dump_file, histogram_value hist)
208 {
209   switch (hist->type)
210     {
211     case HIST_TYPE_INTERVAL:
212       fprintf (dump_file, "Interval counter range %d -- %d",
213 	       hist->hdata.intvl.int_start,
214 	       (hist->hdata.intvl.int_start
215 	        + hist->hdata.intvl.steps - 1));
216       if (hist->hvalue.counters)
217 	{
218 	   unsigned int i;
219 	   fprintf(dump_file, " [");
220            for (i = 0; i < hist->hdata.intvl.steps; i++)
221 	     fprintf (dump_file, " %d:"HOST_WIDEST_INT_PRINT_DEC,
222 		      hist->hdata.intvl.int_start + i,
223 		      (HOST_WIDEST_INT) hist->hvalue.counters[i]);
224 	   fprintf (dump_file, " ] outside range:"HOST_WIDEST_INT_PRINT_DEC,
225 		    (HOST_WIDEST_INT) hist->hvalue.counters[i]);
226 	}
227       fprintf (dump_file, ".\n");
228       break;
229 
230     case HIST_TYPE_POW2:
231       fprintf (dump_file, "Pow2 counter ");
232       if (hist->hvalue.counters)
233 	{
234 	   fprintf (dump_file, "pow2:"HOST_WIDEST_INT_PRINT_DEC
235 		    " nonpow2:"HOST_WIDEST_INT_PRINT_DEC,
236 		    (HOST_WIDEST_INT) hist->hvalue.counters[0],
237 		    (HOST_WIDEST_INT) hist->hvalue.counters[1]);
238 	}
239       fprintf (dump_file, ".\n");
240       break;
241 
242     case HIST_TYPE_SINGLE_VALUE:
243       fprintf (dump_file, "Single value ");
244       if (hist->hvalue.counters)
245 	{
246 	   fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
247 		    " match:"HOST_WIDEST_INT_PRINT_DEC
248 		    " wrong:"HOST_WIDEST_INT_PRINT_DEC,
249 		    (HOST_WIDEST_INT) hist->hvalue.counters[0],
250 		    (HOST_WIDEST_INT) hist->hvalue.counters[1],
251 		    (HOST_WIDEST_INT) hist->hvalue.counters[2]);
252 	}
253       fprintf (dump_file, ".\n");
254       break;
255 
256     case HIST_TYPE_AVERAGE:
257       fprintf (dump_file, "Average value ");
258       if (hist->hvalue.counters)
259 	{
260 	   fprintf (dump_file, "sum:"HOST_WIDEST_INT_PRINT_DEC
261 		    " times:"HOST_WIDEST_INT_PRINT_DEC,
262 		    (HOST_WIDEST_INT) hist->hvalue.counters[0],
263 		    (HOST_WIDEST_INT) hist->hvalue.counters[1]);
264 	}
265       fprintf (dump_file, ".\n");
266       break;
267 
268     case HIST_TYPE_IOR:
269       fprintf (dump_file, "IOR value ");
270       if (hist->hvalue.counters)
271 	{
272 	   fprintf (dump_file, "ior:"HOST_WIDEST_INT_PRINT_DEC,
273 		    (HOST_WIDEST_INT) hist->hvalue.counters[0]);
274 	}
275       fprintf (dump_file, ".\n");
276       break;
277 
278     case HIST_TYPE_CONST_DELTA:
279       fprintf (dump_file, "Constant delta ");
280       if (hist->hvalue.counters)
281 	{
282 	   fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
283 		    " match:"HOST_WIDEST_INT_PRINT_DEC
284 		    " wrong:"HOST_WIDEST_INT_PRINT_DEC,
285 		    (HOST_WIDEST_INT) hist->hvalue.counters[0],
286 		    (HOST_WIDEST_INT) hist->hvalue.counters[1],
287 		    (HOST_WIDEST_INT) hist->hvalue.counters[2]);
288 	}
289       fprintf (dump_file, ".\n");
290       break;
291     case HIST_TYPE_INDIR_CALL:
292       fprintf (dump_file, "Indirect call ");
293       if (hist->hvalue.counters)
294 	{
295 	   fprintf (dump_file, "value:"HOST_WIDEST_INT_PRINT_DEC
296 		    " match:"HOST_WIDEST_INT_PRINT_DEC
297 		    " all:"HOST_WIDEST_INT_PRINT_DEC,
298 		    (HOST_WIDEST_INT) hist->hvalue.counters[0],
299 		    (HOST_WIDEST_INT) hist->hvalue.counters[1],
300 		    (HOST_WIDEST_INT) hist->hvalue.counters[2]);
301 	}
302       fprintf (dump_file, ".\n");
303       break;
304    }
305 }
306 
307 /* Dump all histograms attached to STMT to DUMP_FILE.  */
308 
309 void
310 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple stmt)
311 {
312   histogram_value hist;
313   for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
314    dump_histogram_value (dump_file, hist);
315 }
316 
317 /* Remove all histograms associated with STMT.  */
318 
319 void
320 gimple_remove_stmt_histograms (struct function *fun, gimple stmt)
321 {
322   histogram_value val;
323   while ((val = gimple_histogram_value (fun, stmt)) != NULL)
324     gimple_remove_histogram_value (fun, stmt, val);
325 }
326 
327 /* Duplicate all histograms associates with OSTMT to STMT.  */
328 
329 void
330 gimple_duplicate_stmt_histograms (struct function *fun, gimple stmt,
331 				  struct function *ofun, gimple ostmt)
332 {
333   histogram_value val;
334   for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
335     {
336       histogram_value new_val = gimple_alloc_histogram_value (fun, val->type, NULL, NULL);
337       memcpy (new_val, val, sizeof (*val));
338       new_val->hvalue.stmt = stmt;
339       new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
340       memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
341       gimple_add_histogram_value (fun, stmt, new_val);
342     }
343 }
344 
345 
346 /* Move all histograms associated with OSTMT to STMT.  */
347 
348 void
349 gimple_move_stmt_histograms (struct function *fun, gimple stmt, gimple ostmt)
350 {
351   histogram_value val = gimple_histogram_value (fun, ostmt);
352   if (val)
353     {
354       /* The following three statements can't be reordered,
355          because histogram hashtab relies on stmt field value
356 	 for finding the exact slot. */
357       set_histogram_value (fun, ostmt, NULL);
358       for (; val != NULL; val = val->hvalue.next)
359 	val->hvalue.stmt = stmt;
360       set_histogram_value (fun, stmt, val);
361     }
362 }
363 
364 static bool error_found = false;
365 
366 /* Helper function for verify_histograms.  For each histogram reachable via htab
367    walk verify that it was reached via statement walk.  */
368 
369 static int
370 visit_hist (void **slot, void *data)
371 {
372   struct pointer_set_t *visited = (struct pointer_set_t *) data;
373   histogram_value hist = *(histogram_value *) slot;
374   if (!pointer_set_contains (visited, hist))
375     {
376       error ("dead histogram");
377       dump_histogram_value (stderr, hist);
378       debug_gimple_stmt (hist->hvalue.stmt);
379       error_found = true;
380     }
381   return 1;
382 }
383 
384 
385 /* Verify sanity of the histograms.  */
386 
387 DEBUG_FUNCTION void
388 verify_histograms (void)
389 {
390   basic_block bb;
391   gimple_stmt_iterator gsi;
392   histogram_value hist;
393   struct pointer_set_t *visited_hists;
394 
395   error_found = false;
396   visited_hists = pointer_set_create ();
397   FOR_EACH_BB (bb)
398     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
399       {
400 	gimple stmt = gsi_stmt (gsi);
401 
402 	for (hist = gimple_histogram_value (cfun, stmt); hist;
403 	     hist = hist->hvalue.next)
404 	  {
405 	    if (hist->hvalue.stmt != stmt)
406 	      {
407 		error ("Histogram value statement does not correspond to "
408 		       "the statement it is associated with");
409 		debug_gimple_stmt (stmt);
410 		dump_histogram_value (stderr, hist);
411 		error_found = true;
412 	      }
413             pointer_set_insert (visited_hists, hist);
414 	  }
415       }
416   if (VALUE_HISTOGRAMS (cfun))
417     htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, visited_hists);
418   pointer_set_destroy (visited_hists);
419   if (error_found)
420     internal_error ("verify_histograms failed");
421 }
422 
423 /* Helper function for verify_histograms.  For each histogram reachable via htab
424    walk verify that it was reached via statement walk.  */
425 
426 static int
427 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
428 {
429   histogram_value hist = *(histogram_value *) slot;
430   free (hist->hvalue.counters);
431 #ifdef ENABLE_CHECKING
432   memset (hist, 0xab, sizeof (*hist));
433 #endif
434   free (hist);
435   return 1;
436 }
437 
438 void
439 free_histograms (void)
440 {
441   if (VALUE_HISTOGRAMS (cfun))
442     {
443       htab_traverse (VALUE_HISTOGRAMS (cfun), free_hist, NULL);
444       htab_delete (VALUE_HISTOGRAMS (cfun));
445       VALUE_HISTOGRAMS (cfun) = NULL;
446     }
447 }
448 
449 
450 /* The overall number of invocations of the counter should match
451    execution count of basic block.  Report it as error rather than
452    internal error as it might mean that user has misused the profile
453    somehow.  */
454 
455 static bool
456 check_counter (gimple stmt, const char * name,
457 	       gcov_type *count, gcov_type *all, gcov_type bb_count)
458 {
459   if (*all != bb_count || *count > *all)
460     {
461       location_t locus;
462       locus = (stmt != NULL)
463               ? gimple_location (stmt)
464               : DECL_SOURCE_LOCATION (current_function_decl);
465       if (flag_profile_correction)
466         {
467 	  inform (locus, "correcting inconsistent value profile: "
468 		  "%s profiler overall count (%d) does not match BB count "
469                   "(%d)", name, (int)*all, (int)bb_count);
470 	  *all = bb_count;
471 	  if (*count > *all)
472             *count = *all;
473 	  return false;
474 	}
475       else
476 	{
477 	  error_at (locus, "corrupted value profile: %s "
478 		    "profile counter (%d out of %d) inconsistent with "
479 		    "basic-block count (%d)",
480 		    name,
481 		    (int) *count,
482 		    (int) *all,
483 		    (int) bb_count);
484 	  return true;
485 	}
486     }
487 
488   return false;
489 }
490 
491 
492 /* GIMPLE based transformations. */
493 
494 bool
495 gimple_value_profile_transformations (void)
496 {
497   basic_block bb;
498   gimple_stmt_iterator gsi;
499   bool changed = false;
500 
501   FOR_EACH_BB (bb)
502     {
503       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
504 	{
505 	  gimple stmt = gsi_stmt (gsi);
506 	  histogram_value th = gimple_histogram_value (cfun, stmt);
507 	  if (!th)
508 	    continue;
509 
510 	  if (dump_file)
511 	    {
512 	      fprintf (dump_file, "Trying transformations on stmt ");
513 	      print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
514 	      dump_histograms_for_stmt (cfun, dump_file, stmt);
515 	    }
516 
517 	  /* Transformations:  */
518 	  /* The order of things in this conditional controls which
519 	     transformation is used when more than one is applicable.  */
520 	  /* It is expected that any code added by the transformations
521 	     will be added before the current statement, and that the
522 	     current statement remain valid (although possibly
523 	     modified) upon return.  */
524 	  if (flag_value_profile_transformations
525 	      && (gimple_mod_subtract_transform (&gsi)
526 		  || gimple_divmod_fixed_value_transform (&gsi)
527 		  || gimple_mod_pow2_value_transform (&gsi)
528 		  || gimple_stringops_transform (&gsi)
529 		  || gimple_ic_transform (stmt)))
530 	    {
531 	      stmt = gsi_stmt (gsi);
532 	      changed = true;
533 	      /* Original statement may no longer be in the same block. */
534 	      if (bb != gimple_bb (stmt))
535 		{
536 	          bb = gimple_bb (stmt);
537 		  gsi = gsi_for_stmt (stmt);
538 		}
539 	    }
540         }
541     }
542 
543   if (changed)
544     {
545       counts_to_freqs ();
546     }
547 
548   return changed;
549 }
550 
551 
552 /* Generate code for transformation 1 (with parent gimple assignment
553    STMT and probability of taking the optimal path PROB, which is
554    equivalent to COUNT/ALL within roundoff error).  This generates the
555    result into a temp and returns the temp; it does not replace or
556    alter the original STMT.  */
557 
558 static tree
559 gimple_divmod_fixed_value (gimple stmt, tree value, int prob, gcov_type count,
560 			   gcov_type all)
561 {
562   gimple stmt1, stmt2, stmt3;
563   tree tmp0, tmp1, tmp2, tmpv;
564   gimple bb1end, bb2end, bb3end;
565   basic_block bb, bb2, bb3, bb4;
566   tree optype, op1, op2;
567   edge e12, e13, e23, e24, e34;
568   gimple_stmt_iterator gsi;
569 
570   gcc_assert (is_gimple_assign (stmt)
571 	      && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
572 		  || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
573 
574   optype = TREE_TYPE (gimple_assign_lhs (stmt));
575   op1 = gimple_assign_rhs1 (stmt);
576   op2 = gimple_assign_rhs2 (stmt);
577 
578   bb = gimple_bb (stmt);
579   gsi = gsi_for_stmt (stmt);
580 
581   tmpv = create_tmp_reg (optype, "PROF");
582   tmp0 = make_ssa_name (tmpv, NULL);
583   tmp1 = make_ssa_name (tmpv, NULL);
584   stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
585   SSA_NAME_DEF_STMT (tmp0) = stmt1;
586   stmt2 = gimple_build_assign (tmp1, op2);
587   SSA_NAME_DEF_STMT (tmp1) = stmt2;
588   stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
589   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
590   gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
591   gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
592   bb1end = stmt3;
593 
594   tmp2 = make_rename_temp (optype, "PROF");
595   stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
596 					op1, tmp0);
597   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
598   bb2end = stmt1;
599 
600   stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), tmp2,
601 					op1, op2);
602   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
603   bb3end = stmt1;
604 
605   /* Fix CFG. */
606   /* Edge e23 connects bb2 to bb3, etc. */
607   e12 = split_block (bb, bb1end);
608   bb2 = e12->dest;
609   bb2->count = count;
610   e23 = split_block (bb2, bb2end);
611   bb3 = e23->dest;
612   bb3->count = all - count;
613   e34 = split_block (bb3, bb3end);
614   bb4 = e34->dest;
615   bb4->count = all;
616 
617   e12->flags &= ~EDGE_FALLTHRU;
618   e12->flags |= EDGE_FALSE_VALUE;
619   e12->probability = prob;
620   e12->count = count;
621 
622   e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
623   e13->probability = REG_BR_PROB_BASE - prob;
624   e13->count = all - count;
625 
626   remove_edge (e23);
627 
628   e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
629   e24->probability = REG_BR_PROB_BASE;
630   e24->count = count;
631 
632   e34->probability = REG_BR_PROB_BASE;
633   e34->count = all - count;
634 
635   return tmp2;
636 }
637 
638 
639 /* Do transform 1) on INSN if applicable.  */
640 
641 static bool
642 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
643 {
644   histogram_value histogram;
645   enum tree_code code;
646   gcov_type val, count, all;
647   tree result, value, tree_val;
648   gcov_type prob;
649   gimple stmt;
650 
651   stmt = gsi_stmt (*si);
652   if (gimple_code (stmt) != GIMPLE_ASSIGN)
653     return false;
654 
655   if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
656     return false;
657 
658   code = gimple_assign_rhs_code (stmt);
659 
660   if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
661     return false;
662 
663   histogram = gimple_histogram_value_of_type (cfun, stmt,
664 					      HIST_TYPE_SINGLE_VALUE);
665   if (!histogram)
666     return false;
667 
668   value = histogram->hvalue.value;
669   val = histogram->hvalue.counters[0];
670   count = histogram->hvalue.counters[1];
671   all = histogram->hvalue.counters[2];
672   gimple_remove_histogram_value (cfun, stmt, histogram);
673 
674   /* We require that count is at least half of all; this means
675      that for the transformation to fire the value must be constant
676      at least 50% of time (and 75% gives the guarantee of usage).  */
677   if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
678       || 2 * count < all
679       || optimize_bb_for_size_p (gimple_bb (stmt)))
680     return false;
681 
682   if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
683     return false;
684 
685   /* Compute probability of taking the optimal path.  */
686   if (all > 0)
687     prob = (count * REG_BR_PROB_BASE + all / 2) / all;
688   else
689     prob = 0;
690 
691   tree_val = build_int_cst_wide (get_gcov_type (),
692 				 (unsigned HOST_WIDE_INT) val,
693 				 val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
694   result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
695 
696   if (dump_file)
697     {
698       fprintf (dump_file, "Div/mod by constant ");
699       print_generic_expr (dump_file, value, TDF_SLIM);
700       fprintf (dump_file, "=");
701       print_generic_expr (dump_file, tree_val, TDF_SLIM);
702       fprintf (dump_file, " transformation on insn ");
703       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
704     }
705 
706   gimple_assign_set_rhs_from_tree (si, result);
707   update_stmt (gsi_stmt (*si));
708 
709   return true;
710 }
711 
712 /* Generate code for transformation 2 (with parent gimple assign STMT and
713    probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
714    within roundoff error).  This generates the result into a temp and returns
715    the temp; it does not replace or alter the original STMT.  */
716 static tree
717 gimple_mod_pow2 (gimple stmt, int prob, gcov_type count, gcov_type all)
718 {
719   gimple stmt1, stmt2, stmt3, stmt4;
720   tree tmp2, tmp3, tmpv;
721   gimple bb1end, bb2end, bb3end;
722   basic_block bb, bb2, bb3, bb4;
723   tree optype, op1, op2;
724   edge e12, e13, e23, e24, e34;
725   gimple_stmt_iterator gsi;
726   tree result;
727 
728   gcc_assert (is_gimple_assign (stmt)
729 	      && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
730 
731   optype = TREE_TYPE (gimple_assign_lhs (stmt));
732   op1 = gimple_assign_rhs1 (stmt);
733   op2 = gimple_assign_rhs2 (stmt);
734 
735   bb = gimple_bb (stmt);
736   gsi = gsi_for_stmt (stmt);
737 
738   result = make_rename_temp (optype, "PROF");
739   tmpv = create_tmp_var (optype, "PROF");
740   tmp2 = make_ssa_name (tmpv, NULL);
741   tmp3 = make_ssa_name (tmpv, NULL);
742   stmt2 = gimple_build_assign_with_ops (PLUS_EXPR, tmp2, op2,
743 					build_int_cst (optype, -1));
744   SSA_NAME_DEF_STMT (tmp2) = stmt2;
745   stmt3 = gimple_build_assign_with_ops (BIT_AND_EXPR, tmp3, tmp2, op2);
746   SSA_NAME_DEF_STMT (tmp3) = stmt3;
747   stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
748 			     NULL_TREE, NULL_TREE);
749   gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
750   gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
751   gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
752   bb1end = stmt4;
753 
754   /* tmp2 == op2-1 inherited from previous block.  */
755   stmt1 = gimple_build_assign_with_ops (BIT_AND_EXPR, result, op1, tmp2);
756   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
757   bb2end = stmt1;
758 
759   stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
760 					op1, op2);
761   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
762   bb3end = stmt1;
763 
764   /* Fix CFG. */
765   /* Edge e23 connects bb2 to bb3, etc. */
766   e12 = split_block (bb, bb1end);
767   bb2 = e12->dest;
768   bb2->count = count;
769   e23 = split_block (bb2, bb2end);
770   bb3 = e23->dest;
771   bb3->count = all - count;
772   e34 = split_block (bb3, bb3end);
773   bb4 = e34->dest;
774   bb4->count = all;
775 
776   e12->flags &= ~EDGE_FALLTHRU;
777   e12->flags |= EDGE_FALSE_VALUE;
778   e12->probability = prob;
779   e12->count = count;
780 
781   e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
782   e13->probability = REG_BR_PROB_BASE - prob;
783   e13->count = all - count;
784 
785   remove_edge (e23);
786 
787   e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
788   e24->probability = REG_BR_PROB_BASE;
789   e24->count = count;
790 
791   e34->probability = REG_BR_PROB_BASE;
792   e34->count = all - count;
793 
794   return result;
795 }
796 
797 /* Do transform 2) on INSN if applicable.  */
798 static bool
799 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
800 {
801   histogram_value histogram;
802   enum tree_code code;
803   gcov_type count, wrong_values, all;
804   tree lhs_type, result, value;
805   gcov_type prob;
806   gimple stmt;
807 
808   stmt = gsi_stmt (*si);
809   if (gimple_code (stmt) != GIMPLE_ASSIGN)
810     return false;
811 
812   lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
813   if (!INTEGRAL_TYPE_P (lhs_type))
814     return false;
815 
816   code = gimple_assign_rhs_code (stmt);
817 
818   if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
819     return false;
820 
821   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
822   if (!histogram)
823     return false;
824 
825   value = histogram->hvalue.value;
826   wrong_values = histogram->hvalue.counters[0];
827   count = histogram->hvalue.counters[1];
828 
829   gimple_remove_histogram_value (cfun, stmt, histogram);
830 
831   /* We require that we hit a power of 2 at least half of all evaluations.  */
832   if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
833       || count < wrong_values
834       || optimize_bb_for_size_p (gimple_bb (stmt)))
835     return false;
836 
837   if (dump_file)
838     {
839       fprintf (dump_file, "Mod power of 2 transformation on insn ");
840       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
841     }
842 
843   /* Compute probability of taking the optimal path.  */
844   all = count + wrong_values;
845 
846   if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
847     return false;
848 
849   if (all > 0)
850     prob = (count * REG_BR_PROB_BASE + all / 2) / all;
851   else
852     prob = 0;
853 
854   result = gimple_mod_pow2 (stmt, prob, count, all);
855 
856   gimple_assign_set_rhs_from_tree (si, result);
857   update_stmt (gsi_stmt (*si));
858 
859   return true;
860 }
861 
862 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
863    NCOUNTS the number of cases to support.  Currently only NCOUNTS==0 or 1 is
864    supported and this is built into this interface.  The probabilities of taking
865    the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
866    COUNT2/ALL respectively within roundoff error).  This generates the
867    result into a temp and returns the temp; it does not replace or alter
868    the original STMT.  */
869 /* FIXME: Generalize the interface to handle NCOUNTS > 1.  */
870 
871 static tree
872 gimple_mod_subtract (gimple stmt, int prob1, int prob2, int ncounts,
873 		     gcov_type count1, gcov_type count2, gcov_type all)
874 {
875   gimple stmt1, stmt2, stmt3;
876   tree tmp1;
877   gimple bb1end, bb2end = NULL, bb3end;
878   basic_block bb, bb2, bb3, bb4;
879   tree optype, op1, op2;
880   edge e12, e23 = 0, e24, e34, e14;
881   gimple_stmt_iterator gsi;
882   tree result;
883 
884   gcc_assert (is_gimple_assign (stmt)
885 	      && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
886 
887   optype = TREE_TYPE (gimple_assign_lhs (stmt));
888   op1 = gimple_assign_rhs1 (stmt);
889   op2 = gimple_assign_rhs2 (stmt);
890 
891   bb = gimple_bb (stmt);
892   gsi = gsi_for_stmt (stmt);
893 
894   result = make_rename_temp (optype, "PROF");
895   tmp1 = make_ssa_name (create_tmp_var (optype, "PROF"), NULL);
896   stmt1 = gimple_build_assign (result, op1);
897   stmt2 = gimple_build_assign (tmp1, op2);
898   SSA_NAME_DEF_STMT (tmp1) = stmt2;
899   stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
900   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
901   gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
902   gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
903   bb1end = stmt3;
904 
905   if (ncounts)	/* Assumed to be 0 or 1 */
906     {
907       stmt1 = gimple_build_assign_with_ops (MINUS_EXPR, result, result, tmp1);
908       stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
909       gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
910       gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
911       bb2end = stmt2;
912     }
913 
914   /* Fallback case. */
915   stmt1 = gimple_build_assign_with_ops (gimple_assign_rhs_code (stmt), result,
916 					result, tmp1);
917   gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
918   bb3end = stmt1;
919 
920   /* Fix CFG. */
921   /* Edge e23 connects bb2 to bb3, etc. */
922   /* However block 3 is optional; if it is not there, references
923      to 3 really refer to block 2. */
924   e12 = split_block (bb, bb1end);
925   bb2 = e12->dest;
926   bb2->count = all - count1;
927 
928   if (ncounts)	/* Assumed to be 0 or 1.  */
929     {
930       e23 = split_block (bb2, bb2end);
931       bb3 = e23->dest;
932       bb3->count = all - count1 - count2;
933     }
934 
935   e34 = split_block (ncounts ? bb3 : bb2, bb3end);
936   bb4 = e34->dest;
937   bb4->count = all;
938 
939   e12->flags &= ~EDGE_FALLTHRU;
940   e12->flags |= EDGE_FALSE_VALUE;
941   e12->probability = REG_BR_PROB_BASE - prob1;
942   e12->count = all - count1;
943 
944   e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
945   e14->probability = prob1;
946   e14->count = count1;
947 
948   if (ncounts)  /* Assumed to be 0 or 1.  */
949     {
950       e23->flags &= ~EDGE_FALLTHRU;
951       e23->flags |= EDGE_FALSE_VALUE;
952       e23->count = all - count1 - count2;
953       e23->probability = REG_BR_PROB_BASE - prob2;
954 
955       e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
956       e24->probability = prob2;
957       e24->count = count2;
958     }
959 
960   e34->probability = REG_BR_PROB_BASE;
961   e34->count = all - count1 - count2;
962 
963   return result;
964 }
965 
966 
967 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable.  */
968 
969 static bool
970 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
971 {
972   histogram_value histogram;
973   enum tree_code code;
974   gcov_type count, wrong_values, all;
975   tree lhs_type, result;
976   gcov_type prob1, prob2;
977   unsigned int i, steps;
978   gcov_type count1, count2;
979   gimple stmt;
980 
981   stmt = gsi_stmt (*si);
982   if (gimple_code (stmt) != GIMPLE_ASSIGN)
983     return false;
984 
985   lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
986   if (!INTEGRAL_TYPE_P (lhs_type))
987     return false;
988 
989   code = gimple_assign_rhs_code (stmt);
990 
991   if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
992     return false;
993 
994   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
995   if (!histogram)
996     return false;
997 
998   all = 0;
999   wrong_values = 0;
1000   for (i = 0; i < histogram->hdata.intvl.steps; i++)
1001     all += histogram->hvalue.counters[i];
1002 
1003   wrong_values += histogram->hvalue.counters[i];
1004   wrong_values += histogram->hvalue.counters[i+1];
1005   steps = histogram->hdata.intvl.steps;
1006   all += wrong_values;
1007   count1 = histogram->hvalue.counters[0];
1008   count2 = histogram->hvalue.counters[1];
1009 
1010   /* Compute probability of taking the optimal path.  */
1011   if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1012     {
1013       gimple_remove_histogram_value (cfun, stmt, histogram);
1014       return false;
1015     }
1016 
1017   if (flag_profile_correction && count1 + count2 > all)
1018       all = count1 + count2;
1019 
1020   gcc_assert (count1 + count2 <= all);
1021 
1022   /* We require that we use just subtractions in at least 50% of all
1023      evaluations.  */
1024   count = 0;
1025   for (i = 0; i < histogram->hdata.intvl.steps; i++)
1026     {
1027       count += histogram->hvalue.counters[i];
1028       if (count * 2 >= all)
1029 	break;
1030     }
1031   if (i == steps
1032       || optimize_bb_for_size_p (gimple_bb (stmt)))
1033     return false;
1034 
1035   gimple_remove_histogram_value (cfun, stmt, histogram);
1036   if (dump_file)
1037     {
1038       fprintf (dump_file, "Mod subtract transformation on insn ");
1039       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1040     }
1041 
1042   /* Compute probability of taking the optimal path(s).  */
1043   if (all > 0)
1044     {
1045       prob1 = (count1 * REG_BR_PROB_BASE + all / 2) / all;
1046       prob2 = (count2 * REG_BR_PROB_BASE + all / 2) / all;
1047     }
1048   else
1049     {
1050       prob1 = prob2 = 0;
1051     }
1052 
1053   /* In practice, "steps" is always 2.  This interface reflects this,
1054      and will need to be changed if "steps" can change.  */
1055   result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1056 
1057   gimple_assign_set_rhs_from_tree (si, result);
1058   update_stmt (gsi_stmt (*si));
1059 
1060   return true;
1061 }
1062 
1063 static VEC(cgraph_node_ptr, heap) *cgraph_node_map = NULL;
1064 
1065 /* Initialize map from FUNCDEF_NO to CGRAPH_NODE.  */
1066 
1067 void
1068 init_node_map (void)
1069 {
1070   struct cgraph_node *n;
1071 
1072   if (get_last_funcdef_no ())
1073     VEC_safe_grow_cleared (cgraph_node_ptr, heap,
1074                            cgraph_node_map, get_last_funcdef_no ());
1075 
1076   for (n = cgraph_nodes; n; n = n->next)
1077     {
1078       if (DECL_STRUCT_FUNCTION (n->decl))
1079         VEC_replace (cgraph_node_ptr, cgraph_node_map,
1080                      DECL_STRUCT_FUNCTION (n->decl)->funcdef_no, n);
1081     }
1082 }
1083 
1084 /* Delete the CGRAPH_NODE_MAP.  */
1085 
1086 void
1087 del_node_map (void)
1088 {
1089    VEC_free (cgraph_node_ptr, heap, cgraph_node_map);
1090    cgraph_node_map = NULL;
1091 }
1092 
1093 /* Return cgraph node for function with pid */
1094 
1095 static inline struct cgraph_node*
1096 find_func_by_funcdef_no (int func_id)
1097 {
1098   int max_id = get_last_funcdef_no ();
1099   if (func_id >= max_id || VEC_index (cgraph_node_ptr,
1100                                       cgraph_node_map,
1101                                       func_id) == NULL)
1102     {
1103       if (flag_profile_correction)
1104         inform (DECL_SOURCE_LOCATION (current_function_decl),
1105                 "Inconsistent profile: indirect call target (%d) does not exist", func_id);
1106       else
1107         error ("Inconsistent profile: indirect call target (%d) does not exist", func_id);
1108 
1109       return NULL;
1110     }
1111 
1112   return VEC_index (cgraph_node_ptr, cgraph_node_map, func_id);
1113 }
1114 
1115 /* Perform sanity check on the indirect call target. Due to race conditions,
1116    false function target may be attributed to an indirect call site. If the
1117    call expression type mismatches with the target function's type, expand_call
1118    may ICE. Here we only do very minimal sanity check just to make compiler happy.
1119    Returns true if TARGET is considered ok for call CALL_STMT.  */
1120 
1121 static bool
1122 check_ic_target (gimple call_stmt, struct cgraph_node *target)
1123 {
1124    location_t locus;
1125    if (gimple_check_call_matching_types (call_stmt, target->decl))
1126      return true;
1127 
1128    locus =  gimple_location (call_stmt);
1129    inform (locus, "Skipping target %s with mismatching types for icall ",
1130            cgraph_node_name (target));
1131    return false;
1132 }
1133 
1134 /* Do transformation
1135 
1136   if (actual_callee_address == address_of_most_common_function/method)
1137     do direct call
1138   else
1139     old call
1140  */
1141 
1142 static gimple
1143 gimple_ic (gimple icall_stmt, struct cgraph_node *direct_call,
1144 	   int prob, gcov_type count, gcov_type all)
1145 {
1146   gimple dcall_stmt, load_stmt, cond_stmt;
1147   tree tmp0, tmp1, tmpv, tmp;
1148   basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1149   tree optype = build_pointer_type (void_type_node);
1150   edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1151   gimple_stmt_iterator gsi;
1152   int lp_nr, dflags;
1153 
1154   cond_bb = gimple_bb (icall_stmt);
1155   gsi = gsi_for_stmt (icall_stmt);
1156 
1157   tmpv = create_tmp_reg (optype, "PROF");
1158   tmp0 = make_ssa_name (tmpv, NULL);
1159   tmp1 = make_ssa_name (tmpv, NULL);
1160   tmp = unshare_expr (gimple_call_fn (icall_stmt));
1161   load_stmt = gimple_build_assign (tmp0, tmp);
1162   SSA_NAME_DEF_STMT (tmp0) = load_stmt;
1163   gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1164 
1165   tmp = fold_convert (optype, build_addr (direct_call->decl,
1166 					  current_function_decl));
1167   load_stmt = gimple_build_assign (tmp1, tmp);
1168   SSA_NAME_DEF_STMT (tmp1) = load_stmt;
1169   gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1170 
1171   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1172   gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1173 
1174   gimple_set_vdef (icall_stmt, NULL_TREE);
1175   gimple_set_vuse (icall_stmt, NULL_TREE);
1176   update_stmt (icall_stmt);
1177   dcall_stmt = gimple_copy (icall_stmt);
1178   gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1179   dflags = flags_from_decl_or_type (direct_call->decl);
1180   if ((dflags & ECF_NORETURN) != 0)
1181     gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1182   gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1183 
1184   /* Fix CFG. */
1185   /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1186   e_cd = split_block (cond_bb, cond_stmt);
1187   dcall_bb = e_cd->dest;
1188   dcall_bb->count = count;
1189 
1190   e_di = split_block (dcall_bb, dcall_stmt);
1191   icall_bb = e_di->dest;
1192   icall_bb->count = all - count;
1193 
1194   /* Do not disturb existing EH edges from the indirect call.  */
1195   if (!stmt_ends_bb_p (icall_stmt))
1196     e_ij = split_block (icall_bb, icall_stmt);
1197   else
1198     {
1199       e_ij = find_fallthru_edge (icall_bb->succs);
1200       /* The indirect call might be noreturn.  */
1201       if (e_ij != NULL)
1202 	{
1203 	  e_ij->probability = REG_BR_PROB_BASE;
1204 	  e_ij->count = all - count;
1205 	  e_ij = single_pred_edge (split_edge (e_ij));
1206 	}
1207     }
1208   if (e_ij != NULL)
1209     {
1210       join_bb = e_ij->dest;
1211       join_bb->count = all;
1212     }
1213 
1214   e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1215   e_cd->probability = prob;
1216   e_cd->count = count;
1217 
1218   e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1219   e_ci->probability = REG_BR_PROB_BASE - prob;
1220   e_ci->count = all - count;
1221 
1222   remove_edge (e_di);
1223 
1224   if (e_ij != NULL)
1225     {
1226       if ((dflags & ECF_NORETURN) != 0)
1227 	e_ij->count = all;
1228       else
1229 	{
1230 	  e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1231 	  e_dj->probability = REG_BR_PROB_BASE;
1232 	  e_dj->count = count;
1233 
1234 	  e_ij->count = all - count;
1235 	}
1236       e_ij->probability = REG_BR_PROB_BASE;
1237     }
1238 
1239   /* Insert PHI node for the call result if necessary.  */
1240   if (gimple_call_lhs (icall_stmt)
1241       && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1242       && (dflags & ECF_NORETURN) == 0)
1243     {
1244       tree result = gimple_call_lhs (icall_stmt);
1245       gimple phi = create_phi_node (result, join_bb);
1246       SSA_NAME_DEF_STMT (result) = phi;
1247       gimple_call_set_lhs (icall_stmt,
1248 			   make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
1249       add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1250       gimple_call_set_lhs (dcall_stmt,
1251 			   make_ssa_name (SSA_NAME_VAR (result), dcall_stmt));
1252       add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1253     }
1254 
1255   /* Build an EH edge for the direct call if necessary.  */
1256   lp_nr = lookup_stmt_eh_lp (icall_stmt);
1257   if (lp_nr != 0
1258       && stmt_could_throw_p (dcall_stmt))
1259     {
1260       edge e_eh, e;
1261       edge_iterator ei;
1262       gimple_stmt_iterator psi;
1263 
1264       add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1265       FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1266 	if (e_eh->flags & EDGE_EH)
1267 	  break;
1268       e = make_edge (dcall_bb, e_eh->dest, EDGE_EH);
1269       for (psi = gsi_start_phis (e_eh->dest);
1270 	   !gsi_end_p (psi); gsi_next (&psi))
1271 	{
1272 	  gimple phi = gsi_stmt (psi);
1273 	  SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1274 		   PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1275 	}
1276     }
1277 
1278   return dcall_stmt;
1279 }
1280 
1281 /*
1282   For every checked indirect/virtual call determine if most common pid of
1283   function/class method has probability more than 50%. If yes modify code of
1284   this call to:
1285  */
1286 
1287 static bool
1288 gimple_ic_transform (gimple stmt)
1289 {
1290   histogram_value histogram;
1291   gcov_type val, count, all, bb_all;
1292   gcov_type prob;
1293   gimple modify;
1294   struct cgraph_node *direct_call;
1295 
1296   if (gimple_code (stmt) != GIMPLE_CALL)
1297     return false;
1298 
1299   if (gimple_call_fndecl (stmt) != NULL_TREE)
1300     return false;
1301 
1302   if (gimple_call_internal_p (stmt))
1303     return false;
1304 
1305   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1306   if (!histogram)
1307     return false;
1308 
1309   val = histogram->hvalue.counters [0];
1310   count = histogram->hvalue.counters [1];
1311   all = histogram->hvalue.counters [2];
1312   gimple_remove_histogram_value (cfun, stmt, histogram);
1313 
1314   if (4 * count <= 3 * all)
1315     return false;
1316 
1317   bb_all = gimple_bb (stmt)->count;
1318   /* The order of CHECK_COUNTER calls is important -
1319      since check_counter can correct the third parameter
1320      and we want to make count <= all <= bb_all. */
1321   if ( check_counter (stmt, "ic", &all, &bb_all, bb_all)
1322       || check_counter (stmt, "ic", &count, &all, all))
1323     return false;
1324 
1325   if (all > 0)
1326     prob = (count * REG_BR_PROB_BASE + all / 2) / all;
1327   else
1328     prob = 0;
1329   direct_call = find_func_by_funcdef_no ((int)val);
1330 
1331   if (direct_call == NULL)
1332     return false;
1333 
1334   if (!check_ic_target (stmt, direct_call))
1335     return false;
1336 
1337   modify = gimple_ic (stmt, direct_call, prob, count, all);
1338 
1339   if (dump_file)
1340     {
1341       fprintf (dump_file, "Indirect call -> direct call ");
1342       print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1343       fprintf (dump_file, "=> ");
1344       print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1345       fprintf (dump_file, " transformation on insn ");
1346       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1347       fprintf (dump_file, " to ");
1348       print_gimple_stmt (dump_file, modify, 0, TDF_SLIM);
1349       fprintf (dump_file, "hist->count "HOST_WIDEST_INT_PRINT_DEC
1350 	       " hist->all "HOST_WIDEST_INT_PRINT_DEC"\n", count, all);
1351     }
1352 
1353   return true;
1354 }
1355 
1356 /* Return true if the stringop CALL with FNDECL shall be profiled.
1357    SIZE_ARG be set to the argument index for the size of the string
1358    operation.
1359 */
1360 static bool
1361 interesting_stringop_to_profile_p (tree fndecl, gimple call, int *size_arg)
1362 {
1363   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
1364 
1365   if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
1366       && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
1367     return false;
1368 
1369   switch (fcode)
1370     {
1371      case BUILT_IN_MEMCPY:
1372      case BUILT_IN_MEMPCPY:
1373        *size_arg = 2;
1374        return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1375 				       INTEGER_TYPE, VOID_TYPE);
1376      case BUILT_IN_MEMSET:
1377        *size_arg = 2;
1378        return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1379 				      INTEGER_TYPE, VOID_TYPE);
1380      case BUILT_IN_BZERO:
1381        *size_arg = 1;
1382        return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1383 				       VOID_TYPE);
1384      default:
1385        gcc_unreachable ();
1386     }
1387 }
1388 
1389 /* Convert   stringop (..., vcall_size)
1390    into
1391    if (vcall_size == icall_size)
1392      stringop (..., icall_size);
1393    else
1394      stringop (..., vcall_size);
1395    assuming we'll propagate a true constant into ICALL_SIZE later.  */
1396 
1397 static void
1398 gimple_stringop_fixed_value (gimple vcall_stmt, tree icall_size, int prob,
1399 			     gcov_type count, gcov_type all)
1400 {
1401   gimple tmp_stmt, cond_stmt, icall_stmt;
1402   tree tmp0, tmp1, tmpv, vcall_size, optype;
1403   basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1404   edge e_ci, e_cv, e_iv, e_ij, e_vj;
1405   gimple_stmt_iterator gsi;
1406   tree fndecl;
1407   int size_arg;
1408 
1409   fndecl = gimple_call_fndecl (vcall_stmt);
1410   if (!interesting_stringop_to_profile_p (fndecl, vcall_stmt, &size_arg))
1411     gcc_unreachable();
1412 
1413   cond_bb = gimple_bb (vcall_stmt);
1414   gsi = gsi_for_stmt (vcall_stmt);
1415 
1416   vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1417   optype = TREE_TYPE (vcall_size);
1418 
1419   tmpv = create_tmp_var (optype, "PROF");
1420   tmp0 = make_ssa_name (tmpv, NULL);
1421   tmp1 = make_ssa_name (tmpv, NULL);
1422   tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1423   SSA_NAME_DEF_STMT (tmp0) = tmp_stmt;
1424   gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1425 
1426   tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1427   SSA_NAME_DEF_STMT (tmp1) = tmp_stmt;
1428   gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1429 
1430   cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1431   gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1432 
1433   gimple_set_vdef (vcall_stmt, NULL);
1434   gimple_set_vuse (vcall_stmt, NULL);
1435   update_stmt (vcall_stmt);
1436   icall_stmt = gimple_copy (vcall_stmt);
1437   gimple_call_set_arg (icall_stmt, size_arg, icall_size);
1438   gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1439 
1440   /* Fix CFG. */
1441   /* Edge e_ci connects cond_bb to icall_bb, etc. */
1442   e_ci = split_block (cond_bb, cond_stmt);
1443   icall_bb = e_ci->dest;
1444   icall_bb->count = count;
1445 
1446   e_iv = split_block (icall_bb, icall_stmt);
1447   vcall_bb = e_iv->dest;
1448   vcall_bb->count = all - count;
1449 
1450   e_vj = split_block (vcall_bb, vcall_stmt);
1451   join_bb = e_vj->dest;
1452   join_bb->count = all;
1453 
1454   e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1455   e_ci->probability = prob;
1456   e_ci->count = count;
1457 
1458   e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1459   e_cv->probability = REG_BR_PROB_BASE - prob;
1460   e_cv->count = all - count;
1461 
1462   remove_edge (e_iv);
1463 
1464   e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1465   e_ij->probability = REG_BR_PROB_BASE;
1466   e_ij->count = count;
1467 
1468   e_vj->probability = REG_BR_PROB_BASE;
1469   e_vj->count = all - count;
1470 
1471   /* Insert PHI node for the call result if necessary.  */
1472   if (gimple_call_lhs (vcall_stmt)
1473       && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1474     {
1475       tree result = gimple_call_lhs (vcall_stmt);
1476       gimple phi = create_phi_node (result, join_bb);
1477       SSA_NAME_DEF_STMT (result) = phi;
1478       gimple_call_set_lhs (vcall_stmt,
1479 			   make_ssa_name (SSA_NAME_VAR (result), vcall_stmt));
1480       add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1481       gimple_call_set_lhs (icall_stmt,
1482 			   make_ssa_name (SSA_NAME_VAR (result), icall_stmt));
1483       add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1484     }
1485 
1486   /* Because these are all string op builtins, they're all nothrow.  */
1487   gcc_assert (!stmt_could_throw_p (vcall_stmt));
1488   gcc_assert (!stmt_could_throw_p (icall_stmt));
1489 }
1490 
1491 /* Find values inside STMT for that we want to measure histograms for
1492    division/modulo optimization.  */
1493 static bool
1494 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1495 {
1496   gimple stmt = gsi_stmt (*gsi);
1497   tree fndecl;
1498   tree blck_size;
1499   enum built_in_function fcode;
1500   histogram_value histogram;
1501   gcov_type count, all, val;
1502   tree dest, src;
1503   unsigned int dest_align, src_align;
1504   gcov_type prob;
1505   tree tree_val;
1506   int size_arg;
1507 
1508   if (gimple_code (stmt) != GIMPLE_CALL)
1509     return false;
1510   fndecl = gimple_call_fndecl (stmt);
1511   if (!fndecl)
1512     return false;
1513   fcode = DECL_FUNCTION_CODE (fndecl);
1514   if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1515     return false;
1516 
1517   blck_size = gimple_call_arg (stmt, size_arg);
1518   if (TREE_CODE (blck_size) == INTEGER_CST)
1519     return false;
1520 
1521   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_SINGLE_VALUE);
1522   if (!histogram)
1523     return false;
1524   val = histogram->hvalue.counters[0];
1525   count = histogram->hvalue.counters[1];
1526   all = histogram->hvalue.counters[2];
1527   gimple_remove_histogram_value (cfun, stmt, histogram);
1528   /* We require that count is at least half of all; this means
1529      that for the transformation to fire the value must be constant
1530      at least 80% of time.  */
1531   if ((6 * count / 5) < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1532     return false;
1533   if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1534     return false;
1535   if (all > 0)
1536     prob = (count * REG_BR_PROB_BASE + all / 2) / all;
1537   else
1538     prob = 0;
1539   dest = gimple_call_arg (stmt, 0);
1540   dest_align = get_pointer_alignment (dest);
1541   switch (fcode)
1542     {
1543     case BUILT_IN_MEMCPY:
1544     case BUILT_IN_MEMPCPY:
1545       src = gimple_call_arg (stmt, 1);
1546       src_align = get_pointer_alignment (src);
1547       if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1548 	return false;
1549       break;
1550     case BUILT_IN_MEMSET:
1551       if (!can_store_by_pieces (val, builtin_memset_read_str,
1552 				gimple_call_arg (stmt, 1),
1553 				dest_align, true))
1554 	return false;
1555       break;
1556     case BUILT_IN_BZERO:
1557       if (!can_store_by_pieces (val, builtin_memset_read_str,
1558 				integer_zero_node,
1559 				dest_align, true))
1560 	return false;
1561       break;
1562     default:
1563       gcc_unreachable ();
1564     }
1565   tree_val = build_int_cst_wide (get_gcov_type (),
1566 				 (unsigned HOST_WIDE_INT) val,
1567 				 val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1);
1568   if (dump_file)
1569     {
1570       fprintf (dump_file, "Single value %i stringop transformation on ",
1571 	       (int)val);
1572       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1573     }
1574   gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1575 
1576   return true;
1577 }
1578 
1579 void
1580 stringop_block_profile (gimple stmt, unsigned int *expected_align,
1581 			HOST_WIDE_INT *expected_size)
1582 {
1583   histogram_value histogram;
1584   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1585   if (!histogram)
1586     *expected_size = -1;
1587   else if (!histogram->hvalue.counters[1])
1588     {
1589       *expected_size = -1;
1590       gimple_remove_histogram_value (cfun, stmt, histogram);
1591     }
1592   else
1593     {
1594       gcov_type size;
1595       size = ((histogram->hvalue.counters[0]
1596 	      + histogram->hvalue.counters[1] / 2)
1597 	       / histogram->hvalue.counters[1]);
1598       /* Even if we can hold bigger value in SIZE, INT_MAX
1599 	 is safe "infinity" for code generation strategies.  */
1600       if (size > INT_MAX)
1601 	size = INT_MAX;
1602       *expected_size = size;
1603       gimple_remove_histogram_value (cfun, stmt, histogram);
1604     }
1605   histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1606   if (!histogram)
1607     *expected_align = 0;
1608   else if (!histogram->hvalue.counters[0])
1609     {
1610       gimple_remove_histogram_value (cfun, stmt, histogram);
1611       *expected_align = 0;
1612     }
1613   else
1614     {
1615       gcov_type count;
1616       int alignment;
1617 
1618       count = histogram->hvalue.counters[0];
1619       alignment = 1;
1620       while (!(count & alignment)
1621 	     && (alignment * 2 * BITS_PER_UNIT))
1622 	alignment <<= 1;
1623       *expected_align = alignment * BITS_PER_UNIT;
1624       gimple_remove_histogram_value (cfun, stmt, histogram);
1625     }
1626 }
1627 
1628 
1629 /* Find values inside STMT for that we want to measure histograms for
1630    division/modulo optimization.  */
1631 static void
1632 gimple_divmod_values_to_profile (gimple stmt, histogram_values *values)
1633 {
1634   tree lhs, divisor, op0, type;
1635   histogram_value hist;
1636 
1637   if (gimple_code (stmt) != GIMPLE_ASSIGN)
1638     return;
1639 
1640   lhs = gimple_assign_lhs (stmt);
1641   type = TREE_TYPE (lhs);
1642   if (!INTEGRAL_TYPE_P (type))
1643     return;
1644 
1645   switch (gimple_assign_rhs_code (stmt))
1646     {
1647     case TRUNC_DIV_EXPR:
1648     case TRUNC_MOD_EXPR:
1649       divisor = gimple_assign_rhs2 (stmt);
1650       op0 = gimple_assign_rhs1 (stmt);
1651 
1652       VEC_reserve (histogram_value, heap, *values, 3);
1653 
1654       if (is_gimple_reg (divisor))
1655 	/* Check for the case where the divisor is the same value most
1656 	   of the time.  */
1657 	VEC_quick_push (histogram_value, *values,
1658 			gimple_alloc_histogram_value (cfun,
1659 						      HIST_TYPE_SINGLE_VALUE,
1660 						      stmt, divisor));
1661 
1662       /* For mod, check whether it is not often a noop (or replaceable by
1663 	 a few subtractions).  */
1664       if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1665 	  && TYPE_UNSIGNED (type))
1666 	{
1667           tree val;
1668           /* Check for a special case where the divisor is power of 2.  */
1669 	  VEC_quick_push (histogram_value, *values,
1670 			  gimple_alloc_histogram_value (cfun, HIST_TYPE_POW2,
1671 							stmt, divisor));
1672 
1673 	  val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1674 	  hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1675 					       stmt, val);
1676 	  hist->hdata.intvl.int_start = 0;
1677 	  hist->hdata.intvl.steps = 2;
1678 	  VEC_quick_push (histogram_value, *values, hist);
1679 	}
1680       return;
1681 
1682     default:
1683       return;
1684     }
1685 }
1686 
1687 /* Find calls inside STMT for that we want to measure histograms for
1688    indirect/virtual call optimization. */
1689 
1690 static void
1691 gimple_indirect_call_to_profile (gimple stmt, histogram_values *values)
1692 {
1693   tree callee;
1694 
1695   if (gimple_code (stmt) != GIMPLE_CALL
1696       || gimple_call_internal_p (stmt)
1697       || gimple_call_fndecl (stmt) != NULL_TREE)
1698     return;
1699 
1700   callee = gimple_call_fn (stmt);
1701 
1702   VEC_reserve (histogram_value, heap, *values, 3);
1703 
1704   VEC_quick_push (histogram_value, *values,
1705 		  gimple_alloc_histogram_value (cfun, HIST_TYPE_INDIR_CALL,
1706 						stmt, callee));
1707 
1708   return;
1709 }
1710 
1711 /* Find values inside STMT for that we want to measure histograms for
1712    string operations.  */
1713 static void
1714 gimple_stringops_values_to_profile (gimple stmt, histogram_values *values)
1715 {
1716   tree fndecl;
1717   tree blck_size;
1718   tree dest;
1719   int size_arg;
1720 
1721   if (gimple_code (stmt) != GIMPLE_CALL)
1722     return;
1723   fndecl = gimple_call_fndecl (stmt);
1724   if (!fndecl)
1725     return;
1726 
1727   if (!interesting_stringop_to_profile_p (fndecl, stmt, &size_arg))
1728     return;
1729 
1730   dest = gimple_call_arg (stmt, 0);
1731   blck_size = gimple_call_arg (stmt, size_arg);
1732 
1733   if (TREE_CODE (blck_size) != INTEGER_CST)
1734     {
1735       VEC_safe_push (histogram_value, heap, *values,
1736 		     gimple_alloc_histogram_value (cfun, HIST_TYPE_SINGLE_VALUE,
1737 						   stmt, blck_size));
1738       VEC_safe_push (histogram_value, heap, *values,
1739 		     gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
1740 						   stmt, blck_size));
1741     }
1742   if (TREE_CODE (blck_size) != INTEGER_CST)
1743     VEC_safe_push (histogram_value, heap, *values,
1744 		   gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
1745 						 stmt, dest));
1746 }
1747 
1748 /* Find values inside STMT for that we want to measure histograms and adds
1749    them to list VALUES.  */
1750 
1751 static void
1752 gimple_values_to_profile (gimple stmt, histogram_values *values)
1753 {
1754   if (flag_value_profile_transformations)
1755     {
1756       gimple_divmod_values_to_profile (stmt, values);
1757       gimple_stringops_values_to_profile (stmt, values);
1758       gimple_indirect_call_to_profile (stmt, values);
1759     }
1760 }
1761 
1762 void
1763 gimple_find_values_to_profile (histogram_values *values)
1764 {
1765   basic_block bb;
1766   gimple_stmt_iterator gsi;
1767   unsigned i;
1768   histogram_value hist = NULL;
1769 
1770   *values = NULL;
1771   FOR_EACH_BB (bb)
1772     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1773       gimple_values_to_profile (gsi_stmt (gsi), values);
1774 
1775   FOR_EACH_VEC_ELT (histogram_value, *values, i, hist)
1776     {
1777       switch (hist->type)
1778         {
1779 	case HIST_TYPE_INTERVAL:
1780 	  hist->n_counters = hist->hdata.intvl.steps + 2;
1781 	  break;
1782 
1783 	case HIST_TYPE_POW2:
1784 	  hist->n_counters = 2;
1785 	  break;
1786 
1787 	case HIST_TYPE_SINGLE_VALUE:
1788 	  hist->n_counters = 3;
1789 	  break;
1790 
1791 	case HIST_TYPE_CONST_DELTA:
1792 	  hist->n_counters = 4;
1793 	  break;
1794 
1795  	case HIST_TYPE_INDIR_CALL:
1796  	  hist->n_counters = 3;
1797 	  break;
1798 
1799 	case HIST_TYPE_AVERAGE:
1800 	  hist->n_counters = 2;
1801 	  break;
1802 
1803 	case HIST_TYPE_IOR:
1804 	  hist->n_counters = 1;
1805 	  break;
1806 
1807 	default:
1808 	  gcc_unreachable ();
1809 	}
1810       if (dump_file)
1811         {
1812 	  fprintf (dump_file, "Stmt ");
1813           print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
1814 	  dump_histogram_value (dump_file, hist);
1815         }
1816     }
1817 }
1818