1 /* Function summary pass.
2 Copyright (C) 2003-2025 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
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
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
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),
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. */
55 #define INCLUDE_VECTOR
57 #include "coretypes.h"
62 #include "alloc-pool.h"
63 #include "tree-pass.h"
65 #include "tree-streamer.h"
67 #include "diagnostic.h"
68 #include "fold-const.h"
69 #include "print-tree.h"
70 #include "tree-inline.h"
71 #include "gimple-pretty-print.h"
73 #include "gimple-iterator.h"
75 #include "tree-ssa-loop-niter.h"
76 #include "tree-ssa-loop.h"
77 #include "symbol-summary.h"
81 #include "ipa-fnsummary.h"
83 #include "tree-scalar-evolution.h"
84 #include "ipa-utils.h"
85 #include "cfgexpand.h"
87 #include "stringpool.h"
89 #include "tree-into-ssa.h"
90 #include "symtab-clones.h"
91 #include "gimple-range.h"
95 fast_function_summary
<ipa_fn_summary
*, va_gc
> *ipa_fn_summaries
;
96 fast_function_summary
<ipa_size_summary
*, va_heap
> *ipa_size_summaries
;
97 fast_call_summary
<ipa_call_summary
*, va_heap
> *ipa_call_summaries
;
99 /* Edge predicates goes here. */
100 static object_allocator
<ipa_predicate
> edge_predicate_pool ("edge predicates");
103 /* Dump IPA hints. */
105 ipa_dump_hints (FILE *f
, ipa_hints hints
)
109 fprintf (f
, "IPA hints:");
110 if (hints
& INLINE_HINT_indirect_call
)
112 hints
&= ~INLINE_HINT_indirect_call
;
113 fprintf (f
, " indirect_call");
115 if (hints
& INLINE_HINT_loop_iterations
)
117 hints
&= ~INLINE_HINT_loop_iterations
;
118 fprintf (f
, " loop_iterations");
120 if (hints
& INLINE_HINT_loop_stride
)
122 hints
&= ~INLINE_HINT_loop_stride
;
123 fprintf (f
, " loop_stride");
125 if (hints
& INLINE_HINT_same_scc
)
127 hints
&= ~INLINE_HINT_same_scc
;
128 fprintf (f
, " same_scc");
130 if (hints
& INLINE_HINT_in_scc
)
132 hints
&= ~INLINE_HINT_in_scc
;
133 fprintf (f
, " in_scc");
135 if (hints
& INLINE_HINT_cross_module
)
137 hints
&= ~INLINE_HINT_cross_module
;
138 fprintf (f
, " cross_module");
140 if (hints
& INLINE_HINT_declared_inline
)
142 hints
&= ~INLINE_HINT_declared_inline
;
143 fprintf (f
, " declared_inline");
145 if (hints
& INLINE_HINT_known_hot
)
147 hints
&= ~INLINE_HINT_known_hot
;
148 fprintf (f
, " known_hot");
150 if (hints
& INLINE_HINT_builtin_constant_p
)
152 hints
&= ~INLINE_HINT_builtin_constant_p
;
153 fprintf (f
, " builtin_constant_p");
159 /* Record SIZE and TIME to SUMMARY.
160 The accounted code will be executed when EXEC_PRED is true.
161 When NONCONST_PRED is false the code will evaluate to constant and
162 will get optimized out in specialized clones of the function.
163 If CALL is true account to call_size_time_table rather than
167 ipa_fn_summary::account_size_time (int size
, sreal time
,
168 const ipa_predicate
&exec_pred
,
169 const ipa_predicate
&nonconst_pred_in
,
175 ipa_predicate nonconst_pred
;
176 vec
<size_time_entry
> *table
= call
? &call_size_time_table
: &size_time_table
;
178 if (exec_pred
== false)
181 nonconst_pred
= nonconst_pred_in
& exec_pred
;
183 if (nonconst_pred
== false)
186 /* We need to create initial empty unconditional clause, but otherwise
187 we don't need to account empty times and sizes. */
188 if (!size
&& time
== 0 && table
->length ())
191 /* Only for calls we are unaccounting what we previously recorded. */
192 gcc_checking_assert (time
>= 0 || call
);
194 for (i
= 0; table
->iterate (i
, &e
); i
++)
195 if (e
->exec_predicate
== exec_pred
196 && e
->nonconst_predicate
== nonconst_pred
)
201 if (i
== max_size_time_table_size
)
206 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
208 "\t\tReached limit on number of entries, "
209 "ignoring the predicate.");
211 if (dump_file
&& (dump_flags
& TDF_DETAILS
) && (time
!= 0 || size
))
214 "\t\tAccounting size:%3.2f, time:%3.2f on %spredicate exec:",
215 ((double) size
) / ipa_fn_summary::size_scale
,
216 (time
.to_double ()), found
? "" : "new ");
217 exec_pred
.dump (dump_file
, conds
, 0);
218 if (exec_pred
!= nonconst_pred
)
220 fprintf (dump_file
, " nonconst:");
221 nonconst_pred
.dump (dump_file
, conds
);
224 fprintf (dump_file
, "\n");
228 class size_time_entry new_entry
;
229 new_entry
.size
= size
;
230 new_entry
.time
= time
;
231 new_entry
.exec_predicate
= exec_pred
;
232 new_entry
.nonconst_predicate
= nonconst_pred
;
234 call_size_time_table
.safe_push (new_entry
);
236 size_time_table
.safe_push (new_entry
);
242 /* FIXME: PR bootstrap/92653 gcc_checking_assert (e->time >= -1); */
243 /* Tolerate small roundoff issues. */
249 /* We proved E to be unreachable, redirect it to __builtin_unreachable. */
251 static struct cgraph_edge
*
252 redirect_to_unreachable (struct cgraph_edge
*e
)
254 struct cgraph_node
*callee
= !e
->inline_failed
? e
->callee
: NULL
;
255 struct cgraph_node
*target
256 = cgraph_node::get_create (builtin_decl_unreachable ());
259 e
= cgraph_edge::resolve_speculation (e
, target
->decl
);
261 e
= cgraph_edge::make_direct (e
, target
);
263 e
->redirect_callee (target
);
264 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
265 e
->inline_failed
= CIF_UNREACHABLE
;
266 e
->count
= profile_count::zero ();
267 es
->call_stmt_size
= 0;
268 es
->call_stmt_time
= 0;
270 callee
->remove_symbol_and_inline_clones ();
274 /* Set predicate for edge E. */
277 edge_set_predicate (struct cgraph_edge
*e
, ipa_predicate
*predicate
)
279 /* If the edge is determined to be never executed, redirect it
280 to BUILTIN_UNREACHABLE to make it clear to IPA passes the call will
282 if (predicate
&& *predicate
== false
283 /* When handling speculative edges, we need to do the redirection
284 just once. Do it always on the direct edge, so we do not
285 attempt to resolve speculation while duplicating the edge. */
286 && (!e
->speculative
|| e
->callee
))
287 e
= redirect_to_unreachable (e
);
289 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
290 if (predicate
&& *predicate
!= true)
293 es
->predicate
= edge_predicate_pool
.allocate ();
294 *es
->predicate
= *predicate
;
299 edge_predicate_pool
.remove (es
->predicate
);
300 es
->predicate
= NULL
;
304 /* Set predicate for hint *P. */
307 set_hint_predicate (ipa_predicate
**p
, ipa_predicate new_predicate
)
309 if (new_predicate
== false || new_predicate
== true)
312 edge_predicate_pool
.remove (*p
);
318 *p
= edge_predicate_pool
.allocate ();
323 /* Find if NEW_PREDICATE is already in V and if so, increment its freq.
324 Otherwise add a new item to the vector with this predicate and frerq equal
325 to add_freq, unless the number of predicates would exceed MAX_NUM_PREDICATES
326 in which case the function does nothing. */
329 add_freqcounting_predicate (vec
<ipa_freqcounting_predicate
, va_gc
> **v
,
330 const ipa_predicate
&new_predicate
, sreal add_freq
,
331 unsigned max_num_predicates
)
333 if (new_predicate
== false || new_predicate
== true)
335 ipa_freqcounting_predicate
*f
;
336 for (int i
= 0; vec_safe_iterate (*v
, i
, &f
); i
++)
337 if (new_predicate
== f
->predicate
)
342 if (vec_safe_length (*v
) >= max_num_predicates
)
343 /* Too many different predicates to account for. */
346 ipa_freqcounting_predicate fcp
;
347 fcp
.predicate
= NULL
;
348 set_hint_predicate (&fcp
.predicate
, new_predicate
);
350 vec_safe_push (*v
, fcp
);
354 /* Compute what conditions may or may not hold given information about
355 parameters. RET_CLAUSE returns truths that may hold in a specialized copy,
356 while RET_NONSPEC_CLAUSE returns truths that may hold in an nonspecialized
357 copy when called in a given context. It is a bitmask of conditions. Bit
358 0 means that condition is known to be false, while bit 1 means that condition
359 may or may not be true. These differs - for example NOT_INLINED condition
360 is always false in the second and also builtin_constant_p tests cannot use
361 the fact that parameter is indeed a constant.
363 When INLINE_P is true, assume that we are inlining. AVAL contains known
364 information about argument values. The function does not modify its content
365 and so AVALs could also be of type ipa_call_arg_values but so far all
366 callers work with the auto version and so we avoid the conversion for
369 ERROR_MARK value of an argument means compile time invariant. */
372 evaluate_conditions_for_known_args (struct cgraph_node
*node
,
374 ipa_auto_call_arg_values
*avals
,
375 clause_t
*ret_clause
,
376 clause_t
*ret_nonspec_clause
,
377 ipa_call_summary
*es
)
379 clause_t clause
= inline_p
? 0 : 1 << ipa_predicate::not_inlined_condition
;
380 clause_t nonspec_clause
= 1 << ipa_predicate::not_inlined_condition
;
381 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (node
);
385 for (i
= 0; vec_safe_iterate (info
->conds
, i
, &c
); i
++)
390 struct expr_eval_op
*op
;
392 if (c
->code
== ipa_predicate::not_sra_candidate
)
396 || (int)es
->param
.length () <= c
->operand_num
397 || !es
->param
[c
->operand_num
].points_to_possible_sra_candidate
)
398 clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
399 nonspec_clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
405 if (c
->code
== ipa_predicate::changed
407 && (avals
->safe_sval_at(c
->operand_num
) == error_mark_node
))
410 if (tree sval
= avals
->safe_sval_at (c
->operand_num
))
411 val
= ipa_find_agg_cst_from_init (sval
, c
->offset
, c
->by_ref
);
414 ipa_argagg_value_list
avs (avals
);
415 val
= avs
.get_value (c
->operand_num
, c
->offset
/ BITS_PER_UNIT
,
421 val
= avals
->safe_sval_at (c
->operand_num
);
422 if (val
&& val
== error_mark_node
423 && c
->code
!= ipa_predicate::changed
)
428 && (c
->code
== ipa_predicate::changed
429 || c
->code
== ipa_predicate::is_not_constant
))
431 clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
432 nonspec_clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
435 if (c
->code
== ipa_predicate::changed
)
437 nonspec_clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
441 if (c
->code
== ipa_predicate::is_not_constant
)
443 nonspec_clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
447 if (val
&& TYPE_SIZE (c
->type
) == TYPE_SIZE (TREE_TYPE (val
)))
449 if (c
->type
!= TREE_TYPE (val
))
450 val
= fold_unary (VIEW_CONVERT_EXPR
, c
->type
, val
);
451 for (j
= 0; vec_safe_iterate (c
->param_ops
, j
, &op
); j
++)
456 val
= fold_unary (op
->code
, op
->type
, val
);
457 else if (!op
->val
[1])
458 val
= fold_binary (op
->code
, op
->type
,
459 op
->index
? op
->val
[0] : val
,
460 op
->index
? val
: op
->val
[0]);
461 else if (op
->index
== 0)
462 val
= fold_ternary (op
->code
, op
->type
,
463 val
, op
->val
[0], op
->val
[1]);
464 else if (op
->index
== 1)
465 val
= fold_ternary (op
->code
, op
->type
,
466 op
->val
[0], val
, op
->val
[1]);
467 else if (op
->index
== 2)
468 val
= fold_ternary (op
->code
, op
->type
,
469 op
->val
[0], op
->val
[1], val
);
475 ? fold_binary_to_constant (c
->code
, boolean_type_node
, val
, c
->val
)
478 if (res
&& integer_zerop (res
))
480 if (res
&& integer_onep (res
))
482 clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
484 |= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
488 if (c
->operand_num
< (int) avals
->m_known_value_ranges
.length ()
490 && (!val
|| TREE_CODE (val
) != INTEGER_CST
))
492 value_range
vr (avals
->m_known_value_ranges
[c
->operand_num
]);
493 if (!vr
.undefined_p ()
495 && (TYPE_SIZE (c
->type
) == TYPE_SIZE (vr
.type ())))
497 if (!useless_type_conversion_p (c
->type
, vr
.type ()))
498 range_cast (vr
, c
->type
);
500 for (j
= 0; vec_safe_iterate (c
->param_ops
, j
, &op
); j
++)
502 if (vr
.varying_p () || vr
.undefined_p ())
505 value_range
res (op
->type
);
508 value_range
varying (op
->type
);
509 varying
.set_varying (op
->type
);
510 range_op_handler
handler (op
->code
);
512 || !res
.supports_type_p (op
->type
)
513 || !handler
.fold_range (res
, op
->type
, vr
, varying
))
514 res
.set_varying (op
->type
);
516 else if (!op
->val
[1])
518 value_range
op0 (TREE_TYPE (op
->val
[0]));
519 range_op_handler
handler (op
->code
);
521 ipa_get_range_from_ip_invariant (op0
, op
->val
[0], node
);
524 || !res
.supports_type_p (op
->type
)
525 || !handler
.fold_range (res
, op
->type
,
526 op
->index
? op0
: vr
,
527 op
->index
? vr
: op0
))
528 res
.set_varying (op
->type
);
531 res
.set_varying (op
->type
);
534 if (!vr
.varying_p () && !vr
.undefined_p ())
537 value_range
val_vr (TREE_TYPE (c
->val
));
538 range_op_handler
handler (c
->code
);
540 ipa_get_range_from_ip_invariant (val_vr
, c
->val
, node
);
543 || !val_vr
.supports_type_p (TREE_TYPE (c
->val
))
544 || !handler
.fold_range (res
, boolean_type_node
, vr
, val_vr
))
545 res
.set_varying (boolean_type_node
);
553 clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
554 nonspec_clause
|= 1 << (i
+ ipa_predicate::first_dynamic_condition
);
556 *ret_clause
= clause
;
557 if (ret_nonspec_clause
)
558 *ret_nonspec_clause
= nonspec_clause
;
561 /* Return true if VRP will be exectued on the function.
562 We do not want to anticipate optimizations that will not happen.
564 FIXME: This can be confused with -fdisable and debug counters and thus
565 it should not be used for correctness (only to make heuristics work).
566 This means that inliner should do its own optimizations of expressions
567 that it predicts to be constant so wrong code can not be triggered by
568 builtin_constant_p. */
571 vrp_will_run_p (struct cgraph_node
*node
)
573 return (opt_for_fn (node
->decl
, optimize
)
574 && !opt_for_fn (node
->decl
, optimize_debug
)
575 && opt_for_fn (node
->decl
, flag_tree_vrp
));
578 /* Similarly about FRE. */
581 fre_will_run_p (struct cgraph_node
*node
)
583 return (opt_for_fn (node
->decl
, optimize
)
584 && !opt_for_fn (node
->decl
, optimize_debug
)
585 && opt_for_fn (node
->decl
, flag_tree_fre
));
588 /* Work out what conditions might be true at invocation of E.
589 Compute costs for inlined edge if INLINE_P is true.
591 Return in CLAUSE_PTR the evaluated conditions and in NONSPEC_CLAUSE_PTR
592 (if non-NULL) conditions evaluated for nonspecialized clone called
595 Vectors in AVALS will be populated with useful known information about
596 argument values - information not known to have any uses will be omitted -
597 except for m_known_contexts which will only be calculated if
598 COMPUTE_CONTEXTS is true. */
601 evaluate_properties_for_edge (struct cgraph_edge
*e
, bool inline_p
,
602 clause_t
*clause_ptr
,
603 clause_t
*nonspec_clause_ptr
,
604 ipa_auto_call_arg_values
*avals
,
605 bool compute_contexts
)
607 struct cgraph_node
*callee
= e
->callee
->ultimate_alias_target ();
608 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (callee
);
609 class ipa_edge_args
*args
;
610 class ipa_call_summary
*es
= NULL
;
613 *clause_ptr
= inline_p
? 0 : 1 << ipa_predicate::not_inlined_condition
;
615 if (ipa_node_params_sum
616 && !e
->call_stmt_cannot_inline_p
617 && (info
->conds
|| compute_contexts
)
618 && (args
= ipa_edge_args_sum
->get (e
)) != NULL
)
620 struct cgraph_node
*caller
;
621 class ipa_node_params
*caller_parms_info
, *callee_pi
= NULL
;
622 int i
, count
= ipa_get_cs_argument_count (args
);
623 es
= ipa_call_summaries
->get (e
);
627 if (e
->caller
->inlined_to
)
628 caller
= e
->caller
->inlined_to
;
631 caller_parms_info
= ipa_node_params_sum
->get (caller
);
632 callee_pi
= ipa_node_params_sum
->get (callee
);
634 /* Watch for thunks. */
636 /* Watch for variadic functions. */
637 count
= MIN (count
, ipa_get_param_count (callee_pi
));
641 for (i
= 0; i
< count
; i
++)
643 struct ipa_jump_func
*jf
= ipa_get_ith_jump_func (args
, i
);
645 if (ipa_is_param_used_by_indirect_call (callee_pi
, i
)
646 || ipa_is_param_used_by_ipa_predicates (callee_pi
, i
))
648 /* Determine if we know constant value of the parameter. */
649 tree type
= ipa_get_type (callee_pi
, i
);
650 tree cst
= ipa_value_from_jfunc (caller_parms_info
, jf
, type
);
652 if (!cst
&& e
->call_stmt
653 && i
< (int)gimple_call_num_args (e
->call_stmt
))
655 cst
= gimple_call_arg (e
->call_stmt
, i
);
656 if (!is_gimple_min_invariant (cst
))
661 gcc_checking_assert (TREE_CODE (cst
) != TREE_BINFO
);
662 if (!avals
->m_known_vals
.length ())
663 avals
->m_known_vals
.safe_grow_cleared (count
, true);
664 avals
->m_known_vals
[i
] = cst
;
666 else if (inline_p
&& !es
->param
[i
].change_prob
)
668 if (!avals
->m_known_vals
.length ())
669 avals
->m_known_vals
.safe_grow_cleared (count
, true);
670 avals
->m_known_vals
[i
] = error_mark_node
;
673 /* If we failed to get simple constant, try value range. */
674 if ((!cst
|| TREE_CODE (cst
) != INTEGER_CST
)
675 && vrp_will_run_p (caller
)
676 && ipa_is_param_used_by_ipa_predicates (callee_pi
, i
))
678 value_range
vr (type
);
680 ipa_value_range_from_jfunc (vr
, caller_parms_info
, e
, jf
, type
);
681 if (!vr
.undefined_p () && !vr
.varying_p ())
683 if (!avals
->m_known_value_ranges
.length ())
685 avals
->m_known_value_ranges
.safe_grow_cleared (count
,
687 for (int i
= 0; i
< count
; ++i
)
688 avals
->m_known_value_ranges
[i
].set_type (void_type_node
);
690 avals
->m_known_value_ranges
[i
] = vr
;
694 /* Determine known aggregate values. */
695 if (fre_will_run_p (caller
))
696 ipa_push_agg_values_from_jfunc (caller_parms_info
,
698 &avals
->m_known_aggs
);
701 /* For calls used in polymorphic calls we further determine
702 polymorphic call context. */
704 && ipa_is_param_used_by_polymorphic_call (callee_pi
, i
))
706 ipa_polymorphic_call_context
707 ctx
= ipa_context_from_jfunc (caller_parms_info
, e
, i
, jf
);
708 if (!ctx
.useless_p ())
710 if (!avals
->m_known_contexts
.length ())
711 avals
->m_known_contexts
.safe_grow_cleared (count
, true);
712 avals
->m_known_contexts
[i
]
713 = ipa_context_from_jfunc (caller_parms_info
, e
, i
, jf
);
718 gcc_assert (!count
|| callee
->thunk
);
720 else if (e
->call_stmt
&& !e
->call_stmt_cannot_inline_p
&& info
->conds
)
722 int i
, count
= (int)gimple_call_num_args (e
->call_stmt
);
724 for (i
= 0; i
< count
; i
++)
726 tree cst
= gimple_call_arg (e
->call_stmt
, i
);
727 if (!is_gimple_min_invariant (cst
))
731 if (!avals
->m_known_vals
.length ())
732 avals
->m_known_vals
.safe_grow_cleared (count
, true);
733 avals
->m_known_vals
[i
] = cst
;
738 evaluate_conditions_for_known_args (callee
, inline_p
, avals
, clause_ptr
,
739 nonspec_clause_ptr
, es
);
743 /* Allocate the function summary. */
746 ipa_fn_summary_alloc (void)
748 gcc_checking_assert (!ipa_fn_summaries
);
749 ipa_size_summaries
= new ipa_size_summary_t (symtab
);
750 ipa_fn_summaries
= ipa_fn_summary_t::create_ggc (symtab
);
751 ipa_call_summaries
= new ipa_call_summary_t (symtab
);
754 ipa_call_summary::~ipa_call_summary ()
757 edge_predicate_pool
.remove (predicate
);
762 ipa_fn_summary::~ipa_fn_summary ()
764 unsigned len
= vec_safe_length (loop_iterations
);
765 for (unsigned i
= 0; i
< len
; i
++)
766 edge_predicate_pool
.remove ((*loop_iterations
)[i
].predicate
);
767 len
= vec_safe_length (loop_strides
);
768 for (unsigned i
= 0; i
< len
; i
++)
769 edge_predicate_pool
.remove ((*loop_strides
)[i
].predicate
);
771 call_size_time_table
.release ();
772 vec_free (loop_iterations
);
773 vec_free (loop_strides
);
774 builtin_constant_p_parms
.release ();
778 ipa_fn_summary_t::remove_callees (cgraph_node
*node
)
781 for (e
= node
->callees
; e
; e
= e
->next_callee
)
782 ipa_call_summaries
->remove (e
);
783 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
784 ipa_call_summaries
->remove (e
);
787 /* Duplicate predicates in loop hint vector, allocating memory for them and
788 remove and deallocate any uninteresting (true or false) ones. Return the
791 static vec
<ipa_freqcounting_predicate
, va_gc
> *
792 remap_freqcounting_preds_after_dup (vec
<ipa_freqcounting_predicate
, va_gc
> *v
,
793 clause_t possible_truths
)
795 if (vec_safe_length (v
) == 0)
798 vec
<ipa_freqcounting_predicate
, va_gc
> *res
= v
->copy ();
799 int len
= res
->length();
800 for (int i
= len
- 1; i
>= 0; i
--)
802 ipa_predicate new_predicate
803 = (*res
)[i
].predicate
->remap_after_duplication (possible_truths
);
804 /* We do not want to free previous predicate; it is used by node
806 (*res
)[i
].predicate
= NULL
;
807 set_hint_predicate (&(*res
)[i
].predicate
, new_predicate
);
809 if (!(*res
)[i
].predicate
)
810 res
->unordered_remove (i
);
817 /* Hook that is called by cgraph.cc when a node is duplicated. */
819 ipa_fn_summary_t::duplicate (cgraph_node
*src
,
821 ipa_fn_summary
*src_info
,
822 ipa_fn_summary
*info
)
824 new (info
) ipa_fn_summary (*src_info
);
825 /* TODO: as an optimization, we may avoid copying conditions
826 that are known to be false or true. */
827 info
->conds
= vec_safe_copy (info
->conds
);
829 clone_info
*cinfo
= clone_info::get (dst
);
830 /* When there are any replacements in the function body, see if we can figure
831 out that something was optimized out. */
832 if (ipa_node_params_sum
&& cinfo
&& cinfo
->tree_map
)
834 /* Use SRC parm info since it may not be copied yet. */
835 ipa_node_params
*parms_info
= ipa_node_params_sum
->get (src
);
836 ipa_auto_call_arg_values avals
;
837 int count
= ipa_get_param_count (parms_info
);
839 clause_t possible_truths
;
840 ipa_predicate true_pred
= true;
842 int optimized_out_size
= 0;
843 bool inlined_to_p
= false;
844 struct cgraph_edge
*edge
, *next
;
846 info
->size_time_table
.release ();
847 avals
.m_known_vals
.safe_grow_cleared (count
, true);
848 for (i
= 0; i
< count
; i
++)
850 struct ipa_replace_map
*r
;
852 for (j
= 0; vec_safe_iterate (cinfo
->tree_map
, j
, &r
); j
++)
854 if (r
->parm_num
== i
)
856 avals
.m_known_vals
[i
] = r
->new_tree
;
861 evaluate_conditions_for_known_args (dst
, false,
864 /* We are going to specialize,
865 so ignore nonspec truths. */
869 info
->account_size_time (0, 0, true_pred
, true_pred
);
871 /* Remap size_time vectors.
872 Simplify the predicate by pruning out alternatives that are known
874 TODO: as on optimization, we can also eliminate conditions known
876 for (i
= 0; src_info
->size_time_table
.iterate (i
, &e
); i
++)
878 ipa_predicate new_exec_pred
;
879 ipa_predicate new_nonconst_pred
;
880 new_exec_pred
= e
->exec_predicate
.remap_after_duplication
882 new_nonconst_pred
= e
->nonconst_predicate
.remap_after_duplication
884 if (new_exec_pred
== false || new_nonconst_pred
== false)
885 optimized_out_size
+= e
->size
;
887 info
->account_size_time (e
->size
, e
->time
, new_exec_pred
,
891 /* Remap edge predicates with the same simplification as above.
892 Also copy constantness arrays. */
893 for (edge
= dst
->callees
; edge
; edge
= next
)
895 ipa_predicate new_predicate
;
896 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
897 next
= edge
->next_callee
;
899 if (!edge
->inline_failed
)
903 new_predicate
= es
->predicate
->remap_after_duplication
905 if (new_predicate
== false && *es
->predicate
!= false)
906 optimized_out_size
+= es
->call_stmt_size
* ipa_fn_summary::size_scale
;
907 edge_set_predicate (edge
, &new_predicate
);
910 /* Remap indirect edge predicates with the same simplification as above.
911 Also copy constantness arrays. */
912 for (edge
= dst
->indirect_calls
; edge
; edge
= next
)
914 ipa_predicate new_predicate
;
915 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
916 next
= edge
->next_callee
;
918 gcc_checking_assert (edge
->inline_failed
);
921 new_predicate
= es
->predicate
->remap_after_duplication
923 if (new_predicate
== false && *es
->predicate
!= false)
925 += es
->call_stmt_size
* ipa_fn_summary::size_scale
;
926 edge_set_predicate (edge
, &new_predicate
);
928 info
->loop_iterations
929 = remap_freqcounting_preds_after_dup (info
->loop_iterations
,
932 = remap_freqcounting_preds_after_dup (info
->loop_strides
,
934 if (info
->builtin_constant_p_parms
.length())
936 vec
<int, va_heap
, vl_ptr
> parms
= info
->builtin_constant_p_parms
;
938 info
->builtin_constant_p_parms
= vNULL
;
939 for (i
= 0; parms
.iterate (i
, &ip
); i
++)
940 if (!avals
.m_known_vals
[ip
])
941 info
->builtin_constant_p_parms
.safe_push (ip
);
944 /* If inliner or someone after inliner will ever start producing
945 non-trivial clones, we will get trouble with lack of information
946 about updating self sizes, because size vectors already contains
947 sizes of the callees. */
948 gcc_assert (!inlined_to_p
|| !optimized_out_size
);
952 info
->size_time_table
= src_info
->size_time_table
.copy ();
953 info
->loop_iterations
= vec_safe_copy (src_info
->loop_iterations
);
954 info
->loop_strides
= vec_safe_copy (info
->loop_strides
);
956 info
->builtin_constant_p_parms
957 = info
->builtin_constant_p_parms
.copy ();
959 ipa_freqcounting_predicate
*f
;
960 for (int i
= 0; vec_safe_iterate (info
->loop_iterations
, i
, &f
); i
++)
962 ipa_predicate p
= *f
->predicate
;
964 set_hint_predicate (&f
->predicate
, p
);
966 for (int i
= 0; vec_safe_iterate (info
->loop_strides
, i
, &f
); i
++)
968 ipa_predicate p
= *f
->predicate
;
970 set_hint_predicate (&f
->predicate
, p
);
973 if (!dst
->inlined_to
)
974 ipa_update_overall_fn_summary (dst
);
978 /* Hook that is called by cgraph.cc when a node is duplicated. */
981 ipa_call_summary_t::duplicate (struct cgraph_edge
*src
,
982 struct cgraph_edge
*dst
,
983 class ipa_call_summary
*srcinfo
,
984 class ipa_call_summary
*info
)
986 new (info
) ipa_call_summary (*srcinfo
);
987 info
->predicate
= NULL
;
988 edge_set_predicate (dst
, srcinfo
->predicate
);
989 info
->param
= srcinfo
->param
.copy ();
990 if (!dst
->indirect_unknown_callee
&& src
->indirect_unknown_callee
)
992 info
->call_stmt_size
-= (eni_size_weights
.indirect_call_cost
993 - eni_size_weights
.call_cost
);
994 info
->call_stmt_time
-= (eni_time_weights
.indirect_call_cost
995 - eni_time_weights
.call_cost
);
999 /* Dump edge summaries associated to NODE and recursively to all clones.
1000 Indent by INDENT. */
1003 dump_ipa_call_summary (FILE *f
, int indent
, struct cgraph_node
*node
,
1004 class ipa_fn_summary
*info
)
1006 struct cgraph_edge
*edge
;
1007 for (edge
= node
->callees
; edge
; edge
= edge
->next_callee
)
1009 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
1010 struct cgraph_node
*callee
= edge
->callee
->ultimate_alias_target ();
1014 "%*s%s %s\n%*s freq:%4.2f",
1015 indent
, "", callee
->dump_name (),
1016 !edge
->inline_failed
1017 ? "inlined" : cgraph_inline_failed_string (edge
-> inline_failed
),
1018 indent
, "", edge
->sreal_frequency ().to_double ());
1020 if (cross_module_call_p (edge
))
1021 fprintf (f
, " cross module");
1024 fprintf (f
, " loop depth:%2i size:%2i time: %2i",
1025 es
->loop_depth
, es
->call_stmt_size
, es
->call_stmt_time
);
1027 ipa_fn_summary
*s
= ipa_fn_summaries
->get (callee
);
1028 ipa_size_summary
*ss
= ipa_size_summaries
->get (callee
);
1030 fprintf (f
, " callee size:%2i stack:%2i",
1031 (int) (ss
->size
/ ipa_fn_summary::size_scale
),
1032 (int) s
->estimated_stack_size
);
1034 if (es
&& es
->predicate
)
1036 fprintf (f
, " predicate: ");
1037 es
->predicate
->dump (f
, info
->conds
);
1041 if (es
&& es
->param
.exists ())
1042 for (i
= 0; i
< (int) es
->param
.length (); i
++)
1044 int prob
= es
->param
[i
].change_prob
;
1047 fprintf (f
, "%*s op%i is compile time invariant\n",
1049 else if (prob
!= REG_BR_PROB_BASE
)
1050 fprintf (f
, "%*s op%i change %f%% of time\n", indent
+ 2, "", i
,
1051 prob
* 100.0 / REG_BR_PROB_BASE
);
1052 if (es
->param
[i
].points_to_local_or_readonly_memory
)
1053 fprintf (f
, "%*s op%i points to local or readonly memory\n",
1055 if (es
->param
[i
].points_to_possible_sra_candidate
)
1056 fprintf (f
, "%*s op%i points to possible sra candidate\n",
1059 if (!edge
->inline_failed
)
1061 ipa_size_summary
*ss
= ipa_size_summaries
->get (callee
);
1062 fprintf (f
, "%*sStack frame offset %i, callee self size %i\n",
1064 (int) ipa_get_stack_frame_offset (callee
),
1065 (int) ss
->estimated_self_stack_size
);
1066 dump_ipa_call_summary (f
, indent
+ 2, callee
, info
);
1069 for (edge
= node
->indirect_calls
; edge
; edge
= edge
->next_callee
)
1071 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
1072 fprintf (f
, "%*sindirect call loop depth:%2i freq:%4.2f size:%2i"
1076 edge
->sreal_frequency ().to_double (), es
->call_stmt_size
,
1077 es
->call_stmt_time
);
1080 fprintf (f
, "predicate: ");
1081 es
->predicate
->dump (f
, info
->conds
);
1090 ipa_dump_fn_summary (FILE *f
, struct cgraph_node
*node
)
1092 if (node
->definition
)
1094 class ipa_fn_summary
*s
= ipa_fn_summaries
->get (node
);
1095 class ipa_size_summary
*ss
= ipa_size_summaries
->get (node
);
1100 fprintf (f
, "IPA function summary for %s", node
->dump_name ());
1101 if (DECL_DISREGARD_INLINE_LIMITS (node
->decl
))
1102 fprintf (f
, " always_inline");
1104 fprintf (f
, " inlinable");
1105 if (s
->fp_expressions
)
1106 fprintf (f
, " fp_expression");
1107 if (s
->builtin_constant_p_parms
.length ())
1109 fprintf (f
, " builtin_constant_p_parms");
1110 for (unsigned int i
= 0;
1111 i
< s
->builtin_constant_p_parms
.length (); i
++)
1112 fprintf (f
, " %i", s
->builtin_constant_p_parms
[i
]);
1114 fprintf (f
, "\n global time: %f\n", s
->time
.to_double ());
1115 fprintf (f
, " self size: %i\n", ss
->self_size
);
1116 fprintf (f
, " global size: %i\n", ss
->size
);
1117 fprintf (f
, " min size: %i\n", s
->min_size
);
1118 fprintf (f
, " self stack: %i\n",
1119 (int) ss
->estimated_self_stack_size
);
1120 fprintf (f
, " global stack: %i\n", (int) s
->estimated_stack_size
);
1122 fprintf (f
, " estimated growth:%i\n", (int) s
->growth
);
1124 fprintf (f
, " In SCC: %i\n", (int) s
->scc_no
);
1125 for (i
= 0; s
->size_time_table
.iterate (i
, &e
); i
++)
1127 fprintf (f
, " size:%f, time:%f",
1128 (double) e
->size
/ ipa_fn_summary::size_scale
,
1129 e
->time
.to_double ());
1130 if (e
->exec_predicate
!= true)
1132 fprintf (f
, ", executed if:");
1133 e
->exec_predicate
.dump (f
, s
->conds
, 0);
1135 if (e
->exec_predicate
!= e
->nonconst_predicate
)
1137 fprintf (f
, ", nonconst if:");
1138 e
->nonconst_predicate
.dump (f
, s
->conds
, 0);
1142 ipa_freqcounting_predicate
*fcp
;
1143 bool first_fcp
= true;
1144 for (int i
= 0; vec_safe_iterate (s
->loop_iterations
, i
, &fcp
); i
++)
1148 fprintf (f
, " loop iterations:");
1151 fprintf (f
, " %3.2f for ", fcp
->freq
.to_double ());
1152 fcp
->predicate
->dump (f
, s
->conds
);
1155 for (int i
= 0; vec_safe_iterate (s
->loop_strides
, i
, &fcp
); i
++)
1159 fprintf (f
, " loop strides:");
1162 fprintf (f
, " %3.2f for :", fcp
->freq
.to_double ());
1163 fcp
->predicate
->dump (f
, s
->conds
);
1165 fprintf (f
, " calls:\n");
1166 dump_ipa_call_summary (f
, 4, node
, s
);
1169 fprintf (f
, " target_info: %x\n", s
->target_info
);
1172 fprintf (f
, "IPA summary for %s is missing.\n", node
->dump_name ());
1177 ipa_debug_fn_summary (struct cgraph_node
*node
)
1179 ipa_dump_fn_summary (stderr
, node
);
1183 ipa_dump_fn_summaries (FILE *f
)
1185 struct cgraph_node
*node
;
1187 FOR_EACH_DEFINED_FUNCTION (node
)
1188 if (!node
->inlined_to
)
1189 ipa_dump_fn_summary (f
, node
);
1192 /* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
1193 boolean variable pointed to by DATA. */
1196 mark_modified (ao_ref
*ao ATTRIBUTE_UNUSED
, tree vdef ATTRIBUTE_UNUSED
,
1199 bool *b
= (bool *) data
;
1204 /* If OP refers to value of function parameter, return the corresponding
1205 parameter. If non-NULL, the size of the memory load (or the SSA_NAME of the
1206 PARM_DECL) will be stored to *SIZE_P in that case too. */
1209 unmodified_parm_1 (ipa_func_body_info
*fbi
, gimple
*stmt
, tree op
,
1212 /* SSA_NAME referring to parm default def? */
1213 if (TREE_CODE (op
) == SSA_NAME
1214 && SSA_NAME_IS_DEFAULT_DEF (op
)
1215 && TREE_CODE (SSA_NAME_VAR (op
)) == PARM_DECL
)
1218 *size_p
= tree_to_poly_int64 (TYPE_SIZE (TREE_TYPE (op
)));
1219 return SSA_NAME_VAR (op
);
1221 /* Non-SSA parm reference? */
1222 if (TREE_CODE (op
) == PARM_DECL
1223 && fbi
->aa_walk_budget
> 0)
1225 bool modified
= false;
1228 ao_ref_init (&refd
, op
);
1229 int walked
= walk_aliased_vdefs (&refd
, gimple_vuse (stmt
),
1230 mark_modified
, &modified
, NULL
, NULL
,
1231 fbi
->aa_walk_budget
);
1234 fbi
->aa_walk_budget
= 0;
1237 fbi
->aa_walk_budget
-= walked
;
1241 *size_p
= tree_to_poly_int64 (TYPE_SIZE (TREE_TYPE (op
)));
1248 /* If OP refers to value of function parameter, return the corresponding
1249 parameter. Also traverse chains of SSA register assignments. If non-NULL,
1250 the size of the memory load (or the SSA_NAME of the PARM_DECL) will be
1251 stored to *SIZE_P in that case too. */
1254 unmodified_parm (ipa_func_body_info
*fbi
, gimple
*stmt
, tree op
,
1257 tree res
= unmodified_parm_1 (fbi
, stmt
, op
, size_p
);
1261 if (TREE_CODE (op
) == SSA_NAME
1262 && !SSA_NAME_IS_DEFAULT_DEF (op
)
1263 && gimple_assign_single_p (SSA_NAME_DEF_STMT (op
)))
1264 return unmodified_parm (fbi
, SSA_NAME_DEF_STMT (op
),
1265 gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op
)),
1270 /* If OP refers to a value of a function parameter or value loaded from an
1271 aggregate passed to a parameter (either by value or reference), return TRUE
1272 and store the number of the parameter to *INDEX_P, the access size into
1273 *SIZE_P, and information whether and how it has been loaded from an
1274 aggregate into *AGGPOS. INFO describes the function parameters, STMT is the
1275 statement in which OP is used or loaded. */
1278 unmodified_parm_or_parm_agg_item (struct ipa_func_body_info
*fbi
,
1279 gimple
*stmt
, tree op
, int *index_p
,
1281 struct agg_position_info
*aggpos
)
1283 tree res
= unmodified_parm_1 (fbi
, stmt
, op
, size_p
);
1285 gcc_checking_assert (aggpos
);
1288 *index_p
= ipa_get_param_decl_index (fbi
->info
, res
);
1291 aggpos
->agg_contents
= false;
1292 aggpos
->by_ref
= false;
1296 if (TREE_CODE (op
) == SSA_NAME
)
1298 if (SSA_NAME_IS_DEFAULT_DEF (op
)
1299 || !gimple_assign_single_p (SSA_NAME_DEF_STMT (op
)))
1301 stmt
= SSA_NAME_DEF_STMT (op
);
1302 op
= gimple_assign_rhs1 (stmt
);
1303 if (!REFERENCE_CLASS_P (op
))
1304 return unmodified_parm_or_parm_agg_item (fbi
, stmt
, op
, index_p
, size_p
,
1308 aggpos
->agg_contents
= true;
1309 return ipa_load_from_parm_agg (fbi
, fbi
->info
->descriptors
,
1310 stmt
, op
, index_p
, &aggpos
->offset
,
1311 size_p
, &aggpos
->by_ref
);
1314 /* If stmt is simple load or store of value pointed to by a function parmaeter,
1315 return its index. */
1318 load_or_store_of_ptr_parameter (ipa_func_body_info
*fbi
, gimple
*stmt
)
1322 gassign
*assign
= dyn_cast
<gassign
*> (stmt
);
1326 if (gimple_assign_load_p (stmt
))
1327 param
= gimple_assign_rhs1 (stmt
);
1328 else if (gimple_store_p (stmt
))
1329 param
= gimple_assign_lhs (stmt
);
1332 tree base
= get_base_address (param
);
1333 if (TREE_CODE (base
) != MEM_REF
1334 || TREE_CODE (TREE_OPERAND (base
, 0)) != SSA_NAME
1335 || !SSA_NAME_IS_DEFAULT_DEF (TREE_OPERAND (base
, 0)))
1337 tree p
= SSA_NAME_VAR (TREE_OPERAND (base
, 0));
1338 if (TREE_CODE (p
) != PARM_DECL
)
1340 return ipa_get_param_decl_index (fbi
->info
, p
);
1343 /* See if statement might disappear after inlining.
1344 0 - means not eliminated
1345 1 - half of statements goes away
1346 2 - for sure it is eliminated.
1347 We are not terribly sophisticated, basically looking for simple abstraction
1348 penalty wrappers. */
1351 eliminated_by_inlining_prob (ipa_func_body_info
*fbi
, gimple
*stmt
)
1353 enum gimple_code code
= gimple_code (stmt
);
1354 enum tree_code rhs_code
;
1364 if (gimple_num_ops (stmt
) != 2)
1367 rhs_code
= gimple_assign_rhs_code (stmt
);
1369 /* Casts of parameters, loads from parameters passed by reference
1370 and stores to return value or parameters are often free after
1371 inlining due to SRA and further combining.
1372 Assume that half of statements goes away. */
1373 if (CONVERT_EXPR_CODE_P (rhs_code
)
1374 || rhs_code
== VIEW_CONVERT_EXPR
1375 || rhs_code
== ADDR_EXPR
1376 || gimple_assign_rhs_class (stmt
) == GIMPLE_SINGLE_RHS
)
1378 tree rhs
= gimple_assign_rhs1 (stmt
);
1379 tree lhs
= gimple_assign_lhs (stmt
);
1380 tree inner_rhs
= get_base_address (rhs
);
1381 tree inner_lhs
= get_base_address (lhs
);
1382 bool rhs_free
= false;
1383 bool lhs_free
= false;
1390 /* Reads of parameter are expected to be free. */
1391 if (unmodified_parm (fbi
, stmt
, inner_rhs
, NULL
))
1393 /* Match expressions of form &this->field. Those will most likely
1394 combine with something upstream after inlining. */
1395 else if (TREE_CODE (inner_rhs
) == ADDR_EXPR
)
1397 tree op
= get_base_address (TREE_OPERAND (inner_rhs
, 0));
1398 if (TREE_CODE (op
) == PARM_DECL
)
1400 else if (TREE_CODE (op
) == MEM_REF
1401 && unmodified_parm (fbi
, stmt
, TREE_OPERAND (op
, 0),
1406 /* When parameter is not SSA register because its address is taken
1407 and it is just copied into one, the statement will be completely
1408 free after inlining (we will copy propagate backward). */
1409 if (rhs_free
&& is_gimple_reg (lhs
))
1412 /* Reads of parameters passed by reference
1413 expected to be free (i.e. optimized out after inlining). */
1414 if (TREE_CODE (inner_rhs
) == MEM_REF
1415 && unmodified_parm (fbi
, stmt
, TREE_OPERAND (inner_rhs
, 0), NULL
))
1418 /* Copying parameter passed by reference into gimple register is
1419 probably also going to copy propagate, but we can't be quite
1421 if (rhs_free
&& is_gimple_reg (lhs
))
1424 /* Writes to parameters, parameters passed by value and return value
1425 (either directly or passed via invisible reference) are free.
1427 TODO: We ought to handle testcase like
1428 struct a {int a,b;};
1436 This translate into:
1451 For that we either need to copy ipa-split logic detecting writes
1453 if (TREE_CODE (inner_lhs
) == PARM_DECL
1454 || TREE_CODE (inner_lhs
) == RESULT_DECL
1455 || (TREE_CODE (inner_lhs
) == MEM_REF
1456 && (unmodified_parm (fbi
, stmt
, TREE_OPERAND (inner_lhs
, 0),
1458 || (TREE_CODE (TREE_OPERAND (inner_lhs
, 0)) == SSA_NAME
1459 && SSA_NAME_VAR (TREE_OPERAND (inner_lhs
, 0))
1460 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND
1462 0))) == RESULT_DECL
))))
1465 && (is_gimple_reg (rhs
) || is_gimple_min_invariant (rhs
)))
1467 if (lhs_free
&& rhs_free
)
1476 /* Analyze EXPR if it represents a series of simple operations performed on
1477 a function parameter and return true if so. FBI, STMT, EXPR, INDEX_P and
1478 AGGPOS have the same meaning like in unmodified_parm_or_parm_agg_item.
1479 Type of the parameter or load from an aggregate via the parameter is
1480 stored in *TYPE_P. Operations on the parameter are recorded to
1481 PARAM_OPS_P if it is not NULL. */
1484 decompose_param_expr (struct ipa_func_body_info
*fbi
,
1485 gimple
*stmt
, tree expr
,
1486 int *index_p
, tree
*type_p
,
1487 struct agg_position_info
*aggpos
,
1488 expr_eval_ops
*param_ops_p
= NULL
)
1490 int op_limit
= opt_for_fn (fbi
->node
->decl
, param_ipa_max_param_expr_ops
);
1494 *param_ops_p
= NULL
;
1498 expr_eval_op eval_op
;
1500 unsigned cst_count
= 0;
1502 if (unmodified_parm_or_parm_agg_item (fbi
, stmt
, expr
, index_p
, NULL
,
1505 tree type
= TREE_TYPE (expr
);
1507 if (aggpos
->agg_contents
)
1509 /* Stop if containing bit-field. */
1510 if (TREE_CODE (expr
) == BIT_FIELD_REF
1511 || contains_bitfld_component_ref_p (expr
))
1519 if (TREE_CODE (expr
) != SSA_NAME
|| SSA_NAME_IS_DEFAULT_DEF (expr
))
1521 stmt
= SSA_NAME_DEF_STMT (expr
);
1523 if (gcall
*call
= dyn_cast
<gcall
*> (stmt
))
1525 int flags
= gimple_call_return_flags (call
);
1526 if (!(flags
& ERF_RETURNS_ARG
))
1528 int arg
= flags
& ERF_RETURN_ARG_MASK
;
1529 if (arg
>= (int)gimple_call_num_args (call
))
1531 expr
= gimple_call_arg (stmt
, arg
);
1535 if (!is_gimple_assign (stmt
= SSA_NAME_DEF_STMT (expr
)))
1538 switch (gimple_assign_rhs_class (stmt
))
1540 case GIMPLE_SINGLE_RHS
:
1541 expr
= gimple_assign_rhs1 (stmt
);
1544 case GIMPLE_UNARY_RHS
:
1548 case GIMPLE_BINARY_RHS
:
1552 case GIMPLE_TERNARY_RHS
:
1560 /* Stop if expression is too complex. */
1561 if (op_count
++ == op_limit
)
1566 eval_op
.code
= gimple_assign_rhs_code (stmt
);
1567 eval_op
.type
= TREE_TYPE (gimple_assign_lhs (stmt
));
1568 eval_op
.val
[0] = NULL_TREE
;
1569 eval_op
.val
[1] = NULL_TREE
;
1573 for (unsigned i
= 0; i
< rhs_count
; i
++)
1575 tree op
= gimple_op (stmt
, i
+ 1);
1577 gcc_assert (op
&& !TYPE_P (op
));
1578 if (is_gimple_ip_invariant (op
))
1580 if (++cst_count
== rhs_count
)
1583 eval_op
.val
[cst_count
- 1] = op
;
1587 /* Found a non-constant operand, and record its index in rhs
1594 /* Found more than one non-constant operands. */
1600 vec_safe_insert (*param_ops_p
, 0, eval_op
);
1603 /* Failed to decompose, free resource and return. */
1606 vec_free (*param_ops_p
);
1611 /* Record to SUMMARY that PARM is used by builtin_constant_p. */
1614 add_builtin_constant_p_parm (class ipa_fn_summary
*summary
, int parm
)
1618 /* Avoid duplicates. */
1619 for (unsigned int i
= 0;
1620 summary
->builtin_constant_p_parms
.iterate (i
, &ip
); i
++)
1623 summary
->builtin_constant_p_parms
.safe_push (parm
);
1626 /* If BB ends by a conditional we can turn into predicates, attach corresponding
1627 predicates to the CFG edges. */
1630 set_cond_stmt_execution_predicate (struct ipa_func_body_info
*fbi
,
1631 class ipa_fn_summary
*summary
,
1632 class ipa_node_params
*params_summary
,
1637 struct agg_position_info aggpos
;
1638 enum tree_code code
, inverted_code
;
1643 expr_eval_ops param_ops
;
1645 gcond
*last
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (bb
));
1648 if (!is_gimple_ip_invariant (gimple_cond_rhs (last
)))
1650 op
= gimple_cond_lhs (last
);
1652 if (decompose_param_expr (fbi
, last
, op
, &index
, ¶m_type
, &aggpos
,
1655 code
= gimple_cond_code (last
);
1656 inverted_code
= invert_tree_comparison (code
, HONOR_NANS (op
));
1658 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1660 enum tree_code this_code
= (e
->flags
& EDGE_TRUE_VALUE
1661 ? code
: inverted_code
);
1662 /* invert_tree_comparison will return ERROR_MARK on FP
1663 comparisons that are not EQ/NE instead of returning proper
1664 unordered one. Be sure it is not confused with NON_CONSTANT.
1666 And if the edge's target is the final block of diamond CFG graph
1667 of this conditional statement, we do not need to compute
1668 predicate for the edge because the final block's predicate must
1669 be at least as that of the first block of the statement. */
1670 if (this_code
!= ERROR_MARK
1671 && !dominated_by_p (CDI_POST_DOMINATORS
, bb
, e
->dest
))
1674 = add_condition (summary
, params_summary
, index
,
1675 param_type
, &aggpos
,
1676 this_code
, gimple_cond_rhs (last
), param_ops
);
1677 e
->aux
= edge_predicate_pool
.allocate ();
1678 *(ipa_predicate
*) e
->aux
= p
;
1681 vec_free (param_ops
);
1685 if (TREE_CODE (op
) != SSA_NAME
)
1688 if (builtin_constant_p (op))
1692 Here we can predicate nonconstant_code. We can't
1693 really handle constant_code since we have no predicate
1694 for this and also the constant code is not known to be
1695 optimized away when inliner doesn't see operand is constant.
1696 Other optimizers might think otherwise. */
1697 if (gimple_cond_code (last
) != NE_EXPR
1698 || !integer_zerop (gimple_cond_rhs (last
)))
1700 set_stmt
= SSA_NAME_DEF_STMT (op
);
1701 if (!gimple_call_builtin_p (set_stmt
, BUILT_IN_CONSTANT_P
)
1702 || gimple_call_num_args (set_stmt
) != 1)
1704 op2
= gimple_call_arg (set_stmt
, 0);
1705 if (!decompose_param_expr (fbi
, set_stmt
, op2
, &index
, ¶m_type
, &aggpos
))
1708 add_builtin_constant_p_parm (summary
, index
);
1709 FOR_EACH_EDGE (e
, ei
, bb
->succs
) if (e
->flags
& EDGE_FALSE_VALUE
)
1711 ipa_predicate p
= add_condition (summary
, params_summary
, index
,
1712 param_type
, &aggpos
,
1713 ipa_predicate::is_not_constant
, NULL_TREE
);
1714 e
->aux
= edge_predicate_pool
.allocate ();
1715 *(ipa_predicate
*) e
->aux
= p
;
1720 /* If BB ends by a switch we can turn into predicates, attach corresponding
1721 predicates to the CFG edges. */
1724 set_switch_stmt_execution_predicate (struct ipa_func_body_info
*fbi
,
1725 class ipa_fn_summary
*summary
,
1726 class ipa_node_params
*params_summary
,
1731 struct agg_position_info aggpos
;
1737 expr_eval_ops param_ops
;
1739 gswitch
*last
= safe_dyn_cast
<gswitch
*> (*gsi_last_bb (bb
));
1742 op
= gimple_switch_index (last
);
1743 if (!decompose_param_expr (fbi
, last
, op
, &index
, ¶m_type
, &aggpos
,
1747 auto_vec
<std::pair
<tree
, tree
> > ranges
;
1748 tree type
= TREE_TYPE (op
);
1749 int bound_limit
= opt_for_fn (fbi
->node
->decl
,
1750 param_ipa_max_switch_predicate_bounds
);
1751 int bound_count
= 0;
1752 // This can safely be an integer range, as switches can only hold
1756 get_range_query (cfun
)->range_of_expr (vr
, op
);
1757 if (vr
.undefined_p ())
1758 vr
.set_varying (TREE_TYPE (op
));
1759 tree vr_min
, vr_max
;
1760 // TODO: This entire function could use a rewrite to use the irange
1761 // API, instead of trying to recreate its intersection/union logic.
1762 // Any use of get_legacy_range() is a serious code smell.
1763 value_range_kind vr_type
= get_legacy_range (vr
, vr_min
, vr_max
);
1764 wide_int vr_wmin
= wi::to_wide (vr_min
);
1765 wide_int vr_wmax
= wi::to_wide (vr_max
);
1767 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
1769 e
->aux
= edge_predicate_pool
.allocate ();
1770 *(ipa_predicate
*) e
->aux
= false;
1773 e
= gimple_switch_edge (cfun
, last
, 0);
1774 /* Set BOUND_COUNT to maximum count to bypass computing predicate for
1775 default case if its target basic block is in convergence point of all
1776 switch cases, which can be determined by checking whether it
1777 post-dominates the switch statement. */
1778 if (dominated_by_p (CDI_POST_DOMINATORS
, bb
, e
->dest
))
1779 bound_count
= INT_MAX
;
1781 n
= gimple_switch_num_labels (last
);
1782 for (case_idx
= 1; case_idx
< n
; ++case_idx
)
1784 tree cl
= gimple_switch_label (last
, case_idx
);
1785 tree min
= CASE_LOW (cl
);
1786 tree max
= CASE_HIGH (cl
);
1789 e
= gimple_switch_edge (cfun
, last
, case_idx
);
1791 /* The case value might not have same type as switch expression,
1792 extend the value based on the expression type. */
1793 if (TREE_TYPE (min
) != type
)
1794 min
= wide_int_to_tree (type
, wi::to_wide (min
));
1798 else if (TREE_TYPE (max
) != type
)
1799 max
= wide_int_to_tree (type
, wi::to_wide (max
));
1801 /* The case's target basic block is in convergence point of all switch
1802 cases, its predicate should be at least as that of the switch
1804 if (dominated_by_p (CDI_POST_DOMINATORS
, bb
, e
->dest
))
1806 else if (min
== max
)
1807 p
= add_condition (summary
, params_summary
, index
, param_type
,
1808 &aggpos
, EQ_EXPR
, min
, param_ops
);
1811 ipa_predicate p1
, p2
;
1812 p1
= add_condition (summary
, params_summary
, index
, param_type
,
1813 &aggpos
, GE_EXPR
, min
, param_ops
);
1814 p2
= add_condition (summary
, params_summary
,index
, param_type
,
1815 &aggpos
, LE_EXPR
, max
, param_ops
);
1818 *(ipa_predicate
*) e
->aux
1819 = p
.or_with (summary
->conds
, *(ipa_predicate
*) e
->aux
);
1821 /* If there are too many disjoint case ranges, predicate for default
1822 case might become too complicated. So add a limit here. */
1823 if (bound_count
> bound_limit
)
1826 bool new_range
= true;
1828 if (!ranges
.is_empty ())
1830 wide_int curr_wmin
= wi::to_wide (min
);
1831 wide_int last_wmax
= wi::to_wide (ranges
.last ().second
);
1833 /* Merge case ranges if they are continuous. */
1834 if (curr_wmin
== last_wmax
+ 1)
1836 else if (vr_type
== VR_ANTI_RANGE
)
1838 /* If two disjoint case ranges can be connected by anti-range
1839 of switch index, combine them to one range. */
1840 if (wi::lt_p (vr_wmax
, curr_wmin
- 1, TYPE_SIGN (type
)))
1841 vr_type
= VR_UNDEFINED
;
1842 else if (wi::le_p (vr_wmin
, last_wmax
+ 1, TYPE_SIGN (type
)))
1847 /* Create/extend a case range. And we count endpoints of range set,
1848 this number nearly equals to number of conditions that we will create
1849 for predicate of default case. */
1852 bound_count
+= (min
== max
) ? 1 : 2;
1853 ranges
.safe_push (std::make_pair (min
, max
));
1857 bound_count
+= (ranges
.last ().first
== ranges
.last ().second
);
1858 ranges
.last ().second
= max
;
1862 e
= gimple_switch_edge (cfun
, last
, 0);
1863 if (bound_count
> bound_limit
)
1865 *(ipa_predicate
*) e
->aux
= true;
1866 vec_free (param_ops
);
1870 ipa_predicate p_seg
= true;
1871 ipa_predicate p_all
= false;
1873 if (vr_type
!= VR_RANGE
)
1875 vr_wmin
= wi::to_wide (TYPE_MIN_VALUE (type
));
1876 vr_wmax
= wi::to_wide (TYPE_MAX_VALUE (type
));
1879 /* Construct predicate to represent default range set that is negation of
1880 all case ranges. Case range is classified as containing single/non-single
1881 values. Suppose a piece of case ranges in the following.
1883 [D1...D2] [S1] ... [Sn] [D3...D4]
1885 To represent default case's range sets between two non-single value
1886 case ranges (From D2 to D3), we construct predicate as:
1888 D2 < x < D3 && x != S1 && ... && x != Sn
1890 for (size_t i
= 0; i
< ranges
.length (); i
++)
1892 tree min
= ranges
[i
].first
;
1893 tree max
= ranges
[i
].second
;
1896 p_seg
&= add_condition (summary
, params_summary
, index
,
1897 param_type
, &aggpos
, NE_EXPR
,
1901 /* Do not create sub-predicate for range that is beyond low bound
1903 if (wi::lt_p (vr_wmin
, wi::to_wide (min
), TYPE_SIGN (type
)))
1905 p_seg
&= add_condition (summary
, params_summary
, index
,
1906 param_type
, &aggpos
,
1907 LT_EXPR
, min
, param_ops
);
1908 p_all
= p_all
.or_with (summary
->conds
, p_seg
);
1911 /* Do not create sub-predicate for range that is beyond up bound
1913 if (wi::le_p (vr_wmax
, wi::to_wide (max
), TYPE_SIGN (type
)))
1919 p_seg
= add_condition (summary
, params_summary
, index
,
1920 param_type
, &aggpos
, GT_EXPR
,
1925 p_all
= p_all
.or_with (summary
->conds
, p_seg
);
1926 *(ipa_predicate
*) e
->aux
1927 = p_all
.or_with (summary
->conds
, *(ipa_predicate
*) e
->aux
);
1929 vec_free (param_ops
);
1933 /* For each BB in NODE attach to its AUX pointer predicate under
1934 which it is executable. */
1937 compute_bb_predicates (struct ipa_func_body_info
*fbi
,
1938 struct cgraph_node
*node
,
1939 class ipa_fn_summary
*summary
,
1940 class ipa_node_params
*params_summary
)
1942 struct function
*my_function
= DECL_STRUCT_FUNCTION (node
->decl
);
1946 FOR_EACH_BB_FN (bb
, my_function
)
1948 set_cond_stmt_execution_predicate (fbi
, summary
, params_summary
, bb
);
1949 set_switch_stmt_execution_predicate (fbi
, summary
, params_summary
, bb
);
1952 /* Entry block is always executable. */
1953 ENTRY_BLOCK_PTR_FOR_FN (my_function
)->aux
1954 = edge_predicate_pool
.allocate ();
1955 *(ipa_predicate
*) ENTRY_BLOCK_PTR_FOR_FN (my_function
)->aux
= true;
1957 /* A simple dataflow propagation of predicates forward in the CFG.
1958 TODO: work in reverse postorder. */
1962 FOR_EACH_BB_FN (bb
, my_function
)
1964 ipa_predicate p
= false;
1967 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
1971 ipa_predicate this_bb_predicate
1972 = *(ipa_predicate
*) e
->src
->aux
;
1974 this_bb_predicate
&= (*(ipa_predicate
*) e
->aux
);
1975 p
= p
.or_with (summary
->conds
, this_bb_predicate
);
1982 basic_block pdom_bb
;
1987 bb
->aux
= edge_predicate_pool
.allocate ();
1988 *((ipa_predicate
*) bb
->aux
) = p
;
1990 else if (p
!= *(ipa_predicate
*) bb
->aux
)
1992 /* This OR operation is needed to ensure monotonous data flow
1993 in the case we hit the limit on number of clauses and the
1994 and/or operations above give approximate answers. */
1995 p
= p
.or_with (summary
->conds
, *(ipa_predicate
*)bb
->aux
);
1996 if (p
!= *(ipa_predicate
*)bb
->aux
)
1999 *((ipa_predicate
*)bb
->aux
) = p
;
2003 /* For switch/if statement, we can OR-combine predicates of all
2004 its cases/branches to get predicate for basic block in their
2005 convergence point, but sometimes this will generate very
2006 complicated predicate. Actually, we can get simplified
2007 predicate in another way by using the fact that predicate
2008 for a basic block must also hold true for its post dominators.
2009 To be specific, basic block in convergence point of
2010 conditional statement should include predicate of the
2012 pdom_bb
= get_immediate_dominator (CDI_POST_DOMINATORS
, bb
);
2013 if (pdom_bb
== EXIT_BLOCK_PTR_FOR_FN (my_function
) || !pdom_bb
)
2015 else if (!pdom_bb
->aux
)
2018 pdom_bb
->aux
= edge_predicate_pool
.allocate ();
2019 *((ipa_predicate
*)pdom_bb
->aux
) = p
;
2021 else if (p
!= *(ipa_predicate
*)pdom_bb
->aux
)
2023 p
= p
.or_with (summary
->conds
,
2024 *(ipa_predicate
*)pdom_bb
->aux
);
2025 if (p
!= *(ipa_predicate
*)pdom_bb
->aux
)
2028 *((ipa_predicate
*)pdom_bb
->aux
) = p
;
2037 /* Return predicate specifying when the STMT might have result that is not
2038 a compile time constant. */
2040 static ipa_predicate
2041 will_be_nonconstant_expr_predicate (ipa_func_body_info
*fbi
,
2042 class ipa_fn_summary
*summary
,
2043 class ipa_node_params
*params_summary
,
2045 vec
<ipa_predicate
> nonconstant_names
)
2050 while (UNARY_CLASS_P (expr
))
2051 expr
= TREE_OPERAND (expr
, 0);
2053 parm
= unmodified_parm (fbi
, NULL
, expr
, NULL
);
2054 if (parm
&& (index
= ipa_get_param_decl_index (fbi
->info
, parm
)) >= 0)
2055 return add_condition (summary
, params_summary
, index
, TREE_TYPE (parm
), NULL
,
2056 ipa_predicate::changed
, NULL_TREE
);
2057 if (is_gimple_min_invariant (expr
))
2059 if (TREE_CODE (expr
) == SSA_NAME
)
2060 return nonconstant_names
[SSA_NAME_VERSION (expr
)];
2061 if (BINARY_CLASS_P (expr
) || COMPARISON_CLASS_P (expr
))
2064 = will_be_nonconstant_expr_predicate (fbi
, summary
,
2066 TREE_OPERAND (expr
, 0),
2072 = will_be_nonconstant_expr_predicate (fbi
, summary
,
2074 TREE_OPERAND (expr
, 1),
2076 return p1
.or_with (summary
->conds
, p2
);
2078 else if (TREE_CODE (expr
) == COND_EXPR
)
2081 = will_be_nonconstant_expr_predicate (fbi
, summary
,
2083 TREE_OPERAND (expr
, 0),
2089 = will_be_nonconstant_expr_predicate (fbi
, summary
,
2091 TREE_OPERAND (expr
, 1),
2095 p1
= p1
.or_with (summary
->conds
, p2
);
2096 p2
= will_be_nonconstant_expr_predicate (fbi
, summary
,
2098 TREE_OPERAND (expr
, 2),
2100 return p2
.or_with (summary
->conds
, p1
);
2102 else if (TREE_CODE (expr
) == CALL_EXPR
)
2112 /* Return predicate specifying when the STMT might have result that is not
2113 a compile time constant. */
2115 static ipa_predicate
2116 will_be_nonconstant_predicate (struct ipa_func_body_info
*fbi
,
2117 class ipa_fn_summary
*summary
,
2118 class ipa_node_params
*params_summary
,
2120 vec
<ipa_predicate
> nonconstant_names
)
2122 ipa_predicate p
= true;
2125 tree param_type
= NULL_TREE
;
2126 ipa_predicate op_non_const
;
2129 struct agg_position_info aggpos
;
2131 /* What statements might be optimized away
2132 when their arguments are constant. */
2133 if (gimple_code (stmt
) != GIMPLE_ASSIGN
2134 && gimple_code (stmt
) != GIMPLE_COND
2135 && gimple_code (stmt
) != GIMPLE_SWITCH
2136 && (gimple_code (stmt
) != GIMPLE_CALL
2137 || !(gimple_call_flags (stmt
) & ECF_CONST
)))
2140 /* Stores will stay anyway. */
2141 if (gimple_store_p (stmt
))
2144 is_load
= gimple_assign_load_p (stmt
);
2146 /* Loads can be optimized when the value is known. */
2149 tree op
= gimple_assign_rhs1 (stmt
);
2150 if (!decompose_param_expr (fbi
, stmt
, op
, &base_index
, ¶m_type
,
2157 /* See if we understand all operands before we start
2158 adding conditionals. */
2159 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_USE
)
2161 tree parm
= unmodified_parm (fbi
, stmt
, use
, NULL
);
2162 /* For arguments we can build a condition. */
2163 if (parm
&& ipa_get_param_decl_index (fbi
->info
, parm
) >= 0)
2165 if (TREE_CODE (use
) != SSA_NAME
)
2167 /* If we know when operand is constant,
2168 we still can say something useful. */
2169 if (nonconstant_names
[SSA_NAME_VERSION (use
)] != true)
2176 add_condition (summary
, params_summary
,
2177 base_index
, param_type
, &aggpos
,
2178 ipa_predicate::changed
, NULL_TREE
);
2180 op_non_const
= false;
2181 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_USE
)
2183 tree parm
= unmodified_parm (fbi
, stmt
, use
, NULL
);
2186 if (parm
&& (index
= ipa_get_param_decl_index (fbi
->info
, parm
)) >= 0)
2188 if (index
!= base_index
)
2189 p
= add_condition (summary
, params_summary
, index
,
2190 TREE_TYPE (parm
), NULL
,
2191 ipa_predicate::changed
, NULL_TREE
);
2196 p
= nonconstant_names
[SSA_NAME_VERSION (use
)];
2197 op_non_const
= p
.or_with (summary
->conds
, op_non_const
);
2199 if ((gimple_code (stmt
) == GIMPLE_ASSIGN
|| gimple_code (stmt
) == GIMPLE_CALL
)
2200 && gimple_op (stmt
, 0)
2201 && TREE_CODE (gimple_op (stmt
, 0)) == SSA_NAME
)
2202 nonconstant_names
[SSA_NAME_VERSION (gimple_op (stmt
, 0))]
2204 return op_non_const
;
2207 struct record_modified_bb_info
2214 /* Value is initialized in INIT_BB and used in USE_BB. We want to compute
2215 probability how often it changes between USE_BB.
2216 INIT_BB->count/USE_BB->count is an estimate, but if INIT_BB
2217 is in different loop nest, we can do better.
2218 This is all just estimate. In theory we look for minimal cut separating
2219 INIT_BB and USE_BB, but we only want to anticipate loop invariant motion
2223 get_minimal_bb (basic_block init_bb
, basic_block use_bb
)
2225 class loop
*l
= find_common_loop (init_bb
->loop_father
, use_bb
->loop_father
);
2226 if (l
&& l
->header
->count
< init_bb
->count
)
2231 /* Callback of walk_aliased_vdefs. Records basic blocks where the value may be
2232 set except for info->stmt. */
2235 record_modified (ao_ref
*ao ATTRIBUTE_UNUSED
, tree vdef
, void *data
)
2237 struct record_modified_bb_info
*info
=
2238 (struct record_modified_bb_info
*) data
;
2239 if (SSA_NAME_DEF_STMT (vdef
) == info
->stmt
)
2241 if (gimple_clobber_p (SSA_NAME_DEF_STMT (vdef
)))
2243 bitmap_set_bit (info
->bb_set
,
2244 SSA_NAME_IS_DEFAULT_DEF (vdef
)
2245 ? ENTRY_BLOCK_PTR_FOR_FN (cfun
)->index
2247 (gimple_bb (SSA_NAME_DEF_STMT (vdef
)),
2248 gimple_bb (info
->stmt
))->index
);
2251 fprintf (dump_file
, " Param ");
2252 print_generic_expr (dump_file
, info
->op
, TDF_SLIM
);
2253 fprintf (dump_file
, " changed at bb %i, minimal: %i stmt: ",
2254 gimple_bb (SSA_NAME_DEF_STMT (vdef
))->index
,
2256 (gimple_bb (SSA_NAME_DEF_STMT (vdef
)),
2257 gimple_bb (info
->stmt
))->index
);
2258 print_gimple_stmt (dump_file
, SSA_NAME_DEF_STMT (vdef
), 0);
2263 /* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
2264 will change since last invocation of STMT.
2266 Value 0 is reserved for compile time invariants.
2267 For common parameters it is REG_BR_PROB_BASE. For loop invariants it
2268 ought to be REG_BR_PROB_BASE / estimated_iters. */
2271 param_change_prob (ipa_func_body_info
*fbi
, gimple
*stmt
, int i
)
2273 tree op
= gimple_call_arg (stmt
, i
);
2274 basic_block bb
= gimple_bb (stmt
);
2276 if (TREE_CODE (op
) == WITH_SIZE_EXPR
)
2277 op
= TREE_OPERAND (op
, 0);
2279 tree base
= get_base_address (op
);
2281 /* Global invariants never change. */
2282 if (is_gimple_min_invariant (base
))
2285 /* We would have to do non-trivial analysis to really work out what
2286 is the probability of value to change (i.e. when init statement
2287 is in a sibling loop of the call).
2289 We do an conservative estimate: when call is executed N times more often
2290 than the statement defining value, we take the frequency 1/N. */
2291 if (TREE_CODE (base
) == SSA_NAME
)
2293 profile_count init_count
;
2295 if (!bb
->count
.nonzero_p ())
2296 return REG_BR_PROB_BASE
;
2298 if (SSA_NAME_IS_DEFAULT_DEF (base
))
2299 init_count
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
;
2301 init_count
= get_minimal_bb
2302 (gimple_bb (SSA_NAME_DEF_STMT (base
)),
2303 gimple_bb (stmt
))->count
;
2305 if (init_count
< bb
->count
)
2306 return MAX ((init_count
.to_sreal_scale (bb
->count
)
2307 * REG_BR_PROB_BASE
).to_int (), 1);
2308 return REG_BR_PROB_BASE
;
2313 profile_count max
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
;
2314 struct record_modified_bb_info info
;
2315 tree init
= ctor_for_folding (base
);
2317 if (init
!= error_mark_node
)
2319 if (!bb
->count
.nonzero_p () || fbi
->aa_walk_budget
== 0)
2320 return REG_BR_PROB_BASE
;
2323 fprintf (dump_file
, " Analyzing param change probability of ");
2324 print_generic_expr (dump_file
, op
, TDF_SLIM
);
2325 fprintf (dump_file
, "\n");
2327 ao_ref_init (&refd
, op
);
2330 info
.bb_set
= BITMAP_ALLOC (NULL
);
2332 = walk_aliased_vdefs (&refd
, gimple_vuse (stmt
), record_modified
, &info
,
2333 NULL
, NULL
, fbi
->aa_walk_budget
);
2335 fbi
->aa_walk_budget
-= walked
;
2336 if (walked
< 0 || bitmap_bit_p (info
.bb_set
, bb
->index
))
2339 fbi
->aa_walk_budget
= 0;
2343 fprintf (dump_file
, " Ran out of AA walking budget.\n");
2345 fprintf (dump_file
, " Set in same BB as used.\n");
2347 BITMAP_FREE (info
.bb_set
);
2348 return REG_BR_PROB_BASE
;
2353 /* Lookup the most frequent update of the value and believe that
2354 it dominates all the other; precise analysis here is difficult. */
2355 EXECUTE_IF_SET_IN_BITMAP (info
.bb_set
, 0, index
, bi
)
2356 max
= max
.max (BASIC_BLOCK_FOR_FN (cfun
, index
)->count
);
2359 fprintf (dump_file
, " Set with count ");
2360 max
.dump (dump_file
);
2361 fprintf (dump_file
, " and used with count ");
2362 bb
->count
.dump (dump_file
);
2363 fprintf (dump_file
, " freq %f\n",
2364 max
.to_sreal_scale (bb
->count
).to_double ());
2367 BITMAP_FREE (info
.bb_set
);
2368 if (max
< bb
->count
)
2369 return MAX ((max
.to_sreal_scale (bb
->count
)
2370 * REG_BR_PROB_BASE
).to_int (), 1);
2371 return REG_BR_PROB_BASE
;
2375 /* Find whether a basic block BB is the final block of a (half) diamond CFG
2376 sub-graph and if the predicate the condition depends on is known. If so,
2377 return true and store the pointer the predicate in *P. */
2380 phi_result_unknown_predicate (ipa_func_body_info
*fbi
,
2381 ipa_fn_summary
*summary
,
2382 class ipa_node_params
*params_summary
,
2385 vec
<ipa_predicate
> nonconstant_names
)
2389 basic_block first_bb
= NULL
;
2391 if (single_pred_p (bb
))
2397 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2399 if (single_succ_p (e
->src
))
2401 if (!single_pred_p (e
->src
))
2404 first_bb
= single_pred (e
->src
);
2405 else if (single_pred (e
->src
) != first_bb
)
2412 else if (e
->src
!= first_bb
)
2420 gcond
*stmt
= safe_dyn_cast
<gcond
*> (*gsi_last_bb (first_bb
));
2422 || !is_gimple_ip_invariant (gimple_cond_rhs (stmt
)))
2425 *p
= will_be_nonconstant_expr_predicate (fbi
, summary
, params_summary
,
2426 gimple_cond_lhs (stmt
),
2434 /* Given a PHI statement in a function described by inline properties SUMMARY
2435 and *P being the predicate describing whether the selected PHI argument is
2436 known, store a predicate for the result of the PHI statement into
2437 NONCONSTANT_NAMES, if possible. */
2440 predicate_for_phi_result (class ipa_fn_summary
*summary
, gphi
*phi
,
2442 vec
<ipa_predicate
> nonconstant_names
)
2446 for (i
= 0; i
< gimple_phi_num_args (phi
); i
++)
2448 tree arg
= gimple_phi_arg (phi
, i
)->def
;
2449 if (!is_gimple_min_invariant (arg
))
2451 gcc_assert (TREE_CODE (arg
) == SSA_NAME
);
2452 *p
= p
->or_with (summary
->conds
,
2453 nonconstant_names
[SSA_NAME_VERSION (arg
)]);
2459 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2461 fprintf (dump_file
, "\t\tphi predicate: ");
2462 p
->dump (dump_file
, summary
->conds
);
2464 nonconstant_names
[SSA_NAME_VERSION (gimple_phi_result (phi
))] = *p
;
2467 /* For a typical usage of __builtin_expect (a<b, 1), we
2468 may introduce an extra relation stmt:
2469 With the builtin, we have
2472 t3 = __builtin_expect (t2, 1);
2475 Without the builtin, we have
2478 This affects the size/time estimation and may have
2479 an impact on the earlier inlining.
2480 Here find this pattern and fix it up later. */
2483 find_foldable_builtin_expect (basic_block bb
)
2485 gimple_stmt_iterator bsi
;
2487 for (bsi
= gsi_start_bb (bb
); !gsi_end_p (bsi
); gsi_next (&bsi
))
2489 gimple
*stmt
= gsi_stmt (bsi
);
2490 if (gimple_call_builtin_p (stmt
, BUILT_IN_EXPECT
)
2491 || gimple_call_builtin_p (stmt
, BUILT_IN_EXPECT_WITH_PROBABILITY
)
2492 || gimple_call_internal_p (stmt
, IFN_BUILTIN_EXPECT
))
2494 tree var
= gimple_call_lhs (stmt
);
2495 tree arg
= gimple_call_arg (stmt
, 0);
2496 use_operand_p use_p
;
2503 gcc_assert (TREE_CODE (var
) == SSA_NAME
);
2505 while (TREE_CODE (arg
) == SSA_NAME
)
2507 gimple
*stmt_tmp
= SSA_NAME_DEF_STMT (arg
);
2508 if (!is_gimple_assign (stmt_tmp
))
2510 switch (gimple_assign_rhs_code (stmt_tmp
))
2529 arg
= gimple_assign_rhs1 (stmt_tmp
);
2532 if (match
&& single_imm_use (var
, &use_p
, &use_stmt
)
2533 && gimple_code (use_stmt
) == GIMPLE_COND
)
2540 /* Return true when the basic blocks contains only clobbers followed by RESX.
2541 Such BBs are kept around to make removal of dead stores possible with
2542 presence of EH and will be optimized out by optimize_clobbers later in the
2545 NEED_EH is used to recurse in case the clobber has non-EH predecessors
2546 that can be clobber only, too.. When it is false, the RESX is not necessary
2547 on the end of basic block. */
2550 clobber_only_eh_bb_p (basic_block bb
, bool need_eh
= true)
2552 gimple_stmt_iterator gsi
= gsi_last_bb (bb
);
2558 if (gsi_end_p (gsi
))
2560 if (gimple_code (gsi_stmt (gsi
)) != GIMPLE_RESX
)
2564 else if (!single_succ_p (bb
))
2567 for (; !gsi_end_p (gsi
); gsi_prev (&gsi
))
2569 gimple
*stmt
= gsi_stmt (gsi
);
2570 if (is_gimple_debug (stmt
))
2572 if (gimple_clobber_p (stmt
))
2574 if (gimple_code (stmt
) == GIMPLE_LABEL
)
2579 /* See if all predecessors are either throws or clobber only BBs. */
2580 FOR_EACH_EDGE (e
, ei
, bb
->preds
)
2581 if (!(e
->flags
& EDGE_EH
)
2582 && !clobber_only_eh_bb_p (e
->src
, false))
2588 /* Return true if STMT compute a floating point expression that may be affected
2589 by -ffast-math and similar flags. */
2592 fp_expression_p (gimple
*stmt
)
2597 FOR_EACH_SSA_TREE_OPERAND (op
, stmt
, i
, SSA_OP_DEF
|SSA_OP_USE
)
2598 if (FLOAT_TYPE_P (TREE_TYPE (op
)))
2603 /* Return true if T references memory location that is local
2604 for the function (that means, dead after return) or read-only. */
2607 refs_local_or_readonly_memory_p (tree t
)
2609 /* Non-escaping memory is fine. */
2610 t
= get_base_address (t
);
2611 if ((TREE_CODE (t
) == MEM_REF
2612 || TREE_CODE (t
) == TARGET_MEM_REF
))
2613 return points_to_local_or_readonly_memory_p (TREE_OPERAND (t
, 0));
2615 /* Automatic variables are fine. */
2617 && auto_var_in_fn_p (t
, current_function_decl
))
2620 /* Read-only variables are fine. */
2621 if (DECL_P (t
) && TREE_READONLY (t
))
2627 /* Return true if T is a pointer pointing to memory location that is local
2628 for the function (that means, dead after return) or read-only. */
2631 points_to_local_or_readonly_memory_p (tree t
)
2633 /* See if memory location is clearly invalid. */
2634 if (integer_zerop (t
))
2635 return flag_delete_null_pointer_checks
;
2636 if (TREE_CODE (t
) == SSA_NAME
)
2638 /* For IPA passes we can consinder accesses to return slot local
2639 even if it is not local in the sense that memory is dead by
2640 the end of founction.
2641 The outer function will see a store in the call assignment
2642 and thus this will do right thing for all uses of this
2643 function in the current IPA passes (modref, pure/const discovery
2644 and inlining heuristics). */
2645 if (DECL_RESULT (current_function_decl
)
2646 && DECL_BY_REFERENCE (DECL_RESULT (current_function_decl
))
2647 && t
== ssa_default_def (cfun
, DECL_RESULT (current_function_decl
)))
2649 return !ptr_deref_may_alias_global_p (t
, false);
2651 if (TREE_CODE (t
) == ADDR_EXPR
2652 && (TREE_CODE (TREE_OPERAND (t
, 0)) != TARGET_MEM_REF
2653 || TREE_CODE (TREE_OPERAND (TREE_OPERAND (t
, 0), 0)) != INTEGER_CST
))
2654 return refs_local_or_readonly_memory_p (TREE_OPERAND (t
, 0));
2658 /* Return true if T is a pointer pointing to memory location that is possible
2659 sra candidate if all functions it is passed to are inlined. */
2662 points_to_possible_sra_candidate_p (tree t
)
2664 if (TREE_CODE (t
) != ADDR_EXPR
)
2667 t
= get_base_address (TREE_OPERAND (t
, 0));
2669 /* Automatic variables are fine. */
2671 && auto_var_in_fn_p (t
, current_function_decl
))
2676 /* Return true if BB only calls builtin_unreachable.
2677 We skip empty basic blocks, debug statements, clobbers and predicts.
2678 CACHE is used to memoize already analyzed blocks. */
2681 builtin_unreachable_bb_p (basic_block bb
, vec
<unsigned char> &cache
)
2683 if (cache
[bb
->index
])
2684 return cache
[bb
->index
] - 1;
2685 gimple_stmt_iterator si
;
2686 auto_vec
<basic_block
, 4> visited_bbs
;
2690 bool empty_bb
= true;
2691 visited_bbs
.safe_push (bb
);
2692 cache
[bb
->index
] = 3;
2693 for (si
= gsi_start_nondebug_bb (bb
);
2694 !gsi_end_p (si
) && empty_bb
;
2695 gsi_next_nondebug (&si
))
2697 if (gimple_code (gsi_stmt (si
)) != GIMPLE_PREDICT
2698 && !gimple_clobber_p (gsi_stmt (si
))
2699 && !gimple_nop_p (gsi_stmt (si
)))
2708 bb
= single_succ_edge (bb
)->dest
;
2709 if (cache
[bb
->index
])
2711 ret
= cache
[bb
->index
] == 3 ? false : cache
[bb
->index
] - 1;
2715 if (gimple_call_builtin_p (gsi_stmt (si
), BUILT_IN_UNREACHABLE
)
2716 || gimple_call_builtin_p (gsi_stmt (si
), BUILT_IN_UNREACHABLE_TRAP
))
2719 for (basic_block vbb
:visited_bbs
)
2720 cache
[vbb
->index
] = (unsigned char)ret
+ 1;
2725 guards_builtin_unreachable (basic_block bb
, vec
<unsigned char> &cache
)
2729 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
2730 if (builtin_unreachable_bb_p (e
->dest
, cache
))
2732 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2734 "BB %i ends with conditional guarding __builtin_unreachable;"
2735 " conditinal is unnecesary\n", bb
->index
);
2741 #define STMT_NECESSARY GF_PLF_1
2743 /* If STMT is not already marked necessary, mark it, and add it to the
2744 worklist if ADD_TO_WORKLIST is true. */
2747 mark_stmt_necessary (gimple
*stmt
, auto_vec
<gimple
*> &worklist
)
2751 if (gimple_plf (stmt
, STMT_NECESSARY
))
2754 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2756 fprintf (dump_file
, "Marking useful stmt: ");
2757 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2758 fprintf (dump_file
, "\n");
2761 gimple_set_plf (stmt
, STMT_NECESSARY
, true);
2762 worklist
.safe_push (stmt
);
2765 /* Mark the statement defining operand OP as necessary. */
2768 mark_operand_necessary (tree op
, auto_vec
<gimple
*> &worklist
)
2770 gimple
*stmt
= SSA_NAME_DEF_STMT (op
);
2771 if (gimple_nop_p (stmt
))
2773 mark_stmt_necessary (stmt
, worklist
);
2776 /* Mark all statements that will remain in the body after optimizing out
2777 conditionals guarding __builtin_unreachable which we keep to preserve
2781 find_necessary_statements (struct cgraph_node
*node
)
2783 struct function
*my_function
= DECL_STRUCT_FUNCTION (node
->decl
);
2784 auto_vec
<unsigned char, 10> cache
;
2786 auto_vec
<gimple
*> worklist
;
2788 cache
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
2789 /* Mark all obviously necessary statements. */
2790 FOR_EACH_BB_FN (bb
, my_function
)
2792 for (gimple_stmt_iterator gsi
= gsi_start_phis (bb
);
2793 !gsi_end_p (gsi
); gsi_next (&gsi
))
2794 gimple_set_plf (gsi_stmt (gsi
), STMT_NECESSARY
, false);
2796 for (gimple_stmt_iterator bsi
= gsi_start_bb (bb
); !gsi_end_p (bsi
);
2797 gsi_next_nondebug (&bsi
))
2799 gimple
*stmt
= gsi_stmt (bsi
);
2801 gimple_set_plf (stmt
, STMT_NECESSARY
, false);
2802 if (gimple_has_side_effects (stmt
)
2803 || (is_ctrl_stmt (stmt
)
2804 && (gimple_code (stmt
) != GIMPLE_COND
2805 || !guards_builtin_unreachable (bb
, cache
)))
2806 || gimple_store_p (stmt
)
2807 || gimple_code (stmt
) == GIMPLE_ASM
)
2808 mark_stmt_necessary (stmt
, worklist
);
2811 while (worklist
.length () > 0)
2813 gimple
*stmt
= worklist
.pop ();
2815 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2817 fprintf (dump_file
, "processing: ");
2818 print_gimple_stmt (dump_file
, stmt
, 0, TDF_SLIM
);
2819 fprintf (dump_file
, "\n");
2821 if (gimple_code (stmt
) == GIMPLE_PHI
)
2822 for (unsigned int k
= 0; k
< gimple_phi_num_args (stmt
); k
++)
2824 tree arg
= PHI_ARG_DEF (stmt
, k
);
2826 if (TREE_CODE (arg
) == SSA_NAME
)
2827 mark_operand_necessary (arg
, worklist
);
2834 FOR_EACH_SSA_TREE_OPERAND (use
, stmt
, iter
, SSA_OP_USE
)
2835 mark_operand_necessary (use
, worklist
);
2840 /* Analyze function body for NODE.
2841 EARLY indicates run from early optimization pipeline. */
2844 analyze_function_body (struct cgraph_node
*node
, bool early
)
2846 sreal time
= opt_for_fn (node
->decl
, param_uninlined_function_time
);
2847 /* Estimate static overhead for function prologue/epilogue and alignment. */
2848 int size
= opt_for_fn (node
->decl
, param_uninlined_function_insns
);
2849 /* Benefits are scaled by probability of elimination that is in range
2852 struct function
*my_function
= DECL_STRUCT_FUNCTION (node
->decl
);
2854 class ipa_fn_summary
*info
= ipa_fn_summaries
->get_create (node
);
2855 ipa_node_params
*params_summary
2856 = early
? NULL
: ipa_node_params_sum
->get (node
);
2857 ipa_predicate bb_predicate
;
2858 struct ipa_func_body_info fbi
;
2859 vec
<ipa_predicate
> nonconstant_names
= vNULL
;
2862 gimple
*fix_builtin_expect_stmt
;
2864 gcc_assert (my_function
&& my_function
->cfg
);
2865 gcc_assert (cfun
== my_function
);
2867 memset(&fbi
, 0, sizeof(fbi
));
2868 vec_free (info
->conds
);
2870 info
->size_time_table
.release ();
2871 info
->call_size_time_table
.release ();
2873 /* When optimizing and analyzing for IPA inliner, initialize loop optimizer
2874 so we can produce proper inline hints.
2876 When optimizing and analyzing for early inliner, initialize node params
2877 so we can produce correct BB predicates. */
2879 if (opt_for_fn (node
->decl
, optimize
))
2881 calculate_dominance_info (CDI_DOMINATORS
);
2882 calculate_dominance_info (CDI_POST_DOMINATORS
);
2884 loop_optimizer_init (LOOPS_NORMAL
| LOOPS_HAVE_RECORDED_EXITS
);
2887 ipa_check_create_node_params ();
2888 ipa_initialize_node_params (node
);
2891 if (ipa_node_params_sum
)
2894 fbi
.info
= ipa_node_params_sum
->get (node
);
2895 fbi
.bb_infos
= vNULL
;
2896 fbi
.bb_infos
.safe_grow_cleared (last_basic_block_for_fn (cfun
), true);
2897 fbi
.param_count
= count_formal_params (node
->decl
);
2898 fbi
.aa_walk_budget
= opt_for_fn (node
->decl
, param_ipa_max_aa_steps
);
2900 nonconstant_names
.safe_grow_cleared
2901 (SSANAMES (my_function
)->length (), true);
2906 fprintf (dump_file
, "\nAnalyzing function body size: %s\n",
2907 node
->dump_name ());
2909 /* When we run into maximal number of entries, we assign everything to the
2910 constant truth case. Be sure to have it in list. */
2911 bb_predicate
= true;
2912 info
->account_size_time (0, 0, bb_predicate
, bb_predicate
);
2914 bb_predicate
= ipa_predicate::not_inlined ();
2915 info
->account_size_time (opt_for_fn (node
->decl
,
2916 param_uninlined_function_insns
)
2917 * ipa_fn_summary::size_scale
,
2918 opt_for_fn (node
->decl
,
2919 param_uninlined_function_time
),
2923 /* Only look for target information for inlinable functions. */
2924 bool scan_for_target_info
=
2926 && targetm
.target_option
.need_ipa_fn_target_info (node
->decl
,
2930 compute_bb_predicates (&fbi
, node
, info
, params_summary
);
2931 find_necessary_statements (node
);
2932 const profile_count entry_count
= ENTRY_BLOCK_PTR_FOR_FN (cfun
)->count
;
2933 order
= XNEWVEC (int, n_basic_blocks_for_fn (cfun
));
2934 nblocks
= pre_and_rev_post_order_compute (NULL
, order
, false);
2935 for (n
= 0; n
< nblocks
; n
++)
2937 bb
= BASIC_BLOCK_FOR_FN (cfun
, order
[n
]);
2938 freq
= bb
->count
.to_sreal_scale (entry_count
);
2939 if (clobber_only_eh_bb_p (bb
))
2941 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2942 fprintf (dump_file
, "\n Ignoring BB %i;"
2943 " it will be optimized away by cleanup_clobbers\n",
2948 /* TODO: Obviously predicates can be propagated down across CFG. */
2952 bb_predicate
= *(ipa_predicate
*)bb
->aux
;
2954 bb_predicate
= false;
2957 bb_predicate
= true;
2959 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2961 fprintf (dump_file
, "\n BB %i predicate:", bb
->index
);
2962 bb_predicate
.dump (dump_file
, info
->conds
);
2965 if (fbi
.info
&& nonconstant_names
.exists ())
2967 ipa_predicate phi_predicate
;
2968 bool first_phi
= true;
2970 for (gphi_iterator bsi
= gsi_start_phis (bb
); !gsi_end_p (bsi
);
2974 && !phi_result_unknown_predicate (&fbi
, info
,
2981 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
2983 fprintf (dump_file
, " ");
2984 print_gimple_stmt (dump_file
, gsi_stmt (bsi
), 0);
2986 predicate_for_phi_result (info
, bsi
.phi (), &phi_predicate
,
2991 fix_builtin_expect_stmt
= find_foldable_builtin_expect (bb
);
2993 for (gimple_stmt_iterator bsi
= gsi_start_nondebug_bb (bb
);
2994 !gsi_end_p (bsi
); gsi_next_nondebug (&bsi
))
2996 gimple
*stmt
= gsi_stmt (bsi
);
2997 if (!gimple_plf (stmt
, STMT_NECESSARY
))
2999 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3001 fprintf (dump_file
, " skipping unnecesary stmt ");
3002 print_gimple_stmt (dump_file
, stmt
, 0);
3004 /* TODO: const calls used only to produce values for
3005 builtion_unreachable guards should not be accounted. However
3006 we still want to inline them and this does does not work well
3007 with the cost model. For now account them as usual. */
3008 if (!is_gimple_call (stmt
)
3009 || gimple_call_internal_p (stmt
))
3012 int this_size
= estimate_num_insns (stmt
, &eni_size_weights
);
3013 int this_time
= estimate_num_insns (stmt
, &eni_time_weights
);
3015 ipa_predicate will_be_nonconstant
;
3017 /* This relation stmt should be folded after we remove
3018 __builtin_expect call. Adjust the cost here. */
3019 if (stmt
== fix_builtin_expect_stmt
)
3025 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3027 fprintf (dump_file
, " ");
3028 print_gimple_stmt (dump_file
, stmt
, 0);
3029 fprintf (dump_file
, "\t\tfreq:%3.2f size:%3i time:%3i\n",
3030 freq
.to_double (), this_size
,
3034 if (is_gimple_call (stmt
)
3035 && !gimple_call_internal_p (stmt
))
3037 struct cgraph_edge
*edge
= node
->get_edge (stmt
);
3038 ipa_call_summary
*es
= ipa_call_summaries
->get_create (edge
);
3040 /* Special case: results of BUILT_IN_CONSTANT_P will be always
3041 resolved as constant. We however don't want to optimize
3042 out the cgraph edges. */
3043 if (nonconstant_names
.exists ()
3044 && gimple_call_builtin_p (stmt
, BUILT_IN_CONSTANT_P
)
3045 && gimple_call_lhs (stmt
)
3046 && TREE_CODE (gimple_call_lhs (stmt
)) == SSA_NAME
)
3048 ipa_predicate false_p
= false;
3049 nonconstant_names
[SSA_NAME_VERSION (gimple_call_lhs (stmt
))]
3052 if (ipa_node_params_sum
)
3054 int count
= gimple_call_num_args (stmt
);
3058 es
->param
.safe_grow_cleared (count
, true);
3059 for (i
= 0; i
< count
; i
++)
3061 int prob
= param_change_prob (&fbi
, stmt
, i
);
3062 gcc_assert (prob
>= 0 && prob
<= REG_BR_PROB_BASE
);
3063 es
->param
[i
].change_prob
= prob
;
3064 es
->param
[i
].points_to_local_or_readonly_memory
3065 = points_to_local_or_readonly_memory_p
3066 (gimple_call_arg (stmt
, i
));
3067 es
->param
[i
].points_to_possible_sra_candidate
3068 = points_to_possible_sra_candidate_p
3069 (gimple_call_arg (stmt
, i
));
3072 /* We cannot setup VLA parameters during inlining. */
3073 for (unsigned int i
= 0; i
< gimple_call_num_args (stmt
); ++i
)
3074 if (TREE_CODE (gimple_call_arg (stmt
, i
)) == WITH_SIZE_EXPR
)
3076 edge
->inline_failed
= CIF_FUNCTION_NOT_INLINABLE
;
3079 es
->call_stmt_size
= this_size
;
3080 es
->call_stmt_time
= this_time
;
3081 es
->loop_depth
= bb_loop_depth (bb
);
3082 edge_set_predicate (edge
, &bb_predicate
);
3083 if (edge
->speculative
)
3085 cgraph_edge
*indirect
3086 = edge
->speculative_call_indirect_edge ();
3087 ipa_call_summary
*es2
3088 = ipa_call_summaries
->get_create (indirect
);
3089 ipa_call_summaries
->duplicate (edge
, indirect
,
3092 /* Edge is the first direct call.
3093 create and duplicate call summaries for multiple
3094 speculative call targets. */
3095 for (cgraph_edge
*direct
3096 = edge
->next_speculative_call_target ();
3098 direct
= direct
->next_speculative_call_target ())
3100 ipa_call_summary
*es3
3101 = ipa_call_summaries
->get_create (direct
);
3102 ipa_call_summaries
->duplicate (edge
, direct
,
3108 /* TODO: When conditional jump or switch is known to be constant, but
3109 we did not translate it into the predicates, we really can account
3110 just maximum of the possible paths. */
3113 = will_be_nonconstant_predicate (&fbi
, info
, params_summary
,
3114 stmt
, nonconstant_names
);
3116 will_be_nonconstant
= true;
3117 if (this_time
|| this_size
)
3119 sreal final_time
= (sreal
)this_time
* freq
;
3120 prob
= eliminated_by_inlining_prob (&fbi
, stmt
);
3121 if (prob
== 1 && dump_file
&& (dump_flags
& TDF_DETAILS
))
3123 "\t\t50%% will be eliminated by inlining\n");
3124 if (prob
== 2 && dump_file
&& (dump_flags
& TDF_DETAILS
))
3125 fprintf (dump_file
, "\t\tWill be eliminated by inlining\n");
3127 ipa_predicate p
= bb_predicate
& will_be_nonconstant
;
3128 int parm
= load_or_store_of_ptr_parameter (&fbi
, stmt
);
3129 ipa_predicate sra_predicate
= true;
3131 sra_predicate
&= add_condition (info
, params_summary
, parm
,
3132 ptr_type_node
, NULL
,
3133 ipa_predicate::not_sra_candidate
, NULL
, 0);
3135 /* We can ignore statement when we proved it is never going
3136 to happen, but we cannot do that for call statements
3137 because edges are accounted specially. */
3139 if (*(is_gimple_call (stmt
) ? &bb_predicate
: &p
) != false)
3145 /* We account everything but the calls. Calls have their own
3146 size/time info attached to cgraph edges. This is necessary
3147 in order to make the cost disappear after inlining. */
3148 if (!is_gimple_call (stmt
))
3153 = bb_predicate
& ipa_predicate::not_inlined () & sra_predicate
;
3154 info
->account_size_time (this_size
* prob
,
3155 (final_time
* prob
) / 2, ip
,
3159 info
->account_size_time (this_size
* (2 - prob
),
3160 (final_time
* (2 - prob
) / 2),
3161 bb_predicate
& sra_predicate
,
3165 if (!info
->fp_expressions
&& fp_expression_p (stmt
))
3167 info
->fp_expressions
= true;
3169 fprintf (dump_file
, " fp_expression set\n");
3173 /* For target specific information, we want to scan all statements
3174 rather than those statements with non-zero weights, to avoid
3175 missing to scan something interesting for target information,
3176 such as: internal function calls. */
3177 if (scan_for_target_info
)
3178 scan_for_target_info
=
3179 targetm
.target_option
.update_ipa_fn_target_info
3180 (info
->target_info
, stmt
);
3182 /* Account cost of address calculations in the statements. */
3183 for (unsigned int i
= 0; i
< gimple_num_ops (stmt
); i
++)
3185 for (tree op
= gimple_op (stmt
, i
);
3186 op
&& handled_component_p (op
);
3187 op
= TREE_OPERAND (op
, 0))
3188 if ((TREE_CODE (op
) == ARRAY_REF
3189 || TREE_CODE (op
) == ARRAY_RANGE_REF
)
3190 && TREE_CODE (TREE_OPERAND (op
, 1)) == SSA_NAME
)
3192 ipa_predicate p
= bb_predicate
;
3194 p
= p
& will_be_nonconstant_expr_predicate
3195 (&fbi
, info
, params_summary
,
3196 TREE_OPERAND (op
, 1),
3204 "\t\tAccounting address calculation.\n");
3205 info
->account_size_time (ipa_fn_summary::size_scale
,
3217 if (nonconstant_names
.exists () && !early
)
3219 ipa_fn_summary
*s
= ipa_fn_summaries
->get (node
);
3220 unsigned max_loop_predicates
= opt_for_fn (node
->decl
,
3221 param_ipa_max_loop_predicates
);
3223 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
3224 flow_loops_dump (dump_file
, NULL
, 0);
3226 for (auto loop
: loops_list (cfun
, 0))
3228 ipa_predicate loop_iterations
= true;
3232 class tree_niter_desc niter_desc
;
3233 if (!loop
->header
->aux
)
3236 profile_count phdr_count
= loop_preheader_edge (loop
)->count ();
3237 sreal phdr_freq
= phdr_count
.to_sreal_scale (entry_count
);
3239 bb_predicate
= *(ipa_predicate
*)loop
->header
->aux
;
3240 auto_vec
<edge
> exits
= get_loop_exit_edges (loop
);
3241 FOR_EACH_VEC_ELT (exits
, j
, ex
)
3242 if (number_of_iterations_exit (loop
, ex
, &niter_desc
, false)
3243 && !is_gimple_min_invariant (niter_desc
.niter
))
3245 ipa_predicate will_be_nonconstant
3246 = will_be_nonconstant_expr_predicate (&fbi
, info
,
3250 if (will_be_nonconstant
!= true)
3251 will_be_nonconstant
= bb_predicate
& will_be_nonconstant
;
3252 if (will_be_nonconstant
!= true
3253 && will_be_nonconstant
!= false)
3254 loop_iterations
&= will_be_nonconstant
;
3256 add_freqcounting_predicate (&s
->loop_iterations
, loop_iterations
,
3257 phdr_freq
, max_loop_predicates
);
3260 /* To avoid quadratic behavior we analyze stride predicates only
3261 with respect to the containing loop. Thus we simply iterate
3262 over all defs in the outermost loop body. */
3263 for (class loop
*loop
= loops_for_fn (cfun
)->tree_root
->inner
;
3264 loop
!= NULL
; loop
= loop
->next
)
3266 ipa_predicate loop_stride
= true;
3267 basic_block
*body
= get_loop_body (loop
);
3268 profile_count phdr_count
= loop_preheader_edge (loop
)->count ();
3269 sreal phdr_freq
= phdr_count
.to_sreal_scale (entry_count
);
3270 for (unsigned i
= 0; i
< loop
->num_nodes
; i
++)
3272 gimple_stmt_iterator gsi
;
3276 bb_predicate
= *(ipa_predicate
*)body
[i
]->aux
;
3277 for (gsi
= gsi_start_bb (body
[i
]); !gsi_end_p (gsi
);
3280 gimple
*stmt
= gsi_stmt (gsi
);
3282 if (!is_gimple_assign (stmt
))
3285 tree def
= gimple_assign_lhs (stmt
);
3286 if (TREE_CODE (def
) != SSA_NAME
)
3290 if (!simple_iv (loop_containing_stmt (stmt
),
3291 loop_containing_stmt (stmt
),
3293 || is_gimple_min_invariant (iv
.step
))
3296 ipa_predicate will_be_nonconstant
3297 = will_be_nonconstant_expr_predicate (&fbi
, info
,
3301 if (will_be_nonconstant
!= true)
3302 will_be_nonconstant
= bb_predicate
& will_be_nonconstant
;
3303 if (will_be_nonconstant
!= true
3304 && will_be_nonconstant
!= false)
3305 loop_stride
= loop_stride
& will_be_nonconstant
;
3308 add_freqcounting_predicate (&s
->loop_strides
, loop_stride
,
3309 phdr_freq
, max_loop_predicates
);
3314 FOR_ALL_BB_FN (bb
, my_function
)
3320 edge_predicate_pool
.remove ((ipa_predicate
*)bb
->aux
);
3322 FOR_EACH_EDGE (e
, ei
, bb
->succs
)
3325 edge_predicate_pool
.remove ((ipa_predicate
*)e
->aux
);
3329 ipa_fn_summary
*s
= ipa_fn_summaries
->get (node
);
3330 ipa_size_summary
*ss
= ipa_size_summaries
->get (node
);
3332 ss
->self_size
= size
;
3333 nonconstant_names
.release ();
3334 ipa_release_body_info (&fbi
);
3335 if (opt_for_fn (node
->decl
, optimize
))
3338 loop_optimizer_finalize ();
3339 else if (!ipa_edge_args_sum
)
3340 ipa_free_all_node_params ();
3341 free_dominance_info (CDI_DOMINATORS
);
3342 free_dominance_info (CDI_POST_DOMINATORS
);
3346 fprintf (dump_file
, "\n");
3347 ipa_dump_fn_summary (dump_file
, node
);
3352 /* Compute function summary.
3353 EARLY is true when we compute parameters during early opts. */
3356 compute_fn_summary (struct cgraph_node
*node
, bool early
)
3358 HOST_WIDE_INT self_stack_size
;
3359 struct cgraph_edge
*e
;
3361 gcc_assert (!node
->inlined_to
);
3363 if (!ipa_fn_summaries
)
3364 ipa_fn_summary_alloc ();
3366 /* Create a new ipa_fn_summary. */
3367 ((ipa_fn_summary_t
*)ipa_fn_summaries
)->remove_callees (node
);
3368 ipa_fn_summaries
->remove (node
);
3369 class ipa_fn_summary
*info
= ipa_fn_summaries
->get_create (node
);
3370 class ipa_size_summary
*size_info
= ipa_size_summaries
->get_create (node
);
3372 /* Estimate the stack size for the function if we're optimizing. */
3373 self_stack_size
= optimize
&& !node
->thunk
3374 ? estimated_stack_frame_size (node
) : 0;
3375 size_info
->estimated_self_stack_size
= self_stack_size
;
3376 info
->estimated_stack_size
= self_stack_size
;
3380 ipa_call_summary
*es
= ipa_call_summaries
->get_create (node
->callees
);
3381 ipa_predicate t
= true;
3383 node
->can_change_signature
= false;
3384 es
->call_stmt_size
= eni_size_weights
.call_cost
;
3385 es
->call_stmt_time
= eni_time_weights
.call_cost
;
3386 info
->account_size_time (ipa_fn_summary::size_scale
3387 * opt_for_fn (node
->decl
,
3388 param_uninlined_function_thunk_insns
),
3389 opt_for_fn (node
->decl
,
3390 param_uninlined_function_thunk_time
), t
, t
);
3391 t
= ipa_predicate::not_inlined ();
3392 info
->account_size_time (2 * ipa_fn_summary::size_scale
, 0, t
, t
);
3393 ipa_update_overall_fn_summary (node
);
3394 size_info
->self_size
= size_info
->size
;
3395 if (stdarg_p (TREE_TYPE (node
->decl
)))
3397 info
->inlinable
= false;
3398 node
->callees
->inline_failed
= CIF_VARIADIC_THUNK
;
3401 info
->inlinable
= true;
3405 /* Even is_gimple_min_invariant rely on current_function_decl. */
3406 push_cfun (DECL_STRUCT_FUNCTION (node
->decl
));
3408 /* During IPA profile merging we may be called w/o virtual SSA form
3410 update_ssa (TODO_update_ssa_only_virtuals
);
3412 /* Can this function be inlined at all? */
3413 if (!opt_for_fn (node
->decl
, optimize
)
3414 && !lookup_attribute ("always_inline",
3415 DECL_ATTRIBUTES (node
->decl
)))
3416 info
->inlinable
= false;
3418 info
->inlinable
= tree_inlinable_function_p (node
->decl
);
3420 bool no_signature
= false;
3421 /* Type attributes can use parameter indices to describe them.
3422 Special case fn spec since we can safely preserve them in
3423 modref summaries. */
3424 for (tree list
= TYPE_ATTRIBUTES (TREE_TYPE (node
->decl
));
3425 list
&& !no_signature
; list
= TREE_CHAIN (list
))
3426 if (!ipa_param_adjustments::type_attribute_allowed_p
3427 (get_attribute_name (list
)))
3431 fprintf (dump_file
, "No signature change:"
3432 " function type has unhandled attribute %s.\n",
3433 IDENTIFIER_POINTER (get_attribute_name (list
)));
3435 no_signature
= true;
3437 for (tree parm
= DECL_ARGUMENTS (node
->decl
);
3438 parm
&& !no_signature
; parm
= DECL_CHAIN (parm
))
3439 if (variably_modified_type_p (TREE_TYPE (parm
), node
->decl
))
3443 fprintf (dump_file
, "No signature change:"
3444 " has parameter with variably modified type.\n");
3446 no_signature
= true;
3449 /* Likewise for #pragma omp declare simd functions or functions
3450 with simd attribute. */
3452 || lookup_attribute ("omp declare simd",
3453 DECL_ATTRIBUTES (node
->decl
)))
3454 node
->can_change_signature
= false;
3457 /* Otherwise, inlinable functions always can change signature. */
3458 if (info
->inlinable
)
3459 node
->can_change_signature
= true;
3462 /* Functions calling builtin_apply cannot change signature. */
3463 for (e
= node
->callees
; e
; e
= e
->next_callee
)
3465 tree
cdecl = e
->callee
->decl
;
3466 if (fndecl_built_in_p (cdecl, BUILT_IN_APPLY_ARGS
,
3470 node
->can_change_signature
= !e
;
3473 analyze_function_body (node
, early
);
3477 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
3478 size_info
->size
= size_info
->self_size
;
3479 info
->estimated_stack_size
= size_info
->estimated_self_stack_size
;
3481 /* Code above should compute exactly the same result as
3482 ipa_update_overall_fn_summary except for case when speculative
3483 edges are present since these are accounted to size but not
3484 self_size. Do not compare time since different order the roundoff
3485 errors result in slight changes. */
3486 ipa_update_overall_fn_summary (node
);
3489 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
3492 gcc_assert (e
|| size_info
->size
== size_info
->self_size
);
3497 /* Compute parameters of functions used by inliner using
3498 current_function_decl. */
3501 compute_fn_summary_for_current (void)
3503 compute_fn_summary (cgraph_node::get (current_function_decl
), true);
3507 /* Estimate benefit devirtualizing indirect edge IE and return true if it can
3508 be devirtualized and inlined, provided m_known_vals, m_known_contexts and
3509 m_known_aggs in AVALS. Return false straight away if AVALS is NULL. */
3512 estimate_edge_devirt_benefit (struct cgraph_edge
*ie
,
3513 int *size
, int *time
,
3514 ipa_call_arg_values
*avals
)
3517 struct cgraph_node
*callee
;
3518 class ipa_fn_summary
*isummary
;
3519 enum availability avail
;
3523 || (!avals
->m_known_vals
.length() && !avals
->m_known_contexts
.length ()))
3525 if (!opt_for_fn (ie
->caller
->decl
, flag_indirect_inlining
))
3528 target
= ipa_get_indirect_edge_target (ie
, avals
, &speculative
);
3529 if (!target
|| speculative
)
3532 /* Account for difference in cost between indirect and direct calls. */
3533 *size
-= (eni_size_weights
.indirect_call_cost
- eni_size_weights
.call_cost
);
3534 *time
-= (eni_time_weights
.indirect_call_cost
- eni_time_weights
.call_cost
);
3535 gcc_checking_assert (*time
>= 0);
3536 gcc_checking_assert (*size
>= 0);
3538 callee
= cgraph_node::get (target
);
3539 if (!callee
|| !callee
->definition
)
3541 callee
= callee
->function_symbol (&avail
);
3542 if (avail
< AVAIL_AVAILABLE
)
3544 isummary
= ipa_fn_summaries
->get (callee
);
3545 if (isummary
== NULL
)
3548 return isummary
->inlinable
;
3551 /* Increase SIZE, MIN_SIZE (if non-NULL) and TIME for size and time needed to
3552 handle edge E with probability PROB. Set HINTS accordingly if edge may be
3553 devirtualized. AVALS, if non-NULL, describes the context of the call site
3554 as far as values of parameters are concerened. */
3557 estimate_edge_size_and_time (struct cgraph_edge
*e
, int *size
, int *min_size
,
3558 sreal
*time
, ipa_call_arg_values
*avals
,
3561 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
3562 int call_size
= es
->call_stmt_size
;
3563 int call_time
= es
->call_stmt_time
;
3566 if (!e
->callee
&& hints
&& e
->maybe_hot_p ()
3567 && estimate_edge_devirt_benefit (e
, &call_size
, &call_time
, avals
))
3568 *hints
|= INLINE_HINT_indirect_call
;
3569 cur_size
= call_size
* ipa_fn_summary::size_scale
;
3572 *min_size
+= cur_size
;
3574 *time
+= ((sreal
)call_time
) * e
->sreal_frequency ();
3578 /* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
3579 calls in NODE. POSSIBLE_TRUTHS and AVALS describe the context of the call
3582 Helper for estimate_calls_size_and_time which does the same but
3583 (in most cases) faster. */
3586 estimate_calls_size_and_time_1 (struct cgraph_node
*node
, int *size
,
3587 int *min_size
, sreal
*time
,
3589 clause_t possible_truths
,
3590 ipa_call_arg_values
*avals
)
3592 struct cgraph_edge
*e
;
3593 for (e
= node
->callees
; e
; e
= e
->next_callee
)
3595 if (!e
->inline_failed
)
3597 gcc_checking_assert (!ipa_call_summaries
->get (e
));
3598 estimate_calls_size_and_time_1 (e
->callee
, size
, min_size
, time
,
3599 hints
, possible_truths
, avals
);
3603 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
3605 /* Do not care about zero sized builtins. */
3606 if (!es
->call_stmt_size
)
3608 gcc_checking_assert (!es
->call_stmt_time
);
3612 || es
->predicate
->evaluate (possible_truths
))
3614 /* Predicates of calls shall not use NOT_CHANGED codes,
3615 so we do not need to compute probabilities. */
3616 estimate_edge_size_and_time (e
, size
,
3617 es
->predicate
? NULL
: min_size
,
3618 time
, avals
, hints
);
3621 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
3623 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
3625 || es
->predicate
->evaluate (possible_truths
))
3626 estimate_edge_size_and_time (e
, size
,
3627 es
->predicate
? NULL
: min_size
,
3628 time
, avals
, hints
);
3632 /* Populate sum->call_size_time_table for edges from NODE. */
3635 summarize_calls_size_and_time (struct cgraph_node
*node
,
3636 ipa_fn_summary
*sum
)
3638 struct cgraph_edge
*e
;
3639 for (e
= node
->callees
; e
; e
= e
->next_callee
)
3641 if (!e
->inline_failed
)
3643 gcc_checking_assert (!ipa_call_summaries
->get (e
));
3644 summarize_calls_size_and_time (e
->callee
, sum
);
3650 estimate_edge_size_and_time (e
, &size
, NULL
, &time
, NULL
, NULL
);
3652 ipa_predicate pred
= true;
3653 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
3656 pred
= *es
->predicate
;
3657 sum
->account_size_time (size
, time
, pred
, pred
, true);
3659 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
3664 estimate_edge_size_and_time (e
, &size
, NULL
, &time
, NULL
, NULL
);
3665 ipa_predicate pred
= true;
3666 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
3669 pred
= *es
->predicate
;
3670 sum
->account_size_time (size
, time
, pred
, pred
, true);
3674 /* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
3675 calls in NODE. POSSIBLE_TRUTHS and AVALS (the latter if non-NULL) describe
3676 context of the call site. */
3679 estimate_calls_size_and_time (struct cgraph_node
*node
, int *size
,
3680 int *min_size
, sreal
*time
,
3682 clause_t possible_truths
,
3683 ipa_call_arg_values
*avals
)
3685 class ipa_fn_summary
*sum
= ipa_fn_summaries
->get (node
);
3686 bool use_table
= true;
3688 gcc_assert (node
->callees
|| node
->indirect_calls
);
3690 /* During early inlining we do not calculate info for very
3691 large functions and thus there is no need for producing
3693 if (!ipa_node_params_sum
)
3695 /* Do not calculate summaries for simple wrappers; it is waste
3697 else if (node
->callees
&& node
->indirect_calls
3698 && node
->callees
->inline_failed
&& !node
->callees
->next_callee
)
3700 /* If there is an indirect edge that may be optimized, we need
3701 to go the slow way. */
3702 else if (avals
&& hints
3703 && (avals
->m_known_vals
.length ()
3704 || avals
->m_known_contexts
.length ()
3705 || avals
->m_known_aggs
.length ()))
3707 ipa_node_params
*params_summary
= ipa_node_params_sum
->get (node
);
3708 unsigned int nargs
= params_summary
3709 ? ipa_get_param_count (params_summary
) : 0;
3711 for (unsigned int i
= 0; i
< nargs
&& use_table
; i
++)
3713 if (ipa_is_param_used_by_indirect_call (params_summary
, i
)
3714 && (avals
->safe_sval_at (i
)
3715 || (ipa_argagg_value_list (avals
).value_for_index_p (i
))))
3717 else if (ipa_is_param_used_by_polymorphic_call (params_summary
, i
)
3718 && (avals
->m_known_contexts
.length () > i
3719 && !avals
->m_known_contexts
[i
].useless_p ()))
3724 /* Fast path is via the call size time table. */
3727 /* Build summary if it is absent. */
3728 if (!sum
->call_size_time_table
.length ())
3730 ipa_predicate true_pred
= true;
3731 sum
->account_size_time (0, 0, true_pred
, true_pred
, true);
3732 summarize_calls_size_and_time (node
, sum
);
3735 int old_size
= *size
;
3736 sreal old_time
= time
? *time
: 0;
3739 *min_size
+= sum
->call_size_time_table
[0].size
;
3744 /* Walk the table and account sizes and times. */
3745 for (i
= 0; sum
->call_size_time_table
.iterate (i
, &e
);
3747 if (e
->exec_predicate
.evaluate (possible_truths
))
3754 /* Be careful and see if both methods agree. */
3755 if ((flag_checking
|| dump_file
)
3756 /* Do not try to sanity check when we know we lost some
3758 && sum
->call_size_time_table
.length ()
3759 < ipa_fn_summary::max_size_time_table_size
)
3761 estimate_calls_size_and_time_1 (node
, &old_size
, NULL
, &old_time
, NULL
,
3762 possible_truths
, avals
);
3763 gcc_assert (*size
== old_size
);
3764 if (time
&& (*time
- old_time
> 1 || *time
- old_time
< -1)
3766 fprintf (dump_file
, "Time mismatch in call summary %f!=%f\n",
3767 old_time
.to_double (),
3768 time
->to_double ());
3771 /* Slow path by walking all edges. */
3773 estimate_calls_size_and_time_1 (node
, size
, min_size
, time
, hints
,
3774 possible_truths
, avals
);
3777 /* Main constructor for ipa call context. Memory allocation of ARG_VALUES
3778 is owned by the caller. INLINE_PARAM_SUMMARY is also owned by the
3781 ipa_call_context::ipa_call_context (cgraph_node
*node
, clause_t possible_truths
,
3782 clause_t nonspec_possible_truths
,
3783 vec
<inline_param_summary
>
3784 inline_param_summary
,
3785 ipa_auto_call_arg_values
*arg_values
)
3786 : m_node (node
), m_possible_truths (possible_truths
),
3787 m_nonspec_possible_truths (nonspec_possible_truths
),
3788 m_inline_param_summary (inline_param_summary
),
3789 m_avals (arg_values
)
3793 /* Set THIS to be a duplicate of CTX. Copy all relevant info. */
3796 ipa_cached_call_context::duplicate_from (const ipa_call_context
&ctx
)
3798 m_node
= ctx
.m_node
;
3799 m_possible_truths
= ctx
.m_possible_truths
;
3800 m_nonspec_possible_truths
= ctx
.m_nonspec_possible_truths
;
3801 ipa_node_params
*params_summary
= ipa_node_params_sum
->get (m_node
);
3802 unsigned int nargs
= params_summary
3803 ? ipa_get_param_count (params_summary
) : 0;
3805 m_inline_param_summary
= vNULL
;
3806 /* Copy the info only if there is at least one useful entry. */
3807 if (ctx
.m_inline_param_summary
.exists ())
3809 unsigned int n
= MIN (ctx
.m_inline_param_summary
.length (), nargs
);
3811 for (unsigned int i
= 0; i
< n
; i
++)
3812 if (ipa_is_param_used_by_ipa_predicates (params_summary
, i
)
3813 && !ctx
.m_inline_param_summary
[i
].useless_p ())
3815 m_inline_param_summary
3816 = ctx
.m_inline_param_summary
.copy ();
3820 m_avals
.m_known_vals
= vNULL
;
3821 if (ctx
.m_avals
.m_known_vals
.exists ())
3823 unsigned int n
= MIN (ctx
.m_avals
.m_known_vals
.length (), nargs
);
3825 for (unsigned int i
= 0; i
< n
; i
++)
3826 if (ipa_is_param_used_by_indirect_call (params_summary
, i
)
3827 && ctx
.m_avals
.m_known_vals
[i
])
3829 m_avals
.m_known_vals
= ctx
.m_avals
.m_known_vals
.copy ();
3834 m_avals
.m_known_contexts
= vNULL
;
3835 if (ctx
.m_avals
.m_known_contexts
.exists ())
3837 unsigned int n
= MIN (ctx
.m_avals
.m_known_contexts
.length (), nargs
);
3839 for (unsigned int i
= 0; i
< n
; i
++)
3840 if (ipa_is_param_used_by_polymorphic_call (params_summary
, i
)
3841 && !ctx
.m_avals
.m_known_contexts
[i
].useless_p ())
3843 m_avals
.m_known_contexts
= ctx
.m_avals
.m_known_contexts
.copy ();
3848 m_avals
.m_known_aggs
= vNULL
;
3849 if (ctx
.m_avals
.m_known_aggs
.exists ())
3851 const ipa_argagg_value_list
avl (&ctx
.m_avals
);
3852 for (unsigned int i
= 0; i
< nargs
; i
++)
3853 if (ipa_is_param_used_by_indirect_call (params_summary
, i
)
3854 && avl
.value_for_index_p (i
))
3856 m_avals
.m_known_aggs
= ctx
.m_avals
.m_known_aggs
.copy ();
3861 m_avals
.m_known_value_ranges
= vNULL
;
3864 /* Release memory used by known_vals/contexts/aggs vectors. and
3865 inline_param_summary. */
3868 ipa_cached_call_context::release ()
3870 /* See if context is initialized at first place. */
3873 m_avals
.m_known_aggs
.release ();
3874 m_avals
.m_known_vals
.release ();
3875 m_avals
.m_known_contexts
.release ();
3876 m_inline_param_summary
.release ();
3879 /* Return true if CTX describes the same call context as THIS. */
3882 ipa_call_context::equal_to (const ipa_call_context
&ctx
)
3884 if (m_node
!= ctx
.m_node
3885 || m_possible_truths
!= ctx
.m_possible_truths
3886 || m_nonspec_possible_truths
!= ctx
.m_nonspec_possible_truths
)
3889 ipa_node_params
*params_summary
= ipa_node_params_sum
->get (m_node
);
3890 unsigned int nargs
= params_summary
3891 ? ipa_get_param_count (params_summary
) : 0;
3893 if (m_inline_param_summary
.exists () || ctx
.m_inline_param_summary
.exists ())
3895 for (unsigned int i
= 0; i
< nargs
; i
++)
3897 if (!ipa_is_param_used_by_ipa_predicates (params_summary
, i
))
3899 if (i
>= m_inline_param_summary
.length ()
3900 || m_inline_param_summary
[i
].useless_p ())
3902 if (i
< ctx
.m_inline_param_summary
.length ()
3903 && !ctx
.m_inline_param_summary
[i
].useless_p ())
3907 if (i
>= ctx
.m_inline_param_summary
.length ()
3908 || ctx
.m_inline_param_summary
[i
].useless_p ())
3910 if (i
< m_inline_param_summary
.length ()
3911 && !m_inline_param_summary
[i
].useless_p ())
3915 if (!m_inline_param_summary
[i
].equal_to
3916 (ctx
.m_inline_param_summary
[i
]))
3920 if (m_avals
.m_known_vals
.exists () || ctx
.m_avals
.m_known_vals
.exists ())
3922 for (unsigned int i
= 0; i
< nargs
; i
++)
3924 if (!ipa_is_param_used_by_indirect_call (params_summary
, i
))
3926 if (i
>= m_avals
.m_known_vals
.length () || !m_avals
.m_known_vals
[i
])
3928 if (i
< ctx
.m_avals
.m_known_vals
.length ()
3929 && ctx
.m_avals
.m_known_vals
[i
])
3933 if (i
>= ctx
.m_avals
.m_known_vals
.length ()
3934 || !ctx
.m_avals
.m_known_vals
[i
])
3936 if (i
< m_avals
.m_known_vals
.length () && m_avals
.m_known_vals
[i
])
3940 if (m_avals
.m_known_vals
[i
] != ctx
.m_avals
.m_known_vals
[i
])
3944 if (m_avals
.m_known_contexts
.exists ()
3945 || ctx
.m_avals
.m_known_contexts
.exists ())
3947 for (unsigned int i
= 0; i
< nargs
; i
++)
3949 if (!ipa_is_param_used_by_polymorphic_call (params_summary
, i
))
3951 if (i
>= m_avals
.m_known_contexts
.length ()
3952 || m_avals
.m_known_contexts
[i
].useless_p ())
3954 if (i
< ctx
.m_avals
.m_known_contexts
.length ()
3955 && !ctx
.m_avals
.m_known_contexts
[i
].useless_p ())
3959 if (i
>= ctx
.m_avals
.m_known_contexts
.length ()
3960 || ctx
.m_avals
.m_known_contexts
[i
].useless_p ())
3962 if (i
< m_avals
.m_known_contexts
.length ()
3963 && !m_avals
.m_known_contexts
[i
].useless_p ())
3967 if (!m_avals
.m_known_contexts
[i
].equal_to
3968 (ctx
.m_avals
.m_known_contexts
[i
]))
3972 if (m_avals
.m_known_aggs
.exists () || ctx
.m_avals
.m_known_aggs
.exists ())
3974 unsigned i
= 0, j
= 0;
3975 while (i
< m_avals
.m_known_aggs
.length ()
3976 || j
< ctx
.m_avals
.m_known_aggs
.length ())
3978 if (i
>= m_avals
.m_known_aggs
.length ())
3980 int idx2
= ctx
.m_avals
.m_known_aggs
[j
].index
;
3981 if (ipa_is_param_used_by_indirect_call (params_summary
, idx2
))
3986 if (j
>= ctx
.m_avals
.m_known_aggs
.length ())
3988 int idx1
= m_avals
.m_known_aggs
[i
].index
;
3989 if (ipa_is_param_used_by_indirect_call (params_summary
, idx1
))
3995 int idx1
= m_avals
.m_known_aggs
[i
].index
;
3996 int idx2
= ctx
.m_avals
.m_known_aggs
[j
].index
;
3999 if (ipa_is_param_used_by_indirect_call (params_summary
, idx1
))
4006 if (ipa_is_param_used_by_indirect_call (params_summary
, idx2
))
4011 if (!ipa_is_param_used_by_indirect_call (params_summary
, idx1
))
4018 if ((m_avals
.m_known_aggs
[i
].unit_offset
4019 != ctx
.m_avals
.m_known_aggs
[j
].unit_offset
)
4020 || (m_avals
.m_known_aggs
[i
].by_ref
4021 != ctx
.m_avals
.m_known_aggs
[j
].by_ref
)
4022 || !operand_equal_p (m_avals
.m_known_aggs
[i
].value
,
4023 ctx
.m_avals
.m_known_aggs
[j
].value
))
4032 /* Fill in the selected fields in ESTIMATES with value estimated for call in
4033 this context. Always compute size and min_size. Only compute time and
4034 nonspecialized_time if EST_TIMES is true. Only compute hints if EST_HINTS
4038 ipa_call_context::estimate_size_and_time (ipa_call_estimates
*estimates
,
4039 bool est_times
, bool est_hints
)
4041 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (m_node
);
4046 ipa_hints hints
= 0;
4047 sreal loops_with_known_iterations
= 0;
4048 sreal loops_with_known_strides
= 0;
4051 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4054 fprintf (dump_file
, " Estimating body: %s\n"
4055 " Known to be false: ", m_node
->dump_name ());
4057 for (i
= ipa_predicate::not_inlined_condition
;
4058 i
< (ipa_predicate::first_dynamic_condition
4059 + (int) vec_safe_length (info
->conds
)); i
++)
4060 if (!(m_possible_truths
& (1 << i
)))
4063 fprintf (dump_file
, ", ");
4065 dump_condition (dump_file
, info
->conds
, i
);
4069 if (m_node
->callees
|| m_node
->indirect_calls
)
4070 estimate_calls_size_and_time (m_node
, &size
, &min_size
,
4071 est_times
? &time
: NULL
,
4072 est_hints
? &hints
: NULL
, m_possible_truths
,
4075 sreal nonspecialized_time
= time
;
4077 min_size
+= info
->size_time_table
[0].size
;
4078 for (i
= 0; info
->size_time_table
.iterate (i
, &e
); i
++)
4080 bool exec
= e
->exec_predicate
.evaluate (m_nonspec_possible_truths
);
4082 /* Because predicates are conservative, it can happen that nonconst is 1
4086 bool nonconst
= e
->nonconst_predicate
.evaluate (m_possible_truths
);
4088 gcc_checking_assert (e
->time
>= 0);
4089 gcc_checking_assert (time
>= 0);
4091 /* We compute specialized size only because size of nonspecialized
4092 copy is context independent.
4094 The difference between nonspecialized execution and specialized is
4095 that nonspecialized is not going to have optimized out computations
4096 known to be constant in a specialized setting. */
4101 nonspecialized_time
+= e
->time
;
4104 else if (!m_inline_param_summary
.exists ())
4111 int prob
= e
->nonconst_predicate
.probability
4112 (info
->conds
, m_possible_truths
,
4113 m_inline_param_summary
);
4114 gcc_checking_assert (prob
>= 0);
4115 gcc_checking_assert (prob
<= REG_BR_PROB_BASE
);
4116 if (prob
== REG_BR_PROB_BASE
)
4119 time
+= e
->time
* prob
/ REG_BR_PROB_BASE
;
4121 gcc_checking_assert (time
>= 0);
4124 gcc_checking_assert (info
->size_time_table
[0].exec_predicate
== true);
4125 gcc_checking_assert (info
->size_time_table
[0].nonconst_predicate
== true);
4126 gcc_checking_assert (min_size
>= 0);
4127 gcc_checking_assert (size
>= 0);
4128 gcc_checking_assert (time
>= 0);
4129 /* nonspecialized_time should be always bigger than specialized time.
4130 Roundoff issues however may get into the way. */
4131 gcc_checking_assert ((nonspecialized_time
- time
* 99 / 100) >= -1);
4133 /* Roundoff issues may make specialized time bigger than nonspecialized
4134 time. We do not really want that to happen because some heuristics
4135 may get confused by seeing negative speedups. */
4136 if (time
> nonspecialized_time
)
4137 time
= nonspecialized_time
;
4142 hints
|= INLINE_HINT_in_scc
;
4143 if (DECL_DECLARED_INLINE_P (m_node
->decl
))
4144 hints
|= INLINE_HINT_declared_inline
;
4145 if (info
->builtin_constant_p_parms
.length ()
4146 && DECL_DECLARED_INLINE_P (m_node
->decl
))
4147 hints
|= INLINE_HINT_builtin_constant_p
;
4149 ipa_freqcounting_predicate
*fcp
;
4150 for (i
= 0; vec_safe_iterate (info
->loop_iterations
, i
, &fcp
); i
++)
4151 if (!fcp
->predicate
->evaluate (m_possible_truths
))
4153 hints
|= INLINE_HINT_loop_iterations
;
4154 loops_with_known_iterations
+= fcp
->freq
;
4156 estimates
->loops_with_known_iterations
= loops_with_known_iterations
;
4158 for (i
= 0; vec_safe_iterate (info
->loop_strides
, i
, &fcp
); i
++)
4159 if (!fcp
->predicate
->evaluate (m_possible_truths
))
4161 hints
|= INLINE_HINT_loop_stride
;
4162 loops_with_known_strides
+= fcp
->freq
;
4164 estimates
->loops_with_known_strides
= loops_with_known_strides
;
4167 size
= RDIV (size
, ipa_fn_summary::size_scale
);
4168 min_size
= RDIV (min_size
, ipa_fn_summary::size_scale
);
4170 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4172 fprintf (dump_file
, "\n size:%i", (int) size
);
4174 fprintf (dump_file
, " time:%f nonspec time:%f",
4175 time
.to_double (), nonspecialized_time
.to_double ());
4177 fprintf (dump_file
, " loops with known iterations:%f "
4178 "known strides:%f", loops_with_known_iterations
.to_double (),
4179 loops_with_known_strides
.to_double ());
4180 fprintf (dump_file
, "\n");
4184 estimates
->time
= time
;
4185 estimates
->nonspecialized_time
= nonspecialized_time
;
4187 estimates
->size
= size
;
4188 estimates
->min_size
= min_size
;
4190 estimates
->hints
= hints
;
4195 /* Estimate size and time needed to execute callee of EDGE assuming that
4196 parameters known to be constant at caller of EDGE are propagated.
4197 KNOWN_VALS and KNOWN_CONTEXTS are vectors of assumed known constant values
4198 and types for parameters. */
4201 estimate_ipcp_clone_size_and_time (struct cgraph_node
*node
,
4202 ipa_auto_call_arg_values
*avals
,
4203 ipa_call_estimates
*estimates
)
4205 clause_t clause
, nonspec_clause
;
4207 evaluate_conditions_for_known_args (node
, false, avals
, &clause
,
4208 &nonspec_clause
, NULL
);
4209 ipa_call_context
ctx (node
, clause
, nonspec_clause
, vNULL
, avals
);
4210 ctx
.estimate_size_and_time (estimates
);
4213 /* Return stack frame offset where frame of NODE is supposed to start inside
4214 of the function it is inlined to.
4215 Return 0 for functions that are not inlined. */
4218 ipa_get_stack_frame_offset (struct cgraph_node
*node
)
4220 HOST_WIDE_INT offset
= 0;
4221 if (!node
->inlined_to
)
4223 node
= node
->callers
->caller
;
4226 offset
+= ipa_size_summaries
->get (node
)->estimated_self_stack_size
;
4227 if (!node
->inlined_to
)
4229 node
= node
->callers
->caller
;
4234 /* Update summary information of inline clones after inlining.
4235 Compute peak stack usage. */
4238 inline_update_callee_summaries (struct cgraph_node
*node
, int depth
)
4240 struct cgraph_edge
*e
;
4242 ipa_propagate_frequency (node
);
4243 for (e
= node
->callees
; e
; e
= e
->next_callee
)
4245 if (!e
->inline_failed
)
4246 inline_update_callee_summaries (e
->callee
, depth
);
4248 ipa_call_summaries
->get (e
)->loop_depth
+= depth
;
4250 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
4251 ipa_call_summaries
->get (e
)->loop_depth
+= depth
;
4254 /* Update change_prob and points_to_local_or_readonly_memory of EDGE after
4255 INLINED_EDGE has been inlined.
4257 When function A is inlined in B and A calls C with parameter that
4258 changes with probability PROB1 and C is known to be passthrough
4259 of argument if B that change with probability PROB2, the probability
4260 of change is now PROB1*PROB2. */
4263 remap_edge_params (struct cgraph_edge
*inlined_edge
,
4264 struct cgraph_edge
*edge
)
4266 if (ipa_node_params_sum
)
4269 ipa_edge_args
*args
= ipa_edge_args_sum
->get (edge
);
4272 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
4273 class ipa_call_summary
*inlined_es
4274 = ipa_call_summaries
->get (inlined_edge
);
4276 if (es
->param
.length () == 0)
4279 for (i
= 0; i
< ipa_get_cs_argument_count (args
); i
++)
4281 struct ipa_jump_func
*jfunc
= ipa_get_ith_jump_func (args
, i
);
4282 if (jfunc
->type
== IPA_JF_PASS_THROUGH
4283 || jfunc
->type
== IPA_JF_ANCESTOR
)
4285 int id
= jfunc
->type
== IPA_JF_PASS_THROUGH
4286 ? ipa_get_jf_pass_through_formal_id (jfunc
)
4287 : ipa_get_jf_ancestor_formal_id (jfunc
);
4288 if (id
< (int) inlined_es
->param
.length ())
4290 int prob1
= es
->param
[i
].change_prob
;
4291 int prob2
= inlined_es
->param
[id
].change_prob
;
4292 int prob
= combine_probabilities (prob1
, prob2
);
4294 if (prob1
&& prob2
&& !prob
)
4297 es
->param
[i
].change_prob
= prob
;
4300 ->param
[id
].points_to_local_or_readonly_memory
)
4301 es
->param
[i
].points_to_local_or_readonly_memory
= true;
4303 ->param
[id
].points_to_possible_sra_candidate
)
4304 es
->param
[i
].points_to_possible_sra_candidate
= true;
4306 if (!es
->param
[i
].points_to_local_or_readonly_memory
4307 && jfunc
->type
== IPA_JF_CONST
4308 && points_to_local_or_readonly_memory_p
4309 (ipa_get_jf_constant (jfunc
)))
4310 es
->param
[i
].points_to_local_or_readonly_memory
= true;
4316 /* Update edge summaries of NODE after INLINED_EDGE has been inlined.
4318 Remap predicates of callees of NODE. Rest of arguments match
4321 Also update change probabilities. */
4324 remap_edge_summaries (struct cgraph_edge
*inlined_edge
,
4325 struct cgraph_node
*node
,
4326 class ipa_fn_summary
*info
,
4327 class ipa_node_params
*params_summary
,
4328 class ipa_fn_summary
*callee_info
,
4329 const vec
<int> &operand_map
,
4330 const vec
<HOST_WIDE_INT
> &offset_map
,
4331 clause_t possible_truths
,
4332 ipa_predicate
*toplev_predicate
)
4334 struct cgraph_edge
*e
, *next
;
4335 for (e
= node
->callees
; e
; e
= next
)
4338 next
= e
->next_callee
;
4340 if (e
->inline_failed
)
4342 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
4343 remap_edge_params (inlined_edge
, e
);
4347 p
= es
->predicate
->remap_after_inlining
4348 (info
, params_summary
,
4349 callee_info
, operand_map
,
4350 offset_map
, possible_truths
,
4352 edge_set_predicate (e
, &p
);
4355 edge_set_predicate (e
, toplev_predicate
);
4358 remap_edge_summaries (inlined_edge
, e
->callee
, info
,
4359 params_summary
, callee_info
,
4360 operand_map
, offset_map
, possible_truths
,
4363 for (e
= node
->indirect_calls
; e
; e
= next
)
4365 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
4367 next
= e
->next_callee
;
4369 remap_edge_params (inlined_edge
, e
);
4372 p
= es
->predicate
->remap_after_inlining
4373 (info
, params_summary
,
4374 callee_info
, operand_map
, offset_map
,
4375 possible_truths
, *toplev_predicate
);
4376 edge_set_predicate (e
, &p
);
4379 edge_set_predicate (e
, toplev_predicate
);
4383 /* Run remap_after_inlining on each predicate in V. */
4386 remap_freqcounting_predicate (class ipa_fn_summary
*info
,
4387 class ipa_node_params
*params_summary
,
4388 class ipa_fn_summary
*callee_info
,
4389 vec
<ipa_freqcounting_predicate
, va_gc
> *v
,
4390 const vec
<int> &operand_map
,
4391 const vec
<HOST_WIDE_INT
> &offset_map
,
4392 clause_t possible_truths
,
4393 ipa_predicate
*toplev_predicate
)
4396 ipa_freqcounting_predicate
*fcp
;
4397 for (int i
= 0; vec_safe_iterate (v
, i
, &fcp
); i
++)
4400 = fcp
->predicate
->remap_after_inlining (info
, params_summary
,
4401 callee_info
, operand_map
,
4402 offset_map
, possible_truths
,
4404 if (p
!= false && p
!= true)
4405 *fcp
->predicate
&= p
;
4409 /* We inlined EDGE. Update summary of the function we inlined into. */
4412 ipa_merge_fn_summary_after_inlining (struct cgraph_edge
*edge
)
4414 ipa_fn_summary
*callee_info
= ipa_fn_summaries
->get (edge
->callee
);
4415 struct cgraph_node
*to
= (edge
->caller
->inlined_to
4416 ? edge
->caller
->inlined_to
: edge
->caller
);
4417 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (to
);
4418 clause_t clause
= 0; /* not_inline is known to be false. */
4420 auto_vec
<int, 8> operand_map
;
4421 auto_vec
<HOST_WIDE_INT
, 8> offset_map
;
4423 ipa_predicate toplev_predicate
;
4424 class ipa_call_summary
*es
= ipa_call_summaries
->get (edge
);
4425 ipa_node_params
*params_summary
= (ipa_node_params_sum
4426 ? ipa_node_params_sum
->get (to
) : NULL
);
4429 toplev_predicate
= *es
->predicate
;
4431 toplev_predicate
= true;
4433 info
->fp_expressions
|= callee_info
->fp_expressions
;
4434 info
->target_info
|= callee_info
->target_info
;
4436 if (callee_info
->conds
)
4438 ipa_auto_call_arg_values avals
;
4439 evaluate_properties_for_edge (edge
, true, &clause
, NULL
, &avals
, false);
4441 if (ipa_node_params_sum
&& callee_info
->conds
)
4443 ipa_edge_args
*args
= ipa_edge_args_sum
->get (edge
);
4444 int count
= args
? ipa_get_cs_argument_count (args
) : 0;
4449 operand_map
.safe_grow_cleared (count
, true);
4450 offset_map
.safe_grow_cleared (count
, true);
4452 for (i
= 0; i
< count
; i
++)
4454 struct ipa_jump_func
*jfunc
= ipa_get_ith_jump_func (args
, i
);
4457 /* TODO: handle non-NOPs when merging. */
4458 if (jfunc
->type
== IPA_JF_PASS_THROUGH
)
4460 if (ipa_get_jf_pass_through_operation (jfunc
) == NOP_EXPR
)
4461 map
= ipa_get_jf_pass_through_formal_id (jfunc
);
4462 if (!ipa_get_jf_pass_through_agg_preserved (jfunc
))
4465 else if (jfunc
->type
== IPA_JF_ANCESTOR
)
4467 HOST_WIDE_INT offset
= ipa_get_jf_ancestor_offset (jfunc
);
4468 if (offset
>= 0 && offset
< INT_MAX
)
4470 map
= ipa_get_jf_ancestor_formal_id (jfunc
);
4471 if (!ipa_get_jf_ancestor_agg_preserved (jfunc
))
4473 offset_map
[i
] = offset
;
4476 operand_map
[i
] = map
;
4477 gcc_assert (map
< ipa_get_param_count (params_summary
));
4481 for (i
= 0; callee_info
->builtin_constant_p_parms
.iterate (i
, &ip
); i
++)
4482 if (ip
< count
&& operand_map
[ip
] >= 0)
4483 add_builtin_constant_p_parm (info
, operand_map
[ip
]);
4485 sreal freq
= edge
->sreal_frequency ();
4486 for (i
= 0; callee_info
->size_time_table
.iterate (i
, &e
); i
++)
4489 p
= e
->exec_predicate
.remap_after_inlining
4490 (info
, params_summary
,
4491 callee_info
, operand_map
,
4494 ipa_predicate nonconstp
;
4495 nonconstp
= e
->nonconst_predicate
.remap_after_inlining
4496 (info
, params_summary
,
4497 callee_info
, operand_map
,
4500 if (p
!= false && nonconstp
!= false)
4502 sreal add_time
= ((sreal
)e
->time
* freq
);
4503 int prob
= e
->nonconst_predicate
.probability (callee_info
->conds
,
4505 if (prob
!= REG_BR_PROB_BASE
)
4506 add_time
= add_time
* prob
/ REG_BR_PROB_BASE
;
4507 if (prob
!= REG_BR_PROB_BASE
4508 && dump_file
&& (dump_flags
& TDF_DETAILS
))
4510 fprintf (dump_file
, "\t\tScaling time by probability:%f\n",
4511 (double) prob
/ REG_BR_PROB_BASE
);
4513 info
->account_size_time (e
->size
, add_time
, p
, nonconstp
);
4516 remap_edge_summaries (edge
, edge
->callee
, info
, params_summary
,
4517 callee_info
, operand_map
,
4518 offset_map
, clause
, &toplev_predicate
);
4519 remap_freqcounting_predicate (info
, params_summary
, callee_info
,
4520 info
->loop_iterations
, operand_map
,
4521 offset_map
, clause
, &toplev_predicate
);
4522 remap_freqcounting_predicate (info
, params_summary
, callee_info
,
4523 info
->loop_strides
, operand_map
,
4524 offset_map
, clause
, &toplev_predicate
);
4526 HOST_WIDE_INT stack_frame_offset
= ipa_get_stack_frame_offset (edge
->callee
);
4527 HOST_WIDE_INT peak
= stack_frame_offset
+ callee_info
->estimated_stack_size
;
4529 if (info
->estimated_stack_size
< peak
)
4530 info
->estimated_stack_size
= peak
;
4532 inline_update_callee_summaries (edge
->callee
, es
->loop_depth
);
4533 if (info
->call_size_time_table
.length ())
4536 sreal edge_time
= 0;
4538 estimate_edge_size_and_time (edge
, &edge_size
, NULL
, &edge_time
, NULL
, 0);
4539 /* Unaccount size and time of the optimized out call. */
4540 info
->account_size_time (-edge_size
, -edge_time
,
4541 es
->predicate
? *es
->predicate
: true,
4542 es
->predicate
? *es
->predicate
: true,
4544 /* Account new calls. */
4545 summarize_calls_size_and_time (edge
->callee
, info
);
4548 /* Free summaries that are not maintained for inline clones/edges. */
4549 ipa_call_summaries
->remove (edge
);
4550 ipa_fn_summaries
->remove (edge
->callee
);
4551 ipa_remove_from_growth_caches (edge
);
4554 /* For performance reasons ipa_merge_fn_summary_after_inlining is not updating
4555 overall size and time. Recompute it.
4556 If RESET is true also recompute call_time_size_table. */
4559 ipa_update_overall_fn_summary (struct cgraph_node
*node
, bool reset
)
4561 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (node
);
4562 class ipa_size_summary
*size_info
= ipa_size_summaries
->get (node
);
4566 size_info
->size
= 0;
4568 for (i
= 0; info
->size_time_table
.iterate (i
, &e
); i
++)
4570 size_info
->size
+= e
->size
;
4571 info
->time
+= e
->time
;
4573 info
->min_size
= info
->size_time_table
[0].size
;
4575 info
->call_size_time_table
.release ();
4576 if (node
->callees
|| node
->indirect_calls
)
4577 estimate_calls_size_and_time (node
, &size_info
->size
, &info
->min_size
,
4579 ~(clause_t
) (1 << ipa_predicate::false_condition
),
4581 size_info
->size
= RDIV (size_info
->size
, ipa_fn_summary::size_scale
);
4582 info
->min_size
= RDIV (info
->min_size
, ipa_fn_summary::size_scale
);
4586 /* This function performs intraprocedural analysis in NODE that is required to
4587 inline indirect calls. */
4590 inline_indirect_intraprocedural_analysis (struct cgraph_node
*node
)
4592 ipa_analyze_node (node
);
4593 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4595 ipa_print_node_params (dump_file
, node
);
4596 ipa_print_node_jump_functions (dump_file
, node
);
4601 /* Note function body size. */
4604 inline_analyze_function (struct cgraph_node
*node
)
4606 push_cfun (DECL_STRUCT_FUNCTION (node
->decl
));
4609 fprintf (dump_file
, "\nAnalyzing function: %s\n", node
->dump_name ());
4610 if (opt_for_fn (node
->decl
, optimize
) && !node
->thunk
)
4611 inline_indirect_intraprocedural_analysis (node
);
4612 compute_fn_summary (node
, false);
4615 struct cgraph_edge
*e
;
4616 for (e
= node
->callees
; e
; e
= e
->next_callee
)
4617 e
->inline_failed
= CIF_FUNCTION_NOT_OPTIMIZED
;
4618 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
4619 e
->inline_failed
= CIF_FUNCTION_NOT_OPTIMIZED
;
4626 /* Called when new function is inserted to callgraph late. */
4629 ipa_fn_summary_t::insert (struct cgraph_node
*node
, ipa_fn_summary
*)
4631 inline_analyze_function (node
);
4634 /* Note function body size. */
4637 ipa_fn_summary_generate (void)
4639 struct cgraph_node
*node
;
4641 FOR_EACH_DEFINED_FUNCTION (node
)
4642 if (DECL_STRUCT_FUNCTION (node
->decl
))
4643 node
->versionable
= tree_versionable_function_p (node
->decl
);
4645 ipa_fn_summary_alloc ();
4647 ipa_fn_summaries
->enable_insertion_hook ();
4649 ipa_register_cgraph_hooks ();
4651 FOR_EACH_DEFINED_FUNCTION (node
)
4653 && (flag_generate_lto
|| flag_generate_offload
|| flag_wpa
4654 || opt_for_fn (node
->decl
, optimize
)))
4655 inline_analyze_function (node
);
4659 /* Write inline summary for edge E to OB. */
4662 read_ipa_call_summary (class lto_input_block
*ib
, struct cgraph_edge
*e
,
4665 class ipa_call_summary
*es
= prevails
4666 ? ipa_call_summaries
->get_create (e
) : NULL
;
4670 int size
= streamer_read_uhwi (ib
);
4671 int time
= streamer_read_uhwi (ib
);
4672 int depth
= streamer_read_uhwi (ib
);
4676 es
->call_stmt_size
= size
;
4677 es
->call_stmt_time
= time
;
4678 es
->loop_depth
= depth
;
4681 bitpack_d bp
= streamer_read_bitpack (ib
);
4683 es
->is_return_callee_uncaptured
= bp_unpack_value (&bp
, 1);
4685 bp_unpack_value (&bp
, 1);
4689 edge_set_predicate (e
, &p
);
4690 length
= streamer_read_uhwi (ib
);
4692 && (e
->possibly_call_in_translation_unit_p ()
4693 /* Also stream in jump functions to builtins in hope that they
4694 will get fnspecs. */
4695 || fndecl_built_in_p (e
->callee
->decl
, BUILT_IN_NORMAL
)))
4697 es
->param
.safe_grow_cleared (length
, true);
4698 for (i
= 0; i
< length
; i
++)
4700 es
->param
[i
].change_prob
= streamer_read_uhwi (ib
);
4701 bitpack_d bp
= streamer_read_bitpack (ib
);
4702 es
->param
[i
].points_to_local_or_readonly_memory
4703 = bp_unpack_value (&bp
, 1);
4704 es
->param
[i
].points_to_possible_sra_candidate
4705 = bp_unpack_value (&bp
, 1);
4710 for (i
= 0; i
< length
; i
++)
4712 streamer_read_uhwi (ib
);
4713 streamer_read_uhwi (ib
);
4719 /* Stream in inline summaries from the section. */
4722 inline_read_section (struct lto_file_decl_data
*file_data
, const char *data
,
4725 const struct lto_function_header
*header
=
4726 (const struct lto_function_header
*) data
;
4727 const int cfg_offset
= sizeof (struct lto_function_header
);
4728 const int main_offset
= cfg_offset
+ header
->cfg_size
;
4729 const int string_offset
= main_offset
+ header
->main_size
;
4730 class data_in
*data_in
;
4731 unsigned int i
, count2
, j
;
4732 unsigned int f_count
;
4734 lto_input_block
ib ((const char *) data
+ main_offset
, header
->main_size
,
4738 lto_data_in_create (file_data
, (const char *) data
+ string_offset
,
4739 header
->string_size
, vNULL
);
4740 f_count
= streamer_read_uhwi (&ib
);
4741 for (i
= 0; i
< f_count
; i
++)
4744 struct cgraph_node
*node
;
4745 class ipa_fn_summary
*info
;
4746 class ipa_node_params
*params_summary
;
4747 class ipa_size_summary
*size_info
;
4748 lto_symtab_encoder_t encoder
;
4749 struct bitpack_d bp
;
4750 struct cgraph_edge
*e
;
4753 index
= streamer_read_uhwi (&ib
);
4754 encoder
= file_data
->symtab_node_encoder
;
4755 node
= dyn_cast
<cgraph_node
*> (lto_symtab_encoder_deref (encoder
,
4757 info
= node
->prevailing_p () ? ipa_fn_summaries
->get_create (node
) : NULL
;
4758 params_summary
= node
->prevailing_p ()
4759 ? ipa_node_params_sum
->get (node
) : NULL
;
4760 size_info
= node
->prevailing_p ()
4761 ? ipa_size_summaries
->get_create (node
) : NULL
;
4763 int stack_size
= streamer_read_uhwi (&ib
);
4764 int size
= streamer_read_uhwi (&ib
);
4765 sreal time
= sreal::stream_in (&ib
);
4769 info
->estimated_stack_size
4770 = size_info
->estimated_self_stack_size
= stack_size
;
4771 size_info
->size
= size_info
->self_size
= size
;
4775 bp
= streamer_read_bitpack (&ib
);
4778 info
->inlinable
= bp_unpack_value (&bp
, 1);
4779 info
->fp_expressions
= bp_unpack_value (&bp
, 1);
4780 if (!lto_stream_offload_p
)
4781 info
->target_info
= streamer_read_uhwi (&ib
);
4785 bp_unpack_value (&bp
, 1);
4786 bp_unpack_value (&bp
, 1);
4787 if (!lto_stream_offload_p
)
4788 streamer_read_uhwi (&ib
);
4791 count2
= streamer_read_uhwi (&ib
);
4792 gcc_assert (!info
|| !info
->conds
);
4794 vec_safe_reserve_exact (info
->conds
, count2
);
4795 for (j
= 0; j
< count2
; j
++)
4798 unsigned int k
, count3
;
4799 c
.operand_num
= streamer_read_uhwi (&ib
);
4800 c
.code
= (enum tree_code
) streamer_read_uhwi (&ib
);
4801 c
.type
= stream_read_tree (&ib
, data_in
);
4802 c
.val
= stream_read_tree (&ib
, data_in
);
4803 bp
= streamer_read_bitpack (&ib
);
4804 c
.agg_contents
= bp_unpack_value (&bp
, 1);
4805 c
.by_ref
= bp_unpack_value (&bp
, 1);
4807 c
.offset
= streamer_read_uhwi (&ib
);
4808 count3
= streamer_read_uhwi (&ib
);
4811 vec_safe_reserve_exact (c
.param_ops
, count3
);
4813 ipa_set_param_used_by_ipa_predicates
4814 (params_summary
, c
.operand_num
, true);
4815 for (k
= 0; k
< count3
; k
++)
4817 struct expr_eval_op op
;
4818 enum gimple_rhs_class rhs_class
;
4819 op
.code
= (enum tree_code
) streamer_read_uhwi (&ib
);
4820 op
.type
= stream_read_tree (&ib
, data_in
);
4821 switch (rhs_class
= get_gimple_rhs_class (op
.code
))
4823 case GIMPLE_UNARY_RHS
:
4825 op
.val
[0] = NULL_TREE
;
4826 op
.val
[1] = NULL_TREE
;
4829 case GIMPLE_BINARY_RHS
:
4830 case GIMPLE_TERNARY_RHS
:
4831 bp
= streamer_read_bitpack (&ib
);
4832 op
.index
= bp_unpack_value (&bp
, 2);
4833 op
.val
[0] = stream_read_tree (&ib
, data_in
);
4834 if (rhs_class
== GIMPLE_BINARY_RHS
)
4835 op
.val
[1] = NULL_TREE
;
4837 op
.val
[1] = stream_read_tree (&ib
, data_in
);
4841 fatal_error (UNKNOWN_LOCATION
,
4842 "invalid fnsummary in LTO stream");
4845 c
.param_ops
->quick_push (op
);
4848 info
->conds
->quick_push (c
);
4850 count2
= streamer_read_uhwi (&ib
);
4851 gcc_assert (!info
|| !info
->size_time_table
.length ());
4853 info
->size_time_table
.reserve_exact (count2
);
4854 for (j
= 0; j
< count2
; j
++)
4856 class size_time_entry e
;
4858 e
.size
= streamer_read_uhwi (&ib
);
4859 e
.time
= sreal::stream_in (&ib
);
4860 e
.exec_predicate
.stream_in (&ib
);
4861 e
.nonconst_predicate
.stream_in (&ib
);
4864 info
->size_time_table
.quick_push (e
);
4867 count2
= streamer_read_uhwi (&ib
);
4868 for (j
= 0; j
< count2
; j
++)
4871 sreal fcp_freq
= sreal::stream_in (&ib
);
4874 ipa_freqcounting_predicate fcp
;
4875 fcp
.predicate
= NULL
;
4876 set_hint_predicate (&fcp
.predicate
, p
);
4877 fcp
.freq
= fcp_freq
;
4878 vec_safe_push (info
->loop_iterations
, fcp
);
4881 count2
= streamer_read_uhwi (&ib
);
4882 for (j
= 0; j
< count2
; j
++)
4885 sreal fcp_freq
= sreal::stream_in (&ib
);
4888 ipa_freqcounting_predicate fcp
;
4889 fcp
.predicate
= NULL
;
4890 set_hint_predicate (&fcp
.predicate
, p
);
4891 fcp
.freq
= fcp_freq
;
4892 vec_safe_push (info
->loop_strides
, fcp
);
4895 count2
= streamer_read_uhwi (&ib
);
4897 info
->builtin_constant_p_parms
.reserve_exact (count2
);
4898 for (j
= 0; j
< count2
; j
++)
4900 int parm
= streamer_read_uhwi (&ib
);
4902 info
->builtin_constant_p_parms
.quick_push (parm
);
4904 for (e
= node
->callees
; e
; e
= e
->next_callee
)
4905 read_ipa_call_summary (&ib
, e
, info
!= NULL
);
4906 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
4907 read_ipa_call_summary (&ib
, e
, info
!= NULL
);
4910 lto_free_section_data (file_data
, LTO_section_ipa_fn_summary
, NULL
, data
,
4912 lto_data_in_delete (data_in
);
4916 /* Read inline summary. Jump functions are shared among ipa-cp
4917 and inliner, so when ipa-cp is active, we don't need to write them
4921 ipa_fn_summary_read (void)
4923 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
4924 struct lto_file_decl_data
*file_data
;
4927 ipa_prop_read_jump_functions ();
4928 ipa_fn_summary_alloc ();
4930 while ((file_data
= file_data_vec
[j
++]))
4934 = lto_get_summary_section_data (file_data
, LTO_section_ipa_fn_summary
,
4937 inline_read_section (file_data
, data
, len
);
4939 /* Fatal error here. We do not want to support compiling ltrans units
4940 with different version of compiler or different flags than the WPA
4941 unit, so this should never happen. */
4942 fatal_error (input_location
,
4943 "ipa inline summary is missing in input file");
4945 ipa_register_cgraph_hooks ();
4947 gcc_assert (ipa_fn_summaries
);
4948 ipa_fn_summaries
->enable_insertion_hook ();
4952 /* Write inline summary for edge E to OB. */
4955 write_ipa_call_summary (struct output_block
*ob
, struct cgraph_edge
*e
)
4957 class ipa_call_summary
*es
= ipa_call_summaries
->get (e
);
4960 streamer_write_uhwi (ob
, es
->call_stmt_size
);
4961 streamer_write_uhwi (ob
, es
->call_stmt_time
);
4962 streamer_write_uhwi (ob
, es
->loop_depth
);
4964 bitpack_d bp
= bitpack_create (ob
->main_stream
);
4965 bp_pack_value (&bp
, es
->is_return_callee_uncaptured
, 1);
4966 streamer_write_bitpack (&bp
);
4969 es
->predicate
->stream_out (ob
);
4971 streamer_write_uhwi (ob
, 0);
4972 streamer_write_uhwi (ob
, es
->param
.length ());
4973 for (i
= 0; i
< (int) es
->param
.length (); i
++)
4975 streamer_write_uhwi (ob
, es
->param
[i
].change_prob
);
4976 bp
= bitpack_create (ob
->main_stream
);
4977 bp_pack_value (&bp
, es
->param
[i
].points_to_local_or_readonly_memory
, 1);
4978 bp_pack_value (&bp
, es
->param
[i
].points_to_possible_sra_candidate
, 1);
4979 streamer_write_bitpack (&bp
);
4984 /* Write inline summary for node in SET.
4985 Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
4986 active, we don't need to write them twice. */
4989 ipa_fn_summary_write (void)
4991 struct output_block
*ob
= create_output_block (LTO_section_ipa_fn_summary
);
4992 lto_symtab_encoder_iterator lsei
;
4993 lto_symtab_encoder_t encoder
= ob
->decl_state
->symtab_node_encoder
;
4994 unsigned int count
= 0;
4996 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
4997 lsei_next_function_in_partition (&lsei
))
4999 cgraph_node
*cnode
= lsei_cgraph_node (lsei
);
5000 if (cnode
->definition
&& !cnode
->alias
)
5003 streamer_write_uhwi (ob
, count
);
5005 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
5006 lsei_next_function_in_partition (&lsei
))
5008 cgraph_node
*cnode
= lsei_cgraph_node (lsei
);
5009 if (cnode
->definition
&& !cnode
->alias
)
5011 class ipa_fn_summary
*info
= ipa_fn_summaries
->get (cnode
);
5012 class ipa_size_summary
*size_info
= ipa_size_summaries
->get (cnode
);
5013 struct bitpack_d bp
;
5014 struct cgraph_edge
*edge
;
5017 struct condition
*c
;
5019 streamer_write_uhwi (ob
, lto_symtab_encoder_encode (encoder
, cnode
));
5020 streamer_write_hwi (ob
, size_info
->estimated_self_stack_size
);
5021 streamer_write_hwi (ob
, size_info
->self_size
);
5022 info
->time
.stream_out (ob
);
5023 bp
= bitpack_create (ob
->main_stream
);
5024 bp_pack_value (&bp
, info
->inlinable
, 1);
5025 bp_pack_value (&bp
, info
->fp_expressions
, 1);
5026 streamer_write_bitpack (&bp
);
5027 if (!lto_stream_offload_p
)
5028 streamer_write_uhwi (ob
, info
->target_info
);
5029 streamer_write_uhwi (ob
, vec_safe_length (info
->conds
));
5030 for (i
= 0; vec_safe_iterate (info
->conds
, i
, &c
); i
++)
5033 struct expr_eval_op
*op
;
5035 streamer_write_uhwi (ob
, c
->operand_num
);
5036 streamer_write_uhwi (ob
, c
->code
);
5037 stream_write_tree (ob
, c
->type
, true);
5038 stream_write_tree (ob
, c
->val
, true);
5039 bp
= bitpack_create (ob
->main_stream
);
5040 bp_pack_value (&bp
, c
->agg_contents
, 1);
5041 bp_pack_value (&bp
, c
->by_ref
, 1);
5042 streamer_write_bitpack (&bp
);
5043 if (c
->agg_contents
)
5044 streamer_write_uhwi (ob
, c
->offset
);
5045 streamer_write_uhwi (ob
, vec_safe_length (c
->param_ops
));
5046 for (j
= 0; vec_safe_iterate (c
->param_ops
, j
, &op
); j
++)
5048 streamer_write_uhwi (ob
, op
->code
);
5049 stream_write_tree (ob
, op
->type
, true);
5052 bp
= bitpack_create (ob
->main_stream
);
5053 bp_pack_value (&bp
, op
->index
, 2);
5054 streamer_write_bitpack (&bp
);
5055 stream_write_tree (ob
, op
->val
[0], true);
5057 stream_write_tree (ob
, op
->val
[1], true);
5061 streamer_write_uhwi (ob
, info
->size_time_table
.length ());
5062 for (i
= 0; info
->size_time_table
.iterate (i
, &e
); i
++)
5064 streamer_write_uhwi (ob
, e
->size
);
5065 e
->time
.stream_out (ob
);
5066 e
->exec_predicate
.stream_out (ob
);
5067 e
->nonconst_predicate
.stream_out (ob
);
5069 ipa_freqcounting_predicate
*fcp
;
5070 streamer_write_uhwi (ob
, vec_safe_length (info
->loop_iterations
));
5071 for (i
= 0; vec_safe_iterate (info
->loop_iterations
, i
, &fcp
); i
++)
5073 fcp
->predicate
->stream_out (ob
);
5074 fcp
->freq
.stream_out (ob
);
5076 streamer_write_uhwi (ob
, vec_safe_length (info
->loop_strides
));
5077 for (i
= 0; vec_safe_iterate (info
->loop_strides
, i
, &fcp
); i
++)
5079 fcp
->predicate
->stream_out (ob
);
5080 fcp
->freq
.stream_out (ob
);
5082 streamer_write_uhwi (ob
, info
->builtin_constant_p_parms
.length ());
5084 for (i
= 0; info
->builtin_constant_p_parms
.iterate (i
, &ip
);
5086 streamer_write_uhwi (ob
, ip
);
5087 for (edge
= cnode
->callees
; edge
; edge
= edge
->next_callee
)
5088 write_ipa_call_summary (ob
, edge
);
5089 for (edge
= cnode
->indirect_calls
; edge
; edge
= edge
->next_callee
)
5090 write_ipa_call_summary (ob
, edge
);
5093 streamer_write_char_stream (ob
->main_stream
, 0);
5095 destroy_output_block (ob
);
5097 ipa_prop_write_jump_functions ();
5101 /* Release function summary. */
5104 ipa_free_fn_summary (void)
5106 if (!ipa_call_summaries
)
5108 ggc_delete (ipa_fn_summaries
);
5109 ipa_fn_summaries
= NULL
;
5110 delete ipa_call_summaries
;
5111 ipa_call_summaries
= NULL
;
5112 edge_predicate_pool
.release ();
5113 /* During IPA this is one of largest datastructures to release. */
5118 /* Release function summary. */
5121 ipa_free_size_summary (void)
5123 if (!ipa_size_summaries
)
5125 delete ipa_size_summaries
;
5126 ipa_size_summaries
= NULL
;
5131 const pass_data pass_data_local_fn_summary
=
5133 GIMPLE_PASS
, /* type */
5134 "local-fnsummary", /* name */
5135 OPTGROUP_INLINE
, /* optinfo_flags */
5136 TV_INLINE_PARAMETERS
, /* tv_id */
5137 0, /* properties_required */
5138 0, /* properties_provided */
5139 0, /* properties_destroyed */
5140 0, /* todo_flags_start */
5141 0, /* todo_flags_finish */
5144 class pass_local_fn_summary
: public gimple_opt_pass
5147 pass_local_fn_summary (gcc::context
*ctxt
)
5148 : gimple_opt_pass (pass_data_local_fn_summary
, ctxt
)
5151 /* opt_pass methods: */
5152 opt_pass
* clone () final override
5154 return new pass_local_fn_summary (m_ctxt
);
5156 unsigned int execute (function
*) final override
5158 return compute_fn_summary_for_current ();
5161 }; // class pass_local_fn_summary
5166 make_pass_local_fn_summary (gcc::context
*ctxt
)
5168 return new pass_local_fn_summary (ctxt
);
5172 /* Free inline summary. */
5176 const pass_data pass_data_ipa_free_fn_summary
=
5178 SIMPLE_IPA_PASS
, /* type */
5179 "free-fnsummary", /* name */
5180 OPTGROUP_NONE
, /* optinfo_flags */
5181 TV_IPA_FREE_INLINE_SUMMARY
, /* tv_id */
5182 0, /* properties_required */
5183 0, /* properties_provided */
5184 0, /* properties_destroyed */
5185 0, /* todo_flags_start */
5186 0, /* todo_flags_finish */
5189 class pass_ipa_free_fn_summary
: public simple_ipa_opt_pass
5192 pass_ipa_free_fn_summary (gcc::context
*ctxt
)
5193 : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary
, ctxt
),
5197 /* opt_pass methods: */
5198 opt_pass
*clone () final override
5200 return new pass_ipa_free_fn_summary (m_ctxt
);
5202 void set_pass_param (unsigned int n
, bool param
) final override
5204 gcc_assert (n
== 0);
5207 bool gate (function
*) final override
{ return true; }
5208 unsigned int execute (function
*) final override
5210 ipa_free_fn_summary ();
5211 /* Free ipa-prop structures if they are no longer needed. */
5212 ipa_free_all_structures_after_iinln ();
5214 ipa_free_size_summary ();
5220 }; // class pass_ipa_free_fn_summary
5224 simple_ipa_opt_pass
*
5225 make_pass_ipa_free_fn_summary (gcc::context
*ctxt
)
5227 return new pass_ipa_free_fn_summary (ctxt
);
5232 const pass_data pass_data_ipa_fn_summary
=
5234 IPA_PASS
, /* type */
5235 "fnsummary", /* name */
5236 OPTGROUP_INLINE
, /* optinfo_flags */
5237 TV_IPA_FNSUMMARY
, /* tv_id */
5238 0, /* properties_required */
5239 0, /* properties_provided */
5240 0, /* properties_destroyed */
5241 0, /* todo_flags_start */
5242 ( TODO_dump_symtab
), /* todo_flags_finish */
5245 class pass_ipa_fn_summary
: public ipa_opt_pass_d
5248 pass_ipa_fn_summary (gcc::context
*ctxt
)
5249 : ipa_opt_pass_d (pass_data_ipa_fn_summary
, ctxt
,
5250 ipa_fn_summary_generate
, /* generate_summary */
5251 ipa_fn_summary_write
, /* write_summary */
5252 ipa_fn_summary_read
, /* read_summary */
5253 NULL
, /* write_optimization_summary */
5254 NULL
, /* read_optimization_summary */
5255 NULL
, /* stmt_fixup */
5256 0, /* function_transform_todo_flags_start */
5257 NULL
, /* function_transform */
5258 NULL
) /* variable_transform */
5261 /* opt_pass methods: */
5262 unsigned int execute (function
*) final override
{ return 0; }
5264 }; // class pass_ipa_fn_summary
5269 make_pass_ipa_fn_summary (gcc::context
*ctxt
)
5271 return new pass_ipa_fn_summary (ctxt
);
5274 /* Reset all state within ipa-fnsummary.cc so that we can rerun the compiler
5275 within the same process. For use by toplev::finalize. */
5278 ipa_fnsummary_cc_finalize (void)
5280 ipa_free_fn_summary ();
5281 ipa_free_size_summary ();