]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/ipa-fnsummary.c
Remove the null check from placement new in all modes
[thirdparty/gcc.git] / gcc / ipa-fnsummary.c
CommitLineData
27d020cf
JH
1/* Function summary pass.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
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"
70#include "params.h"
71#include "cfganal.h"
72#include "gimple-iterator.h"
73#include "tree-cfg.h"
74#include "tree-ssa-loop-niter.h"
75#include "tree-ssa-loop.h"
76#include "symbol-summary.h"
77#include "ipa-prop.h"
78#include "ipa-fnsummary.h"
79#include "cfgloop.h"
80#include "tree-scalar-evolution.h"
81#include "ipa-utils.h"
82#include "cilk.h"
83#include "cfgexpand.h"
84#include "gimplify.h"
314e6352
ML
85#include "stringpool.h"
86#include "attribs.h"
27d020cf
JH
87
88/* Summaries. */
0bceb671 89function_summary <ipa_fn_summary *> *ipa_fn_summaries;
27d020cf
JH
90call_summary <ipa_call_summary *> *ipa_call_summaries;
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 }
138 if (hints & INLINE_HINT_array_index)
139 {
140 hints &= ~INLINE_HINT_array_index;
141 fprintf (f, " array_index");
142 }
143 if (hints & INLINE_HINT_known_hot)
144 {
145 hints &= ~INLINE_HINT_known_hot;
146 fprintf (f, " known_hot");
147 }
148 gcc_assert (!hints);
149}
150
151
152/* Record SIZE and TIME to SUMMARY.
153 The accounted code will be executed when EXEC_PRED is true.
154 When NONCONST_PRED is false the code will evaulate to constant and
155 will get optimized out in specialized clones of the function. */
156
157void
0bceb671 158ipa_fn_summary::account_size_time (int size, sreal time,
27d020cf
JH
159 const predicate &exec_pred,
160 const predicate &nonconst_pred_in)
161{
162 size_time_entry *e;
163 bool found = false;
164 int i;
165 predicate nonconst_pred;
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
175 /* We need to create initial empty unconitional clause, but otherwie
176 we don't need to account empty times and sizes. */
177 if (!size && time == 0 && size_time_table)
178 return;
179
180 gcc_assert (time >= 0);
181
182 for (i = 0; vec_safe_iterate (size_time_table, i, &e); i++)
183 if (e->exec_predicate == exec_pred
184 && e->nonconst_predicate == nonconst_pred)
185 {
186 found = true;
187 break;
188 }
189 if (i == 256)
190 {
191 i = 0;
192 found = true;
193 e = &(*size_time_table)[0];
194 if (dump_file && (dump_flags & TDF_DETAILS))
195 fprintf (dump_file,
196 "\t\tReached limit on number of entries, "
197 "ignoring the predicate.");
198 }
199 if (dump_file && (dump_flags & TDF_DETAILS) && (time != 0 || size))
200 {
201 fprintf (dump_file,
202 "\t\tAccounting size:%3.2f, time:%3.2f on %spredicate exec:",
0bceb671 203 ((double) size) / ipa_fn_summary::size_scale,
27d020cf
JH
204 (time.to_double ()), found ? "" : "new ");
205 exec_pred.dump (dump_file, conds, 0);
206 if (exec_pred != nonconst_pred)
207 {
208 fprintf (dump_file, " nonconst:");
209 nonconst_pred.dump (dump_file, conds);
210 }
211 else
212 fprintf (dump_file, "\n");
213 }
214 if (!found)
215 {
216 struct size_time_entry new_entry;
217 new_entry.size = size;
218 new_entry.time = time;
219 new_entry.exec_predicate = exec_pred;
220 new_entry.nonconst_predicate = nonconst_pred;
221 vec_safe_push (size_time_table, new_entry);
222 }
223 else
224 {
225 e->size += size;
226 e->time += time;
227 }
228}
229
230/* We proved E to be unreachable, redirect it to __bultin_unreachable. */
231
232static struct cgraph_edge *
233redirect_to_unreachable (struct cgraph_edge *e)
234{
235 struct cgraph_node *callee = !e->inline_failed ? e->callee : NULL;
236 struct cgraph_node *target = cgraph_node::get_create
237 (builtin_decl_implicit (BUILT_IN_UNREACHABLE));
238
239 if (e->speculative)
240 e = e->resolve_speculation (target->decl);
241 else if (!e->callee)
242 e->make_direct (target);
243 else
244 e->redirect_callee (target);
245 struct ipa_call_summary *es = ipa_call_summaries->get (e);
246 e->inline_failed = CIF_UNREACHABLE;
3995f3a2 247 e->count = profile_count::zero ();
27d020cf
JH
248 es->call_stmt_size = 0;
249 es->call_stmt_time = 0;
250 if (callee)
251 callee->remove_symbol_and_inline_clones ();
252 return e;
253}
254
255/* Set predicate for edge E. */
256
257static void
258edge_set_predicate (struct cgraph_edge *e, predicate *predicate)
259{
260 /* If the edge is determined to be never executed, redirect it
0bceb671
JH
261 to BUILTIN_UNREACHABLE to make it clear to IPA passes the call will
262 be optimized out. */
27d020cf
JH
263 if (predicate && *predicate == false
264 /* When handling speculative edges, we need to do the redirection
265 just once. Do it always on the direct edge, so we do not
266 attempt to resolve speculation while duplicating the edge. */
267 && (!e->speculative || e->callee))
268 e = redirect_to_unreachable (e);
269
270 struct ipa_call_summary *es = ipa_call_summaries->get (e);
271 if (predicate && *predicate != true)
272 {
273 if (!es->predicate)
274 es->predicate = edge_predicate_pool.allocate ();
275 *es->predicate = *predicate;
276 }
277 else
278 {
279 if (es->predicate)
280 edge_predicate_pool.remove (es->predicate);
281 es->predicate = NULL;
282 }
283}
284
285/* Set predicate for hint *P. */
286
287static void
288set_hint_predicate (predicate **p, predicate new_predicate)
289{
290 if (new_predicate == false || new_predicate == true)
291 {
292 if (*p)
293 edge_predicate_pool.remove (*p);
294 *p = NULL;
295 }
296 else
297 {
298 if (!*p)
299 *p = edge_predicate_pool.allocate ();
300 **p = new_predicate;
301 }
302}
303
304
305/* Compute what conditions may or may not hold given invormation about
306 parameters. RET_CLAUSE returns truths that may hold in a specialized copy,
307 whie RET_NONSPEC_CLAUSE returns truths that may hold in an nonspecialized
308 copy when called in a given context. It is a bitmask of conditions. Bit
309 0 means that condition is known to be false, while bit 1 means that condition
310 may or may not be true. These differs - for example NOT_INLINED condition
311 is always false in the second and also builtin_constant_p tests can not use
312 the fact that parameter is indeed a constant.
313
314 KNOWN_VALS is partial mapping of parameters of NODE to constant values.
315 KNOWN_AGGS is a vector of aggreggate jump functions for each parameter.
316 Return clause of possible truths. When INLINE_P is true, assume that we are
317 inlining.
318
319 ERROR_MARK means compile time invariant. */
320
321static void
322evaluate_conditions_for_known_args (struct cgraph_node *node,
323 bool inline_p,
324 vec<tree> known_vals,
325 vec<ipa_agg_jump_function_p>
326 known_aggs,
327 clause_t *ret_clause,
328 clause_t *ret_nonspec_clause)
329{
330 clause_t clause = inline_p ? 0 : 1 << predicate::not_inlined_condition;
331 clause_t nonspec_clause = 1 << predicate::not_inlined_condition;
0bceb671 332 struct ipa_fn_summary *info = ipa_fn_summaries->get (node);
27d020cf
JH
333 int i;
334 struct condition *c;
335
336 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
337 {
338 tree val;
339 tree res;
340
341 /* We allow call stmt to have fewer arguments than the callee function
342 (especially for K&R style programs). So bound check here (we assume
343 known_aggs vector, if non-NULL, has the same length as
344 known_vals). */
345 gcc_checking_assert (!known_aggs.exists ()
346 || (known_vals.length () == known_aggs.length ()));
347 if (c->operand_num >= (int) known_vals.length ())
348 {
349 clause |= 1 << (i + predicate::first_dynamic_condition);
350 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
351 continue;
352 }
353
354 if (c->agg_contents)
355 {
356 struct ipa_agg_jump_function *agg;
357
358 if (c->code == predicate::changed
359 && !c->by_ref
360 && (known_vals[c->operand_num] == error_mark_node))
361 continue;
362
363 if (known_aggs.exists ())
364 {
365 agg = known_aggs[c->operand_num];
366 val = ipa_find_agg_cst_for_param (agg, known_vals[c->operand_num],
367 c->offset, c->by_ref);
368 }
369 else
370 val = NULL_TREE;
371 }
372 else
373 {
374 val = known_vals[c->operand_num];
375 if (val == error_mark_node && c->code != predicate::changed)
376 val = NULL_TREE;
377 }
378
379 if (!val)
380 {
381 clause |= 1 << (i + predicate::first_dynamic_condition);
382 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
383 continue;
384 }
385 if (c->code == predicate::changed)
386 {
387 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
388 continue;
389 }
390
391 if (tree_to_shwi (TYPE_SIZE (TREE_TYPE (val))) != c->size)
392 {
393 clause |= 1 << (i + predicate::first_dynamic_condition);
394 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
395 continue;
396 }
397 if (c->code == predicate::is_not_constant)
398 {
399 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
400 continue;
401 }
402
403 val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (c->val), val);
404 res = val
405 ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
406 : NULL;
407
408 if (res && integer_zerop (res))
409 continue;
410
411 clause |= 1 << (i + predicate::first_dynamic_condition);
412 nonspec_clause |= 1 << (i + predicate::first_dynamic_condition);
413 }
414 *ret_clause = clause;
415 if (ret_nonspec_clause)
416 *ret_nonspec_clause = nonspec_clause;
417}
418
419
420/* Work out what conditions might be true at invocation of E. */
421
422void
423evaluate_properties_for_edge (struct cgraph_edge *e, bool inline_p,
424 clause_t *clause_ptr,
425 clause_t *nonspec_clause_ptr,
426 vec<tree> *known_vals_ptr,
427 vec<ipa_polymorphic_call_context>
428 *known_contexts_ptr,
429 vec<ipa_agg_jump_function_p> *known_aggs_ptr)
430{
431 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
0bceb671 432 struct ipa_fn_summary *info = ipa_fn_summaries->get (callee);
27d020cf
JH
433 vec<tree> known_vals = vNULL;
434 vec<ipa_agg_jump_function_p> known_aggs = vNULL;
435
436 if (clause_ptr)
437 *clause_ptr = inline_p ? 0 : 1 << predicate::not_inlined_condition;
438 if (known_vals_ptr)
439 known_vals_ptr->create (0);
440 if (known_contexts_ptr)
441 known_contexts_ptr->create (0);
442
443 if (ipa_node_params_sum
444 && !e->call_stmt_cannot_inline_p
445 && ((clause_ptr && info->conds) || known_vals_ptr || known_contexts_ptr))
446 {
447 struct ipa_node_params *parms_info;
448 struct ipa_edge_args *args = IPA_EDGE_REF (e);
449 struct ipa_call_summary *es = ipa_call_summaries->get (e);
450 int i, count = ipa_get_cs_argument_count (args);
451
452 if (e->caller->global.inlined_to)
453 parms_info = IPA_NODE_REF (e->caller->global.inlined_to);
454 else
455 parms_info = IPA_NODE_REF (e->caller);
456
457 if (count && (info->conds || known_vals_ptr))
458 known_vals.safe_grow_cleared (count);
459 if (count && (info->conds || known_aggs_ptr))
460 known_aggs.safe_grow_cleared (count);
461 if (count && known_contexts_ptr)
462 known_contexts_ptr->safe_grow_cleared (count);
463
464 for (i = 0; i < count; i++)
465 {
466 struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
467 tree cst = ipa_value_from_jfunc (parms_info, jf);
468
469 if (!cst && e->call_stmt
470 && i < (int)gimple_call_num_args (e->call_stmt))
471 {
472 cst = gimple_call_arg (e->call_stmt, i);
473 if (!is_gimple_min_invariant (cst))
474 cst = NULL;
475 }
476 if (cst)
477 {
478 gcc_checking_assert (TREE_CODE (cst) != TREE_BINFO);
479 if (known_vals.exists ())
480 known_vals[i] = cst;
481 }
482 else if (inline_p && !es->param[i].change_prob)
483 known_vals[i] = error_mark_node;
484
485 if (known_contexts_ptr)
486 (*known_contexts_ptr)[i] = ipa_context_from_jfunc (parms_info, e,
487 i, jf);
488 /* TODO: When IPA-CP starts propagating and merging aggregate jump
489 functions, use its knowledge of the caller too, just like the
490 scalar case above. */
491 known_aggs[i] = &jf->agg;
492 }
493 }
494 else if (e->call_stmt && !e->call_stmt_cannot_inline_p
495 && ((clause_ptr && info->conds) || known_vals_ptr))
496 {
497 int i, count = (int)gimple_call_num_args (e->call_stmt);
498
499 if (count && (info->conds || known_vals_ptr))
500 known_vals.safe_grow_cleared (count);
501 for (i = 0; i < count; i++)
502 {
503 tree cst = gimple_call_arg (e->call_stmt, i);
504 if (!is_gimple_min_invariant (cst))
505 cst = NULL;
506 if (cst)
507 known_vals[i] = cst;
508 }
509 }
510
511 evaluate_conditions_for_known_args (callee, inline_p,
512 known_vals, known_aggs, clause_ptr,
513 nonspec_clause_ptr);
514
515 if (known_vals_ptr)
516 *known_vals_ptr = known_vals;
517 else
518 known_vals.release ();
519
520 if (known_aggs_ptr)
521 *known_aggs_ptr = known_aggs;
522 else
523 known_aggs.release ();
524}
525
526
0bceb671 527/* Allocate the function summary. */
27d020cf
JH
528
529static void
0bceb671 530ipa_fn_summary_alloc (void)
27d020cf 531{
0bceb671
JH
532 gcc_checking_assert (!ipa_fn_summaries);
533 ipa_fn_summaries = ipa_fn_summary_t::create_ggc (symtab);
534 ipa_call_summaries = new ipa_call_summary_t (symtab, false);
27d020cf
JH
535}
536
537/* We are called multiple time for given function; clear
538 data from previous run so they are not cumulated. */
539
540void
541ipa_call_summary::reset ()
542{
543 call_stmt_size = call_stmt_time = 0;
0fab169b 544 is_return_callee_uncaptured = false;
27d020cf
JH
545 if (predicate)
546 edge_predicate_pool.remove (predicate);
547 predicate = NULL;
548 param.release ();
549}
550
551/* We are called multiple time for given function; clear
552 data from previous run so they are not cumulated. */
553
554void
0bceb671 555ipa_fn_summary::reset (struct cgraph_node *node)
27d020cf
JH
556{
557 struct cgraph_edge *e;
558
559 self_size = 0;
560 estimated_stack_size = 0;
561 estimated_self_stack_size = 0;
562 stack_frame_offset = 0;
563 size = 0;
564 time = 0;
565 growth = 0;
566 scc_no = 0;
567 if (loop_iterations)
568 {
569 edge_predicate_pool.remove (loop_iterations);
570 loop_iterations = NULL;
571 }
572 if (loop_stride)
573 {
574 edge_predicate_pool.remove (loop_stride);
575 loop_stride = NULL;
576 }
577 if (array_index)
578 {
579 edge_predicate_pool.remove (array_index);
580 array_index = NULL;
581 }
582 vec_free (conds);
583 vec_free (size_time_table);
584 for (e = node->callees; e; e = e->next_callee)
585 ipa_call_summaries->get (e)->reset ();
586 for (e = node->indirect_calls; e; e = e->next_callee)
587 ipa_call_summaries->get (e)->reset ();
588 fp_expressions = false;
589}
590
591/* Hook that is called by cgraph.c when a node is removed. */
592
593void
0bceb671 594ipa_fn_summary_t::remove (cgraph_node *node, ipa_fn_summary *info)
27d020cf
JH
595{
596 info->reset (node);
597}
598
599/* Same as remap_predicate_after_duplication but handle hint predicate *P.
600 Additionally care about allocating new memory slot for updated predicate
601 and set it to NULL when it becomes true or false (and thus uninteresting).
602 */
603
604static void
605remap_hint_predicate_after_duplication (predicate **p,
606 clause_t possible_truths)
607{
608 predicate new_predicate;
609
610 if (!*p)
611 return;
612
613 new_predicate = (*p)->remap_after_duplication (possible_truths);
614 /* We do not want to free previous predicate; it is used by node origin. */
615 *p = NULL;
616 set_hint_predicate (p, new_predicate);
617}
618
619
620/* Hook that is called by cgraph.c when a node is duplicated. */
621void
0bceb671 622ipa_fn_summary_t::duplicate (cgraph_node *src,
27d020cf 623 cgraph_node *dst,
0bceb671
JH
624 ipa_fn_summary *,
625 ipa_fn_summary *info)
27d020cf 626{
0bceb671 627 memcpy (info, ipa_fn_summaries->get (src), sizeof (ipa_fn_summary));
27d020cf
JH
628 /* TODO: as an optimization, we may avoid copying conditions
629 that are known to be false or true. */
630 info->conds = vec_safe_copy (info->conds);
631
632 /* When there are any replacements in the function body, see if we can figure
633 out that something was optimized out. */
634 if (ipa_node_params_sum && dst->clone.tree_map)
635 {
636 vec<size_time_entry, va_gc> *entry = info->size_time_table;
637 /* Use SRC parm info since it may not be copied yet. */
638 struct ipa_node_params *parms_info = IPA_NODE_REF (src);
639 vec<tree> known_vals = vNULL;
640 int count = ipa_get_param_count (parms_info);
641 int i, j;
642 clause_t possible_truths;
643 predicate true_pred = true;
644 size_time_entry *e;
645 int optimized_out_size = 0;
646 bool inlined_to_p = false;
647 struct cgraph_edge *edge, *next;
648
649 info->size_time_table = 0;
650 known_vals.safe_grow_cleared (count);
651 for (i = 0; i < count; i++)
652 {
653 struct ipa_replace_map *r;
654
655 for (j = 0; vec_safe_iterate (dst->clone.tree_map, j, &r); j++)
656 {
657 if (((!r->old_tree && r->parm_num == i)
658 || (r->old_tree && r->old_tree == ipa_get_param (parms_info, i)))
659 && r->replace_p && !r->ref_p)
660 {
661 known_vals[i] = r->new_tree;
662 break;
663 }
664 }
665 }
666 evaluate_conditions_for_known_args (dst, false,
667 known_vals,
668 vNULL,
669 &possible_truths,
670 /* We are going to specialize,
671 so ignore nonspec truths. */
672 NULL);
673 known_vals.release ();
674
675 info->account_size_time (0, 0, true_pred, true_pred);
676
677 /* Remap size_time vectors.
678 Simplify the predicate by prunning out alternatives that are known
679 to be false.
680 TODO: as on optimization, we can also eliminate conditions known
681 to be true. */
682 for (i = 0; vec_safe_iterate (entry, i, &e); i++)
683 {
684 predicate new_exec_pred;
685 predicate new_nonconst_pred;
686 new_exec_pred = e->exec_predicate.remap_after_duplication
687 (possible_truths);
688 new_nonconst_pred = e->nonconst_predicate.remap_after_duplication
689 (possible_truths);
690 if (new_exec_pred == false || new_nonconst_pred == false)
691 optimized_out_size += e->size;
692 else
693 info->account_size_time (e->size, e->time, new_exec_pred,
694 new_nonconst_pred);
695 }
696
697 /* Remap edge predicates with the same simplification as above.
698 Also copy constantness arrays. */
699 for (edge = dst->callees; edge; edge = next)
700 {
701 predicate new_predicate;
702 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
703 next = edge->next_callee;
704
705 if (!edge->inline_failed)
706 inlined_to_p = true;
707 if (!es->predicate)
708 continue;
709 new_predicate = es->predicate->remap_after_duplication
710 (possible_truths);
711 if (new_predicate == false && *es->predicate != false)
0bceb671 712 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
27d020cf
JH
713 edge_set_predicate (edge, &new_predicate);
714 }
715
716 /* Remap indirect edge predicates with the same simplificaiton as above.
717 Also copy constantness arrays. */
718 for (edge = dst->indirect_calls; edge; edge = next)
719 {
720 predicate new_predicate;
721 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
722 next = edge->next_callee;
723
724 gcc_checking_assert (edge->inline_failed);
725 if (!es->predicate)
726 continue;
727 new_predicate = es->predicate->remap_after_duplication
728 (possible_truths);
729 if (new_predicate == false && *es->predicate != false)
0bceb671 730 optimized_out_size += es->call_stmt_size * ipa_fn_summary::size_scale;
27d020cf
JH
731 edge_set_predicate (edge, &new_predicate);
732 }
733 remap_hint_predicate_after_duplication (&info->loop_iterations,
734 possible_truths);
735 remap_hint_predicate_after_duplication (&info->loop_stride,
736 possible_truths);
737 remap_hint_predicate_after_duplication (&info->array_index,
738 possible_truths);
739
740 /* If inliner or someone after inliner will ever start producing
741 non-trivial clones, we will get trouble with lack of information
742 about updating self sizes, because size vectors already contains
743 sizes of the calees. */
744 gcc_assert (!inlined_to_p || !optimized_out_size);
745 }
746 else
747 {
748 info->size_time_table = vec_safe_copy (info->size_time_table);
749 if (info->loop_iterations)
750 {
751 predicate p = *info->loop_iterations;
752 info->loop_iterations = NULL;
753 set_hint_predicate (&info->loop_iterations, p);
754 }
755 if (info->loop_stride)
756 {
757 predicate p = *info->loop_stride;
758 info->loop_stride = NULL;
759 set_hint_predicate (&info->loop_stride, p);
760 }
761 if (info->array_index)
762 {
763 predicate p = *info->array_index;
764 info->array_index = NULL;
765 set_hint_predicate (&info->array_index, p);
766 }
767 }
768 if (!dst->global.inlined_to)
0bceb671 769 ipa_update_overall_fn_summary (dst);
27d020cf
JH
770}
771
772
773/* Hook that is called by cgraph.c when a node is duplicated. */
774
775void
776ipa_call_summary_t::duplicate (struct cgraph_edge *src,
777 struct cgraph_edge *dst,
778 struct ipa_call_summary *srcinfo,
779 struct ipa_call_summary *info)
780{
781 *info = *srcinfo;
782 info->predicate = NULL;
783 edge_set_predicate (dst, srcinfo->predicate);
784 info->param = srcinfo->param.copy ();
785 if (!dst->indirect_unknown_callee && src->indirect_unknown_callee)
786 {
787 info->call_stmt_size -= (eni_size_weights.indirect_call_cost
788 - eni_size_weights.call_cost);
789 info->call_stmt_time -= (eni_time_weights.indirect_call_cost
790 - eni_time_weights.call_cost);
791 }
792}
793
794
795/* Keep edge cache consistent across edge removal. */
796
797void
798ipa_call_summary_t::remove (struct cgraph_edge *,
799 struct ipa_call_summary *sum)
800{
801 sum->reset ();
802}
803
804
805/* Dump edge summaries associated to NODE and recursively to all clones.
806 Indent by INDENT. */
807
808static void
809dump_ipa_call_summary (FILE *f, int indent, struct cgraph_node *node,
0bceb671 810 struct ipa_fn_summary *info)
27d020cf
JH
811{
812 struct cgraph_edge *edge;
813 for (edge = node->callees; edge; edge = edge->next_callee)
814 {
815 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
816 struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
817 int i;
818
819 fprintf (f,
820 "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i"
821 " time: %2i callee size:%2i stack:%2i",
822 indent, "", callee->name (), callee->order,
823 !edge->inline_failed
824 ? "inlined" : cgraph_inline_failed_string (edge-> inline_failed),
1bad9c18 825 indent, "", es->loop_depth, edge->frequency (),
27d020cf 826 es->call_stmt_size, es->call_stmt_time,
0bceb671
JH
827 (int) ipa_fn_summaries->get (callee)->size / ipa_fn_summary::size_scale,
828 (int) ipa_fn_summaries->get (callee)->estimated_stack_size);
27d020cf
JH
829
830 if (es->predicate)
831 {
832 fprintf (f, " predicate: ");
833 es->predicate->dump (f, info->conds);
834 }
835 else
836 fprintf (f, "\n");
837 if (es->param.exists ())
838 for (i = 0; i < (int) es->param.length (); i++)
839 {
840 int prob = es->param[i].change_prob;
841
842 if (!prob)
843 fprintf (f, "%*s op%i is compile time invariant\n",
844 indent + 2, "", i);
845 else if (prob != REG_BR_PROB_BASE)
846 fprintf (f, "%*s op%i change %f%% of time\n", indent + 2, "", i,
847 prob * 100.0 / REG_BR_PROB_BASE);
848 }
849 if (!edge->inline_failed)
850 {
851 fprintf (f, "%*sStack frame offset %i, callee self size %i,"
852 " callee size %i\n",
853 indent + 2, "",
0bceb671
JH
854 (int) ipa_fn_summaries->get (callee)->stack_frame_offset,
855 (int) ipa_fn_summaries->get (callee)->estimated_self_stack_size,
856 (int) ipa_fn_summaries->get (callee)->estimated_stack_size);
27d020cf
JH
857 dump_ipa_call_summary (f, indent + 2, callee, info);
858 }
859 }
860 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
861 {
862 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
863 fprintf (f, "%*sindirect call loop depth:%2i freq:%4i size:%2i"
864 " time: %2i",
865 indent, "",
866 es->loop_depth,
1bad9c18 867 edge->frequency (), es->call_stmt_size, es->call_stmt_time);
27d020cf
JH
868 if (es->predicate)
869 {
870 fprintf (f, "predicate: ");
871 es->predicate->dump (f, info->conds);
872 }
873 else
874 fprintf (f, "\n");
875 }
876}
877
878
879void
0bceb671 880ipa_dump_fn_summary (FILE *f, struct cgraph_node *node)
27d020cf
JH
881{
882 if (node->definition)
883 {
0bceb671 884 struct ipa_fn_summary *s = ipa_fn_summaries->get (node);
27d020cf
JH
885 size_time_entry *e;
886 int i;
0bceb671 887 fprintf (f, "IPA function summary for %s/%i", node->name (),
27d020cf
JH
888 node->order);
889 if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
890 fprintf (f, " always_inline");
891 if (s->inlinable)
892 fprintf (f, " inlinable");
893 if (s->contains_cilk_spawn)
894 fprintf (f, " contains_cilk_spawn");
895 if (s->fp_expressions)
896 fprintf (f, " fp_expression");
897 fprintf (f, "\n global time: %f\n", s->time.to_double ());
898 fprintf (f, " self size: %i\n", s->self_size);
899 fprintf (f, " global size: %i\n", s->size);
900 fprintf (f, " min size: %i\n", s->min_size);
901 fprintf (f, " self stack: %i\n",
902 (int) s->estimated_self_stack_size);
903 fprintf (f, " global stack: %i\n", (int) s->estimated_stack_size);
904 if (s->growth)
905 fprintf (f, " estimated growth:%i\n", (int) s->growth);
906 if (s->scc_no)
907 fprintf (f, " In SCC: %i\n", (int) s->scc_no);
908 for (i = 0; vec_safe_iterate (s->size_time_table, i, &e); i++)
909 {
910 fprintf (f, " size:%f, time:%f",
0bceb671 911 (double) e->size / ipa_fn_summary::size_scale,
27d020cf
JH
912 e->time.to_double ());
913 if (e->exec_predicate != true)
914 {
915 fprintf (f, ", executed if:");
916 e->exec_predicate.dump (f, s->conds, 0);
917 }
918 if (e->exec_predicate != e->nonconst_predicate)
919 {
920 fprintf (f, ", nonconst if:");
921 e->nonconst_predicate.dump (f, s->conds, 0);
922 }
923 fprintf (f, "\n");
924 }
925 if (s->loop_iterations)
926 {
927 fprintf (f, " loop iterations:");
928 s->loop_iterations->dump (f, s->conds);
929 }
930 if (s->loop_stride)
931 {
932 fprintf (f, " loop stride:");
933 s->loop_stride->dump (f, s->conds);
934 }
935 if (s->array_index)
936 {
937 fprintf (f, " array index:");
938 s->array_index->dump (f, s->conds);
939 }
940 fprintf (f, " calls:\n");
941 dump_ipa_call_summary (f, 4, node, s);
942 fprintf (f, "\n");
943 }
944}
945
946DEBUG_FUNCTION void
0bceb671 947ipa_debug_fn_summary (struct cgraph_node *node)
27d020cf 948{
0bceb671 949 ipa_dump_fn_summary (stderr, node);
27d020cf
JH
950}
951
952void
0bceb671 953ipa_dump_fn_summaries (FILE *f)
27d020cf
JH
954{
955 struct cgraph_node *node;
956
957 FOR_EACH_DEFINED_FUNCTION (node)
958 if (!node->global.inlined_to)
0bceb671 959 ipa_dump_fn_summary (f, node);
27d020cf
JH
960}
961
962/* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
963 boolean variable pointed to by DATA. */
964
965static bool
966mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
967 void *data)
968{
969 bool *b = (bool *) data;
970 *b = true;
971 return true;
972}
973
974/* If OP refers to value of function parameter, return the corresponding
975 parameter. If non-NULL, the size of the memory load (or the SSA_NAME of the
976 PARM_DECL) will be stored to *SIZE_P in that case too. */
977
978static tree
979unmodified_parm_1 (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
980{
981 /* SSA_NAME referring to parm default def? */
982 if (TREE_CODE (op) == SSA_NAME
983 && SSA_NAME_IS_DEFAULT_DEF (op)
984 && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
985 {
986 if (size_p)
987 *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
988 return SSA_NAME_VAR (op);
989 }
990 /* Non-SSA parm reference? */
991 if (TREE_CODE (op) == PARM_DECL)
992 {
993 bool modified = false;
994
995 ao_ref refd;
996 ao_ref_init (&refd, op);
997 walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
998 NULL);
999 if (!modified)
1000 {
1001 if (size_p)
1002 *size_p = tree_to_shwi (TYPE_SIZE (TREE_TYPE (op)));
1003 return op;
1004 }
1005 }
1006 return NULL_TREE;
1007}
1008
1009/* If OP refers to value of function parameter, return the corresponding
1010 parameter. Also traverse chains of SSA register assignments. If non-NULL,
1011 the size of the memory load (or the SSA_NAME of the PARM_DECL) will be
1012 stored to *SIZE_P in that case too. */
1013
1014static tree
1015unmodified_parm (gimple *stmt, tree op, HOST_WIDE_INT *size_p)
1016{
1017 tree res = unmodified_parm_1 (stmt, op, size_p);
1018 if (res)
1019 return res;
1020
1021 if (TREE_CODE (op) == SSA_NAME
1022 && !SSA_NAME_IS_DEFAULT_DEF (op)
1023 && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1024 return unmodified_parm (SSA_NAME_DEF_STMT (op),
1025 gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)),
1026 size_p);
1027 return NULL_TREE;
1028}
1029
1030/* If OP refers to a value of a function parameter or value loaded from an
1031 aggregate passed to a parameter (either by value or reference), return TRUE
1032 and store the number of the parameter to *INDEX_P, the access size into
1033 *SIZE_P, and information whether and how it has been loaded from an
1034 aggregate into *AGGPOS. INFO describes the function parameters, STMT is the
1035 statement in which OP is used or loaded. */
1036
1037static bool
1038unmodified_parm_or_parm_agg_item (struct ipa_func_body_info *fbi,
1039 gimple *stmt, tree op, int *index_p,
1040 HOST_WIDE_INT *size_p,
1041 struct agg_position_info *aggpos)
1042{
1043 tree res = unmodified_parm_1 (stmt, op, size_p);
1044
1045 gcc_checking_assert (aggpos);
1046 if (res)
1047 {
1048 *index_p = ipa_get_param_decl_index (fbi->info, res);
1049 if (*index_p < 0)
1050 return false;
1051 aggpos->agg_contents = false;
1052 aggpos->by_ref = false;
1053 return true;
1054 }
1055
1056 if (TREE_CODE (op) == SSA_NAME)
1057 {
1058 if (SSA_NAME_IS_DEFAULT_DEF (op)
1059 || !gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1060 return false;
1061 stmt = SSA_NAME_DEF_STMT (op);
1062 op = gimple_assign_rhs1 (stmt);
1063 if (!REFERENCE_CLASS_P (op))
1064 return unmodified_parm_or_parm_agg_item (fbi, stmt, op, index_p, size_p,
1065 aggpos);
1066 }
1067
1068 aggpos->agg_contents = true;
1069 return ipa_load_from_parm_agg (fbi, fbi->info->descriptors,
1070 stmt, op, index_p, &aggpos->offset,
1071 size_p, &aggpos->by_ref);
1072}
1073
1074/* See if statement might disappear after inlining.
1075 0 - means not eliminated
1076 1 - half of statements goes away
1077 2 - for sure it is eliminated.
1078 We are not terribly sophisticated, basically looking for simple abstraction
1079 penalty wrappers. */
1080
1081static int
1082eliminated_by_inlining_prob (gimple *stmt)
1083{
1084 enum gimple_code code = gimple_code (stmt);
1085 enum tree_code rhs_code;
1086
1087 if (!optimize)
1088 return 0;
1089
1090 switch (code)
1091 {
1092 case GIMPLE_RETURN:
1093 return 2;
1094 case GIMPLE_ASSIGN:
1095 if (gimple_num_ops (stmt) != 2)
1096 return 0;
1097
1098 rhs_code = gimple_assign_rhs_code (stmt);
1099
1100 /* Casts of parameters, loads from parameters passed by reference
1101 and stores to return value or parameters are often free after
1102 inlining dua to SRA and further combining.
1103 Assume that half of statements goes away. */
1104 if (CONVERT_EXPR_CODE_P (rhs_code)
1105 || rhs_code == VIEW_CONVERT_EXPR
1106 || rhs_code == ADDR_EXPR
1107 || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1108 {
1109 tree rhs = gimple_assign_rhs1 (stmt);
1110 tree lhs = gimple_assign_lhs (stmt);
1111 tree inner_rhs = get_base_address (rhs);
1112 tree inner_lhs = get_base_address (lhs);
1113 bool rhs_free = false;
1114 bool lhs_free = false;
1115
1116 if (!inner_rhs)
1117 inner_rhs = rhs;
1118 if (!inner_lhs)
1119 inner_lhs = lhs;
1120
1121 /* Reads of parameter are expected to be free. */
1122 if (unmodified_parm (stmt, inner_rhs, NULL))
1123 rhs_free = true;
1124 /* Match expressions of form &this->field. Those will most likely
1125 combine with something upstream after inlining. */
1126 else if (TREE_CODE (inner_rhs) == ADDR_EXPR)
1127 {
1128 tree op = get_base_address (TREE_OPERAND (inner_rhs, 0));
1129 if (TREE_CODE (op) == PARM_DECL)
1130 rhs_free = true;
1131 else if (TREE_CODE (op) == MEM_REF
1132 && unmodified_parm (stmt, TREE_OPERAND (op, 0), NULL))
1133 rhs_free = true;
1134 }
1135
1136 /* When parameter is not SSA register because its address is taken
1137 and it is just copied into one, the statement will be completely
1138 free after inlining (we will copy propagate backward). */
1139 if (rhs_free && is_gimple_reg (lhs))
1140 return 2;
1141
1142 /* Reads of parameters passed by reference
1143 expected to be free (i.e. optimized out after inlining). */
1144 if (TREE_CODE (inner_rhs) == MEM_REF
1145 && unmodified_parm (stmt, TREE_OPERAND (inner_rhs, 0), NULL))
1146 rhs_free = true;
1147
1148 /* Copying parameter passed by reference into gimple register is
1149 probably also going to copy propagate, but we can't be quite
1150 sure. */
1151 if (rhs_free && is_gimple_reg (lhs))
1152 lhs_free = true;
1153
1154 /* Writes to parameters, parameters passed by value and return value
1155 (either dirrectly or passed via invisible reference) are free.
1156
1157 TODO: We ought to handle testcase like
1158 struct a {int a,b;};
1159 struct a
1160 retrurnsturct (void)
1161 {
1162 struct a a ={1,2};
1163 return a;
1164 }
1165
1166 This translate into:
1167
1168 retrurnsturct ()
1169 {
1170 int a$b;
1171 int a$a;
1172 struct a a;
1173 struct a D.2739;
1174
1175 <bb 2>:
1176 D.2739.a = 1;
1177 D.2739.b = 2;
1178 return D.2739;
1179
1180 }
1181 For that we either need to copy ipa-split logic detecting writes
1182 to return value. */
1183 if (TREE_CODE (inner_lhs) == PARM_DECL
1184 || TREE_CODE (inner_lhs) == RESULT_DECL
1185 || (TREE_CODE (inner_lhs) == MEM_REF
1186 && (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0), NULL)
1187 || (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
1188 && SSA_NAME_VAR (TREE_OPERAND (inner_lhs, 0))
1189 && TREE_CODE (SSA_NAME_VAR (TREE_OPERAND
1190 (inner_lhs,
1191 0))) == RESULT_DECL))))
1192 lhs_free = true;
1193 if (lhs_free
1194 && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1195 rhs_free = true;
1196 if (lhs_free && rhs_free)
1197 return 1;
1198 }
1199 return 0;
1200 default:
1201 return 0;
1202 }
1203}
1204
1205
1206/* If BB ends by a conditional we can turn into predicates, attach corresponding
1207 predicates to the CFG edges. */
1208
1209static void
1210set_cond_stmt_execution_predicate (struct ipa_func_body_info *fbi,
0bceb671 1211 struct ipa_fn_summary *summary,
27d020cf
JH
1212 basic_block bb)
1213{
1214 gimple *last;
1215 tree op;
1216 int index;
1217 HOST_WIDE_INT size;
1218 struct agg_position_info aggpos;
1219 enum tree_code code, inverted_code;
1220 edge e;
1221 edge_iterator ei;
1222 gimple *set_stmt;
1223 tree op2;
1224
1225 last = last_stmt (bb);
1226 if (!last || gimple_code (last) != GIMPLE_COND)
1227 return;
1228 if (!is_gimple_ip_invariant (gimple_cond_rhs (last)))
1229 return;
1230 op = gimple_cond_lhs (last);
1231 /* TODO: handle conditionals like
1232 var = op0 < 4;
1233 if (var != 0). */
1234 if (unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
1235 {
1236 code = gimple_cond_code (last);
1237 inverted_code = invert_tree_comparison (code, HONOR_NANS (op));
1238
1239 FOR_EACH_EDGE (e, ei, bb->succs)
1240 {
1241 enum tree_code this_code = (e->flags & EDGE_TRUE_VALUE
1242 ? code : inverted_code);
1243 /* invert_tree_comparison will return ERROR_MARK on FP
1244 comparsions that are not EQ/NE instead of returning proper
1245 unordered one. Be sure it is not confused with NON_CONSTANT. */
1246 if (this_code != ERROR_MARK)
1247 {
1248 predicate p
1249 = add_condition (summary, index, size, &aggpos, this_code,
1250 unshare_expr_without_location
1251 (gimple_cond_rhs (last)));
1252 e->aux = edge_predicate_pool.allocate ();
1253 *(predicate *) e->aux = p;
1254 }
1255 }
1256 }
1257
1258 if (TREE_CODE (op) != SSA_NAME)
1259 return;
1260 /* Special case
1261 if (builtin_constant_p (op))
1262 constant_code
1263 else
1264 nonconstant_code.
1265 Here we can predicate nonconstant_code. We can't
1266 really handle constant_code since we have no predicate
1267 for this and also the constant code is not known to be
1268 optimized away when inliner doen't see operand is constant.
1269 Other optimizers might think otherwise. */
1270 if (gimple_cond_code (last) != NE_EXPR
1271 || !integer_zerop (gimple_cond_rhs (last)))
1272 return;
1273 set_stmt = SSA_NAME_DEF_STMT (op);
1274 if (!gimple_call_builtin_p (set_stmt, BUILT_IN_CONSTANT_P)
1275 || gimple_call_num_args (set_stmt) != 1)
1276 return;
1277 op2 = gimple_call_arg (set_stmt, 0);
1278 if (!unmodified_parm_or_parm_agg_item (fbi, set_stmt, op2, &index, &size,
1279 &aggpos))
1280 return;
1281 FOR_EACH_EDGE (e, ei, bb->succs) if (e->flags & EDGE_FALSE_VALUE)
1282 {
1283 predicate p = add_condition (summary, index, size, &aggpos,
1284 predicate::is_not_constant, NULL_TREE);
1285 e->aux = edge_predicate_pool.allocate ();
1286 *(predicate *) e->aux = p;
1287 }
1288}
1289
1290
1291/* If BB ends by a switch we can turn into predicates, attach corresponding
1292 predicates to the CFG edges. */
1293
1294static void
1295set_switch_stmt_execution_predicate (struct ipa_func_body_info *fbi,
0bceb671 1296 struct ipa_fn_summary *summary,
27d020cf
JH
1297 basic_block bb)
1298{
1299 gimple *lastg;
1300 tree op;
1301 int index;
1302 HOST_WIDE_INT size;
1303 struct agg_position_info aggpos;
1304 edge e;
1305 edge_iterator ei;
1306 size_t n;
1307 size_t case_idx;
1308
1309 lastg = last_stmt (bb);
1310 if (!lastg || gimple_code (lastg) != GIMPLE_SWITCH)
1311 return;
1312 gswitch *last = as_a <gswitch *> (lastg);
1313 op = gimple_switch_index (last);
1314 if (!unmodified_parm_or_parm_agg_item (fbi, last, op, &index, &size, &aggpos))
1315 return;
1316
1317 FOR_EACH_EDGE (e, ei, bb->succs)
1318 {
1319 e->aux = edge_predicate_pool.allocate ();
1320 *(predicate *) e->aux = false;
1321 }
1322 n = gimple_switch_num_labels (last);
1323 for (case_idx = 0; case_idx < n; ++case_idx)
1324 {
1325 tree cl = gimple_switch_label (last, case_idx);
1326 tree min, max;
1327 predicate p;
1328
1329 e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
1330 min = CASE_LOW (cl);
1331 max = CASE_HIGH (cl);
1332
1333 /* For default we might want to construct predicate that none
1334 of cases is met, but it is bit hard to do not having negations
1335 of conditionals handy. */
1336 if (!min && !max)
1337 p = true;
1338 else if (!max)
1339 p = add_condition (summary, index, size, &aggpos, EQ_EXPR,
1340 unshare_expr_without_location (min));
1341 else
1342 {
1343 predicate p1, p2;
1344 p1 = add_condition (summary, index, size, &aggpos, GE_EXPR,
1345 unshare_expr_without_location (min));
1346 p2 = add_condition (summary, index, size, &aggpos, LE_EXPR,
1347 unshare_expr_without_location (max));
1348 p = p1 & p2;
1349 }
1350 *(struct predicate *) e->aux
1351 = p.or_with (summary->conds, *(struct predicate *) e->aux);
1352 }
1353}
1354
1355
1356/* For each BB in NODE attach to its AUX pointer predicate under
1357 which it is executable. */
1358
1359static void
1360compute_bb_predicates (struct ipa_func_body_info *fbi,
1361 struct cgraph_node *node,
0bceb671 1362 struct ipa_fn_summary *summary)
27d020cf
JH
1363{
1364 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1365 bool done = false;
1366 basic_block bb;
1367
1368 FOR_EACH_BB_FN (bb, my_function)
1369 {
1370 set_cond_stmt_execution_predicate (fbi, summary, bb);
1371 set_switch_stmt_execution_predicate (fbi, summary, bb);
1372 }
1373
1374 /* Entry block is always executable. */
1375 ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux
1376 = edge_predicate_pool.allocate ();
1377 *(predicate *) ENTRY_BLOCK_PTR_FOR_FN (my_function)->aux = true;
1378
1379 /* A simple dataflow propagation of predicates forward in the CFG.
1380 TODO: work in reverse postorder. */
1381 while (!done)
1382 {
1383 done = true;
1384 FOR_EACH_BB_FN (bb, my_function)
1385 {
1386 predicate p = false;
1387 edge e;
1388 edge_iterator ei;
1389 FOR_EACH_EDGE (e, ei, bb->preds)
1390 {
1391 if (e->src->aux)
1392 {
1393 predicate this_bb_predicate
1394 = *(predicate *) e->src->aux;
1395 if (e->aux)
1396 this_bb_predicate &= (*(struct predicate *) e->aux);
1397 p = p.or_with (summary->conds, this_bb_predicate);
1398 if (p == true)
1399 break;
1400 }
1401 }
1402 if (p == false)
1403 gcc_checking_assert (!bb->aux);
1404 else
1405 {
1406 if (!bb->aux)
1407 {
1408 done = false;
1409 bb->aux = edge_predicate_pool.allocate ();
1410 *((predicate *) bb->aux) = p;
1411 }
1412 else if (p != *(predicate *) bb->aux)
1413 {
1414 /* This OR operation is needed to ensure monotonous data flow
1415 in the case we hit the limit on number of clauses and the
1416 and/or operations above give approximate answers. */
1417 p = p.or_with (summary->conds, *(predicate *)bb->aux);
1418 if (p != *(predicate *) bb->aux)
1419 {
1420 done = false;
1421 *((predicate *) bb->aux) = p;
1422 }
1423 }
1424 }
1425 }
1426 }
1427}
1428
1429
1430/* Return predicate specifying when the STMT might have result that is not
1431 a compile time constant. */
1432
1433static predicate
1434will_be_nonconstant_expr_predicate (struct ipa_node_params *info,
0bceb671 1435 struct ipa_fn_summary *summary,
27d020cf
JH
1436 tree expr,
1437 vec<predicate> nonconstant_names)
1438{
1439 tree parm;
1440 int index;
1441 HOST_WIDE_INT size;
1442
1443 while (UNARY_CLASS_P (expr))
1444 expr = TREE_OPERAND (expr, 0);
1445
1446 parm = unmodified_parm (NULL, expr, &size);
1447 if (parm && (index = ipa_get_param_decl_index (info, parm)) >= 0)
1448 return add_condition (summary, index, size, NULL, predicate::changed,
1449 NULL_TREE);
1450 if (is_gimple_min_invariant (expr))
1451 return false;
1452 if (TREE_CODE (expr) == SSA_NAME)
1453 return nonconstant_names[SSA_NAME_VERSION (expr)];
1454 if (BINARY_CLASS_P (expr) || COMPARISON_CLASS_P (expr))
1455 {
1456 predicate p1 = will_be_nonconstant_expr_predicate
1457 (info, summary, TREE_OPERAND (expr, 0),
1458 nonconstant_names);
1459 if (p1 == true)
1460 return p1;
1461
1462 predicate p2;
1463 p2 = will_be_nonconstant_expr_predicate (info, summary,
1464 TREE_OPERAND (expr, 1),
1465 nonconstant_names);
1466 return p1.or_with (summary->conds, p2);
1467 }
1468 else if (TREE_CODE (expr) == COND_EXPR)
1469 {
1470 predicate p1 = will_be_nonconstant_expr_predicate
1471 (info, summary, TREE_OPERAND (expr, 0),
1472 nonconstant_names);
1473 if (p1 == true)
1474 return p1;
1475
1476 predicate p2;
1477 p2 = will_be_nonconstant_expr_predicate (info, summary,
1478 TREE_OPERAND (expr, 1),
1479 nonconstant_names);
1480 if (p2 == true)
1481 return p2;
1482 p1 = p1.or_with (summary->conds, p2);
1483 p2 = will_be_nonconstant_expr_predicate (info, summary,
1484 TREE_OPERAND (expr, 2),
1485 nonconstant_names);
1486 return p2.or_with (summary->conds, p1);
1487 }
1488 else
1489 {
1490 debug_tree (expr);
1491 gcc_unreachable ();
1492 }
1493 return false;
1494}
1495
1496
1497/* Return predicate specifying when the STMT might have result that is not
1498 a compile time constant. */
1499
1500static predicate
1501will_be_nonconstant_predicate (struct ipa_func_body_info *fbi,
0bceb671 1502 struct ipa_fn_summary *summary,
27d020cf
JH
1503 gimple *stmt,
1504 vec<predicate> nonconstant_names)
1505{
1506 predicate p = true;
1507 ssa_op_iter iter;
1508 tree use;
1509 predicate op_non_const;
1510 bool is_load;
1511 int base_index;
1512 HOST_WIDE_INT size;
1513 struct agg_position_info aggpos;
1514
1515 /* What statments might be optimized away
1516 when their arguments are constant. */
1517 if (gimple_code (stmt) != GIMPLE_ASSIGN
1518 && gimple_code (stmt) != GIMPLE_COND
1519 && gimple_code (stmt) != GIMPLE_SWITCH
1520 && (gimple_code (stmt) != GIMPLE_CALL
1521 || !(gimple_call_flags (stmt) & ECF_CONST)))
1522 return p;
1523
1524 /* Stores will stay anyway. */
1525 if (gimple_store_p (stmt))
1526 return p;
1527
1528 is_load = gimple_assign_load_p (stmt);
1529
1530 /* Loads can be optimized when the value is known. */
1531 if (is_load)
1532 {
1533 tree op;
1534 gcc_assert (gimple_assign_single_p (stmt));
1535 op = gimple_assign_rhs1 (stmt);
1536 if (!unmodified_parm_or_parm_agg_item (fbi, stmt, op, &base_index, &size,
1537 &aggpos))
1538 return p;
1539 }
1540 else
1541 base_index = -1;
1542
1543 /* See if we understand all operands before we start
1544 adding conditionals. */
1545 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1546 {
1547 tree parm = unmodified_parm (stmt, use, NULL);
1548 /* For arguments we can build a condition. */
1549 if (parm && ipa_get_param_decl_index (fbi->info, parm) >= 0)
1550 continue;
1551 if (TREE_CODE (use) != SSA_NAME)
1552 return p;
1553 /* If we know when operand is constant,
1554 we still can say something useful. */
1555 if (nonconstant_names[SSA_NAME_VERSION (use)] != true)
1556 continue;
1557 return p;
1558 }
1559
1560 if (is_load)
1561 op_non_const =
1562 add_condition (summary, base_index, size, &aggpos, predicate::changed,
1563 NULL);
1564 else
1565 op_non_const = false;
1566 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1567 {
1568 HOST_WIDE_INT size;
1569 tree parm = unmodified_parm (stmt, use, &size);
1570 int index;
1571
1572 if (parm && (index = ipa_get_param_decl_index (fbi->info, parm)) >= 0)
1573 {
1574 if (index != base_index)
1575 p = add_condition (summary, index, size, NULL, predicate::changed,
1576 NULL_TREE);
1577 else
1578 continue;
1579 }
1580 else
1581 p = nonconstant_names[SSA_NAME_VERSION (use)];
1582 op_non_const = p.or_with (summary->conds, op_non_const);
1583 }
1584 if ((gimple_code (stmt) == GIMPLE_ASSIGN || gimple_code (stmt) == GIMPLE_CALL)
1585 && gimple_op (stmt, 0)
1586 && TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
1587 nonconstant_names[SSA_NAME_VERSION (gimple_op (stmt, 0))]
1588 = op_non_const;
1589 return op_non_const;
1590}
1591
1592struct record_modified_bb_info
1593{
1594 bitmap bb_set;
1595 gimple *stmt;
1596};
1597
1598/* Value is initialized in INIT_BB and used in USE_BB. We want to copute
1599 probability how often it changes between USE_BB.
1600 INIT_BB->frequency/USE_BB->frequency is an estimate, but if INIT_BB
1601 is in different loop nest, we can do better.
1602 This is all just estimate. In theory we look for minimal cut separating
1603 INIT_BB and USE_BB, but we only want to anticipate loop invariant motion
1604 anyway. */
1605
1606static basic_block
1607get_minimal_bb (basic_block init_bb, basic_block use_bb)
1608{
1609 struct loop *l = find_common_loop (init_bb->loop_father, use_bb->loop_father);
e7a74006 1610 if (l && l->header->count < init_bb->count)
27d020cf
JH
1611 return l->header;
1612 return init_bb;
1613}
1614
1615/* Callback of walk_aliased_vdefs. Records basic blocks where the value may be
1616 set except for info->stmt. */
1617
1618static bool
1619record_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
1620{
1621 struct record_modified_bb_info *info =
1622 (struct record_modified_bb_info *) data;
1623 if (SSA_NAME_DEF_STMT (vdef) == info->stmt)
1624 return false;
1625 bitmap_set_bit (info->bb_set,
1626 SSA_NAME_IS_DEFAULT_DEF (vdef)
1627 ? ENTRY_BLOCK_PTR_FOR_FN (cfun)->index
1628 : get_minimal_bb
1629 (gimple_bb (SSA_NAME_DEF_STMT (vdef)),
1630 gimple_bb (info->stmt))->index);
1631 return false;
1632}
1633
1634/* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
1635 will change since last invocation of STMT.
1636
1637 Value 0 is reserved for compile time invariants.
1638 For common parameters it is REG_BR_PROB_BASE. For loop invariants it
1639 ought to be REG_BR_PROB_BASE / estimated_iters. */
1640
1641static int
1642param_change_prob (gimple *stmt, int i)
1643{
1644 tree op = gimple_call_arg (stmt, i);
1645 basic_block bb = gimple_bb (stmt);
1646
1647 if (TREE_CODE (op) == WITH_SIZE_EXPR)
1648 op = TREE_OPERAND (op, 0);
1649
1650 tree base = get_base_address (op);
1651
1652 /* Global invariants never change. */
1653 if (is_gimple_min_invariant (base))
1654 return 0;
1655
1656 /* We would have to do non-trivial analysis to really work out what
1657 is the probability of value to change (i.e. when init statement
1658 is in a sibling loop of the call).
1659
1660 We do an conservative estimate: when call is executed N times more often
1661 than the statement defining value, we take the frequency 1/N. */
1662 if (TREE_CODE (base) == SSA_NAME)
1663 {
1664 int init_freq;
1665
e7a74006 1666 if (!bb->count.to_frequency (cfun))
27d020cf
JH
1667 return REG_BR_PROB_BASE;
1668
1669 if (SSA_NAME_IS_DEFAULT_DEF (base))
e7a74006 1670 init_freq = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun);
27d020cf
JH
1671 else
1672 init_freq = get_minimal_bb
1673 (gimple_bb (SSA_NAME_DEF_STMT (base)),
e7a74006 1674 gimple_bb (stmt))->count.to_frequency (cfun);
27d020cf
JH
1675
1676 if (!init_freq)
1677 init_freq = 1;
e7a74006
JH
1678 if (init_freq < bb->count.to_frequency (cfun))
1679 return MAX (GCOV_COMPUTE_SCALE (init_freq,
1680 bb->count.to_frequency (cfun)), 1);
27d020cf
JH
1681 else
1682 return REG_BR_PROB_BASE;
1683 }
1684 else
1685 {
1686 ao_ref refd;
1687 int max;
1688 struct record_modified_bb_info info;
1689 bitmap_iterator bi;
1690 unsigned index;
1691 tree init = ctor_for_folding (base);
1692
1693 if (init != error_mark_node)
1694 return 0;
e7a74006 1695 if (!bb->count.to_frequency (cfun))
27d020cf
JH
1696 return REG_BR_PROB_BASE;
1697 ao_ref_init (&refd, op);
1698 info.stmt = stmt;
1699 info.bb_set = BITMAP_ALLOC (NULL);
1700 walk_aliased_vdefs (&refd, gimple_vuse (stmt), record_modified, &info,
1701 NULL);
1702 if (bitmap_bit_p (info.bb_set, bb->index))
1703 {
1704 BITMAP_FREE (info.bb_set);
1705 return REG_BR_PROB_BASE;
1706 }
1707
1708 /* Assume that every memory is initialized at entry.
1709 TODO: Can we easilly determine if value is always defined
1710 and thus we may skip entry block? */
e7a74006
JH
1711 if (ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun))
1712 max = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count.to_frequency (cfun);
27d020cf
JH
1713 else
1714 max = 1;
1715
1716 EXECUTE_IF_SET_IN_BITMAP (info.bb_set, 0, index, bi)
e7a74006 1717 max = MIN (max, BASIC_BLOCK_FOR_FN (cfun, index)->count.to_frequency (cfun));
27d020cf
JH
1718
1719 BITMAP_FREE (info.bb_set);
e7a74006
JH
1720 if (max < bb->count.to_frequency (cfun))
1721 return MAX (GCOV_COMPUTE_SCALE (max, bb->count.to_frequency (cfun)), 1);
27d020cf
JH
1722 else
1723 return REG_BR_PROB_BASE;
1724 }
1725}
1726
1727/* Find whether a basic block BB is the final block of a (half) diamond CFG
1728 sub-graph and if the predicate the condition depends on is known. If so,
1729 return true and store the pointer the predicate in *P. */
1730
1731static bool
1732phi_result_unknown_predicate (struct ipa_node_params *info,
0bceb671 1733 ipa_fn_summary *summary, basic_block bb,
27d020cf
JH
1734 predicate *p,
1735 vec<predicate> nonconstant_names)
1736{
1737 edge e;
1738 edge_iterator ei;
1739 basic_block first_bb = NULL;
1740 gimple *stmt;
1741
1742 if (single_pred_p (bb))
1743 {
1744 *p = false;
1745 return true;
1746 }
1747
1748 FOR_EACH_EDGE (e, ei, bb->preds)
1749 {
1750 if (single_succ_p (e->src))
1751 {
1752 if (!single_pred_p (e->src))
1753 return false;
1754 if (!first_bb)
1755 first_bb = single_pred (e->src);
1756 else if (single_pred (e->src) != first_bb)
1757 return false;
1758 }
1759 else
1760 {
1761 if (!first_bb)
1762 first_bb = e->src;
1763 else if (e->src != first_bb)
1764 return false;
1765 }
1766 }
1767
1768 if (!first_bb)
1769 return false;
1770
1771 stmt = last_stmt (first_bb);
1772 if (!stmt
1773 || gimple_code (stmt) != GIMPLE_COND
1774 || !is_gimple_ip_invariant (gimple_cond_rhs (stmt)))
1775 return false;
1776
1777 *p = will_be_nonconstant_expr_predicate (info, summary,
1778 gimple_cond_lhs (stmt),
1779 nonconstant_names);
1780 if (*p == true)
1781 return false;
1782 else
1783 return true;
1784}
1785
1786/* Given a PHI statement in a function described by inline properties SUMMARY
1787 and *P being the predicate describing whether the selected PHI argument is
1788 known, store a predicate for the result of the PHI statement into
1789 NONCONSTANT_NAMES, if possible. */
1790
1791static void
0bceb671 1792predicate_for_phi_result (struct ipa_fn_summary *summary, gphi *phi,
27d020cf
JH
1793 predicate *p,
1794 vec<predicate> nonconstant_names)
1795{
1796 unsigned i;
1797
1798 for (i = 0; i < gimple_phi_num_args (phi); i++)
1799 {
1800 tree arg = gimple_phi_arg (phi, i)->def;
1801 if (!is_gimple_min_invariant (arg))
1802 {
1803 gcc_assert (TREE_CODE (arg) == SSA_NAME);
1804 *p = p->or_with (summary->conds,
1805 nonconstant_names[SSA_NAME_VERSION (arg)]);
1806 if (*p == true)
1807 return;
1808 }
1809 }
1810
1811 if (dump_file && (dump_flags & TDF_DETAILS))
1812 {
1813 fprintf (dump_file, "\t\tphi predicate: ");
1814 p->dump (dump_file, summary->conds);
1815 }
1816 nonconstant_names[SSA_NAME_VERSION (gimple_phi_result (phi))] = *p;
1817}
1818
1819/* Return predicate specifying when array index in access OP becomes non-constant. */
1820
1821static predicate
0bceb671 1822array_index_predicate (ipa_fn_summary *info,
27d020cf
JH
1823 vec< predicate> nonconstant_names, tree op)
1824{
1825 predicate p = false;
1826 while (handled_component_p (op))
1827 {
1828 if (TREE_CODE (op) == ARRAY_REF || TREE_CODE (op) == ARRAY_RANGE_REF)
1829 {
1830 if (TREE_CODE (TREE_OPERAND (op, 1)) == SSA_NAME)
1831 p = p.or_with (info->conds,
1832 nonconstant_names[SSA_NAME_VERSION
1833 (TREE_OPERAND (op, 1))]);
1834 }
1835 op = TREE_OPERAND (op, 0);
1836 }
1837 return p;
1838}
1839
1840/* For a typical usage of __builtin_expect (a<b, 1), we
1841 may introduce an extra relation stmt:
1842 With the builtin, we have
1843 t1 = a <= b;
1844 t2 = (long int) t1;
1845 t3 = __builtin_expect (t2, 1);
1846 if (t3 != 0)
1847 goto ...
1848 Without the builtin, we have
1849 if (a<=b)
1850 goto...
1851 This affects the size/time estimation and may have
1852 an impact on the earlier inlining.
1853 Here find this pattern and fix it up later. */
1854
1855static gimple *
1856find_foldable_builtin_expect (basic_block bb)
1857{
1858 gimple_stmt_iterator bsi;
1859
1860 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1861 {
1862 gimple *stmt = gsi_stmt (bsi);
1863 if (gimple_call_builtin_p (stmt, BUILT_IN_EXPECT)
1864 || gimple_call_internal_p (stmt, IFN_BUILTIN_EXPECT))
1865 {
1866 tree var = gimple_call_lhs (stmt);
1867 tree arg = gimple_call_arg (stmt, 0);
1868 use_operand_p use_p;
1869 gimple *use_stmt;
1870 bool match = false;
1871 bool done = false;
1872
1873 if (!var || !arg)
1874 continue;
1875 gcc_assert (TREE_CODE (var) == SSA_NAME);
1876
1877 while (TREE_CODE (arg) == SSA_NAME)
1878 {
1879 gimple *stmt_tmp = SSA_NAME_DEF_STMT (arg);
1880 if (!is_gimple_assign (stmt_tmp))
1881 break;
1882 switch (gimple_assign_rhs_code (stmt_tmp))
1883 {
1884 case LT_EXPR:
1885 case LE_EXPR:
1886 case GT_EXPR:
1887 case GE_EXPR:
1888 case EQ_EXPR:
1889 case NE_EXPR:
1890 match = true;
1891 done = true;
1892 break;
1893 CASE_CONVERT:
1894 break;
1895 default:
1896 done = true;
1897 break;
1898 }
1899 if (done)
1900 break;
1901 arg = gimple_assign_rhs1 (stmt_tmp);
1902 }
1903
1904 if (match && single_imm_use (var, &use_p, &use_stmt)
1905 && gimple_code (use_stmt) == GIMPLE_COND)
1906 return use_stmt;
1907 }
1908 }
1909 return NULL;
1910}
1911
1912/* Return true when the basic blocks contains only clobbers followed by RESX.
1913 Such BBs are kept around to make removal of dead stores possible with
1914 presence of EH and will be optimized out by optimize_clobbers later in the
1915 game.
1916
1917 NEED_EH is used to recurse in case the clobber has non-EH predecestors
1918 that can be clobber only, too.. When it is false, the RESX is not necessary
1919 on the end of basic block. */
1920
1921static bool
1922clobber_only_eh_bb_p (basic_block bb, bool need_eh = true)
1923{
1924 gimple_stmt_iterator gsi = gsi_last_bb (bb);
1925 edge_iterator ei;
1926 edge e;
1927
1928 if (need_eh)
1929 {
1930 if (gsi_end_p (gsi))
1931 return false;
1932 if (gimple_code (gsi_stmt (gsi)) != GIMPLE_RESX)
1933 return false;
1934 gsi_prev (&gsi);
1935 }
1936 else if (!single_succ_p (bb))
1937 return false;
1938
1939 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
1940 {
1941 gimple *stmt = gsi_stmt (gsi);
1942 if (is_gimple_debug (stmt))
1943 continue;
1944 if (gimple_clobber_p (stmt))
1945 continue;
1946 if (gimple_code (stmt) == GIMPLE_LABEL)
1947 break;
1948 return false;
1949 }
1950
1951 /* See if all predecestors are either throws or clobber only BBs. */
1952 FOR_EACH_EDGE (e, ei, bb->preds)
1953 if (!(e->flags & EDGE_EH)
1954 && !clobber_only_eh_bb_p (e->src, false))
1955 return false;
1956
1957 return true;
1958}
1959
1960/* Return true if STMT compute a floating point expression that may be affected
1961 by -ffast-math and similar flags. */
1962
1963static bool
1964fp_expression_p (gimple *stmt)
1965{
1966 ssa_op_iter i;
1967 tree op;
1968
1969 FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF|SSA_OP_USE)
1970 if (FLOAT_TYPE_P (TREE_TYPE (op)))
1971 return true;
1972 return false;
1973}
1974
0bceb671
JH
1975/* Analyze function body for NODE.
1976 EARLY indicates run from early optimization pipeline. */
27d020cf
JH
1977
1978static void
0bceb671 1979analyze_function_body (struct cgraph_node *node, bool early)
27d020cf
JH
1980{
1981 sreal time = 0;
1982 /* Estimate static overhead for function prologue/epilogue and alignment. */
1983 int size = 2;
1984 /* Benefits are scaled by probability of elimination that is in range
1985 <0,2>. */
1986 basic_block bb;
1987 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1988 int freq;
0bceb671 1989 struct ipa_fn_summary *info = ipa_fn_summaries->get (node);
27d020cf
JH
1990 predicate bb_predicate;
1991 struct ipa_func_body_info fbi;
1992 vec<predicate> nonconstant_names = vNULL;
1993 int nblocks, n;
1994 int *order;
1995 predicate array_index = true;
1996 gimple *fix_builtin_expect_stmt;
1997
1998 gcc_assert (my_function && my_function->cfg);
1999 gcc_assert (cfun == my_function);
2000
2001 memset(&fbi, 0, sizeof(fbi));
2002 info->conds = NULL;
2003 info->size_time_table = NULL;
2004
2005 /* When optimizing and analyzing for IPA inliner, initialize loop optimizer
2006 so we can produce proper inline hints.
2007
2008 When optimizing and analyzing for early inliner, initialize node params
2009 so we can produce correct BB predicates. */
2010
2011 if (opt_for_fn (node->decl, optimize))
2012 {
2013 calculate_dominance_info (CDI_DOMINATORS);
2014 if (!early)
2015 loop_optimizer_init (LOOPS_NORMAL | LOOPS_HAVE_RECORDED_EXITS);
2016 else
2017 {
2018 ipa_check_create_node_params ();
2019 ipa_initialize_node_params (node);
2020 }
2021
2022 if (ipa_node_params_sum)
2023 {
2024 fbi.node = node;
2025 fbi.info = IPA_NODE_REF (node);
2026 fbi.bb_infos = vNULL;
2027 fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
2028 fbi.param_count = count_formal_params(node->decl);
2029 nonconstant_names.safe_grow_cleared
2030 (SSANAMES (my_function)->length ());
2031 }
2032 }
2033
2034 if (dump_file)
2035 fprintf (dump_file, "\nAnalyzing function body size: %s\n",
2036 node->name ());
2037
2038 /* When we run into maximal number of entries, we assign everything to the
2039 constant truth case. Be sure to have it in list. */
2040 bb_predicate = true;
2041 info->account_size_time (0, 0, bb_predicate, bb_predicate);
2042
2043 bb_predicate = predicate::not_inlined ();
0bceb671 2044 info->account_size_time (2 * ipa_fn_summary::size_scale, 0, bb_predicate,
27d020cf
JH
2045 bb_predicate);
2046
2047 if (fbi.info)
2048 compute_bb_predicates (&fbi, node, info);
2049 order = XNEWVEC (int, n_basic_blocks_for_fn (cfun));
2050 nblocks = pre_and_rev_post_order_compute (NULL, order, false);
2051 for (n = 0; n < nblocks; n++)
2052 {
2053 bb = BASIC_BLOCK_FOR_FN (cfun, order[n]);
2054 freq = compute_call_stmt_bb_frequency (node->decl, bb);
2055 if (clobber_only_eh_bb_p (bb))
2056 {
2057 if (dump_file && (dump_flags & TDF_DETAILS))
2058 fprintf (dump_file, "\n Ignoring BB %i;"
2059 " it will be optimized away by cleanup_clobbers\n",
2060 bb->index);
2061 continue;
2062 }
2063
2064 /* TODO: Obviously predicates can be propagated down across CFG. */
2065 if (fbi.info)
2066 {
2067 if (bb->aux)
2068 bb_predicate = *(predicate *) bb->aux;
2069 else
2070 bb_predicate = false;
2071 }
2072 else
2073 bb_predicate = true;
2074
2075 if (dump_file && (dump_flags & TDF_DETAILS))
2076 {
2077 fprintf (dump_file, "\n BB %i predicate:", bb->index);
2078 bb_predicate.dump (dump_file, info->conds);
2079 }
2080
2081 if (fbi.info && nonconstant_names.exists ())
2082 {
2083 predicate phi_predicate;
2084 bool first_phi = true;
2085
2086 for (gphi_iterator bsi = gsi_start_phis (bb); !gsi_end_p (bsi);
2087 gsi_next (&bsi))
2088 {
2089 if (first_phi
2090 && !phi_result_unknown_predicate (fbi.info, info, bb,
2091 &phi_predicate,
2092 nonconstant_names))
2093 break;
2094 first_phi = false;
2095 if (dump_file && (dump_flags & TDF_DETAILS))
2096 {
2097 fprintf (dump_file, " ");
2098 print_gimple_stmt (dump_file, gsi_stmt (bsi), 0);
2099 }
2100 predicate_for_phi_result (info, bsi.phi (), &phi_predicate,
2101 nonconstant_names);
2102 }
2103 }
2104
2105 fix_builtin_expect_stmt = find_foldable_builtin_expect (bb);
2106
2107 for (gimple_stmt_iterator bsi = gsi_start_bb (bb); !gsi_end_p (bsi);
2108 gsi_next (&bsi))
2109 {
2110 gimple *stmt = gsi_stmt (bsi);
2111 int this_size = estimate_num_insns (stmt, &eni_size_weights);
2112 int this_time = estimate_num_insns (stmt, &eni_time_weights);
2113 int prob;
2114 predicate will_be_nonconstant;
2115
2116 /* This relation stmt should be folded after we remove
2117 buildin_expect call. Adjust the cost here. */
2118 if (stmt == fix_builtin_expect_stmt)
2119 {
2120 this_size--;
2121 this_time--;
2122 }
2123
2124 if (dump_file && (dump_flags & TDF_DETAILS))
2125 {
2126 fprintf (dump_file, " ");
2127 print_gimple_stmt (dump_file, stmt, 0);
2128 fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n",
2129 ((double) freq) / CGRAPH_FREQ_BASE, this_size,
2130 this_time);
2131 }
2132
2133 if (gimple_assign_load_p (stmt) && nonconstant_names.exists ())
2134 {
2135 predicate this_array_index;
2136 this_array_index =
2137 array_index_predicate (info, nonconstant_names,
2138 gimple_assign_rhs1 (stmt));
2139 if (this_array_index != false)
2140 array_index &= this_array_index;
2141 }
2142 if (gimple_store_p (stmt) && nonconstant_names.exists ())
2143 {
2144 predicate this_array_index;
2145 this_array_index =
2146 array_index_predicate (info, nonconstant_names,
2147 gimple_get_lhs (stmt));
2148 if (this_array_index != false)
2149 array_index &= this_array_index;
2150 }
2151
2152
2153 if (is_gimple_call (stmt)
2154 && !gimple_call_internal_p (stmt))
2155 {
2156 struct cgraph_edge *edge = node->get_edge (stmt);
2157 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
2158
2159 /* Special case: results of BUILT_IN_CONSTANT_P will be always
2160 resolved as constant. We however don't want to optimize
2161 out the cgraph edges. */
2162 if (nonconstant_names.exists ()
2163 && gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P)
2164 && gimple_call_lhs (stmt)
2165 && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
2166 {
2167 predicate false_p = false;
2168 nonconstant_names[SSA_NAME_VERSION (gimple_call_lhs (stmt))]
2169 = false_p;
2170 }
2171 if (ipa_node_params_sum)
2172 {
2173 int count = gimple_call_num_args (stmt);
2174 int i;
2175
2176 if (count)
2177 es->param.safe_grow_cleared (count);
2178 for (i = 0; i < count; i++)
2179 {
2180 int prob = param_change_prob (stmt, i);
2181 gcc_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
2182 es->param[i].change_prob = prob;
2183 }
2184 }
2185
2186 es->call_stmt_size = this_size;
2187 es->call_stmt_time = this_time;
2188 es->loop_depth = bb_loop_depth (bb);
2189 edge_set_predicate (edge, &bb_predicate);
2190 }
2191
2192 /* TODO: When conditional jump or swithc is known to be constant, but
2193 we did not translate it into the predicates, we really can account
2194 just maximum of the possible paths. */
2195 if (fbi.info)
2196 will_be_nonconstant
2197 = will_be_nonconstant_predicate (&fbi, info,
2198 stmt, nonconstant_names);
2199 else
2200 will_be_nonconstant = true;
2201 if (this_time || this_size)
2202 {
2203 this_time *= freq;
2204
2205 prob = eliminated_by_inlining_prob (stmt);
2206 if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS))
2207 fprintf (dump_file,
2208 "\t\t50%% will be eliminated by inlining\n");
2209 if (prob == 2 && dump_file && (dump_flags & TDF_DETAILS))
2210 fprintf (dump_file, "\t\tWill be eliminated by inlining\n");
2211
2212 struct predicate p = bb_predicate & will_be_nonconstant;
2213
2214 /* We can ignore statement when we proved it is never going
2215 to happen, but we can not do that for call statements
2216 because edges are accounted specially. */
2217
2218 if (*(is_gimple_call (stmt) ? &bb_predicate : &p) != false)
2219 {
2220 time += this_time;
2221 size += this_size;
2222 }
2223
2224 /* We account everything but the calls. Calls have their own
2225 size/time info attached to cgraph edges. This is necessary
2226 in order to make the cost disappear after inlining. */
2227 if (!is_gimple_call (stmt))
2228 {
2229 if (prob)
2230 {
2231 predicate ip = bb_predicate & predicate::not_inlined ();
2232 info->account_size_time (this_size * prob,
2233 (sreal)(this_time * prob)
2234 / (CGRAPH_FREQ_BASE * 2), ip,
2235 p);
2236 }
2237 if (prob != 2)
2238 info->account_size_time (this_size * (2 - prob),
2239 (sreal)(this_time * (2 - prob))
2240 / (CGRAPH_FREQ_BASE * 2),
2241 bb_predicate,
2242 p);
2243 }
2244
2245 if (!info->fp_expressions && fp_expression_p (stmt))
2246 {
2247 info->fp_expressions = true;
2248 if (dump_file)
2249 fprintf (dump_file, " fp_expression set\n");
2250 }
2251
2252 gcc_assert (time >= 0);
2253 gcc_assert (size >= 0);
2254 }
2255 }
2256 }
0bceb671 2257 set_hint_predicate (&ipa_fn_summaries->get (node)->array_index, array_index);
27d020cf
JH
2258 time = time / CGRAPH_FREQ_BASE;
2259 free (order);
2260
2261 if (nonconstant_names.exists () && !early)
2262 {
2263 struct loop *loop;
2264 predicate loop_iterations = true;
2265 predicate loop_stride = true;
2266
2267 if (dump_file && (dump_flags & TDF_DETAILS))
2268 flow_loops_dump (dump_file, NULL, 0);
2269 scev_initialize ();
2270 FOR_EACH_LOOP (loop, 0)
2271 {
2272 vec<edge> exits;
2273 edge ex;
2274 unsigned int j;
2275 struct tree_niter_desc niter_desc;
2276 bb_predicate = *(predicate *) loop->header->aux;
2277
2278 exits = get_loop_exit_edges (loop);
2279 FOR_EACH_VEC_ELT (exits, j, ex)
2280 if (number_of_iterations_exit (loop, ex, &niter_desc, false)
2281 && !is_gimple_min_invariant (niter_desc.niter))
2282 {
2283 predicate will_be_nonconstant
2284 = will_be_nonconstant_expr_predicate (fbi.info, info,
2285 niter_desc.niter,
2286 nonconstant_names);
2287 if (will_be_nonconstant != true)
2288 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2289 if (will_be_nonconstant != true
2290 && will_be_nonconstant != false)
2291 /* This is slightly inprecise. We may want to represent each
2292 loop with independent predicate. */
2293 loop_iterations &= will_be_nonconstant;
2294 }
2295 exits.release ();
2296 }
2297
2298 /* To avoid quadratic behavior we analyze stride predicates only
2299 with respect to the containing loop. Thus we simply iterate
2300 over all defs in the outermost loop body. */
2301 for (loop = loops_for_fn (cfun)->tree_root->inner;
2302 loop != NULL; loop = loop->next)
2303 {
2304 basic_block *body = get_loop_body (loop);
2305 for (unsigned i = 0; i < loop->num_nodes; i++)
2306 {
2307 gimple_stmt_iterator gsi;
2308 bb_predicate = *(predicate *) body[i]->aux;
2309 for (gsi = gsi_start_bb (body[i]); !gsi_end_p (gsi);
2310 gsi_next (&gsi))
2311 {
2312 gimple *stmt = gsi_stmt (gsi);
2313
2314 if (!is_gimple_assign (stmt))
2315 continue;
2316
2317 tree def = gimple_assign_lhs (stmt);
2318 if (TREE_CODE (def) != SSA_NAME)
2319 continue;
2320
2321 affine_iv iv;
2322 if (!simple_iv (loop_containing_stmt (stmt),
2323 loop_containing_stmt (stmt),
2324 def, &iv, true)
2325 || is_gimple_min_invariant (iv.step))
2326 continue;
2327
2328 predicate will_be_nonconstant
2329 = will_be_nonconstant_expr_predicate (fbi.info, info,
2330 iv.step,
2331 nonconstant_names);
2332 if (will_be_nonconstant != true)
2333 will_be_nonconstant = bb_predicate & will_be_nonconstant;
2334 if (will_be_nonconstant != true
2335 && will_be_nonconstant != false)
2336 /* This is slightly inprecise. We may want to represent
2337 each loop with independent predicate. */
2338 loop_stride = loop_stride & will_be_nonconstant;
2339 }
2340 }
2341 free (body);
2342 }
0bceb671 2343 set_hint_predicate (&ipa_fn_summaries->get (node)->loop_iterations,
27d020cf 2344 loop_iterations);
0bceb671 2345 set_hint_predicate (&ipa_fn_summaries->get (node)->loop_stride,
27d020cf
JH
2346 loop_stride);
2347 scev_finalize ();
2348 }
2349 FOR_ALL_BB_FN (bb, my_function)
2350 {
2351 edge e;
2352 edge_iterator ei;
2353
2354 if (bb->aux)
2355 edge_predicate_pool.remove ((predicate *)bb->aux);
2356 bb->aux = NULL;
2357 FOR_EACH_EDGE (e, ei, bb->succs)
2358 {
2359 if (e->aux)
2360 edge_predicate_pool.remove ((predicate *) e->aux);
2361 e->aux = NULL;
2362 }
2363 }
0bceb671
JH
2364 ipa_fn_summaries->get (node)->time = time;
2365 ipa_fn_summaries->get (node)->self_size = size;
27d020cf
JH
2366 nonconstant_names.release ();
2367 ipa_release_body_info (&fbi);
2368 if (opt_for_fn (node->decl, optimize))
2369 {
2370 if (!early)
2371 loop_optimizer_finalize ();
2372 else if (!ipa_edge_args_sum)
2373 ipa_free_all_node_params ();
2374 free_dominance_info (CDI_DOMINATORS);
2375 }
2376 if (dump_file)
2377 {
2378 fprintf (dump_file, "\n");
0bceb671 2379 ipa_dump_fn_summary (dump_file, node);
27d020cf
JH
2380 }
2381}
2382
2383
0bceb671
JH
2384/* Compute function summary.
2385 EARLY is true when we compute parameters during early opts. */
27d020cf
JH
2386
2387void
0bceb671 2388compute_fn_summary (struct cgraph_node *node, bool early)
27d020cf
JH
2389{
2390 HOST_WIDE_INT self_stack_size;
2391 struct cgraph_edge *e;
0bceb671 2392 struct ipa_fn_summary *info;
27d020cf
JH
2393
2394 gcc_assert (!node->global.inlined_to);
2395
0bceb671
JH
2396 if (!ipa_fn_summaries)
2397 ipa_fn_summary_alloc ();
27d020cf 2398
0bceb671 2399 info = ipa_fn_summaries->get (node);
27d020cf
JH
2400 info->reset (node);
2401
2402 /* Estimate the stack size for the function if we're optimizing. */
2403 self_stack_size = optimize && !node->thunk.thunk_p
2404 ? estimated_stack_frame_size (node) : 0;
2405 info->estimated_self_stack_size = self_stack_size;
2406 info->estimated_stack_size = self_stack_size;
2407 info->stack_frame_offset = 0;
2408
2409 if (node->thunk.thunk_p)
2410 {
2411 struct ipa_call_summary *es = ipa_call_summaries->get (node->callees);
2412 predicate t = true;
2413
2414 node->local.can_change_signature = false;
2415 es->call_stmt_size = eni_size_weights.call_cost;
2416 es->call_stmt_time = eni_time_weights.call_cost;
0bceb671 2417 info->account_size_time (ipa_fn_summary::size_scale * 2, 2, t, t);
27d020cf 2418 t = predicate::not_inlined ();
0bceb671
JH
2419 info->account_size_time (2 * ipa_fn_summary::size_scale, 0, t, t);
2420 ipa_update_overall_fn_summary (node);
27d020cf
JH
2421 info->self_size = info->size;
2422 /* We can not inline instrumentation clones. */
2423 if (node->thunk.add_pointer_bounds_args)
2424 {
2425 info->inlinable = false;
2426 node->callees->inline_failed = CIF_CHKP;
2427 }
2428 else
2429 info->inlinable = true;
2430 }
2431 else
2432 {
2433 /* Even is_gimple_min_invariant rely on current_function_decl. */
2434 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2435
2436 /* Can this function be inlined at all? */
2437 if (!opt_for_fn (node->decl, optimize)
2438 && !lookup_attribute ("always_inline",
2439 DECL_ATTRIBUTES (node->decl)))
2440 info->inlinable = false;
2441 else
2442 info->inlinable = tree_inlinable_function_p (node->decl);
2443
2444 info->contains_cilk_spawn = fn_contains_cilk_spawn_p (cfun);
2445
2446 /* Type attributes can use parameter indices to describe them. */
2447 if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
2448 node->local.can_change_signature = false;
2449 else
2450 {
2451 /* Otherwise, inlinable functions always can change signature. */
2452 if (info->inlinable)
2453 node->local.can_change_signature = true;
2454 else
2455 {
2456 /* Functions calling builtin_apply can not change signature. */
2457 for (e = node->callees; e; e = e->next_callee)
2458 {
2459 tree cdecl = e->callee->decl;
2460 if (DECL_BUILT_IN (cdecl)
2461 && DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL
2462 && (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS
2463 || DECL_FUNCTION_CODE (cdecl) == BUILT_IN_VA_START))
2464 break;
2465 }
2466 node->local.can_change_signature = !e;
2467 }
2468 }
2469 /* Functions called by instrumentation thunk can't change signature
2470 because instrumentation thunk modification is not supported. */
2471 if (node->local.can_change_signature)
2472 for (e = node->callers; e; e = e->next_caller)
2473 if (e->caller->thunk.thunk_p
2474 && e->caller->thunk.add_pointer_bounds_args)
2475 {
2476 node->local.can_change_signature = false;
2477 break;
2478 }
0bceb671 2479 analyze_function_body (node, early);
27d020cf
JH
2480 pop_cfun ();
2481 }
2482 for (e = node->callees; e; e = e->next_callee)
2483 if (e->callee->comdat_local_p ())
2484 break;
2485 node->calls_comdat_local = (e != NULL);
2486
2487 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
2488 info->size = info->self_size;
2489 info->stack_frame_offset = 0;
2490 info->estimated_stack_size = info->estimated_self_stack_size;
2491
2492 /* Code above should compute exactly the same result as
0bceb671 2493 ipa_update_overall_fn_summary but because computation happens in
27d020cf 2494 different order the roundoff errors result in slight changes. */
0bceb671 2495 ipa_update_overall_fn_summary (node);
27d020cf
JH
2496 gcc_assert (info->size == info->self_size);
2497}
2498
2499
2500/* Compute parameters of functions used by inliner using
2501 current_function_decl. */
2502
2503static unsigned int
0bceb671 2504compute_fn_summary_for_current (void)
27d020cf 2505{
0bceb671 2506 compute_fn_summary (cgraph_node::get (current_function_decl), true);
27d020cf
JH
2507 return 0;
2508}
2509
27d020cf
JH
2510/* Estimate benefit devirtualizing indirect edge IE, provided KNOWN_VALS,
2511 KNOWN_CONTEXTS and KNOWN_AGGS. */
2512
2513static bool
2514estimate_edge_devirt_benefit (struct cgraph_edge *ie,
2515 int *size, int *time,
2516 vec<tree> known_vals,
2517 vec<ipa_polymorphic_call_context> known_contexts,
2518 vec<ipa_agg_jump_function_p> known_aggs)
2519{
2520 tree target;
2521 struct cgraph_node *callee;
0bceb671 2522 struct ipa_fn_summary *isummary;
27d020cf
JH
2523 enum availability avail;
2524 bool speculative;
2525
2526 if (!known_vals.exists () && !known_contexts.exists ())
2527 return false;
2528 if (!opt_for_fn (ie->caller->decl, flag_indirect_inlining))
2529 return false;
2530
2531 target = ipa_get_indirect_edge_target (ie, known_vals, known_contexts,
2532 known_aggs, &speculative);
2533 if (!target || speculative)
2534 return false;
2535
2536 /* Account for difference in cost between indirect and direct calls. */
2537 *size -= (eni_size_weights.indirect_call_cost - eni_size_weights.call_cost);
2538 *time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost);
2539 gcc_checking_assert (*time >= 0);
2540 gcc_checking_assert (*size >= 0);
2541
2542 callee = cgraph_node::get (target);
2543 if (!callee || !callee->definition)
2544 return false;
2545 callee = callee->function_symbol (&avail);
2546 if (avail < AVAIL_AVAILABLE)
2547 return false;
0bceb671 2548 isummary = ipa_fn_summaries->get (callee);
27d020cf
JH
2549 return isummary->inlinable;
2550}
2551
2552/* Increase SIZE, MIN_SIZE (if non-NULL) and TIME for size and time needed to
2553 handle edge E with probability PROB.
2554 Set HINTS if edge may be devirtualized.
2555 KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS describe context of the call
2556 site. */
2557
2558static inline void
2559estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *min_size,
2560 sreal *time,
2561 int prob,
2562 vec<tree> known_vals,
2563 vec<ipa_polymorphic_call_context> known_contexts,
2564 vec<ipa_agg_jump_function_p> known_aggs,
0bceb671 2565 ipa_hints *hints)
27d020cf
JH
2566{
2567 struct ipa_call_summary *es = ipa_call_summaries->get (e);
2568 int call_size = es->call_stmt_size;
2569 int call_time = es->call_stmt_time;
2570 int cur_size;
2571 if (!e->callee
2572 && estimate_edge_devirt_benefit (e, &call_size, &call_time,
2573 known_vals, known_contexts, known_aggs)
2574 && hints && e->maybe_hot_p ())
2575 *hints |= INLINE_HINT_indirect_call;
0bceb671 2576 cur_size = call_size * ipa_fn_summary::size_scale;
27d020cf
JH
2577 *size += cur_size;
2578 if (min_size)
2579 *min_size += cur_size;
2580 if (prob == REG_BR_PROB_BASE)
1bad9c18 2581 *time += ((sreal)(call_time * e->frequency ())) / CGRAPH_FREQ_BASE;
27d020cf 2582 else
1bad9c18 2583 *time += ((sreal)call_time) * (prob * e->frequency ())
27d020cf
JH
2584 / (CGRAPH_FREQ_BASE * REG_BR_PROB_BASE);
2585}
2586
2587
2588
2589/* Increase SIZE, MIN_SIZE and TIME for size and time needed to handle all
2590 calls in NODE. POSSIBLE_TRUTHS, KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
2591 describe context of the call site. */
2592
2593static void
2594estimate_calls_size_and_time (struct cgraph_node *node, int *size,
2595 int *min_size, sreal *time,
0bceb671 2596 ipa_hints *hints,
27d020cf
JH
2597 clause_t possible_truths,
2598 vec<tree> known_vals,
2599 vec<ipa_polymorphic_call_context> known_contexts,
2600 vec<ipa_agg_jump_function_p> known_aggs)
2601{
2602 struct cgraph_edge *e;
2603 for (e = node->callees; e; e = e->next_callee)
2604 {
2605 struct ipa_call_summary *es = ipa_call_summaries->get (e);
2606
2607 /* Do not care about zero sized builtins. */
2608 if (e->inline_failed && !es->call_stmt_size)
2609 {
2610 gcc_checking_assert (!es->call_stmt_time);
2611 continue;
2612 }
2613 if (!es->predicate
2614 || es->predicate->evaluate (possible_truths))
2615 {
2616 if (e->inline_failed)
2617 {
2618 /* Predicates of calls shall not use NOT_CHANGED codes,
2619 sowe do not need to compute probabilities. */
2620 estimate_edge_size_and_time (e, size,
2621 es->predicate ? NULL : min_size,
2622 time, REG_BR_PROB_BASE,
2623 known_vals, known_contexts,
2624 known_aggs, hints);
2625 }
2626 else
2627 estimate_calls_size_and_time (e->callee, size, min_size, time,
2628 hints,
2629 possible_truths,
2630 known_vals, known_contexts,
2631 known_aggs);
2632 }
2633 }
2634 for (e = node->indirect_calls; e; e = e->next_callee)
2635 {
2636 struct ipa_call_summary *es = ipa_call_summaries->get (e);
2637 if (!es->predicate
2638 || es->predicate->evaluate (possible_truths))
2639 estimate_edge_size_and_time (e, size,
2640 es->predicate ? NULL : min_size,
2641 time, REG_BR_PROB_BASE,
2642 known_vals, known_contexts, known_aggs,
2643 hints);
2644 }
2645}
2646
2647
2648/* Estimate size and time needed to execute NODE assuming
2649 POSSIBLE_TRUTHS clause, and KNOWN_VALS, KNOWN_AGGS and KNOWN_CONTEXTS
2650 information about NODE's arguments. If non-NULL use also probability
2651 information present in INLINE_PARAM_SUMMARY vector.
2652 Additionally detemine hints determined by the context. Finally compute
2653 minimal size needed for the call that is independent on the call context and
2654 can be used for fast estimates. Return the values in RET_SIZE,
2655 RET_MIN_SIZE, RET_TIME and RET_HINTS. */
2656
2657void
2658estimate_node_size_and_time (struct cgraph_node *node,
2659 clause_t possible_truths,
2660 clause_t nonspec_possible_truths,
2661 vec<tree> known_vals,
2662 vec<ipa_polymorphic_call_context> known_contexts,
2663 vec<ipa_agg_jump_function_p> known_aggs,
2664 int *ret_size, int *ret_min_size,
2665 sreal *ret_time,
2666 sreal *ret_nonspecialized_time,
0bceb671 2667 ipa_hints *ret_hints,
27d020cf
JH
2668 vec<inline_param_summary>
2669 inline_param_summary)
2670{
0bceb671 2671 struct ipa_fn_summary *info = ipa_fn_summaries->get (node);
27d020cf
JH
2672 size_time_entry *e;
2673 int size = 0;
2674 sreal time = 0;
2675 int min_size = 0;
0bceb671 2676 ipa_hints hints = 0;
27d020cf
JH
2677 int i;
2678
2679 if (dump_file && (dump_flags & TDF_DETAILS))
2680 {
2681 bool found = false;
2682 fprintf (dump_file, " Estimating body: %s/%i\n"
2683 " Known to be false: ", node->name (),
2684 node->order);
2685
2686 for (i = predicate::not_inlined_condition;
2687 i < (predicate::first_dynamic_condition
2688 + (int) vec_safe_length (info->conds)); i++)
2689 if (!(possible_truths & (1 << i)))
2690 {
2691 if (found)
2692 fprintf (dump_file, ", ");
2693 found = true;
2694 dump_condition (dump_file, info->conds, i);
2695 }
2696 }
2697
2698 estimate_calls_size_and_time (node, &size, &min_size, &time, &hints, possible_truths,
2699 known_vals, known_contexts, known_aggs);
2700 sreal nonspecialized_time = time;
2701
2702 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
2703 {
27d020cf 2704 bool exec = e->exec_predicate.evaluate (nonspec_possible_truths);
3494e738
JH
2705
2706 /* Because predicates are conservative, it can happen that nonconst is 1
2707 but exec is 0. */
27d020cf
JH
2708 if (exec)
2709 {
3494e738
JH
2710 bool nonconst = e->nonconst_predicate.evaluate (possible_truths);
2711
27d020cf
JH
2712 gcc_checking_assert (e->time >= 0);
2713 gcc_checking_assert (time >= 0);
2714
2715 /* We compute specialized size only because size of nonspecialized
2716 copy is context independent.
2717
2718 The difference between nonspecialized execution and specialized is
2719 that nonspecialized is not going to have optimized out computations
2720 known to be constant in a specialized setting. */
2721 if (nonconst)
2722 size += e->size;
2723 nonspecialized_time += e->time;
2724 if (!nonconst)
2725 ;
2726 else if (!inline_param_summary.exists ())
2727 {
2728 if (nonconst)
2729 time += e->time;
2730 }
2731 else
2732 {
2733 int prob = e->nonconst_predicate.probability
2734 (info->conds, possible_truths,
2735 inline_param_summary);
2736 gcc_checking_assert (prob >= 0);
2737 gcc_checking_assert (prob <= REG_BR_PROB_BASE);
2738 time += e->time * prob / REG_BR_PROB_BASE;
2739 }
2740 gcc_checking_assert (time >= 0);
2741 }
2742 }
2743 gcc_checking_assert ((*info->size_time_table)[0].exec_predicate == true);
2744 gcc_checking_assert ((*info->size_time_table)[0].nonconst_predicate == true);
2745 min_size = (*info->size_time_table)[0].size;
2746 gcc_checking_assert (size >= 0);
2747 gcc_checking_assert (time >= 0);
2748 /* nonspecialized_time should be always bigger than specialized time.
2749 Roundoff issues however may get into the way. */
2750 gcc_checking_assert ((nonspecialized_time - time) >= -1);
2751
2752 /* Roundoff issues may make specialized time bigger than nonspecialized
2753 time. We do not really want that to happen because some heurstics
2754 may get confused by seeing negative speedups. */
2755 if (time > nonspecialized_time)
2756 time = nonspecialized_time;
2757
2758 if (info->loop_iterations
2759 && !info->loop_iterations->evaluate (possible_truths))
2760 hints |= INLINE_HINT_loop_iterations;
2761 if (info->loop_stride
2762 && !info->loop_stride->evaluate (possible_truths))
2763 hints |= INLINE_HINT_loop_stride;
2764 if (info->array_index
2765 && !info->array_index->evaluate (possible_truths))
2766 hints |= INLINE_HINT_array_index;
2767 if (info->scc_no)
2768 hints |= INLINE_HINT_in_scc;
2769 if (DECL_DECLARED_INLINE_P (node->decl))
2770 hints |= INLINE_HINT_declared_inline;
2771
0bceb671
JH
2772 size = RDIV (size, ipa_fn_summary::size_scale);
2773 min_size = RDIV (min_size, ipa_fn_summary::size_scale);
27d020cf
JH
2774
2775 if (dump_file && (dump_flags & TDF_DETAILS))
2776 fprintf (dump_file, "\n size:%i time:%f nonspec time:%f\n", (int) size,
2777 time.to_double (), nonspecialized_time.to_double ());
2778 if (ret_time)
2779 *ret_time = time;
2780 if (ret_nonspecialized_time)
2781 *ret_nonspecialized_time = nonspecialized_time;
2782 if (ret_size)
2783 *ret_size = size;
2784 if (ret_min_size)
2785 *ret_min_size = min_size;
2786 if (ret_hints)
2787 *ret_hints = hints;
2788 return;
2789}
2790
2791
2792/* Estimate size and time needed to execute callee of EDGE assuming that
2793 parameters known to be constant at caller of EDGE are propagated.
2794 KNOWN_VALS and KNOWN_CONTEXTS are vectors of assumed known constant values
2795 and types for parameters. */
2796
2797void
2798estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
2799 vec<tree> known_vals,
2800 vec<ipa_polymorphic_call_context>
2801 known_contexts,
2802 vec<ipa_agg_jump_function_p> known_aggs,
2803 int *ret_size, sreal *ret_time,
2804 sreal *ret_nonspec_time,
0bceb671 2805 ipa_hints *hints)
27d020cf
JH
2806{
2807 clause_t clause, nonspec_clause;
2808
2809 evaluate_conditions_for_known_args (node, false, known_vals, known_aggs,
2810 &clause, &nonspec_clause);
2811 estimate_node_size_and_time (node, clause, nonspec_clause,
2812 known_vals, known_contexts,
2813 known_aggs, ret_size, NULL, ret_time,
2814 ret_nonspec_time, hints, vNULL);
2815}
2816
2817
2818/* Update summary information of inline clones after inlining.
2819 Compute peak stack usage. */
2820
2821static void
2822inline_update_callee_summaries (struct cgraph_node *node, int depth)
2823{
2824 struct cgraph_edge *e;
0bceb671
JH
2825 struct ipa_fn_summary *callee_info = ipa_fn_summaries->get (node);
2826 struct ipa_fn_summary *caller_info = ipa_fn_summaries->get (node->callers->caller);
27d020cf
JH
2827 HOST_WIDE_INT peak;
2828
2829 callee_info->stack_frame_offset
2830 = caller_info->stack_frame_offset
2831 + caller_info->estimated_self_stack_size;
2832 peak = callee_info->stack_frame_offset
2833 + callee_info->estimated_self_stack_size;
0bceb671
JH
2834 if (ipa_fn_summaries->get (node->global.inlined_to)->estimated_stack_size < peak)
2835 ipa_fn_summaries->get (node->global.inlined_to)->estimated_stack_size = peak;
27d020cf
JH
2836 ipa_propagate_frequency (node);
2837 for (e = node->callees; e; e = e->next_callee)
2838 {
2839 if (!e->inline_failed)
2840 inline_update_callee_summaries (e->callee, depth);
2841 ipa_call_summaries->get (e)->loop_depth += depth;
2842 }
2843 for (e = node->indirect_calls; e; e = e->next_callee)
2844 ipa_call_summaries->get (e)->loop_depth += depth;
2845}
2846
2847/* Update change_prob of EDGE after INLINED_EDGE has been inlined.
2848 When functoin A is inlined in B and A calls C with parameter that
2849 changes with probability PROB1 and C is known to be passthroug
2850 of argument if B that change with probability PROB2, the probability
2851 of change is now PROB1*PROB2. */
2852
2853static void
2854remap_edge_change_prob (struct cgraph_edge *inlined_edge,
2855 struct cgraph_edge *edge)
2856{
2857 if (ipa_node_params_sum)
2858 {
2859 int i;
2860 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2861 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
2862 struct ipa_call_summary *inlined_es
2863 = ipa_call_summaries->get (inlined_edge);
2864
2865 for (i = 0; i < ipa_get_cs_argument_count (args); i++)
2866 {
2867 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2868 if (jfunc->type == IPA_JF_PASS_THROUGH
2869 || jfunc->type == IPA_JF_ANCESTOR)
2870 {
2871 int id = jfunc->type == IPA_JF_PASS_THROUGH
2872 ? ipa_get_jf_pass_through_formal_id (jfunc)
2873 : ipa_get_jf_ancestor_formal_id (jfunc);
2874 if (id < (int) inlined_es->param.length ())
2875 {
2876 int prob1 = es->param[i].change_prob;
2877 int prob2 = inlined_es->param[id].change_prob;
2878 int prob = combine_probabilities (prob1, prob2);
2879
2880 if (prob1 && prob2 && !prob)
2881 prob = 1;
2882
2883 es->param[i].change_prob = prob;
2884 }
2885 }
2886 }
2887 }
2888}
2889
2890/* Update edge summaries of NODE after INLINED_EDGE has been inlined.
2891
2892 Remap predicates of callees of NODE. Rest of arguments match
2893 remap_predicate.
2894
2895 Also update change probabilities. */
2896
2897static void
2898remap_edge_summaries (struct cgraph_edge *inlined_edge,
2899 struct cgraph_node *node,
0bceb671
JH
2900 struct ipa_fn_summary *info,
2901 struct ipa_fn_summary *callee_info,
27d020cf
JH
2902 vec<int> operand_map,
2903 vec<int> offset_map,
2904 clause_t possible_truths,
2905 predicate *toplev_predicate)
2906{
2907 struct cgraph_edge *e, *next;
2908 for (e = node->callees; e; e = next)
2909 {
2910 struct ipa_call_summary *es = ipa_call_summaries->get (e);
2911 predicate p;
2912 next = e->next_callee;
2913
2914 if (e->inline_failed)
2915 {
2916 remap_edge_change_prob (inlined_edge, e);
2917
2918 if (es->predicate)
2919 {
2920 p = es->predicate->remap_after_inlining
2921 (info, callee_info, operand_map,
2922 offset_map, possible_truths,
2923 *toplev_predicate);
2924 edge_set_predicate (e, &p);
2925 }
2926 else
2927 edge_set_predicate (e, toplev_predicate);
2928 }
2929 else
2930 remap_edge_summaries (inlined_edge, e->callee, info, callee_info,
2931 operand_map, offset_map, possible_truths,
2932 toplev_predicate);
2933 }
2934 for (e = node->indirect_calls; e; e = next)
2935 {
2936 struct ipa_call_summary *es = ipa_call_summaries->get (e);
2937 predicate p;
2938 next = e->next_callee;
2939
2940 remap_edge_change_prob (inlined_edge, e);
2941 if (es->predicate)
2942 {
2943 p = es->predicate->remap_after_inlining
2944 (info, callee_info, operand_map, offset_map,
2945 possible_truths, *toplev_predicate);
2946 edge_set_predicate (e, &p);
2947 }
2948 else
2949 edge_set_predicate (e, toplev_predicate);
2950 }
2951}
2952
2953/* Same as remap_predicate, but set result into hint *HINT. */
2954
2955static void
0bceb671
JH
2956remap_hint_predicate (struct ipa_fn_summary *info,
2957 struct ipa_fn_summary *callee_info,
27d020cf
JH
2958 predicate **hint,
2959 vec<int> operand_map,
2960 vec<int> offset_map,
2961 clause_t possible_truths,
2962 predicate *toplev_predicate)
2963{
2964 predicate p;
2965
2966 if (!*hint)
2967 return;
2968 p = (*hint)->remap_after_inlining
2969 (info, callee_info,
2970 operand_map, offset_map,
2971 possible_truths, *toplev_predicate);
2972 if (p != false && p != true)
2973 {
2974 if (!*hint)
2975 set_hint_predicate (hint, p);
2976 else
2977 **hint &= p;
2978 }
2979}
2980
2981/* We inlined EDGE. Update summary of the function we inlined into. */
2982
2983void
0bceb671 2984ipa_merge_fn_summary_after_inlining (struct cgraph_edge *edge)
27d020cf 2985{
0bceb671 2986 struct ipa_fn_summary *callee_info = ipa_fn_summaries->get (edge->callee);
27d020cf
JH
2987 struct cgraph_node *to = (edge->caller->global.inlined_to
2988 ? edge->caller->global.inlined_to : edge->caller);
0bceb671 2989 struct ipa_fn_summary *info = ipa_fn_summaries->get (to);
27d020cf
JH
2990 clause_t clause = 0; /* not_inline is known to be false. */
2991 size_time_entry *e;
2992 vec<int> operand_map = vNULL;
2993 vec<int> offset_map = vNULL;
2994 int i;
2995 predicate toplev_predicate;
2996 predicate true_p = true;
2997 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
2998
2999 if (es->predicate)
3000 toplev_predicate = *es->predicate;
3001 else
3002 toplev_predicate = true;
3003
3004 info->fp_expressions |= callee_info->fp_expressions;
3005
3006 if (callee_info->conds)
3007 evaluate_properties_for_edge (edge, true, &clause, NULL, NULL, NULL, NULL);
3008 if (ipa_node_params_sum && callee_info->conds)
3009 {
3010 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
3011 int count = ipa_get_cs_argument_count (args);
3012 int i;
3013
3014 if (count)
3015 {
3016 operand_map.safe_grow_cleared (count);
3017 offset_map.safe_grow_cleared (count);
3018 }
3019 for (i = 0; i < count; i++)
3020 {
3021 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
3022 int map = -1;
3023
3024 /* TODO: handle non-NOPs when merging. */
3025 if (jfunc->type == IPA_JF_PASS_THROUGH)
3026 {
3027 if (ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
3028 map = ipa_get_jf_pass_through_formal_id (jfunc);
3029 if (!ipa_get_jf_pass_through_agg_preserved (jfunc))
3030 offset_map[i] = -1;
3031 }
3032 else if (jfunc->type == IPA_JF_ANCESTOR)
3033 {
3034 HOST_WIDE_INT offset = ipa_get_jf_ancestor_offset (jfunc);
3035 if (offset >= 0 && offset < INT_MAX)
3036 {
3037 map = ipa_get_jf_ancestor_formal_id (jfunc);
3038 if (!ipa_get_jf_ancestor_agg_preserved (jfunc))
3039 offset = -1;
3040 offset_map[i] = offset;
3041 }
3042 }
3043 operand_map[i] = map;
3044 gcc_assert (map < ipa_get_param_count (IPA_NODE_REF (to)));
3045 }
3046 }
3047 for (i = 0; vec_safe_iterate (callee_info->size_time_table, i, &e); i++)
3048 {
3049 predicate p;
3050 p = e->exec_predicate.remap_after_inlining
3051 (info, callee_info, operand_map,
3052 offset_map, clause,
3053 toplev_predicate);
3054 predicate nonconstp;
3055 nonconstp = e->nonconst_predicate.remap_after_inlining
3056 (info, callee_info, operand_map,
3057 offset_map, clause,
3058 toplev_predicate);
3059 if (p != false && nonconstp != false)
3060 {
1bad9c18 3061 sreal add_time = ((sreal)e->time * edge->frequency ()) / CGRAPH_FREQ_BASE;
27d020cf
JH
3062 int prob = e->nonconst_predicate.probability (callee_info->conds,
3063 clause, es->param);
3064 add_time = add_time * prob / REG_BR_PROB_BASE;
3065 if (prob != REG_BR_PROB_BASE
3066 && dump_file && (dump_flags & TDF_DETAILS))
3067 {
3068 fprintf (dump_file, "\t\tScaling time by probability:%f\n",
3069 (double) prob / REG_BR_PROB_BASE);
3070 }
3071 info->account_size_time (e->size, add_time, p, nonconstp);
3072 }
3073 }
3074 remap_edge_summaries (edge, edge->callee, info, callee_info, operand_map,
3075 offset_map, clause, &toplev_predicate);
3076 remap_hint_predicate (info, callee_info,
3077 &callee_info->loop_iterations,
3078 operand_map, offset_map, clause, &toplev_predicate);
3079 remap_hint_predicate (info, callee_info,
3080 &callee_info->loop_stride,
3081 operand_map, offset_map, clause, &toplev_predicate);
3082 remap_hint_predicate (info, callee_info,
3083 &callee_info->array_index,
3084 operand_map, offset_map, clause, &toplev_predicate);
3085
3086 inline_update_callee_summaries (edge->callee,
3087 ipa_call_summaries->get (edge)->loop_depth);
3088
3089 /* We do not maintain predicates of inlined edges, free it. */
3090 edge_set_predicate (edge, &true_p);
3091 /* Similarly remove param summaries. */
3092 es->param.release ();
3093 operand_map.release ();
3094 offset_map.release ();
3095}
3096
0bceb671 3097/* For performance reasons ipa_merge_fn_summary_after_inlining is not updating overall size
27d020cf
JH
3098 and time. Recompute it. */
3099
3100void
0bceb671 3101ipa_update_overall_fn_summary (struct cgraph_node *node)
27d020cf 3102{
0bceb671 3103 struct ipa_fn_summary *info = ipa_fn_summaries->get (node);
27d020cf
JH
3104 size_time_entry *e;
3105 int i;
3106
3107 info->size = 0;
3108 info->time = 0;
3109 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3110 {
3111 info->size += e->size;
3112 info->time += e->time;
3113 }
3114 estimate_calls_size_and_time (node, &info->size, &info->min_size,
3115 &info->time, NULL,
3116 ~(clause_t) (1 << predicate::false_condition),
3117 vNULL, vNULL, vNULL);
0bceb671 3118 info->size = (info->size + ipa_fn_summary::size_scale / 2) / ipa_fn_summary::size_scale;
27d020cf
JH
3119}
3120
3121
3122/* This function performs intraprocedural analysis in NODE that is required to
3123 inline indirect calls. */
3124
3125static void
3126inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
3127{
3128 ipa_analyze_node (node);
3129 if (dump_file && (dump_flags & TDF_DETAILS))
3130 {
3131 ipa_print_node_params (dump_file, node);
3132 ipa_print_node_jump_functions (dump_file, node);
3133 }
3134}
3135
3136
3137/* Note function body size. */
3138
3139void
3140inline_analyze_function (struct cgraph_node *node)
3141{
3142 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
3143
3144 if (dump_file)
3145 fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
3146 node->name (), node->order);
3147 if (opt_for_fn (node->decl, optimize) && !node->thunk.thunk_p)
3148 inline_indirect_intraprocedural_analysis (node);
0bceb671 3149 compute_fn_summary (node, false);
27d020cf
JH
3150 if (!optimize)
3151 {
3152 struct cgraph_edge *e;
3153 for (e = node->callees; e; e = e->next_callee)
3154 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
3155 for (e = node->indirect_calls; e; e = e->next_callee)
3156 e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED;
3157 }
3158
3159 pop_cfun ();
3160}
3161
3162
3163/* Called when new function is inserted to callgraph late. */
3164
3165void
0bceb671 3166ipa_fn_summary_t::insert (struct cgraph_node *node, ipa_fn_summary *)
27d020cf
JH
3167{
3168 inline_analyze_function (node);
3169}
3170
3171/* Note function body size. */
3172
d2db2e6b
JH
3173static void
3174ipa_fn_summary_generate (void)
27d020cf
JH
3175{
3176 struct cgraph_node *node;
3177
3178 FOR_EACH_DEFINED_FUNCTION (node)
3179 if (DECL_STRUCT_FUNCTION (node->decl))
0688f9c1 3180 node->local.versionable = tree_versionable_function_p (node->decl);
27d020cf 3181
0bceb671 3182 ipa_fn_summary_alloc ();
27d020cf 3183
0bceb671 3184 ipa_fn_summaries->enable_insertion_hook ();
27d020cf
JH
3185
3186 ipa_register_cgraph_hooks ();
27d020cf
JH
3187
3188 FOR_EACH_DEFINED_FUNCTION (node)
29f1e2b1
JH
3189 if (!node->alias
3190 && (flag_generate_lto || flag_generate_offload|| flag_wpa
3191 || opt_for_fn (node->decl, optimize)))
27d020cf
JH
3192 inline_analyze_function (node);
3193}
3194
3195
3196/* Write inline summary for edge E to OB. */
3197
3198static void
3199read_ipa_call_summary (struct lto_input_block *ib, struct cgraph_edge *e)
3200{
3201 struct ipa_call_summary *es = ipa_call_summaries->get (e);
3202 predicate p;
3203 int length, i;
3204
3205 es->call_stmt_size = streamer_read_uhwi (ib);
3206 es->call_stmt_time = streamer_read_uhwi (ib);
3207 es->loop_depth = streamer_read_uhwi (ib);
0fab169b
PK
3208
3209 bitpack_d bp = streamer_read_bitpack (ib);
3210 es->is_return_callee_uncaptured = bp_unpack_value (&bp, 1);
3211
27d020cf
JH
3212 p.stream_in (ib);
3213 edge_set_predicate (e, &p);
3214 length = streamer_read_uhwi (ib);
3215 if (length)
3216 {
3217 es->param.safe_grow_cleared (length);
3218 for (i = 0; i < length; i++)
3219 es->param[i].change_prob = streamer_read_uhwi (ib);
3220 }
3221}
3222
3223
3224/* Stream in inline summaries from the section. */
3225
3226static void
3227inline_read_section (struct lto_file_decl_data *file_data, const char *data,
3228 size_t len)
3229{
3230 const struct lto_function_header *header =
3231 (const struct lto_function_header *) data;
3232 const int cfg_offset = sizeof (struct lto_function_header);
3233 const int main_offset = cfg_offset + header->cfg_size;
3234 const int string_offset = main_offset + header->main_size;
3235 struct data_in *data_in;
3236 unsigned int i, count2, j;
3237 unsigned int f_count;
3238
3239 lto_input_block ib ((const char *) data + main_offset, header->main_size,
3240 file_data->mode_table);
3241
3242 data_in =
3243 lto_data_in_create (file_data, (const char *) data + string_offset,
3244 header->string_size, vNULL);
3245 f_count = streamer_read_uhwi (&ib);
3246 for (i = 0; i < f_count; i++)
3247 {
3248 unsigned int index;
3249 struct cgraph_node *node;
0bceb671 3250 struct ipa_fn_summary *info;
27d020cf
JH
3251 lto_symtab_encoder_t encoder;
3252 struct bitpack_d bp;
3253 struct cgraph_edge *e;
3254 predicate p;
3255
3256 index = streamer_read_uhwi (&ib);
3257 encoder = file_data->symtab_node_encoder;
3258 node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
3259 index));
0bceb671 3260 info = ipa_fn_summaries->get (node);
27d020cf
JH
3261
3262 info->estimated_stack_size
3263 = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
3264 info->size = info->self_size = streamer_read_uhwi (&ib);
3265 info->time = sreal::stream_in (&ib);
3266
3267 bp = streamer_read_bitpack (&ib);
3268 info->inlinable = bp_unpack_value (&bp, 1);
3269 info->contains_cilk_spawn = bp_unpack_value (&bp, 1);
3270 info->fp_expressions = bp_unpack_value (&bp, 1);
3271
3272 count2 = streamer_read_uhwi (&ib);
3273 gcc_assert (!info->conds);
3274 for (j = 0; j < count2; j++)
3275 {
3276 struct condition c;
3277 c.operand_num = streamer_read_uhwi (&ib);
3278 c.size = streamer_read_uhwi (&ib);
3279 c.code = (enum tree_code) streamer_read_uhwi (&ib);
3280 c.val = stream_read_tree (&ib, data_in);
3281 bp = streamer_read_bitpack (&ib);
3282 c.agg_contents = bp_unpack_value (&bp, 1);
3283 c.by_ref = bp_unpack_value (&bp, 1);
3284 if (c.agg_contents)
3285 c.offset = streamer_read_uhwi (&ib);
3286 vec_safe_push (info->conds, c);
3287 }
3288 count2 = streamer_read_uhwi (&ib);
3289 gcc_assert (!info->size_time_table);
3290 for (j = 0; j < count2; j++)
3291 {
3292 struct size_time_entry e;
3293
3294 e.size = streamer_read_uhwi (&ib);
3295 e.time = sreal::stream_in (&ib);
3296 e.exec_predicate.stream_in (&ib);
3297 e.nonconst_predicate.stream_in (&ib);
3298
3299 vec_safe_push (info->size_time_table, e);
3300 }
3301
3302 p.stream_in (&ib);
3303 set_hint_predicate (&info->loop_iterations, p);
3304 p.stream_in (&ib);
3305 set_hint_predicate (&info->loop_stride, p);
3306 p.stream_in (&ib);
3307 set_hint_predicate (&info->array_index, p);
3308 for (e = node->callees; e; e = e->next_callee)
3309 read_ipa_call_summary (&ib, e);
3310 for (e = node->indirect_calls; e; e = e->next_callee)
3311 read_ipa_call_summary (&ib, e);
3312 }
3313
0bceb671 3314 lto_free_section_data (file_data, LTO_section_ipa_fn_summary, NULL, data,
27d020cf
JH
3315 len);
3316 lto_data_in_delete (data_in);
3317}
3318
3319
3320/* Read inline summary. Jump functions are shared among ipa-cp
3321 and inliner, so when ipa-cp is active, we don't need to write them
3322 twice. */
3323
d2db2e6b
JH
3324static void
3325ipa_fn_summary_read (void)
27d020cf
JH
3326{
3327 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
3328 struct lto_file_decl_data *file_data;
3329 unsigned int j = 0;
3330
0bceb671 3331 ipa_fn_summary_alloc ();
27d020cf
JH
3332
3333 while ((file_data = file_data_vec[j++]))
3334 {
3335 size_t len;
3336 const char *data = lto_get_section_data (file_data,
0bceb671 3337 LTO_section_ipa_fn_summary,
27d020cf
JH
3338 NULL, &len);
3339 if (data)
3340 inline_read_section (file_data, data, len);
3341 else
3342 /* Fatal error here. We do not want to support compiling ltrans units
3343 with different version of compiler or different flags than the WPA
3344 unit, so this should never happen. */
3345 fatal_error (input_location,
3346 "ipa inline summary is missing in input file");
3347 }
29f1e2b1
JH
3348 ipa_register_cgraph_hooks ();
3349 if (!flag_ipa_cp)
3350 ipa_prop_read_jump_functions ();
27d020cf 3351
0bceb671
JH
3352 gcc_assert (ipa_fn_summaries);
3353 ipa_fn_summaries->enable_insertion_hook ();
27d020cf
JH
3354}
3355
3356
3357/* Write inline summary for edge E to OB. */
3358
3359static void
3360write_ipa_call_summary (struct output_block *ob, struct cgraph_edge *e)
3361{
3362 struct ipa_call_summary *es = ipa_call_summaries->get (e);
3363 int i;
3364
3365 streamer_write_uhwi (ob, es->call_stmt_size);
3366 streamer_write_uhwi (ob, es->call_stmt_time);
3367 streamer_write_uhwi (ob, es->loop_depth);
0fab169b
PK
3368
3369 bitpack_d bp = bitpack_create (ob->main_stream);
3370 bp_pack_value (&bp, es->is_return_callee_uncaptured, 1);
3371 streamer_write_bitpack (&bp);
3372
27d020cf
JH
3373 if (es->predicate)
3374 es->predicate->stream_out (ob);
3375 else
3376 streamer_write_uhwi (ob, 0);
3377 streamer_write_uhwi (ob, es->param.length ());
3378 for (i = 0; i < (int) es->param.length (); i++)
3379 streamer_write_uhwi (ob, es->param[i].change_prob);
3380}
3381
3382
3383/* Write inline summary for node in SET.
3384 Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
3385 active, we don't need to write them twice. */
3386
d2db2e6b
JH
3387static void
3388ipa_fn_summary_write (void)
27d020cf 3389{
0bceb671 3390 struct output_block *ob = create_output_block (LTO_section_ipa_fn_summary);
27d020cf
JH
3391 lto_symtab_encoder_t encoder = ob->decl_state->symtab_node_encoder;
3392 unsigned int count = 0;
3393 int i;
3394
3395 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
3396 {
3397 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
3398 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
3399 if (cnode && cnode->definition && !cnode->alias)
3400 count++;
3401 }
3402 streamer_write_uhwi (ob, count);
3403
3404 for (i = 0; i < lto_symtab_encoder_size (encoder); i++)
3405 {
3406 symtab_node *snode = lto_symtab_encoder_deref (encoder, i);
3407 cgraph_node *cnode = dyn_cast <cgraph_node *> (snode);
3408 if (cnode && cnode->definition && !cnode->alias)
3409 {
0bceb671 3410 struct ipa_fn_summary *info = ipa_fn_summaries->get (cnode);
27d020cf
JH
3411 struct bitpack_d bp;
3412 struct cgraph_edge *edge;
3413 int i;
3414 size_time_entry *e;
3415 struct condition *c;
3416
3417 streamer_write_uhwi (ob, lto_symtab_encoder_encode (encoder, cnode));
3418 streamer_write_hwi (ob, info->estimated_self_stack_size);
3419 streamer_write_hwi (ob, info->self_size);
3420 info->time.stream_out (ob);
3421 bp = bitpack_create (ob->main_stream);
3422 bp_pack_value (&bp, info->inlinable, 1);
3423 bp_pack_value (&bp, info->contains_cilk_spawn, 1);
3424 bp_pack_value (&bp, info->fp_expressions, 1);
3425 streamer_write_bitpack (&bp);
3426 streamer_write_uhwi (ob, vec_safe_length (info->conds));
3427 for (i = 0; vec_safe_iterate (info->conds, i, &c); i++)
3428 {
3429 streamer_write_uhwi (ob, c->operand_num);
3430 streamer_write_uhwi (ob, c->size);
3431 streamer_write_uhwi (ob, c->code);
3432 stream_write_tree (ob, c->val, true);
3433 bp = bitpack_create (ob->main_stream);
3434 bp_pack_value (&bp, c->agg_contents, 1);
3435 bp_pack_value (&bp, c->by_ref, 1);
3436 streamer_write_bitpack (&bp);
3437 if (c->agg_contents)
3438 streamer_write_uhwi (ob, c->offset);
3439 }
3440 streamer_write_uhwi (ob, vec_safe_length (info->size_time_table));
3441 for (i = 0; vec_safe_iterate (info->size_time_table, i, &e); i++)
3442 {
3443 streamer_write_uhwi (ob, e->size);
3444 e->time.stream_out (ob);
3445 e->exec_predicate.stream_out (ob);
3446 e->nonconst_predicate.stream_out (ob);
3447 }
3448 if (info->loop_iterations)
3449 info->loop_iterations->stream_out (ob);
3450 else
3451 streamer_write_uhwi (ob, 0);
3452 if (info->loop_stride)
3453 info->loop_stride->stream_out (ob);
3454 else
3455 streamer_write_uhwi (ob, 0);
3456 if (info->array_index)
3457 info->array_index->stream_out (ob);
3458 else
3459 streamer_write_uhwi (ob, 0);
3460 for (edge = cnode->callees; edge; edge = edge->next_callee)
3461 write_ipa_call_summary (ob, edge);
3462 for (edge = cnode->indirect_calls; edge; edge = edge->next_callee)
3463 write_ipa_call_summary (ob, edge);
3464 }
3465 }
3466 streamer_write_char_stream (ob->main_stream, 0);
3467 produce_asm (ob, NULL);
3468 destroy_output_block (ob);
3469
29f1e2b1 3470 if (!flag_ipa_cp)
27d020cf
JH
3471 ipa_prop_write_jump_functions ();
3472}
3473
3474
3475/* Release inline summary. */
3476
3477void
d2db2e6b 3478ipa_free_fn_summary (void)
27d020cf
JH
3479{
3480 struct cgraph_node *node;
3481 if (!ipa_call_summaries)
3482 return;
3483 FOR_EACH_DEFINED_FUNCTION (node)
3484 if (!node->alias)
0bceb671
JH
3485 ipa_fn_summaries->get (node)->reset (node);
3486 ipa_fn_summaries->release ();
3487 ipa_fn_summaries = NULL;
27d020cf
JH
3488 ipa_call_summaries->release ();
3489 delete ipa_call_summaries;
3490 ipa_call_summaries = NULL;
3491 edge_predicate_pool.release ();
3492}
d2db2e6b
JH
3493
3494namespace {
3495
3496const pass_data pass_data_local_fn_summary =
3497{
3498 GIMPLE_PASS, /* type */
3499 "local-fnsummary", /* name */
3500 OPTGROUP_INLINE, /* optinfo_flags */
3501 TV_INLINE_PARAMETERS, /* tv_id */
3502 0, /* properties_required */
3503 0, /* properties_provided */
3504 0, /* properties_destroyed */
3505 0, /* todo_flags_start */
3506 0, /* todo_flags_finish */
3507};
3508
3509class pass_local_fn_summary : public gimple_opt_pass
3510{
3511public:
3512 pass_local_fn_summary (gcc::context *ctxt)
3513 : gimple_opt_pass (pass_data_local_fn_summary, ctxt)
3514 {}
3515
3516 /* opt_pass methods: */
3517 opt_pass * clone () { return new pass_local_fn_summary (m_ctxt); }
3518 virtual unsigned int execute (function *)
3519 {
3520 return compute_fn_summary_for_current ();
3521 }
3522
3523}; // class pass_local_fn_summary
3524
3525} // anon namespace
3526
3527gimple_opt_pass *
3528make_pass_local_fn_summary (gcc::context *ctxt)
3529{
3530 return new pass_local_fn_summary (ctxt);
3531}
3532
3533
3534/* Free inline summary. */
3535
3536namespace {
3537
3538const pass_data pass_data_ipa_free_fn_summary =
3539{
3540 SIMPLE_IPA_PASS, /* type */
3541 "free-fnsummary", /* name */
3542 OPTGROUP_NONE, /* optinfo_flags */
3543 TV_IPA_FREE_INLINE_SUMMARY, /* tv_id */
3544 0, /* properties_required */
3545 0, /* properties_provided */
3546 0, /* properties_destroyed */
3547 0, /* todo_flags_start */
3548 /* Early optimizations may make function unreachable. We can not
3549 remove unreachable functions as part of the ealry opts pass because
3550 TODOs are run before subpasses. Do it here. */
3551 ( TODO_remove_functions | TODO_dump_symtab ), /* todo_flags_finish */
3552};
3553
3554class pass_ipa_free_fn_summary : public simple_ipa_opt_pass
3555{
3556public:
3557 pass_ipa_free_fn_summary (gcc::context *ctxt)
3558 : simple_ipa_opt_pass (pass_data_ipa_free_fn_summary, ctxt)
3559 {}
3560
3561 /* opt_pass methods: */
3562 virtual unsigned int execute (function *)
3563 {
3564 ipa_free_fn_summary ();
3565 return 0;
3566 }
3567
3568}; // class pass_ipa_free_fn_summary
3569
3570} // anon namespace
3571
3572simple_ipa_opt_pass *
3573make_pass_ipa_free_fn_summary (gcc::context *ctxt)
3574{
3575 return new pass_ipa_free_fn_summary (ctxt);
3576}
3577
3578namespace {
3579
3580const pass_data pass_data_ipa_fn_summary =
3581{
3582 IPA_PASS, /* type */
3583 "fnsummary", /* name */
3584 OPTGROUP_INLINE, /* optinfo_flags */
66447ef0 3585 TV_IPA_FNSUMMARY, /* tv_id */
d2db2e6b
JH
3586 0, /* properties_required */
3587 0, /* properties_provided */
3588 0, /* properties_destroyed */
3589 0, /* todo_flags_start */
3590 ( TODO_dump_symtab ), /* todo_flags_finish */
3591};
3592
3593class pass_ipa_fn_summary : public ipa_opt_pass_d
3594{
3595public:
3596 pass_ipa_fn_summary (gcc::context *ctxt)
3597 : ipa_opt_pass_d (pass_data_ipa_fn_summary, ctxt,
3598 ipa_fn_summary_generate, /* generate_summary */
3599 ipa_fn_summary_write, /* write_summary */
3600 ipa_fn_summary_read, /* read_summary */
3601 NULL, /* write_optimization_summary */
3602 NULL, /* read_optimization_summary */
3603 NULL, /* stmt_fixup */
3604 0, /* function_transform_todo_flags_start */
3605 NULL, /* function_transform */
3606 NULL) /* variable_transform */
3607 {}
3608
3609 /* opt_pass methods: */
3610 virtual unsigned int execute (function *) { return 0; }
3611
3612}; // class pass_ipa_fn_summary
3613
3614} // anon namespace
3615
3616ipa_opt_pass_d *
3617make_pass_ipa_fn_summary (gcc::context *ctxt)
3618{
3619 return new pass_ipa_fn_summary (ctxt);
3620}
de4381a4
DM
3621
3622/* Reset all state within ipa-fnsummary.c so that we can rerun the compiler
3623 within the same process. For use by toplev::finalize. */
3624
3625void
3626ipa_fnsummary_c_finalize (void)
3627{
3628 ipa_free_fn_summary ();
3629}