* tree.c (maybe_warn_parm_abi): Inform the location of the class.
[official-gcc.git] / gcc / ipa-fnsummary.c
blobe40b537bf617f9355e8dfb9c3970ddd7370959ec
1 /* Function summary pass.
2 Copyright (C) 2003-2018 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
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.
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/>. */
21 /* Analysis of function bodies used by inter-procedural passes
23 We estimate for each function
24 - function body size and size after specializing into given context
25 - average function execution time in a given context
26 - function frame size
27 For each call
28 - call statement size, time and how often the parameters change
30 ipa_fn_summary data structures store above information locally (i.e.
31 parameters of the function itself) and globally (i.e. parameters of
32 the function created by applying all the inline decisions already
33 present in the callgraph).
35 We provide access to the ipa_fn_summary data structure and
36 basic logic updating the parameters when inlining is performed.
38 The summaries are context sensitive. Context means
39 1) partial assignment of known constant values of operands
40 2) whether function is inlined into the call or not.
41 It is easy to add more variants. To represent function size and time
42 that depends on context (i.e. it is known to be optimized away when
43 context is known either by inlining or from IP-CP and cloning),
44 we use predicates.
46 estimate_edge_size_and_time can be used to query
47 function size/time in the given context. ipa_merge_fn_summary_after_inlining merges
48 properties of caller and callee after inlining.
50 Finally pass_inline_parameters is exported. This is used to drive
51 computation of function parameters used by the early inliner. IPA
52 inlined performs analysis via its analyze_function method. */
54 #include "config.h"
55 #include "system.h"
56 #include "coretypes.h"
57 #include "backend.h"
58 #include "tree.h"
59 #include "gimple.h"
60 #include "alloc-pool.h"
61 #include "tree-pass.h"
62 #include "ssa.h"
63 #include "tree-streamer.h"
64 #include "cgraph.h"
65 #include "diagnostic.h"
66 #include "fold-const.h"
67 #include "print-tree.h"
68 #include "tree-inline.h"
69 #include "gimple-pretty-print.h"
70 #include "params.h"
71 #include "cfganal.h"
72 #include "gimple-iterator.h"
73 #include "tree-cfg.h"
74 #include "tree-ssa-loop-niter.h"
75 #include "tree-ssa-loop.h"
76 #include "symbol-summary.h"
77 #include "ipa-prop.h"
78 #include "ipa-fnsummary.h"
79 #include "cfgloop.h"
80 #include "tree-scalar-evolution.h"
81 #include "ipa-utils.h"
82 #include "cfgexpand.h"
83 #include "gimplify.h"
84 #include "stringpool.h"
85 #include "attribs.h"
87 /* Summaries. */
88 function_summary <ipa_fn_summary *> *ipa_fn_summaries;
89 call_summary <ipa_call_summary *> *ipa_call_summaries;
91 /* Edge predicates goes here. */
92 static object_allocator<predicate> edge_predicate_pool ("edge predicates");
95 /* Dump IPA hints. */
96 void
97 ipa_dump_hints (FILE *f, ipa_hints hints)
99 if (!hints)
100 return;
101 fprintf (f, "IPA hints:");
102 if (hints & INLINE_HINT_indirect_call)
104 hints &= ~INLINE_HINT_indirect_call;
105 fprintf (f, " indirect_call");
107 if (hints & INLINE_HINT_loop_iterations)
109 hints &= ~INLINE_HINT_loop_iterations;
110 fprintf (f, " loop_iterations");
112 if (hints & INLINE_HINT_loop_stride)
114 hints &= ~INLINE_HINT_loop_stride;
115 fprintf (f, " loop_stride");
117 if (hints & INLINE_HINT_same_scc)
119 hints &= ~INLINE_HINT_same_scc;
120 fprintf (f, " same_scc");
122 if (hints & INLINE_HINT_in_scc)
124 hints &= ~INLINE_HINT_in_scc;
125 fprintf (f, " in_scc");
127 if (hints & INLINE_HINT_cross_module)
129 hints &= ~INLINE_HINT_cross_module;
130 fprintf (f, " cross_module");
132 if (hints & INLINE_HINT_declared_inline)
134 hints &= ~INLINE_HINT_declared_inline;
135 fprintf (f, " declared_inline");
137 if (hints & INLINE_HINT_array_index)
139 hints &= ~INLINE_HINT_array_index;
140 fprintf (f, " array_index");
142 if (hints & INLINE_HINT_known_hot)
144 hints &= ~INLINE_HINT_known_hot;
145 fprintf (f, " known_hot");
147 gcc_assert (!hints);
151 /* Record SIZE and TIME to SUMMARY.
152 The accounted code will be executed when EXEC_PRED is true.
153 When NONCONST_PRED is false the code will evaulate to constant and
154 will get optimized out in specialized clones of the function. */
156 void
157 ipa_fn_summary::account_size_time (int size, sreal time,
158 const predicate &exec_pred,
159 const predicate &nonconst_pred_in)
161 size_time_entry *e;
162 bool found = false;
163 int i;
164 predicate nonconst_pred;
166 if (exec_pred == false)
167 return;
169 nonconst_pred = nonconst_pred_in & exec_pred;
171 if (nonconst_pred == false)
172 return;
174 /* We need to create initial empty unconitional clause, but otherwie
175 we don't need to account empty times and sizes. */
176 if (!size && time == 0 && size_time_table)
177 return;
179 gcc_assert (time >= 0);
181 for (i = 0; vec_safe_iterate (size_time_table, i, &e); i++)
182 if (e->exec_predicate == exec_pred
183 && e->nonconst_predicate == nonconst_pred)
185 found = true;
186 break;
188 if (i == 256)
190 i = 0;
191 found = true;
192 e = &(*size_time_table)[0];
193 if (dump_file && (dump_flags & TDF_DETAILS))
194 fprintf (dump_file,
195 "\t\tReached limit on number of entries, "
196 "ignoring the predicate.");
198 if (dump_file && (dump_flags & TDF_DETAILS) && (time != 0 || size))
200 fprintf (dump_file,
201 "\t\tAccounting size:%3.2f, time:%3.2f on %spredicate exec:",
202 ((double) size) / ipa_fn_summary::size_scale,
203 (time.to_double ()), found ? "" : "new ");
204 exec_pred.dump (dump_file, conds, 0);
205 if (exec_pred != nonconst_pred)
207 fprintf (dump_file, " nonconst:");
208 nonconst_pred.dump (dump_file, conds);
210 else
211 fprintf (dump_file, "\n");
213 if (!found)
215 struct size_time_entry new_entry;
216 new_entry.size = size;
217 new_entry.time = time;
218 new_entry.exec_predicate = exec_pred;
219 new_entry.nonconst_predicate = nonconst_pred;
220 vec_safe_push (size_time_table, new_entry);
222 else
224 e->size += size;
225 e->time += time;
229 /* We proved E to be unreachable, redirect it to __bultin_unreachable. */
231 static struct cgraph_edge *
232 redirect_to_unreachable (struct cgraph_edge *e)
234 struct cgraph_node *callee = !e->inline_failed ? e->callee : NULL;
235 struct cgraph_node *target = cgraph_node::get_create
236 (builtin_decl_implicit (BUILT_IN_UNREACHABLE));
238 if (e->speculative)
239 e = e->resolve_speculation (target->decl);
240 else if (!e->callee)
241 e->make_direct (target);
242 else
243 e->redirect_callee (target);
244 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
245 e->inline_failed = CIF_UNREACHABLE;
246 e->count = profile_count::zero ();
247 es->call_stmt_size = 0;
248 es->call_stmt_time = 0;
249 if (callee)
250 callee->remove_symbol_and_inline_clones ();
251 return e;
254 /* Set predicate for edge E. */
256 static void
257 edge_set_predicate (struct cgraph_edge *e, predicate *predicate)
259 /* If the edge is determined to be never executed, redirect it
260 to BUILTIN_UNREACHABLE to make it clear to IPA passes the call will
261 be optimized out. */
262 if (predicate && *predicate == false
263 /* When handling speculative edges, we need to do the redirection
264 just once. Do it always on the direct edge, so we do not
265 attempt to resolve speculation while duplicating the edge. */
266 && (!e->speculative || e->callee))
267 e = redirect_to_unreachable (e);
269 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
270 if (predicate && *predicate != true)
272 if (!es->predicate)
273 es->predicate = edge_predicate_pool.allocate ();
274 *es->predicate = *predicate;
276 else
278 if (es->predicate)
279 edge_predicate_pool.remove (es->predicate);
280 es->predicate = NULL;
284 /* Set predicate for hint *P. */
286 static void
287 set_hint_predicate (predicate **p, predicate new_predicate)
289 if (new_predicate == false || new_predicate == true)
291 if (*p)
292 edge_predicate_pool.remove (*p);
293 *p = NULL;
295 else
297 if (!*p)
298 *p = edge_predicate_pool.allocate ();
299 **p = new_predicate;
304 /* Compute what conditions may or may not hold given invormation about
305 parameters. RET_CLAUSE returns truths that may hold in a specialized copy,
306 whie RET_NONSPEC_CLAUSE returns truths that may hold in an nonspecialized
307 copy when called in a given context. It is a bitmask of conditions. Bit
308 0 means that condition is known to be false, while bit 1 means that condition
309 may or may not be true. These differs - for example NOT_INLINED condition
310 is always false in the second and also builtin_constant_p tests can not use
311 the fact that parameter is indeed a constant.
313 KNOWN_VALS is partial mapping of parameters of NODE to constant values.
314 KNOWN_AGGS is a vector of aggreggate jump functions for each parameter.
315 Return clause of possible truths. When INLINE_P is true, assume that we are
316 inlining.
318 ERROR_MARK means compile time invariant. */
320 static void
321 evaluate_conditions_for_known_args (struct cgraph_node *node,
322 bool inline_p,
323 vec<tree> known_vals,
324 vec<ipa_agg_jump_function_p>
325 known_aggs,
326 clause_t *ret_clause,
327 clause_t *ret_nonspec_clause)
329 clause_t clause = inline_p ? 0 : 1 << predicate::not_inlined_condition;
330 clause_t nonspec_clause = 1 << predicate::not_inlined_condition;
331 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
332 int i;
333 struct condition *c;
335 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
337 tree val;
338 tree res;
340 /* We allow call stmt to have fewer arguments than the callee function
341 (especially for K&R style programs). So bound check here (we assume
342 known_aggs vector, if non-NULL, has the same length as
343 known_vals). */
344 gcc_checking_assert (!known_aggs.exists ()
345 || (known_vals.length () == known_aggs.length ()));
346 if (c->operand_num >= (int) known_vals.length ())
348 clause |= 1 << (i + predicate::first_dynamic_condition);
349 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
350 continue;
353 if (c->agg_contents)
355 struct ipa_agg_jump_function *agg;
357 if (c->code == predicate::changed
358 && !c->by_ref
359 && (known_vals[c->operand_num] == error_mark_node))
360 continue;
362 if (known_aggs.exists ())
364 agg = known_aggs[c->operand_num];
365 val = ipa_find_agg_cst_for_param (agg, known_vals[c->operand_num],
366 c->offset, c->by_ref);
368 else
369 val = NULL_TREE;
371 else
373 val = known_vals[c->operand_num];
374 if (val == error_mark_node && c->code != predicate::changed)
375 val = NULL_TREE;
378 if (!val)
380 clause |= 1 << (i + predicate::first_dynamic_condition);
381 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
382 continue;
384 if (c->code == predicate::changed)
386 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
387 continue;
390 if (tree_to_shwi (TYPE_SIZE (TREE_TYPE (val))) != c->size)
392 clause |= 1 << (i + predicate::first_dynamic_condition);
393 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
394 continue;
396 if (c->code == predicate::is_not_constant)
398 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
399 continue;
402 val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (c->val), val);
403 res = val
404 ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
405 : NULL;
407 if (res && integer_zerop (res))
408 continue;
410 clause |= 1 << (i + predicate::first_dynamic_condition);
411 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
413 *ret_clause = clause;
414 if (ret_nonspec_clause)
415 *ret_nonspec_clause = nonspec_clause;
419 /* Work out what conditions might be true at invocation of E. */
421 void
422 evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
423 clause_t *clause_ptr,
424 clause_t *nonspec_clause_ptr,
425 vec<tree> *known_vals_ptr,
426 vec<ipa_polymorphic_call_context>
427 *known_contexts_ptr,
428 vec<ipa_agg_jump_function_p> *known_aggs_ptr)
430 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
431 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (callee);
432 vec<tree> known_vals = vNULL;
433 vec<ipa_agg_jump_function_p> known_aggs = vNULL;
435 if (clause_ptr)
436 *clause_ptr = inline_p ? 0 : 1 << predicate::not_inlined_condition;
437 if (known_vals_ptr)
438 known_vals_ptr->create (0);
439 if (known_contexts_ptr)
440 known_contexts_ptr->create (0);
442 if (ipa_node_params_sum
443 && !e->call_stmt_cannot_inline_p
444 && ((clause_ptr && info->conds) || known_vals_ptr || known_contexts_ptr))
446 struct ipa_node_params *caller_parms_info, *callee_pi;
447 struct ipa_edge_args *args = IPA_EDGE_REF (e);
448 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
449 int i, count = ipa_get_cs_argument_count (args);
451 if (e->caller->global.inlined_to)
452 caller_parms_info = IPA_NODE_REF (e->caller->global.inlined_to);
453 else
454 caller_parms_info = IPA_NODE_REF (e->caller);
455 callee_pi = IPA_NODE_REF (e->callee);
457 if (count && (info->conds || known_vals_ptr))
458 known_vals.safe_grow_cleared (count);
459 if (count && (info->conds || known_aggs_ptr))
460 known_aggs.safe_grow_cleared (count);
461 if (count && known_contexts_ptr)
462 known_contexts_ptr->safe_grow_cleared (count);
464 for (i = 0; i < count; i++)
466 struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
467 tree cst = ipa_value_from_jfunc (caller_parms_info, jf,
468 ipa_get_type (callee_pi, i));
470 if (!cst && e->call_stmt
471 && i < (int)gimple_call_num_args (e->call_stmt))
473 cst = gimple_call_arg (e->call_stmt, i);
474 if (!is_gimple_min_invariant (cst))
475 cst = NULL;
477 if (cst)
479 gcc_checking_assert (TREE_CODE (cst) != TREE_BINFO);
480 if (known_vals.exists ())
481 known_vals[i] = cst;
483 else if (inline_p && !es->param[i].change_prob)
484 known_vals[i] = error_mark_node;
486 if (known_contexts_ptr)
487 (*known_contexts_ptr)[i]
488 = ipa_context_from_jfunc (caller_parms_info, e, i, jf);
489 /* TODO: When IPA-CP starts propagating and merging aggregate jump
490 functions, use its knowledge of the caller too, just like the
491 scalar case above. */
492 known_aggs[i] = &jf->agg;
495 else if (e->call_stmt && !e->call_stmt_cannot_inline_p
496 && ((clause_ptr && info->conds) || known_vals_ptr))
498 int i, count = (int)gimple_call_num_args (e->call_stmt);
500 if (count && (info->conds || known_vals_ptr))
501 known_vals.safe_grow_cleared (count);
502 for (i = 0; i < count; i++)
504 tree cst = gimple_call_arg (e->call_stmt, i);
505 if (!is_gimple_min_invariant (cst))
506 cst = NULL;
507 if (cst)
508 known_vals[i] = cst;
512 evaluate_conditions_for_known_args (callee, inline_p,
513 known_vals, known_aggs, clause_ptr,
514 nonspec_clause_ptr);
516 if (known_vals_ptr)
517 *known_vals_ptr = known_vals;
518 else
519 known_vals.release ();
521 if (known_aggs_ptr)
522 *known_aggs_ptr = known_aggs;
523 else
524 known_aggs.release ();
528 /* Allocate the function summary. */
530 static void
531 ipa_fn_summary_alloc (void)
533 gcc_checking_assert (!ipa_fn_summaries);
534 ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab);
535 ipa_call_summaries = new ipa_call_summary_t (symtab, false);
538 /* We are called multiple time for given function; clear
539 data from previous run so they are not cumulated. */
541 void
542 ipa_call_summary::reset ()
544 call_stmt_size = call_stmt_time = 0;
545 is_return_callee_uncaptured = false;
546 if (predicate)
547 edge_predicate_pool.remove (predicate);
548 predicate = NULL;
549 param.release ();
552 /* We are called multiple time for given function; clear
553 data from previous run so they are not cumulated. */
555 void
556 ipa_fn_summary::reset (struct cgraph_node *node)
558 struct cgraph_edge *e;
560 self_size = 0;
561 estimated_stack_size = 0;
562 estimated_self_stack_size = 0;
563 stack_frame_offset = 0;
564 size = 0;
565 time = 0;
566 growth = 0;
567 scc_no = 0;
568 if (loop_iterations)
570 edge_predicate_pool.remove (loop_iterations);
571 loop_iterations = NULL;
573 if (loop_stride)
575 edge_predicate_pool.remove (loop_stride);
576 loop_stride = NULL;
578 if (array_index)
580 edge_predicate_pool.remove (array_index);
581 array_index = NULL;
583 vec_free (conds);
584 vec_free (size_time_table);
585 for (e = node->callees; e; e = e->next_callee)
586 ipa_call_summaries->get_create (e)->reset ();
587 for (e = node->indirect_calls; e; e = e->next_callee)
588 ipa_call_summaries->get_create (e)->reset ();
589 fp_expressions = false;
592 /* Hook that is called by cgraph.c when a node is removed. */
594 void
595 ipa_fn_summary_t::remove (cgraph_node *node, ipa_fn_summary *info)
597 info->reset (node);
600 /* Same as remap_predicate_after_duplication but handle hint predicate *P.
601 Additionally care about allocating new memory slot for updated predicate
602 and set it to NULL when it becomes true or false (and thus uninteresting).
605 static void
606 remap_hint_predicate_after_duplication (predicate **p,
607 clause_t possible_truths)
609 predicate new_predicate;
611 if (!*p)
612 return;
614 new_predicate = (*p)->remap_after_duplication (possible_truths);
615 /* We do not want to free previous predicate; it is used by node origin. */
616 *p = NULL;
617 set_hint_predicate (p, new_predicate);
621 /* Hook that is called by cgraph.c when a node is duplicated. */
622 void
623 ipa_fn_summary_t::duplicate (cgraph_node *src,
624 cgraph_node *dst,
625 ipa_fn_summary *,
626 ipa_fn_summary *info)
628 memcpy (info, ipa_fn_summaries->get_create (src), sizeof (ipa_fn_summary));
629 /* TODO: as an optimization, we may avoid copying conditions
630 that are known to be false or true. */
631 info->conds = vec_safe_copy (info->conds);
633 /* When there are any replacements in the function body, see if we can figure
634 out that something was optimized out. */
635 if (ipa_node_params_sum && dst->clone.tree_map)
637 vec<size_time_entry, va_gc> *entry = info->size_time_table;
638 /* Use SRC parm info since it may not be copied yet. */
639 struct ipa_node_params *parms_info = IPA_NODE_REF (src);
640 vec<tree> known_vals = vNULL;
641 int count = ipa_get_param_count (parms_info);
642 int i, j;
643 clause_t possible_truths;
644 predicate true_pred = true;
645 size_time_entry *e;
646 int optimized_out_size = 0;
647 bool inlined_to_p = false;
648 struct cgraph_edge *edge, *next;
650 info->size_time_table = 0;
651 known_vals.safe_grow_cleared (count);
652 for (i = 0; i < count; i++)
654 struct ipa_replace_map *r;
656 for (j = 0; vec_safe_iterate (dst->clone.tree_map, j, &r); j++)
658 if (((!r->old_tree && r->parm_num == i)
659 || (r->old_tree && r->old_tree == ipa_get_param (parms_info, i)))
660 && r->replace_p && !r->ref_p)
662 known_vals[i] = r->new_tree;
663 break;
667 evaluate_conditions_for_known_args (dst, false,
668 known_vals,
669 vNULL,
670 &possible_truths,
671 /* We are going to specialize,
672 so ignore nonspec truths. */
673 NULL);
674 known_vals.release ();
676 info->account_size_time (0, 0, true_pred, true_pred);
678 /* Remap size_time vectors.
679 Simplify the predicate by prunning out alternatives that are known
680 to be false.
681 TODO: as on optimization, we can also eliminate conditions known
682 to be true. */
683 for (i = 0; vec_safe_iterate (entry, i, &e); i++)
685 predicate new_exec_pred;
686 predicate new_nonconst_pred;
687 new_exec_pred = e->exec_predicate.remap_after_duplication
688 (possible_truths);
689 new_nonconst_pred = e->nonconst_predicate.remap_after_duplication
690 (possible_truths);
691 if (new_exec_pred == false || new_nonconst_pred == false)
692 optimized_out_size += e->size;
693 else
694 info->account_size_time (e->size, e->time, new_exec_pred,
695 new_nonconst_pred);
698 /* Remap edge predicates with the same simplification as above.
699 Also copy constantness arrays. */
700 for (edge = dst->callees; edge; edge = next)
702 predicate new_predicate;
703 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
704 next = edge->next_callee;
706 if (!edge->inline_failed)
707 inlined_to_p = true;
708 if (!es->predicate)
709 continue;
710 new_predicate = es->predicate->remap_after_duplication
711 (possible_truths);
712 if (new_predicate == false && *es->predicate != false)
713 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
714 edge_set_predicate (edge, &new_predicate);
717 /* Remap indirect edge predicates with the same simplificaiton as above.
718 Also copy constantness arrays. */
719 for (edge = dst->indirect_calls; edge; edge = next)
721 predicate new_predicate;
722 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
723 next = edge->next_callee;
725 gcc_checking_assert (edge->inline_failed);
726 if (!es->predicate)
727 continue;
728 new_predicate = es->predicate->remap_after_duplication
729 (possible_truths);
730 if (new_predicate == false && *es->predicate != false)
731 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
732 edge_set_predicate (edge, &new_predicate);
734 remap_hint_predicate_after_duplication (&info->loop_iterations,
735 possible_truths);
736 remap_hint_predicate_after_duplication (&info->loop_stride,
737 possible_truths);
738 remap_hint_predicate_after_duplication (&info->array_index,
739 possible_truths);
741 /* If inliner or someone after inliner will ever start producing
742 non-trivial clones, we will get trouble with lack of information
743 about updating self sizes, because size vectors already contains
744 sizes of the calees. */
745 gcc_assert (!inlined_to_p || !optimized_out_size);
747 else
749 info->size_time_table = vec_safe_copy (info->size_time_table);
750 if (info->loop_iterations)
752 predicate p = *info->loop_iterations;
753 info->loop_iterations = NULL;
754 set_hint_predicate (&info->loop_iterations, p);
756 if (info->loop_stride)
758 predicate p = *info->loop_stride;
759 info->loop_stride = NULL;
760 set_hint_predicate (&info->loop_stride, p);
762 if (info->array_index)
764 predicate p = *info->array_index;
765 info->array_index = NULL;
766 set_hint_predicate (&info->array_index, p);
769 if (!dst->global.inlined_to)
770 ipa_update_overall_fn_summary (dst);
774 /* Hook that is called by cgraph.c when a node is duplicated. */
776 void
777 ipa_call_summary_t::duplicate (struct cgraph_edge *src,
778 struct cgraph_edge *dst,
779 struct ipa_call_summary *srcinfo,
780 struct ipa_call_summary *info)
782 *info = *srcinfo;
783 info->predicate = NULL;
784 edge_set_predicate (dst, srcinfo->predicate);
785 info->param = srcinfo->param.copy ();
786 if (!dst->indirect_unknown_callee && src->indirect_unknown_callee)
788 info->call_stmt_size -= (eni_size_weights.indirect_call_cost
789 - eni_size_weights.call_cost);
790 info->call_stmt_time -= (eni_time_weights.indirect_call_cost
791 - eni_time_weights.call_cost);
796 /* Keep edge cache consistent across edge removal. */
798 void
799 ipa_call_summary_t::remove (struct cgraph_edge *,
800 struct ipa_call_summary *sum)
802 sum->reset ();
806 /* Dump edge summaries associated to NODE and recursively to all clones.
807 Indent by INDENT. */
809 static void
810 dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
811 struct ipa_fn_summary *info)
813 struct cgraph_edge *edge;
814 for (edge = node->callees; edge; edge = edge->next_callee)
816 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
817 struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
818 int i;
820 fprintf (f,
821 "%*s%s/%i %s\n%*s loop depth:%2i freq:%4.2f size:%2i"
822 " time: %2i callee size:%2i stack:%2i",
823 indent, "", callee->name (), callee->order,
824 !edge->inline_failed
825 ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
826 indent, "", es->loop_depth, edge->sreal_frequency ().to_double (),
827 es->call_stmt_size, es->call_stmt_time,
828 (int) (ipa_fn_summaries->get_create (callee)->size
829 / ipa_fn_summary::size_scale),
830 (int) ipa_fn_summaries->get_create (callee)->estimated_stack_size);
832 if (es->predicate)
834 fprintf (f, " predicate: ");
835 es->predicate->dump (f, info->conds);
837 else
838 fprintf (f, "\n");
839 if (es->param.exists ())
840 for (i = 0; i < (int) es->param.length (); i++)
842 int prob = es->param[i].change_prob;
844 if (!prob)
845 fprintf (f, "%*s op%i is compile time invariant\n",
846 indent + 2, "", i);
847 else if (prob != REG_BR_PROB_BASE)
848 fprintf (f, "%*s op%i change %f%% of time\n", indent + 2, "", i,
849 prob * 100.0 / REG_BR_PROB_BASE);
851 if (!edge->inline_failed)
853 ipa_fn_summary *s = ipa_fn_summaries->get (callee);
854 fprintf (f, "%*sStack frame offset %i, callee self size %i,"
855 " callee size %i\n",
856 indent + 2, "",
857 (int) s->stack_frame_offset,
858 (int) s->estimated_self_stack_size,
859 (int) s->estimated_stack_size);
860 dump_ipa_call_summary (f, indent + 2, callee, info);
863 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
865 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
866 fprintf (f, "%*sindirect call loop depth:%2i freq:%4.2f size:%2i"
867 " time: %2i",
868 indent, "",
869 es->loop_depth,
870 edge->sreal_frequency ().to_double (), es->call_stmt_size,
871 es->call_stmt_time);
872 if (es->predicate)
874 fprintf (f, "predicate: ");
875 es->predicate->dump (f, info->conds);
877 else
878 fprintf (f, "\n");
883 void
884 ipa_dump_fn_summary (FILE *f, struct cgraph_node *node)
886 if (node->definition)
888 struct ipa_fn_summary *s = ipa_fn_summaries->get_create (node);
889 size_time_entry *e;
890 int i;
891 fprintf (f, "IPA function summary for %s/%i", node->name (),
892 node->order);
893 if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
894 fprintf (f, " always_inline");
895 if (s->inlinable)
896 fprintf (f, " inlinable");
897 if (s->fp_expressions)
898 fprintf (f, " fp_expression");
899 fprintf (f, "\n global time: %f\n", s->time.to_double ());
900 fprintf (f, " self size: %i\n", s->self_size);
901 fprintf (f, " global size: %i\n", s->size);
902 fprintf (f, " min size: %i\n", s->min_size);
903 fprintf (f, " self stack: %i\n",
904 (int) s->estimated_self_stack_size);
905 fprintf (f, " global stack: %i\n", (int) s->estimated_stack_size);
906 if (s->growth)
907 fprintf (f, " estimated growth:%i\n", (int) s->growth);
908 if (s->scc_no)
909 fprintf (f, " In SCC: %i\n", (int) s->scc_no);
910 for (i = 0; vec_safe_iterate (s->size_time_table, i, &e); i++)
912 fprintf (f, " size:%f, time:%f",
913 (double) e->size / ipa_fn_summary::size_scale,
914 e->time.to_double ());
915 if (e->exec_predicate != true)
917 fprintf (f, ", executed if:");
918 e->exec_predicate.dump (f, s->conds, 0);
920 if (e->exec_predicate != e->nonconst_predicate)
922 fprintf (f, ", nonconst if:");
923 e->nonconst_predicate.dump (f, s->conds, 0);
925 fprintf (f, "\n");
927 if (s->loop_iterations)
929 fprintf (f, " loop iterations:");
930 s->loop_iterations->dump (f, s->conds);
932 if (s->loop_stride)
934 fprintf (f, " loop stride:");
935 s->loop_stride->dump (f, s->conds);
937 if (s->array_index)
939 fprintf (f, " array index:");
940 s->array_index->dump (f, s->conds);
942 fprintf (f, " calls:\n");
943 dump_ipa_call_summary (f, 4, node, s);
944 fprintf (f, "\n");
948 DEBUG_FUNCTION void
949 ipa_debug_fn_summary (struct cgraph_node *node)
951 ipa_dump_fn_summary (stderr, node);
954 void
955 ipa_dump_fn_summaries (FILE *f)
957 struct cgraph_node *node;
959 FOR_EACH_DEFINED_FUNCTION (node)
960 if (!node->global.inlined_to)
961 ipa_dump_fn_summary (f, node);
964 /* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
965 boolean variable pointed to by DATA. */
967 static bool
968 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
969 void *data)
971 bool *b = (bool *) data;
972 *b = true;
973 return true;
976 /* If OP refers to value of function parameter, return the corresponding
977 parameter. If non-NULL, the size of the memory load (or the SSA_NAME of the
978 PARM_DECL) will be stored to *SIZE_P in that case too. */
980 static tree
981 unmodified_parm_1 (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
983 /* SSA_NAME referring to parm default def? */
984 if (TREE_CODE (op) == SSA_NAME
985 && SSA_NAME_IS_DEFAULT_DEF (op)
986 && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
988 if (size_p)
989 *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
990 return SSA_NAME_VAR (op);
992 /* Non-SSA parm reference? */
993 if (TREE_CODE (op) == PARM_DECL)
995 bool modified = false;
997 ao_ref refd;
998 ao_ref_init (&refd, op);
999 walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
1000 NULL);
1001 if (!modified)
1003 if (size_p)
1004 *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
1005 return op;
1008 return NULL_TREE;
1011 /* If OP refers to value of function parameter, return the corresponding
1012 parameter. Also traverse chains of SSA register assignments. If non-NULL,
1013 the size of the memory load (or the SSA_NAME of the PARM_DECL) will be
1014 stored to *SIZE_P in that case too. */
1016 static tree
1017 unmodified_parm (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
1019 tree res = unmodified_parm_1 (stmt, op, size_p);
1020 if (res)
1021 return res;
1023 if (TREE_CODE (op) == SSA_NAME
1024 && !SSA_NAME_IS_DEFAULT_DEF (op)
1025 && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1026 return unmodified_parm (SSA_NAME_DEF_STMT (op),
1027 gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)),
1028 size_p);
1029 return NULL_TREE;
1032 /* If OP refers to a value of a function parameter or value loaded from an
1033 aggregate passed to a parameter (either by value or reference), return TRUE
1034 and store the number of the parameter to *INDEX_P, the access size into
1035 *SIZE_P, and information whether and how it has been loaded from an
1036 aggregate into *AGGPOS. INFO describes the function parameters, STMT is the
1037 statement in which OP is used or loaded. */
1039 static bool
1040 unmodified_parm_or_parm_agg_item (struct ipa_func_body_info *fbi,
1041 gimple *stmt, tree op, int *index_p,
1042 HOST_WIDE_INT *size_p,
1043 struct agg_position_info *aggpos)
1045 tree res = unmodified_parm_1 (stmt, op, size_p);
1047 gcc_checking_assert (aggpos);
1048 if (res)
1050 *index_p = ipa_get_param_decl_index (fbi->info, res);
1051 if (*index_p < 0)
1052 return false;
1053 aggpos->agg_contents = false;
1054 aggpos->by_ref = false;
1055 return true;
1058 if (TREE_CODE (op) == SSA_NAME)
1060 if (SSA_NAME_IS_DEFAULT_DEF (op)
1061 || !gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1062 return false;
1063 stmt = SSA_NAME_DEF_STMT (op);
1064 op = gimple_assign_rhs1 (stmt);
1065 if (!REFERENCE_CLASS_P (op))
1066 return unmodified_parm_or_parm_agg_item (fbi, stmt, op, index_p, size_p,
1067 aggpos);
1070 aggpos->agg_contents = true;
1071 return ipa_load_from_parm_agg (fbi, fbi->info->descriptors,
1072 stmt, op, index_p, &aggpos->offset,
1073 size_p, &aggpos->by_ref);
1076 /* See if statement might disappear after inlining.
1077 0 - means not eliminated
1078 1 - half of statements goes away
1079 2 - for sure it is eliminated.
1080 We are not terribly sophisticated, basically looking for simple abstraction
1081 penalty wrappers. */
1083 static int
1084 eliminated_by_inlining_prob (gimple *stmt)
1086 enum gimple_code code = gimple_code (stmt);
1087 enum tree_code rhs_code;
1089 if (!optimize)
1090 return 0;
1092 switch (code)
1094 case GIMPLE_RETURN:
1095 return 2;
1096 case GIMPLE_ASSIGN:
1097 if (gimple_num_ops (stmt) != 2)
1098 return 0;
1100 rhs_code = gimple_assign_rhs_code (stmt);
1102 /* Casts of parameters, loads from parameters passed by reference
1103 and stores to return value or parameters are often free after
1104 inlining dua to SRA and further combining.
1105 Assume that half of statements goes away. */
1106 if (CONVERT_EXPR_CODE_P (rhs_code)
1107 || rhs_code == VIEW_CONVERT_EXPR
1108 || rhs_code == ADDR_EXPR
1109 || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1111 tree rhs = gimple_assign_rhs1 (stmt);
1112 tree lhs = gimple_assign_lhs (stmt);
1113 tree inner_rhs = get_base_address (rhs);
1114 tree inner_lhs = get_base_address (lhs);
1115 bool rhs_free = false;
1116 bool lhs_free = false;
1118 if (!inner_rhs)
1119 inner_rhs = rhs;
1120 if (!inner_lhs)
1121 inner_lhs = lhs;
1123 /* Reads of parameter are expected to be free. */
1124 if (unmodified_parm (stmt, inner_rhs, NULL))
1125 rhs_free = true;
1126 /* Match expressions of form &this->field. Those will most likely
1127 combine with something upstream after inlining. */
1128 else if (TREE_CODE (inner_rhs) == ADDR_EXPR)
1130 tree op = get_base_address (TREE_OPERAND (inner_rhs, 0));
1131 if (TREE_CODE (op) == PARM_DECL)
1132 rhs_free = true;
1133 else if (TREE_CODE (op) == MEM_REF
1134 && unmodified_parm (stmt, TREE_OPERAND (op, 0), NULL))
1135 rhs_free = true;
1138 /* When parameter is not SSA register because its address is taken
1139 and it is just copied into one, the statement will be completely
1140 free after inlining (we will copy propagate backward). */
1141 if (rhs_free && is_gimple_reg (lhs))
1142 return 2;
1144 /* Reads of parameters passed by reference
1145 expected to be free (i.e. optimized out after inlining). */
1146 if (TREE_CODE (inner_rhs) == MEM_REF
1147 && unmodified_parm (stmt, TREE_OPERAND (inner_rhs, 0), NULL))
1148 rhs_free = true;
1150 /* Copying parameter passed by reference into gimple register is
1151 probably also going to copy propagate, but we can't be quite
1152 sure. */
1153 if (rhs_free && is_gimple_reg (lhs))
1154 lhs_free = true;
1156 /* Writes to parameters, parameters passed by value and return value
1157 (either dirrectly or passed via invisible reference) are free.
1159 TODO: We ought to handle testcase like
1160 struct a {int a,b;};
1161 struct a
1162 retrurnsturct (void)
1164 struct a a ={1,2};
1165 return a;
1168 This translate into:
1170 retrurnsturct ()
1172 int a$b;
1173 int a$a;
1174 struct a a;
1175 struct a D.2739;
1177 <bb 2>:
1178 D.2739.a = 1;
1179 D.2739.b = 2;
1180 return D.2739;
1183 For that we either need to copy ipa-split logic detecting writes
1184 to return value. */
1185 if (TREE_CODE (inner_lhs) == PARM_DECL
1186 || TREE_CODE (inner_lhs) == RESULT_DECL
1187 || (TREE_CODE (inner_lhs) == MEM_REF
1188 && (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0), NULL)
1189 || (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
1190 && SSA_NAME_VAR (TREE_OPERAND (inner_lhs, 0))
1191 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND
1192 (inner_lhs,
1193 0))) == RESULT_DECL))))
1194 lhs_free = true;
1195 if (lhs_free
1196 && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1197 rhs_free = true;
1198 if (lhs_free && rhs_free)
1199 return 1;
1201 return 0;
1202 default:
1203 return 0;
1208 /* If BB ends by a conditional we can turn into predicates, attach corresponding
1209 predicates to the CFG edges. */
1211 static void
1212 set_cond_stmt_execution_predicate (struct ipa_func_body_info *fbi,
1213 struct ipa_fn_summary *summary,
1214 basic_block bb)
1216 gimple *last;
1217 tree op;
1218 int index;
1219 HOST_WIDE_INT size;
1220 struct agg_position_info aggpos;
1221 enum tree_code code, inverted_code;
1222 edge e;
1223 edge_iterator ei;
1224 gimple *set_stmt;
1225 tree op2;
1227 last = last_stmt (bb);
1228 if (!last || gimple_code (last) != GIMPLE_COND)
1229 return;
1230 if (!is_gimple_ip_invariant (gimple_cond_rhs (last)))
1231 return;
1232 op = gimple_cond_lhs (last);
1233 /* TODO: handle conditionals like
1234 var = op0 < 4;
1235 if (var != 0). */
1236 if (unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
1238 code = gimple_cond_code (last);
1239 inverted_code = invert_tree_comparison (code, HONOR_NANS (op));
1241 FOR_EACH_EDGE (e, ei, bb->succs)
1243 enum tree_code this_code = (e->flags & EDGE_TRUE_VALUE
1244 ? code : inverted_code);
1245 /* invert_tree_comparison will return ERROR_MARK on FP
1246 comparsions that are not EQ/NE instead of returning proper
1247 unordered one. Be sure it is not confused with NON_CONSTANT. */
1248 if (this_code != ERROR_MARK)
1250 predicate p
1251 = add_condition (summary, index, size, &aggpos, this_code,
1252 unshare_expr_without_location
1253 (gimple_cond_rhs (last)));
1254 e->aux = edge_predicate_pool.allocate ();
1255 *(predicate *) e->aux = p;
1260 if (TREE_CODE (op) != SSA_NAME)
1261 return;
1262 /* Special case
1263 if (builtin_constant_p (op))
1264 constant_code
1265 else
1266 nonconstant_code.
1267 Here we can predicate nonconstant_code. We can't
1268 really handle constant_code since we have no predicate
1269 for this and also the constant code is not known to be
1270 optimized away when inliner doen't see operand is constant.
1271 Other optimizers might think otherwise. */
1272 if (gimple_cond_code (last) != NE_EXPR
1273 || !integer_zerop (gimple_cond_rhs (last)))
1274 return;
1275 set_stmt = SSA_NAME_DEF_STMT (op);
1276 if (!gimple_call_builtin_p (set_stmt, BUILT_IN_CONSTANT_P)
1277 || gimple_call_num_args (set_stmt) != 1)
1278 return;
1279 op2 = gimple_call_arg (set_stmt, 0);
1280 if (!unmodified_parm_or_parm_agg_item (fbi, set_stmt, op2, &index, &size,
1281 &aggpos))
1282 return;
1283 FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_FALSE_VALUE)
1285 predicate p = add_condition (summary, index, size, &aggpos,
1286 predicate::is_not_constant, NULL_TREE);
1287 e->aux = edge_predicate_pool.allocate ();
1288 *(predicate *) e->aux = p;
1293 /* If BB ends by a switch we can turn into predicates, attach corresponding
1294 predicates to the CFG edges. */
1296 static void
1297 set_switch_stmt_execution_predicate (struct ipa_func_body_info *fbi,
1298 struct ipa_fn_summary *summary,
1299 basic_block bb)
1301 gimple *lastg;
1302 tree op;
1303 int index;
1304 HOST_WIDE_INT size;
1305 struct agg_position_info aggpos;
1306 edge e;
1307 edge_iterator ei;
1308 size_t n;
1309 size_t case_idx;
1311 lastg = last_stmt (bb);
1312 if (!lastg || gimple_code (lastg) != GIMPLE_SWITCH)
1313 return;
1314 gswitch *last = as_a <gswitch *> (lastg);
1315 op = gimple_switch_index (last);
1316 if (!unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
1317 return;
1319 FOR_EACH_EDGE (e, ei, bb->succs)
1321 e->aux = edge_predicate_pool.allocate ();
1322 *(predicate *) e->aux = false;
1324 n = gimple_switch_num_labels (last);
1325 for (case_idx = 0; case_idx < n; ++case_idx)
1327 tree cl = gimple_switch_label (last, case_idx);
1328 tree min, max;
1329 predicate p;
1331 e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
1332 min = CASE_LOW (cl);
1333 max = CASE_HIGH (cl);
1335 /* For default we might want to construct predicate that none
1336 of cases is met, but it is bit hard to do not having negations
1337 of conditionals handy. */
1338 if (!min && !max)
1339 p = true;
1340 else if (!max)
1341 p = add_condition (summary, index, size, &aggpos, EQ_EXPR,
1342 unshare_expr_without_location (min));
1343 else
1345 predicate p1, p2;
1346 p1 = add_condition (summary, index, size, &aggpos, GE_EXPR,
1347 unshare_expr_without_location (min));
1348 p2 = add_condition (summary, index, size, &aggpos, LE_EXPR,
1349 unshare_expr_without_location (max));
1350 p = p1 & p2;
1352 *(struct predicate *) e->aux
1353 = p.or_with (summary->conds, *(struct predicate *) e->aux);
1358 /* For each BB in NODE attach to its AUX pointer predicate under
1359 which it is executable. */
1361 static void
1362 compute_bb_predicates (struct ipa_func_body_info *fbi,
1363 struct cgraph_node *node,
1364 struct ipa_fn_summary *summary)
1366 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1367 bool done = false;
1368 basic_block bb;
1370 FOR_EACH_BB_FN (bb, my_function)
1372 set_cond_stmt_execution_predicate (fbi, summary, bb);
1373 set_switch_stmt_execution_predicate (fbi, summary, bb);
1376 /* Entry block is always executable. */
1377 ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux
1378 = edge_predicate_pool.allocate ();
1379 *(predicate *) ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux = true;
1381 /* A simple dataflow propagation of predicates forward in the CFG.
1382 TODO: work in reverse postorder. */
1383 while (!done)
1385 done = true;
1386 FOR_EACH_BB_FN (bb, my_function)
1388 predicate p = false;
1389 edge e;
1390 edge_iterator ei;
1391 FOR_EACH_EDGE (e, ei, bb->preds)
1393 if (e->src->aux)
1395 predicate this_bb_predicate
1396 = *(predicate *) e->src->aux;
1397 if (e->aux)
1398 this_bb_predicate &= (*(struct predicate *) e->aux);
1399 p = p.or_with (summary->conds, this_bb_predicate);
1400 if (p == true)
1401 break;
1404 if (p == false)
1405 gcc_checking_assert (!bb->aux);
1406 else
1408 if (!bb->aux)
1410 done = false;
1411 bb->aux = edge_predicate_pool.allocate ();
1412 *((predicate *) bb->aux) = p;
1414 else if (p != *(predicate *) bb->aux)
1416 /* This OR operation is needed to ensure monotonous data flow
1417 in the case we hit the limit on number of clauses and the
1418 and/or operations above give approximate answers. */
1419 p = p.or_with (summary->conds, *(predicate *)bb->aux);
1420 if (p != *(predicate *) bb->aux)
1422 done = false;
1423 *((predicate *) bb->aux) = p;
1432 /* Return predicate specifying when the STMT might have result that is not
1433 a compile time constant. */
1435 static predicate
1436 will_be_nonconstant_expr_predicate (struct ipa_node_params *info,
1437 struct ipa_fn_summary *summary,
1438 tree expr,
1439 vec<predicate> nonconstant_names)
1441 tree parm;
1442 int index;
1443 HOST_WIDE_INT size;
1445 while (UNARY_CLASS_P (expr))
1446 expr = TREE_OPERAND (expr, 0);
1448 parm = unmodified_parm (NULL, expr, &size);
1449 if (parm && (index = ipa_get_param_decl_index (info, parm)) >= 0)
1450 return add_condition (summary, index, size, NULL, predicate::changed,
1451 NULL_TREE);
1452 if (is_gimple_min_invariant (expr))
1453 return false;
1454 if (TREE_CODE (expr) == SSA_NAME)
1455 return nonconstant_names[SSA_NAME_VERSION (expr)];
1456 if (BINARY_CLASS_P (expr) || COMPARISON_CLASS_P (expr))
1458 predicate p1 = will_be_nonconstant_expr_predicate
1459 (info, summary, TREE_OPERAND (expr, 0),
1460 nonconstant_names);
1461 if (p1 == true)
1462 return p1;
1464 predicate p2;
1465 p2 = will_be_nonconstant_expr_predicate (info, summary,
1466 TREE_OPERAND (expr, 1),
1467 nonconstant_names);
1468 return p1.or_with (summary->conds, p2);
1470 else if (TREE_CODE (expr) == COND_EXPR)
1472 predicate p1 = will_be_nonconstant_expr_predicate
1473 (info, summary, TREE_OPERAND (expr, 0),
1474 nonconstant_names);
1475 if (p1 == true)
1476 return p1;
1478 predicate p2;
1479 p2 = will_be_nonconstant_expr_predicate (info, summary,
1480 TREE_OPERAND (expr, 1),
1481 nonconstant_names);
1482 if (p2 == true)
1483 return p2;
1484 p1 = p1.or_with (summary->conds, p2);
1485 p2 = will_be_nonconstant_expr_predicate (info, summary,
1486 TREE_OPERAND (expr, 2),
1487 nonconstant_names);
1488 return p2.or_with (summary->conds, p1);
1490 else
1492 debug_tree (expr);
1493 gcc_unreachable ();
1495 return false;
1499 /* Return predicate specifying when the STMT might have result that is not
1500 a compile time constant. */
1502 static predicate
1503 will_be_nonconstant_predicate (struct ipa_func_body_info *fbi,
1504 struct ipa_fn_summary *summary,
1505 gimple *stmt,
1506 vec<predicate> nonconstant_names)
1508 predicate p = true;
1509 ssa_op_iter iter;
1510 tree use;
1511 predicate op_non_const;
1512 bool is_load;
1513 int base_index;
1514 HOST_WIDE_INT size;
1515 struct agg_position_info aggpos;
1517 /* What statments might be optimized away
1518 when their arguments are constant. */
1519 if (gimple_code (stmt) != GIMPLE_ASSIGN
1520 && gimple_code (stmt) != GIMPLE_COND
1521 && gimple_code (stmt) != GIMPLE_SWITCH
1522 && (gimple_code (stmt) != GIMPLE_CALL
1523 || !(gimple_call_flags (stmt) & ECF_CONST)))
1524 return p;
1526 /* Stores will stay anyway. */
1527 if (gimple_store_p (stmt))
1528 return p;
1530 is_load = gimple_assign_load_p (stmt);
1532 /* Loads can be optimized when the value is known. */
1533 if (is_load)
1535 tree op;
1536 gcc_assert (gimple_assign_single_p (stmt));
1537 op = gimple_assign_rhs1 (stmt);
1538 if (!unmodified_parm_or_parm_agg_item (fbi, stmt, op, &base_index, &size,
1539 &aggpos))
1540 return p;
1542 else
1543 base_index = -1;
1545 /* See if we understand all operands before we start
1546 adding conditionals. */
1547 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1549 tree parm = unmodified_parm (stmt, use, NULL);
1550 /* For arguments we can build a condition. */
1551 if (parm && ipa_get_param_decl_index (fbi->info, parm) >= 0)
1552 continue;
1553 if (TREE_CODE (use) != SSA_NAME)
1554 return p;
1555 /* If we know when operand is constant,
1556 we still can say something useful. */
1557 if (nonconstant_names[SSA_NAME_VERSION (use)] != true)
1558 continue;
1559 return p;
1562 if (is_load)
1563 op_non_const =
1564 add_condition (summary, base_index, size, &aggpos, predicate::changed,
1565 NULL);
1566 else
1567 op_non_const = false;
1568 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1570 HOST_WIDE_INT size;
1571 tree parm = unmodified_parm (stmt, use, &size);
1572 int index;
1574 if (parm && (index = ipa_get_param_decl_index (fbi->info, parm)) >= 0)
1576 if (index != base_index)
1577 p = add_condition (summary, index, size, NULL, predicate::changed,
1578 NULL_TREE);
1579 else
1580 continue;
1582 else
1583 p = nonconstant_names[SSA_NAME_VERSION (use)];
1584 op_non_const = p.or_with (summary->conds, op_non_const);
1586 if ((gimple_code (stmt) == GIMPLE_ASSIGN || gimple_code (stmt) == GIMPLE_CALL)
1587 && gimple_op (stmt, 0)
1588 && TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
1589 nonconstant_names[SSA_NAME_VERSION (gimple_op (stmt, 0))]
1590 = op_non_const;
1591 return op_non_const;
1594 struct record_modified_bb_info
1596 tree op;
1597 bitmap bb_set;
1598 gimple *stmt;
1601 /* Value is initialized in INIT_BB and used in USE_BB. We want to copute
1602 probability how often it changes between USE_BB.
1603 INIT_BB->count/USE_BB->count is an estimate, but if INIT_BB
1604 is in different loop nest, we can do better.
1605 This is all just estimate. In theory we look for minimal cut separating
1606 INIT_BB and USE_BB, but we only want to anticipate loop invariant motion
1607 anyway. */
1609 static basic_block
1610 get_minimal_bb (basic_block init_bb, basic_block use_bb)
1612 struct loop *l = find_common_loop (init_bb->loop_father, use_bb->loop_father);
1613 if (l && l->header->count < init_bb->count)
1614 return l->header;
1615 return init_bb;
1618 /* Callback of walk_aliased_vdefs. Records basic blocks where the value may be
1619 set except for info->stmt. */
1621 static bool
1622 record_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
1624 struct record_modified_bb_info *info =
1625 (struct record_modified_bb_info *) data;
1626 if (SSA_NAME_DEF_STMT (vdef) == info->stmt)
1627 return false;
1628 if (gimple_clobber_p (SSA_NAME_DEF_STMT (vdef)))
1629 return false;
1630 bitmap_set_bit (info->bb_set,
1631 SSA_NAME_IS_DEFAULT_DEF (vdef)
1632 ? ENTRY_BLOCK_PTR_FOR_FN (cfun)->index
1633 : get_minimal_bb
1634 (gimple_bb (SSA_NAME_DEF_STMT (vdef)),
1635 gimple_bb (info->stmt))->index);
1636 if (dump_file)
1638 fprintf (dump_file, " Param ");
1639 print_generic_expr (dump_file, info->op, TDF_SLIM);
1640 fprintf (dump_file, " changed at bb %i, minimal: %i stmt: ",
1641 gimple_bb (SSA_NAME_DEF_STMT (vdef))->index,
1642 get_minimal_bb
1643 (gimple_bb (SSA_NAME_DEF_STMT (vdef)),
1644 gimple_bb (info->stmt))->index);
1645 print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (vdef), 0);
1647 return false;
1650 /* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
1651 will change since last invocation of STMT.
1653 Value 0 is reserved for compile time invariants.
1654 For common parameters it is REG_BR_PROB_BASE. For loop invariants it
1655 ought to be REG_BR_PROB_BASE / estimated_iters. */
1657 static int
1658 param_change_prob (gimple *stmt, int i)
1660 tree op = gimple_call_arg (stmt, i);
1661 basic_block bb = gimple_bb (stmt);
1663 if (TREE_CODE (op) == WITH_SIZE_EXPR)
1664 op = TREE_OPERAND (op, 0);
1666 tree base = get_base_address (op);
1668 /* Global invariants never change. */
1669 if (is_gimple_min_invariant (base))
1670 return 0;
1672 /* We would have to do non-trivial analysis to really work out what
1673 is the probability of value to change (i.e. when init statement
1674 is in a sibling loop of the call).
1676 We do an conservative estimate: when call is executed N times more often
1677 than the statement defining value, we take the frequency 1/N. */
1678 if (TREE_CODE (base) == SSA_NAME)
1680 profile_count init_count;
1682 if (!bb->count.nonzero_p ())
1683 return REG_BR_PROB_BASE;
1685 if (SSA_NAME_IS_DEFAULT_DEF (base))
1686 init_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
1687 else
1688 init_count = get_minimal_bb
1689 (gimple_bb (SSA_NAME_DEF_STMT (base)),
1690 gimple_bb (stmt))->count;
1692 if (init_count < bb->count)
1693 return MAX ((init_count.to_sreal_scale (bb->count)
1694 * REG_BR_PROB_BASE).to_int (), 1);
1695 return REG_BR_PROB_BASE;
1697 else
1699 ao_ref refd;
1700 profile_count max = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
1701 struct record_modified_bb_info info;
1702 tree init = ctor_for_folding (base);
1704 if (init != error_mark_node)
1705 return 0;
1706 if (!bb->count.nonzero_p ())
1707 return REG_BR_PROB_BASE;
1708 if (dump_file)
1710 fprintf (dump_file, " Analyzing param change probablity of ");
1711 print_generic_expr (dump_file, op, TDF_SLIM);
1712 fprintf (dump_file, "\n");
1714 ao_ref_init (&refd, op);
1715 info.op = op;
1716 info.stmt = stmt;
1717 info.bb_set = BITMAP_ALLOC (NULL);
1718 walk_aliased_vdefs (&refd, gimple_vuse (stmt), record_modified, &info,
1719 NULL);
1720 if (bitmap_bit_p (info.bb_set, bb->index))
1722 if (dump_file)
1723 fprintf (dump_file, " Set in same BB as used.\n");
1724 BITMAP_FREE (info.bb_set);
1725 return REG_BR_PROB_BASE;
1728 bitmap_iterator bi;
1729 unsigned index;
1730 /* Lookup the most frequent update of the value and believe that
1731 it dominates all the other; precise analysis here is difficult. */
1732 EXECUTE_IF_SET_IN_BITMAP (info.bb_set, 0, index, bi)
1733 max = max.max (BASIC_BLOCK_FOR_FN (cfun, index)->count);
1734 if (dump_file)
1736 fprintf (dump_file, " Set with count ");
1737 max.dump (dump_file);
1738 fprintf (dump_file, " and used with count ");
1739 bb->count.dump (dump_file);
1740 fprintf (dump_file, " freq %f\n",
1741 max.to_sreal_scale (bb->count).to_double ());
1744 BITMAP_FREE (info.bb_set);
1745 if (max < bb->count)
1746 return MAX ((max.to_sreal_scale (bb->count)
1747 * REG_BR_PROB_BASE).to_int (), 1);
1748 return REG_BR_PROB_BASE;
1752 /* Find whether a basic block BB is the final block of a (half) diamond CFG
1753 sub-graph and if the predicate the condition depends on is known. If so,
1754 return true and store the pointer the predicate in *P. */
1756 static bool
1757 phi_result_unknown_predicate (struct ipa_node_params *info,
1758 ipa_fn_summary *summary, basic_block bb,
1759 predicate *p,
1760 vec<predicate> nonconstant_names)
1762 edge e;
1763 edge_iterator ei;
1764 basic_block first_bb = NULL;
1765 gimple *stmt;
1767 if (single_pred_p (bb))
1769 *p = false;
1770 return true;
1773 FOR_EACH_EDGE (e, ei, bb->preds)
1775 if (single_succ_p (e->src))
1777 if (!single_pred_p (e->src))
1778 return false;
1779 if (!first_bb)
1780 first_bb = single_pred (e->src);
1781 else if (single_pred (e->src) != first_bb)
1782 return false;
1784 else
1786 if (!first_bb)
1787 first_bb = e->src;
1788 else if (e->src != first_bb)
1789 return false;
1793 if (!first_bb)
1794 return false;
1796 stmt = last_stmt (first_bb);
1797 if (!stmt
1798 || gimple_code (stmt) != GIMPLE_COND
1799 || !is_gimple_ip_invariant (gimple_cond_rhs (stmt)))
1800 return false;
1802 *p = will_be_nonconstant_expr_predicate (info, summary,
1803 gimple_cond_lhs (stmt),
1804 nonconstant_names);
1805 if (*p == true)
1806 return false;
1807 else
1808 return true;
1811 /* Given a PHI statement in a function described by inline properties SUMMARY
1812 and *P being the predicate describing whether the selected PHI argument is
1813 known, store a predicate for the result of the PHI statement into
1814 NONCONSTANT_NAMES, if possible. */
1816 static void
1817 predicate_for_phi_result (struct ipa_fn_summary *summary, gphi *phi,
1818 predicate *p,
1819 vec<predicate> nonconstant_names)
1821 unsigned i;
1823 for (i = 0; i < gimple_phi_num_args (phi); i++)
1825 tree arg = gimple_phi_arg (phi, i)->def;
1826 if (!is_gimple_min_invariant (arg))
1828 gcc_assert (TREE_CODE (arg) == SSA_NAME);
1829 *p = p->or_with (summary->conds,
1830 nonconstant_names[SSA_NAME_VERSION (arg)]);
1831 if (*p == true)
1832 return;
1836 if (dump_file && (dump_flags & TDF_DETAILS))
1838 fprintf (dump_file, "\t\tphi predicate: ");
1839 p->dump (dump_file, summary->conds);
1841 nonconstant_names[SSA_NAME_VERSION (gimple_phi_result (phi))] = *p;
1844 /* Return predicate specifying when array index in access OP becomes non-constant. */
1846 static predicate
1847 array_index_predicate (ipa_fn_summary *info,
1848 vec< predicate> nonconstant_names, tree op)
1850 predicate p = false;
1851 while (handled_component_p (op))
1853 if (TREE_CODE (op) == ARRAY_REF || TREE_CODE (op) == ARRAY_RANGE_REF)
1855 if (TREE_CODE (TREE_OPERAND (op, 1)) == SSA_NAME)
1856 p = p.or_with (info->conds,
1857 nonconstant_names[SSA_NAME_VERSION
1858 (TREE_OPERAND (op, 1))]);
1860 op = TREE_OPERAND (op, 0);
1862 return p;
1865 /* For a typical usage of __builtin_expect (a<b, 1), we
1866 may introduce an extra relation stmt:
1867 With the builtin, we have
1868 t1 = a <= b;
1869 t2 = (long int) t1;
1870 t3 = __builtin_expect (t2, 1);
1871 if (t3 != 0)
1872 goto ...
1873 Without the builtin, we have
1874 if (a<=b)
1875 goto...
1876 This affects the size/time estimation and may have
1877 an impact on the earlier inlining.
1878 Here find this pattern and fix it up later. */
1880 static gimple *
1881 find_foldable_builtin_expect (basic_block bb)
1883 gimple_stmt_iterator bsi;
1885 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1887 gimple *stmt = gsi_stmt (bsi);
1888 if (gimple_call_builtin_p (stmt, BUILT_IN_EXPECT)
1889 || gimple_call_internal_p (stmt, IFN_BUILTIN_EXPECT))
1891 tree var = gimple_call_lhs (stmt);
1892 tree arg = gimple_call_arg (stmt, 0);
1893 use_operand_p use_p;
1894 gimple *use_stmt;
1895 bool match = false;
1896 bool done = false;
1898 if (!var || !arg)
1899 continue;
1900 gcc_assert (TREE_CODE (var) == SSA_NAME);
1902 while (TREE_CODE (arg) == SSA_NAME)
1904 gimple *stmt_tmp = SSA_NAME_DEF_STMT (arg);
1905 if (!is_gimple_assign (stmt_tmp))
1906 break;
1907 switch (gimple_assign_rhs_code (stmt_tmp))
1909 case LT_EXPR:
1910 case LE_EXPR:
1911 case GT_EXPR:
1912 case GE_EXPR:
1913 case EQ_EXPR:
1914 case NE_EXPR:
1915 match = true;
1916 done = true;
1917 break;
1918 CASE_CONVERT:
1919 break;
1920 default:
1921 done = true;
1922 break;
1924 if (done)
1925 break;
1926 arg = gimple_assign_rhs1 (stmt_tmp);
1929 if (match && single_imm_use (var, &use_p, &use_stmt)
1930 && gimple_code (use_stmt) == GIMPLE_COND)
1931 return use_stmt;
1934 return NULL;
1937 /* Return true when the basic blocks contains only clobbers followed by RESX.
1938 Such BBs are kept around to make removal of dead stores possible with
1939 presence of EH and will be optimized out by optimize_clobbers later in the
1940 game.
1942 NEED_EH is used to recurse in case the clobber has non-EH predecestors
1943 that can be clobber only, too.. When it is false, the RESX is not necessary
1944 on the end of basic block. */
1946 static bool
1947 clobber_only_eh_bb_p (basic_block bb, bool need_eh = true)
1949 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1950 edge_iterator ei;
1951 edge e;
1953 if (need_eh)
1955 if (gsi_end_p (gsi))
1956 return false;
1957 if (gimple_code (gsi_stmt (gsi)) != GIMPLE_RESX)
1958 return false;
1959 gsi_prev (&gsi);
1961 else if (!single_succ_p (bb))
1962 return false;
1964 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
1966 gimple *stmt = gsi_stmt (gsi);
1967 if (is_gimple_debug (stmt))
1968 continue;
1969 if (gimple_clobber_p (stmt))
1970 continue;
1971 if (gimple_code (stmt) == GIMPLE_LABEL)
1972 break;
1973 return false;
1976 /* See if all predecestors are either throws or clobber only BBs. */
1977 FOR_EACH_EDGE (e, ei, bb->preds)
1978 if (!(e->flags & EDGE_EH)
1979 && !clobber_only_eh_bb_p (e->src, false))
1980 return false;
1982 return true;
1985 /* Return true if STMT compute a floating point expression that may be affected
1986 by -ffast-math and similar flags. */
1988 static bool
1989 fp_expression_p (gimple *stmt)
1991 ssa_op_iter i;
1992 tree op;
1994 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF|SSA_OP_USE)
1995 if (FLOAT_TYPE_P (TREE_TYPE (op)))
1996 return true;
1997 return false;
2000 /* Analyze function body for NODE.
2001 EARLY indicates run from early optimization pipeline. */
2003 static void
2004 analyze_function_body (struct cgraph_node *node, bool early)
2006 sreal time = 0;
2007 /* Estimate static overhead for function prologue/epilogue and alignment. */
2008 int size = 2;
2009 /* Benefits are scaled by probability of elimination that is in range
2010 <0,2>. */
2011 basic_block bb;
2012 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
2013 sreal freq;
2014 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
2015 predicate bb_predicate;
2016 struct ipa_func_body_info fbi;
2017 vec<predicate> nonconstant_names = vNULL;
2018 int nblocks, n;
2019 int *order;
2020 predicate array_index = true;
2021 gimple *fix_builtin_expect_stmt;
2023 gcc_assert (my_function && my_function->cfg);
2024 gcc_assert (cfun == my_function);
2026 memset(&fbi, 0, sizeof(fbi));
2027 info->conds = NULL;
2028 info->size_time_table = NULL;
2030 /* When optimizing and analyzing for IPA inliner, initialize loop optimizer
2031 so we can produce proper inline hints.
2033 When optimizing and analyzing for early inliner, initialize node params
2034 so we can produce correct BB predicates. */
2036 if (opt_for_fn (node->decl, optimize))
2038 calculate_dominance_info (CDI_DOMINATORS);
2039 if (!early)
2040 loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
2041 else
2043 ipa_check_create_node_params ();
2044 ipa_initialize_node_params (node);
2047 if (ipa_node_params_sum)
2049 fbi.node = node;
2050 fbi.info = IPA_NODE_REF (node);
2051 fbi.bb_infos = vNULL;
2052 fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
2053 fbi.param_count = count_formal_params(node->decl);
2054 nonconstant_names.safe_grow_cleared
2055 (SSANAMES (my_function)->length ());
2059 if (dump_file)
2060 fprintf (dump_file, "\nAnalyzing function body size: %s\n",
2061 node->name ());
2063 /* When we run into maximal number of entries, we assign everything to the
2064 constant truth case. Be sure to have it in list. */
2065 bb_predicate = true;
2066 info->account_size_time (0, 0, bb_predicate, bb_predicate);
2068 bb_predicate = predicate::not_inlined ();
2069 info->account_size_time (2 * ipa_fn_summary::size_scale, 0, bb_predicate,
2070 bb_predicate);
2072 if (fbi.info)
2073 compute_bb_predicates (&fbi, node, info);
2074 order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
2075 nblocks = pre_and_rev_post_order_compute (NULL, order, false);
2076 for (n = 0; n < nblocks; n++)
2078 bb = BASIC_BLOCK_FOR_FN (cfun, order[n]);
2079 freq = bb->count.to_sreal_scale (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count);
2080 if (clobber_only_eh_bb_p (bb))
2082 if (dump_file && (dump_flags & TDF_DETAILS))
2083 fprintf (dump_file, "\n Ignoring BB %i;"
2084 " it will be optimized away by cleanup_clobbers\n",
2085 bb->index);
2086 continue;
2089 /* TODO: Obviously predicates can be propagated down across CFG. */
2090 if (fbi.info)
2092 if (bb->aux)
2093 bb_predicate = *(predicate *) bb->aux;
2094 else
2095 bb_predicate = false;
2097 else
2098 bb_predicate = true;
2100 if (dump_file && (dump_flags & TDF_DETAILS))
2102 fprintf (dump_file, "\n BB %i predicate:", bb->index);
2103 bb_predicate.dump (dump_file, info->conds);
2106 if (fbi.info && nonconstant_names.exists ())
2108 predicate phi_predicate;
2109 bool first_phi = true;
2111 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
2112 gsi_next (&bsi))
2114 if (first_phi
2115 && !phi_result_unknown_predicate (fbi.info, info, bb,
2116 &phi_predicate,
2117 nonconstant_names))
2118 break;
2119 first_phi = false;
2120 if (dump_file && (dump_flags & TDF_DETAILS))
2122 fprintf (dump_file, " ");
2123 print_gimple_stmt (dump_file, gsi_stmt (bsi), 0);
2125 predicate_for_phi_result (info, bsi.phi (), &phi_predicate,
2126 nonconstant_names);
2130 fix_builtin_expect_stmt = find_foldable_builtin_expect (bb);
2132 for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
2133 gsi_next (&bsi))
2135 gimple *stmt = gsi_stmt (bsi);
2136 int this_size = estimate_num_insns (stmt, &eni_size_weights);
2137 int this_time = estimate_num_insns (stmt, &eni_time_weights);
2138 int prob;
2139 predicate will_be_nonconstant;
2141 /* This relation stmt should be folded after we remove
2142 buildin_expect call. Adjust the cost here. */
2143 if (stmt == fix_builtin_expect_stmt)
2145 this_size--;
2146 this_time--;
2149 if (dump_file && (dump_flags & TDF_DETAILS))
2151 fprintf (dump_file, " ");
2152 print_gimple_stmt (dump_file, stmt, 0);
2153 fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n",
2154 freq.to_double (), this_size,
2155 this_time);
2158 if (gimple_assign_load_p (stmt) && nonconstant_names.exists ())
2160 predicate this_array_index;
2161 this_array_index =
2162 array_index_predicate (info, nonconstant_names,
2163 gimple_assign_rhs1 (stmt));
2164 if (this_array_index != false)
2165 array_index &= this_array_index;
2167 if (gimple_store_p (stmt) && nonconstant_names.exists ())
2169 predicate this_array_index;
2170 this_array_index =
2171 array_index_predicate (info, nonconstant_names,
2172 gimple_get_lhs (stmt));
2173 if (this_array_index != false)
2174 array_index &= this_array_index;
2178 if (is_gimple_call (stmt)
2179 && !gimple_call_internal_p (stmt))
2181 struct cgraph_edge *edge = node->get_edge (stmt);
2182 ipa_call_summary *es = ipa_call_summaries->get_create (edge);
2184 /* Special case: results of BUILT_IN_CONSTANT_P will be always
2185 resolved as constant. We however don't want to optimize
2186 out the cgraph edges. */
2187 if (nonconstant_names.exists ()
2188 && gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P)
2189 && gimple_call_lhs (stmt)
2190 && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
2192 predicate false_p = false;
2193 nonconstant_names[SSA_NAME_VERSION (gimple_call_lhs (stmt))]
2194 = false_p;
2196 if (ipa_node_params_sum)
2198 int count = gimple_call_num_args (stmt);
2199 int i;
2201 if (count)
2202 es->param.safe_grow_cleared (count);
2203 for (i = 0; i < count; i++)
2205 int prob = param_change_prob (stmt, i);
2206 gcc_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
2207 es->param[i].change_prob = prob;
2211 es->call_stmt_size = this_size;
2212 es->call_stmt_time = this_time;
2213 es->loop_depth = bb_loop_depth (bb);
2214 edge_set_predicate (edge, &bb_predicate);
2217 /* TODO: When conditional jump or swithc is known to be constant, but
2218 we did not translate it into the predicates, we really can account
2219 just maximum of the possible paths. */
2220 if (fbi.info)
2221 will_be_nonconstant
2222 = will_be_nonconstant_predicate (&fbi, info,
2223 stmt, nonconstant_names);
2224 else
2225 will_be_nonconstant = true;
2226 if (this_time || this_size)
2228 sreal final_time = (sreal)this_time * freq;
2230 prob = eliminated_by_inlining_prob (stmt);
2231 if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS))
2232 fprintf (dump_file,
2233 "\t\t50%% will be eliminated by inlining\n");
2234 if (prob == 2 && dump_file && (dump_flags & TDF_DETAILS))
2235 fprintf (dump_file, "\t\tWill be eliminated by inlining\n");
2237 struct predicate p = bb_predicate & will_be_nonconstant;
2239 /* We can ignore statement when we proved it is never going
2240 to happen, but we can not do that for call statements
2241 because edges are accounted specially. */
2243 if (*(is_gimple_call (stmt) ? &bb_predicate : &p) != false)
2245 time += final_time;
2246 size += this_size;
2249 /* We account everything but the calls. Calls have their own
2250 size/time info attached to cgraph edges. This is necessary
2251 in order to make the cost disappear after inlining. */
2252 if (!is_gimple_call (stmt))
2254 if (prob)
2256 predicate ip = bb_predicate & predicate::not_inlined ();
2257 info->account_size_time (this_size * prob,
2258 (this_time * prob) / 2, ip,
2261 if (prob != 2)
2262 info->account_size_time (this_size * (2 - prob),
2263 (this_time * (2 - prob) / 2),
2264 bb_predicate,
2268 if (!info->fp_expressions && fp_expression_p (stmt))
2270 info->fp_expressions = true;
2271 if (dump_file)
2272 fprintf (dump_file, " fp_expression set\n");
2275 gcc_assert (time >= 0);
2276 gcc_assert (size >= 0);
2280 set_hint_predicate (&ipa_fn_summaries->get_create (node)->array_index,
2281 array_index);
2282 free (order);
2284 if (nonconstant_names.exists () && !early)
2286 struct loop *loop;
2287 predicate loop_iterations = true;
2288 predicate loop_stride = true;
2290 if (dump_file && (dump_flags & TDF_DETAILS))
2291 flow_loops_dump (dump_file, NULL, 0);
2292 scev_initialize ();
2293 FOR_EACH_LOOP (loop, 0)
2295 vec<edge> exits;
2296 edge ex;
2297 unsigned int j;
2298 struct tree_niter_desc niter_desc;
2299 bb_predicate = *(predicate *) loop->header->aux;
2301 exits = get_loop_exit_edges (loop);
2302 FOR_EACH_VEC_ELT (exits, j, ex)
2303 if (number_of_iterations_exit (loop, ex, &niter_desc, false)
2304 && !is_gimple_min_invariant (niter_desc.niter))
2306 predicate will_be_nonconstant
2307 = will_be_nonconstant_expr_predicate (fbi.info, info,
2308 niter_desc.niter,
2309 nonconstant_names);
2310 if (will_be_nonconstant != true)
2311 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2312 if (will_be_nonconstant != true
2313 && will_be_nonconstant != false)
2314 /* This is slightly inprecise. We may want to represent each
2315 loop with independent predicate. */
2316 loop_iterations &= will_be_nonconstant;
2318 exits.release ();
2321 /* To avoid quadratic behavior we analyze stride predicates only
2322 with respect to the containing loop. Thus we simply iterate
2323 over all defs in the outermost loop body. */
2324 for (loop = loops_for_fn (cfun)->tree_root->inner;
2325 loop != NULL; loop = loop->next)
2327 basic_block *body = get_loop_body (loop);
2328 for (unsigned i = 0; i < loop->num_nodes; i++)
2330 gimple_stmt_iterator gsi;
2331 bb_predicate = *(predicate *) body[i]->aux;
2332 for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi);
2333 gsi_next (&gsi))
2335 gimple *stmt = gsi_stmt (gsi);
2337 if (!is_gimple_assign (stmt))
2338 continue;
2340 tree def = gimple_assign_lhs (stmt);
2341 if (TREE_CODE (def) != SSA_NAME)
2342 continue;
2344 affine_iv iv;
2345 if (!simple_iv (loop_containing_stmt (stmt),
2346 loop_containing_stmt (stmt),
2347 def, &iv, true)
2348 || is_gimple_min_invariant (iv.step))
2349 continue;
2351 predicate will_be_nonconstant
2352 = will_be_nonconstant_expr_predicate (fbi.info, info,
2353 iv.step,
2354 nonconstant_names);
2355 if (will_be_nonconstant != true)
2356 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2357 if (will_be_nonconstant != true
2358 && will_be_nonconstant != false)
2359 /* This is slightly inprecise. We may want to represent
2360 each loop with independent predicate. */
2361 loop_stride = loop_stride & will_be_nonconstant;
2364 free (body);
2366 ipa_fn_summary *s = ipa_fn_summaries->get_create (node);
2367 set_hint_predicate (&s->loop_iterations, loop_iterations);
2368 set_hint_predicate (&s->loop_stride, loop_stride);
2369 scev_finalize ();
2371 FOR_ALL_BB_FN (bb, my_function)
2373 edge e;
2374 edge_iterator ei;
2376 if (bb->aux)
2377 edge_predicate_pool.remove ((predicate *)bb->aux);
2378 bb->aux = NULL;
2379 FOR_EACH_EDGE (e, ei, bb->succs)
2381 if (e->aux)
2382 edge_predicate_pool.remove ((predicate *) e->aux);
2383 e->aux = NULL;
2386 ipa_fn_summary *s = ipa_fn_summaries->get_create (node);
2387 s->time = time;
2388 s->self_size = size;
2389 nonconstant_names.release ();
2390 ipa_release_body_info (&fbi);
2391 if (opt_for_fn (node->decl, optimize))
2393 if (!early)
2394 loop_optimizer_finalize ();
2395 else if (!ipa_edge_args_sum)
2396 ipa_free_all_node_params ();
2397 free_dominance_info (CDI_DOMINATORS);
2399 if (dump_file)
2401 fprintf (dump_file, "\n");
2402 ipa_dump_fn_summary (dump_file, node);
2407 /* Compute function summary.
2408 EARLY is true when we compute parameters during early opts. */
2410 void
2411 compute_fn_summary (struct cgraph_node *node, bool early)
2413 HOST_WIDE_INT self_stack_size;
2414 struct cgraph_edge *e;
2415 struct ipa_fn_summary *info;
2417 gcc_assert (!node->global.inlined_to);
2419 if (!ipa_fn_summaries)
2420 ipa_fn_summary_alloc ();
2422 info = ipa_fn_summaries->get_create (node);
2423 info->reset (node);
2425 /* Estimate the stack size for the function if we're optimizing. */
2426 self_stack_size = optimize && !node->thunk.thunk_p
2427 ? estimated_stack_frame_size (node) : 0;
2428 info->estimated_self_stack_size = self_stack_size;
2429 info->estimated_stack_size = self_stack_size;
2430 info->stack_frame_offset = 0;
2432 if (node->thunk.thunk_p)
2434 ipa_call_summary *es = ipa_call_summaries->get_create (node->callees);
2435 predicate t = true;
2437 node->local.can_change_signature = false;
2438 es->call_stmt_size = eni_size_weights.call_cost;
2439 es->call_stmt_time = eni_time_weights.call_cost;
2440 info->account_size_time (ipa_fn_summary::size_scale * 2, 2, t, t);
2441 t = predicate::not_inlined ();
2442 info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t);
2443 ipa_update_overall_fn_summary (node);
2444 info->self_size = info->size;
2445 /* We can not inline instrumentation clones. */
2446 if (node->thunk.add_pointer_bounds_args)
2448 info->inlinable = false;
2449 node->callees->inline_failed = CIF_CHKP;
2451 else if (stdarg_p (TREE_TYPE (node->decl)))
2453 info->inlinable = false;
2454 node->callees->inline_failed = CIF_VARIADIC_THUNK;
2456 else
2457 info->inlinable = true;
2459 else
2461 /* Even is_gimple_min_invariant rely on current_function_decl. */
2462 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2464 /* Can this function be inlined at all? */
2465 if (!opt_for_fn (node->decl, optimize)
2466 && !lookup_attribute ("always_inline",
2467 DECL_ATTRIBUTES (node->decl)))
2468 info->inlinable = false;
2469 else
2470 info->inlinable = tree_inlinable_function_p (node->decl);
2472 /* Type attributes can use parameter indices to describe them. */
2473 if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl))
2474 /* Likewise for #pragma omp declare simd functions or functions
2475 with simd attribute. */
2476 || lookup_attribute ("omp declare simd",
2477 DECL_ATTRIBUTES (node->decl)))
2478 node->local.can_change_signature = false;
2479 else
2481 /* Otherwise, inlinable functions always can change signature. */
2482 if (info->inlinable)
2483 node->local.can_change_signature = true;
2484 else
2486 /* Functions calling builtin_apply can not change signature. */
2487 for (e = node->callees; e; e = e->next_callee)
2489 tree cdecl = e->callee->decl;
2490 if (DECL_BUILT_IN (cdecl)
2491 && DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL
2492 && (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS
2493 || DECL_FUNCTION_CODE (cdecl) == BUILT_IN_VA_START))
2494 break;
2496 node->local.can_change_signature = !e;
2499 /* Functions called by instrumentation thunk can't change signature
2500 because instrumentation thunk modification is not supported. */
2501 if (node->local.can_change_signature)
2502 for (e = node->callers; e; e = e->next_caller)
2503 if (e->caller->thunk.thunk_p
2504 && e->caller->thunk.add_pointer_bounds_args)
2506 node->local.can_change_signature = false;
2507 break;
2509 analyze_function_body (node, early);
2510 pop_cfun ();
2512 for (e = node->callees; e; e = e->next_callee)
2513 if (e->callee->comdat_local_p ())
2514 break;
2515 node->calls_comdat_local = (e != NULL);
2517 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
2518 info->size = info->self_size;
2519 info->stack_frame_offset = 0;
2520 info->estimated_stack_size = info->estimated_self_stack_size;
2522 /* Code above should compute exactly the same result as
2523 ipa_update_overall_fn_summary but because computation happens in
2524 different order the roundoff errors result in slight changes. */
2525 ipa_update_overall_fn_summary (node);
2526 gcc_assert (info->size == info->self_size);
2530 /* Compute parameters of functions used by inliner using
2531 current_function_decl. */
2533 static unsigned int
2534 compute_fn_summary_for_current (void)
2536 compute_fn_summary (cgraph_node::get (current_function_decl), true);
2537 return 0;
2540 /* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
2541 KNOWN_CONTEXTS and KNOWN_AGGS. */
2543 static bool
2544 estimate_edge_devirt_benefit (struct cgraph_edge *ie,
2545 int *size, int *time,
2546 vec<tree> known_vals,
2547 vec<ipa_polymorphic_call_context> known_contexts,
2548 vec<ipa_agg_jump_function_p> known_aggs)
2550 tree target;
2551 struct cgraph_node *callee;
2552 struct ipa_fn_summary *isummary;
2553 enum availability avail;
2554 bool speculative;
2556 if (!known_vals.exists () && !known_contexts.exists ())
2557 return false;
2558 if (!opt_for_fn (ie->caller->decl, flag_indirect_inlining))
2559 return false;
2561 target = ipa_get_indirect_edge_target (ie, known_vals, known_contexts,
2562 known_aggs, &speculative);
2563 if (!target || speculative)
2564 return false;
2566 /* Account for difference in cost between indirect and direct calls. */
2567 *size -= (eni_size_weights.indirect_call_cost - eni_size_weights.call_cost);
2568 *time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost);
2569 gcc_checking_assert (*time >= 0);
2570 gcc_checking_assert (*size >= 0);
2572 callee = cgraph_node::get (target);
2573 if (!callee || !callee->definition)
2574 return false;
2575 callee = callee->function_symbol (&avail);
2576 if (avail < AVAIL_AVAILABLE)
2577 return false;
2578 isummary = ipa_fn_summaries->get_create (callee);
2579 return isummary->inlinable;
2582 /* Increase SIZE, MIN_SIZE (if non-NULL) and TIME for size and time needed to
2583 handle edge E with probability PROB.
2584 Set HINTS if edge may be devirtualized.
2585 KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS describe context of the call
2586 site. */
2588 static inline void
2589 estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *min_size,
2590 sreal *time,
2591 int prob,
2592 vec<tree> known_vals,
2593 vec<ipa_polymorphic_call_context> known_contexts,
2594 vec<ipa_agg_jump_function_p> known_aggs,
2595 ipa_hints *hints)
2597 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
2598 int call_size = es->call_stmt_size;
2599 int call_time = es->call_stmt_time;
2600 int cur_size;
2601 if (!e->callee
2602 && estimate_edge_devirt_benefit (e, &call_size, &call_time,
2603 known_vals, known_contexts, known_aggs)
2604 && hints && e->maybe_hot_p ())
2605 *hints |= INLINE_HINT_indirect_call;
2606 cur_size = call_size * ipa_fn_summary::size_scale;
2607 *size += cur_size;
2608 if (min_size)
2609 *min_size += cur_size;
2610 if (prob == REG_BR_PROB_BASE)
2611 *time += ((sreal)call_time) * e->sreal_frequency ();
2612 else
2613 *time += ((sreal)call_time * prob) * e->sreal_frequency ();
2618 /* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
2619 calls in NODE. POSSIBLE_TRUTHS, KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
2620 describe context of the call site. */
2622 static void
2623 estimate_calls_size_and_time (struct cgraph_node *node, int *size,
2624 int *min_size, sreal *time,
2625 ipa_hints *hints,
2626 clause_t possible_truths,
2627 vec<tree> known_vals,
2628 vec<ipa_polymorphic_call_context> known_contexts,
2629 vec<ipa_agg_jump_function_p> known_aggs)
2631 struct cgraph_edge *e;
2632 for (e = node->callees; e; e = e->next_callee)
2634 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
2636 /* Do not care about zero sized builtins. */
2637 if (e->inline_failed && !es->call_stmt_size)
2639 gcc_checking_assert (!es->call_stmt_time);
2640 continue;
2642 if (!es->predicate
2643 || es->predicate->evaluate (possible_truths))
2645 if (e->inline_failed)
2647 /* Predicates of calls shall not use NOT_CHANGED codes,
2648 sowe do not need to compute probabilities. */
2649 estimate_edge_size_and_time (e, size,
2650 es->predicate ? NULL : min_size,
2651 time, REG_BR_PROB_BASE,
2652 known_vals, known_contexts,
2653 known_aggs, hints);
2655 else
2656 estimate_calls_size_and_time (e->callee, size, min_size, time,
2657 hints,
2658 possible_truths,
2659 known_vals, known_contexts,
2660 known_aggs);
2663 for (e = node->indirect_calls; e; e = e->next_callee)
2665 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
2666 if (!es->predicate
2667 || es->predicate->evaluate (possible_truths))
2668 estimate_edge_size_and_time (e, size,
2669 es->predicate ? NULL : min_size,
2670 time, REG_BR_PROB_BASE,
2671 known_vals, known_contexts, known_aggs,
2672 hints);
2677 /* Estimate size and time needed to execute NODE assuming
2678 POSSIBLE_TRUTHS clause, and KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
2679 information about NODE's arguments. If non-NULL use also probability
2680 information present in INLINE_PARAM_SUMMARY vector.
2681 Additionally detemine hints determined by the context. Finally compute
2682 minimal size needed for the call that is independent on the call context and
2683 can be used for fast estimates. Return the values in RET_SIZE,
2684 RET_MIN_SIZE, RET_TIME and RET_HINTS. */
2686 void
2687 estimate_node_size_and_time (struct cgraph_node *node,
2688 clause_t possible_truths,
2689 clause_t nonspec_possible_truths,
2690 vec<tree> known_vals,
2691 vec<ipa_polymorphic_call_context> known_contexts,
2692 vec<ipa_agg_jump_function_p> known_aggs,
2693 int *ret_size, int *ret_min_size,
2694 sreal *ret_time,
2695 sreal *ret_nonspecialized_time,
2696 ipa_hints *ret_hints,
2697 vec<inline_param_summary>
2698 inline_param_summary)
2700 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
2701 size_time_entry *e;
2702 int size = 0;
2703 sreal time = 0;
2704 int min_size = 0;
2705 ipa_hints hints = 0;
2706 int i;
2708 if (dump_file && (dump_flags & TDF_DETAILS))
2710 bool found = false;
2711 fprintf (dump_file, " Estimating body: %s/%i\n"
2712 " Known to be false: ", node->name (),
2713 node->order);
2715 for (i = predicate::not_inlined_condition;
2716 i < (predicate::first_dynamic_condition
2717 + (int) vec_safe_length (info->conds)); i++)
2718 if (!(possible_truths & (1 << i)))
2720 if (found)
2721 fprintf (dump_file, ", ");
2722 found = true;
2723 dump_condition (dump_file, info->conds, i);
2727 estimate_calls_size_and_time (node, &size, &min_size, &time, &hints, possible_truths,
2728 known_vals, known_contexts, known_aggs);
2729 sreal nonspecialized_time = time;
2731 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
2733 bool exec = e->exec_predicate.evaluate (nonspec_possible_truths);
2735 /* Because predicates are conservative, it can happen that nonconst is 1
2736 but exec is 0. */
2737 if (exec)
2739 bool nonconst = e->nonconst_predicate.evaluate (possible_truths);
2741 gcc_checking_assert (e->time >= 0);
2742 gcc_checking_assert (time >= 0);
2744 /* We compute specialized size only because size of nonspecialized
2745 copy is context independent.
2747 The difference between nonspecialized execution and specialized is
2748 that nonspecialized is not going to have optimized out computations
2749 known to be constant in a specialized setting. */
2750 if (nonconst)
2751 size += e->size;
2752 nonspecialized_time += e->time;
2753 if (!nonconst)
2755 else if (!inline_param_summary.exists ())
2757 if (nonconst)
2758 time += e->time;
2760 else
2762 int prob = e->nonconst_predicate.probability
2763 (info->conds, possible_truths,
2764 inline_param_summary);
2765 gcc_checking_assert (prob >= 0);
2766 gcc_checking_assert (prob <= REG_BR_PROB_BASE);
2767 time += e->time * prob / REG_BR_PROB_BASE;
2769 gcc_checking_assert (time >= 0);
2772 gcc_checking_assert ((*info->size_time_table)[0].exec_predicate == true);
2773 gcc_checking_assert ((*info->size_time_table)[0].nonconst_predicate == true);
2774 min_size = (*info->size_time_table)[0].size;
2775 gcc_checking_assert (size >= 0);
2776 gcc_checking_assert (time >= 0);
2777 /* nonspecialized_time should be always bigger than specialized time.
2778 Roundoff issues however may get into the way. */
2779 gcc_checking_assert ((nonspecialized_time - time * 0.99) >= -1);
2781 /* Roundoff issues may make specialized time bigger than nonspecialized
2782 time. We do not really want that to happen because some heurstics
2783 may get confused by seeing negative speedups. */
2784 if (time > nonspecialized_time)
2785 time = nonspecialized_time;
2787 if (info->loop_iterations
2788 && !info->loop_iterations->evaluate (possible_truths))
2789 hints |= INLINE_HINT_loop_iterations;
2790 if (info->loop_stride
2791 && !info->loop_stride->evaluate (possible_truths))
2792 hints |= INLINE_HINT_loop_stride;
2793 if (info->array_index
2794 && !info->array_index->evaluate (possible_truths))
2795 hints |= INLINE_HINT_array_index;
2796 if (info->scc_no)
2797 hints |= INLINE_HINT_in_scc;
2798 if (DECL_DECLARED_INLINE_P (node->decl))
2799 hints |= INLINE_HINT_declared_inline;
2801 size = RDIV (size, ipa_fn_summary::size_scale);
2802 min_size = RDIV (min_size, ipa_fn_summary::size_scale);
2804 if (dump_file && (dump_flags & TDF_DETAILS))
2805 fprintf (dump_file, "\n size:%i time:%f nonspec time:%f\n", (int) size,
2806 time.to_double (), nonspecialized_time.to_double ());
2807 if (ret_time)
2808 *ret_time = time;
2809 if (ret_nonspecialized_time)
2810 *ret_nonspecialized_time = nonspecialized_time;
2811 if (ret_size)
2812 *ret_size = size;
2813 if (ret_min_size)
2814 *ret_min_size = min_size;
2815 if (ret_hints)
2816 *ret_hints = hints;
2817 return;
2821 /* Estimate size and time needed to execute callee of EDGE assuming that
2822 parameters known to be constant at caller of EDGE are propagated.
2823 KNOWN_VALS and KNOWN_CONTEXTS are vectors of assumed known constant values
2824 and types for parameters. */
2826 void
2827 estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
2828 vec<tree> known_vals,
2829 vec<ipa_polymorphic_call_context>
2830 known_contexts,
2831 vec<ipa_agg_jump_function_p> known_aggs,
2832 int *ret_size, sreal *ret_time,
2833 sreal *ret_nonspec_time,
2834 ipa_hints *hints)
2836 clause_t clause, nonspec_clause;
2838 evaluate_conditions_for_known_args (node, false, known_vals, known_aggs,
2839 &clause, &nonspec_clause);
2840 estimate_node_size_and_time (node, clause, nonspec_clause,
2841 known_vals, known_contexts,
2842 known_aggs, ret_size, NULL, ret_time,
2843 ret_nonspec_time, hints, vNULL);
2847 /* Update summary information of inline clones after inlining.
2848 Compute peak stack usage. */
2850 static void
2851 inline_update_callee_summaries (struct cgraph_node *node, int depth)
2853 struct cgraph_edge *e;
2854 ipa_fn_summary *callee_info = ipa_fn_summaries->get_create (node);
2855 ipa_fn_summary *caller_info
2856 = ipa_fn_summaries->get_create (node->callers->caller);
2857 HOST_WIDE_INT peak;
2859 callee_info->stack_frame_offset
2860 = caller_info->stack_frame_offset
2861 + caller_info->estimated_self_stack_size;
2862 peak = callee_info->stack_frame_offset
2863 + callee_info->estimated_self_stack_size;
2865 ipa_fn_summary *s = ipa_fn_summaries->get_create (node->global.inlined_to);
2866 if (s->estimated_stack_size < peak)
2867 s->estimated_stack_size = peak;
2868 ipa_propagate_frequency (node);
2869 for (e = node->callees; e; e = e->next_callee)
2871 if (!e->inline_failed)
2872 inline_update_callee_summaries (e->callee, depth);
2873 ipa_call_summaries->get_create (e)->loop_depth += depth;
2875 for (e = node->indirect_calls; e; e = e->next_callee)
2876 ipa_call_summaries->get_create (e)->loop_depth += depth;
2879 /* Update change_prob of EDGE after INLINED_EDGE has been inlined.
2880 When functoin A is inlined in B and A calls C with parameter that
2881 changes with probability PROB1 and C is known to be passthroug
2882 of argument if B that change with probability PROB2, the probability
2883 of change is now PROB1*PROB2. */
2885 static void
2886 remap_edge_change_prob (struct cgraph_edge *inlined_edge,
2887 struct cgraph_edge *edge)
2889 if (ipa_node_params_sum)
2891 int i;
2892 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2893 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
2894 struct ipa_call_summary *inlined_es
2895 = ipa_call_summaries->get_create (inlined_edge);
2897 for (i = 0; i < ipa_get_cs_argument_count (args); i++)
2899 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2900 if (jfunc->type == IPA_JF_PASS_THROUGH
2901 || jfunc->type == IPA_JF_ANCESTOR)
2903 int id = jfunc->type == IPA_JF_PASS_THROUGH
2904 ? ipa_get_jf_pass_through_formal_id (jfunc)
2905 : ipa_get_jf_ancestor_formal_id (jfunc);
2906 if (id < (int) inlined_es->param.length ())
2908 int prob1 = es->param[i].change_prob;
2909 int prob2 = inlined_es->param[id].change_prob;
2910 int prob = combine_probabilities (prob1, prob2);
2912 if (prob1 && prob2 && !prob)
2913 prob = 1;
2915 es->param[i].change_prob = prob;
2922 /* Update edge summaries of NODE after INLINED_EDGE has been inlined.
2924 Remap predicates of callees of NODE. Rest of arguments match
2925 remap_predicate.
2927 Also update change probabilities. */
2929 static void
2930 remap_edge_summaries (struct cgraph_edge *inlined_edge,
2931 struct cgraph_node *node,
2932 struct ipa_fn_summary *info,
2933 struct ipa_fn_summary *callee_info,
2934 vec<int> operand_map,
2935 vec<int> offset_map,
2936 clause_t possible_truths,
2937 predicate *toplev_predicate)
2939 struct cgraph_edge *e, *next;
2940 for (e = node->callees; e; e = next)
2942 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
2943 predicate p;
2944 next = e->next_callee;
2946 if (e->inline_failed)
2948 remap_edge_change_prob (inlined_edge, e);
2950 if (es->predicate)
2952 p = es->predicate->remap_after_inlining
2953 (info, callee_info, operand_map,
2954 offset_map, possible_truths,
2955 *toplev_predicate);
2956 edge_set_predicate (e, &p);
2958 else
2959 edge_set_predicate (e, toplev_predicate);
2961 else
2962 remap_edge_summaries (inlined_edge, e->callee, info, callee_info,
2963 operand_map, offset_map, possible_truths,
2964 toplev_predicate);
2966 for (e = node->indirect_calls; e; e = next)
2968 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
2969 predicate p;
2970 next = e->next_callee;
2972 remap_edge_change_prob (inlined_edge, e);
2973 if (es->predicate)
2975 p = es->predicate->remap_after_inlining
2976 (info, callee_info, operand_map, offset_map,
2977 possible_truths, *toplev_predicate);
2978 edge_set_predicate (e, &p);
2980 else
2981 edge_set_predicate (e, toplev_predicate);
2985 /* Same as remap_predicate, but set result into hint *HINT. */
2987 static void
2988 remap_hint_predicate (struct ipa_fn_summary *info,
2989 struct ipa_fn_summary *callee_info,
2990 predicate **hint,
2991 vec<int> operand_map,
2992 vec<int> offset_map,
2993 clause_t possible_truths,
2994 predicate *toplev_predicate)
2996 predicate p;
2998 if (!*hint)
2999 return;
3000 p = (*hint)->remap_after_inlining
3001 (info, callee_info,
3002 operand_map, offset_map,
3003 possible_truths, *toplev_predicate);
3004 if (p != false && p != true)
3006 if (!*hint)
3007 set_hint_predicate (hint, p);
3008 else
3009 **hint &= p;
3013 /* We inlined EDGE. Update summary of the function we inlined into. */
3015 void
3016 ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
3018 ipa_fn_summary *callee_info = ipa_fn_summaries->get_create (edge->callee);
3019 struct cgraph_node *to = (edge->caller->global.inlined_to
3020 ? edge->caller->global.inlined_to : edge->caller);
3021 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (to);
3022 clause_t clause = 0; /* not_inline is known to be false. */
3023 size_time_entry *e;
3024 vec<int> operand_map = vNULL;
3025 vec<int> offset_map = vNULL;
3026 int i;
3027 predicate toplev_predicate;
3028 predicate true_p = true;
3029 struct ipa_call_summary *es = ipa_call_summaries->get_create (edge);
3031 if (es->predicate)
3032 toplev_predicate = *es->predicate;
3033 else
3034 toplev_predicate = true;
3036 info->fp_expressions |= callee_info->fp_expressions;
3038 if (callee_info->conds)
3039 evaluate_properties_for_edge (edge, true, &clause, NULL, NULL, NULL, NULL);
3040 if (ipa_node_params_sum && callee_info->conds)
3042 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
3043 int count = ipa_get_cs_argument_count (args);
3044 int i;
3046 if (count)
3048 operand_map.safe_grow_cleared (count);
3049 offset_map.safe_grow_cleared (count);
3051 for (i = 0; i < count; i++)
3053 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
3054 int map = -1;
3056 /* TODO: handle non-NOPs when merging. */
3057 if (jfunc->type == IPA_JF_PASS_THROUGH)
3059 if (ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
3060 map = ipa_get_jf_pass_through_formal_id (jfunc);
3061 if (!ipa_get_jf_pass_through_agg_preserved (jfunc))
3062 offset_map[i] = -1;
3064 else if (jfunc->type == IPA_JF_ANCESTOR)
3066 HOST_WIDE_INT offset = ipa_get_jf_ancestor_offset (jfunc);
3067 if (offset >= 0 && offset < INT_MAX)
3069 map = ipa_get_jf_ancestor_formal_id (jfunc);
3070 if (!ipa_get_jf_ancestor_agg_preserved (jfunc))
3071 offset = -1;
3072 offset_map[i] = offset;
3075 operand_map[i] = map;
3076 gcc_assert (map < ipa_get_param_count (IPA_NODE_REF (to)));
3079 for (i = 0; vec_safe_iterate (callee_info->size_time_table, i, &e); i++)
3081 predicate p;
3082 p = e->exec_predicate.remap_after_inlining
3083 (info, callee_info, operand_map,
3084 offset_map, clause,
3085 toplev_predicate);
3086 predicate nonconstp;
3087 nonconstp = e->nonconst_predicate.remap_after_inlining
3088 (info, callee_info, operand_map,
3089 offset_map, clause,
3090 toplev_predicate);
3091 if (p != false && nonconstp != false)
3093 sreal add_time = ((sreal)e->time * edge->sreal_frequency ());
3094 int prob = e->nonconst_predicate.probability (callee_info->conds,
3095 clause, es->param);
3096 add_time = add_time * prob / REG_BR_PROB_BASE;
3097 if (prob != REG_BR_PROB_BASE
3098 && dump_file && (dump_flags & TDF_DETAILS))
3100 fprintf (dump_file, "\t\tScaling time by probability:%f\n",
3101 (double) prob / REG_BR_PROB_BASE);
3103 info->account_size_time (e->size, add_time, p, nonconstp);
3106 remap_edge_summaries (edge, edge->callee, info, callee_info, operand_map,
3107 offset_map, clause, &toplev_predicate);
3108 remap_hint_predicate (info, callee_info,
3109 &callee_info->loop_iterations,
3110 operand_map, offset_map, clause, &toplev_predicate);
3111 remap_hint_predicate (info, callee_info,
3112 &callee_info->loop_stride,
3113 operand_map, offset_map, clause, &toplev_predicate);
3114 remap_hint_predicate (info, callee_info,
3115 &callee_info->array_index,
3116 operand_map, offset_map, clause, &toplev_predicate);
3118 ipa_call_summary *s = ipa_call_summaries->get_create (edge);
3119 inline_update_callee_summaries (edge->callee, s->loop_depth);
3121 /* We do not maintain predicates of inlined edges, free it. */
3122 edge_set_predicate (edge, &true_p);
3123 /* Similarly remove param summaries. */
3124 es->param.release ();
3125 operand_map.release ();
3126 offset_map.release ();
3129 /* For performance reasons ipa_merge_fn_summary_after_inlining is not updating overall size
3130 and time. Recompute it. */
3132 void
3133 ipa_update_overall_fn_summary (struct cgraph_node *node)
3135 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
3136 size_time_entry *e;
3137 int i;
3139 info->size = 0;
3140 info->time = 0;
3141 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3143 info->size += e->size;
3144 info->time += e->time;
3146 estimate_calls_size_and_time (node, &info->size, &info->min_size,
3147 &info->time, NULL,
3148 ~(clause_t) (1 << predicate::false_condition),
3149 vNULL, vNULL, vNULL);
3150 info->size = (info->size + ipa_fn_summary::size_scale / 2) / ipa_fn_summary::size_scale;
3154 /* This function performs intraprocedural analysis in NODE that is required to
3155 inline indirect calls. */
3157 static void
3158 inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
3160 ipa_analyze_node (node);
3161 if (dump_file && (dump_flags & TDF_DETAILS))
3163 ipa_print_node_params (dump_file, node);
3164 ipa_print_node_jump_functions (dump_file, node);
3169 /* Note function body size. */
3171 void
3172 inline_analyze_function (struct cgraph_node *node)
3174 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
3176 if (dump_file)
3177 fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
3178 node->name (), node->order);
3179 if (opt_for_fn (node->decl, optimize) && !node->thunk.thunk_p)
3180 inline_indirect_intraprocedural_analysis (node);
3181 compute_fn_summary (node, false);
3182 if (!optimize)
3184 struct cgraph_edge *e;
3185 for (e = node->callees; e; e = e->next_callee)
3186 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
3187 for (e = node->indirect_calls; e; e = e->next_callee)
3188 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
3191 pop_cfun ();
3195 /* Called when new function is inserted to callgraph late. */
3197 void
3198 ipa_fn_summary_t::insert (struct cgraph_node *node, ipa_fn_summary *)
3200 inline_analyze_function (node);
3203 /* Note function body size. */
3205 static void
3206 ipa_fn_summary_generate (void)
3208 struct cgraph_node *node;
3210 FOR_EACH_DEFINED_FUNCTION (node)
3211 if (DECL_STRUCT_FUNCTION (node->decl))
3212 node->local.versionable = tree_versionable_function_p (node->decl);
3214 ipa_fn_summary_alloc ();
3216 ipa_fn_summaries->enable_insertion_hook ();
3218 ipa_register_cgraph_hooks ();
3220 FOR_EACH_DEFINED_FUNCTION (node)
3221 if (!node->alias
3222 && (flag_generate_lto || flag_generate_offload|| flag_wpa
3223 || opt_for_fn (node->decl, optimize)))
3224 inline_analyze_function (node);
3228 /* Write inline summary for edge E to OB. */
3230 static void
3231 read_ipa_call_summary (struct lto_input_block *ib, struct cgraph_edge *e)
3233 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
3234 predicate p;
3235 int length, i;
3237 es->call_stmt_size = streamer_read_uhwi (ib);
3238 es->call_stmt_time = streamer_read_uhwi (ib);
3239 es->loop_depth = streamer_read_uhwi (ib);
3241 bitpack_d bp = streamer_read_bitpack (ib);
3242 es->is_return_callee_uncaptured = bp_unpack_value (&bp, 1);
3244 p.stream_in (ib);
3245 edge_set_predicate (e, &p);
3246 length = streamer_read_uhwi (ib);
3247 if (length)
3249 es->param.safe_grow_cleared (length);
3250 for (i = 0; i < length; i++)
3251 es->param[i].change_prob = streamer_read_uhwi (ib);
3256 /* Stream in inline summaries from the section. */
3258 static void
3259 inline_read_section (struct lto_file_decl_data *file_data, const char *data,
3260 size_t len)
3262 const struct lto_function_header *header =
3263 (const struct lto_function_header *) data;
3264 const int cfg_offset = sizeof (struct lto_function_header);
3265 const int main_offset = cfg_offset + header->cfg_size;
3266 const int string_offset = main_offset + header->main_size;
3267 struct data_in *data_in;
3268 unsigned int i, count2, j;
3269 unsigned int f_count;
3271 lto_input_block ib ((const char *) data + main_offset, header->main_size,
3272 file_data->mode_table);
3274 data_in =
3275 lto_data_in_create (file_data, (const char *) data + string_offset,
3276 header->string_size, vNULL);
3277 f_count = streamer_read_uhwi (&ib);
3278 for (i = 0; i < f_count; i++)
3280 unsigned int index;
3281 struct cgraph_node *node;
3282 struct ipa_fn_summary *info;
3283 lto_symtab_encoder_t encoder;
3284 struct bitpack_d bp;
3285 struct cgraph_edge *e;
3286 predicate p;
3288 index = streamer_read_uhwi (&ib);
3289 encoder = file_data->symtab_node_encoder;
3290 node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
3291 index));
3292 info = ipa_fn_summaries->get_create (node);
3294 info->estimated_stack_size
3295 = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
3296 info->size = info->self_size = streamer_read_uhwi (&ib);
3297 info->time = sreal::stream_in (&ib);
3299 bp = streamer_read_bitpack (&ib);
3300 info->inlinable = bp_unpack_value (&bp, 1);
3301 info->fp_expressions = bp_unpack_value (&bp, 1);
3303 count2 = streamer_read_uhwi (&ib);
3304 gcc_assert (!info->conds);
3305 for (j = 0; j < count2; j++)
3307 struct condition c;
3308 c.operand_num = streamer_read_uhwi (&ib);
3309 c.size = streamer_read_uhwi (&ib);
3310 c.code = (enum tree_code) streamer_read_uhwi (&ib);
3311 c.val = stream_read_tree (&ib, data_in);
3312 bp = streamer_read_bitpack (&ib);
3313 c.agg_contents = bp_unpack_value (&bp, 1);
3314 c.by_ref = bp_unpack_value (&bp, 1);
3315 if (c.agg_contents)
3316 c.offset = streamer_read_uhwi (&ib);
3317 vec_safe_push (info->conds, c);
3319 count2 = streamer_read_uhwi (&ib);
3320 gcc_assert (!info->size_time_table);
3321 for (j = 0; j < count2; j++)
3323 struct size_time_entry e;
3325 e.size = streamer_read_uhwi (&ib);
3326 e.time = sreal::stream_in (&ib);
3327 e.exec_predicate.stream_in (&ib);
3328 e.nonconst_predicate.stream_in (&ib);
3330 vec_safe_push (info->size_time_table, e);
3333 p.stream_in (&ib);
3334 set_hint_predicate (&info->loop_iterations, p);
3335 p.stream_in (&ib);
3336 set_hint_predicate (&info->loop_stride, p);
3337 p.stream_in (&ib);
3338 set_hint_predicate (&info->array_index, p);
3339 for (e = node->callees; e; e = e->next_callee)
3340 read_ipa_call_summary (&ib, e);
3341 for (e = node->indirect_calls; e; e = e->next_callee)
3342 read_ipa_call_summary (&ib, e);
3345 lto_free_section_data (file_data, LTO_section_ipa_fn_summary, NULL, data,
3346 len);
3347 lto_data_in_delete (data_in);
3351 /* Read inline summary. Jump functions are shared among ipa-cp
3352 and inliner, so when ipa-cp is active, we don't need to write them
3353 twice. */
3355 static void
3356 ipa_fn_summary_read (void)
3358 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
3359 struct lto_file_decl_data *file_data;
3360 unsigned int j = 0;
3362 ipa_fn_summary_alloc ();
3364 while ((file_data = file_data_vec[j++]))
3366 size_t len;
3367 const char *data = lto_get_section_data (file_data,
3368 LTO_section_ipa_fn_summary,
3369 NULL, &len);
3370 if (data)
3371 inline_read_section (file_data, data, len);
3372 else
3373 /* Fatal error here. We do not want to support compiling ltrans units
3374 with different version of compiler or different flags than the WPA
3375 unit, so this should never happen. */
3376 fatal_error (input_location,
3377 "ipa inline summary is missing in input file");
3379 ipa_register_cgraph_hooks ();
3380 if (!flag_ipa_cp)
3381 ipa_prop_read_jump_functions ();
3383 gcc_assert (ipa_fn_summaries);
3384 ipa_fn_summaries->enable_insertion_hook ();
3388 /* Write inline summary for edge E to OB. */
3390 static void
3391 write_ipa_call_summary (struct output_block *ob, struct cgraph_edge *e)
3393 struct ipa_call_summary *es = ipa_call_summaries->get_create (e);
3394 int i;
3396 streamer_write_uhwi (ob, es->call_stmt_size);
3397 streamer_write_uhwi (ob, es->call_stmt_time);
3398 streamer_write_uhwi (ob, es->loop_depth);
3400 bitpack_d bp = bitpack_create (ob->main_stream);
3401 bp_pack_value (&bp, es->is_return_callee_uncaptured, 1);
3402 streamer_write_bitpack (&bp);
3404 if (es->predicate)
3405 es->predicate->stream_out (ob);
3406 else
3407 streamer_write_uhwi (ob, 0);
3408 streamer_write_uhwi (ob, es->param.length ());
3409 for (i = 0; i < (int) es->param.length (); i++)
3410 streamer_write_uhwi (ob, es->param[i].change_prob);
3414 /* Write inline summary for node in SET.
3415 Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
3416 active, we don't need to write them twice. */
3418 static void
3419 ipa_fn_summary_write (void)
3421 struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
3422 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
3423 unsigned int count = 0;
3424 int i;
3426 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
3428 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
3429 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
3430 if (cnode && cnode->definition && !cnode->alias)
3431 count++;
3433 streamer_write_uhwi (ob, count);
3435 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
3437 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
3438 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
3439 if (cnode && cnode->definition && !cnode->alias)
3441 struct ipa_fn_summary *info = ipa_fn_summaries->get_create (cnode);
3442 struct bitpack_d bp;
3443 struct cgraph_edge *edge;
3444 int i;
3445 size_time_entry *e;
3446 struct condition *c;
3448 streamer_write_uhwi (ob, lto_symtab_encoder_encode (encoder, cnode));
3449 streamer_write_hwi (ob, info->estimated_self_stack_size);
3450 streamer_write_hwi (ob, info->self_size);
3451 info->time.stream_out (ob);
3452 bp = bitpack_create (ob->main_stream);
3453 bp_pack_value (&bp, info->inlinable, 1);
3454 bp_pack_value (&bp, false, 1);
3455 bp_pack_value (&bp, info->fp_expressions, 1);
3456 streamer_write_bitpack (&bp);
3457 streamer_write_uhwi (ob, vec_safe_length (info->conds));
3458 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
3460 streamer_write_uhwi (ob, c->operand_num);
3461 streamer_write_uhwi (ob, c->size);
3462 streamer_write_uhwi (ob, c->code);
3463 stream_write_tree (ob, c->val, true);
3464 bp = bitpack_create (ob->main_stream);
3465 bp_pack_value (&bp, c->agg_contents, 1);
3466 bp_pack_value (&bp, c->by_ref, 1);
3467 streamer_write_bitpack (&bp);
3468 if (c->agg_contents)
3469 streamer_write_uhwi (ob, c->offset);
3471 streamer_write_uhwi (ob, vec_safe_length (info->size_time_table));
3472 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3474 streamer_write_uhwi (ob, e->size);
3475 e->time.stream_out (ob);
3476 e->exec_predicate.stream_out (ob);
3477 e->nonconst_predicate.stream_out (ob);
3479 if (info->loop_iterations)
3480 info->loop_iterations->stream_out (ob);
3481 else
3482 streamer_write_uhwi (ob, 0);
3483 if (info->loop_stride)
3484 info->loop_stride->stream_out (ob);
3485 else
3486 streamer_write_uhwi (ob, 0);
3487 if (info->array_index)
3488 info->array_index->stream_out (ob);
3489 else
3490 streamer_write_uhwi (ob, 0);
3491 for (edge = cnode->callees; edge; edge = edge->next_callee)
3492 write_ipa_call_summary (ob, edge);
3493 for (edge = cnode->indirect_calls; edge; edge = edge->next_callee)
3494 write_ipa_call_summary (ob, edge);
3497 streamer_write_char_stream (ob->main_stream, 0);
3498 produce_asm (ob, NULL);
3499 destroy_output_block (ob);
3501 if (!flag_ipa_cp)
3502 ipa_prop_write_jump_functions ();
3506 /* Release inline summary. */
3508 void
3509 ipa_free_fn_summary (void)
3511 struct cgraph_node *node;
3512 if (!ipa_call_summaries)
3513 return;
3514 FOR_EACH_DEFINED_FUNCTION (node)
3515 if (!node->alias)
3516 ipa_fn_summaries->get_create (node)->reset (node);
3517 ipa_fn_summaries->release ();
3518 ipa_fn_summaries = NULL;
3519 ipa_call_summaries->release ();
3520 delete ipa_call_summaries;
3521 ipa_call_summaries = NULL;
3522 edge_predicate_pool.release ();
3525 namespace {
3527 const pass_data pass_data_local_fn_summary =
3529 GIMPLE_PASS, /* type */
3530 "local-fnsummary", /* name */
3531 OPTGROUP_INLINE, /* optinfo_flags */
3532 TV_INLINE_PARAMETERS, /* tv_id */
3533 0, /* properties_required */
3534 0, /* properties_provided */
3535 0, /* properties_destroyed */
3536 0, /* todo_flags_start */
3537 0, /* todo_flags_finish */
3540 class pass_local_fn_summary : public gimple_opt_pass
3542 public:
3543 pass_local_fn_summary (gcc::context *ctxt)
3544 : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
3547 /* opt_pass methods: */
3548 opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
3549 virtual unsigned int execute (function *)
3551 return compute_fn_summary_for_current ();
3554 }; // class pass_local_fn_summary
3556 } // anon namespace
3558 gimple_opt_pass *
3559 make_pass_local_fn_summary (gcc::context *ctxt)
3561 return new pass_local_fn_summary (ctxt);
3565 /* Free inline summary. */
3567 namespace {
3569 const pass_data pass_data_ipa_free_fn_summary =
3571 SIMPLE_IPA_PASS, /* type */
3572 "free-fnsummary", /* name */
3573 OPTGROUP_NONE, /* optinfo_flags */
3574 TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
3575 0, /* properties_required */
3576 0, /* properties_provided */
3577 0, /* properties_destroyed */
3578 0, /* todo_flags_start */
3579 0, /* todo_flags_finish */
3582 class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
3584 public:
3585 pass_ipa_free_fn_summary (gcc::context *ctxt)
3586 : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt),
3587 small_p (false)
3590 /* opt_pass methods: */
3591 opt_pass *clone () { return new pass_ipa_free_fn_summary (m_ctxt); }
3592 void set_pass_param (unsigned int n, bool param)
3594 gcc_assert (n == 0);
3595 small_p = param;
3597 virtual bool gate (function *) { return small_p || !flag_wpa; }
3598 virtual unsigned int execute (function *)
3600 ipa_free_fn_summary ();
3601 /* Early optimizations may make function unreachable. We can not
3602 remove unreachable functions as part of the early opts pass because
3603 TODOs are run before subpasses. Do it here. */
3604 return small_p ? TODO_remove_functions | TODO_dump_symtab : 0;
3607 private:
3608 bool small_p;
3609 }; // class pass_ipa_free_fn_summary
3611 } // anon namespace
3613 simple_ipa_opt_pass *
3614 make_pass_ipa_free_fn_summary (gcc::context *ctxt)
3616 return new pass_ipa_free_fn_summary (ctxt);
3619 namespace {
3621 const pass_data pass_data_ipa_fn_summary =
3623 IPA_PASS, /* type */
3624 "fnsummary", /* name */
3625 OPTGROUP_INLINE, /* optinfo_flags */
3626 TV_IPA_FNSUMMARY, /* tv_id */
3627 0, /* properties_required */
3628 0, /* properties_provided */
3629 0, /* properties_destroyed */
3630 0, /* todo_flags_start */
3631 ( TODO_dump_symtab ), /* todo_flags_finish */
3634 class pass_ipa_fn_summary : public ipa_opt_pass_d
3636 public:
3637 pass_ipa_fn_summary (gcc::context *ctxt)
3638 : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
3639 ipa_fn_summary_generate, /* generate_summary */
3640 ipa_fn_summary_write, /* write_summary */
3641 ipa_fn_summary_read, /* read_summary */
3642 NULL, /* write_optimization_summary */
3643 NULL, /* read_optimization_summary */
3644 NULL, /* stmt_fixup */
3645 0, /* function_transform_todo_flags_start */
3646 NULL, /* function_transform */
3647 NULL) /* variable_transform */
3650 /* opt_pass methods: */
3651 virtual unsigned int execute (function *) { return 0; }
3653 }; // class pass_ipa_fn_summary
3655 } // anon namespace
3657 ipa_opt_pass_d *
3658 make_pass_ipa_fn_summary (gcc::context *ctxt)
3660 return new pass_ipa_fn_summary (ctxt);
3663 /* Reset all state within ipa-fnsummary.c so that we can rerun the compiler
3664 within the same process. For use by toplev::finalize. */
3666 void
3667 ipa_fnsummary_c_finalize (void)
3669 ipa_free_fn_summary ();