]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/value-prof.c
tree-nested.h (build_addr): Adjust prototype.
[thirdparty/gcc.git] / gcc / value-prof.c
1 /* Transformations based on profile information for values.
2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "cfghooks.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "rtl.h"
28 #include "ssa.h"
29 #include "alias.h"
30 #include "fold-const.h"
31 #include "tree-nested.h"
32 #include "calls.h"
33 #include "flags.h"
34 #include "insn-config.h"
35 #include "expmed.h"
36 #include "dojump.h"
37 #include "explow.h"
38 #include "emit-rtl.h"
39 #include "varasm.h"
40 #include "stmt.h"
41 #include "expr.h"
42 #include "value-prof.h"
43 #include "recog.h"
44 #include "insn-codes.h"
45 #include "optabs.h"
46 #include "regs.h"
47 #include "internal-fn.h"
48 #include "tree-eh.h"
49 #include "gimplify.h"
50 #include "gimple-iterator.h"
51 #include "tree-cfg.h"
52 #include "diagnostic.h"
53 #include "gimple-pretty-print.h"
54 #include "coverage.h"
55 #include "gcov-io.h"
56 #include "timevar.h"
57 #include "dumpfile.h"
58 #include "profile.h"
59 #include "cgraph.h"
60 #include "data-streamer.h"
61 #include "builtins.h"
62 #include "params.h"
63 #include "tree-chkp.h"
64
65 /* In this file value profile based optimizations are placed. Currently the
66 following optimizations are implemented (for more detailed descriptions
67 see comments at value_profile_transformations):
68
69 1) Division/modulo specialization. Provided that we can determine that the
70 operands of the division have some special properties, we may use it to
71 produce more effective code.
72
73 2) Indirect/virtual call specialization. If we can determine most
74 common function callee in indirect/virtual call. We can use this
75 information to improve code effectiveness (especially info for
76 the inliner).
77
78 3) Speculative prefetching. If we are able to determine that the difference
79 between addresses accessed by a memory reference is usually constant, we
80 may add the prefetch instructions.
81 FIXME: This transformation was removed together with RTL based value
82 profiling.
83
84
85 Value profiling internals
86 ==========================
87
88 Every value profiling transformation starts with defining what values
89 to profile. There are different histogram types (see HIST_TYPE_* in
90 value-prof.h) and each transformation can request one or more histogram
91 types per GIMPLE statement. The function gimple_find_values_to_profile()
92 collects the values to profile in a vec, and adds the number of counters
93 required for the different histogram types.
94
95 For a -fprofile-generate run, the statements for which values should be
96 recorded, are instrumented in instrument_values(). The instrumentation
97 is done by helper functions that can be found in tree-profile.c, where
98 new types of histograms can be added if necessary.
99
100 After a -fprofile-use, the value profiling data is read back in by
101 compute_value_histograms() that translates the collected data to
102 histograms and attaches them to the profiled statements via
103 gimple_add_histogram_value(). Histograms are stored in a hash table
104 that is attached to every intrumented function, see VALUE_HISTOGRAMS
105 in function.h.
106
107 The value-profile transformations driver is the function
108 gimple_value_profile_transformations(). It traverses all statements in
109 the to-be-transformed function, and looks for statements with one or
110 more histograms attached to it. If a statement has histograms, the
111 transformation functions are called on the statement.
112
113 Limitations / FIXME / TODO:
114 * Only one histogram of each type can be associated with a statement.
115 * Currently, HIST_TYPE_CONST_DELTA is not implemented.
116 (This type of histogram was originally used to implement a form of
117 stride profiling based speculative prefetching to improve SPEC2000
118 scores for memory-bound benchmarks, mcf and equake. However, this
119 was an RTL value-profiling transformation, and those have all been
120 removed.)
121 * Some value profile transformations are done in builtins.c (?!)
122 * Updating of histograms needs some TLC.
123 * The value profiling code could be used to record analysis results
124 from non-profiling (e.g. VRP).
125 * Adding new profilers should be simplified, starting with a cleanup
126 of what-happens-where andwith making gimple_find_values_to_profile
127 and gimple_value_profile_transformations table-driven, perhaps...
128 */
129
130 static tree gimple_divmod_fixed_value (gassign *, tree, int, gcov_type,
131 gcov_type);
132 static tree gimple_mod_pow2 (gassign *, int, gcov_type, gcov_type);
133 static tree gimple_mod_subtract (gassign *, int, int, int, gcov_type,
134 gcov_type, gcov_type);
135 static bool gimple_divmod_fixed_value_transform (gimple_stmt_iterator *);
136 static bool gimple_mod_pow2_value_transform (gimple_stmt_iterator *);
137 static bool gimple_mod_subtract_transform (gimple_stmt_iterator *);
138 static bool gimple_stringops_transform (gimple_stmt_iterator *);
139 static bool gimple_ic_transform (gimple_stmt_iterator *);
140
141 /* Allocate histogram value. */
142
143 histogram_value
144 gimple_alloc_histogram_value (struct function *fun ATTRIBUTE_UNUSED,
145 enum hist_type type, gimple *stmt, tree value)
146 {
147 histogram_value hist = (histogram_value) xcalloc (1, sizeof (*hist));
148 hist->hvalue.value = value;
149 hist->hvalue.stmt = stmt;
150 hist->type = type;
151 return hist;
152 }
153
154 /* Hash value for histogram. */
155
156 static hashval_t
157 histogram_hash (const void *x)
158 {
159 return htab_hash_pointer (((const_histogram_value)x)->hvalue.stmt);
160 }
161
162 /* Return nonzero if statement for histogram_value X is Y. */
163
164 static int
165 histogram_eq (const void *x, const void *y)
166 {
167 return ((const_histogram_value) x)->hvalue.stmt == (const gimple *) y;
168 }
169
170 /* Set histogram for STMT. */
171
172 static void
173 set_histogram_value (struct function *fun, gimple *stmt, histogram_value hist)
174 {
175 void **loc;
176 if (!hist && !VALUE_HISTOGRAMS (fun))
177 return;
178 if (!VALUE_HISTOGRAMS (fun))
179 VALUE_HISTOGRAMS (fun) = htab_create (1, histogram_hash,
180 histogram_eq, NULL);
181 loc = htab_find_slot_with_hash (VALUE_HISTOGRAMS (fun), stmt,
182 htab_hash_pointer (stmt),
183 hist ? INSERT : NO_INSERT);
184 if (!hist)
185 {
186 if (loc)
187 htab_clear_slot (VALUE_HISTOGRAMS (fun), loc);
188 return;
189 }
190 *loc = hist;
191 }
192
193 /* Get histogram list for STMT. */
194
195 histogram_value
196 gimple_histogram_value (struct function *fun, gimple *stmt)
197 {
198 if (!VALUE_HISTOGRAMS (fun))
199 return NULL;
200 return (histogram_value) htab_find_with_hash (VALUE_HISTOGRAMS (fun), stmt,
201 htab_hash_pointer (stmt));
202 }
203
204 /* Add histogram for STMT. */
205
206 void
207 gimple_add_histogram_value (struct function *fun, gimple *stmt,
208 histogram_value hist)
209 {
210 hist->hvalue.next = gimple_histogram_value (fun, stmt);
211 set_histogram_value (fun, stmt, hist);
212 hist->fun = fun;
213 }
214
215 /* Remove histogram HIST from STMT's histogram list. */
216
217 void
218 gimple_remove_histogram_value (struct function *fun, gimple *stmt,
219 histogram_value hist)
220 {
221 histogram_value hist2 = gimple_histogram_value (fun, stmt);
222 if (hist == hist2)
223 {
224 set_histogram_value (fun, stmt, hist->hvalue.next);
225 }
226 else
227 {
228 while (hist2->hvalue.next != hist)
229 hist2 = hist2->hvalue.next;
230 hist2->hvalue.next = hist->hvalue.next;
231 }
232 free (hist->hvalue.counters);
233 #ifdef ENABLE_CHECKING
234 memset (hist, 0xab, sizeof (*hist));
235 #endif
236 free (hist);
237 }
238
239 /* Lookup histogram of type TYPE in the STMT. */
240
241 histogram_value
242 gimple_histogram_value_of_type (struct function *fun, gimple *stmt,
243 enum hist_type type)
244 {
245 histogram_value hist;
246 for (hist = gimple_histogram_value (fun, stmt); hist;
247 hist = hist->hvalue.next)
248 if (hist->type == type)
249 return hist;
250 return NULL;
251 }
252
253 /* Dump information about HIST to DUMP_FILE. */
254
255 static void
256 dump_histogram_value (FILE *dump_file, histogram_value hist)
257 {
258 switch (hist->type)
259 {
260 case HIST_TYPE_INTERVAL:
261 fprintf (dump_file, "Interval counter range %d -- %d",
262 hist->hdata.intvl.int_start,
263 (hist->hdata.intvl.int_start
264 + hist->hdata.intvl.steps - 1));
265 if (hist->hvalue.counters)
266 {
267 unsigned int i;
268 fprintf (dump_file, " [");
269 for (i = 0; i < hist->hdata.intvl.steps; i++)
270 fprintf (dump_file, " %d:%" PRId64,
271 hist->hdata.intvl.int_start + i,
272 (int64_t) hist->hvalue.counters[i]);
273 fprintf (dump_file, " ] outside range:%" PRId64,
274 (int64_t) hist->hvalue.counters[i]);
275 }
276 fprintf (dump_file, ".\n");
277 break;
278
279 case HIST_TYPE_POW2:
280 fprintf (dump_file, "Pow2 counter ");
281 if (hist->hvalue.counters)
282 {
283 fprintf (dump_file, "pow2:%" PRId64
284 " nonpow2:%" PRId64,
285 (int64_t) hist->hvalue.counters[0],
286 (int64_t) hist->hvalue.counters[1]);
287 }
288 fprintf (dump_file, ".\n");
289 break;
290
291 case HIST_TYPE_SINGLE_VALUE:
292 fprintf (dump_file, "Single value ");
293 if (hist->hvalue.counters)
294 {
295 fprintf (dump_file, "value:%" PRId64
296 " match:%" PRId64
297 " wrong:%" PRId64,
298 (int64_t) hist->hvalue.counters[0],
299 (int64_t) hist->hvalue.counters[1],
300 (int64_t) hist->hvalue.counters[2]);
301 }
302 fprintf (dump_file, ".\n");
303 break;
304
305 case HIST_TYPE_AVERAGE:
306 fprintf (dump_file, "Average value ");
307 if (hist->hvalue.counters)
308 {
309 fprintf (dump_file, "sum:%" PRId64
310 " times:%" PRId64,
311 (int64_t) hist->hvalue.counters[0],
312 (int64_t) hist->hvalue.counters[1]);
313 }
314 fprintf (dump_file, ".\n");
315 break;
316
317 case HIST_TYPE_IOR:
318 fprintf (dump_file, "IOR value ");
319 if (hist->hvalue.counters)
320 {
321 fprintf (dump_file, "ior:%" PRId64,
322 (int64_t) hist->hvalue.counters[0]);
323 }
324 fprintf (dump_file, ".\n");
325 break;
326
327 case HIST_TYPE_CONST_DELTA:
328 fprintf (dump_file, "Constant delta ");
329 if (hist->hvalue.counters)
330 {
331 fprintf (dump_file, "value:%" PRId64
332 " match:%" PRId64
333 " wrong:%" PRId64,
334 (int64_t) hist->hvalue.counters[0],
335 (int64_t) hist->hvalue.counters[1],
336 (int64_t) hist->hvalue.counters[2]);
337 }
338 fprintf (dump_file, ".\n");
339 break;
340 case HIST_TYPE_INDIR_CALL:
341 fprintf (dump_file, "Indirect call ");
342 if (hist->hvalue.counters)
343 {
344 fprintf (dump_file, "value:%" PRId64
345 " match:%" PRId64
346 " all:%" PRId64,
347 (int64_t) hist->hvalue.counters[0],
348 (int64_t) hist->hvalue.counters[1],
349 (int64_t) hist->hvalue.counters[2]);
350 }
351 fprintf (dump_file, ".\n");
352 break;
353 case HIST_TYPE_TIME_PROFILE:
354 fprintf (dump_file, "Time profile ");
355 if (hist->hvalue.counters)
356 {
357 fprintf (dump_file, "time:%" PRId64,
358 (int64_t) hist->hvalue.counters[0]);
359 }
360 fprintf (dump_file, ".\n");
361 break;
362 case HIST_TYPE_INDIR_CALL_TOPN:
363 fprintf (dump_file, "Indirect call topn ");
364 if (hist->hvalue.counters)
365 {
366 int i;
367
368 fprintf (dump_file, "accu:%" PRId64, hist->hvalue.counters[0]);
369 for (i = 1; i < (GCOV_ICALL_TOPN_VAL << 2); i += 2)
370 {
371 fprintf (dump_file, " target:%" PRId64 " value:%" PRId64,
372 (int64_t) hist->hvalue.counters[i],
373 (int64_t) hist->hvalue.counters[i+1]);
374 }
375 }
376 fprintf (dump_file, ".\n");
377 break;
378 case HIST_TYPE_MAX:
379 gcc_unreachable ();
380 }
381 }
382
383 /* Dump information about HIST to DUMP_FILE. */
384
385 void
386 stream_out_histogram_value (struct output_block *ob, histogram_value hist)
387 {
388 struct bitpack_d bp;
389 unsigned int i;
390
391 bp = bitpack_create (ob->main_stream);
392 bp_pack_enum (&bp, hist_type, HIST_TYPE_MAX, hist->type);
393 bp_pack_value (&bp, hist->hvalue.next != NULL, 1);
394 streamer_write_bitpack (&bp);
395 switch (hist->type)
396 {
397 case HIST_TYPE_INTERVAL:
398 streamer_write_hwi (ob, hist->hdata.intvl.int_start);
399 streamer_write_uhwi (ob, hist->hdata.intvl.steps);
400 break;
401 default:
402 break;
403 }
404 for (i = 0; i < hist->n_counters; i++)
405 streamer_write_gcov_count (ob, hist->hvalue.counters[i]);
406 if (hist->hvalue.next)
407 stream_out_histogram_value (ob, hist->hvalue.next);
408 }
409
410 /* Dump information about HIST to DUMP_FILE. */
411
412 void
413 stream_in_histogram_value (struct lto_input_block *ib, gimple *stmt)
414 {
415 enum hist_type type;
416 unsigned int ncounters = 0;
417 struct bitpack_d bp;
418 unsigned int i;
419 histogram_value new_val;
420 bool next;
421 histogram_value *next_p = NULL;
422
423 do
424 {
425 bp = streamer_read_bitpack (ib);
426 type = bp_unpack_enum (&bp, hist_type, HIST_TYPE_MAX);
427 next = bp_unpack_value (&bp, 1);
428 new_val = gimple_alloc_histogram_value (cfun, type, stmt, NULL);
429 switch (type)
430 {
431 case HIST_TYPE_INTERVAL:
432 new_val->hdata.intvl.int_start = streamer_read_hwi (ib);
433 new_val->hdata.intvl.steps = streamer_read_uhwi (ib);
434 ncounters = new_val->hdata.intvl.steps + 2;
435 break;
436
437 case HIST_TYPE_POW2:
438 case HIST_TYPE_AVERAGE:
439 ncounters = 2;
440 break;
441
442 case HIST_TYPE_SINGLE_VALUE:
443 case HIST_TYPE_INDIR_CALL:
444 ncounters = 3;
445 break;
446
447 case HIST_TYPE_CONST_DELTA:
448 ncounters = 4;
449 break;
450
451 case HIST_TYPE_IOR:
452 case HIST_TYPE_TIME_PROFILE:
453 ncounters = 1;
454 break;
455
456 case HIST_TYPE_INDIR_CALL_TOPN:
457 ncounters = (GCOV_ICALL_TOPN_VAL << 2) + 1;
458 break;
459
460 case HIST_TYPE_MAX:
461 gcc_unreachable ();
462 }
463 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * ncounters);
464 new_val->n_counters = ncounters;
465 for (i = 0; i < ncounters; i++)
466 new_val->hvalue.counters[i] = streamer_read_gcov_count (ib);
467 if (!next_p)
468 gimple_add_histogram_value (cfun, stmt, new_val);
469 else
470 *next_p = new_val;
471 next_p = &new_val->hvalue.next;
472 }
473 while (next);
474 }
475
476 /* Dump all histograms attached to STMT to DUMP_FILE. */
477
478 void
479 dump_histograms_for_stmt (struct function *fun, FILE *dump_file, gimple *stmt)
480 {
481 histogram_value hist;
482 for (hist = gimple_histogram_value (fun, stmt); hist; hist = hist->hvalue.next)
483 dump_histogram_value (dump_file, hist);
484 }
485
486 /* Remove all histograms associated with STMT. */
487
488 void
489 gimple_remove_stmt_histograms (struct function *fun, gimple *stmt)
490 {
491 histogram_value val;
492 while ((val = gimple_histogram_value (fun, stmt)) != NULL)
493 gimple_remove_histogram_value (fun, stmt, val);
494 }
495
496 /* Duplicate all histograms associates with OSTMT to STMT. */
497
498 void
499 gimple_duplicate_stmt_histograms (struct function *fun, gimple *stmt,
500 struct function *ofun, gimple *ostmt)
501 {
502 histogram_value val;
503 for (val = gimple_histogram_value (ofun, ostmt); val != NULL; val = val->hvalue.next)
504 {
505 histogram_value new_val = gimple_alloc_histogram_value (fun, val->type, NULL, NULL);
506 memcpy (new_val, val, sizeof (*val));
507 new_val->hvalue.stmt = stmt;
508 new_val->hvalue.counters = XNEWVAR (gcov_type, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
509 memcpy (new_val->hvalue.counters, val->hvalue.counters, sizeof (*new_val->hvalue.counters) * new_val->n_counters);
510 gimple_add_histogram_value (fun, stmt, new_val);
511 }
512 }
513
514 /* Move all histograms associated with OSTMT to STMT. */
515
516 void
517 gimple_move_stmt_histograms (struct function *fun, gimple *stmt, gimple *ostmt)
518 {
519 histogram_value val = gimple_histogram_value (fun, ostmt);
520 if (val)
521 {
522 /* The following three statements can't be reordered,
523 because histogram hashtab relies on stmt field value
524 for finding the exact slot. */
525 set_histogram_value (fun, ostmt, NULL);
526 for (; val != NULL; val = val->hvalue.next)
527 val->hvalue.stmt = stmt;
528 set_histogram_value (fun, stmt, val);
529 }
530 }
531
532 static bool error_found = false;
533
534 /* Helper function for verify_histograms. For each histogram reachable via htab
535 walk verify that it was reached via statement walk. */
536
537 static int
538 visit_hist (void **slot, void *data)
539 {
540 hash_set<histogram_value> *visited = (hash_set<histogram_value> *) data;
541 histogram_value hist = *(histogram_value *) slot;
542
543 if (!visited->contains (hist)
544 && hist->type != HIST_TYPE_TIME_PROFILE)
545 {
546 error ("dead histogram");
547 dump_histogram_value (stderr, hist);
548 debug_gimple_stmt (hist->hvalue.stmt);
549 error_found = true;
550 }
551 return 1;
552 }
553
554 /* Verify sanity of the histograms. */
555
556 DEBUG_FUNCTION void
557 verify_histograms (void)
558 {
559 basic_block bb;
560 gimple_stmt_iterator gsi;
561 histogram_value hist;
562
563 error_found = false;
564 hash_set<histogram_value> visited_hists;
565 FOR_EACH_BB_FN (bb, cfun)
566 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
567 {
568 gimple *stmt = gsi_stmt (gsi);
569
570 for (hist = gimple_histogram_value (cfun, stmt); hist;
571 hist = hist->hvalue.next)
572 {
573 if (hist->hvalue.stmt != stmt)
574 {
575 error ("Histogram value statement does not correspond to "
576 "the statement it is associated with");
577 debug_gimple_stmt (stmt);
578 dump_histogram_value (stderr, hist);
579 error_found = true;
580 }
581 visited_hists.add (hist);
582 }
583 }
584 if (VALUE_HISTOGRAMS (cfun))
585 htab_traverse (VALUE_HISTOGRAMS (cfun), visit_hist, &visited_hists);
586 if (error_found)
587 internal_error ("verify_histograms failed");
588 }
589
590 /* Helper function for verify_histograms. For each histogram reachable via htab
591 walk verify that it was reached via statement walk. */
592
593 static int
594 free_hist (void **slot, void *data ATTRIBUTE_UNUSED)
595 {
596 histogram_value hist = *(histogram_value *) slot;
597 free (hist->hvalue.counters);
598 #ifdef ENABLE_CHECKING
599 memset (hist, 0xab, sizeof (*hist));
600 #endif
601 free (hist);
602 return 1;
603 }
604
605 void
606 free_histograms (void)
607 {
608 if (VALUE_HISTOGRAMS (cfun))
609 {
610 htab_traverse (VALUE_HISTOGRAMS (cfun), free_hist, NULL);
611 htab_delete (VALUE_HISTOGRAMS (cfun));
612 VALUE_HISTOGRAMS (cfun) = NULL;
613 }
614 }
615
616 /* The overall number of invocations of the counter should match
617 execution count of basic block. Report it as error rather than
618 internal error as it might mean that user has misused the profile
619 somehow. */
620
621 static bool
622 check_counter (gimple *stmt, const char * name,
623 gcov_type *count, gcov_type *all, gcov_type bb_count)
624 {
625 if (*all != bb_count || *count > *all)
626 {
627 location_t locus;
628 locus = (stmt != NULL)
629 ? gimple_location (stmt)
630 : DECL_SOURCE_LOCATION (current_function_decl);
631 if (flag_profile_correction)
632 {
633 if (dump_enabled_p ())
634 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
635 "correcting inconsistent value profile: %s "
636 "profiler overall count (%d) does not match BB "
637 "count (%d)\n", name, (int)*all, (int)bb_count);
638 *all = bb_count;
639 if (*count > *all)
640 *count = *all;
641 return false;
642 }
643 else
644 {
645 error_at (locus, "corrupted value profile: %s "
646 "profile counter (%d out of %d) inconsistent with "
647 "basic-block count (%d)",
648 name,
649 (int) *count,
650 (int) *all,
651 (int) bb_count);
652 return true;
653 }
654 }
655
656 return false;
657 }
658
659 /* GIMPLE based transformations. */
660
661 bool
662 gimple_value_profile_transformations (void)
663 {
664 basic_block bb;
665 gimple_stmt_iterator gsi;
666 bool changed = false;
667 FOR_EACH_BB_FN (bb, cfun)
668 {
669 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
670 {
671 gimple *stmt = gsi_stmt (gsi);
672 histogram_value th = gimple_histogram_value (cfun, stmt);
673 if (!th)
674 continue;
675
676 if (dump_file)
677 {
678 fprintf (dump_file, "Trying transformations on stmt ");
679 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
680 dump_histograms_for_stmt (cfun, dump_file, stmt);
681 }
682
683 /* Transformations: */
684 /* The order of things in this conditional controls which
685 transformation is used when more than one is applicable. */
686 /* It is expected that any code added by the transformations
687 will be added before the current statement, and that the
688 current statement remain valid (although possibly
689 modified) upon return. */
690 if (gimple_mod_subtract_transform (&gsi)
691 || gimple_divmod_fixed_value_transform (&gsi)
692 || gimple_mod_pow2_value_transform (&gsi)
693 || gimple_stringops_transform (&gsi)
694 || gimple_ic_transform (&gsi))
695 {
696 stmt = gsi_stmt (gsi);
697 changed = true;
698 /* Original statement may no longer be in the same block. */
699 if (bb != gimple_bb (stmt))
700 {
701 bb = gimple_bb (stmt);
702 gsi = gsi_for_stmt (stmt);
703 }
704 }
705 }
706 }
707
708 if (changed)
709 {
710 counts_to_freqs ();
711 }
712
713 return changed;
714 }
715
716 /* Generate code for transformation 1 (with parent gimple assignment
717 STMT and probability of taking the optimal path PROB, which is
718 equivalent to COUNT/ALL within roundoff error). This generates the
719 result into a temp and returns the temp; it does not replace or
720 alter the original STMT. */
721
722 static tree
723 gimple_divmod_fixed_value (gassign *stmt, tree value, int prob,
724 gcov_type count, gcov_type all)
725 {
726 gassign *stmt1, *stmt2;
727 gcond *stmt3;
728 tree tmp0, tmp1, tmp2;
729 gimple *bb1end, *bb2end, *bb3end;
730 basic_block bb, bb2, bb3, bb4;
731 tree optype, op1, op2;
732 edge e12, e13, e23, e24, e34;
733 gimple_stmt_iterator gsi;
734
735 gcc_assert (is_gimple_assign (stmt)
736 && (gimple_assign_rhs_code (stmt) == TRUNC_DIV_EXPR
737 || gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR));
738
739 optype = TREE_TYPE (gimple_assign_lhs (stmt));
740 op1 = gimple_assign_rhs1 (stmt);
741 op2 = gimple_assign_rhs2 (stmt);
742
743 bb = gimple_bb (stmt);
744 gsi = gsi_for_stmt (stmt);
745
746 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
747 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
748 stmt1 = gimple_build_assign (tmp0, fold_convert (optype, value));
749 stmt2 = gimple_build_assign (tmp1, op2);
750 stmt3 = gimple_build_cond (NE_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
751 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
752 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
753 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
754 bb1end = stmt3;
755
756 tmp2 = create_tmp_reg (optype, "PROF");
757 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, tmp0);
758 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
759 bb2end = stmt1;
760
761 stmt1 = gimple_build_assign (tmp2, gimple_assign_rhs_code (stmt), op1, op2);
762 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
763 bb3end = stmt1;
764
765 /* Fix CFG. */
766 /* Edge e23 connects bb2 to bb3, etc. */
767 e12 = split_block (bb, bb1end);
768 bb2 = e12->dest;
769 bb2->count = count;
770 e23 = split_block (bb2, bb2end);
771 bb3 = e23->dest;
772 bb3->count = all - count;
773 e34 = split_block (bb3, bb3end);
774 bb4 = e34->dest;
775 bb4->count = all;
776
777 e12->flags &= ~EDGE_FALLTHRU;
778 e12->flags |= EDGE_FALSE_VALUE;
779 e12->probability = prob;
780 e12->count = count;
781
782 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
783 e13->probability = REG_BR_PROB_BASE - prob;
784 e13->count = all - count;
785
786 remove_edge (e23);
787
788 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
789 e24->probability = REG_BR_PROB_BASE;
790 e24->count = count;
791
792 e34->probability = REG_BR_PROB_BASE;
793 e34->count = all - count;
794
795 return tmp2;
796 }
797
798 /* Do transform 1) on INSN if applicable. */
799
800 static bool
801 gimple_divmod_fixed_value_transform (gimple_stmt_iterator *si)
802 {
803 histogram_value histogram;
804 enum tree_code code;
805 gcov_type val, count, all;
806 tree result, value, tree_val;
807 gcov_type prob;
808 gassign *stmt;
809
810 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
811 if (!stmt)
812 return false;
813
814 if (!INTEGRAL_TYPE_P (TREE_TYPE (gimple_assign_lhs (stmt))))
815 return false;
816
817 code = gimple_assign_rhs_code (stmt);
818
819 if (code != TRUNC_DIV_EXPR && code != TRUNC_MOD_EXPR)
820 return false;
821
822 histogram = gimple_histogram_value_of_type (cfun, stmt,
823 HIST_TYPE_SINGLE_VALUE);
824 if (!histogram)
825 return false;
826
827 value = histogram->hvalue.value;
828 val = histogram->hvalue.counters[0];
829 count = histogram->hvalue.counters[1];
830 all = histogram->hvalue.counters[2];
831 gimple_remove_histogram_value (cfun, stmt, histogram);
832
833 /* We require that count is at least half of all; this means
834 that for the transformation to fire the value must be constant
835 at least 50% of time (and 75% gives the guarantee of usage). */
836 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
837 || 2 * count < all
838 || optimize_bb_for_size_p (gimple_bb (stmt)))
839 return false;
840
841 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
842 return false;
843
844 /* Compute probability of taking the optimal path. */
845 if (all > 0)
846 prob = GCOV_COMPUTE_SCALE (count, all);
847 else
848 prob = 0;
849
850 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
851 tree_val = build_int_cst (get_gcov_type (), val);
852 else
853 {
854 HOST_WIDE_INT a[2];
855 a[0] = (unsigned HOST_WIDE_INT) val;
856 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
857
858 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
859 TYPE_PRECISION (get_gcov_type ()), false));
860 }
861 result = gimple_divmod_fixed_value (stmt, tree_val, prob, count, all);
862
863 if (dump_file)
864 {
865 fprintf (dump_file, "Div/mod by constant ");
866 print_generic_expr (dump_file, value, TDF_SLIM);
867 fprintf (dump_file, "=");
868 print_generic_expr (dump_file, tree_val, TDF_SLIM);
869 fprintf (dump_file, " transformation on insn ");
870 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
871 }
872
873 gimple_assign_set_rhs_from_tree (si, result);
874 update_stmt (gsi_stmt (*si));
875
876 return true;
877 }
878
879 /* Generate code for transformation 2 (with parent gimple assign STMT and
880 probability of taking the optimal path PROB, which is equivalent to COUNT/ALL
881 within roundoff error). This generates the result into a temp and returns
882 the temp; it does not replace or alter the original STMT. */
883
884 static tree
885 gimple_mod_pow2 (gassign *stmt, int prob, gcov_type count, gcov_type all)
886 {
887 gassign *stmt1, *stmt2, *stmt3;
888 gcond *stmt4;
889 tree tmp2, tmp3;
890 gimple *bb1end, *bb2end, *bb3end;
891 basic_block bb, bb2, bb3, bb4;
892 tree optype, op1, op2;
893 edge e12, e13, e23, e24, e34;
894 gimple_stmt_iterator gsi;
895 tree result;
896
897 gcc_assert (is_gimple_assign (stmt)
898 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
899
900 optype = TREE_TYPE (gimple_assign_lhs (stmt));
901 op1 = gimple_assign_rhs1 (stmt);
902 op2 = gimple_assign_rhs2 (stmt);
903
904 bb = gimple_bb (stmt);
905 gsi = gsi_for_stmt (stmt);
906
907 result = create_tmp_reg (optype, "PROF");
908 tmp2 = make_temp_ssa_name (optype, NULL, "PROF");
909 tmp3 = make_temp_ssa_name (optype, NULL, "PROF");
910 stmt2 = gimple_build_assign (tmp2, PLUS_EXPR, op2,
911 build_int_cst (optype, -1));
912 stmt3 = gimple_build_assign (tmp3, BIT_AND_EXPR, tmp2, op2);
913 stmt4 = gimple_build_cond (NE_EXPR, tmp3, build_int_cst (optype, 0),
914 NULL_TREE, NULL_TREE);
915 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
916 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
917 gsi_insert_before (&gsi, stmt4, GSI_SAME_STMT);
918 bb1end = stmt4;
919
920 /* tmp2 == op2-1 inherited from previous block. */
921 stmt1 = gimple_build_assign (result, BIT_AND_EXPR, op1, tmp2);
922 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
923 bb2end = stmt1;
924
925 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
926 op1, op2);
927 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
928 bb3end = stmt1;
929
930 /* Fix CFG. */
931 /* Edge e23 connects bb2 to bb3, etc. */
932 e12 = split_block (bb, bb1end);
933 bb2 = e12->dest;
934 bb2->count = count;
935 e23 = split_block (bb2, bb2end);
936 bb3 = e23->dest;
937 bb3->count = all - count;
938 e34 = split_block (bb3, bb3end);
939 bb4 = e34->dest;
940 bb4->count = all;
941
942 e12->flags &= ~EDGE_FALLTHRU;
943 e12->flags |= EDGE_FALSE_VALUE;
944 e12->probability = prob;
945 e12->count = count;
946
947 e13 = make_edge (bb, bb3, EDGE_TRUE_VALUE);
948 e13->probability = REG_BR_PROB_BASE - prob;
949 e13->count = all - count;
950
951 remove_edge (e23);
952
953 e24 = make_edge (bb2, bb4, EDGE_FALLTHRU);
954 e24->probability = REG_BR_PROB_BASE;
955 e24->count = count;
956
957 e34->probability = REG_BR_PROB_BASE;
958 e34->count = all - count;
959
960 return result;
961 }
962
963 /* Do transform 2) on INSN if applicable. */
964
965 static bool
966 gimple_mod_pow2_value_transform (gimple_stmt_iterator *si)
967 {
968 histogram_value histogram;
969 enum tree_code code;
970 gcov_type count, wrong_values, all;
971 tree lhs_type, result, value;
972 gcov_type prob;
973 gassign *stmt;
974
975 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
976 if (!stmt)
977 return false;
978
979 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
980 if (!INTEGRAL_TYPE_P (lhs_type))
981 return false;
982
983 code = gimple_assign_rhs_code (stmt);
984
985 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
986 return false;
987
988 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_POW2);
989 if (!histogram)
990 return false;
991
992 value = histogram->hvalue.value;
993 wrong_values = histogram->hvalue.counters[0];
994 count = histogram->hvalue.counters[1];
995
996 gimple_remove_histogram_value (cfun, stmt, histogram);
997
998 /* We require that we hit a power of 2 at least half of all evaluations. */
999 if (simple_cst_equal (gimple_assign_rhs2 (stmt), value) != 1
1000 || count < wrong_values
1001 || optimize_bb_for_size_p (gimple_bb (stmt)))
1002 return false;
1003
1004 if (dump_file)
1005 {
1006 fprintf (dump_file, "Mod power of 2 transformation on insn ");
1007 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1008 }
1009
1010 /* Compute probability of taking the optimal path. */
1011 all = count + wrong_values;
1012
1013 if (check_counter (stmt, "pow2", &count, &all, gimple_bb (stmt)->count))
1014 return false;
1015
1016 if (all > 0)
1017 prob = GCOV_COMPUTE_SCALE (count, all);
1018 else
1019 prob = 0;
1020
1021 result = gimple_mod_pow2 (stmt, prob, count, all);
1022
1023 gimple_assign_set_rhs_from_tree (si, result);
1024 update_stmt (gsi_stmt (*si));
1025
1026 return true;
1027 }
1028
1029 /* Generate code for transformations 3 and 4 (with parent gimple assign STMT, and
1030 NCOUNTS the number of cases to support. Currently only NCOUNTS==0 or 1 is
1031 supported and this is built into this interface. The probabilities of taking
1032 the optimal paths are PROB1 and PROB2, which are equivalent to COUNT1/ALL and
1033 COUNT2/ALL respectively within roundoff error). This generates the
1034 result into a temp and returns the temp; it does not replace or alter
1035 the original STMT. */
1036 /* FIXME: Generalize the interface to handle NCOUNTS > 1. */
1037
1038 static tree
1039 gimple_mod_subtract (gassign *stmt, int prob1, int prob2, int ncounts,
1040 gcov_type count1, gcov_type count2, gcov_type all)
1041 {
1042 gassign *stmt1;
1043 gimple *stmt2;
1044 gcond *stmt3;
1045 tree tmp1;
1046 gimple *bb1end, *bb2end = NULL, *bb3end;
1047 basic_block bb, bb2, bb3, bb4;
1048 tree optype, op1, op2;
1049 edge e12, e23 = 0, e24, e34, e14;
1050 gimple_stmt_iterator gsi;
1051 tree result;
1052
1053 gcc_assert (is_gimple_assign (stmt)
1054 && gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR);
1055
1056 optype = TREE_TYPE (gimple_assign_lhs (stmt));
1057 op1 = gimple_assign_rhs1 (stmt);
1058 op2 = gimple_assign_rhs2 (stmt);
1059
1060 bb = gimple_bb (stmt);
1061 gsi = gsi_for_stmt (stmt);
1062
1063 result = create_tmp_reg (optype, "PROF");
1064 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1065 stmt1 = gimple_build_assign (result, op1);
1066 stmt2 = gimple_build_assign (tmp1, op2);
1067 stmt3 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1068 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1069 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1070 gsi_insert_before (&gsi, stmt3, GSI_SAME_STMT);
1071 bb1end = stmt3;
1072
1073 if (ncounts) /* Assumed to be 0 or 1 */
1074 {
1075 stmt1 = gimple_build_assign (result, MINUS_EXPR, result, tmp1);
1076 stmt2 = gimple_build_cond (LT_EXPR, result, tmp1, NULL_TREE, NULL_TREE);
1077 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1078 gsi_insert_before (&gsi, stmt2, GSI_SAME_STMT);
1079 bb2end = stmt2;
1080 }
1081
1082 /* Fallback case. */
1083 stmt1 = gimple_build_assign (result, gimple_assign_rhs_code (stmt),
1084 result, tmp1);
1085 gsi_insert_before (&gsi, stmt1, GSI_SAME_STMT);
1086 bb3end = stmt1;
1087
1088 /* Fix CFG. */
1089 /* Edge e23 connects bb2 to bb3, etc. */
1090 /* However block 3 is optional; if it is not there, references
1091 to 3 really refer to block 2. */
1092 e12 = split_block (bb, bb1end);
1093 bb2 = e12->dest;
1094 bb2->count = all - count1;
1095
1096 if (ncounts) /* Assumed to be 0 or 1. */
1097 {
1098 e23 = split_block (bb2, bb2end);
1099 bb3 = e23->dest;
1100 bb3->count = all - count1 - count2;
1101 }
1102
1103 e34 = split_block (ncounts ? bb3 : bb2, bb3end);
1104 bb4 = e34->dest;
1105 bb4->count = all;
1106
1107 e12->flags &= ~EDGE_FALLTHRU;
1108 e12->flags |= EDGE_FALSE_VALUE;
1109 e12->probability = REG_BR_PROB_BASE - prob1;
1110 e12->count = all - count1;
1111
1112 e14 = make_edge (bb, bb4, EDGE_TRUE_VALUE);
1113 e14->probability = prob1;
1114 e14->count = count1;
1115
1116 if (ncounts) /* Assumed to be 0 or 1. */
1117 {
1118 e23->flags &= ~EDGE_FALLTHRU;
1119 e23->flags |= EDGE_FALSE_VALUE;
1120 e23->count = all - count1 - count2;
1121 e23->probability = REG_BR_PROB_BASE - prob2;
1122
1123 e24 = make_edge (bb2, bb4, EDGE_TRUE_VALUE);
1124 e24->probability = prob2;
1125 e24->count = count2;
1126 }
1127
1128 e34->probability = REG_BR_PROB_BASE;
1129 e34->count = all - count1 - count2;
1130
1131 return result;
1132 }
1133
1134 /* Do transforms 3) and 4) on the statement pointed-to by SI if applicable. */
1135
1136 static bool
1137 gimple_mod_subtract_transform (gimple_stmt_iterator *si)
1138 {
1139 histogram_value histogram;
1140 enum tree_code code;
1141 gcov_type count, wrong_values, all;
1142 tree lhs_type, result;
1143 gcov_type prob1, prob2;
1144 unsigned int i, steps;
1145 gcov_type count1, count2;
1146 gassign *stmt;
1147 stmt = dyn_cast <gassign *> (gsi_stmt (*si));
1148 if (!stmt)
1149 return false;
1150
1151 lhs_type = TREE_TYPE (gimple_assign_lhs (stmt));
1152 if (!INTEGRAL_TYPE_P (lhs_type))
1153 return false;
1154
1155 code = gimple_assign_rhs_code (stmt);
1156
1157 if (code != TRUNC_MOD_EXPR || !TYPE_UNSIGNED (lhs_type))
1158 return false;
1159
1160 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INTERVAL);
1161 if (!histogram)
1162 return false;
1163
1164 all = 0;
1165 wrong_values = 0;
1166 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1167 all += histogram->hvalue.counters[i];
1168
1169 wrong_values += histogram->hvalue.counters[i];
1170 wrong_values += histogram->hvalue.counters[i+1];
1171 steps = histogram->hdata.intvl.steps;
1172 all += wrong_values;
1173 count1 = histogram->hvalue.counters[0];
1174 count2 = histogram->hvalue.counters[1];
1175
1176 /* Compute probability of taking the optimal path. */
1177 if (check_counter (stmt, "interval", &count1, &all, gimple_bb (stmt)->count))
1178 {
1179 gimple_remove_histogram_value (cfun, stmt, histogram);
1180 return false;
1181 }
1182
1183 if (flag_profile_correction && count1 + count2 > all)
1184 all = count1 + count2;
1185
1186 gcc_assert (count1 + count2 <= all);
1187
1188 /* We require that we use just subtractions in at least 50% of all
1189 evaluations. */
1190 count = 0;
1191 for (i = 0; i < histogram->hdata.intvl.steps; i++)
1192 {
1193 count += histogram->hvalue.counters[i];
1194 if (count * 2 >= all)
1195 break;
1196 }
1197 if (i == steps
1198 || optimize_bb_for_size_p (gimple_bb (stmt)))
1199 return false;
1200
1201 gimple_remove_histogram_value (cfun, stmt, histogram);
1202 if (dump_file)
1203 {
1204 fprintf (dump_file, "Mod subtract transformation on insn ");
1205 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1206 }
1207
1208 /* Compute probability of taking the optimal path(s). */
1209 if (all > 0)
1210 {
1211 prob1 = GCOV_COMPUTE_SCALE (count1, all);
1212 prob2 = GCOV_COMPUTE_SCALE (count2, all);
1213 }
1214 else
1215 {
1216 prob1 = prob2 = 0;
1217 }
1218
1219 /* In practice, "steps" is always 2. This interface reflects this,
1220 and will need to be changed if "steps" can change. */
1221 result = gimple_mod_subtract (stmt, prob1, prob2, i, count1, count2, all);
1222
1223 gimple_assign_set_rhs_from_tree (si, result);
1224 update_stmt (gsi_stmt (*si));
1225
1226 return true;
1227 }
1228
1229 typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
1230
1231 static hash_map<profile_id_hash, cgraph_node *> *cgraph_node_map = 0;
1232
1233 /* Returns true if node graph is initialized. This
1234 is used to test if profile_id has been created
1235 for cgraph_nodes. */
1236
1237 bool
1238 coverage_node_map_initialized_p (void)
1239 {
1240 return cgraph_node_map != 0;
1241 }
1242
1243 /* Initialize map from PROFILE_ID to CGRAPH_NODE.
1244 When LOCAL is true, the PROFILE_IDs are computed. when it is false we assume
1245 that the PROFILE_IDs was already assigned. */
1246
1247 void
1248 init_node_map (bool local)
1249 {
1250 struct cgraph_node *n;
1251 cgraph_node_map = new hash_map<profile_id_hash, cgraph_node *>;
1252
1253 FOR_EACH_DEFINED_FUNCTION (n)
1254 if (n->has_gimple_body_p ())
1255 {
1256 cgraph_node **val;
1257 if (local)
1258 {
1259 n->profile_id = coverage_compute_profile_id (n);
1260 while ((val = cgraph_node_map->get (n->profile_id))
1261 || !n->profile_id)
1262 {
1263 if (dump_file)
1264 fprintf (dump_file, "Local profile-id %i conflict"
1265 " with nodes %s/%i %s/%i\n",
1266 n->profile_id,
1267 n->name (),
1268 n->order,
1269 (*val)->name (),
1270 (*val)->order);
1271 n->profile_id = (n->profile_id + 1) & 0x7fffffff;
1272 }
1273 }
1274 else if (!n->profile_id)
1275 {
1276 if (dump_file)
1277 fprintf (dump_file,
1278 "Node %s/%i has no profile-id"
1279 " (profile feedback missing?)\n",
1280 n->name (),
1281 n->order);
1282 continue;
1283 }
1284 else if ((val = cgraph_node_map->get (n->profile_id)))
1285 {
1286 if (dump_file)
1287 fprintf (dump_file,
1288 "Node %s/%i has IP profile-id %i conflict. "
1289 "Giving up.\n",
1290 n->name (),
1291 n->order,
1292 n->profile_id);
1293 *val = NULL;
1294 continue;
1295 }
1296 cgraph_node_map->put (n->profile_id, n);
1297 }
1298 }
1299
1300 /* Delete the CGRAPH_NODE_MAP. */
1301
1302 void
1303 del_node_map (void)
1304 {
1305 delete cgraph_node_map;
1306 }
1307
1308 /* Return cgraph node for function with pid */
1309
1310 struct cgraph_node*
1311 find_func_by_profile_id (int profile_id)
1312 {
1313 cgraph_node **val = cgraph_node_map->get (profile_id);
1314 if (val)
1315 return *val;
1316 else
1317 return NULL;
1318 }
1319
1320 /* Perform sanity check on the indirect call target. Due to race conditions,
1321 false function target may be attributed to an indirect call site. If the
1322 call expression type mismatches with the target function's type, expand_call
1323 may ICE. Here we only do very minimal sanity check just to make compiler happy.
1324 Returns true if TARGET is considered ok for call CALL_STMT. */
1325
1326 bool
1327 check_ic_target (gcall *call_stmt, struct cgraph_node *target)
1328 {
1329 location_t locus;
1330 if (gimple_check_call_matching_types (call_stmt, target->decl, true))
1331 return true;
1332
1333 locus = gimple_location (call_stmt);
1334 if (dump_enabled_p ())
1335 dump_printf_loc (MSG_MISSED_OPTIMIZATION, locus,
1336 "Skipping target %s with mismatching types for icall\n",
1337 target->name ());
1338 return false;
1339 }
1340
1341 /* Do transformation
1342
1343 if (actual_callee_address == address_of_most_common_function/method)
1344 do direct call
1345 else
1346 old call
1347 */
1348
1349 gcall *
1350 gimple_ic (gcall *icall_stmt, struct cgraph_node *direct_call,
1351 int prob, gcov_type count, gcov_type all)
1352 {
1353 gcall *dcall_stmt;
1354 gassign *load_stmt;
1355 gcond *cond_stmt;
1356 gcall *iretbnd_stmt = NULL;
1357 tree tmp0, tmp1, tmp;
1358 basic_block cond_bb, dcall_bb, icall_bb, join_bb = NULL;
1359 tree optype = build_pointer_type (void_type_node);
1360 edge e_cd, e_ci, e_di, e_dj = NULL, e_ij;
1361 gimple_stmt_iterator gsi;
1362 int lp_nr, dflags;
1363 edge e_eh, e;
1364 edge_iterator ei;
1365 gimple_stmt_iterator psi;
1366
1367 cond_bb = gimple_bb (icall_stmt);
1368 gsi = gsi_for_stmt (icall_stmt);
1369
1370 if (gimple_call_with_bounds_p (icall_stmt) && gimple_call_lhs (icall_stmt))
1371 iretbnd_stmt = chkp_retbnd_call_by_val (gimple_call_lhs (icall_stmt));
1372
1373 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1374 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1375 tmp = unshare_expr (gimple_call_fn (icall_stmt));
1376 load_stmt = gimple_build_assign (tmp0, tmp);
1377 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1378
1379 tmp = fold_convert (optype, build_addr (direct_call->decl));
1380 load_stmt = gimple_build_assign (tmp1, tmp);
1381 gsi_insert_before (&gsi, load_stmt, GSI_SAME_STMT);
1382
1383 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1384 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1385
1386 if (TREE_CODE (gimple_vdef (icall_stmt)) == SSA_NAME)
1387 {
1388 unlink_stmt_vdef (icall_stmt);
1389 release_ssa_name (gimple_vdef (icall_stmt));
1390 }
1391 gimple_set_vdef (icall_stmt, NULL_TREE);
1392 gimple_set_vuse (icall_stmt, NULL_TREE);
1393 update_stmt (icall_stmt);
1394 dcall_stmt = as_a <gcall *> (gimple_copy (icall_stmt));
1395 gimple_call_set_fndecl (dcall_stmt, direct_call->decl);
1396 dflags = flags_from_decl_or_type (direct_call->decl);
1397 if ((dflags & ECF_NORETURN) != 0)
1398 gimple_call_set_lhs (dcall_stmt, NULL_TREE);
1399 gsi_insert_before (&gsi, dcall_stmt, GSI_SAME_STMT);
1400
1401 /* Fix CFG. */
1402 /* Edge e_cd connects cond_bb to dcall_bb, etc; note the first letters. */
1403 e_cd = split_block (cond_bb, cond_stmt);
1404 dcall_bb = e_cd->dest;
1405 dcall_bb->count = count;
1406
1407 e_di = split_block (dcall_bb, dcall_stmt);
1408 icall_bb = e_di->dest;
1409 icall_bb->count = all - count;
1410
1411 /* Do not disturb existing EH edges from the indirect call. */
1412 if (!stmt_ends_bb_p (icall_stmt))
1413 e_ij = split_block (icall_bb, icall_stmt);
1414 else
1415 {
1416 e_ij = find_fallthru_edge (icall_bb->succs);
1417 /* The indirect call might be noreturn. */
1418 if (e_ij != NULL)
1419 {
1420 e_ij->probability = REG_BR_PROB_BASE;
1421 e_ij->count = all - count;
1422 e_ij = single_pred_edge (split_edge (e_ij));
1423 }
1424 }
1425 if (e_ij != NULL)
1426 {
1427 join_bb = e_ij->dest;
1428 join_bb->count = all;
1429 }
1430
1431 e_cd->flags = (e_cd->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1432 e_cd->probability = prob;
1433 e_cd->count = count;
1434
1435 e_ci = make_edge (cond_bb, icall_bb, EDGE_FALSE_VALUE);
1436 e_ci->probability = REG_BR_PROB_BASE - prob;
1437 e_ci->count = all - count;
1438
1439 remove_edge (e_di);
1440
1441 if (e_ij != NULL)
1442 {
1443 if ((dflags & ECF_NORETURN) != 0)
1444 e_ij->count = all;
1445 else
1446 {
1447 e_dj = make_edge (dcall_bb, join_bb, EDGE_FALLTHRU);
1448 e_dj->probability = REG_BR_PROB_BASE;
1449 e_dj->count = count;
1450
1451 e_ij->count = all - count;
1452 }
1453 e_ij->probability = REG_BR_PROB_BASE;
1454 }
1455
1456 /* Insert PHI node for the call result if necessary. */
1457 if (gimple_call_lhs (icall_stmt)
1458 && TREE_CODE (gimple_call_lhs (icall_stmt)) == SSA_NAME
1459 && (dflags & ECF_NORETURN) == 0)
1460 {
1461 tree result = gimple_call_lhs (icall_stmt);
1462 gphi *phi = create_phi_node (result, join_bb);
1463 gimple_call_set_lhs (icall_stmt,
1464 duplicate_ssa_name (result, icall_stmt));
1465 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1466 gimple_call_set_lhs (dcall_stmt,
1467 duplicate_ssa_name (result, dcall_stmt));
1468 add_phi_arg (phi, gimple_call_lhs (dcall_stmt), e_dj, UNKNOWN_LOCATION);
1469
1470 /* If indirect call has following BUILT_IN_CHKP_BNDRET
1471 call then we need to make it's copy for the direct
1472 call. */
1473 if (iretbnd_stmt)
1474 {
1475 if (gimple_call_lhs (iretbnd_stmt))
1476 {
1477 gimple *copy;
1478
1479 if (TREE_CODE (gimple_vdef (iretbnd_stmt)) == SSA_NAME)
1480 {
1481 unlink_stmt_vdef (iretbnd_stmt);
1482 release_ssa_name (gimple_vdef (iretbnd_stmt));
1483 }
1484 gimple_set_vdef (iretbnd_stmt, NULL_TREE);
1485 gimple_set_vuse (iretbnd_stmt, NULL_TREE);
1486 update_stmt (iretbnd_stmt);
1487
1488 result = gimple_call_lhs (iretbnd_stmt);
1489 phi = create_phi_node (result, join_bb);
1490
1491 copy = gimple_copy (iretbnd_stmt);
1492 gimple_call_set_arg (copy, 0,
1493 gimple_call_lhs (dcall_stmt));
1494 gimple_call_set_lhs (copy, duplicate_ssa_name (result, copy));
1495 gsi_insert_on_edge (e_dj, copy);
1496 add_phi_arg (phi, gimple_call_lhs (copy),
1497 e_dj, UNKNOWN_LOCATION);
1498
1499 gimple_call_set_arg (iretbnd_stmt, 0,
1500 gimple_call_lhs (icall_stmt));
1501 gimple_call_set_lhs (iretbnd_stmt,
1502 duplicate_ssa_name (result, iretbnd_stmt));
1503 psi = gsi_for_stmt (iretbnd_stmt);
1504 gsi_remove (&psi, false);
1505 gsi_insert_on_edge (e_ij, iretbnd_stmt);
1506 add_phi_arg (phi, gimple_call_lhs (iretbnd_stmt),
1507 e_ij, UNKNOWN_LOCATION);
1508
1509 gsi_commit_one_edge_insert (e_dj, NULL);
1510 gsi_commit_one_edge_insert (e_ij, NULL);
1511 }
1512 else
1513 {
1514 psi = gsi_for_stmt (iretbnd_stmt);
1515 gsi_remove (&psi, true);
1516 }
1517 }
1518 }
1519
1520 /* Build an EH edge for the direct call if necessary. */
1521 lp_nr = lookup_stmt_eh_lp (icall_stmt);
1522 if (lp_nr > 0 && stmt_could_throw_p (dcall_stmt))
1523 {
1524 add_stmt_to_eh_lp (dcall_stmt, lp_nr);
1525 }
1526
1527 FOR_EACH_EDGE (e_eh, ei, icall_bb->succs)
1528 if (e_eh->flags & (EDGE_EH | EDGE_ABNORMAL))
1529 {
1530 e = make_edge (dcall_bb, e_eh->dest, e_eh->flags);
1531 for (gphi_iterator psi = gsi_start_phis (e_eh->dest);
1532 !gsi_end_p (psi); gsi_next (&psi))
1533 {
1534 gphi *phi = psi.phi ();
1535 SET_USE (PHI_ARG_DEF_PTR_FROM_EDGE (phi, e),
1536 PHI_ARG_DEF_FROM_EDGE (phi, e_eh));
1537 }
1538 }
1539 if (!stmt_could_throw_p (dcall_stmt))
1540 gimple_purge_dead_eh_edges (dcall_bb);
1541 return dcall_stmt;
1542 }
1543
1544 /*
1545 For every checked indirect/virtual call determine if most common pid of
1546 function/class method has probability more than 50%. If yes modify code of
1547 this call to:
1548 */
1549
1550 static bool
1551 gimple_ic_transform (gimple_stmt_iterator *gsi)
1552 {
1553 gcall *stmt;
1554 histogram_value histogram;
1555 gcov_type val, count, all, bb_all;
1556 struct cgraph_node *direct_call;
1557
1558 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1559 if (!stmt)
1560 return false;
1561
1562 if (gimple_call_fndecl (stmt) != NULL_TREE)
1563 return false;
1564
1565 if (gimple_call_internal_p (stmt))
1566 return false;
1567
1568 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_INDIR_CALL);
1569 if (!histogram)
1570 return false;
1571
1572 val = histogram->hvalue.counters [0];
1573 count = histogram->hvalue.counters [1];
1574 all = histogram->hvalue.counters [2];
1575
1576 bb_all = gimple_bb (stmt)->count;
1577 /* The order of CHECK_COUNTER calls is important -
1578 since check_counter can correct the third parameter
1579 and we want to make count <= all <= bb_all. */
1580 if ( check_counter (stmt, "ic", &all, &bb_all, bb_all)
1581 || check_counter (stmt, "ic", &count, &all, all))
1582 {
1583 gimple_remove_histogram_value (cfun, stmt, histogram);
1584 return false;
1585 }
1586
1587 if (4 * count <= 3 * all)
1588 return false;
1589
1590 direct_call = find_func_by_profile_id ((int)val);
1591
1592 if (direct_call == NULL)
1593 {
1594 if (val)
1595 {
1596 if (dump_file)
1597 {
1598 fprintf (dump_file, "Indirect call -> direct call from other module");
1599 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1600 fprintf (dump_file, "=> %i (will resolve only with LTO)\n", (int)val);
1601 }
1602 }
1603 return false;
1604 }
1605
1606 if (!check_ic_target (stmt, direct_call))
1607 {
1608 if (dump_file)
1609 {
1610 fprintf (dump_file, "Indirect call -> direct call ");
1611 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1612 fprintf (dump_file, "=> ");
1613 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1614 fprintf (dump_file, " transformation skipped because of type mismatch");
1615 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1616 }
1617 gimple_remove_histogram_value (cfun, stmt, histogram);
1618 return false;
1619 }
1620
1621 if (dump_file)
1622 {
1623 fprintf (dump_file, "Indirect call -> direct call ");
1624 print_generic_expr (dump_file, gimple_call_fn (stmt), TDF_SLIM);
1625 fprintf (dump_file, "=> ");
1626 print_generic_expr (dump_file, direct_call->decl, TDF_SLIM);
1627 fprintf (dump_file, " transformation on insn postponned to ipa-profile");
1628 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1629 fprintf (dump_file, "hist->count %" PRId64
1630 " hist->all %" PRId64"\n", count, all);
1631 }
1632
1633 return true;
1634 }
1635
1636 /* Return true if the stringop CALL shall be profiled. SIZE_ARG be
1637 set to the argument index for the size of the string operation. */
1638
1639 static bool
1640 interesting_stringop_to_profile_p (gcall *call, int *size_arg)
1641 {
1642 enum built_in_function fcode;
1643
1644 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
1645 if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
1646 && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
1647 return false;
1648
1649 switch (fcode)
1650 {
1651 case BUILT_IN_MEMCPY:
1652 case BUILT_IN_MEMPCPY:
1653 *size_arg = 2;
1654 return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
1655 INTEGER_TYPE, VOID_TYPE);
1656 case BUILT_IN_MEMSET:
1657 *size_arg = 2;
1658 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1659 INTEGER_TYPE, VOID_TYPE);
1660 case BUILT_IN_BZERO:
1661 *size_arg = 1;
1662 return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
1663 VOID_TYPE);
1664 default:
1665 gcc_unreachable ();
1666 }
1667 }
1668
1669 /* Convert stringop (..., vcall_size)
1670 into
1671 if (vcall_size == icall_size)
1672 stringop (..., icall_size);
1673 else
1674 stringop (..., vcall_size);
1675 assuming we'll propagate a true constant into ICALL_SIZE later. */
1676
1677 static void
1678 gimple_stringop_fixed_value (gcall *vcall_stmt, tree icall_size, int prob,
1679 gcov_type count, gcov_type all)
1680 {
1681 gassign *tmp_stmt;
1682 gcond *cond_stmt;
1683 gcall *icall_stmt;
1684 tree tmp0, tmp1, vcall_size, optype;
1685 basic_block cond_bb, icall_bb, vcall_bb, join_bb;
1686 edge e_ci, e_cv, e_iv, e_ij, e_vj;
1687 gimple_stmt_iterator gsi;
1688 int size_arg;
1689
1690 if (!interesting_stringop_to_profile_p (vcall_stmt, &size_arg))
1691 gcc_unreachable ();
1692
1693 cond_bb = gimple_bb (vcall_stmt);
1694 gsi = gsi_for_stmt (vcall_stmt);
1695
1696 vcall_size = gimple_call_arg (vcall_stmt, size_arg);
1697 optype = TREE_TYPE (vcall_size);
1698
1699 tmp0 = make_temp_ssa_name (optype, NULL, "PROF");
1700 tmp1 = make_temp_ssa_name (optype, NULL, "PROF");
1701 tmp_stmt = gimple_build_assign (tmp0, fold_convert (optype, icall_size));
1702 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1703
1704 tmp_stmt = gimple_build_assign (tmp1, vcall_size);
1705 gsi_insert_before (&gsi, tmp_stmt, GSI_SAME_STMT);
1706
1707 cond_stmt = gimple_build_cond (EQ_EXPR, tmp1, tmp0, NULL_TREE, NULL_TREE);
1708 gsi_insert_before (&gsi, cond_stmt, GSI_SAME_STMT);
1709
1710 if (TREE_CODE (gimple_vdef (vcall_stmt)) == SSA_NAME)
1711 {
1712 unlink_stmt_vdef (vcall_stmt);
1713 release_ssa_name (gimple_vdef (vcall_stmt));
1714 }
1715 gimple_set_vdef (vcall_stmt, NULL);
1716 gimple_set_vuse (vcall_stmt, NULL);
1717 update_stmt (vcall_stmt);
1718 icall_stmt = as_a <gcall *> (gimple_copy (vcall_stmt));
1719 gimple_call_set_arg (icall_stmt, size_arg, icall_size);
1720 gsi_insert_before (&gsi, icall_stmt, GSI_SAME_STMT);
1721
1722 /* Fix CFG. */
1723 /* Edge e_ci connects cond_bb to icall_bb, etc. */
1724 e_ci = split_block (cond_bb, cond_stmt);
1725 icall_bb = e_ci->dest;
1726 icall_bb->count = count;
1727
1728 e_iv = split_block (icall_bb, icall_stmt);
1729 vcall_bb = e_iv->dest;
1730 vcall_bb->count = all - count;
1731
1732 e_vj = split_block (vcall_bb, vcall_stmt);
1733 join_bb = e_vj->dest;
1734 join_bb->count = all;
1735
1736 e_ci->flags = (e_ci->flags & ~EDGE_FALLTHRU) | EDGE_TRUE_VALUE;
1737 e_ci->probability = prob;
1738 e_ci->count = count;
1739
1740 e_cv = make_edge (cond_bb, vcall_bb, EDGE_FALSE_VALUE);
1741 e_cv->probability = REG_BR_PROB_BASE - prob;
1742 e_cv->count = all - count;
1743
1744 remove_edge (e_iv);
1745
1746 e_ij = make_edge (icall_bb, join_bb, EDGE_FALLTHRU);
1747 e_ij->probability = REG_BR_PROB_BASE;
1748 e_ij->count = count;
1749
1750 e_vj->probability = REG_BR_PROB_BASE;
1751 e_vj->count = all - count;
1752
1753 /* Insert PHI node for the call result if necessary. */
1754 if (gimple_call_lhs (vcall_stmt)
1755 && TREE_CODE (gimple_call_lhs (vcall_stmt)) == SSA_NAME)
1756 {
1757 tree result = gimple_call_lhs (vcall_stmt);
1758 gphi *phi = create_phi_node (result, join_bb);
1759 gimple_call_set_lhs (vcall_stmt,
1760 duplicate_ssa_name (result, vcall_stmt));
1761 add_phi_arg (phi, gimple_call_lhs (vcall_stmt), e_vj, UNKNOWN_LOCATION);
1762 gimple_call_set_lhs (icall_stmt,
1763 duplicate_ssa_name (result, icall_stmt));
1764 add_phi_arg (phi, gimple_call_lhs (icall_stmt), e_ij, UNKNOWN_LOCATION);
1765 }
1766
1767 /* Because these are all string op builtins, they're all nothrow. */
1768 gcc_assert (!stmt_could_throw_p (vcall_stmt));
1769 gcc_assert (!stmt_could_throw_p (icall_stmt));
1770 }
1771
1772 /* Find values inside STMT for that we want to measure histograms for
1773 division/modulo optimization. */
1774
1775 static bool
1776 gimple_stringops_transform (gimple_stmt_iterator *gsi)
1777 {
1778 gcall *stmt;
1779 tree blck_size;
1780 enum built_in_function fcode;
1781 histogram_value histogram;
1782 gcov_type count, all, val;
1783 tree dest, src;
1784 unsigned int dest_align, src_align;
1785 gcov_type prob;
1786 tree tree_val;
1787 int size_arg;
1788
1789 stmt = dyn_cast <gcall *> (gsi_stmt (*gsi));
1790 if (!stmt)
1791 return false;
1792
1793 if (!gimple_call_builtin_p (gsi_stmt (*gsi), BUILT_IN_NORMAL))
1794 return false;
1795
1796 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
1797 return false;
1798
1799 blck_size = gimple_call_arg (stmt, size_arg);
1800 if (TREE_CODE (blck_size) == INTEGER_CST)
1801 return false;
1802
1803 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_SINGLE_VALUE);
1804 if (!histogram)
1805 return false;
1806
1807 val = histogram->hvalue.counters[0];
1808 count = histogram->hvalue.counters[1];
1809 all = histogram->hvalue.counters[2];
1810 gimple_remove_histogram_value (cfun, stmt, histogram);
1811
1812 /* We require that count is at least half of all; this means
1813 that for the transformation to fire the value must be constant
1814 at least 80% of time. */
1815 if ((6 * count / 5) < all || optimize_bb_for_size_p (gimple_bb (stmt)))
1816 return false;
1817 if (check_counter (stmt, "value", &count, &all, gimple_bb (stmt)->count))
1818 return false;
1819 if (all > 0)
1820 prob = GCOV_COMPUTE_SCALE (count, all);
1821 else
1822 prob = 0;
1823
1824 dest = gimple_call_arg (stmt, 0);
1825 dest_align = get_pointer_alignment (dest);
1826 fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (stmt));
1827 switch (fcode)
1828 {
1829 case BUILT_IN_MEMCPY:
1830 case BUILT_IN_MEMPCPY:
1831 src = gimple_call_arg (stmt, 1);
1832 src_align = get_pointer_alignment (src);
1833 if (!can_move_by_pieces (val, MIN (dest_align, src_align)))
1834 return false;
1835 break;
1836 case BUILT_IN_MEMSET:
1837 if (!can_store_by_pieces (val, builtin_memset_read_str,
1838 gimple_call_arg (stmt, 1),
1839 dest_align, true))
1840 return false;
1841 break;
1842 case BUILT_IN_BZERO:
1843 if (!can_store_by_pieces (val, builtin_memset_read_str,
1844 integer_zero_node,
1845 dest_align, true))
1846 return false;
1847 break;
1848 default:
1849 gcc_unreachable ();
1850 }
1851
1852 if (sizeof (gcov_type) == sizeof (HOST_WIDE_INT))
1853 tree_val = build_int_cst (get_gcov_type (), val);
1854 else
1855 {
1856 HOST_WIDE_INT a[2];
1857 a[0] = (unsigned HOST_WIDE_INT) val;
1858 a[1] = val >> (HOST_BITS_PER_WIDE_INT - 1) >> 1;
1859
1860 tree_val = wide_int_to_tree (get_gcov_type (), wide_int::from_array (a, 2,
1861 TYPE_PRECISION (get_gcov_type ()), false));
1862 }
1863
1864 if (dump_file)
1865 {
1866 fprintf (dump_file, "Single value %i stringop transformation on ",
1867 (int)val);
1868 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
1869 }
1870
1871 gimple_stringop_fixed_value (stmt, tree_val, prob, count, all);
1872
1873 return true;
1874 }
1875
1876 void
1877 stringop_block_profile (gimple *stmt, unsigned int *expected_align,
1878 HOST_WIDE_INT *expected_size)
1879 {
1880 histogram_value histogram;
1881 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_AVERAGE);
1882
1883 if (!histogram)
1884 *expected_size = -1;
1885 else if (!histogram->hvalue.counters[1])
1886 {
1887 *expected_size = -1;
1888 gimple_remove_histogram_value (cfun, stmt, histogram);
1889 }
1890 else
1891 {
1892 gcov_type size;
1893 size = ((histogram->hvalue.counters[0]
1894 + histogram->hvalue.counters[1] / 2)
1895 / histogram->hvalue.counters[1]);
1896 /* Even if we can hold bigger value in SIZE, INT_MAX
1897 is safe "infinity" for code generation strategies. */
1898 if (size > INT_MAX)
1899 size = INT_MAX;
1900 *expected_size = size;
1901 gimple_remove_histogram_value (cfun, stmt, histogram);
1902 }
1903
1904 histogram = gimple_histogram_value_of_type (cfun, stmt, HIST_TYPE_IOR);
1905
1906 if (!histogram)
1907 *expected_align = 0;
1908 else if (!histogram->hvalue.counters[0])
1909 {
1910 gimple_remove_histogram_value (cfun, stmt, histogram);
1911 *expected_align = 0;
1912 }
1913 else
1914 {
1915 gcov_type count;
1916 int alignment;
1917
1918 count = histogram->hvalue.counters[0];
1919 alignment = 1;
1920 while (!(count & alignment)
1921 && (alignment * 2 * BITS_PER_UNIT))
1922 alignment <<= 1;
1923 *expected_align = alignment * BITS_PER_UNIT;
1924 gimple_remove_histogram_value (cfun, stmt, histogram);
1925 }
1926 }
1927
1928 \f
1929 /* Find values inside STMT for that we want to measure histograms for
1930 division/modulo optimization. */
1931
1932 static void
1933 gimple_divmod_values_to_profile (gimple *stmt, histogram_values *values)
1934 {
1935 tree lhs, divisor, op0, type;
1936 histogram_value hist;
1937
1938 if (gimple_code (stmt) != GIMPLE_ASSIGN)
1939 return;
1940
1941 lhs = gimple_assign_lhs (stmt);
1942 type = TREE_TYPE (lhs);
1943 if (!INTEGRAL_TYPE_P (type))
1944 return;
1945
1946 switch (gimple_assign_rhs_code (stmt))
1947 {
1948 case TRUNC_DIV_EXPR:
1949 case TRUNC_MOD_EXPR:
1950 divisor = gimple_assign_rhs2 (stmt);
1951 op0 = gimple_assign_rhs1 (stmt);
1952
1953 values->reserve (3);
1954
1955 if (TREE_CODE (divisor) == SSA_NAME)
1956 /* Check for the case where the divisor is the same value most
1957 of the time. */
1958 values->quick_push (gimple_alloc_histogram_value (cfun,
1959 HIST_TYPE_SINGLE_VALUE,
1960 stmt, divisor));
1961
1962 /* For mod, check whether it is not often a noop (or replaceable by
1963 a few subtractions). */
1964 if (gimple_assign_rhs_code (stmt) == TRUNC_MOD_EXPR
1965 && TYPE_UNSIGNED (type))
1966 {
1967 tree val;
1968 /* Check for a special case where the divisor is power of 2. */
1969 values->quick_push (gimple_alloc_histogram_value (cfun,
1970 HIST_TYPE_POW2,
1971 stmt, divisor));
1972
1973 val = build2 (TRUNC_DIV_EXPR, type, op0, divisor);
1974 hist = gimple_alloc_histogram_value (cfun, HIST_TYPE_INTERVAL,
1975 stmt, val);
1976 hist->hdata.intvl.int_start = 0;
1977 hist->hdata.intvl.steps = 2;
1978 values->quick_push (hist);
1979 }
1980 return;
1981
1982 default:
1983 return;
1984 }
1985 }
1986
1987 /* Find calls inside STMT for that we want to measure histograms for
1988 indirect/virtual call optimization. */
1989
1990 static void
1991 gimple_indirect_call_to_profile (gimple *stmt, histogram_values *values)
1992 {
1993 tree callee;
1994
1995 if (gimple_code (stmt) != GIMPLE_CALL
1996 || gimple_call_internal_p (stmt)
1997 || gimple_call_fndecl (stmt) != NULL_TREE)
1998 return;
1999
2000 callee = gimple_call_fn (stmt);
2001
2002 values->reserve (3);
2003
2004 values->quick_push (gimple_alloc_histogram_value (
2005 cfun,
2006 PARAM_VALUE (PARAM_INDIR_CALL_TOPN_PROFILE) ?
2007 HIST_TYPE_INDIR_CALL_TOPN :
2008 HIST_TYPE_INDIR_CALL,
2009 stmt, callee));
2010
2011 return;
2012 }
2013
2014 /* Find values inside STMT for that we want to measure histograms for
2015 string operations. */
2016
2017 static void
2018 gimple_stringops_values_to_profile (gimple *gs, histogram_values *values)
2019 {
2020 gcall *stmt;
2021 tree blck_size;
2022 tree dest;
2023 int size_arg;
2024
2025 stmt = dyn_cast <gcall *> (gs);
2026 if (!stmt)
2027 return;
2028
2029 if (!gimple_call_builtin_p (gs, BUILT_IN_NORMAL))
2030 return;
2031
2032 if (!interesting_stringop_to_profile_p (stmt, &size_arg))
2033 return;
2034
2035 dest = gimple_call_arg (stmt, 0);
2036 blck_size = gimple_call_arg (stmt, size_arg);
2037
2038 if (TREE_CODE (blck_size) != INTEGER_CST)
2039 {
2040 values->safe_push (gimple_alloc_histogram_value (cfun,
2041 HIST_TYPE_SINGLE_VALUE,
2042 stmt, blck_size));
2043 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_AVERAGE,
2044 stmt, blck_size));
2045 }
2046
2047 if (TREE_CODE (blck_size) != INTEGER_CST)
2048 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_IOR,
2049 stmt, dest));
2050 }
2051
2052 /* Find values inside STMT for that we want to measure histograms and adds
2053 them to list VALUES. */
2054
2055 static void
2056 gimple_values_to_profile (gimple *stmt, histogram_values *values)
2057 {
2058 gimple_divmod_values_to_profile (stmt, values);
2059 gimple_stringops_values_to_profile (stmt, values);
2060 gimple_indirect_call_to_profile (stmt, values);
2061 }
2062
2063 void
2064 gimple_find_values_to_profile (histogram_values *values)
2065 {
2066 basic_block bb;
2067 gimple_stmt_iterator gsi;
2068 unsigned i;
2069 histogram_value hist = NULL;
2070 values->create (0);
2071
2072 FOR_EACH_BB_FN (bb, cfun)
2073 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2074 gimple_values_to_profile (gsi_stmt (gsi), values);
2075
2076 values->safe_push (gimple_alloc_histogram_value (cfun, HIST_TYPE_TIME_PROFILE, 0, 0));
2077
2078 FOR_EACH_VEC_ELT (*values, i, hist)
2079 {
2080 switch (hist->type)
2081 {
2082 case HIST_TYPE_INTERVAL:
2083 hist->n_counters = hist->hdata.intvl.steps + 2;
2084 break;
2085
2086 case HIST_TYPE_POW2:
2087 hist->n_counters = 2;
2088 break;
2089
2090 case HIST_TYPE_SINGLE_VALUE:
2091 hist->n_counters = 3;
2092 break;
2093
2094 case HIST_TYPE_CONST_DELTA:
2095 hist->n_counters = 4;
2096 break;
2097
2098 case HIST_TYPE_INDIR_CALL:
2099 hist->n_counters = 3;
2100 break;
2101
2102 case HIST_TYPE_TIME_PROFILE:
2103 hist->n_counters = 1;
2104 break;
2105
2106 case HIST_TYPE_AVERAGE:
2107 hist->n_counters = 2;
2108 break;
2109
2110 case HIST_TYPE_IOR:
2111 hist->n_counters = 1;
2112 break;
2113
2114 case HIST_TYPE_INDIR_CALL_TOPN:
2115 hist->n_counters = GCOV_ICALL_TOPN_NCOUNTS;
2116 break;
2117
2118 default:
2119 gcc_unreachable ();
2120 }
2121 if (dump_file)
2122 {
2123 fprintf (dump_file, "Stmt ");
2124 print_gimple_stmt (dump_file, hist->hvalue.stmt, 0, TDF_SLIM);
2125 dump_histogram_value (dump_file, hist);
2126 }
2127 }
2128 }