]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ipa-fnsummary.c
Update copyright years.
[thirdparty/gcc.git] / gcc / ipa-fnsummary.c
CommitLineData
27d020cf 1/* Function summary pass.
8d9254fc 2 Copyright (C) 2003-2020 Free Software Foundation, Inc.
27d020cf
JH
3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21/* Analysis of function bodies used by inter-procedural passes
22
23 We estimate for each function
24 - function body size and size after specializing into given context
25 - average function execution time in a given context
26 - function frame size
27 For each call
28 - call statement size, time and how often the parameters change
29
0bceb671 30 ipa_fn_summary data structures store above information locally (i.e.
27d020cf
JH
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).
34
0bceb671 35 We provide access to the ipa_fn_summary data structure and
27d020cf
JH
36 basic logic updating the parameters when inlining is performed.
37
38 The summaries are context sensitive. Context means
39 1) partial assignment of known constant values of operands
40 2) whether function is inlined into the call or not.
41 It is easy to add more variants. To represent function size and time
42 that depends on context (i.e. it is known to be optimized away when
43 context is known either by inlining or from IP-CP and cloning),
44 we use predicates.
45
46 estimate_edge_size_and_time can be used to query
0bceb671 47 function size/time in the given context. ipa_merge_fn_summary_after_inlining merges
27d020cf
JH
48 properties of caller and callee after inlining.
49
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. */
53
54#include "config.h"
55#include "system.h"
56#include "coretypes.h"
57#include "backend.h"
58#include "tree.h"
59#include "gimple.h"
60#include "alloc-pool.h"
61#include "tree-pass.h"
62#include "ssa.h"
63#include "tree-streamer.h"
64#include "cgraph.h"
65#include "diagnostic.h"
66#include "fold-const.h"
67#include "print-tree.h"
68#include "tree-inline.h"
69#include "gimple-pretty-print.h"
27d020cf
JH
70#include "cfganal.h"
71#include "gimple-iterator.h"
72#include "tree-cfg.h"
73#include "tree-ssa-loop-niter.h"
74#include "tree-ssa-loop.h"
75#include "symbol-summary.h"
76#include "ipa-prop.h"
77#include "ipa-fnsummary.h"
78#include "cfgloop.h"
79#include "tree-scalar-evolution.h"
80#include "ipa-utils.h"
27d020cf
JH
81#include "cfgexpand.h"
82#include "gimplify.h"
314e6352
ML
83#include "stringpool.h"
84#include "attribs.h"
ac0573de 85#include "tree-into-ssa.h"
27d020cf
JH
86
87/* Summaries. */
db30281f 88fast_function_summary <ipa_fn_summary *, va_gc> *ipa_fn_summaries;
f658ad30 89fast_function_summary <ipa_size_summary *, va_heap> *ipa_size_summaries;
db30281f 90fast_call_summary <ipa_call_summary *, va_heap> *ipa_call_summaries;
27d020cf
JH
91
92/* Edge predicates goes here. */
93static object_allocator<predicate> edge_predicate_pool ("edge predicates");
94
95
0bceb671 96/* Dump IPA hints. */
27d020cf 97void
0bceb671 98ipa_dump_hints (FILE *f, ipa_hints hints)
27d020cf
JH
99{
100 if (!hints)
101 return;
0bceb671 102 fprintf (f, "IPA hints:");
27d020cf
JH
103 if (hints & INLINE_HINT_indirect_call)
104 {
105 hints &= ~INLINE_HINT_indirect_call;
106 fprintf (f, " indirect_call");
107 }
108 if (hints & INLINE_HINT_loop_iterations)
109 {
110 hints &= ~INLINE_HINT_loop_iterations;
111 fprintf (f, " loop_iterations");
112 }
113 if (hints & INLINE_HINT_loop_stride)
114 {
115 hints &= ~INLINE_HINT_loop_stride;
116 fprintf (f, " loop_stride");
117 }
118 if (hints & INLINE_HINT_same_scc)
119 {
120 hints &= ~INLINE_HINT_same_scc;
121 fprintf (f, " same_scc");
122 }
123 if (hints & INLINE_HINT_in_scc)
124 {
125 hints &= ~INLINE_HINT_in_scc;
126 fprintf (f, " in_scc");
127 }
128 if (hints & INLINE_HINT_cross_module)
129 {
130 hints &= ~INLINE_HINT_cross_module;
131 fprintf (f, " cross_module");
132 }
133 if (hints & INLINE_HINT_declared_inline)
134 {
135 hints &= ~INLINE_HINT_declared_inline;
136 fprintf (f, " declared_inline");
137 }
27d020cf
JH
138 if (hints & INLINE_HINT_known_hot)
139 {
140 hints &= ~INLINE_HINT_known_hot;
141 fprintf (f, " known_hot");
142 }
143 gcc_assert (!hints);
144}
145
146
147/* Record SIZE and TIME to SUMMARY.
148 The accounted code will be executed when EXEC_PRED is true.
956d615d 149 When NONCONST_PRED is false the code will evaluate to constant and
070e3489
JH
150 will get optimized out in specialized clones of the function.
151 If CALL is true account to call_size_time_table rather than
152 size_time_table. */
27d020cf
JH
153
154void
0bceb671 155ipa_fn_summary::account_size_time (int size, sreal time,
27d020cf 156 const predicate &exec_pred,
070e3489
JH
157 const predicate &nonconst_pred_in,
158 bool call)
27d020cf
JH
159{
160 size_time_entry *e;
161 bool found = false;
162 int i;
163 predicate nonconst_pred;
070e3489
JH
164 vec<size_time_entry, va_gc> *table = call
165 ? call_size_time_table : size_time_table;
27d020cf
JH
166
167 if (exec_pred == false)
168 return;
169
170 nonconst_pred = nonconst_pred_in & exec_pred;
171
172 if (nonconst_pred == false)
173 return;
174
956d615d 175 /* We need to create initial empty unconditional clause, but otherwise
27d020cf 176 we don't need to account empty times and sizes. */
070e3489 177 if (!size && time == 0 && table)
27d020cf
JH
178 return;
179
956d615d 180 /* Only for calls we are unaccounting what we previously recorded. */
d2bcf46c 181 gcc_checking_assert (time >= 0 || call);
27d020cf 182
070e3489 183 for (i = 0; vec_safe_iterate (table, i, &e); i++)
27d020cf
JH
184 if (e->exec_predicate == exec_pred
185 && e->nonconst_predicate == nonconst_pred)
186 {
187 found = true;
188 break;
189 }
070e3489 190 if (i == max_size_time_table_size)
27d020cf
JH
191 {
192 i = 0;
193 found = true;
070e3489 194 e = &(*table)[0];
27d020cf
JH
195 if (dump_file && (dump_flags & TDF_DETAILS))
196 fprintf (dump_file,
197 "\t\tReached limit on number of entries, "
198 "ignoring the predicate.");
199 }
200 if (dump_file && (dump_flags & TDF_DETAILS) && (time != 0 || size))
201 {
202 fprintf (dump_file,
203 "\t\tAccounting size:%3.2f, time:%3.2f on %spredicate exec:",
0bceb671 204 ((double) size) / ipa_fn_summary::size_scale,
27d020cf
JH
205 (time.to_double ()), found ? "" : "new ");
206 exec_pred.dump (dump_file, conds, 0);
207 if (exec_pred != nonconst_pred)
208 {
209 fprintf (dump_file, " nonconst:");
210 nonconst_pred.dump (dump_file, conds);
211 }
212 else
213 fprintf (dump_file, "\n");
214 }
215 if (!found)
216 {
99b1c316 217 class size_time_entry new_entry;
27d020cf
JH
218 new_entry.size = size;
219 new_entry.time = time;
220 new_entry.exec_predicate = exec_pred;
221 new_entry.nonconst_predicate = nonconst_pred;
070e3489
JH
222 if (call)
223 vec_safe_push (call_size_time_table, new_entry);
224 else
225 vec_safe_push (size_time_table, new_entry);
27d020cf
JH
226 }
227 else
228 {
229 e->size += size;
230 e->time += time;
dd86c8da 231 /* FIXME: PR bootstrap/92653 gcc_checking_assert (e->time >= -1); */
d2bcf46c
JH
232 /* Tolerate small roundoff issues. */
233 if (e->time < 0)
234 e->time = 0;
27d020cf
JH
235 }
236}
237
956d615d 238/* We proved E to be unreachable, redirect it to __builtin_unreachable. */
27d020cf
JH
239
240static struct cgraph_edge *
241redirect_to_unreachable (struct cgraph_edge *e)
242{
243 struct cgraph_node *callee = !e->inline_failed ? e->callee : NULL;
244 struct cgraph_node *target = cgraph_node::get_create
245 (builtin_decl_implicit (BUILT_IN_UNREACHABLE));
246
247 if (e->speculative)
248 e = e->resolve_speculation (target->decl);
249 else if (!e->callee)
250 e->make_direct (target);
251 else
252 e->redirect_callee (target);
99b1c316 253 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf 254 e->inline_failed = CIF_UNREACHABLE;
3995f3a2 255 e->count = profile_count::zero ();
27d020cf
JH
256 es->call_stmt_size = 0;
257 es->call_stmt_time = 0;
258 if (callee)
259 callee->remove_symbol_and_inline_clones ();
260 return e;
261}
262
263/* Set predicate for edge E. */
264
265static void
266edge_set_predicate (struct cgraph_edge *e, predicate *predicate)
267{
268 /* If the edge is determined to be never executed, redirect it
0bceb671
JH
269 to BUILTIN_UNREACHABLE to make it clear to IPA passes the call will
270 be optimized out. */
27d020cf
JH
271 if (predicate && *predicate == false
272 /* When handling speculative edges, we need to do the redirection
273 just once. Do it always on the direct edge, so we do not
274 attempt to resolve speculation while duplicating the edge. */
275 && (!e->speculative || e->callee))
276 e = redirect_to_unreachable (e);
277
99b1c316 278 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
279 if (predicate && *predicate != true)
280 {
281 if (!es->predicate)
282 es->predicate = edge_predicate_pool.allocate ();
283 *es->predicate = *predicate;
284 }
285 else
286 {
287 if (es->predicate)
288 edge_predicate_pool.remove (es->predicate);
289 es->predicate = NULL;
290 }
291}
292
293/* Set predicate for hint *P. */
294
295static void
296set_hint_predicate (predicate **p, predicate new_predicate)
297{
298 if (new_predicate == false || new_predicate == true)
299 {
300 if (*p)
301 edge_predicate_pool.remove (*p);
302 *p = NULL;
303 }
304 else
305 {
306 if (!*p)
307 *p = edge_predicate_pool.allocate ();
308 **p = new_predicate;
309 }
310}
311
312
956d615d 313/* Compute what conditions may or may not hold given information about
27d020cf 314 parameters. RET_CLAUSE returns truths that may hold in a specialized copy,
956d615d 315 while RET_NONSPEC_CLAUSE returns truths that may hold in an nonspecialized
27d020cf
JH
316 copy when called in a given context. It is a bitmask of conditions. Bit
317 0 means that condition is known to be false, while bit 1 means that condition
318 may or may not be true. These differs - for example NOT_INLINED condition
67914693 319 is always false in the second and also builtin_constant_p tests cannot use
27d020cf
JH
320 the fact that parameter is indeed a constant.
321
322 KNOWN_VALS is partial mapping of parameters of NODE to constant values.
956d615d 323 KNOWN_AGGS is a vector of aggregate known offset/value set for each
eb270950
FX
324 parameter. Return clause of possible truths. When INLINE_P is true, assume
325 that we are inlining.
27d020cf
JH
326
327 ERROR_MARK means compile time invariant. */
328
329static void
330evaluate_conditions_for_known_args (struct cgraph_node *node,
331 bool inline_p,
332 vec<tree> known_vals,
68718e8e 333 vec<value_range> known_value_ranges,
eb270950 334 vec<ipa_agg_value_set> known_aggs,
27d020cf
JH
335 clause_t *ret_clause,
336 clause_t *ret_nonspec_clause)
337{
338 clause_t clause = inline_p ? 0 : 1 << predicate::not_inlined_condition;
339 clause_t nonspec_clause = 1 << predicate::not_inlined_condition;
99b1c316 340 class ipa_fn_summary *info = ipa_fn_summaries->get (node);
27d020cf
JH
341 int i;
342 struct condition *c;
343
344 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
345 {
b0d55476 346 tree val = NULL;
27d020cf 347 tree res;
4307a485
FX
348 int j;
349 struct expr_eval_op *op;
27d020cf
JH
350
351 /* We allow call stmt to have fewer arguments than the callee function
352 (especially for K&R style programs). So bound check here (we assume
353 known_aggs vector, if non-NULL, has the same length as
354 known_vals). */
b0d55476 355 gcc_checking_assert (!known_aggs.length () || !known_vals.length ()
27d020cf 356 || (known_vals.length () == known_aggs.length ()));
27d020cf
JH
357
358 if (c->agg_contents)
359 {
eb270950 360 struct ipa_agg_value_set *agg;
27d020cf
JH
361
362 if (c->code == predicate::changed
363 && !c->by_ref
b0d55476 364 && c->operand_num < (int)known_vals.length ()
27d020cf
JH
365 && (known_vals[c->operand_num] == error_mark_node))
366 continue;
367
b0d55476 368 if (c->operand_num < (int)known_aggs.length ())
27d020cf 369 {
eb270950 370 agg = &known_aggs[c->operand_num];
b0d55476
JH
371 val = ipa_find_agg_cst_for_param (agg,
372 c->operand_num
373 < (int) known_vals.length ()
374 ? known_vals[c->operand_num]
375 : NULL,
27d020cf
JH
376 c->offset, c->by_ref);
377 }
378 else
379 val = NULL_TREE;
380 }
b0d55476 381 else if (c->operand_num < (int) known_vals.length ())
27d020cf
JH
382 {
383 val = known_vals[c->operand_num];
384 if (val == error_mark_node && c->code != predicate::changed)
385 val = NULL_TREE;
386 }
387
68718e8e
JH
388 if (!val
389 && (c->code == predicate::changed
390 || c->code == predicate::is_not_constant))
27d020cf
JH
391 {
392 clause |= 1 << (i + predicate::first_dynamic_condition);
393 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
394 continue;
395 }
396 if (c->code == predicate::changed)
397 {
398 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
399 continue;
400 }
401
27d020cf
JH
402 if (c->code == predicate::is_not_constant)
403 {
404 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
405 continue;
406 }
407
68718e8e 408 if (val && TYPE_SIZE (c->type) == TYPE_SIZE (TREE_TYPE (val)))
4307a485 409 {
68718e8e
JH
410 if (c->type != TREE_TYPE (val))
411 val = fold_unary (VIEW_CONVERT_EXPR, c->type, val);
412 for (j = 0; vec_safe_iterate (c->param_ops, j, &op); j++)
413 {
414 if (!val)
415 break;
416 if (!op->val[0])
417 val = fold_unary (op->code, op->type, val);
418 else if (!op->val[1])
419 val = fold_binary (op->code, op->type,
420 op->index ? op->val[0] : val,
421 op->index ? val : op->val[0]);
422 else if (op->index == 0)
423 val = fold_ternary (op->code, op->type,
424 val, op->val[0], op->val[1]);
425 else if (op->index == 1)
426 val = fold_ternary (op->code, op->type,
427 op->val[0], val, op->val[1]);
428 else if (op->index == 2)
429 val = fold_ternary (op->code, op->type,
430 op->val[0], op->val[1], val);
431 else
432 val = NULL_TREE;
433 }
434
435 res = val
436 ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
437 : NULL;
438
439 if (res && integer_zerop (res))
440 continue;
441 if (res && integer_onep (res))
442 {
443 clause |= 1 << (i + predicate::first_dynamic_condition);
444 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
445 continue;
446 }
4307a485 447 }
68718e8e
JH
448 if (c->operand_num < (int) known_value_ranges.length ()
449 && !c->agg_contents
450 && !known_value_ranges[c->operand_num].undefined_p ()
451 && !known_value_ranges[c->operand_num].varying_p ()
452 && TYPE_SIZE (c->type)
453 == TYPE_SIZE (known_value_ranges[c->operand_num].type ())
454 && (!val || TREE_CODE (val) != INTEGER_CST))
455 {
456 value_range vr = known_value_ranges[c->operand_num];
457 if (!useless_type_conversion_p (c->type, vr.type ()))
458 {
459 value_range res;
460 range_fold_unary_expr (&res, NOP_EXPR,
461 c->type, &vr, vr.type ());
462 vr = res;
463 }
464 tree type = c->type;
4307a485 465
68718e8e
JH
466 for (j = 0; vec_safe_iterate (c->param_ops, j, &op); j++)
467 {
468 if (vr.varying_p () || vr.undefined_p ())
469 break;
27d020cf 470
68718e8e
JH
471 value_range res;
472 if (!op->val[0])
473 range_fold_unary_expr (&res, op->code, op->type, &vr, type);
474 else if (!op->val[1])
475 {
476 value_range op0 (op->val[0], op->val[0]);
477 range_fold_binary_expr (&res, op->code, op->type,
478 op->index ? &op0 : &vr,
479 op->index ? &vr : &op0);
480 }
481 else
482 gcc_unreachable ();
483 type = op->type;
484 vr = res;
485 }
486 if (!vr.varying_p () && !vr.undefined_p ())
487 {
488 value_range res;
489 value_range val_vr (c->val, c->val);
490 range_fold_binary_expr (&res, c->code, boolean_type_node,
491 &vr,
492 &val_vr);
493 if (res.zero_p ())
494 continue;
495 }
496 }
27d020cf
JH
497
498 clause |= 1 << (i + predicate::first_dynamic_condition);
499 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
500 }
501 *ret_clause = clause;
502 if (ret_nonspec_clause)
503 *ret_nonspec_clause = nonspec_clause;
504}
505
506
b0d55476
JH
507/* Work out what conditions might be true at invocation of E.
508 Compute costs for inlined edge if INLINE_P is true.
509
956d615d 510 Return in CLAUSE_PTR the evaluated conditions and in NONSPEC_CLAUSE_PTR
b0d55476
JH
511 (if non-NULL) conditions evaluated for nonspecialized clone called
512 in a given context.
513
514 KNOWN_VALS_PTR and KNOWN_AGGS_PTR must be non-NULL and will be filled by
956d615d 515 known constant and aggregate values of parameters.
b0d55476
JH
516
517 KNOWN_CONTEXT_PTR, if non-NULL, will be filled by polymorphic call contexts
518 of parameter used by a polymorphic call. */
27d020cf
JH
519
520void
521evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
522 clause_t *clause_ptr,
523 clause_t *nonspec_clause_ptr,
524 vec<tree> *known_vals_ptr,
525 vec<ipa_polymorphic_call_context>
526 *known_contexts_ptr,
eb270950 527 vec<ipa_agg_value_set> *known_aggs_ptr)
27d020cf
JH
528{
529 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
99b1c316 530 class ipa_fn_summary *info = ipa_fn_summaries->get (callee);
68718e8e 531 auto_vec<value_range, 32> known_value_ranges;
a33c028e 532 class ipa_edge_args *args;
27d020cf
JH
533
534 if (clause_ptr)
535 *clause_ptr = inline_p ? 0 : 1 << predicate::not_inlined_condition;
27d020cf
JH
536
537 if (ipa_node_params_sum
538 && !e->call_stmt_cannot_inline_p
b0d55476 539 && (info->conds || known_contexts_ptr)
a33c028e 540 && (args = IPA_EDGE_REF (e)) != NULL)
27d020cf 541 {
eb270950 542 struct cgraph_node *caller;
b0d55476 543 class ipa_node_params *caller_parms_info, *callee_pi = NULL;
99b1c316 544 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
545 int i, count = ipa_get_cs_argument_count (args);
546
b0d55476
JH
547 if (count)
548 {
549 if (e->caller->inlined_to)
550 caller = e->caller->inlined_to;
551 else
552 caller = e->caller;
553 caller_parms_info = IPA_NODE_REF (caller);
554 callee_pi = IPA_NODE_REF (callee);
555
556 /* Watch for thunks. */
557 if (callee_pi)
558 /* Watch for variadic functions. */
559 count = MIN (count, ipa_get_param_count (callee_pi));
560 }
27d020cf 561
6cf67b62
JH
562 if (callee_pi)
563 for (i = 0; i < count; i++)
564 {
565 struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
6cf67b62 566
b0d55476
JH
567 if (ipa_is_param_used_by_indirect_call (callee_pi, i)
568 || ipa_is_param_used_by_ipa_predicates (callee_pi, i))
6cf67b62 569 {
b0d55476
JH
570 /* Determine if we know constant value of the parameter. */
571 tree cst = ipa_value_from_jfunc (caller_parms_info, jf,
572 ipa_get_type (callee_pi, i));
573
574 if (!cst && e->call_stmt
575 && i < (int)gimple_call_num_args (e->call_stmt))
576 {
577 cst = gimple_call_arg (e->call_stmt, i);
578 if (!is_gimple_min_invariant (cst))
579 cst = NULL;
580 }
581 if (cst)
582 {
583 gcc_checking_assert (TREE_CODE (cst) != TREE_BINFO);
584 if (!known_vals_ptr->length ())
585 vec_safe_grow_cleared (known_vals_ptr, count);
586 (*known_vals_ptr)[i] = cst;
587 }
588 else if (inline_p && !es->param[i].change_prob)
589 {
590 if (!known_vals_ptr->length ())
591 vec_safe_grow_cleared (known_vals_ptr, count);
592 (*known_vals_ptr)[i] = error_mark_node;
593 }
594
595 /* If we failed to get simple constant, try value range. */
596 if ((!cst || TREE_CODE (cst) != INTEGER_CST)
597 && ipa_is_param_used_by_ipa_predicates (callee_pi, i))
598 {
599 value_range vr
600 = ipa_value_range_from_jfunc (caller_parms_info, e, jf,
601 ipa_get_type (callee_pi,
602 i));
603 if (!vr.undefined_p () && !vr.varying_p ())
604 {
605 if (!known_value_ranges.length ())
606 known_value_ranges.safe_grow_cleared (count);
607 known_value_ranges[i] = vr;
608 }
609 }
610
611 /* Determine known aggregate values. */
612 ipa_agg_value_set agg
613 = ipa_agg_value_set_from_jfunc (caller_parms_info,
614 caller, &jf->agg);
615 if (agg.items.length ())
616 {
617 if (!known_aggs_ptr->length ())
618 vec_safe_grow_cleared (known_aggs_ptr, count);
619 (*known_aggs_ptr)[i] = agg;
620 }
6cf67b62 621 }
b0d55476
JH
622
623 /* For calls used in polymorphic calls we further determine
624 polymorphic call context. */
625 if (known_contexts_ptr
626 && ipa_is_param_used_by_polymorphic_call (callee_pi, i))
6cf67b62 627 {
b0d55476
JH
628 ipa_polymorphic_call_context
629 ctx = ipa_context_from_jfunc (caller_parms_info, e, i, jf);
630 if (!ctx.useless_p ())
631 {
632 if (!known_contexts_ptr->length ())
633 known_contexts_ptr->safe_grow_cleared (count);
634 (*known_contexts_ptr)[i]
635 = ipa_context_from_jfunc (caller_parms_info, e, i, jf);
636 }
637 }
6cf67b62
JH
638 }
639 else
b0d55476 640 gcc_assert (!count || callee->thunk.thunk_p);
27d020cf 641 }
b0d55476 642 else if (e->call_stmt && !e->call_stmt_cannot_inline_p && info->conds)
27d020cf
JH
643 {
644 int i, count = (int)gimple_call_num_args (e->call_stmt);
645
27d020cf
JH
646 for (i = 0; i < count; i++)
647 {
648 tree cst = gimple_call_arg (e->call_stmt, i);
649 if (!is_gimple_min_invariant (cst))
650 cst = NULL;
651 if (cst)
b0d55476
JH
652 {
653 if (!known_vals_ptr->length ())
654 vec_safe_grow_cleared (known_vals_ptr, count);
655 (*known_vals_ptr)[i] = cst;
656 }
27d020cf
JH
657 }
658 }
659
660 evaluate_conditions_for_known_args (callee, inline_p,
b0d55476 661 *known_vals_ptr,
68718e8e 662 known_value_ranges,
b0d55476
JH
663 *known_aggs_ptr,
664 clause_ptr,
27d020cf 665 nonspec_clause_ptr);
27d020cf
JH
666}
667
668
0bceb671 669/* Allocate the function summary. */
27d020cf
JH
670
671static void
0bceb671 672ipa_fn_summary_alloc (void)
27d020cf 673{
0bceb671 674 gcc_checking_assert (!ipa_fn_summaries);
44fca832 675 ipa_size_summaries = new ipa_size_summary_t (symtab);
7237f93e 676 ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab);
db30281f 677 ipa_call_summaries = new ipa_call_summary_t (symtab);
27d020cf
JH
678}
679
56f62793 680ipa_call_summary::~ipa_call_summary ()
27d020cf 681{
27d020cf
JH
682 if (predicate)
683 edge_predicate_pool.remove (predicate);
56f62793 684
27d020cf
JH
685 param.release ();
686}
687
56f62793 688ipa_fn_summary::~ipa_fn_summary ()
27d020cf 689{
27d020cf 690 if (loop_iterations)
56f62793 691 edge_predicate_pool.remove (loop_iterations);
27d020cf 692 if (loop_stride)
56f62793 693 edge_predicate_pool.remove (loop_stride);
27d020cf
JH
694 vec_free (conds);
695 vec_free (size_time_table);
070e3489 696 vec_free (call_size_time_table);
27d020cf
JH
697}
698
27d020cf 699void
56f62793 700ipa_fn_summary_t::remove_callees (cgraph_node *node)
27d020cf 701{
56f62793
ML
702 cgraph_edge *e;
703 for (e = node->callees; e; e = e->next_callee)
704 ipa_call_summaries->remove (e);
705 for (e = node->indirect_calls; e; e = e->next_callee)
706 ipa_call_summaries->remove (e);
27d020cf
JH
707}
708
709/* Same as remap_predicate_after_duplication but handle hint predicate *P.
710 Additionally care about allocating new memory slot for updated predicate
711 and set it to NULL when it becomes true or false (and thus uninteresting).
712 */
713
714static void
715remap_hint_predicate_after_duplication (predicate **p,
716 clause_t possible_truths)
717{
718 predicate new_predicate;
719
720 if (!*p)
721 return;
722
723 new_predicate = (*p)->remap_after_duplication (possible_truths);
724 /* We do not want to free previous predicate; it is used by node origin. */
725 *p = NULL;
726 set_hint_predicate (p, new_predicate);
727}
728
729
730/* Hook that is called by cgraph.c when a node is duplicated. */
731void
0bceb671 732ipa_fn_summary_t::duplicate (cgraph_node *src,
27d020cf 733 cgraph_node *dst,
0bceb671
JH
734 ipa_fn_summary *,
735 ipa_fn_summary *info)
27d020cf 736{
56f62793 737 new (info) ipa_fn_summary (*ipa_fn_summaries->get (src));
27d020cf
JH
738 /* TODO: as an optimization, we may avoid copying conditions
739 that are known to be false or true. */
740 info->conds = vec_safe_copy (info->conds);
741
742 /* When there are any replacements in the function body, see if we can figure
743 out that something was optimized out. */
744 if (ipa_node_params_sum && dst->clone.tree_map)
745 {
746 vec<size_time_entry, va_gc> *entry = info->size_time_table;
747 /* Use SRC parm info since it may not be copied yet. */
99b1c316 748 class ipa_node_params *parms_info = IPA_NODE_REF (src);
27d020cf
JH
749 vec<tree> known_vals = vNULL;
750 int count = ipa_get_param_count (parms_info);
751 int i, j;
752 clause_t possible_truths;
753 predicate true_pred = true;
754 size_time_entry *e;
755 int optimized_out_size = 0;
756 bool inlined_to_p = false;
757 struct cgraph_edge *edge, *next;
758
759 info->size_time_table = 0;
760 known_vals.safe_grow_cleared (count);
761 for (i = 0; i < count; i++)
762 {
763 struct ipa_replace_map *r;
764
765 for (j = 0; vec_safe_iterate (dst->clone.tree_map, j, &r); j++)
766 {
ff6686d2 767 if (r->parm_num == i)
27d020cf
JH
768 {
769 known_vals[i] = r->new_tree;
770 break;
771 }
772 }
773 }
774 evaluate_conditions_for_known_args (dst, false,
775 known_vals,
776 vNULL,
68718e8e 777 vNULL,
27d020cf
JH
778 &possible_truths,
779 /* We are going to specialize,
780 so ignore nonspec truths. */
781 NULL);
782 known_vals.release ();
783
784 info->account_size_time (0, 0, true_pred, true_pred);
785
786 /* Remap size_time vectors.
956d615d 787 Simplify the predicate by pruning out alternatives that are known
27d020cf
JH
788 to be false.
789 TODO: as on optimization, we can also eliminate conditions known
790 to be true. */
791 for (i = 0; vec_safe_iterate (entry, i, &e); i++)
792 {
793 predicate new_exec_pred;
794 predicate new_nonconst_pred;
795 new_exec_pred = e->exec_predicate.remap_after_duplication
796 (possible_truths);
797 new_nonconst_pred = e->nonconst_predicate.remap_after_duplication
798 (possible_truths);
799 if (new_exec_pred == false || new_nonconst_pred == false)
800 optimized_out_size += e->size;
801 else
802 info->account_size_time (e->size, e->time, new_exec_pred,
803 new_nonconst_pred);
804 }
805
806 /* Remap edge predicates with the same simplification as above.
807 Also copy constantness arrays. */
808 for (edge = dst->callees; edge; edge = next)
809 {
810 predicate new_predicate;
7237f93e 811 class ipa_call_summary *es = ipa_call_summaries->get (edge);
27d020cf
JH
812 next = edge->next_callee;
813
814 if (!edge->inline_failed)
815 inlined_to_p = true;
816 if (!es->predicate)
817 continue;
818 new_predicate = es->predicate->remap_after_duplication
819 (possible_truths);
820 if (new_predicate == false && *es->predicate != false)
0bceb671 821 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
27d020cf
JH
822 edge_set_predicate (edge, &new_predicate);
823 }
824
956d615d 825 /* Remap indirect edge predicates with the same simplification as above.
27d020cf
JH
826 Also copy constantness arrays. */
827 for (edge = dst->indirect_calls; edge; edge = next)
828 {
829 predicate new_predicate;
7237f93e 830 class ipa_call_summary *es = ipa_call_summaries->get (edge);
27d020cf
JH
831 next = edge->next_callee;
832
833 gcc_checking_assert (edge->inline_failed);
834 if (!es->predicate)
835 continue;
836 new_predicate = es->predicate->remap_after_duplication
837 (possible_truths);
838 if (new_predicate == false && *es->predicate != false)
0bceb671 839 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
27d020cf
JH
840 edge_set_predicate (edge, &new_predicate);
841 }
842 remap_hint_predicate_after_duplication (&info->loop_iterations,
843 possible_truths);
844 remap_hint_predicate_after_duplication (&info->loop_stride,
845 possible_truths);
27d020cf
JH
846
847 /* If inliner or someone after inliner will ever start producing
848 non-trivial clones, we will get trouble with lack of information
849 about updating self sizes, because size vectors already contains
956d615d 850 sizes of the callees. */
27d020cf
JH
851 gcc_assert (!inlined_to_p || !optimized_out_size);
852 }
853 else
854 {
855 info->size_time_table = vec_safe_copy (info->size_time_table);
856 if (info->loop_iterations)
857 {
858 predicate p = *info->loop_iterations;
859 info->loop_iterations = NULL;
860 set_hint_predicate (&info->loop_iterations, p);
861 }
862 if (info->loop_stride)
863 {
864 predicate p = *info->loop_stride;
865 info->loop_stride = NULL;
866 set_hint_predicate (&info->loop_stride, p);
867 }
27d020cf 868 }
a62bfab5 869 if (!dst->inlined_to)
0bceb671 870 ipa_update_overall_fn_summary (dst);
27d020cf
JH
871}
872
873
874/* Hook that is called by cgraph.c when a node is duplicated. */
875
876void
877ipa_call_summary_t::duplicate (struct cgraph_edge *src,
878 struct cgraph_edge *dst,
99b1c316
MS
879 class ipa_call_summary *srcinfo,
880 class ipa_call_summary *info)
27d020cf 881{
56f62793 882 new (info) ipa_call_summary (*srcinfo);
27d020cf
JH
883 info->predicate = NULL;
884 edge_set_predicate (dst, srcinfo->predicate);
885 info->param = srcinfo->param.copy ();
886 if (!dst->indirect_unknown_callee && src->indirect_unknown_callee)
887 {
888 info->call_stmt_size -= (eni_size_weights.indirect_call_cost
889 - eni_size_weights.call_cost);
890 info->call_stmt_time -= (eni_time_weights.indirect_call_cost
891 - eni_time_weights.call_cost);
892 }
893}
894
27d020cf
JH
895/* Dump edge summaries associated to NODE and recursively to all clones.
896 Indent by INDENT. */
897
898static void
899dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
99b1c316 900 class ipa_fn_summary *info)
27d020cf
JH
901{
902 struct cgraph_edge *edge;
903 for (edge = node->callees; edge; edge = edge->next_callee)
904 {
99b1c316 905 class ipa_call_summary *es = ipa_call_summaries->get (edge);
27d020cf
JH
906 struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
907 int i;
908
909 fprintf (f,
7237f93e 910 "%*s%s/%i %s\n%*s freq:%4.2f",
27d020cf
JH
911 indent, "", callee->name (), callee->order,
912 !edge->inline_failed
913 ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
7237f93e
JH
914 indent, "", edge->sreal_frequency ().to_double ());
915
b74d8dc4
JH
916 if (cross_module_call_p (edge))
917 fprintf (f, " cross module");
918
7237f93e
JH
919 if (es)
920 fprintf (f, " loop depth:%2i size:%2i time: %2i",
921 es->loop_depth, es->call_stmt_size, es->call_stmt_time);
56f62793
ML
922
923 ipa_fn_summary *s = ipa_fn_summaries->get (callee);
f658ad30 924 ipa_size_summary *ss = ipa_size_summaries->get (callee);
56f62793 925 if (s != NULL)
f658ad30
JH
926 fprintf (f, " callee size:%2i stack:%2i",
927 (int) (ss->size / ipa_fn_summary::size_scale),
56f62793 928 (int) s->estimated_stack_size);
27d020cf 929
7237f93e 930 if (es && es->predicate)
27d020cf
JH
931 {
932 fprintf (f, " predicate: ");
933 es->predicate->dump (f, info->conds);
934 }
935 else
936 fprintf (f, "\n");
7237f93e 937 if (es && es->param.exists ())
27d020cf
JH
938 for (i = 0; i < (int) es->param.length (); i++)
939 {
940 int prob = es->param[i].change_prob;
941
942 if (!prob)
943 fprintf (f, "%*s op%i is compile time invariant\n",
944 indent + 2, "", i);
945 else if (prob != REG_BR_PROB_BASE)
946 fprintf (f, "%*s op%i change %f%% of time\n", indent + 2, "", i,
947 prob * 100.0 / REG_BR_PROB_BASE);
948 }
949 if (!edge->inline_failed)
950 {
f658ad30
JH
951 ipa_size_summary *ss = ipa_size_summaries->get (callee);
952 fprintf (f, "%*sStack frame offset %i, callee self size %i\n",
27d020cf 953 indent + 2, "",
f658ad30
JH
954 (int) ipa_get_stack_frame_offset (callee),
955 (int) ss->estimated_self_stack_size);
27d020cf
JH
956 dump_ipa_call_summary (f, indent + 2, callee, info);
957 }
958 }
959 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
960 {
99b1c316 961 class ipa_call_summary *es = ipa_call_summaries->get (edge);
41f0e819 962 fprintf (f, "%*sindirect call loop depth:%2i freq:%4.2f size:%2i"
27d020cf
JH
963 " time: %2i",
964 indent, "",
965 es->loop_depth,
41f0e819
JH
966 edge->sreal_frequency ().to_double (), es->call_stmt_size,
967 es->call_stmt_time);
27d020cf
JH
968 if (es->predicate)
969 {
970 fprintf (f, "predicate: ");
971 es->predicate->dump (f, info->conds);
972 }
973 else
974 fprintf (f, "\n");
975 }
976}
977
978
979void
0bceb671 980ipa_dump_fn_summary (FILE *f, struct cgraph_node *node)
27d020cf
JH
981{
982 if (node->definition)
983 {
99b1c316 984 class ipa_fn_summary *s = ipa_fn_summaries->get (node);
f658ad30 985 class ipa_size_summary *ss = ipa_size_summaries->get (node);
56f62793 986 if (s != NULL)
27d020cf 987 {
56f62793
ML
988 size_time_entry *e;
989 int i;
990 fprintf (f, "IPA function summary for %s", node->dump_name ());
991 if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
992 fprintf (f, " always_inline");
993 if (s->inlinable)
994 fprintf (f, " inlinable");
995 if (s->fp_expressions)
996 fprintf (f, " fp_expression");
997 fprintf (f, "\n global time: %f\n", s->time.to_double ());
f658ad30
JH
998 fprintf (f, " self size: %i\n", ss->self_size);
999 fprintf (f, " global size: %i\n", ss->size);
56f62793
ML
1000 fprintf (f, " min size: %i\n", s->min_size);
1001 fprintf (f, " self stack: %i\n",
f658ad30 1002 (int) ss->estimated_self_stack_size);
56f62793
ML
1003 fprintf (f, " global stack: %i\n", (int) s->estimated_stack_size);
1004 if (s->growth)
1005 fprintf (f, " estimated growth:%i\n", (int) s->growth);
1006 if (s->scc_no)
1007 fprintf (f, " In SCC: %i\n", (int) s->scc_no);
1008 for (i = 0; vec_safe_iterate (s->size_time_table, i, &e); i++)
1009 {
1010 fprintf (f, " size:%f, time:%f",
1011 (double) e->size / ipa_fn_summary::size_scale,
1012 e->time.to_double ());
1013 if (e->exec_predicate != true)
1014 {
1015 fprintf (f, ", executed if:");
1016 e->exec_predicate.dump (f, s->conds, 0);
1017 }
1018 if (e->exec_predicate != e->nonconst_predicate)
1019 {
1020 fprintf (f, ", nonconst if:");
1021 e->nonconst_predicate.dump (f, s->conds, 0);
1022 }
1023 fprintf (f, "\n");
1024 }
1025 if (s->loop_iterations)
27d020cf 1026 {
56f62793
ML
1027 fprintf (f, " loop iterations:");
1028 s->loop_iterations->dump (f, s->conds);
27d020cf 1029 }
56f62793 1030 if (s->loop_stride)
27d020cf 1031 {
56f62793
ML
1032 fprintf (f, " loop stride:");
1033 s->loop_stride->dump (f, s->conds);
27d020cf 1034 }
56f62793
ML
1035 fprintf (f, " calls:\n");
1036 dump_ipa_call_summary (f, 4, node, s);
27d020cf
JH
1037 fprintf (f, "\n");
1038 }
56f62793
ML
1039 else
1040 fprintf (f, "IPA summary for %s is missing.\n", node->dump_name ());
27d020cf
JH
1041 }
1042}
1043
1044DEBUG_FUNCTION void
0bceb671 1045ipa_debug_fn_summary (struct cgraph_node *node)
27d020cf 1046{
0bceb671 1047 ipa_dump_fn_summary (stderr, node);
27d020cf
JH
1048}
1049
1050void
0bceb671 1051ipa_dump_fn_summaries (FILE *f)
27d020cf
JH
1052{
1053 struct cgraph_node *node;
1054
1055 FOR_EACH_DEFINED_FUNCTION (node)
a62bfab5 1056 if (!node->inlined_to)
0bceb671 1057 ipa_dump_fn_summary (f, node);
27d020cf
JH
1058}
1059
1060/* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
1061 boolean variable pointed to by DATA. */
1062
1063static bool
1064mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
1065 void *data)
1066{
1067 bool *b = (bool *) data;
1068 *b = true;
1069 return true;
1070}
1071
1072/* If OP refers to value of function parameter, return the corresponding
1073 parameter. If non-NULL, the size of the memory load (or the SSA_NAME of the
1074 PARM_DECL) will be stored to *SIZE_P in that case too. */
1075
1076static tree
c628d1c3 1077unmodified_parm_1 (ipa_func_body_info *fbi, gimple *stmt, tree op,
86003645 1078 poly_int64 *size_p)
27d020cf
JH
1079{
1080 /* SSA_NAME referring to parm default def? */
1081 if (TREE_CODE (op) == SSA_NAME
1082 && SSA_NAME_IS_DEFAULT_DEF (op)
1083 && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
1084 {
1085 if (size_p)
86003645 1086 *size_p = tree_to_poly_int64 (TYPE_SIZE (TREE_TYPE (op)));
27d020cf
JH
1087 return SSA_NAME_VAR (op);
1088 }
1089 /* Non-SSA parm reference? */
1090 if (TREE_CODE (op) == PARM_DECL)
1091 {
1092 bool modified = false;
1093
1094 ao_ref refd;
1095 ao_ref_init (&refd, op);
c628d1c3
MJ
1096 int walked = walk_aliased_vdefs (&refd, gimple_vuse (stmt),
1097 mark_modified, &modified, NULL, NULL,
1098 fbi->aa_walk_budget + 1);
1099 if (walked < 0)
1100 {
1101 fbi->aa_walk_budget = 0;
1102 return NULL_TREE;
1103 }
27d020cf
JH
1104 if (!modified)
1105 {
1106 if (size_p)
86003645 1107 *size_p = tree_to_poly_int64 (TYPE_SIZE (TREE_TYPE (op)));
27d020cf
JH
1108 return op;
1109 }
1110 }
1111 return NULL_TREE;
1112}
1113
1114/* If OP refers to value of function parameter, return the corresponding
1115 parameter. Also traverse chains of SSA register assignments. If non-NULL,
1116 the size of the memory load (or the SSA_NAME of the PARM_DECL) will be
1117 stored to *SIZE_P in that case too. */
1118
1119static tree
c628d1c3 1120unmodified_parm (ipa_func_body_info *fbi, gimple *stmt, tree op,
86003645 1121 poly_int64 *size_p)
27d020cf 1122{
c628d1c3 1123 tree res = unmodified_parm_1 (fbi, stmt, op, size_p);
27d020cf
JH
1124 if (res)
1125 return res;
1126
1127 if (TREE_CODE (op) == SSA_NAME
1128 && !SSA_NAME_IS_DEFAULT_DEF (op)
1129 && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
c628d1c3 1130 return unmodified_parm (fbi, SSA_NAME_DEF_STMT (op),
27d020cf
JH
1131 gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)),
1132 size_p);
1133 return NULL_TREE;
1134}
1135
1136/* If OP refers to a value of a function parameter or value loaded from an
1137 aggregate passed to a parameter (either by value or reference), return TRUE
1138 and store the number of the parameter to *INDEX_P, the access size into
1139 *SIZE_P, and information whether and how it has been loaded from an
1140 aggregate into *AGGPOS. INFO describes the function parameters, STMT is the
1141 statement in which OP is used or loaded. */
1142
1143static bool
1144unmodified_parm_or_parm_agg_item (struct ipa_func_body_info *fbi,
1145 gimple *stmt, tree op, int *index_p,
86003645 1146 poly_int64 *size_p,
27d020cf
JH
1147 struct agg_position_info *aggpos)
1148{
c628d1c3 1149 tree res = unmodified_parm_1 (fbi, stmt, op, size_p);
27d020cf
JH
1150
1151 gcc_checking_assert (aggpos);
1152 if (res)
1153 {
1154 *index_p = ipa_get_param_decl_index (fbi->info, res);
1155 if (*index_p < 0)
1156 return false;
1157 aggpos->agg_contents = false;
1158 aggpos->by_ref = false;
1159 return true;
1160 }
1161
1162 if (TREE_CODE (op) == SSA_NAME)
1163 {
1164 if (SSA_NAME_IS_DEFAULT_DEF (op)
1165 || !gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1166 return false;
1167 stmt = SSA_NAME_DEF_STMT (op);
1168 op = gimple_assign_rhs1 (stmt);
1169 if (!REFERENCE_CLASS_P (op))
1170 return unmodified_parm_or_parm_agg_item (fbi, stmt, op, index_p, size_p,
1171 aggpos);
1172 }
1173
1174 aggpos->agg_contents = true;
1175 return ipa_load_from_parm_agg (fbi, fbi->info->descriptors,
1176 stmt, op, index_p, &aggpos->offset,
1177 size_p, &aggpos->by_ref);
1178}
1179
1180/* See if statement might disappear after inlining.
1181 0 - means not eliminated
1182 1 - half of statements goes away
1183 2 - for sure it is eliminated.
1184 We are not terribly sophisticated, basically looking for simple abstraction
1185 penalty wrappers. */
1186
1187static int
c628d1c3 1188eliminated_by_inlining_prob (ipa_func_body_info *fbi, gimple *stmt)
27d020cf
JH
1189{
1190 enum gimple_code code = gimple_code (stmt);
1191 enum tree_code rhs_code;
1192
1193 if (!optimize)
1194 return 0;
1195
1196 switch (code)
1197 {
1198 case GIMPLE_RETURN:
1199 return 2;
1200 case GIMPLE_ASSIGN:
1201 if (gimple_num_ops (stmt) != 2)
1202 return 0;
1203
1204 rhs_code = gimple_assign_rhs_code (stmt);
1205
1206 /* Casts of parameters, loads from parameters passed by reference
1207 and stores to return value or parameters are often free after
956d615d 1208 inlining due to SRA and further combining.
27d020cf
JH
1209 Assume that half of statements goes away. */
1210 if (CONVERT_EXPR_CODE_P (rhs_code)
1211 || rhs_code == VIEW_CONVERT_EXPR
1212 || rhs_code == ADDR_EXPR
1213 || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1214 {
1215 tree rhs = gimple_assign_rhs1 (stmt);
1216 tree lhs = gimple_assign_lhs (stmt);
1217 tree inner_rhs = get_base_address (rhs);
1218 tree inner_lhs = get_base_address (lhs);
1219 bool rhs_free = false;
1220 bool lhs_free = false;
1221
1222 if (!inner_rhs)
1223 inner_rhs = rhs;
1224 if (!inner_lhs)
1225 inner_lhs = lhs;
1226
1227 /* Reads of parameter are expected to be free. */
c628d1c3 1228 if (unmodified_parm (fbi, stmt, inner_rhs, NULL))
27d020cf
JH
1229 rhs_free = true;
1230 /* Match expressions of form &this->field. Those will most likely
1231 combine with something upstream after inlining. */
1232 else if (TREE_CODE (inner_rhs) == ADDR_EXPR)
1233 {
1234 tree op = get_base_address (TREE_OPERAND (inner_rhs, 0));
1235 if (TREE_CODE (op) == PARM_DECL)
1236 rhs_free = true;
1237 else if (TREE_CODE (op) == MEM_REF
c628d1c3
MJ
1238 && unmodified_parm (fbi, stmt, TREE_OPERAND (op, 0),
1239 NULL))
27d020cf
JH
1240 rhs_free = true;
1241 }
1242
1243 /* When parameter is not SSA register because its address is taken
1244 and it is just copied into one, the statement will be completely
1245 free after inlining (we will copy propagate backward). */
1246 if (rhs_free && is_gimple_reg (lhs))
1247 return 2;
1248
1249 /* Reads of parameters passed by reference
1250 expected to be free (i.e. optimized out after inlining). */
1251 if (TREE_CODE (inner_rhs) == MEM_REF
c628d1c3 1252 && unmodified_parm (fbi, stmt, TREE_OPERAND (inner_rhs, 0), NULL))
27d020cf
JH
1253 rhs_free = true;
1254
1255 /* Copying parameter passed by reference into gimple register is
1256 probably also going to copy propagate, but we can't be quite
1257 sure. */
1258 if (rhs_free && is_gimple_reg (lhs))
1259 lhs_free = true;
1260
1261 /* Writes to parameters, parameters passed by value and return value
956d615d 1262 (either directly or passed via invisible reference) are free.
27d020cf
JH
1263
1264 TODO: We ought to handle testcase like
1265 struct a {int a,b;};
1266 struct a
956d615d 1267 returnstruct (void)
27d020cf
JH
1268 {
1269 struct a a ={1,2};
1270 return a;
1271 }
1272
1273 This translate into:
1274
956d615d 1275 returnstruct ()
27d020cf
JH
1276 {
1277 int a$b;
1278 int a$a;
1279 struct a a;
1280 struct a D.2739;
1281
1282 <bb 2>:
1283 D.2739.a = 1;
1284 D.2739.b = 2;
1285 return D.2739;
1286
1287 }
1288 For that we either need to copy ipa-split logic detecting writes
1289 to return value. */
1290 if (TREE_CODE (inner_lhs) == PARM_DECL
1291 || TREE_CODE (inner_lhs) == RESULT_DECL
1292 || (TREE_CODE (inner_lhs) == MEM_REF
c628d1c3
MJ
1293 && (unmodified_parm (fbi, stmt, TREE_OPERAND (inner_lhs, 0),
1294 NULL)
27d020cf
JH
1295 || (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
1296 && SSA_NAME_VAR (TREE_OPERAND (inner_lhs, 0))
1297 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND
1298 (inner_lhs,
1299 0))) == RESULT_DECL))))
1300 lhs_free = true;
1301 if (lhs_free
1302 && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1303 rhs_free = true;
1304 if (lhs_free && rhs_free)
1305 return 1;
1306 }
1307 return 0;
1308 default:
1309 return 0;
1310 }
1311}
1312
4307a485
FX
1313/* Analyze EXPR if it represents a series of simple operations performed on
1314 a function parameter and return true if so. FBI, STMT, EXPR, INDEX_P and
1315 AGGPOS have the same meaning like in unmodified_parm_or_parm_agg_item.
1316 Type of the parameter or load from an aggregate via the parameter is
1317 stored in *TYPE_P. Operations on the parameter are recorded to
1318 PARAM_OPS_P if it is not NULL. */
1319
1320static bool
1321decompose_param_expr (struct ipa_func_body_info *fbi,
1322 gimple *stmt, tree expr,
1323 int *index_p, tree *type_p,
1324 struct agg_position_info *aggpos,
1325 expr_eval_ops *param_ops_p = NULL)
1326{
028d4092 1327 int op_limit = param_ipa_max_param_expr_ops;
4307a485
FX
1328 int op_count = 0;
1329
1330 if (param_ops_p)
1331 *param_ops_p = NULL;
1332
1333 while (true)
1334 {
1335 expr_eval_op eval_op;
1336 unsigned rhs_count;
1337 unsigned cst_count = 0;
1338
1339 if (unmodified_parm_or_parm_agg_item (fbi, stmt, expr, index_p, NULL,
1340 aggpos))
1341 {
1342 tree type = TREE_TYPE (expr);
1343
1344 if (aggpos->agg_contents)
1345 {
1346 /* Stop if containing bit-field. */
1347 if (TREE_CODE (expr) == BIT_FIELD_REF
1348 || contains_bitfld_component_ref_p (expr))
1349 break;
1350 }
1351
1352 *type_p = type;
1353 return true;
1354 }
1355
1356 if (TREE_CODE (expr) != SSA_NAME || SSA_NAME_IS_DEFAULT_DEF (expr))
1357 break;
1358
1359 if (!is_gimple_assign (stmt = SSA_NAME_DEF_STMT (expr)))
1360 break;
1361
1362 switch (gimple_assign_rhs_class (stmt))
1363 {
1364 case GIMPLE_SINGLE_RHS:
1365 expr = gimple_assign_rhs1 (stmt);
1366 continue;
1367
1368 case GIMPLE_UNARY_RHS:
1369 rhs_count = 1;
1370 break;
1371
1372 case GIMPLE_BINARY_RHS:
1373 rhs_count = 2;
1374 break;
1375
1376 case GIMPLE_TERNARY_RHS:
1377 rhs_count = 3;
1378 break;
1379
1380 default:
1381 goto fail;
1382 }
1383
1384 /* Stop if expression is too complex. */
1385 if (op_count++ == op_limit)
1386 break;
1387
1388 if (param_ops_p)
1389 {
1390 eval_op.code = gimple_assign_rhs_code (stmt);
1391 eval_op.type = TREE_TYPE (gimple_assign_lhs (stmt));
1392 eval_op.val[0] = NULL_TREE;
1393 eval_op.val[1] = NULL_TREE;
1394 }
1395
1396 expr = NULL_TREE;
1397 for (unsigned i = 0; i < rhs_count; i++)
1398 {
1399 tree op = gimple_op (stmt, i + 1);
1400
1401 gcc_assert (op && !TYPE_P (op));
1402 if (is_gimple_ip_invariant (op))
1403 {
1404 if (++cst_count == rhs_count)
1405 goto fail;
1406
1407 eval_op.val[cst_count - 1] = op;
1408 }
1409 else if (!expr)
1410 {
1411 /* Found a non-constant operand, and record its index in rhs
1412 operands. */
1413 eval_op.index = i;
1414 expr = op;
1415 }
1416 else
1417 {
1418 /* Found more than one non-constant operands. */
1419 goto fail;
1420 }
1421 }
1422
1423 if (param_ops_p)
1424 vec_safe_insert (*param_ops_p, 0, eval_op);
1425 }
1426
1427 /* Failed to decompose, free resource and return. */
1428fail:
1429 if (param_ops_p)
1430 vec_free (*param_ops_p);
1431
1432 return false;
1433}
27d020cf
JH
1434
1435/* If BB ends by a conditional we can turn into predicates, attach corresponding
1436 predicates to the CFG edges. */
1437
1438static void
1439set_cond_stmt_execution_predicate (struct ipa_func_body_info *fbi,
99b1c316 1440 class ipa_fn_summary *summary,
40a777e8 1441 class ipa_node_params *params_summary,
27d020cf
JH
1442 basic_block bb)
1443{
1444 gimple *last;
4307a485 1445 tree op, op2;
27d020cf 1446 int index;
27d020cf
JH
1447 struct agg_position_info aggpos;
1448 enum tree_code code, inverted_code;
1449 edge e;
1450 edge_iterator ei;
1451 gimple *set_stmt;
4307a485
FX
1452 tree param_type;
1453 expr_eval_ops param_ops;
27d020cf
JH
1454
1455 last = last_stmt (bb);
1456 if (!last || gimple_code (last) != GIMPLE_COND)
1457 return;
1458 if (!is_gimple_ip_invariant (gimple_cond_rhs (last)))
1459 return;
1460 op = gimple_cond_lhs (last);
4307a485
FX
1461
1462 if (decompose_param_expr (fbi, last, op, &index, &param_type, &aggpos,
1463 &param_ops))
27d020cf
JH
1464 {
1465 code = gimple_cond_code (last);
1466 inverted_code = invert_tree_comparison (code, HONOR_NANS (op));
1467
1468 FOR_EACH_EDGE (e, ei, bb->succs)
1469 {
1470 enum tree_code this_code = (e->flags & EDGE_TRUE_VALUE
1471 ? code : inverted_code);
1472 /* invert_tree_comparison will return ERROR_MARK on FP
956d615d 1473 comparisons that are not EQ/NE instead of returning proper
efe12656
FX
1474 unordered one. Be sure it is not confused with NON_CONSTANT.
1475
1476 And if the edge's target is the final block of diamond CFG graph
1477 of this conditional statement, we do not need to compute
1478 predicate for the edge because the final block's predicate must
1479 be at least as that of the first block of the statement. */
1480 if (this_code != ERROR_MARK
1481 && !dominated_by_p (CDI_POST_DOMINATORS, bb, e->dest))
27d020cf
JH
1482 {
1483 predicate p
40a777e8
JH
1484 = add_condition (summary, params_summary, index,
1485 param_type, &aggpos,
4307a485 1486 this_code, gimple_cond_rhs (last), param_ops);
27d020cf
JH
1487 e->aux = edge_predicate_pool.allocate ();
1488 *(predicate *) e->aux = p;
1489 }
1490 }
4307a485 1491 vec_free (param_ops);
27d020cf
JH
1492 }
1493
1494 if (TREE_CODE (op) != SSA_NAME)
1495 return;
1496 /* Special case
1497 if (builtin_constant_p (op))
1498 constant_code
1499 else
1500 nonconstant_code.
1501 Here we can predicate nonconstant_code. We can't
1502 really handle constant_code since we have no predicate
1503 for this and also the constant code is not known to be
956d615d 1504 optimized away when inliner doesn't see operand is constant.
27d020cf
JH
1505 Other optimizers might think otherwise. */
1506 if (gimple_cond_code (last) != NE_EXPR
1507 || !integer_zerop (gimple_cond_rhs (last)))
1508 return;
1509 set_stmt = SSA_NAME_DEF_STMT (op);
1510 if (!gimple_call_builtin_p (set_stmt, BUILT_IN_CONSTANT_P)
1511 || gimple_call_num_args (set_stmt) != 1)
1512 return;
1513 op2 = gimple_call_arg (set_stmt, 0);
4307a485 1514 if (!decompose_param_expr (fbi, set_stmt, op2, &index, &param_type, &aggpos))
27d020cf
JH
1515 return;
1516 FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_FALSE_VALUE)
1517 {
40a777e8
JH
1518 predicate p = add_condition (summary, params_summary, index,
1519 param_type, &aggpos,
27d020cf
JH
1520 predicate::is_not_constant, NULL_TREE);
1521 e->aux = edge_predicate_pool.allocate ();
1522 *(predicate *) e->aux = p;
1523 }
1524}
1525
1526
1527/* If BB ends by a switch we can turn into predicates, attach corresponding
1528 predicates to the CFG edges. */
1529
1530static void
1531set_switch_stmt_execution_predicate (struct ipa_func_body_info *fbi,
99b1c316 1532 class ipa_fn_summary *summary,
40a777e8 1533 class ipa_node_params *params_summary,
27d020cf
JH
1534 basic_block bb)
1535{
1536 gimple *lastg;
1537 tree op;
1538 int index;
27d020cf
JH
1539 struct agg_position_info aggpos;
1540 edge e;
1541 edge_iterator ei;
1542 size_t n;
1543 size_t case_idx;
4307a485
FX
1544 tree param_type;
1545 expr_eval_ops param_ops;
27d020cf
JH
1546
1547 lastg = last_stmt (bb);
1548 if (!lastg || gimple_code (lastg) != GIMPLE_SWITCH)
1549 return;
1550 gswitch *last = as_a <gswitch *> (lastg);
1551 op = gimple_switch_index (last);
4307a485
FX
1552 if (!decompose_param_expr (fbi, last, op, &index, &param_type, &aggpos,
1553 &param_ops))
27d020cf
JH
1554 return;
1555
351e7c3b
FX
1556 auto_vec<std::pair<tree, tree> > ranges;
1557 tree type = TREE_TYPE (op);
028d4092 1558 int bound_limit = param_ipa_max_switch_predicate_bounds;
351e7c3b
FX
1559 int bound_count = 0;
1560 wide_int vr_wmin, vr_wmax;
1561 value_range_kind vr_type = get_range_info (op, &vr_wmin, &vr_wmax);
1562
27d020cf
JH
1563 FOR_EACH_EDGE (e, ei, bb->succs)
1564 {
1565 e->aux = edge_predicate_pool.allocate ();
1566 *(predicate *) e->aux = false;
1567 }
351e7c3b 1568
efe12656
FX
1569 e = gimple_switch_edge (cfun, last, 0);
1570 /* Set BOUND_COUNT to maximum count to bypass computing predicate for
1571 default case if its target basic block is in convergence point of all
1572 switch cases, which can be determined by checking whether it
1573 post-dominates the switch statement. */
1574 if (dominated_by_p (CDI_POST_DOMINATORS, bb, e->dest))
1575 bound_count = INT_MAX;
1576
27d020cf 1577 n = gimple_switch_num_labels (last);
351e7c3b 1578 for (case_idx = 1; case_idx < n; ++case_idx)
27d020cf
JH
1579 {
1580 tree cl = gimple_switch_label (last, case_idx);
efe12656
FX
1581 tree min = CASE_LOW (cl);
1582 tree max = CASE_HIGH (cl);
27d020cf
JH
1583 predicate p;
1584
4307a485
FX
1585 e = gimple_switch_edge (cfun, last, case_idx);
1586
efe12656
FX
1587 /* The case value might not have same type as switch expression,
1588 extend the value based on the expression type. */
1589 if (TREE_TYPE (min) != type)
1590 min = wide_int_to_tree (type, wi::to_wide (min));
27d020cf 1591
351e7c3b 1592 if (!max)
efe12656
FX
1593 max = min;
1594 else if (TREE_TYPE (max) != type)
1595 max = wide_int_to_tree (type, wi::to_wide (max));
1596
1597 /* The case's target basic block is in convergence point of all switch
1598 cases, its predicate should be at least as that of the switch
1599 statement. */
1600 if (dominated_by_p (CDI_POST_DOMINATORS, bb, e->dest))
1601 p = true;
1602 else if (min == max)
40a777e8
JH
1603 p = add_condition (summary, params_summary, index, param_type,
1604 &aggpos, EQ_EXPR, min, param_ops);
27d020cf
JH
1605 else
1606 {
1607 predicate p1, p2;
40a777e8
JH
1608 p1 = add_condition (summary, params_summary, index, param_type,
1609 &aggpos, GE_EXPR, min, param_ops);
1610 p2 = add_condition (summary, params_summary,index, param_type,
1611 &aggpos, LE_EXPR, max, param_ops);
27d020cf
JH
1612 p = p1 & p2;
1613 }
99b1c316
MS
1614 *(class predicate *) e->aux
1615 = p.or_with (summary->conds, *(class predicate *) e->aux);
351e7c3b
FX
1616
1617 /* If there are too many disjoint case ranges, predicate for default
1618 case might become too complicated. So add a limit here. */
1619 if (bound_count > bound_limit)
1620 continue;
1621
1622 bool new_range = true;
1623
1624 if (!ranges.is_empty ())
1625 {
1626 wide_int curr_wmin = wi::to_wide (min);
1627 wide_int last_wmax = wi::to_wide (ranges.last ().second);
1628
1629 /* Merge case ranges if they are continuous. */
1630 if (curr_wmin == last_wmax + 1)
1631 new_range = false;
1632 else if (vr_type == VR_ANTI_RANGE)
1633 {
1634 /* If two disjoint case ranges can be connected by anti-range
1635 of switch index, combine them to one range. */
1636 if (wi::lt_p (vr_wmax, curr_wmin - 1, TYPE_SIGN (type)))
1637 vr_type = VR_UNDEFINED;
1638 else if (wi::le_p (vr_wmin, last_wmax + 1, TYPE_SIGN (type)))
1639 new_range = false;
1640 }
1641 }
1642
351e7c3b
FX
1643 /* Create/extend a case range. And we count endpoints of range set,
1644 this number nearly equals to number of conditions that we will create
1645 for predicate of default case. */
1646 if (new_range)
1647 {
1648 bound_count += (min == max) ? 1 : 2;
1649 ranges.safe_push (std::make_pair (min, max));
1650 }
1651 else
1652 {
1653 bound_count += (ranges.last ().first == ranges.last ().second);
1654 ranges.last ().second = max;
1655 }
1656 }
1657
1658 e = gimple_switch_edge (cfun, last, 0);
1659 if (bound_count > bound_limit)
1660 {
1661 *(class predicate *) e->aux = true;
4307a485 1662 vec_free (param_ops);
351e7c3b 1663 return;
27d020cf 1664 }
351e7c3b
FX
1665
1666 predicate p_seg = true;
1667 predicate p_all = false;
1668
1669 if (vr_type != VR_RANGE)
1670 {
1671 vr_wmin = wi::to_wide (TYPE_MIN_VALUE (type));
1672 vr_wmax = wi::to_wide (TYPE_MAX_VALUE (type));
1673 }
1674
1675 /* Construct predicate to represent default range set that is negation of
1676 all case ranges. Case range is classified as containing single/non-single
1677 values. Suppose a piece of case ranges in the following.
1678
1679 [D1...D2] [S1] ... [Sn] [D3...D4]
1680
1681 To represent default case's range sets between two non-single value
1682 case ranges (From D2 to D3), we construct predicate as:
1683
1684 D2 < x < D3 && x != S1 && ... && x != Sn
1685 */
1686 for (size_t i = 0; i < ranges.length (); i++)
1687 {
1688 tree min = ranges[i].first;
1689 tree max = ranges[i].second;
1690
1691 if (min == max)
40a777e8
JH
1692 p_seg &= add_condition (summary, params_summary, index,
1693 param_type, &aggpos, NE_EXPR,
4307a485 1694 min, param_ops);
351e7c3b
FX
1695 else
1696 {
1697 /* Do not create sub-predicate for range that is beyond low bound
1698 of switch index. */
1699 if (wi::lt_p (vr_wmin, wi::to_wide (min), TYPE_SIGN (type)))
1700 {
40a777e8
JH
1701 p_seg &= add_condition (summary, params_summary, index,
1702 param_type, &aggpos,
4307a485 1703 LT_EXPR, min, param_ops);
351e7c3b
FX
1704 p_all = p_all.or_with (summary->conds, p_seg);
1705 }
1706
1707 /* Do not create sub-predicate for range that is beyond up bound
1708 of switch index. */
1709 if (wi::le_p (vr_wmax, wi::to_wide (max), TYPE_SIGN (type)))
1710 {
1711 p_seg = false;
1712 break;
1713 }
1714
40a777e8
JH
1715 p_seg = add_condition (summary, params_summary, index,
1716 param_type, &aggpos, GT_EXPR,
4307a485 1717 max, param_ops);
351e7c3b
FX
1718 }
1719 }
1720
1721 p_all = p_all.or_with (summary->conds, p_seg);
1722 *(class predicate *) e->aux
1723 = p_all.or_with (summary->conds, *(class predicate *) e->aux);
4307a485
FX
1724
1725 vec_free (param_ops);
27d020cf
JH
1726}
1727
1728
1729/* For each BB in NODE attach to its AUX pointer predicate under
1730 which it is executable. */
1731
1732static void
1733compute_bb_predicates (struct ipa_func_body_info *fbi,
1734 struct cgraph_node *node,
40a777e8
JH
1735 class ipa_fn_summary *summary,
1736 class ipa_node_params *params_summary)
27d020cf
JH
1737{
1738 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1739 bool done = false;
1740 basic_block bb;
1741
1742 FOR_EACH_BB_FN (bb, my_function)
1743 {
40a777e8
JH
1744 set_cond_stmt_execution_predicate (fbi, summary, params_summary, bb);
1745 set_switch_stmt_execution_predicate (fbi, summary, params_summary, bb);
27d020cf
JH
1746 }
1747
1748 /* Entry block is always executable. */
1749 ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux
1750 = edge_predicate_pool.allocate ();
1751 *(predicate *) ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux = true;
1752
1753 /* A simple dataflow propagation of predicates forward in the CFG.
1754 TODO: work in reverse postorder. */
1755 while (!done)
1756 {
1757 done = true;
1758 FOR_EACH_BB_FN (bb, my_function)
1759 {
1760 predicate p = false;
1761 edge e;
1762 edge_iterator ei;
1763 FOR_EACH_EDGE (e, ei, bb->preds)
1764 {
1765 if (e->src->aux)
1766 {
1767 predicate this_bb_predicate
1768 = *(predicate *) e->src->aux;
1769 if (e->aux)
99b1c316 1770 this_bb_predicate &= (*(class predicate *) e->aux);
27d020cf
JH
1771 p = p.or_with (summary->conds, this_bb_predicate);
1772 if (p == true)
1773 break;
1774 }
1775 }
efe12656 1776 if (p != false)
27d020cf 1777 {
efe12656
FX
1778 basic_block pdom_bb;
1779
27d020cf
JH
1780 if (!bb->aux)
1781 {
1782 done = false;
1783 bb->aux = edge_predicate_pool.allocate ();
1784 *((predicate *) bb->aux) = p;
1785 }
1786 else if (p != *(predicate *) bb->aux)
1787 {
1788 /* This OR operation is needed to ensure monotonous data flow
1789 in the case we hit the limit on number of clauses and the
1790 and/or operations above give approximate answers. */
1791 p = p.or_with (summary->conds, *(predicate *)bb->aux);
1792 if (p != *(predicate *) bb->aux)
1793 {
1794 done = false;
1795 *((predicate *) bb->aux) = p;
1796 }
1797 }
efe12656
FX
1798
1799 /* For switch/if statement, we can OR-combine predicates of all
1800 its cases/branches to get predicate for basic block in their
1801 convergence point, but sometimes this will generate very
1802 complicated predicate. Actually, we can get simplified
1803 predicate in another way by using the fact that predicate
1804 for a basic block must also hold true for its post dominators.
1805 To be specific, basic block in convergence point of
1806 conditional statement should include predicate of the
1807 statement. */
1808 pdom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
1809 if (pdom_bb == EXIT_BLOCK_PTR_FOR_FN (my_function) || !pdom_bb)
1810 ;
1811 else if (!pdom_bb->aux)
1812 {
1813 done = false;
1814 pdom_bb->aux = edge_predicate_pool.allocate ();
1815 *((predicate *) pdom_bb->aux) = p;
1816 }
1817 else if (p != *(predicate *) pdom_bb->aux)
1818 {
1819 p = p.or_with (summary->conds, *(predicate *)pdom_bb->aux);
1820 if (p != *(predicate *) pdom_bb->aux)
1821 {
1822 done = false;
1823 *((predicate *) pdom_bb->aux) = p;
1824 }
1825 }
27d020cf
JH
1826 }
1827 }
1828 }
1829}
1830
1831
1832/* Return predicate specifying when the STMT might have result that is not
1833 a compile time constant. */
1834
1835static predicate
c628d1c3 1836will_be_nonconstant_expr_predicate (ipa_func_body_info *fbi,
99b1c316 1837 class ipa_fn_summary *summary,
40a777e8 1838 class ipa_node_params *params_summary,
27d020cf
JH
1839 tree expr,
1840 vec<predicate> nonconstant_names)
1841{
1842 tree parm;
1843 int index;
27d020cf
JH
1844
1845 while (UNARY_CLASS_P (expr))
1846 expr = TREE_OPERAND (expr, 0);
1847
4307a485 1848 parm = unmodified_parm (fbi, NULL, expr, NULL);
c628d1c3 1849 if (parm && (index = ipa_get_param_decl_index (fbi->info, parm)) >= 0)
40a777e8 1850 return add_condition (summary, params_summary, index, TREE_TYPE (parm), NULL,
4307a485 1851 predicate::changed, NULL_TREE);
27d020cf
JH
1852 if (is_gimple_min_invariant (expr))
1853 return false;
1854 if (TREE_CODE (expr) == SSA_NAME)
1855 return nonconstant_names[SSA_NAME_VERSION (expr)];
1856 if (BINARY_CLASS_P (expr) || COMPARISON_CLASS_P (expr))
1857 {
c628d1c3
MJ
1858 predicate p1
1859 = will_be_nonconstant_expr_predicate (fbi, summary,
40a777e8 1860 params_summary,
c628d1c3
MJ
1861 TREE_OPERAND (expr, 0),
1862 nonconstant_names);
27d020cf
JH
1863 if (p1 == true)
1864 return p1;
1865
c628d1c3
MJ
1866 predicate p2
1867 = will_be_nonconstant_expr_predicate (fbi, summary,
40a777e8 1868 params_summary,
c628d1c3
MJ
1869 TREE_OPERAND (expr, 1),
1870 nonconstant_names);
27d020cf
JH
1871 return p1.or_with (summary->conds, p2);
1872 }
1873 else if (TREE_CODE (expr) == COND_EXPR)
1874 {
c628d1c3
MJ
1875 predicate p1
1876 = will_be_nonconstant_expr_predicate (fbi, summary,
40a777e8 1877 params_summary,
c628d1c3
MJ
1878 TREE_OPERAND (expr, 0),
1879 nonconstant_names);
27d020cf
JH
1880 if (p1 == true)
1881 return p1;
1882
c628d1c3
MJ
1883 predicate p2
1884 = will_be_nonconstant_expr_predicate (fbi, summary,
40a777e8 1885 params_summary,
c628d1c3
MJ
1886 TREE_OPERAND (expr, 1),
1887 nonconstant_names);
27d020cf
JH
1888 if (p2 == true)
1889 return p2;
1890 p1 = p1.or_with (summary->conds, p2);
c628d1c3 1891 p2 = will_be_nonconstant_expr_predicate (fbi, summary,
40a777e8 1892 params_summary,
27d020cf
JH
1893 TREE_OPERAND (expr, 2),
1894 nonconstant_names);
1895 return p2.or_with (summary->conds, p1);
1896 }
5126ae0c
KV
1897 else if (TREE_CODE (expr) == CALL_EXPR)
1898 return true;
27d020cf
JH
1899 else
1900 {
1901 debug_tree (expr);
1902 gcc_unreachable ();
1903 }
1904 return false;
1905}
1906
1907
1908/* Return predicate specifying when the STMT might have result that is not
1909 a compile time constant. */
1910
1911static predicate
1912will_be_nonconstant_predicate (struct ipa_func_body_info *fbi,
99b1c316 1913 class ipa_fn_summary *summary,
40a777e8 1914 class ipa_node_params *params_summary,
27d020cf
JH
1915 gimple *stmt,
1916 vec<predicate> nonconstant_names)
1917{
1918 predicate p = true;
1919 ssa_op_iter iter;
1920 tree use;
4307a485 1921 tree param_type = NULL_TREE;
27d020cf
JH
1922 predicate op_non_const;
1923 bool is_load;
1924 int base_index;
27d020cf
JH
1925 struct agg_position_info aggpos;
1926
956d615d 1927 /* What statements might be optimized away
27d020cf
JH
1928 when their arguments are constant. */
1929 if (gimple_code (stmt) != GIMPLE_ASSIGN
1930 && gimple_code (stmt) != GIMPLE_COND
1931 && gimple_code (stmt) != GIMPLE_SWITCH
1932 && (gimple_code (stmt) != GIMPLE_CALL
1933 || !(gimple_call_flags (stmt) & ECF_CONST)))
1934 return p;
1935
1936 /* Stores will stay anyway. */
1937 if (gimple_store_p (stmt))
1938 return p;
1939
1940 is_load = gimple_assign_load_p (stmt);
1941
1942 /* Loads can be optimized when the value is known. */
1943 if (is_load)
1944 {
4307a485
FX
1945 tree op = gimple_assign_rhs1 (stmt);
1946 if (!decompose_param_expr (fbi, stmt, op, &base_index, &param_type,
1947 &aggpos))
27d020cf
JH
1948 return p;
1949 }
1950 else
1951 base_index = -1;
1952
1953 /* See if we understand all operands before we start
1954 adding conditionals. */
1955 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1956 {
c628d1c3 1957 tree parm = unmodified_parm (fbi, stmt, use, NULL);
27d020cf
JH
1958 /* For arguments we can build a condition. */
1959 if (parm && ipa_get_param_decl_index (fbi->info, parm) >= 0)
1960 continue;
1961 if (TREE_CODE (use) != SSA_NAME)
1962 return p;
1963 /* If we know when operand is constant,
1964 we still can say something useful. */
1965 if (nonconstant_names[SSA_NAME_VERSION (use)] != true)
1966 continue;
1967 return p;
1968 }
1969
1970 if (is_load)
1971 op_non_const =
40a777e8
JH
1972 add_condition (summary, params_summary,
1973 base_index, param_type, &aggpos,
4307a485 1974 predicate::changed, NULL_TREE);
27d020cf
JH
1975 else
1976 op_non_const = false;
1977 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1978 {
4307a485 1979 tree parm = unmodified_parm (fbi, stmt, use, NULL);
27d020cf
JH
1980 int index;
1981
1982 if (parm && (index = ipa_get_param_decl_index (fbi->info, parm)) >= 0)
1983 {
1984 if (index != base_index)
40a777e8
JH
1985 p = add_condition (summary, params_summary, index,
1986 TREE_TYPE (parm), NULL,
4307a485 1987 predicate::changed, NULL_TREE);
27d020cf
JH
1988 else
1989 continue;
1990 }
1991 else
1992 p = nonconstant_names[SSA_NAME_VERSION (use)];
1993 op_non_const = p.or_with (summary->conds, op_non_const);
1994 }
1995 if ((gimple_code (stmt) == GIMPLE_ASSIGN || gimple_code (stmt) == GIMPLE_CALL)
1996 && gimple_op (stmt, 0)
1997 && TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
1998 nonconstant_names[SSA_NAME_VERSION (gimple_op (stmt, 0))]
1999 = op_non_const;
2000 return op_non_const;
2001}
2002
2003struct record_modified_bb_info
2004{
3b2a6901 2005 tree op;
27d020cf
JH
2006 bitmap bb_set;
2007 gimple *stmt;
2008};
2009
956d615d 2010/* Value is initialized in INIT_BB and used in USE_BB. We want to compute
27d020cf 2011 probability how often it changes between USE_BB.
3b2a6901 2012 INIT_BB->count/USE_BB->count is an estimate, but if INIT_BB
27d020cf
JH
2013 is in different loop nest, we can do better.
2014 This is all just estimate. In theory we look for minimal cut separating
2015 INIT_BB and USE_BB, but we only want to anticipate loop invariant motion
2016 anyway. */
2017
2018static basic_block
2019get_minimal_bb (basic_block init_bb, basic_block use_bb)
2020{
99b1c316 2021 class loop *l = find_common_loop (init_bb->loop_father, use_bb->loop_father);
e7a74006 2022 if (l && l->header->count < init_bb->count)
27d020cf
JH
2023 return l->header;
2024 return init_bb;
2025}
2026
2027/* Callback of walk_aliased_vdefs. Records basic blocks where the value may be
2028 set except for info->stmt. */
2029
2030static bool
2031record_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
2032{
2033 struct record_modified_bb_info *info =
2034 (struct record_modified_bb_info *) data;
2035 if (SSA_NAME_DEF_STMT (vdef) == info->stmt)
2036 return false;
3b2a6901
JH
2037 if (gimple_clobber_p (SSA_NAME_DEF_STMT (vdef)))
2038 return false;
27d020cf
JH
2039 bitmap_set_bit (info->bb_set,
2040 SSA_NAME_IS_DEFAULT_DEF (vdef)
2041 ? ENTRY_BLOCK_PTR_FOR_FN (cfun)->index
2042 : get_minimal_bb
2043 (gimple_bb (SSA_NAME_DEF_STMT (vdef)),
2044 gimple_bb (info->stmt))->index);
3b2a6901
JH
2045 if (dump_file)
2046 {
2047 fprintf (dump_file, " Param ");
2048 print_generic_expr (dump_file, info->op, TDF_SLIM);
2049 fprintf (dump_file, " changed at bb %i, minimal: %i stmt: ",
2050 gimple_bb (SSA_NAME_DEF_STMT (vdef))->index,
2051 get_minimal_bb
2052 (gimple_bb (SSA_NAME_DEF_STMT (vdef)),
2053 gimple_bb (info->stmt))->index);
2054 print_gimple_stmt (dump_file, SSA_NAME_DEF_STMT (vdef), 0);
2055 }
27d020cf
JH
2056 return false;
2057}
2058
2059/* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
2060 will change since last invocation of STMT.
2061
2062 Value 0 is reserved for compile time invariants.
2063 For common parameters it is REG_BR_PROB_BASE. For loop invariants it
2064 ought to be REG_BR_PROB_BASE / estimated_iters. */
2065
2066static int
c628d1c3 2067param_change_prob (ipa_func_body_info *fbi, gimple *stmt, int i)
27d020cf
JH
2068{
2069 tree op = gimple_call_arg (stmt, i);
2070 basic_block bb = gimple_bb (stmt);
2071
2072 if (TREE_CODE (op) == WITH_SIZE_EXPR)
2073 op = TREE_OPERAND (op, 0);
2074
2075 tree base = get_base_address (op);
2076
2077 /* Global invariants never change. */
2078 if (is_gimple_min_invariant (base))
2079 return 0;
2080
2081 /* We would have to do non-trivial analysis to really work out what
2082 is the probability of value to change (i.e. when init statement
2083 is in a sibling loop of the call).
2084
2085 We do an conservative estimate: when call is executed N times more often
2086 than the statement defining value, we take the frequency 1/N. */
2087 if (TREE_CODE (base) == SSA_NAME)
2088 {
3b2a6901 2089 profile_count init_count;
27d020cf 2090
3b2a6901 2091 if (!bb->count.nonzero_p ())
27d020cf
JH
2092 return REG_BR_PROB_BASE;
2093
2094 if (SSA_NAME_IS_DEFAULT_DEF (base))
3b2a6901 2095 init_count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
27d020cf 2096 else
3b2a6901 2097 init_count = get_minimal_bb
27d020cf 2098 (gimple_bb (SSA_NAME_DEF_STMT (base)),
3b2a6901 2099 gimple_bb (stmt))->count;
27d020cf 2100
3b2a6901
JH
2101 if (init_count < bb->count)
2102 return MAX ((init_count.to_sreal_scale (bb->count)
2103 * REG_BR_PROB_BASE).to_int (), 1);
2104 return REG_BR_PROB_BASE;
27d020cf
JH
2105 }
2106 else
2107 {
2108 ao_ref refd;
3b2a6901 2109 profile_count max = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
27d020cf 2110 struct record_modified_bb_info info;
27d020cf
JH
2111 tree init = ctor_for_folding (base);
2112
2113 if (init != error_mark_node)
2114 return 0;
3b2a6901 2115 if (!bb->count.nonzero_p ())
27d020cf 2116 return REG_BR_PROB_BASE;
3b2a6901
JH
2117 if (dump_file)
2118 {
4307a485 2119 fprintf (dump_file, " Analyzing param change probability of ");
3b2a6901
JH
2120 print_generic_expr (dump_file, op, TDF_SLIM);
2121 fprintf (dump_file, "\n");
2122 }
27d020cf 2123 ao_ref_init (&refd, op);
3b2a6901 2124 info.op = op;
27d020cf
JH
2125 info.stmt = stmt;
2126 info.bb_set = BITMAP_ALLOC (NULL);
c628d1c3
MJ
2127 int walked
2128 = walk_aliased_vdefs (&refd, gimple_vuse (stmt), record_modified, &info,
2129 NULL, NULL, fbi->aa_walk_budget);
2130 if (walked < 0 || bitmap_bit_p (info.bb_set, bb->index))
27d020cf 2131 {
3b2a6901 2132 if (dump_file)
c628d1c3
MJ
2133 {
2134 if (walked < 0)
2135 fprintf (dump_file, " Ran out of AA walking budget.\n");
2136 else
2137 fprintf (dump_file, " Set in same BB as used.\n");
2138 }
27d020cf
JH
2139 BITMAP_FREE (info.bb_set);
2140 return REG_BR_PROB_BASE;
2141 }
2142
3b2a6901
JH
2143 bitmap_iterator bi;
2144 unsigned index;
2145 /* Lookup the most frequent update of the value and believe that
2146 it dominates all the other; precise analysis here is difficult. */
27d020cf 2147 EXECUTE_IF_SET_IN_BITMAP (info.bb_set, 0, index, bi)
3b2a6901
JH
2148 max = max.max (BASIC_BLOCK_FOR_FN (cfun, index)->count);
2149 if (dump_file)
2150 {
2151 fprintf (dump_file, " Set with count ");
2152 max.dump (dump_file);
2153 fprintf (dump_file, " and used with count ");
2154 bb->count.dump (dump_file);
2155 fprintf (dump_file, " freq %f\n",
2156 max.to_sreal_scale (bb->count).to_double ());
2157 }
27d020cf
JH
2158
2159 BITMAP_FREE (info.bb_set);
3b2a6901
JH
2160 if (max < bb->count)
2161 return MAX ((max.to_sreal_scale (bb->count)
2162 * REG_BR_PROB_BASE).to_int (), 1);
2163 return REG_BR_PROB_BASE;
27d020cf
JH
2164 }
2165}
2166
2167/* Find whether a basic block BB is the final block of a (half) diamond CFG
2168 sub-graph and if the predicate the condition depends on is known. If so,
2169 return true and store the pointer the predicate in *P. */
2170
2171static bool
c628d1c3 2172phi_result_unknown_predicate (ipa_func_body_info *fbi,
40a777e8
JH
2173 ipa_fn_summary *summary,
2174 class ipa_node_params *params_summary,
2175 basic_block bb,
27d020cf
JH
2176 predicate *p,
2177 vec<predicate> nonconstant_names)
2178{
2179 edge e;
2180 edge_iterator ei;
2181 basic_block first_bb = NULL;
2182 gimple *stmt;
2183
2184 if (single_pred_p (bb))
2185 {
2186 *p = false;
2187 return true;
2188 }
2189
2190 FOR_EACH_EDGE (e, ei, bb->preds)
2191 {
2192 if (single_succ_p (e->src))
2193 {
2194 if (!single_pred_p (e->src))
2195 return false;
2196 if (!first_bb)
2197 first_bb = single_pred (e->src);
2198 else if (single_pred (e->src) != first_bb)
2199 return false;
2200 }
2201 else
2202 {
2203 if (!first_bb)
2204 first_bb = e->src;
2205 else if (e->src != first_bb)
2206 return false;
2207 }
2208 }
2209
2210 if (!first_bb)
2211 return false;
2212
2213 stmt = last_stmt (first_bb);
2214 if (!stmt
2215 || gimple_code (stmt) != GIMPLE_COND
2216 || !is_gimple_ip_invariant (gimple_cond_rhs (stmt)))
2217 return false;
2218
40a777e8 2219 *p = will_be_nonconstant_expr_predicate (fbi, summary, params_summary,
27d020cf
JH
2220 gimple_cond_lhs (stmt),
2221 nonconstant_names);
2222 if (*p == true)
2223 return false;
2224 else
2225 return true;
2226}
2227
2228/* Given a PHI statement in a function described by inline properties SUMMARY
2229 and *P being the predicate describing whether the selected PHI argument is
2230 known, store a predicate for the result of the PHI statement into
2231 NONCONSTANT_NAMES, if possible. */
2232
2233static void
99b1c316 2234predicate_for_phi_result (class ipa_fn_summary *summary, gphi *phi,
27d020cf
JH
2235 predicate *p,
2236 vec<predicate> nonconstant_names)
2237{
2238 unsigned i;
2239
2240 for (i = 0; i < gimple_phi_num_args (phi); i++)
2241 {
2242 tree arg = gimple_phi_arg (phi, i)->def;
2243 if (!is_gimple_min_invariant (arg))
2244 {
2245 gcc_assert (TREE_CODE (arg) == SSA_NAME);
2246 *p = p->or_with (summary->conds,
2247 nonconstant_names[SSA_NAME_VERSION (arg)]);
2248 if (*p == true)
2249 return;
2250 }
2251 }
2252
2253 if (dump_file && (dump_flags & TDF_DETAILS))
2254 {
2255 fprintf (dump_file, "\t\tphi predicate: ");
2256 p->dump (dump_file, summary->conds);
2257 }
2258 nonconstant_names[SSA_NAME_VERSION (gimple_phi_result (phi))] = *p;
2259}
2260
27d020cf
JH
2261/* For a typical usage of __builtin_expect (a<b, 1), we
2262 may introduce an extra relation stmt:
2263 With the builtin, we have
2264 t1 = a <= b;
2265 t2 = (long int) t1;
2266 t3 = __builtin_expect (t2, 1);
2267 if (t3 != 0)
2268 goto ...
2269 Without the builtin, we have
2270 if (a<=b)
2271 goto...
2272 This affects the size/time estimation and may have
2273 an impact on the earlier inlining.
2274 Here find this pattern and fix it up later. */
2275
2276static gimple *
2277find_foldable_builtin_expect (basic_block bb)
2278{
2279 gimple_stmt_iterator bsi;
2280
2281 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
2282 {
2283 gimple *stmt = gsi_stmt (bsi);
2284 if (gimple_call_builtin_p (stmt, BUILT_IN_EXPECT)
1e9168b2 2285 || gimple_call_builtin_p (stmt, BUILT_IN_EXPECT_WITH_PROBABILITY)
27d020cf
JH
2286 || gimple_call_internal_p (stmt, IFN_BUILTIN_EXPECT))
2287 {
2288 tree var = gimple_call_lhs (stmt);
2289 tree arg = gimple_call_arg (stmt, 0);
2290 use_operand_p use_p;
2291 gimple *use_stmt;
2292 bool match = false;
2293 bool done = false;
2294
2295 if (!var || !arg)
2296 continue;
2297 gcc_assert (TREE_CODE (var) == SSA_NAME);
2298
2299 while (TREE_CODE (arg) == SSA_NAME)
2300 {
2301 gimple *stmt_tmp = SSA_NAME_DEF_STMT (arg);
2302 if (!is_gimple_assign (stmt_tmp))
2303 break;
2304 switch (gimple_assign_rhs_code (stmt_tmp))
2305 {
2306 case LT_EXPR:
2307 case LE_EXPR:
2308 case GT_EXPR:
2309 case GE_EXPR:
2310 case EQ_EXPR:
2311 case NE_EXPR:
2312 match = true;
2313 done = true;
2314 break;
2315 CASE_CONVERT:
2316 break;
2317 default:
2318 done = true;
2319 break;
2320 }
2321 if (done)
2322 break;
2323 arg = gimple_assign_rhs1 (stmt_tmp);
2324 }
2325
2326 if (match && single_imm_use (var, &use_p, &use_stmt)
2327 && gimple_code (use_stmt) == GIMPLE_COND)
2328 return use_stmt;
2329 }
2330 }
2331 return NULL;
2332}
2333
2334/* Return true when the basic blocks contains only clobbers followed by RESX.
2335 Such BBs are kept around to make removal of dead stores possible with
2336 presence of EH and will be optimized out by optimize_clobbers later in the
2337 game.
2338
956d615d 2339 NEED_EH is used to recurse in case the clobber has non-EH predecessors
27d020cf
JH
2340 that can be clobber only, too.. When it is false, the RESX is not necessary
2341 on the end of basic block. */
2342
2343static bool
2344clobber_only_eh_bb_p (basic_block bb, bool need_eh = true)
2345{
2346 gimple_stmt_iterator gsi = gsi_last_bb (bb);
2347 edge_iterator ei;
2348 edge e;
2349
2350 if (need_eh)
2351 {
2352 if (gsi_end_p (gsi))
2353 return false;
2354 if (gimple_code (gsi_stmt (gsi)) != GIMPLE_RESX)
2355 return false;
2356 gsi_prev (&gsi);
2357 }
2358 else if (!single_succ_p (bb))
2359 return false;
2360
2361 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
2362 {
2363 gimple *stmt = gsi_stmt (gsi);
2364 if (is_gimple_debug (stmt))
2365 continue;
2366 if (gimple_clobber_p (stmt))
2367 continue;
2368 if (gimple_code (stmt) == GIMPLE_LABEL)
2369 break;
2370 return false;
2371 }
2372
956d615d 2373 /* See if all predecessors are either throws or clobber only BBs. */
27d020cf
JH
2374 FOR_EACH_EDGE (e, ei, bb->preds)
2375 if (!(e->flags & EDGE_EH)
2376 && !clobber_only_eh_bb_p (e->src, false))
2377 return false;
2378
2379 return true;
2380}
2381
2382/* Return true if STMT compute a floating point expression that may be affected
2383 by -ffast-math and similar flags. */
2384
2385static bool
2386fp_expression_p (gimple *stmt)
2387{
2388 ssa_op_iter i;
2389 tree op;
2390
2391 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF|SSA_OP_USE)
2392 if (FLOAT_TYPE_P (TREE_TYPE (op)))
2393 return true;
2394 return false;
2395}
2396
0bceb671
JH
2397/* Analyze function body for NODE.
2398 EARLY indicates run from early optimization pipeline. */
27d020cf
JH
2399
2400static void
0bceb671 2401analyze_function_body (struct cgraph_node *node, bool early)
27d020cf 2402{
9340d345 2403 sreal time = opt_for_fn (node->decl, param_uninlined_function_time);
27d020cf 2404 /* Estimate static overhead for function prologue/epilogue and alignment. */
9340d345 2405 int size = opt_for_fn (node->decl, param_uninlined_function_insns);
27d020cf
JH
2406 /* Benefits are scaled by probability of elimination that is in range
2407 <0,2>. */
2408 basic_block bb;
2409 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
b71289b1 2410 sreal freq;
99b1c316 2411 class ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
40a777e8 2412 class ipa_node_params *params_summary = early ? NULL : IPA_NODE_REF (node);
27d020cf
JH
2413 predicate bb_predicate;
2414 struct ipa_func_body_info fbi;
2415 vec<predicate> nonconstant_names = vNULL;
2416 int nblocks, n;
2417 int *order;
27d020cf
JH
2418 gimple *fix_builtin_expect_stmt;
2419
2420 gcc_assert (my_function && my_function->cfg);
2421 gcc_assert (cfun == my_function);
2422
2423 memset(&fbi, 0, sizeof(fbi));
ddfb1317 2424 vec_free (info->conds);
27d020cf 2425 info->conds = NULL;
ddfb1317 2426 vec_free (info->size_time_table);
27d020cf
JH
2427 info->size_time_table = NULL;
2428
2429 /* When optimizing and analyzing for IPA inliner, initialize loop optimizer
2430 so we can produce proper inline hints.
2431
2432 When optimizing and analyzing for early inliner, initialize node params
2433 so we can produce correct BB predicates. */
2434
2435 if (opt_for_fn (node->decl, optimize))
2436 {
2437 calculate_dominance_info (CDI_DOMINATORS);
efe12656 2438 calculate_dominance_info (CDI_POST_DOMINATORS);
27d020cf
JH
2439 if (!early)
2440 loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
2441 else
2442 {
2443 ipa_check_create_node_params ();
2444 ipa_initialize_node_params (node);
2445 }
2446
2447 if (ipa_node_params_sum)
2448 {
2449 fbi.node = node;
2450 fbi.info = IPA_NODE_REF (node);
2451 fbi.bb_infos = vNULL;
2452 fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
c628d1c3 2453 fbi.param_count = count_formal_params (node->decl);
028d4092 2454 fbi.aa_walk_budget = param_ipa_max_aa_steps;
c628d1c3 2455
27d020cf
JH
2456 nonconstant_names.safe_grow_cleared
2457 (SSANAMES (my_function)->length ());
2458 }
2459 }
2460
2461 if (dump_file)
2462 fprintf (dump_file, "\nAnalyzing function body size: %s\n",
2463 node->name ());
2464
2465 /* When we run into maximal number of entries, we assign everything to the
2466 constant truth case. Be sure to have it in list. */
2467 bb_predicate = true;
2468 info->account_size_time (0, 0, bb_predicate, bb_predicate);
2469
2470 bb_predicate = predicate::not_inlined ();
9340d345
JH
2471 info->account_size_time (opt_for_fn (node->decl,
2472 param_uninlined_function_insns)
d06f73a3 2473 * ipa_fn_summary::size_scale,
9340d345
JH
2474 opt_for_fn (node->decl,
2475 param_uninlined_function_time),
d06f73a3 2476 bb_predicate,
27d020cf
JH
2477 bb_predicate);
2478
2479 if (fbi.info)
40a777e8 2480 compute_bb_predicates (&fbi, node, info, params_summary);
27d020cf
JH
2481 order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
2482 nblocks = pre_and_rev_post_order_compute (NULL, order, false);
2483 for (n = 0; n < nblocks; n++)
2484 {
2485 bb = BASIC_BLOCK_FOR_FN (cfun, order[n]);
b71289b1 2486 freq = bb->count.to_sreal_scale (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count);
27d020cf
JH
2487 if (clobber_only_eh_bb_p (bb))
2488 {
2489 if (dump_file && (dump_flags & TDF_DETAILS))
2490 fprintf (dump_file, "\n Ignoring BB %i;"
2491 " it will be optimized away by cleanup_clobbers\n",
2492 bb->index);
2493 continue;
2494 }
2495
2496 /* TODO: Obviously predicates can be propagated down across CFG. */
2497 if (fbi.info)
2498 {
2499 if (bb->aux)
2500 bb_predicate = *(predicate *) bb->aux;
2501 else
2502 bb_predicate = false;
2503 }
2504 else
2505 bb_predicate = true;
2506
2507 if (dump_file && (dump_flags & TDF_DETAILS))
2508 {
2509 fprintf (dump_file, "\n BB %i predicate:", bb->index);
2510 bb_predicate.dump (dump_file, info->conds);
2511 }
2512
2513 if (fbi.info && nonconstant_names.exists ())
2514 {
2515 predicate phi_predicate;
2516 bool first_phi = true;
2517
2518 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
2519 gsi_next (&bsi))
2520 {
2521 if (first_phi
40a777e8
JH
2522 && !phi_result_unknown_predicate (&fbi, info,
2523 params_summary,
2524 bb,
27d020cf
JH
2525 &phi_predicate,
2526 nonconstant_names))
2527 break;
2528 first_phi = false;
2529 if (dump_file && (dump_flags & TDF_DETAILS))
2530 {
2531 fprintf (dump_file, " ");
2532 print_gimple_stmt (dump_file, gsi_stmt (bsi), 0);
2533 }
2534 predicate_for_phi_result (info, bsi.phi (), &phi_predicate,
2535 nonconstant_names);
2536 }
2537 }
2538
2539 fix_builtin_expect_stmt = find_foldable_builtin_expect (bb);
2540
d3ed5b56
JH
2541 for (gimple_stmt_iterator bsi = gsi_start_nondebug_bb (bb);
2542 !gsi_end_p (bsi); gsi_next_nondebug (&bsi))
27d020cf
JH
2543 {
2544 gimple *stmt = gsi_stmt (bsi);
2545 int this_size = estimate_num_insns (stmt, &eni_size_weights);
2546 int this_time = estimate_num_insns (stmt, &eni_time_weights);
2547 int prob;
2548 predicate will_be_nonconstant;
2549
2550 /* This relation stmt should be folded after we remove
956d615d 2551 __builtin_expect call. Adjust the cost here. */
27d020cf
JH
2552 if (stmt == fix_builtin_expect_stmt)
2553 {
2554 this_size--;
2555 this_time--;
2556 }
2557
2558 if (dump_file && (dump_flags & TDF_DETAILS))
2559 {
2560 fprintf (dump_file, " ");
2561 print_gimple_stmt (dump_file, stmt, 0);
2562 fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n",
b71289b1 2563 freq.to_double (), this_size,
27d020cf
JH
2564 this_time);
2565 }
2566
27d020cf
JH
2567 if (is_gimple_call (stmt)
2568 && !gimple_call_internal_p (stmt))
2569 {
2570 struct cgraph_edge *edge = node->get_edge (stmt);
99353fcf 2571 ipa_call_summary *es = ipa_call_summaries->get_create (edge);
27d020cf
JH
2572
2573 /* Special case: results of BUILT_IN_CONSTANT_P will be always
2574 resolved as constant. We however don't want to optimize
2575 out the cgraph edges. */
2576 if (nonconstant_names.exists ()
2577 && gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P)
2578 && gimple_call_lhs (stmt)
2579 && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
2580 {
2581 predicate false_p = false;
2582 nonconstant_names[SSA_NAME_VERSION (gimple_call_lhs (stmt))]
2583 = false_p;
2584 }
2585 if (ipa_node_params_sum)
2586 {
2587 int count = gimple_call_num_args (stmt);
2588 int i;
2589
2590 if (count)
2591 es->param.safe_grow_cleared (count);
2592 for (i = 0; i < count; i++)
2593 {
c628d1c3 2594 int prob = param_change_prob (&fbi, stmt, i);
27d020cf
JH
2595 gcc_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
2596 es->param[i].change_prob = prob;
2597 }
2598 }
2599
2600 es->call_stmt_size = this_size;
2601 es->call_stmt_time = this_time;
2602 es->loop_depth = bb_loop_depth (bb);
2603 edge_set_predicate (edge, &bb_predicate);
959b8c82
JH
2604 if (edge->speculative)
2605 {
2606 cgraph_edge *direct, *indirect;
2607 ipa_ref *ref;
2608 edge->speculative_call_info (direct, indirect, ref);
2609 gcc_assert (direct == edge);
2610 ipa_call_summary *es2
d380e329 2611 = ipa_call_summaries->get_create (indirect);
959b8c82
JH
2612 ipa_call_summaries->duplicate (edge, indirect,
2613 es, es2);
2614 }
27d020cf
JH
2615 }
2616
956d615d 2617 /* TODO: When conditional jump or switch is known to be constant, but
27d020cf
JH
2618 we did not translate it into the predicates, we really can account
2619 just maximum of the possible paths. */
2620 if (fbi.info)
2621 will_be_nonconstant
40a777e8 2622 = will_be_nonconstant_predicate (&fbi, info, params_summary,
27d020cf
JH
2623 stmt, nonconstant_names);
2624 else
2625 will_be_nonconstant = true;
2626 if (this_time || this_size)
2627 {
b71289b1 2628 sreal final_time = (sreal)this_time * freq;
27d020cf 2629
c628d1c3 2630 prob = eliminated_by_inlining_prob (&fbi, stmt);
27d020cf
JH
2631 if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS))
2632 fprintf (dump_file,
2633 "\t\t50%% will be eliminated by inlining\n");
2634 if (prob == 2 && dump_file && (dump_flags & TDF_DETAILS))
2635 fprintf (dump_file, "\t\tWill be eliminated by inlining\n");
2636
99b1c316 2637 class predicate p = bb_predicate & will_be_nonconstant;
27d020cf
JH
2638
2639 /* We can ignore statement when we proved it is never going
67914693 2640 to happen, but we cannot do that for call statements
27d020cf
JH
2641 because edges are accounted specially. */
2642
2643 if (*(is_gimple_call (stmt) ? &bb_predicate : &p) != false)
2644 {
b71289b1 2645 time += final_time;
27d020cf
JH
2646 size += this_size;
2647 }
2648
2649 /* We account everything but the calls. Calls have their own
2650 size/time info attached to cgraph edges. This is necessary
2651 in order to make the cost disappear after inlining. */
2652 if (!is_gimple_call (stmt))
2653 {
2654 if (prob)
2655 {
2656 predicate ip = bb_predicate & predicate::not_inlined ();
2657 info->account_size_time (this_size * prob,
121356b0 2658 (final_time * prob) / 2, ip,
27d020cf
JH
2659 p);
2660 }
2661 if (prob != 2)
2662 info->account_size_time (this_size * (2 - prob),
121356b0 2663 (final_time * (2 - prob) / 2),
27d020cf
JH
2664 bb_predicate,
2665 p);
2666 }
2667
2668 if (!info->fp_expressions && fp_expression_p (stmt))
2669 {
2670 info->fp_expressions = true;
2671 if (dump_file)
2672 fprintf (dump_file, " fp_expression set\n");
2673 }
a20f263b 2674 }
27d020cf 2675
a20f263b
JH
2676 /* Account cost of address calculations in the statements. */
2677 for (unsigned int i = 0; i < gimple_num_ops (stmt); i++)
2678 {
2679 for (tree op = gimple_op (stmt, i);
2680 op && handled_component_p (op);
2681 op = TREE_OPERAND (op, 0))
2682 if ((TREE_CODE (op) == ARRAY_REF
2683 || TREE_CODE (op) == ARRAY_RANGE_REF)
2684 && TREE_CODE (TREE_OPERAND (op, 1)) == SSA_NAME)
2685 {
2686 predicate p = bb_predicate;
2687 if (fbi.info)
2688 p = p & will_be_nonconstant_expr_predicate
40a777e8
JH
2689 (&fbi, info, params_summary,
2690 TREE_OPERAND (op, 1),
a20f263b
JH
2691 nonconstant_names);
2692 if (p != false)
2693 {
2694 time += freq;
2695 size += 1;
2696 if (dump_file)
2697 fprintf (dump_file,
2698 "\t\tAccounting address calculation.\n");
2699 info->account_size_time (ipa_fn_summary::size_scale,
2700 freq,
2701 bb_predicate,
2702 p);
2703 }
2704 }
27d020cf 2705 }
a20f263b 2706
27d020cf
JH
2707 }
2708 }
27d020cf
JH
2709 free (order);
2710
2711 if (nonconstant_names.exists () && !early)
2712 {
99b1c316 2713 class loop *loop;
27d020cf
JH
2714 predicate loop_iterations = true;
2715 predicate loop_stride = true;
2716
2717 if (dump_file && (dump_flags & TDF_DETAILS))
2718 flow_loops_dump (dump_file, NULL, 0);
2719 scev_initialize ();
2720 FOR_EACH_LOOP (loop, 0)
2721 {
2722 vec<edge> exits;
2723 edge ex;
2724 unsigned int j;
99b1c316 2725 class tree_niter_desc niter_desc;
27d020cf
JH
2726 bb_predicate = *(predicate *) loop->header->aux;
2727
2728 exits = get_loop_exit_edges (loop);
2729 FOR_EACH_VEC_ELT (exits, j, ex)
2730 if (number_of_iterations_exit (loop, ex, &niter_desc, false)
2731 && !is_gimple_min_invariant (niter_desc.niter))
2732 {
2733 predicate will_be_nonconstant
c628d1c3 2734 = will_be_nonconstant_expr_predicate (&fbi, info,
40a777e8 2735 params_summary,
27d020cf
JH
2736 niter_desc.niter,
2737 nonconstant_names);
2738 if (will_be_nonconstant != true)
2739 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2740 if (will_be_nonconstant != true
2741 && will_be_nonconstant != false)
2742 /* This is slightly inprecise. We may want to represent each
2743 loop with independent predicate. */
2744 loop_iterations &= will_be_nonconstant;
2745 }
2746 exits.release ();
2747 }
2748
2749 /* To avoid quadratic behavior we analyze stride predicates only
2750 with respect to the containing loop. Thus we simply iterate
2751 over all defs in the outermost loop body. */
2752 for (loop = loops_for_fn (cfun)->tree_root->inner;
2753 loop != NULL; loop = loop->next)
2754 {
2755 basic_block *body = get_loop_body (loop);
2756 for (unsigned i = 0; i < loop->num_nodes; i++)
2757 {
2758 gimple_stmt_iterator gsi;
2759 bb_predicate = *(predicate *) body[i]->aux;
2760 for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi);
2761 gsi_next (&gsi))
2762 {
2763 gimple *stmt = gsi_stmt (gsi);
2764
2765 if (!is_gimple_assign (stmt))
2766 continue;
2767
2768 tree def = gimple_assign_lhs (stmt);
2769 if (TREE_CODE (def) != SSA_NAME)
2770 continue;
2771
2772 affine_iv iv;
2773 if (!simple_iv (loop_containing_stmt (stmt),
2774 loop_containing_stmt (stmt),
2775 def, &iv, true)
2776 || is_gimple_min_invariant (iv.step))
2777 continue;
2778
2779 predicate will_be_nonconstant
40a777e8
JH
2780 = will_be_nonconstant_expr_predicate (&fbi, info,
2781 params_summary,
2782 iv.step,
27d020cf
JH
2783 nonconstant_names);
2784 if (will_be_nonconstant != true)
2785 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2786 if (will_be_nonconstant != true
2787 && will_be_nonconstant != false)
2788 /* This is slightly inprecise. We may want to represent
2789 each loop with independent predicate. */
2790 loop_stride = loop_stride & will_be_nonconstant;
2791 }
2792 }
2793 free (body);
2794 }
56f62793 2795 ipa_fn_summary *s = ipa_fn_summaries->get (node);
cf9b0b5f
ML
2796 set_hint_predicate (&s->loop_iterations, loop_iterations);
2797 set_hint_predicate (&s->loop_stride, loop_stride);
27d020cf
JH
2798 scev_finalize ();
2799 }
2800 FOR_ALL_BB_FN (bb, my_function)
2801 {
2802 edge e;
2803 edge_iterator ei;
2804
2805 if (bb->aux)
2806 edge_predicate_pool.remove ((predicate *)bb->aux);
2807 bb->aux = NULL;
2808 FOR_EACH_EDGE (e, ei, bb->succs)
2809 {
2810 if (e->aux)
2811 edge_predicate_pool.remove ((predicate *) e->aux);
2812 e->aux = NULL;
2813 }
2814 }
56f62793 2815 ipa_fn_summary *s = ipa_fn_summaries->get (node);
f658ad30 2816 ipa_size_summary *ss = ipa_size_summaries->get (node);
cf9b0b5f 2817 s->time = time;
f658ad30 2818 ss->self_size = size;
27d020cf
JH
2819 nonconstant_names.release ();
2820 ipa_release_body_info (&fbi);
2821 if (opt_for_fn (node->decl, optimize))
2822 {
2823 if (!early)
2824 loop_optimizer_finalize ();
2825 else if (!ipa_edge_args_sum)
2826 ipa_free_all_node_params ();
2827 free_dominance_info (CDI_DOMINATORS);
efe12656 2828 free_dominance_info (CDI_POST_DOMINATORS);
27d020cf
JH
2829 }
2830 if (dump_file)
2831 {
2832 fprintf (dump_file, "\n");
0bceb671 2833 ipa_dump_fn_summary (dump_file, node);
27d020cf
JH
2834 }
2835}
2836
2837
0bceb671
JH
2838/* Compute function summary.
2839 EARLY is true when we compute parameters during early opts. */
27d020cf
JH
2840
2841void
0bceb671 2842compute_fn_summary (struct cgraph_node *node, bool early)
27d020cf
JH
2843{
2844 HOST_WIDE_INT self_stack_size;
2845 struct cgraph_edge *e;
27d020cf 2846
a62bfab5 2847 gcc_assert (!node->inlined_to);
27d020cf 2848
0bceb671
JH
2849 if (!ipa_fn_summaries)
2850 ipa_fn_summary_alloc ();
27d020cf 2851
56f62793
ML
2852 /* Create a new ipa_fn_summary. */
2853 ((ipa_fn_summary_t *)ipa_fn_summaries)->remove_callees (node);
2854 ipa_fn_summaries->remove (node);
f658ad30
JH
2855 class ipa_fn_summary *info = ipa_fn_summaries->get_create (node);
2856 class ipa_size_summary *size_info = ipa_size_summaries->get_create (node);
27d020cf
JH
2857
2858 /* Estimate the stack size for the function if we're optimizing. */
2859 self_stack_size = optimize && !node->thunk.thunk_p
2860 ? estimated_stack_frame_size (node) : 0;
f658ad30 2861 size_info->estimated_self_stack_size = self_stack_size;
27d020cf 2862 info->estimated_stack_size = self_stack_size;
27d020cf
JH
2863
2864 if (node->thunk.thunk_p)
2865 {
99353fcf 2866 ipa_call_summary *es = ipa_call_summaries->get_create (node->callees);
27d020cf
JH
2867 predicate t = true;
2868
87f94429 2869 node->can_change_signature = false;
27d020cf
JH
2870 es->call_stmt_size = eni_size_weights.call_cost;
2871 es->call_stmt_time = eni_time_weights.call_cost;
d06f73a3 2872 info->account_size_time (ipa_fn_summary::size_scale
9340d345
JH
2873 * opt_for_fn (node->decl,
2874 param_uninlined_function_thunk_insns),
2875 opt_for_fn (node->decl,
2876 param_uninlined_function_thunk_time), t, t);
27d020cf 2877 t = predicate::not_inlined ();
0bceb671
JH
2878 info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t);
2879 ipa_update_overall_fn_summary (node);
f658ad30 2880 size_info->self_size = size_info->size;
dbcdd561 2881 if (stdarg_p (TREE_TYPE (node->decl)))
ca04a532
ML
2882 {
2883 info->inlinable = false;
2884 node->callees->inline_failed = CIF_VARIADIC_THUNK;
2885 }
27d020cf
JH
2886 else
2887 info->inlinable = true;
2888 }
2889 else
2890 {
2891 /* Even is_gimple_min_invariant rely on current_function_decl. */
2892 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2893
ac0573de
JH
2894 /* During IPA profile merging we may be called w/o virtual SSA form
2895 built. */
2896 update_ssa (TODO_update_ssa_only_virtuals);
2897
27d020cf
JH
2898 /* Can this function be inlined at all? */
2899 if (!opt_for_fn (node->decl, optimize)
2900 && !lookup_attribute ("always_inline",
2901 DECL_ATTRIBUTES (node->decl)))
2902 info->inlinable = false;
2903 else
2904 info->inlinable = tree_inlinable_function_p (node->decl);
2905
27d020cf 2906 /* Type attributes can use parameter indices to describe them. */
3d8fb311
JJ
2907 if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl))
2908 /* Likewise for #pragma omp declare simd functions or functions
2909 with simd attribute. */
2910 || lookup_attribute ("omp declare simd",
2911 DECL_ATTRIBUTES (node->decl)))
87f94429 2912 node->can_change_signature = false;
27d020cf
JH
2913 else
2914 {
2915 /* Otherwise, inlinable functions always can change signature. */
2916 if (info->inlinable)
87f94429 2917 node->can_change_signature = true;
27d020cf
JH
2918 else
2919 {
67914693 2920 /* Functions calling builtin_apply cannot change signature. */
27d020cf
JH
2921 for (e = node->callees; e; e = e->next_callee)
2922 {
2923 tree cdecl = e->callee->decl;
3d78e008
ML
2924 if (fndecl_built_in_p (cdecl, BUILT_IN_APPLY_ARGS)
2925 || fndecl_built_in_p (cdecl, BUILT_IN_VA_START))
27d020cf
JH
2926 break;
2927 }
87f94429 2928 node->can_change_signature = !e;
27d020cf
JH
2929 }
2930 }
0bceb671 2931 analyze_function_body (node, early);
27d020cf
JH
2932 pop_cfun ();
2933 }
2934 for (e = node->callees; e; e = e->next_callee)
2935 if (e->callee->comdat_local_p ())
2936 break;
2937 node->calls_comdat_local = (e != NULL);
2938
2939 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
f658ad30
JH
2940 size_info->size = size_info->self_size;
2941 info->estimated_stack_size = size_info->estimated_self_stack_size;
27d020cf
JH
2942
2943 /* Code above should compute exactly the same result as
0bceb671 2944 ipa_update_overall_fn_summary but because computation happens in
27d020cf 2945 different order the roundoff errors result in slight changes. */
0bceb671 2946 ipa_update_overall_fn_summary (node);
959b8c82 2947 /* In LTO mode we may have speculative edges set. */
f658ad30 2948 gcc_assert (in_lto_p || size_info->size == size_info->self_size);
27d020cf
JH
2949}
2950
2951
2952/* Compute parameters of functions used by inliner using
2953 current_function_decl. */
2954
2955static unsigned int
0bceb671 2956compute_fn_summary_for_current (void)
27d020cf 2957{
0bceb671 2958 compute_fn_summary (cgraph_node::get (current_function_decl), true);
27d020cf
JH
2959 return 0;
2960}
2961
27d020cf
JH
2962/* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
2963 KNOWN_CONTEXTS and KNOWN_AGGS. */
2964
2965static bool
2966estimate_edge_devirt_benefit (struct cgraph_edge *ie,
2967 int *size, int *time,
2968 vec<tree> known_vals,
2969 vec<ipa_polymorphic_call_context> known_contexts,
eb270950 2970 vec<ipa_agg_value_set> known_aggs)
27d020cf
JH
2971{
2972 tree target;
2973 struct cgraph_node *callee;
99b1c316 2974 class ipa_fn_summary *isummary;
27d020cf
JH
2975 enum availability avail;
2976 bool speculative;
2977
b0d55476 2978 if (!known_vals.length () && !known_contexts.length ())
27d020cf
JH
2979 return false;
2980 if (!opt_for_fn (ie->caller->decl, flag_indirect_inlining))
2981 return false;
2982
2983 target = ipa_get_indirect_edge_target (ie, known_vals, known_contexts,
2984 known_aggs, &speculative);
2985 if (!target || speculative)
2986 return false;
2987
2988 /* Account for difference in cost between indirect and direct calls. */
2989 *size -= (eni_size_weights.indirect_call_cost - eni_size_weights.call_cost);
2990 *time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost);
2991 gcc_checking_assert (*time >= 0);
2992 gcc_checking_assert (*size >= 0);
2993
2994 callee = cgraph_node::get (target);
2995 if (!callee || !callee->definition)
2996 return false;
2997 callee = callee->function_symbol (&avail);
2998 if (avail < AVAIL_AVAILABLE)
2999 return false;
56f62793 3000 isummary = ipa_fn_summaries->get (callee);
1d546c60
ML
3001 if (isummary == NULL)
3002 return false;
3003
27d020cf
JH
3004 return isummary->inlinable;
3005}
3006
3007/* Increase SIZE, MIN_SIZE (if non-NULL) and TIME for size and time needed to
3008 handle edge E with probability PROB.
3009 Set HINTS if edge may be devirtualized.
3010 KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS describe context of the call
3011 site. */
3012
3013static inline void
3014estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *min_size,
3015 sreal *time,
27d020cf
JH
3016 vec<tree> known_vals,
3017 vec<ipa_polymorphic_call_context> known_contexts,
eb270950 3018 vec<ipa_agg_value_set> known_aggs,
0bceb671 3019 ipa_hints *hints)
27d020cf 3020{
99b1c316 3021 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
3022 int call_size = es->call_stmt_size;
3023 int call_time = es->call_stmt_time;
3024 int cur_size;
98450d19 3025
83263ef5 3026 if (!e->callee && hints && e->maybe_hot_p ()
27d020cf 3027 && estimate_edge_devirt_benefit (e, &call_size, &call_time,
83263ef5 3028 known_vals, known_contexts, known_aggs))
27d020cf 3029 *hints |= INLINE_HINT_indirect_call;
0bceb671 3030 cur_size = call_size * ipa_fn_summary::size_scale;
27d020cf
JH
3031 *size += cur_size;
3032 if (min_size)
3033 *min_size += cur_size;
98450d19 3034 if (time)
41f0e819 3035 *time += ((sreal)call_time) * e->sreal_frequency ();
27d020cf
JH
3036}
3037
3038
27d020cf
JH
3039/* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
3040 calls in NODE. POSSIBLE_TRUTHS, KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
070e3489
JH
3041 describe context of the call site.
3042
3043 Helper for estimate_calls_size_and_time which does the same but
3044 (in most cases) faster. */
27d020cf
JH
3045
3046static void
070e3489
JH
3047estimate_calls_size_and_time_1 (struct cgraph_node *node, int *size,
3048 int *min_size, sreal *time,
3049 ipa_hints *hints,
3050 clause_t possible_truths,
3051 vec<tree> known_vals,
3052 vec<ipa_polymorphic_call_context> known_contexts,
3053 vec<ipa_agg_value_set> known_aggs)
27d020cf
JH
3054{
3055 struct cgraph_edge *e;
3056 for (e = node->callees; e; e = e->next_callee)
3057 {
7237f93e
JH
3058 if (!e->inline_failed)
3059 {
3060 gcc_checking_assert (!ipa_call_summaries->get (e));
070e3489
JH
3061 estimate_calls_size_and_time_1 (e->callee, size, min_size, time,
3062 hints,
3063 possible_truths,
3064 known_vals, known_contexts,
3065 known_aggs);
7237f93e
JH
3066 continue;
3067 }
3068 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
3069
3070 /* Do not care about zero sized builtins. */
7237f93e 3071 if (!es->call_stmt_size)
27d020cf
JH
3072 {
3073 gcc_checking_assert (!es->call_stmt_time);
3074 continue;
3075 }
3076 if (!es->predicate
3077 || es->predicate->evaluate (possible_truths))
3078 {
7237f93e 3079 /* Predicates of calls shall not use NOT_CHANGED codes,
956d615d 3080 so we do not need to compute probabilities. */
7237f93e
JH
3081 estimate_edge_size_and_time (e, size,
3082 es->predicate ? NULL : min_size,
98450d19 3083 time,
7237f93e
JH
3084 known_vals, known_contexts,
3085 known_aggs, hints);
27d020cf
JH
3086 }
3087 }
3088 for (e = node->indirect_calls; e; e = e->next_callee)
3089 {
7237f93e 3090 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
3091 if (!es->predicate
3092 || es->predicate->evaluate (possible_truths))
3093 estimate_edge_size_and_time (e, size,
3094 es->predicate ? NULL : min_size,
98450d19 3095 time,
27d020cf
JH
3096 known_vals, known_contexts, known_aggs,
3097 hints);
3098 }
3099}
3100
070e3489
JH
3101/* Populate sum->call_size_time_table for edges from NODE. */
3102
3103static void
3104summarize_calls_size_and_time (struct cgraph_node *node,
3105 ipa_fn_summary *sum)
3106{
3107 struct cgraph_edge *e;
3108 for (e = node->callees; e; e = e->next_callee)
3109 {
3110 if (!e->inline_failed)
3111 {
3112 gcc_checking_assert (!ipa_call_summaries->get (e));
3113 summarize_calls_size_and_time (e->callee, sum);
3114 continue;
3115 }
3116 int size = 0;
3117 sreal time = 0;
3118
3119 estimate_edge_size_and_time (e, &size, NULL, &time,
3120 vNULL, vNULL, vNULL, NULL);
3121
3122 struct predicate pred = true;
3123 class ipa_call_summary *es = ipa_call_summaries->get (e);
3124
3125 if (es->predicate)
3126 pred = *es->predicate;
3127 sum->account_size_time (size, time, pred, pred, true);
3128 }
3129 for (e = node->indirect_calls; e; e = e->next_callee)
3130 {
3131 int size = 0;
3132 sreal time = 0;
3133
3134 estimate_edge_size_and_time (e, &size, NULL, &time,
3135 vNULL, vNULL, vNULL, NULL);
3136 struct predicate pred = true;
3137 class ipa_call_summary *es = ipa_call_summaries->get (e);
3138
3139 if (es->predicate)
3140 pred = *es->predicate;
3141 sum->account_size_time (size, time, pred, pred, true);
3142 }
3143}
3144
3145/* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
3146 calls in NODE. POSSIBLE_TRUTHS, KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
3147 describe context of the call site. */
3148
3149static void
3150estimate_calls_size_and_time (struct cgraph_node *node, int *size,
3151 int *min_size, sreal *time,
3152 ipa_hints *hints,
3153 clause_t possible_truths,
3154 vec<tree> known_vals,
3155 vec<ipa_polymorphic_call_context> known_contexts,
3156 vec<ipa_agg_value_set> known_aggs)
3157{
3158 class ipa_fn_summary *sum = ipa_fn_summaries->get (node);
3159 bool use_table = true;
3160
3161 gcc_assert (node->callees || node->indirect_calls);
3162
3163 /* During early inlining we do not calculate info for very
3164 large functions and thus there is no need for producing
3165 summaries. */
3166 if (!ipa_node_params_sum)
3167 use_table = false;
3168 /* Do not calculate summaries for simple wrappers; it is waste
3169 of memory. */
3170 else if (node->callees && node->indirect_calls
3171 && node->callees->inline_failed && !node->callees->next_callee)
3172 use_table = false;
3173 /* If there is an indirect edge that may be optimized, we need
3174 to go the slow way. */
3175 else if ((known_vals.length ()
3176 || known_contexts.length ()
3177 || known_aggs.length ()) && hints)
3178 {
3179 class ipa_node_params *params_summary = IPA_NODE_REF (node);
3180 unsigned int nargs = params_summary
3181 ? ipa_get_param_count (params_summary) : 0;
3182
3183 for (unsigned int i = 0; i < nargs && use_table; i++)
3184 {
3185 if (ipa_is_param_used_by_indirect_call (params_summary, i)
3186 && ((known_vals.length () > i && known_vals[i])
3187 || (known_aggs.length () > i
3188 && known_aggs[i].items.length ())))
3189 use_table = false;
3190 else if (ipa_is_param_used_by_polymorphic_call (params_summary, i)
3191 && (known_contexts.length () > i
3192 && !known_contexts[i].useless_p ()))
3193 use_table = false;
3194 }
3195 }
3196
3197 /* Fast path is via the call size time table. */
3198 if (use_table)
3199 {
3200 /* Build summary if it is absent. */
3201 if (!sum->call_size_time_table)
3202 {
3203 predicate true_pred = true;
3204 sum->account_size_time (0, 0, true_pred, true_pred, true);
3205 summarize_calls_size_and_time (node, sum);
3206 }
3207
3208 int old_size = *size;
3209 sreal old_time = time ? *time : 0;
3210
3211 if (min_size)
3212 *min_size += (*sum->call_size_time_table)[0].size;
3213
3214 unsigned int i;
3215 size_time_entry *e;
3216
3217 /* Walk the table and account sizes and times. */
3218 for (i = 0; vec_safe_iterate (sum->call_size_time_table, i, &e);
3219 i++)
3220 if (e->exec_predicate.evaluate (possible_truths))
3221 {
3222 *size += e->size;
3223 if (time)
3224 *time += e->time;
3225 }
3226
3227 /* Be careful and see if both methods agree. */
3228 if ((flag_checking || dump_file)
3229 /* Do not try to sanity check when we know we lost some
3230 precision. */
3231 && sum->call_size_time_table->length ()
3232 < ipa_fn_summary::max_size_time_table_size)
3233 {
3234 estimate_calls_size_and_time_1 (node, &old_size, NULL, &old_time, NULL,
3235 possible_truths, known_vals,
3236 known_contexts, known_aggs);
3237 gcc_assert (*size == old_size);
3238 if (time && (*time - old_time > 1 || *time - old_time < -1)
3239 && dump_file)
3240 fprintf (dump_file, "Time mismatch in call summary %f!=%f",
3241 old_time.to_double (),
3242 time->to_double ());
3243 }
3244 }
3245 /* Slow path by walking all edges. */
3246 else
3247 estimate_calls_size_and_time_1 (node, size, min_size, time, hints,
3248 possible_truths, known_vals, known_contexts,
3249 known_aggs);
3250}
3251
1532500e 3252/* Default constructor for ipa call context.
956d615d 3253 Memory allocation of known_vals, known_contexts
1532500e
JH
3254 and known_aggs vectors is owned by the caller, but can
3255 be release by ipa_call_context::release.
3256
3257 inline_param_summary is owned by the caller. */
3258ipa_call_context::ipa_call_context (cgraph_node *node,
3259 clause_t possible_truths,
3260 clause_t nonspec_possible_truths,
3261 vec<tree> known_vals,
3262 vec<ipa_polymorphic_call_context>
3263 known_contexts,
eb270950 3264 vec<ipa_agg_value_set> known_aggs,
1532500e
JH
3265 vec<inline_param_summary>
3266 inline_param_summary)
3267: m_node (node), m_possible_truths (possible_truths),
3268 m_nonspec_possible_truths (nonspec_possible_truths),
3269 m_inline_param_summary (inline_param_summary),
3270 m_known_vals (known_vals),
3271 m_known_contexts (known_contexts),
3272 m_known_aggs (known_aggs)
3273{
3274}
3275
40a777e8
JH
3276/* Set THIS to be a duplicate of CTX. Copy all relevant info. */
3277
ac6f2e59
JH
3278void
3279ipa_call_context::duplicate_from (const ipa_call_context &ctx)
3280{
3281 m_node = ctx.m_node;
3282 m_possible_truths = ctx.m_possible_truths;
3283 m_nonspec_possible_truths = ctx.m_nonspec_possible_truths;
40a777e8 3284 class ipa_node_params *params_summary = IPA_NODE_REF (m_node);
6cf67b62
JH
3285 unsigned int nargs = params_summary
3286 ? ipa_get_param_count (params_summary) : 0;
ac6f2e59 3287
40a777e8
JH
3288 m_inline_param_summary = vNULL;
3289 /* Copy the info only if there is at least one useful entry. */
ac6f2e59 3290 if (ctx.m_inline_param_summary.exists ())
40a777e8
JH
3291 {
3292 unsigned int n = MIN (ctx.m_inline_param_summary.length (), nargs);
3293
3294 for (unsigned int i = 0; i < n; i++)
3295 if (ipa_is_param_used_by_ipa_predicates (params_summary, i)
3296 && !ctx.m_inline_param_summary[i].useless_p ())
3297 {
3298 m_inline_param_summary
3299 = ctx.m_inline_param_summary.copy ();
3300 break;
3301 }
3302 }
3303 m_known_vals = vNULL;
ac6f2e59 3304 if (ctx.m_known_vals.exists ())
40a777e8
JH
3305 {
3306 unsigned int n = MIN (ctx.m_known_vals.length (), nargs);
3307
3308 for (unsigned int i = 0; i < n; i++)
3309 if (ipa_is_param_used_by_indirect_call (params_summary, i)
3310 && ctx.m_known_vals[i])
3311 {
3312 m_known_vals = ctx.m_known_vals.copy ();
3313 break;
3314 }
3315 }
3316
3317 m_known_contexts = vNULL;
ac6f2e59 3318 if (ctx.m_known_contexts.exists ())
40a777e8
JH
3319 {
3320 unsigned int n = MIN (ctx.m_known_contexts.length (), nargs);
3321
3322 for (unsigned int i = 0; i < n; i++)
3323 if (ipa_is_param_used_by_polymorphic_call (params_summary, i)
3324 && !ctx.m_known_contexts[i].useless_p ())
3325 {
3326 m_known_contexts = ctx.m_known_contexts.copy ();
3327 break;
3328 }
3329 }
3330
3331 m_known_aggs = vNULL;
ac6f2e59 3332 if (ctx.m_known_aggs.exists ())
40a777e8
JH
3333 {
3334 unsigned int n = MIN (ctx.m_known_aggs.length (), nargs);
3335
3336 for (unsigned int i = 0; i < n; i++)
3337 if (ipa_is_param_used_by_indirect_call (params_summary, i)
eb270950 3338 && !ctx.m_known_aggs[i].is_empty ())
40a777e8 3339 {
eb270950 3340 m_known_aggs = ipa_copy_agg_values (ctx.m_known_aggs);
40a777e8
JH
3341 break;
3342 }
3343 }
ac6f2e59
JH
3344}
3345
3346/* Release memory used by known_vals/contexts/aggs vectors.
3347 If ALL is true release also inline_param_summary.
956d615d 3348 This happens when context was previously duplicated to be stored
ac6f2e59 3349 into cache. */
1532500e
JH
3350
3351void
ac6f2e59 3352ipa_call_context::release (bool all)
1532500e 3353{
ac6f2e59
JH
3354 /* See if context is initialized at first place. */
3355 if (!m_node)
3356 return;
b0d55476 3357 ipa_release_agg_values (m_known_aggs, all);
ac6f2e59 3358 if (all)
b0d55476
JH
3359 {
3360 m_known_vals.release ();
3361 m_known_contexts.release ();
3362 m_inline_param_summary.release ();
3363 }
ac6f2e59
JH
3364}
3365
3366/* Return true if CTX describes the same call context as THIS. */
3367
3368bool
3369ipa_call_context::equal_to (const ipa_call_context &ctx)
3370{
3371 if (m_node != ctx.m_node
3372 || m_possible_truths != ctx.m_possible_truths
3373 || m_nonspec_possible_truths != ctx.m_nonspec_possible_truths)
3374 return false;
40a777e8
JH
3375
3376 class ipa_node_params *params_summary = IPA_NODE_REF (m_node);
6cf67b62
JH
3377 unsigned int nargs = params_summary
3378 ? ipa_get_param_count (params_summary) : 0;
40a777e8
JH
3379
3380 if (m_inline_param_summary.exists () || ctx.m_inline_param_summary.exists ())
ac6f2e59 3381 {
40a777e8
JH
3382 for (unsigned int i = 0; i < nargs; i++)
3383 {
3384 if (!ipa_is_param_used_by_ipa_predicates (params_summary, i))
3385 continue;
3386 if (i >= m_inline_param_summary.length ()
3387 || m_inline_param_summary[i].useless_p ())
3388 {
3389 if (i < ctx.m_inline_param_summary.length ()
3390 && !ctx.m_inline_param_summary[i].useless_p ())
3391 return false;
3392 continue;
3393 }
3394 if (i >= ctx.m_inline_param_summary.length ()
3395 || ctx.m_inline_param_summary[i].useless_p ())
3396 {
3397 if (i < m_inline_param_summary.length ()
3398 && !m_inline_param_summary[i].useless_p ())
3399 return false;
3400 continue;
3401 }
3402 if (!m_inline_param_summary[i].equal_to
3403 (ctx.m_inline_param_summary[i]))
3404 return false;
3405 }
ac6f2e59 3406 }
40a777e8 3407 if (m_known_vals.exists () || ctx.m_known_vals.exists ())
ac6f2e59 3408 {
40a777e8 3409 for (unsigned int i = 0; i < nargs; i++)
ac6f2e59 3410 {
40a777e8
JH
3411 if (!ipa_is_param_used_by_indirect_call (params_summary, i))
3412 continue;
3413 if (i >= m_known_vals.length () || !m_known_vals[i])
3414 {
3415 if (i < ctx.m_known_vals.length () && ctx.m_known_vals[i])
3416 return false;
3417 continue;
3418 }
3419 if (i >= ctx.m_known_vals.length () || !ctx.m_known_vals[i])
3420 {
3421 if (i < m_known_vals.length () && m_known_vals[i])
3422 return false;
3423 continue;
3424 }
3425 if (m_known_vals[i] != ctx.m_known_vals[i])
ac6f2e59
JH
3426 return false;
3427 }
3428 }
40a777e8 3429 if (m_known_contexts.exists () || ctx.m_known_contexts.exists ())
ac6f2e59 3430 {
40a777e8
JH
3431 for (unsigned int i = 0; i < nargs; i++)
3432 {
3433 if (!ipa_is_param_used_by_polymorphic_call (params_summary, i))
3434 continue;
3435 if (i >= m_known_contexts.length ()
3436 || m_known_contexts[i].useless_p ())
3437 {
3438 if (i < ctx.m_known_contexts.length ()
3439 && !ctx.m_known_contexts[i].useless_p ())
3440 return false;
3441 continue;
3442 }
3443 if (i >= ctx.m_known_contexts.length ()
3444 || ctx.m_known_contexts[i].useless_p ())
3445 {
3446 if (i < m_known_contexts.length ()
3447 && !m_known_contexts[i].useless_p ())
3448 return false;
3449 continue;
3450 }
3451 if (!m_known_contexts[i].equal_to
3452 (ctx.m_known_contexts[i]))
3453 return false;
3454 }
ac6f2e59 3455 }
40a777e8 3456 if (m_known_aggs.exists () || ctx.m_known_aggs.exists ())
ac6f2e59 3457 {
40a777e8
JH
3458 for (unsigned int i = 0; i < nargs; i++)
3459 {
3460 if (!ipa_is_param_used_by_indirect_call (params_summary, i))
3461 continue;
eb270950 3462 if (i >= m_known_aggs.length () || m_known_aggs[i].is_empty ())
40a777e8 3463 {
eb270950
FX
3464 if (i < ctx.m_known_aggs.length ()
3465 && !ctx.m_known_aggs[i].is_empty ())
40a777e8
JH
3466 return false;
3467 continue;
3468 }
eb270950
FX
3469 if (i >= ctx.m_known_aggs.length ()
3470 || ctx.m_known_aggs[i].is_empty ())
40a777e8 3471 {
eb270950
FX
3472 if (i < m_known_aggs.length ()
3473 && !m_known_aggs[i].is_empty ())
40a777e8
JH
3474 return false;
3475 continue;
3476 }
eb270950 3477 if (!m_known_aggs[i].equal_to (ctx.m_known_aggs[i]))
40a777e8
JH
3478 return false;
3479 }
ac6f2e59
JH
3480 }
3481 return true;
1532500e 3482}
27d020cf 3483
1532500e 3484/* Estimate size and time needed to execute call in the given context.
956d615d 3485 Additionally determine hints determined by the context. Finally compute
27d020cf
JH
3486 minimal size needed for the call that is independent on the call context and
3487 can be used for fast estimates. Return the values in RET_SIZE,
3488 RET_MIN_SIZE, RET_TIME and RET_HINTS. */
3489
3490void
1532500e
JH
3491ipa_call_context::estimate_size_and_time (int *ret_size,
3492 int *ret_min_size,
3493 sreal *ret_time,
3494 sreal *ret_nonspecialized_time,
3495 ipa_hints *ret_hints)
27d020cf 3496{
7237f93e 3497 class ipa_fn_summary *info = ipa_fn_summaries->get (m_node);
27d020cf
JH
3498 size_time_entry *e;
3499 int size = 0;
3500 sreal time = 0;
3501 int min_size = 0;
0bceb671 3502 ipa_hints hints = 0;
27d020cf
JH
3503 int i;
3504
3505 if (dump_file && (dump_flags & TDF_DETAILS))
3506 {
3507 bool found = false;
3508 fprintf (dump_file, " Estimating body: %s/%i\n"
1532500e
JH
3509 " Known to be false: ", m_node->name (),
3510 m_node->order);
27d020cf
JH
3511
3512 for (i = predicate::not_inlined_condition;
3513 i < (predicate::first_dynamic_condition
3514 + (int) vec_safe_length (info->conds)); i++)
1532500e 3515 if (!(m_possible_truths & (1 << i)))
27d020cf
JH
3516 {
3517 if (found)
3518 fprintf (dump_file, ", ");
3519 found = true;
3520 dump_condition (dump_file, info->conds, i);
3521 }
3522 }
3523
070e3489
JH
3524 if (m_node->callees || m_node->indirect_calls)
3525 estimate_calls_size_and_time (m_node, &size, &min_size,
3526 ret_time ? &time : NULL,
3527 ret_hints ? &hints : NULL, m_possible_truths,
3528 m_known_vals, m_known_contexts, m_known_aggs);
83263ef5 3529
27d020cf
JH
3530 sreal nonspecialized_time = time;
3531
e3bd08dd 3532 min_size += (*info->size_time_table)[0].size;
27d020cf
JH
3533 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3534 {
1532500e 3535 bool exec = e->exec_predicate.evaluate (m_nonspec_possible_truths);
3494e738
JH
3536
3537 /* Because predicates are conservative, it can happen that nonconst is 1
3538 but exec is 0. */
27d020cf
JH
3539 if (exec)
3540 {
1532500e 3541 bool nonconst = e->nonconst_predicate.evaluate (m_possible_truths);
3494e738 3542
27d020cf
JH
3543 gcc_checking_assert (e->time >= 0);
3544 gcc_checking_assert (time >= 0);
3545
3546 /* We compute specialized size only because size of nonspecialized
3547 copy is context independent.
3548
3549 The difference between nonspecialized execution and specialized is
3550 that nonspecialized is not going to have optimized out computations
3551 known to be constant in a specialized setting. */
3552 if (nonconst)
3553 size += e->size;
83263ef5
JH
3554 if (!ret_time)
3555 continue;
27d020cf
JH
3556 nonspecialized_time += e->time;
3557 if (!nonconst)
3558 ;
1532500e 3559 else if (!m_inline_param_summary.exists ())
27d020cf
JH
3560 {
3561 if (nonconst)
3562 time += e->time;
3563 }
3564 else
3565 {
3566 int prob = e->nonconst_predicate.probability
1532500e
JH
3567 (info->conds, m_possible_truths,
3568 m_inline_param_summary);
27d020cf
JH
3569 gcc_checking_assert (prob >= 0);
3570 gcc_checking_assert (prob <= REG_BR_PROB_BASE);
fd4656a2
JH
3571 if (prob == REG_BR_PROB_BASE)
3572 time += e->time;
3573 else
3574 time += e->time * prob / REG_BR_PROB_BASE;
27d020cf
JH
3575 }
3576 gcc_checking_assert (time >= 0);
3577 }
3578 }
3579 gcc_checking_assert ((*info->size_time_table)[0].exec_predicate == true);
3580 gcc_checking_assert ((*info->size_time_table)[0].nonconst_predicate == true);
e3bd08dd 3581 gcc_checking_assert (min_size >= 0);
27d020cf
JH
3582 gcc_checking_assert (size >= 0);
3583 gcc_checking_assert (time >= 0);
3584 /* nonspecialized_time should be always bigger than specialized time.
3585 Roundoff issues however may get into the way. */
59d27026 3586 gcc_checking_assert ((nonspecialized_time - time * 99 / 100) >= -1);
27d020cf
JH
3587
3588 /* Roundoff issues may make specialized time bigger than nonspecialized
956d615d 3589 time. We do not really want that to happen because some heuristics
27d020cf
JH
3590 may get confused by seeing negative speedups. */
3591 if (time > nonspecialized_time)
3592 time = nonspecialized_time;
3593
83263ef5
JH
3594 if (ret_hints)
3595 {
3596 if (info->loop_iterations
3597 && !info->loop_iterations->evaluate (m_possible_truths))
3598 hints |= INLINE_HINT_loop_iterations;
3599 if (info->loop_stride
3600 && !info->loop_stride->evaluate (m_possible_truths))
3601 hints |= INLINE_HINT_loop_stride;
3602 if (info->scc_no)
3603 hints |= INLINE_HINT_in_scc;
3604 if (DECL_DECLARED_INLINE_P (m_node->decl))
3605 hints |= INLINE_HINT_declared_inline;
3606 }
27d020cf 3607
0bceb671
JH
3608 size = RDIV (size, ipa_fn_summary::size_scale);
3609 min_size = RDIV (min_size, ipa_fn_summary::size_scale);
27d020cf
JH
3610
3611 if (dump_file && (dump_flags & TDF_DETAILS))
3612 fprintf (dump_file, "\n size:%i time:%f nonspec time:%f\n", (int) size,
3613 time.to_double (), nonspecialized_time.to_double ());
3614 if (ret_time)
3615 *ret_time = time;
3616 if (ret_nonspecialized_time)
3617 *ret_nonspecialized_time = nonspecialized_time;
3618 if (ret_size)
3619 *ret_size = size;
3620 if (ret_min_size)
3621 *ret_min_size = min_size;
3622 if (ret_hints)
3623 *ret_hints = hints;
3624 return;
3625}
3626
3627
3628/* Estimate size and time needed to execute callee of EDGE assuming that
3629 parameters known to be constant at caller of EDGE are propagated.
3630 KNOWN_VALS and KNOWN_CONTEXTS are vectors of assumed known constant values
3631 and types for parameters. */
3632
3633void
3634estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
3635 vec<tree> known_vals,
3636 vec<ipa_polymorphic_call_context>
3637 known_contexts,
eb270950 3638 vec<ipa_agg_value_set> known_aggs,
27d020cf
JH
3639 int *ret_size, sreal *ret_time,
3640 sreal *ret_nonspec_time,
0bceb671 3641 ipa_hints *hints)
27d020cf
JH
3642{
3643 clause_t clause, nonspec_clause;
3644
68718e8e
JH
3645 /* TODO: Also pass known value ranges. */
3646 evaluate_conditions_for_known_args (node, false, known_vals, vNULL,
3647 known_aggs, &clause, &nonspec_clause);
1532500e
JH
3648 ipa_call_context ctx (node, clause, nonspec_clause,
3649 known_vals, known_contexts,
3650 known_aggs, vNULL);
3651 ctx.estimate_size_and_time (ret_size, NULL, ret_time,
3652 ret_nonspec_time, hints);
27d020cf
JH
3653}
3654
f658ad30
JH
3655/* Return stack frame offset where frame of NODE is supposed to start inside
3656 of the function it is inlined to.
3657 Return 0 for functions that are not inlined. */
3658
3659HOST_WIDE_INT
3660ipa_get_stack_frame_offset (struct cgraph_node *node)
3661{
3662 HOST_WIDE_INT offset = 0;
a62bfab5 3663 if (!node->inlined_to)
f658ad30
JH
3664 return 0;
3665 node = node->callers->caller;
3666 while (true)
3667 {
3668 offset += ipa_size_summaries->get (node)->estimated_self_stack_size;
a62bfab5 3669 if (!node->inlined_to)
f658ad30
JH
3670 return offset;
3671 node = node->callers->caller;
3672 }
3673}
3674
27d020cf
JH
3675
3676/* Update summary information of inline clones after inlining.
3677 Compute peak stack usage. */
3678
3679static void
3680inline_update_callee_summaries (struct cgraph_node *node, int depth)
3681{
3682 struct cgraph_edge *e;
f658ad30 3683
27d020cf
JH
3684 ipa_propagate_frequency (node);
3685 for (e = node->callees; e; e = e->next_callee)
3686 {
3687 if (!e->inline_failed)
3688 inline_update_callee_summaries (e->callee, depth);
7237f93e
JH
3689 else
3690 ipa_call_summaries->get (e)->loop_depth += depth;
27d020cf
JH
3691 }
3692 for (e = node->indirect_calls; e; e = e->next_callee)
56f62793 3693 ipa_call_summaries->get (e)->loop_depth += depth;
27d020cf
JH
3694}
3695
3696/* Update change_prob of EDGE after INLINED_EDGE has been inlined.
6cf67b62 3697 When function A is inlined in B and A calls C with parameter that
956d615d 3698 changes with probability PROB1 and C is known to be passthrough
27d020cf
JH
3699 of argument if B that change with probability PROB2, the probability
3700 of change is now PROB1*PROB2. */
3701
3702static void
3703remap_edge_change_prob (struct cgraph_edge *inlined_edge,
3704 struct cgraph_edge *edge)
3705{
3706 if (ipa_node_params_sum)
3707 {
3708 int i;
99b1c316 3709 class ipa_edge_args *args = IPA_EDGE_REF (edge);
a33c028e
JH
3710 if (!args)
3711 return;
99b1c316
MS
3712 class ipa_call_summary *es = ipa_call_summaries->get (edge);
3713 class ipa_call_summary *inlined_es
56f62793 3714 = ipa_call_summaries->get (inlined_edge);
27d020cf 3715
8c02e054
JH
3716 if (es->param.length () == 0)
3717 return;
3718
27d020cf
JH
3719 for (i = 0; i < ipa_get_cs_argument_count (args); i++)
3720 {
3721 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
3722 if (jfunc->type == IPA_JF_PASS_THROUGH
3723 || jfunc->type == IPA_JF_ANCESTOR)
3724 {
3725 int id = jfunc->type == IPA_JF_PASS_THROUGH
3726 ? ipa_get_jf_pass_through_formal_id (jfunc)
3727 : ipa_get_jf_ancestor_formal_id (jfunc);
3728 if (id < (int) inlined_es->param.length ())
3729 {
3730 int prob1 = es->param[i].change_prob;
3731 int prob2 = inlined_es->param[id].change_prob;
3732 int prob = combine_probabilities (prob1, prob2);
3733
3734 if (prob1 && prob2 && !prob)
3735 prob = 1;
3736
3737 es->param[i].change_prob = prob;
3738 }
3739 }
3740 }
3741 }
3742}
3743
3744/* Update edge summaries of NODE after INLINED_EDGE has been inlined.
3745
3746 Remap predicates of callees of NODE. Rest of arguments match
3747 remap_predicate.
3748
3749 Also update change probabilities. */
3750
3751static void
3752remap_edge_summaries (struct cgraph_edge *inlined_edge,
3753 struct cgraph_node *node,
99b1c316 3754 class ipa_fn_summary *info,
40a777e8 3755 class ipa_node_params *params_summary,
99b1c316 3756 class ipa_fn_summary *callee_info,
27d020cf
JH
3757 vec<int> operand_map,
3758 vec<int> offset_map,
3759 clause_t possible_truths,
3760 predicate *toplev_predicate)
3761{
3762 struct cgraph_edge *e, *next;
3763 for (e = node->callees; e; e = next)
3764 {
27d020cf
JH
3765 predicate p;
3766 next = e->next_callee;
3767
3768 if (e->inline_failed)
3769 {
6cf67b62 3770 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
3771 remap_edge_change_prob (inlined_edge, e);
3772
3773 if (es->predicate)
3774 {
3775 p = es->predicate->remap_after_inlining
40a777e8
JH
3776 (info, params_summary,
3777 callee_info, operand_map,
27d020cf
JH
3778 offset_map, possible_truths,
3779 *toplev_predicate);
3780 edge_set_predicate (e, &p);
3781 }
3782 else
3783 edge_set_predicate (e, toplev_predicate);
3784 }
3785 else
40a777e8
JH
3786 remap_edge_summaries (inlined_edge, e->callee, info,
3787 params_summary, callee_info,
27d020cf
JH
3788 operand_map, offset_map, possible_truths,
3789 toplev_predicate);
3790 }
3791 for (e = node->indirect_calls; e; e = next)
3792 {
99b1c316 3793 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
3794 predicate p;
3795 next = e->next_callee;
3796
3797 remap_edge_change_prob (inlined_edge, e);
3798 if (es->predicate)
3799 {
3800 p = es->predicate->remap_after_inlining
40a777e8
JH
3801 (info, params_summary,
3802 callee_info, operand_map, offset_map,
27d020cf
JH
3803 possible_truths, *toplev_predicate);
3804 edge_set_predicate (e, &p);
3805 }
3806 else
3807 edge_set_predicate (e, toplev_predicate);
3808 }
3809}
3810
3811/* Same as remap_predicate, but set result into hint *HINT. */
3812
3813static void
99b1c316 3814remap_hint_predicate (class ipa_fn_summary *info,
40a777e8 3815 class ipa_node_params *params_summary,
99b1c316 3816 class ipa_fn_summary *callee_info,
27d020cf
JH
3817 predicate **hint,
3818 vec<int> operand_map,
3819 vec<int> offset_map,
3820 clause_t possible_truths,
3821 predicate *toplev_predicate)
3822{
3823 predicate p;
3824
3825 if (!*hint)
3826 return;
3827 p = (*hint)->remap_after_inlining
40a777e8 3828 (info, params_summary, callee_info,
27d020cf
JH
3829 operand_map, offset_map,
3830 possible_truths, *toplev_predicate);
3831 if (p != false && p != true)
3832 {
3833 if (!*hint)
3834 set_hint_predicate (hint, p);
3835 else
3836 **hint &= p;
3837 }
3838}
3839
3840/* We inlined EDGE. Update summary of the function we inlined into. */
3841
3842void
0bceb671 3843ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
27d020cf 3844{
56f62793 3845 ipa_fn_summary *callee_info = ipa_fn_summaries->get (edge->callee);
a62bfab5
ML
3846 struct cgraph_node *to = (edge->caller->inlined_to
3847 ? edge->caller->inlined_to : edge->caller);
99b1c316 3848 class ipa_fn_summary *info = ipa_fn_summaries->get (to);
27d020cf
JH
3849 clause_t clause = 0; /* not_inline is known to be false. */
3850 size_time_entry *e;
f658ad30
JH
3851 auto_vec<int, 8> operand_map;
3852 auto_vec<int, 8> offset_map;
27d020cf
JH
3853 int i;
3854 predicate toplev_predicate;
99b1c316 3855 class ipa_call_summary *es = ipa_call_summaries->get (edge);
40a777e8
JH
3856 class ipa_node_params *params_summary = (ipa_node_params_sum
3857 ? IPA_NODE_REF (to) : NULL);
27d020cf
JH
3858
3859 if (es->predicate)
3860 toplev_predicate = *es->predicate;
3861 else
3862 toplev_predicate = true;
3863
3864 info->fp_expressions |= callee_info->fp_expressions;
3865
3866 if (callee_info->conds)
b0d55476
JH
3867 {
3868 auto_vec<tree, 32> known_vals;
3869 auto_vec<ipa_agg_value_set, 32> known_aggs;
3870 evaluate_properties_for_edge (edge, true, &clause, NULL,
3871 &known_vals, NULL, &known_aggs);
3872 }
27d020cf
JH
3873 if (ipa_node_params_sum && callee_info->conds)
3874 {
99b1c316 3875 class ipa_edge_args *args = IPA_EDGE_REF (edge);
5a0236f8 3876 int count = args ? ipa_get_cs_argument_count (args) : 0;
27d020cf
JH
3877 int i;
3878
3879 if (count)
3880 {
3881 operand_map.safe_grow_cleared (count);
3882 offset_map.safe_grow_cleared (count);
3883 }
3884 for (i = 0; i < count; i++)
3885 {
3886 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
3887 int map = -1;
3888
3889 /* TODO: handle non-NOPs when merging. */
3890 if (jfunc->type == IPA_JF_PASS_THROUGH)
3891 {
3892 if (ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
3893 map = ipa_get_jf_pass_through_formal_id (jfunc);
3894 if (!ipa_get_jf_pass_through_agg_preserved (jfunc))
3895 offset_map[i] = -1;
3896 }
3897 else if (jfunc->type == IPA_JF_ANCESTOR)
3898 {
3899 HOST_WIDE_INT offset = ipa_get_jf_ancestor_offset (jfunc);
3900 if (offset >= 0 && offset < INT_MAX)
3901 {
3902 map = ipa_get_jf_ancestor_formal_id (jfunc);
3903 if (!ipa_get_jf_ancestor_agg_preserved (jfunc))
3904 offset = -1;
3905 offset_map[i] = offset;
3906 }
3907 }
3908 operand_map[i] = map;
40a777e8 3909 gcc_assert (map < ipa_get_param_count (params_summary));
27d020cf
JH
3910 }
3911 }
83263ef5 3912 sreal freq = edge->sreal_frequency ();
27d020cf
JH
3913 for (i = 0; vec_safe_iterate (callee_info->size_time_table, i, &e); i++)
3914 {
3915 predicate p;
3916 p = e->exec_predicate.remap_after_inlining
40a777e8
JH
3917 (info, params_summary,
3918 callee_info, operand_map,
27d020cf
JH
3919 offset_map, clause,
3920 toplev_predicate);
3921 predicate nonconstp;
3922 nonconstp = e->nonconst_predicate.remap_after_inlining
40a777e8
JH
3923 (info, params_summary,
3924 callee_info, operand_map,
27d020cf
JH
3925 offset_map, clause,
3926 toplev_predicate);
3927 if (p != false && nonconstp != false)
3928 {
83263ef5 3929 sreal add_time = ((sreal)e->time * freq);
27d020cf
JH
3930 int prob = e->nonconst_predicate.probability (callee_info->conds,
3931 clause, es->param);
fd4656a2
JH
3932 if (prob != REG_BR_PROB_BASE)
3933 add_time = add_time * prob / REG_BR_PROB_BASE;
27d020cf
JH
3934 if (prob != REG_BR_PROB_BASE
3935 && dump_file && (dump_flags & TDF_DETAILS))
3936 {
3937 fprintf (dump_file, "\t\tScaling time by probability:%f\n",
3938 (double) prob / REG_BR_PROB_BASE);
3939 }
3940 info->account_size_time (e->size, add_time, p, nonconstp);
3941 }
3942 }
40a777e8
JH
3943 remap_edge_summaries (edge, edge->callee, info, params_summary,
3944 callee_info, operand_map,
27d020cf 3945 offset_map, clause, &toplev_predicate);
40a777e8 3946 remap_hint_predicate (info, params_summary, callee_info,
27d020cf
JH
3947 &callee_info->loop_iterations,
3948 operand_map, offset_map, clause, &toplev_predicate);
40a777e8 3949 remap_hint_predicate (info, params_summary, callee_info,
27d020cf
JH
3950 &callee_info->loop_stride,
3951 operand_map, offset_map, clause, &toplev_predicate);
27d020cf 3952
f658ad30
JH
3953 HOST_WIDE_INT stack_frame_offset = ipa_get_stack_frame_offset (edge->callee);
3954 HOST_WIDE_INT peak = stack_frame_offset + callee_info->estimated_stack_size;
27d020cf 3955
f658ad30
JH
3956 if (info->estimated_stack_size < peak)
3957 info->estimated_stack_size = peak;
3958
3959 inline_update_callee_summaries (edge->callee, es->loop_depth);
d2bcf46c
JH
3960 if (info->call_size_time_table)
3961 {
3962 int edge_size = 0;
3963 sreal edge_time = 0;
3964
3965 estimate_edge_size_and_time (edge, &edge_size, NULL, &edge_time, vNULL,
3966 vNULL, vNULL, 0);
3967 /* Unaccount size and time of the optimized out call. */
3968 info->account_size_time (-edge_size, -edge_time,
3969 es->predicate ? *es->predicate : true,
3970 es->predicate ? *es->predicate : true,
3971 true);
3972 /* Account new calls. */
3973 summarize_calls_size_and_time (edge->callee, info);
3974 }
f658ad30
JH
3975
3976 /* Free summaries that are not maintained for inline clones/edges. */
3977 ipa_call_summaries->remove (edge);
3978 ipa_fn_summaries->remove (edge->callee);
7237f93e 3979 ipa_remove_from_growth_caches (edge);
27d020cf
JH
3980}
3981
f658ad30 3982/* For performance reasons ipa_merge_fn_summary_after_inlining is not updating
d2bcf46c
JH
3983 overall size and time. Recompute it.
3984 If RESET is true also recompute call_time_size_table. */
27d020cf
JH
3985
3986void
d2bcf46c 3987ipa_update_overall_fn_summary (struct cgraph_node *node, bool reset)
27d020cf 3988{
7237f93e
JH
3989 class ipa_fn_summary *info = ipa_fn_summaries->get (node);
3990 class ipa_size_summary *size_info = ipa_size_summaries->get (node);
27d020cf
JH
3991 size_time_entry *e;
3992 int i;
3993
f658ad30 3994 size_info->size = 0;
27d020cf
JH
3995 info->time = 0;
3996 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3997 {
f658ad30 3998 size_info->size += e->size;
27d020cf
JH
3999 info->time += e->time;
4000 }
e3bd08dd 4001 info->min_size = (*info->size_time_table)[0].size;
d2bcf46c
JH
4002 if (reset)
4003 vec_free (info->call_size_time_table);
070e3489
JH
4004 if (node->callees || node->indirect_calls)
4005 estimate_calls_size_and_time (node, &size_info->size, &info->min_size,
4006 &info->time, NULL,
4007 ~(clause_t) (1 << predicate::false_condition),
4008 vNULL, vNULL, vNULL);
e3bd08dd
JH
4009 size_info->size = RDIV (size_info->size, ipa_fn_summary::size_scale);
4010 info->min_size = RDIV (info->min_size, ipa_fn_summary::size_scale);
27d020cf
JH
4011}
4012
4013
4014/* This function performs intraprocedural analysis in NODE that is required to
4015 inline indirect calls. */
4016
4017static void
4018inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
4019{
4020 ipa_analyze_node (node);
4021 if (dump_file && (dump_flags & TDF_DETAILS))
4022 {
4023 ipa_print_node_params (dump_file, node);
4024 ipa_print_node_jump_functions (dump_file, node);
4025 }
4026}
4027
4028
4029/* Note function body size. */
4030
4031void
4032inline_analyze_function (struct cgraph_node *node)
4033{
4034 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
4035
4036 if (dump_file)
4037 fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
4038 node->name (), node->order);
4039 if (opt_for_fn (node->decl, optimize) && !node->thunk.thunk_p)
4040 inline_indirect_intraprocedural_analysis (node);
0bceb671 4041 compute_fn_summary (node, false);
27d020cf
JH
4042 if (!optimize)
4043 {
4044 struct cgraph_edge *e;
4045 for (e = node->callees; e; e = e->next_callee)
4046 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
4047 for (e = node->indirect_calls; e; e = e->next_callee)
4048 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
4049 }
4050
4051 pop_cfun ();
4052}
4053
4054
4055/* Called when new function is inserted to callgraph late. */
4056
4057void
0bceb671 4058ipa_fn_summary_t::insert (struct cgraph_node *node, ipa_fn_summary *)
27d020cf
JH
4059{
4060 inline_analyze_function (node);
4061}
4062
4063/* Note function body size. */
4064
d2db2e6b
JH
4065static void
4066ipa_fn_summary_generate (void)
27d020cf
JH
4067{
4068 struct cgraph_node *node;
4069
4070 FOR_EACH_DEFINED_FUNCTION (node)
4071 if (DECL_STRUCT_FUNCTION (node->decl))
87f94429 4072 node->versionable = tree_versionable_function_p (node->decl);
27d020cf 4073
0bceb671 4074 ipa_fn_summary_alloc ();
27d020cf 4075
0bceb671 4076 ipa_fn_summaries->enable_insertion_hook ();
27d020cf
JH
4077
4078 ipa_register_cgraph_hooks ();
27d020cf
JH
4079
4080 FOR_EACH_DEFINED_FUNCTION (node)
29f1e2b1
JH
4081 if (!node->alias
4082 && (flag_generate_lto || flag_generate_offload|| flag_wpa
4083 || opt_for_fn (node->decl, optimize)))
27d020cf
JH
4084 inline_analyze_function (node);
4085}
4086
4087
4088/* Write inline summary for edge E to OB. */
4089
4090static void
99b1c316 4091read_ipa_call_summary (class lto_input_block *ib, struct cgraph_edge *e,
ddfb1317 4092 bool prevails)
27d020cf 4093{
99b1c316 4094 class ipa_call_summary *es = prevails
ddfb1317 4095 ? ipa_call_summaries->get_create (e) : NULL;
27d020cf
JH
4096 predicate p;
4097 int length, i;
4098
ddfb1317
JH
4099 int size = streamer_read_uhwi (ib);
4100 int time = streamer_read_uhwi (ib);
4101 int depth = streamer_read_uhwi (ib);
4102
4103 if (es)
4104 {
4105 es->call_stmt_size = size;
4106 es->call_stmt_time = time;
4107 es->loop_depth = depth;
4108 }
0fab169b
PK
4109
4110 bitpack_d bp = streamer_read_bitpack (ib);
ddfb1317
JH
4111 if (es)
4112 es->is_return_callee_uncaptured = bp_unpack_value (&bp, 1);
4113 else
4114 bp_unpack_value (&bp, 1);
0fab169b 4115
27d020cf 4116 p.stream_in (ib);
ddfb1317
JH
4117 if (es)
4118 edge_set_predicate (e, &p);
27d020cf 4119 length = streamer_read_uhwi (ib);
ddfb1317 4120 if (length && es && e->possibly_call_in_translation_unit_p ())
27d020cf
JH
4121 {
4122 es->param.safe_grow_cleared (length);
4123 for (i = 0; i < length; i++)
4124 es->param[i].change_prob = streamer_read_uhwi (ib);
4125 }
ddfb1317
JH
4126 else
4127 {
4128 for (i = 0; i < length; i++)
4129 streamer_read_uhwi (ib);
4130 }
27d020cf
JH
4131}
4132
4133
4134/* Stream in inline summaries from the section. */
4135
4136static void
4137inline_read_section (struct lto_file_decl_data *file_data, const char *data,
4138 size_t len)
4139{
4140 const struct lto_function_header *header =
4141 (const struct lto_function_header *) data;
4142 const int cfg_offset = sizeof (struct lto_function_header);
4143 const int main_offset = cfg_offset + header->cfg_size;
4144 const int string_offset = main_offset + header->main_size;
99b1c316 4145 class data_in *data_in;
27d020cf
JH
4146 unsigned int i, count2, j;
4147 unsigned int f_count;
4148
4149 lto_input_block ib ((const char *) data + main_offset, header->main_size,
4150 file_data->mode_table);
4151
4152 data_in =
4153 lto_data_in_create (file_data, (const char *) data + string_offset,
4154 header->string_size, vNULL);
4155 f_count = streamer_read_uhwi (&ib);
4156 for (i = 0; i < f_count; i++)
4157 {
4158 unsigned int index;
4159 struct cgraph_node *node;
99b1c316 4160 class ipa_fn_summary *info;
40a777e8 4161 class ipa_node_params *params_summary;
f658ad30 4162 class ipa_size_summary *size_info;
27d020cf
JH
4163 lto_symtab_encoder_t encoder;
4164 struct bitpack_d bp;
4165 struct cgraph_edge *e;
4166 predicate p;
4167
4168 index = streamer_read_uhwi (&ib);
4169 encoder = file_data->symtab_node_encoder;
4170 node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
4171 index));
ddfb1317 4172 info = node->prevailing_p () ? ipa_fn_summaries->get_create (node) : NULL;
40a777e8 4173 params_summary = node->prevailing_p () ? IPA_NODE_REF (node) : NULL;
f658ad30
JH
4174 size_info = node->prevailing_p ()
4175 ? ipa_size_summaries->get_create (node) : NULL;
27d020cf 4176
ddfb1317
JH
4177 int stack_size = streamer_read_uhwi (&ib);
4178 int size = streamer_read_uhwi (&ib);
4179 sreal time = sreal::stream_in (&ib);
4180
4181 if (info)
4182 {
4183 info->estimated_stack_size
f658ad30
JH
4184 = size_info->estimated_self_stack_size = stack_size;
4185 size_info->size = size_info->self_size = size;
ddfb1317
JH
4186 info->time = time;
4187 }
27d020cf
JH
4188
4189 bp = streamer_read_bitpack (&ib);
ddfb1317
JH
4190 if (info)
4191 {
4192 info->inlinable = bp_unpack_value (&bp, 1);
4193 info->fp_expressions = bp_unpack_value (&bp, 1);
4194 }
4195 else
4196 {
4197 bp_unpack_value (&bp, 1);
4198 bp_unpack_value (&bp, 1);
4199 }
27d020cf
JH
4200
4201 count2 = streamer_read_uhwi (&ib);
ddfb1317 4202 gcc_assert (!info || !info->conds);
360386c7
JH
4203 if (info)
4204 vec_safe_reserve_exact (info->conds, count2);
27d020cf
JH
4205 for (j = 0; j < count2; j++)
4206 {
4207 struct condition c;
4307a485 4208 unsigned int k, count3;
27d020cf 4209 c.operand_num = streamer_read_uhwi (&ib);
27d020cf 4210 c.code = (enum tree_code) streamer_read_uhwi (&ib);
4307a485 4211 c.type = stream_read_tree (&ib, data_in);
27d020cf
JH
4212 c.val = stream_read_tree (&ib, data_in);
4213 bp = streamer_read_bitpack (&ib);
4214 c.agg_contents = bp_unpack_value (&bp, 1);
4215 c.by_ref = bp_unpack_value (&bp, 1);
4216 if (c.agg_contents)
4217 c.offset = streamer_read_uhwi (&ib);
4307a485 4218 count3 = streamer_read_uhwi (&ib);
360386c7
JH
4219 c.param_ops = NULL;
4220 if (info)
4221 vec_safe_reserve_exact (c.param_ops, count3);
40a777e8
JH
4222 if (params_summary)
4223 ipa_set_param_used_by_ipa_predicates
4224 (params_summary, c.operand_num, true);
4307a485
FX
4225 for (k = 0; k < count3; k++)
4226 {
4227 struct expr_eval_op op;
4228 enum gimple_rhs_class rhs_class;
4229 op.code = (enum tree_code) streamer_read_uhwi (&ib);
4230 op.type = stream_read_tree (&ib, data_in);
4231 switch (rhs_class = get_gimple_rhs_class (op.code))
4232 {
4233 case GIMPLE_UNARY_RHS:
4234 op.index = 0;
4235 op.val[0] = NULL_TREE;
4236 op.val[1] = NULL_TREE;
4237 break;
4238
4239 case GIMPLE_BINARY_RHS:
4240 case GIMPLE_TERNARY_RHS:
4241 bp = streamer_read_bitpack (&ib);
4242 op.index = bp_unpack_value (&bp, 2);
4243 op.val[0] = stream_read_tree (&ib, data_in);
4244 if (rhs_class == GIMPLE_BINARY_RHS)
4245 op.val[1] = NULL_TREE;
4246 else
4247 op.val[1] = stream_read_tree (&ib, data_in);
4248 break;
4249
4250 default:
4251 fatal_error (UNKNOWN_LOCATION,
4252 "invalid fnsummary in LTO stream");
4253 }
360386c7
JH
4254 if (info)
4255 c.param_ops->quick_push (op);
4307a485 4256 }
ddfb1317 4257 if (info)
360386c7 4258 info->conds->quick_push (c);
27d020cf
JH
4259 }
4260 count2 = streamer_read_uhwi (&ib);
ddfb1317 4261 gcc_assert (!info || !info->size_time_table);
360386c7
JH
4262 if (info && count2)
4263 vec_safe_reserve_exact (info->size_time_table, count2);
27d020cf
JH
4264 for (j = 0; j < count2; j++)
4265 {
99b1c316 4266 class size_time_entry e;
27d020cf
JH
4267
4268 e.size = streamer_read_uhwi (&ib);
4269 e.time = sreal::stream_in (&ib);
4270 e.exec_predicate.stream_in (&ib);
4271 e.nonconst_predicate.stream_in (&ib);
4272
ddfb1317 4273 if (info)
360386c7 4274 info->size_time_table->quick_push (e);
27d020cf
JH
4275 }
4276
4277 p.stream_in (&ib);
ddfb1317
JH
4278 if (info)
4279 set_hint_predicate (&info->loop_iterations, p);
27d020cf 4280 p.stream_in (&ib);
ddfb1317
JH
4281 if (info)
4282 set_hint_predicate (&info->loop_stride, p);
27d020cf 4283 for (e = node->callees; e; e = e->next_callee)
ddfb1317 4284 read_ipa_call_summary (&ib, e, info != NULL);
27d020cf 4285 for (e = node->indirect_calls; e; e = e->next_callee)
ddfb1317 4286 read_ipa_call_summary (&ib, e, info != NULL);
27d020cf
JH
4287 }
4288
0bceb671 4289 lto_free_section_data (file_data, LTO_section_ipa_fn_summary, NULL, data,
27d020cf
JH
4290 len);
4291 lto_data_in_delete (data_in);
4292}
4293
4294
4295/* Read inline summary. Jump functions are shared among ipa-cp
4296 and inliner, so when ipa-cp is active, we don't need to write them
4297 twice. */
4298
d2db2e6b
JH
4299static void
4300ipa_fn_summary_read (void)
27d020cf
JH
4301{
4302 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
4303 struct lto_file_decl_data *file_data;
4304 unsigned int j = 0;
4305
0bceb671 4306 ipa_fn_summary_alloc ();
27d020cf
JH
4307
4308 while ((file_data = file_data_vec[j++]))
4309 {
4310 size_t len;
3c56d8d8
ML
4311 const char *data
4312 = lto_get_summary_section_data (file_data, LTO_section_ipa_fn_summary,
4313 &len);
27d020cf
JH
4314 if (data)
4315 inline_read_section (file_data, data, len);
4316 else
4317 /* Fatal error here. We do not want to support compiling ltrans units
4318 with different version of compiler or different flags than the WPA
4319 unit, so this should never happen. */
4320 fatal_error (input_location,
4321 "ipa inline summary is missing in input file");
4322 }
29f1e2b1
JH
4323 ipa_register_cgraph_hooks ();
4324 if (!flag_ipa_cp)
4325 ipa_prop_read_jump_functions ();
27d020cf 4326
0bceb671
JH
4327 gcc_assert (ipa_fn_summaries);
4328 ipa_fn_summaries->enable_insertion_hook ();
27d020cf
JH
4329}
4330
4331
4332/* Write inline summary for edge E to OB. */
4333
4334static void
4335write_ipa_call_summary (struct output_block *ob, struct cgraph_edge *e)
4336{
99b1c316 4337 class ipa_call_summary *es = ipa_call_summaries->get (e);
27d020cf
JH
4338 int i;
4339
4340 streamer_write_uhwi (ob, es->call_stmt_size);
4341 streamer_write_uhwi (ob, es->call_stmt_time);
4342 streamer_write_uhwi (ob, es->loop_depth);
0fab169b
PK
4343
4344 bitpack_d bp = bitpack_create (ob->main_stream);
4345 bp_pack_value (&bp, es->is_return_callee_uncaptured, 1);
4346 streamer_write_bitpack (&bp);
4347
27d020cf
JH
4348 if (es->predicate)
4349 es->predicate->stream_out (ob);
4350 else
4351 streamer_write_uhwi (ob, 0);
4352 streamer_write_uhwi (ob, es->param.length ());
4353 for (i = 0; i < (int) es->param.length (); i++)
4354 streamer_write_uhwi (ob, es->param[i].change_prob);
4355}
4356
4357
4358/* Write inline summary for node in SET.
4359 Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
4360 active, we don't need to write them twice. */
4361
d2db2e6b
JH
4362static void
4363ipa_fn_summary_write (void)
27d020cf 4364{
0bceb671 4365 struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
16570c12 4366 lto_symtab_encoder_iterator lsei;
27d020cf
JH
4367 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
4368 unsigned int count = 0;
27d020cf 4369
16570c12
JJ
4370 for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4371 lsei_next_function_in_partition (&lsei))
27d020cf 4372 {
16570c12
JJ
4373 cgraph_node *cnode = lsei_cgraph_node (lsei);
4374 if (cnode->definition && !cnode->alias)
27d020cf
JH
4375 count++;
4376 }
4377 streamer_write_uhwi (ob, count);
4378
16570c12
JJ
4379 for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4380 lsei_next_function_in_partition (&lsei))
27d020cf 4381 {
16570c12
JJ
4382 cgraph_node *cnode = lsei_cgraph_node (lsei);
4383 if (cnode->definition && !cnode->alias)
27d020cf 4384 {
99b1c316 4385 class ipa_fn_summary *info = ipa_fn_summaries->get (cnode);
f658ad30 4386 class ipa_size_summary *size_info = ipa_size_summaries->get (cnode);
27d020cf
JH
4387 struct bitpack_d bp;
4388 struct cgraph_edge *edge;
4389 int i;
4390 size_time_entry *e;
4391 struct condition *c;
4392
4393 streamer_write_uhwi (ob, lto_symtab_encoder_encode (encoder, cnode));
f658ad30
JH
4394 streamer_write_hwi (ob, size_info->estimated_self_stack_size);
4395 streamer_write_hwi (ob, size_info->self_size);
27d020cf
JH
4396 info->time.stream_out (ob);
4397 bp = bitpack_create (ob->main_stream);
4398 bp_pack_value (&bp, info->inlinable, 1);
5e9d6aa4 4399 bp_pack_value (&bp, false, 1);
27d020cf
JH
4400 bp_pack_value (&bp, info->fp_expressions, 1);
4401 streamer_write_bitpack (&bp);
4402 streamer_write_uhwi (ob, vec_safe_length (info->conds));
4403 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
4404 {
4307a485
FX
4405 int j;
4406 struct expr_eval_op *op;
4407
27d020cf 4408 streamer_write_uhwi (ob, c->operand_num);
27d020cf 4409 streamer_write_uhwi (ob, c->code);
4307a485 4410 stream_write_tree (ob, c->type, true);
27d020cf
JH
4411 stream_write_tree (ob, c->val, true);
4412 bp = bitpack_create (ob->main_stream);
4413 bp_pack_value (&bp, c->agg_contents, 1);
4414 bp_pack_value (&bp, c->by_ref, 1);
4415 streamer_write_bitpack (&bp);
4416 if (c->agg_contents)
4417 streamer_write_uhwi (ob, c->offset);
4307a485
FX
4418 streamer_write_uhwi (ob, vec_safe_length (c->param_ops));
4419 for (j = 0; vec_safe_iterate (c->param_ops, j, &op); j++)
4420 {
4421 streamer_write_uhwi (ob, op->code);
4422 stream_write_tree (ob, op->type, true);
4423 if (op->val[0])
4424 {
4425 bp = bitpack_create (ob->main_stream);
4426 bp_pack_value (&bp, op->index, 2);
4427 streamer_write_bitpack (&bp);
4428 stream_write_tree (ob, op->val[0], true);
4429 if (op->val[1])
4430 stream_write_tree (ob, op->val[1], true);
4431 }
4432 }
27d020cf
JH
4433 }
4434 streamer_write_uhwi (ob, vec_safe_length (info->size_time_table));
4435 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
4436 {
4437 streamer_write_uhwi (ob, e->size);
4438 e->time.stream_out (ob);
4439 e->exec_predicate.stream_out (ob);
4440 e->nonconst_predicate.stream_out (ob);
4441 }
4442 if (info->loop_iterations)
4443 info->loop_iterations->stream_out (ob);
4444 else
4445 streamer_write_uhwi (ob, 0);
4446 if (info->loop_stride)
4447 info->loop_stride->stream_out (ob);
4448 else
4449 streamer_write_uhwi (ob, 0);
27d020cf
JH
4450 for (edge = cnode->callees; edge; edge = edge->next_callee)
4451 write_ipa_call_summary (ob, edge);
4452 for (edge = cnode->indirect_calls; edge; edge = edge->next_callee)
4453 write_ipa_call_summary (ob, edge);
4454 }
4455 }
4456 streamer_write_char_stream (ob->main_stream, 0);
4457 produce_asm (ob, NULL);
4458 destroy_output_block (ob);
4459
29f1e2b1 4460 if (!flag_ipa_cp)
27d020cf
JH
4461 ipa_prop_write_jump_functions ();
4462}
4463
4464
f658ad30 4465/* Release function summary. */
27d020cf
JH
4466
4467void
d2db2e6b 4468ipa_free_fn_summary (void)
27d020cf 4469{
27d020cf
JH
4470 if (!ipa_call_summaries)
4471 return;
ddf628e4 4472 ggc_delete (ipa_fn_summaries);
0bceb671 4473 ipa_fn_summaries = NULL;
27d020cf
JH
4474 delete ipa_call_summaries;
4475 ipa_call_summaries = NULL;
4476 edge_predicate_pool.release ();
f658ad30
JH
4477 /* During IPA this is one of largest datastructures to release. */
4478 if (flag_wpa)
4479 ggc_trim ();
4480}
4481
4482/* Release function summary. */
4483
4484void
4485ipa_free_size_summary (void)
4486{
4487 if (!ipa_size_summaries)
4488 return;
78cd68c0 4489 delete ipa_size_summaries;
f658ad30 4490 ipa_size_summaries = NULL;
27d020cf 4491}
d2db2e6b
JH
4492
4493namespace {
4494
4495const pass_data pass_data_local_fn_summary =
4496{
4497 GIMPLE_PASS, /* type */
4498 "local-fnsummary", /* name */
4499 OPTGROUP_INLINE, /* optinfo_flags */
4500 TV_INLINE_PARAMETERS, /* tv_id */
4501 0, /* properties_required */
4502 0, /* properties_provided */
4503 0, /* properties_destroyed */
4504 0, /* todo_flags_start */
4505 0, /* todo_flags_finish */
4506};
4507
4508class pass_local_fn_summary : public gimple_opt_pass
4509{
4510public:
4511 pass_local_fn_summary (gcc::context *ctxt)
4512 : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
4513 {}
4514
4515 /* opt_pass methods: */
4516 opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
4517 virtual unsigned int execute (function *)
4518 {
4519 return compute_fn_summary_for_current ();
4520 }
4521
4522}; // class pass_local_fn_summary
4523
4524} // anon namespace
4525
4526gimple_opt_pass *
4527make_pass_local_fn_summary (gcc::context *ctxt)
4528{
4529 return new pass_local_fn_summary (ctxt);
4530}
4531
4532
4533/* Free inline summary. */
4534
4535namespace {
4536
4537const pass_data pass_data_ipa_free_fn_summary =
4538{
4539 SIMPLE_IPA_PASS, /* type */
4540 "free-fnsummary", /* name */
4541 OPTGROUP_NONE, /* optinfo_flags */
4542 TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
4543 0, /* properties_required */
4544 0, /* properties_provided */
4545 0, /* properties_destroyed */
4546 0, /* todo_flags_start */
442db276 4547 0, /* todo_flags_finish */
d2db2e6b
JH
4548};
4549
4550class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
4551{
4552public:
4553 pass_ipa_free_fn_summary (gcc::context *ctxt)
442db276
JJ
4554 : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt),
4555 small_p (false)
d2db2e6b
JH
4556 {}
4557
4558 /* opt_pass methods: */
442db276
JJ
4559 opt_pass *clone () { return new pass_ipa_free_fn_summary (m_ctxt); }
4560 void set_pass_param (unsigned int n, bool param)
4561 {
4562 gcc_assert (n == 0);
4563 small_p = param;
4564 }
f658ad30 4565 virtual bool gate (function *) { return true; }
d2db2e6b
JH
4566 virtual unsigned int execute (function *)
4567 {
4568 ipa_free_fn_summary ();
f658ad30
JH
4569 if (!flag_wpa)
4570 ipa_free_size_summary ();
12485662 4571 return 0;
d2db2e6b
JH
4572 }
4573
442db276
JJ
4574private:
4575 bool small_p;
d2db2e6b
JH
4576}; // class pass_ipa_free_fn_summary
4577
4578} // anon namespace
4579
4580simple_ipa_opt_pass *
4581make_pass_ipa_free_fn_summary (gcc::context *ctxt)
4582{
4583 return new pass_ipa_free_fn_summary (ctxt);
4584}
4585
4586namespace {
4587
4588const pass_data pass_data_ipa_fn_summary =
4589{
4590 IPA_PASS, /* type */
4591 "fnsummary", /* name */
4592 OPTGROUP_INLINE, /* optinfo_flags */
66447ef0 4593 TV_IPA_FNSUMMARY, /* tv_id */
d2db2e6b
JH
4594 0, /* properties_required */
4595 0, /* properties_provided */
4596 0, /* properties_destroyed */
4597 0, /* todo_flags_start */
4598 ( TODO_dump_symtab ), /* todo_flags_finish */
4599};
4600
4601class pass_ipa_fn_summary : public ipa_opt_pass_d
4602{
4603public:
4604 pass_ipa_fn_summary (gcc::context *ctxt)
4605 : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
4606 ipa_fn_summary_generate, /* generate_summary */
4607 ipa_fn_summary_write, /* write_summary */
4608 ipa_fn_summary_read, /* read_summary */
4609 NULL, /* write_optimization_summary */
4610 NULL, /* read_optimization_summary */
4611 NULL, /* stmt_fixup */
4612 0, /* function_transform_todo_flags_start */
4613 NULL, /* function_transform */
4614 NULL) /* variable_transform */
4615 {}
4616
4617 /* opt_pass methods: */
4618 virtual unsigned int execute (function *) { return 0; }
4619
4620}; // class pass_ipa_fn_summary
4621
4622} // anon namespace
4623
4624ipa_opt_pass_d *
4625make_pass_ipa_fn_summary (gcc::context *ctxt)
4626{
4627 return new pass_ipa_fn_summary (ctxt);
4628}
de4381a4
DM
4629
4630/* Reset all state within ipa-fnsummary.c so that we can rerun the compiler
4631 within the same process. For use by toplev::finalize. */
4632
4633void
4634ipa_fnsummary_c_finalize (void)
4635{
4636 ipa_free_fn_summary ();
4637}