re PR driver/31353 (gcc --help=target gives a linker error.)
[official-gcc.git] / gcc / tree-inline.c
blob25844a6701bb11fb57ceda1d3749723308e2de00
1 /* Tree inlining.
2 Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Alexandre Oliva <aoliva@redhat.com>
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "toplev.h"
28 #include "tree.h"
29 #include "tree-inline.h"
30 #include "rtl.h"
31 #include "expr.h"
32 #include "flags.h"
33 #include "params.h"
34 #include "input.h"
35 #include "insn-config.h"
36 #include "varray.h"
37 #include "hashtab.h"
38 #include "langhooks.h"
39 #include "basic-block.h"
40 #include "tree-iterator.h"
41 #include "cgraph.h"
42 #include "intl.h"
43 #include "tree-mudflap.h"
44 #include "tree-flow.h"
45 #include "function.h"
46 #include "ggc.h"
47 #include "tree-flow.h"
48 #include "diagnostic.h"
49 #include "except.h"
50 #include "debug.h"
51 #include "pointer-set.h"
52 #include "ipa-prop.h"
53 #include "value-prof.h"
54 #include "tree-pass.h"
56 /* I'm not real happy about this, but we need to handle gimple and
57 non-gimple trees. */
58 #include "tree-gimple.h"
60 /* Inlining, Cloning, Versioning, Parallelization
62 Inlining: a function body is duplicated, but the PARM_DECLs are
63 remapped into VAR_DECLs, and non-void RETURN_EXPRs become
64 GIMPLE_MODIFY_STMTs that store to a dedicated returned-value variable.
65 The duplicated eh_region info of the copy will later be appended
66 to the info for the caller; the eh_region info in copied throwing
67 statements and RESX_EXPRs is adjusted accordingly.
69 Cloning: (only in C++) We have one body for a con/de/structor, and
70 multiple function decls, each with a unique parameter list.
71 Duplicate the body, using the given splay tree; some parameters
72 will become constants (like 0 or 1).
74 Versioning: a function body is duplicated and the result is a new
75 function rather than into blocks of an existing function as with
76 inlining. Some parameters will become constants.
78 Parallelization: a region of a function is duplicated resulting in
79 a new function. Variables may be replaced with complex expressions
80 to enable shared variable semantics.
82 All of these will simultaneously lookup any callgraph edges. If
83 we're going to inline the duplicated function body, and the given
84 function has some cloned callgraph nodes (one for each place this
85 function will be inlined) those callgraph edges will be duplicated.
86 If we're cloning the body, those callgraph edges will be
87 updated to point into the new body. (Note that the original
88 callgraph node and edge list will not be altered.)
90 See the CALL_EXPR handling case in copy_body_r (). */
92 /* 0 if we should not perform inlining.
93 1 if we should expand functions calls inline at the tree level.
94 2 if we should consider *all* functions to be inline
95 candidates. */
97 int flag_inline_trees = 0;
99 /* To Do:
101 o In order to make inlining-on-trees work, we pessimized
102 function-local static constants. In particular, they are now
103 always output, even when not addressed. Fix this by treating
104 function-local static constants just like global static
105 constants; the back-end already knows not to output them if they
106 are not needed.
108 o Provide heuristics to clamp inlining of recursive template
109 calls? */
112 /* Weights that estimate_num_insns uses for heuristics in inlining. */
114 eni_weights eni_inlining_weights;
116 /* Weights that estimate_num_insns uses to estimate the size of the
117 produced code. */
119 eni_weights eni_size_weights;
121 /* Weights that estimate_num_insns uses to estimate the time necessary
122 to execute the produced code. */
124 eni_weights eni_time_weights;
126 /* Prototypes. */
128 static tree declare_return_variable (copy_body_data *, tree, tree, tree *);
129 static tree copy_generic_body (copy_body_data *);
130 static bool inlinable_function_p (tree);
131 static void remap_block (tree *, copy_body_data *);
132 static tree remap_decls (tree, copy_body_data *);
133 static void copy_bind_expr (tree *, int *, copy_body_data *);
134 static tree mark_local_for_remap_r (tree *, int *, void *);
135 static void unsave_expr_1 (tree);
136 static tree unsave_r (tree *, int *, void *);
137 static void declare_inline_vars (tree, tree);
138 static void remap_save_expr (tree *, void *, int *);
139 static void add_lexical_block (tree current_block, tree new_block);
140 static tree copy_decl_to_var (tree, copy_body_data *);
141 static tree copy_result_decl_to_var (tree, copy_body_data *);
142 static tree copy_decl_no_change (tree, copy_body_data *);
143 static tree copy_decl_maybe_to_var (tree, copy_body_data *);
145 /* Insert a tree->tree mapping for ID. Despite the name suggests
146 that the trees should be variables, it is used for more than that. */
148 void
149 insert_decl_map (copy_body_data *id, tree key, tree value)
151 *pointer_map_insert (id->decl_map, key) = value;
153 /* Always insert an identity map as well. If we see this same new
154 node again, we won't want to duplicate it a second time. */
155 if (key != value)
156 *pointer_map_insert (id->decl_map, value) = value;
159 /* Construct new SSA name for old NAME. ID is the inline context. */
161 static tree
162 remap_ssa_name (tree name, copy_body_data *id)
164 tree new;
165 tree *n;
167 gcc_assert (TREE_CODE (name) == SSA_NAME);
169 n = (tree *) pointer_map_contains (id->decl_map, name);
170 if (n)
171 return *n;
173 /* Do not set DEF_STMT yet as statement is not copied yet. We do that
174 in copy_bb. */
175 new = remap_decl (SSA_NAME_VAR (name), id);
176 /* We might've substituted constant or another SSA_NAME for
177 the variable.
179 Replace the SSA name representing RESULT_DECL by variable during
180 inlining: this saves us from need to introduce PHI node in a case
181 return value is just partly initialized. */
182 if ((TREE_CODE (new) == VAR_DECL || TREE_CODE (new) == PARM_DECL)
183 && (TREE_CODE (SSA_NAME_VAR (name)) != RESULT_DECL
184 || !id->transform_return_to_modify))
186 new = make_ssa_name (new, NULL);
187 insert_decl_map (id, name, new);
188 if (IS_EMPTY_STMT (SSA_NAME_DEF_STMT (name)))
190 SSA_NAME_DEF_STMT (new) = build_empty_stmt ();
191 if (gimple_default_def (id->src_cfun, SSA_NAME_VAR (name)) == name)
192 set_default_def (SSA_NAME_VAR (new), new);
194 SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new)
195 = SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name);
196 TREE_TYPE (new) = TREE_TYPE (SSA_NAME_VAR (new));
198 else
199 insert_decl_map (id, name, new);
200 return new;
203 /* Remap DECL during the copying of the BLOCK tree for the function. */
205 tree
206 remap_decl (tree decl, copy_body_data *id)
208 tree *n;
209 tree fn;
211 /* We only remap local variables in the current function. */
212 fn = id->src_fn;
214 /* See if we have remapped this declaration. */
216 n = (tree *) pointer_map_contains (id->decl_map, decl);
218 /* If we didn't already have an equivalent for this declaration,
219 create one now. */
220 if (!n)
222 /* Make a copy of the variable or label. */
223 tree t = id->copy_decl (decl, id);
225 /* Remember it, so that if we encounter this local entity again
226 we can reuse this copy. Do this early because remap_type may
227 need this decl for TYPE_STUB_DECL. */
228 insert_decl_map (id, decl, t);
230 if (!DECL_P (t))
231 return t;
233 /* Remap types, if necessary. */
234 TREE_TYPE (t) = remap_type (TREE_TYPE (t), id);
235 if (TREE_CODE (t) == TYPE_DECL)
236 DECL_ORIGINAL_TYPE (t) = remap_type (DECL_ORIGINAL_TYPE (t), id);
238 /* Remap sizes as necessary. */
239 walk_tree (&DECL_SIZE (t), copy_body_r, id, NULL);
240 walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id, NULL);
242 /* If fields, do likewise for offset and qualifier. */
243 if (TREE_CODE (t) == FIELD_DECL)
245 walk_tree (&DECL_FIELD_OFFSET (t), copy_body_r, id, NULL);
246 if (TREE_CODE (DECL_CONTEXT (t)) == QUAL_UNION_TYPE)
247 walk_tree (&DECL_QUALIFIER (t), copy_body_r, id, NULL);
250 if (cfun && gimple_in_ssa_p (cfun)
251 && (TREE_CODE (t) == VAR_DECL
252 || TREE_CODE (t) == RESULT_DECL || TREE_CODE (t) == PARM_DECL))
254 tree def = gimple_default_def (id->src_cfun, decl);
255 get_var_ann (t);
256 if (TREE_CODE (decl) != PARM_DECL && def)
258 tree map = remap_ssa_name (def, id);
259 /* Watch out RESULT_DECLs whose SSA names map directly
260 to them. */
261 if (TREE_CODE (map) == SSA_NAME)
262 set_default_def (t, map);
264 add_referenced_var (t);
266 return t;
269 return unshare_expr (*n);
272 static tree
273 remap_type_1 (tree type, copy_body_data *id)
275 tree *node;
276 tree new, t;
278 if (type == NULL)
279 return type;
281 /* See if we have remapped this type. */
282 node = (tree *) pointer_map_contains (id->decl_map, type);
283 if (node)
284 return *node;
286 /* The type only needs remapping if it's variably modified. */
287 if (! variably_modified_type_p (type, id->src_fn))
289 insert_decl_map (id, type, type);
290 return type;
293 /* We do need a copy. build and register it now. If this is a pointer or
294 reference type, remap the designated type and make a new pointer or
295 reference type. */
296 if (TREE_CODE (type) == POINTER_TYPE)
298 new = build_pointer_type_for_mode (remap_type (TREE_TYPE (type), id),
299 TYPE_MODE (type),
300 TYPE_REF_CAN_ALIAS_ALL (type));
301 insert_decl_map (id, type, new);
302 return new;
304 else if (TREE_CODE (type) == REFERENCE_TYPE)
306 new = build_reference_type_for_mode (remap_type (TREE_TYPE (type), id),
307 TYPE_MODE (type),
308 TYPE_REF_CAN_ALIAS_ALL (type));
309 insert_decl_map (id, type, new);
310 return new;
312 else
313 new = copy_node (type);
315 insert_decl_map (id, type, new);
317 /* This is a new type, not a copy of an old type. Need to reassociate
318 variants. We can handle everything except the main variant lazily. */
319 t = TYPE_MAIN_VARIANT (type);
320 if (type != t)
322 t = remap_type (t, id);
323 TYPE_MAIN_VARIANT (new) = t;
324 TYPE_NEXT_VARIANT (new) = TYPE_MAIN_VARIANT (t);
325 TYPE_NEXT_VARIANT (t) = new;
327 else
329 TYPE_MAIN_VARIANT (new) = new;
330 TYPE_NEXT_VARIANT (new) = NULL;
333 if (TYPE_STUB_DECL (type))
334 TYPE_STUB_DECL (new) = remap_decl (TYPE_STUB_DECL (type), id);
336 /* Lazily create pointer and reference types. */
337 TYPE_POINTER_TO (new) = NULL;
338 TYPE_REFERENCE_TO (new) = NULL;
340 switch (TREE_CODE (new))
342 case INTEGER_TYPE:
343 case REAL_TYPE:
344 case ENUMERAL_TYPE:
345 case BOOLEAN_TYPE:
346 t = TYPE_MIN_VALUE (new);
347 if (t && TREE_CODE (t) != INTEGER_CST)
348 walk_tree (&TYPE_MIN_VALUE (new), copy_body_r, id, NULL);
350 t = TYPE_MAX_VALUE (new);
351 if (t && TREE_CODE (t) != INTEGER_CST)
352 walk_tree (&TYPE_MAX_VALUE (new), copy_body_r, id, NULL);
353 return new;
355 case FUNCTION_TYPE:
356 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
357 walk_tree (&TYPE_ARG_TYPES (new), copy_body_r, id, NULL);
358 return new;
360 case ARRAY_TYPE:
361 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
362 TYPE_DOMAIN (new) = remap_type (TYPE_DOMAIN (new), id);
363 break;
365 case RECORD_TYPE:
366 case UNION_TYPE:
367 case QUAL_UNION_TYPE:
369 tree f, nf = NULL;
371 for (f = TYPE_FIELDS (new); f ; f = TREE_CHAIN (f))
373 t = remap_decl (f, id);
374 DECL_CONTEXT (t) = new;
375 TREE_CHAIN (t) = nf;
376 nf = t;
378 TYPE_FIELDS (new) = nreverse (nf);
380 break;
382 case OFFSET_TYPE:
383 default:
384 /* Shouldn't have been thought variable sized. */
385 gcc_unreachable ();
388 walk_tree (&TYPE_SIZE (new), copy_body_r, id, NULL);
389 walk_tree (&TYPE_SIZE_UNIT (new), copy_body_r, id, NULL);
391 return new;
394 tree
395 remap_type (tree type, copy_body_data *id)
397 tree *node;
399 if (type == NULL)
400 return type;
402 /* See if we have remapped this type. */
403 node = (tree *) pointer_map_contains (id->decl_map, type);
404 if (node)
405 return *node;
407 /* The type only needs remapping if it's variably modified. */
408 if (! variably_modified_type_p (type, id->src_fn))
410 insert_decl_map (id, type, type);
411 return type;
414 return remap_type_1 (type, id);
417 static tree
418 remap_decls (tree decls, copy_body_data *id)
420 tree old_var;
421 tree new_decls = NULL_TREE;
423 /* Remap its variables. */
424 for (old_var = decls; old_var; old_var = TREE_CHAIN (old_var))
426 tree new_var;
428 /* We can not chain the local static declarations into the unexpanded_var_list
429 as we can't duplicate them or break one decl rule. Go ahead and link
430 them into unexpanded_var_list. */
431 if (!lang_hooks.tree_inlining.auto_var_in_fn_p (old_var, id->src_fn)
432 && !DECL_EXTERNAL (old_var))
434 cfun->unexpanded_var_list = tree_cons (NULL_TREE, old_var,
435 cfun->unexpanded_var_list);
436 continue;
439 /* Remap the variable. */
440 new_var = remap_decl (old_var, id);
442 /* If we didn't remap this variable, so we can't mess with its
443 TREE_CHAIN. If we remapped this variable to the return slot, it's
444 already declared somewhere else, so don't declare it here. */
445 if (!new_var || new_var == id->retvar)
447 else
449 gcc_assert (DECL_P (new_var));
450 TREE_CHAIN (new_var) = new_decls;
451 new_decls = new_var;
455 return nreverse (new_decls);
458 /* Copy the BLOCK to contain remapped versions of the variables
459 therein. And hook the new block into the block-tree. */
461 static void
462 remap_block (tree *block, copy_body_data *id)
464 tree old_block;
465 tree new_block;
466 tree fn;
468 /* Make the new block. */
469 old_block = *block;
470 new_block = make_node (BLOCK);
471 TREE_USED (new_block) = TREE_USED (old_block);
472 BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
473 BLOCK_SOURCE_LOCATION (new_block) = BLOCK_SOURCE_LOCATION (old_block);
474 *block = new_block;
476 /* Remap its variables. */
477 BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block), id);
479 fn = id->dst_fn;
481 if (id->transform_lang_insert_block)
482 lang_hooks.decls.insert_block (new_block);
484 /* Remember the remapped block. */
485 insert_decl_map (id, old_block, new_block);
488 /* Copy the whole block tree and root it in id->block. */
489 static tree
490 remap_blocks (tree block, copy_body_data *id)
492 tree t;
493 tree new = block;
495 if (!block)
496 return NULL;
498 remap_block (&new, id);
499 gcc_assert (new != block);
500 for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
501 add_lexical_block (new, remap_blocks (t, id));
502 return new;
505 static void
506 copy_statement_list (tree *tp)
508 tree_stmt_iterator oi, ni;
509 tree new;
511 new = alloc_stmt_list ();
512 ni = tsi_start (new);
513 oi = tsi_start (*tp);
514 *tp = new;
516 for (; !tsi_end_p (oi); tsi_next (&oi))
517 tsi_link_after (&ni, tsi_stmt (oi), TSI_NEW_STMT);
520 static void
521 copy_bind_expr (tree *tp, int *walk_subtrees, copy_body_data *id)
523 tree block = BIND_EXPR_BLOCK (*tp);
524 /* Copy (and replace) the statement. */
525 copy_tree_r (tp, walk_subtrees, NULL);
526 if (block)
528 remap_block (&block, id);
529 BIND_EXPR_BLOCK (*tp) = block;
532 if (BIND_EXPR_VARS (*tp))
533 /* This will remap a lot of the same decls again, but this should be
534 harmless. */
535 BIND_EXPR_VARS (*tp) = remap_decls (BIND_EXPR_VARS (*tp), id);
538 /* Called from copy_body_id via walk_tree. DATA is really an
539 `copy_body_data *'. */
541 tree
542 copy_body_r (tree *tp, int *walk_subtrees, void *data)
544 copy_body_data *id = (copy_body_data *) data;
545 tree fn = id->src_fn;
546 tree new_block;
548 /* Begin by recognizing trees that we'll completely rewrite for the
549 inlining context. Our output for these trees is completely
550 different from out input (e.g. RETURN_EXPR is deleted, and morphs
551 into an edge). Further down, we'll handle trees that get
552 duplicated and/or tweaked. */
554 /* When requested, RETURN_EXPRs should be transformed to just the
555 contained GIMPLE_MODIFY_STMT. The branch semantics of the return will
556 be handled elsewhere by manipulating the CFG rather than a statement. */
557 if (TREE_CODE (*tp) == RETURN_EXPR && id->transform_return_to_modify)
559 tree assignment = TREE_OPERAND (*tp, 0);
561 /* If we're returning something, just turn that into an
562 assignment into the equivalent of the original RESULT_DECL.
563 If the "assignment" is just the result decl, the result
564 decl has already been set (e.g. a recent "foo (&result_decl,
565 ...)"); just toss the entire RETURN_EXPR. */
566 if (assignment && TREE_CODE (assignment) == GIMPLE_MODIFY_STMT)
568 /* Replace the RETURN_EXPR with (a copy of) the
569 GIMPLE_MODIFY_STMT hanging underneath. */
570 *tp = copy_node (assignment);
572 else /* Else the RETURN_EXPR returns no value. */
574 *tp = NULL;
575 return (tree) (void *)1;
578 else if (TREE_CODE (*tp) == SSA_NAME)
580 *tp = remap_ssa_name (*tp, id);
581 *walk_subtrees = 0;
582 return NULL;
585 /* Local variables and labels need to be replaced by equivalent
586 variables. We don't want to copy static variables; there's only
587 one of those, no matter how many times we inline the containing
588 function. Similarly for globals from an outer function. */
589 else if (lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
591 tree new_decl;
593 /* Remap the declaration. */
594 new_decl = remap_decl (*tp, id);
595 gcc_assert (new_decl);
596 /* Replace this variable with the copy. */
597 STRIP_TYPE_NOPS (new_decl);
598 *tp = new_decl;
599 *walk_subtrees = 0;
601 else if (TREE_CODE (*tp) == STATEMENT_LIST)
602 copy_statement_list (tp);
603 else if (TREE_CODE (*tp) == SAVE_EXPR)
604 remap_save_expr (tp, id->decl_map, walk_subtrees);
605 else if (TREE_CODE (*tp) == LABEL_DECL
606 && (! DECL_CONTEXT (*tp)
607 || decl_function_context (*tp) == id->src_fn))
608 /* These may need to be remapped for EH handling. */
609 *tp = remap_decl (*tp, id);
610 else if (TREE_CODE (*tp) == BIND_EXPR)
611 copy_bind_expr (tp, walk_subtrees, id);
612 /* Types may need remapping as well. */
613 else if (TYPE_P (*tp))
614 *tp = remap_type (*tp, id);
616 /* If this is a constant, we have to copy the node iff the type will be
617 remapped. copy_tree_r will not copy a constant. */
618 else if (CONSTANT_CLASS_P (*tp))
620 tree new_type = remap_type (TREE_TYPE (*tp), id);
622 if (new_type == TREE_TYPE (*tp))
623 *walk_subtrees = 0;
625 else if (TREE_CODE (*tp) == INTEGER_CST)
626 *tp = build_int_cst_wide (new_type, TREE_INT_CST_LOW (*tp),
627 TREE_INT_CST_HIGH (*tp));
628 else
630 *tp = copy_node (*tp);
631 TREE_TYPE (*tp) = new_type;
635 /* Otherwise, just copy the node. Note that copy_tree_r already
636 knows not to copy VAR_DECLs, etc., so this is safe. */
637 else
639 /* Here we handle trees that are not completely rewritten.
640 First we detect some inlining-induced bogosities for
641 discarding. */
642 if (TREE_CODE (*tp) == GIMPLE_MODIFY_STMT
643 && GIMPLE_STMT_OPERAND (*tp, 0) == GIMPLE_STMT_OPERAND (*tp, 1)
644 && (lang_hooks.tree_inlining.auto_var_in_fn_p
645 (GIMPLE_STMT_OPERAND (*tp, 0), fn)))
647 /* Some assignments VAR = VAR; don't generate any rtl code
648 and thus don't count as variable modification. Avoid
649 keeping bogosities like 0 = 0. */
650 tree decl = GIMPLE_STMT_OPERAND (*tp, 0), value;
651 tree *n;
653 n = (tree *) pointer_map_contains (id->decl_map, decl);
654 if (n)
656 value = *n;
657 STRIP_TYPE_NOPS (value);
658 if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
660 *tp = build_empty_stmt ();
661 return copy_body_r (tp, walk_subtrees, data);
665 else if (TREE_CODE (*tp) == INDIRECT_REF)
667 /* Get rid of *& from inline substitutions that can happen when a
668 pointer argument is an ADDR_EXPR. */
669 tree decl = TREE_OPERAND (*tp, 0);
670 tree *n;
672 n = (tree *) pointer_map_contains (id->decl_map, decl);
673 if (n)
675 tree new;
676 tree old;
677 /* If we happen to get an ADDR_EXPR in n->value, strip
678 it manually here as we'll eventually get ADDR_EXPRs
679 which lie about their types pointed to. In this case
680 build_fold_indirect_ref wouldn't strip the INDIRECT_REF,
681 but we absolutely rely on that. As fold_indirect_ref
682 does other useful transformations, try that first, though. */
683 tree type = TREE_TYPE (TREE_TYPE (*n));
684 new = unshare_expr (*n);
685 old = *tp;
686 *tp = fold_indirect_ref_1 (type, new);
687 if (! *tp)
689 if (TREE_CODE (new) == ADDR_EXPR)
690 *tp = TREE_OPERAND (new, 0);
691 else
693 *tp = build1 (INDIRECT_REF, type, new);
694 TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
697 *walk_subtrees = 0;
698 return NULL;
702 /* Here is the "usual case". Copy this tree node, and then
703 tweak some special cases. */
704 copy_tree_r (tp, walk_subtrees, NULL);
706 /* Global variables we didn't seen yet needs to go into referenced
707 vars. */
708 if (gimple_in_ssa_p (cfun) && TREE_CODE (*tp) == VAR_DECL)
709 add_referenced_var (*tp);
711 /* If EXPR has block defined, map it to newly constructed block.
712 When inlining we want EXPRs without block appear in the block
713 of function call. */
714 if (EXPR_P (*tp) || GIMPLE_STMT_P (*tp))
716 new_block = id->block;
717 if (TREE_BLOCK (*tp))
719 tree *n;
720 n = (tree *) pointer_map_contains (id->decl_map,
721 TREE_BLOCK (*tp));
722 gcc_assert (n);
723 new_block = *n;
725 TREE_BLOCK (*tp) = new_block;
728 if (TREE_CODE (*tp) == RESX_EXPR && id->eh_region_offset)
729 TREE_OPERAND (*tp, 0) =
730 build_int_cst
731 (NULL_TREE,
732 id->eh_region_offset + TREE_INT_CST_LOW (TREE_OPERAND (*tp, 0)));
734 if (!GIMPLE_TUPLE_P (*tp))
735 TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
737 /* The copied TARGET_EXPR has never been expanded, even if the
738 original node was expanded already. */
739 if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
741 TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
742 TREE_OPERAND (*tp, 3) = NULL_TREE;
745 /* Variable substitution need not be simple. In particular, the
746 INDIRECT_REF substitution above. Make sure that TREE_CONSTANT
747 and friends are up-to-date. */
748 else if (TREE_CODE (*tp) == ADDR_EXPR)
750 walk_tree (&TREE_OPERAND (*tp, 0), copy_body_r, id, NULL);
751 /* Handle the case where we substituted an INDIRECT_REF
752 into the operand of the ADDR_EXPR. */
753 if (TREE_CODE (TREE_OPERAND (*tp, 0)) == INDIRECT_REF)
754 *tp = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0);
755 else
756 recompute_tree_invariant_for_addr_expr (*tp);
757 *walk_subtrees = 0;
761 /* Keep iterating. */
762 return NULL_TREE;
765 /* Copy basic block, scale profile accordingly. Edges will be taken care of
766 later */
768 static basic_block
769 copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, int count_scale)
771 block_stmt_iterator bsi, copy_bsi;
772 basic_block copy_basic_block;
774 /* create_basic_block() will append every new block to
775 basic_block_info automatically. */
776 copy_basic_block = create_basic_block (NULL, (void *) 0,
777 (basic_block) bb->prev_bb->aux);
778 copy_basic_block->count = bb->count * count_scale / REG_BR_PROB_BASE;
780 /* We are going to rebuild frequencies from scratch. These values have just
781 small importance to drive canonicalize_loop_headers. */
782 copy_basic_block->frequency = ((gcov_type)bb->frequency
783 * frequency_scale / REG_BR_PROB_BASE);
784 if (copy_basic_block->frequency > BB_FREQ_MAX)
785 copy_basic_block->frequency = BB_FREQ_MAX;
786 copy_bsi = bsi_start (copy_basic_block);
788 for (bsi = bsi_start (bb);
789 !bsi_end_p (bsi); bsi_next (&bsi))
791 tree stmt = bsi_stmt (bsi);
792 tree orig_stmt = stmt;
794 walk_tree (&stmt, copy_body_r, id, NULL);
796 /* RETURN_EXPR might be removed,
797 this is signalled by making stmt pointer NULL. */
798 if (stmt)
800 tree call, decl;
802 gimple_duplicate_stmt_histograms (cfun, stmt, id->src_cfun, orig_stmt);
804 /* With return slot optimization we can end up with
805 non-gimple (foo *)&this->m, fix that here. */
806 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
807 && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 1)) == NOP_EXPR
808 && !is_gimple_val (TREE_OPERAND (GIMPLE_STMT_OPERAND (stmt, 1), 0)))
809 gimplify_stmt (&stmt);
811 bsi_insert_after (&copy_bsi, stmt, BSI_NEW_STMT);
813 /* Process new statement. gimplify_stmt possibly turned statement
814 into multiple statements, we need to process all of them. */
815 while (!bsi_end_p (copy_bsi))
817 stmt = bsi_stmt (copy_bsi);
818 call = get_call_expr_in (stmt);
820 /* Statements produced by inlining can be unfolded, especially
821 when we constant propagated some operands. We can't fold
822 them right now for two reasons:
823 1) folding require SSA_NAME_DEF_STMTs to be correct
824 2) we can't change function calls to builtins.
825 So we just mark statement for later folding. We mark
826 all new statements, instead just statements that has changed
827 by some nontrivial substitution so even statements made
828 foldable indirectly are updated. If this turns out to be
829 expensive, copy_body can be told to watch for nontrivial
830 changes. */
831 if (id->statements_to_fold)
832 pointer_set_insert (id->statements_to_fold, stmt);
833 /* We're duplicating a CALL_EXPR. Find any corresponding
834 callgraph edges and update or duplicate them. */
835 if (call && (decl = get_callee_fndecl (call)))
837 struct cgraph_node *node;
838 struct cgraph_edge *edge;
840 switch (id->transform_call_graph_edges)
842 case CB_CGE_DUPLICATE:
843 edge = cgraph_edge (id->src_node, orig_stmt);
844 if (edge)
845 cgraph_clone_edge (edge, id->dst_node, stmt,
846 REG_BR_PROB_BASE, 1, edge->frequency, true);
847 break;
849 case CB_CGE_MOVE_CLONES:
850 for (node = id->dst_node->next_clone;
851 node;
852 node = node->next_clone)
854 edge = cgraph_edge (node, orig_stmt);
855 gcc_assert (edge);
856 cgraph_set_call_stmt (edge, stmt);
858 /* FALLTHRU */
860 case CB_CGE_MOVE:
861 edge = cgraph_edge (id->dst_node, orig_stmt);
862 if (edge)
863 cgraph_set_call_stmt (edge, stmt);
864 break;
866 default:
867 gcc_unreachable ();
870 /* If you think we can abort here, you are wrong.
871 There is no region 0 in tree land. */
872 gcc_assert (lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt)
873 != 0);
875 if (tree_could_throw_p (stmt)
876 /* When we are cloning for inlining, we are supposed to
877 construct a clone that calls precisely the same functions
878 as original. However IPA optimizers might've proved
879 earlier some function calls as non-trapping that might
880 render some basic blocks dead that might become
881 unreachable.
883 We can't update SSA with unreachable blocks in CFG and thus
884 we prevent the scenario by preserving even the "dead" eh
885 edges until the point they are later removed by
886 fixup_cfg pass. */
887 || (id->transform_call_graph_edges == CB_CGE_MOVE_CLONES
888 && lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt) > 0))
890 int region = lookup_stmt_eh_region_fn (id->src_cfun, orig_stmt);
891 /* Add an entry for the copied tree in the EH hashtable.
892 When cloning or versioning, use the hashtable in
893 cfun, and just copy the EH number. When inlining, use the
894 hashtable in the caller, and adjust the region number. */
895 if (region > 0)
896 add_stmt_to_eh_region (stmt, region + id->eh_region_offset);
898 /* If this tree doesn't have a region associated with it,
899 and there is a "current region,"
900 then associate this tree with the current region
901 and add edges associated with this region. */
902 if ((lookup_stmt_eh_region_fn (id->src_cfun,
903 orig_stmt) <= 0
904 && id->eh_region > 0)
905 && tree_could_throw_p (stmt))
906 add_stmt_to_eh_region (stmt, id->eh_region);
908 if (gimple_in_ssa_p (cfun))
910 ssa_op_iter i;
911 tree def;
913 find_new_referenced_vars (bsi_stmt_ptr (copy_bsi));
914 FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF)
915 if (TREE_CODE (def) == SSA_NAME)
916 SSA_NAME_DEF_STMT (def) = stmt;
918 bsi_next (&copy_bsi);
920 copy_bsi = bsi_last (copy_basic_block);
923 return copy_basic_block;
926 /* Inserting Single Entry Multiple Exit region in SSA form into code in SSA
927 form is quite easy, since dominator relationship for old basic blocks does
928 not change.
930 There is however exception where inlining might change dominator relation
931 across EH edges from basic block within inlined functions destinating
932 to landing pads in function we inline into.
934 The function mark PHI_RESULT of such PHI nodes for renaming; it is
935 safe the EH edges are abnormal and SSA_NAME_OCCURS_IN_ABNORMAL_PHI
936 must be set. This means, that there will be no overlapping live ranges
937 for the underlying symbol.
939 This might change in future if we allow redirecting of EH edges and
940 we might want to change way build CFG pre-inlining to include
941 all the possible edges then. */
942 static void
943 update_ssa_across_eh_edges (basic_block bb)
945 edge e;
946 edge_iterator ei;
948 FOR_EACH_EDGE (e, ei, bb->succs)
949 if (!e->dest->aux
950 || ((basic_block)e->dest->aux)->index == ENTRY_BLOCK)
952 tree phi;
954 gcc_assert (e->flags & EDGE_EH);
955 for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi))
957 gcc_assert (SSA_NAME_OCCURS_IN_ABNORMAL_PHI
958 (PHI_RESULT (phi)));
959 mark_sym_for_renaming
960 (SSA_NAME_VAR (PHI_RESULT (phi)));
965 /* Copy edges from BB into its copy constructed earlier, scale profile
966 accordingly. Edges will be taken care of later. Assume aux
967 pointers to point to the copies of each BB. */
968 static void
969 copy_edges_for_bb (basic_block bb, int count_scale)
971 basic_block new_bb = (basic_block) bb->aux;
972 edge_iterator ei;
973 edge old_edge;
974 block_stmt_iterator bsi;
975 int flags;
977 /* Use the indices from the original blocks to create edges for the
978 new ones. */
979 FOR_EACH_EDGE (old_edge, ei, bb->succs)
980 if (!(old_edge->flags & EDGE_EH))
982 edge new;
984 flags = old_edge->flags;
986 /* Return edges do get a FALLTHRU flag when the get inlined. */
987 if (old_edge->dest->index == EXIT_BLOCK && !old_edge->flags
988 && old_edge->dest->aux != EXIT_BLOCK_PTR)
989 flags |= EDGE_FALLTHRU;
990 new = make_edge (new_bb, (basic_block) old_edge->dest->aux, flags);
991 new->count = old_edge->count * count_scale / REG_BR_PROB_BASE;
992 new->probability = old_edge->probability;
995 if (bb->index == ENTRY_BLOCK || bb->index == EXIT_BLOCK)
996 return;
998 for (bsi = bsi_start (new_bb); !bsi_end_p (bsi);)
1000 tree copy_stmt;
1002 copy_stmt = bsi_stmt (bsi);
1003 update_stmt (copy_stmt);
1004 if (gimple_in_ssa_p (cfun))
1005 mark_symbols_for_renaming (copy_stmt);
1006 /* Do this before the possible split_block. */
1007 bsi_next (&bsi);
1009 /* If this tree could throw an exception, there are two
1010 cases where we need to add abnormal edge(s): the
1011 tree wasn't in a region and there is a "current
1012 region" in the caller; or the original tree had
1013 EH edges. In both cases split the block after the tree,
1014 and add abnormal edge(s) as needed; we need both
1015 those from the callee and the caller.
1016 We check whether the copy can throw, because the const
1017 propagation can change an INDIRECT_REF which throws
1018 into a COMPONENT_REF which doesn't. If the copy
1019 can throw, the original could also throw. */
1021 if (tree_can_throw_internal (copy_stmt))
1023 if (!bsi_end_p (bsi))
1024 /* Note that bb's predecessor edges aren't necessarily
1025 right at this point; split_block doesn't care. */
1027 edge e = split_block (new_bb, copy_stmt);
1029 new_bb = e->dest;
1030 new_bb->aux = e->src->aux;
1031 bsi = bsi_start (new_bb);
1034 make_eh_edges (copy_stmt);
1036 if (gimple_in_ssa_p (cfun))
1037 update_ssa_across_eh_edges (bb_for_stmt (copy_stmt));
1042 /* Copy the PHIs. All blocks and edges are copied, some blocks
1043 was possibly split and new outgoing EH edges inserted.
1044 BB points to the block of original function and AUX pointers links
1045 the original and newly copied blocks. */
1047 static void
1048 copy_phis_for_bb (basic_block bb, copy_body_data *id)
1050 basic_block new_bb = bb->aux;
1051 edge_iterator ei;
1052 tree phi;
1054 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
1056 tree res = PHI_RESULT (phi);
1057 tree new_res = res;
1058 tree new_phi;
1059 edge new_edge;
1061 if (is_gimple_reg (res))
1063 walk_tree (&new_res, copy_body_r, id, NULL);
1064 SSA_NAME_DEF_STMT (new_res)
1065 = new_phi = create_phi_node (new_res, new_bb);
1066 FOR_EACH_EDGE (new_edge, ei, new_bb->preds)
1068 edge old_edge = find_edge (new_edge->src->aux, bb);
1069 tree arg = PHI_ARG_DEF_FROM_EDGE (phi, old_edge);
1070 tree new_arg = arg;
1072 walk_tree (&new_arg, copy_body_r, id, NULL);
1073 gcc_assert (new_arg);
1074 add_phi_arg (new_phi, new_arg, new_edge);
1080 /* Wrapper for remap_decl so it can be used as a callback. */
1081 static tree
1082 remap_decl_1 (tree decl, void *data)
1084 return remap_decl (decl, (copy_body_data *) data);
1087 /* Build struct function and associated datastructures for the new clone
1088 NEW_FNDECL to be build. CALLEE_FNDECL is the original */
1090 static void
1091 initialize_cfun (tree new_fndecl, tree callee_fndecl, gcov_type count,
1092 int frequency)
1094 struct function *new_cfun
1095 = (struct function *) ggc_alloc_cleared (sizeof (struct function));
1096 struct function *src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
1097 int count_scale, frequency_scale;
1099 if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count)
1100 count_scale = (REG_BR_PROB_BASE * count
1101 / ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count);
1102 else
1103 count_scale = 1;
1105 if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency)
1106 frequency_scale = (REG_BR_PROB_BASE * frequency
1108 ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency);
1109 else
1110 frequency_scale = count_scale;
1112 /* Register specific tree functions. */
1113 tree_register_cfg_hooks ();
1114 *new_cfun = *DECL_STRUCT_FUNCTION (callee_fndecl);
1115 new_cfun->funcdef_no = get_next_funcdef_no ();
1116 VALUE_HISTOGRAMS (new_cfun) = NULL;
1117 new_cfun->unexpanded_var_list = NULL;
1118 new_cfun->cfg = NULL;
1119 new_cfun->decl = new_fndecl /*= copy_node (callee_fndecl)*/;
1120 new_cfun->ib_boundaries_block = NULL;
1121 DECL_STRUCT_FUNCTION (new_fndecl) = new_cfun;
1122 push_cfun (new_cfun);
1123 init_empty_tree_cfg ();
1125 ENTRY_BLOCK_PTR->count =
1126 (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count * count_scale /
1127 REG_BR_PROB_BASE);
1128 ENTRY_BLOCK_PTR->frequency =
1129 (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency *
1130 frequency_scale / REG_BR_PROB_BASE);
1131 EXIT_BLOCK_PTR->count =
1132 (EXIT_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count * count_scale /
1133 REG_BR_PROB_BASE);
1134 EXIT_BLOCK_PTR->frequency =
1135 (EXIT_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency *
1136 frequency_scale / REG_BR_PROB_BASE);
1137 if (src_cfun->eh)
1138 init_eh_for_function ();
1140 if (src_cfun->gimple_df)
1142 init_tree_ssa ();
1143 cfun->gimple_df->in_ssa_p = true;
1144 init_ssa_operands ();
1146 pop_cfun ();
1149 /* Make a copy of the body of FN so that it can be inserted inline in
1150 another function. Walks FN via CFG, returns new fndecl. */
1152 static tree
1153 copy_cfg_body (copy_body_data * id, gcov_type count, int frequency,
1154 basic_block entry_block_map, basic_block exit_block_map)
1156 tree callee_fndecl = id->src_fn;
1157 /* Original cfun for the callee, doesn't change. */
1158 struct function *src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
1159 struct function *cfun_to_copy;
1160 basic_block bb;
1161 tree new_fndecl = NULL;
1162 int count_scale, frequency_scale;
1163 int last;
1165 if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count)
1166 count_scale = (REG_BR_PROB_BASE * count
1167 / ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->count);
1168 else
1169 count_scale = 1;
1171 if (ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency)
1172 frequency_scale = (REG_BR_PROB_BASE * frequency
1174 ENTRY_BLOCK_PTR_FOR_FUNCTION (src_cfun)->frequency);
1175 else
1176 frequency_scale = count_scale;
1178 /* Register specific tree functions. */
1179 tree_register_cfg_hooks ();
1181 /* Must have a CFG here at this point. */
1182 gcc_assert (ENTRY_BLOCK_PTR_FOR_FUNCTION
1183 (DECL_STRUCT_FUNCTION (callee_fndecl)));
1185 cfun_to_copy = id->src_cfun = DECL_STRUCT_FUNCTION (callee_fndecl);
1188 ENTRY_BLOCK_PTR_FOR_FUNCTION (cfun_to_copy)->aux = entry_block_map;
1189 EXIT_BLOCK_PTR_FOR_FUNCTION (cfun_to_copy)->aux = exit_block_map;
1190 entry_block_map->aux = ENTRY_BLOCK_PTR_FOR_FUNCTION (cfun_to_copy);
1191 exit_block_map->aux = EXIT_BLOCK_PTR_FOR_FUNCTION (cfun_to_copy);
1193 /* Duplicate any exception-handling regions. */
1194 if (cfun->eh)
1196 id->eh_region_offset
1197 = duplicate_eh_regions (cfun_to_copy, remap_decl_1, id,
1198 0, id->eh_region);
1200 /* Use aux pointers to map the original blocks to copy. */
1201 FOR_EACH_BB_FN (bb, cfun_to_copy)
1203 basic_block new = copy_bb (id, bb, frequency_scale, count_scale);
1204 bb->aux = new;
1205 new->aux = bb;
1208 last = n_basic_blocks;
1209 /* Now that we've duplicated the blocks, duplicate their edges. */
1210 FOR_ALL_BB_FN (bb, cfun_to_copy)
1211 copy_edges_for_bb (bb, count_scale);
1212 if (gimple_in_ssa_p (cfun))
1213 FOR_ALL_BB_FN (bb, cfun_to_copy)
1214 copy_phis_for_bb (bb, id);
1215 FOR_ALL_BB_FN (bb, cfun_to_copy)
1217 ((basic_block)bb->aux)->aux = NULL;
1218 bb->aux = NULL;
1220 /* Zero out AUX fields of newly created block during EH edge
1221 insertion. */
1222 for (; last < n_basic_blocks; last++)
1223 BASIC_BLOCK (last)->aux = NULL;
1224 entry_block_map->aux = NULL;
1225 exit_block_map->aux = NULL;
1227 return new_fndecl;
1230 /* Make a copy of the body of FN so that it can be inserted inline in
1231 another function. */
1233 static tree
1234 copy_generic_body (copy_body_data *id)
1236 tree body;
1237 tree fndecl = id->src_fn;
1239 body = DECL_SAVED_TREE (fndecl);
1240 walk_tree (&body, copy_body_r, id, NULL);
1242 return body;
1245 static tree
1246 copy_body (copy_body_data *id, gcov_type count, int frequency,
1247 basic_block entry_block_map, basic_block exit_block_map)
1249 tree fndecl = id->src_fn;
1250 tree body;
1252 /* If this body has a CFG, walk CFG and copy. */
1253 gcc_assert (ENTRY_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION (fndecl)));
1254 body = copy_cfg_body (id, count, frequency, entry_block_map, exit_block_map);
1256 return body;
1259 /* Return true if VALUE is an ADDR_EXPR of an automatic variable
1260 defined in function FN, or of a data member thereof. */
1262 static bool
1263 self_inlining_addr_expr (tree value, tree fn)
1265 tree var;
1267 if (TREE_CODE (value) != ADDR_EXPR)
1268 return false;
1270 var = get_base_address (TREE_OPERAND (value, 0));
1272 return var && lang_hooks.tree_inlining.auto_var_in_fn_p (var, fn);
1275 static void
1276 setup_one_parameter (copy_body_data *id, tree p, tree value, tree fn,
1277 basic_block bb, tree *vars)
1279 tree init_stmt;
1280 tree var;
1281 tree var_sub;
1282 tree rhs = value ? fold_convert (TREE_TYPE (p), value) : NULL;
1283 tree def = (gimple_in_ssa_p (cfun)
1284 ? gimple_default_def (id->src_cfun, p) : NULL);
1286 /* If the parameter is never assigned to, has no SSA_NAMEs created,
1287 we may not need to create a new variable here at all. Instead, we may
1288 be able to just use the argument value. */
1289 if (TREE_READONLY (p)
1290 && !TREE_ADDRESSABLE (p)
1291 && value && !TREE_SIDE_EFFECTS (value)
1292 && !def)
1294 /* We may produce non-gimple trees by adding NOPs or introduce
1295 invalid sharing when operand is not really constant.
1296 It is not big deal to prohibit constant propagation here as
1297 we will constant propagate in DOM1 pass anyway. */
1298 if (is_gimple_min_invariant (value)
1299 && lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p))
1300 /* We have to be very careful about ADDR_EXPR. Make sure
1301 the base variable isn't a local variable of the inlined
1302 function, e.g., when doing recursive inlining, direct or
1303 mutually-recursive or whatever, which is why we don't
1304 just test whether fn == current_function_decl. */
1305 && ! self_inlining_addr_expr (value, fn))
1307 insert_decl_map (id, p, value);
1308 return;
1312 /* Make an equivalent VAR_DECL. Note that we must NOT remap the type
1313 here since the type of this decl must be visible to the calling
1314 function. */
1315 var = copy_decl_to_var (p, id);
1316 if (gimple_in_ssa_p (cfun) && TREE_CODE (var) == VAR_DECL)
1318 get_var_ann (var);
1319 add_referenced_var (var);
1322 /* See if the frontend wants to pass this by invisible reference. If
1323 so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
1324 replace uses of the PARM_DECL with dereferences. */
1325 if (TREE_TYPE (var) != TREE_TYPE (p)
1326 && POINTER_TYPE_P (TREE_TYPE (var))
1327 && TREE_TYPE (TREE_TYPE (var)) == TREE_TYPE (p))
1329 insert_decl_map (id, var, var);
1330 var_sub = build_fold_indirect_ref (var);
1332 else
1333 var_sub = var;
1335 /* Register the VAR_DECL as the equivalent for the PARM_DECL;
1336 that way, when the PARM_DECL is encountered, it will be
1337 automatically replaced by the VAR_DECL. */
1338 insert_decl_map (id, p, var_sub);
1340 /* Declare this new variable. */
1341 TREE_CHAIN (var) = *vars;
1342 *vars = var;
1344 /* Make gimplifier happy about this variable. */
1345 DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
1347 /* Even if P was TREE_READONLY, the new VAR should not be.
1348 In the original code, we would have constructed a
1349 temporary, and then the function body would have never
1350 changed the value of P. However, now, we will be
1351 constructing VAR directly. The constructor body may
1352 change its value multiple times as it is being
1353 constructed. Therefore, it must not be TREE_READONLY;
1354 the back-end assumes that TREE_READONLY variable is
1355 assigned to only once. */
1356 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
1357 TREE_READONLY (var) = 0;
1359 /* If there is no setup required and we are in SSA, take the easy route
1360 replacing all SSA names representing the function parameter by the
1361 SSA name passed to function.
1363 We need to construct map for the variable anyway as it might be used
1364 in different SSA names when parameter is set in function.
1366 FIXME: This usually kills the last connection in between inlined
1367 function parameter and the actual value in debug info. Can we do
1368 better here? If we just inserted the statement, copy propagation
1369 would kill it anyway as it always did in older versions of GCC.
1371 We might want to introduce a notion that single SSA_NAME might
1372 represent multiple variables for purposes of debugging. */
1373 if (gimple_in_ssa_p (cfun) && rhs && def && is_gimple_reg (p)
1374 && (TREE_CODE (rhs) == SSA_NAME
1375 || is_gimple_min_invariant (rhs))
1376 && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (def))
1378 insert_decl_map (id, def, rhs);
1379 return;
1382 /* Initialize this VAR_DECL from the equivalent argument. Convert
1383 the argument to the proper type in case it was promoted. */
1384 if (value)
1386 block_stmt_iterator bsi = bsi_last (bb);
1388 if (rhs == error_mark_node)
1390 insert_decl_map (id, p, var_sub);
1391 return;
1394 STRIP_USELESS_TYPE_CONVERSION (rhs);
1396 /* We want to use GIMPLE_MODIFY_STMT, not INIT_EXPR here so that we
1397 keep our trees in gimple form. */
1398 if (def && gimple_in_ssa_p (cfun) && is_gimple_reg (p))
1400 def = remap_ssa_name (def, id);
1401 init_stmt = build_gimple_modify_stmt (def, rhs);
1402 SSA_NAME_DEF_STMT (def) = init_stmt;
1403 SSA_NAME_IS_DEFAULT_DEF (def) = 0;
1404 set_default_def (var, NULL);
1406 else
1407 init_stmt = build_gimple_modify_stmt (var, rhs);
1409 /* If we did not create a gimple value and we did not create a gimple
1410 cast of a gimple value, then we will need to gimplify INIT_STMTS
1411 at the end. Note that is_gimple_cast only checks the outer
1412 tree code, not its operand. Thus the explicit check that its
1413 operand is a gimple value. */
1414 if ((!is_gimple_val (rhs)
1415 && (!is_gimple_cast (rhs)
1416 || !is_gimple_val (TREE_OPERAND (rhs, 0))))
1417 || !is_gimple_reg (var))
1419 tree_stmt_iterator i;
1421 push_gimplify_context ();
1422 gimplify_stmt (&init_stmt);
1423 if (gimple_in_ssa_p (cfun)
1424 && init_stmt && TREE_CODE (init_stmt) == STATEMENT_LIST)
1426 /* The replacement can expose previously unreferenced
1427 variables. */
1428 for (i = tsi_start (init_stmt); !tsi_end_p (i); tsi_next (&i))
1429 find_new_referenced_vars (tsi_stmt_ptr (i));
1431 pop_gimplify_context (NULL);
1434 /* If VAR represents a zero-sized variable, it's possible that the
1435 assignment statment may result in no gimple statements. */
1436 if (init_stmt)
1437 bsi_insert_after (&bsi, init_stmt, BSI_NEW_STMT);
1438 if (gimple_in_ssa_p (cfun))
1439 for (;!bsi_end_p (bsi); bsi_next (&bsi))
1440 mark_symbols_for_renaming (bsi_stmt (bsi));
1444 /* Generate code to initialize the parameters of the function at the
1445 top of the stack in ID from the CALL_EXPR EXP. */
1447 static void
1448 initialize_inlined_parameters (copy_body_data *id, tree exp,
1449 tree fn, basic_block bb)
1451 tree parms;
1452 tree a;
1453 tree p;
1454 tree vars = NULL_TREE;
1455 int argnum = 0;
1456 call_expr_arg_iterator iter;
1457 tree static_chain = CALL_EXPR_STATIC_CHAIN (exp);
1459 /* Figure out what the parameters are. */
1460 parms = DECL_ARGUMENTS (fn);
1462 /* Loop through the parameter declarations, replacing each with an
1463 equivalent VAR_DECL, appropriately initialized. */
1464 for (p = parms, a = first_call_expr_arg (exp, &iter); p;
1465 a = next_call_expr_arg (&iter), p = TREE_CHAIN (p))
1467 tree value;
1469 ++argnum;
1471 /* Find the initializer. */
1472 value = lang_hooks.tree_inlining.convert_parm_for_inlining
1473 (p, a, fn, argnum);
1475 setup_one_parameter (id, p, value, fn, bb, &vars);
1478 /* Initialize the static chain. */
1479 p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
1480 gcc_assert (fn != current_function_decl);
1481 if (p)
1483 /* No static chain? Seems like a bug in tree-nested.c. */
1484 gcc_assert (static_chain);
1486 setup_one_parameter (id, p, static_chain, fn, bb, &vars);
1489 declare_inline_vars (id->block, vars);
1492 /* Declare a return variable to replace the RESULT_DECL for the
1493 function we are calling. An appropriate DECL_STMT is returned.
1494 The USE_STMT is filled to contain a use of the declaration to
1495 indicate the return value of the function.
1497 RETURN_SLOT, if non-null is place where to store the result. It
1498 is set only for CALL_EXPR_RETURN_SLOT_OPT. MODIFY_DEST, if non-null,
1499 was the LHS of the GIMPLE_MODIFY_STMT to which this call is the RHS.
1501 The return value is a (possibly null) value that is the result of the
1502 function as seen by the callee. *USE_P is a (possibly null) value that
1503 holds the result as seen by the caller. */
1505 static tree
1506 declare_return_variable (copy_body_data *id, tree return_slot, tree modify_dest,
1507 tree *use_p)
1509 tree callee = id->src_fn;
1510 tree caller = id->dst_fn;
1511 tree result = DECL_RESULT (callee);
1512 tree callee_type = TREE_TYPE (result);
1513 tree caller_type = TREE_TYPE (TREE_TYPE (callee));
1514 tree var, use;
1516 /* We don't need to do anything for functions that don't return
1517 anything. */
1518 if (!result || VOID_TYPE_P (callee_type))
1520 *use_p = NULL_TREE;
1521 return NULL_TREE;
1524 /* If there was a return slot, then the return value is the
1525 dereferenced address of that object. */
1526 if (return_slot)
1528 /* The front end shouldn't have used both return_slot and
1529 a modify expression. */
1530 gcc_assert (!modify_dest);
1531 if (DECL_BY_REFERENCE (result))
1533 tree return_slot_addr = build_fold_addr_expr (return_slot);
1534 STRIP_USELESS_TYPE_CONVERSION (return_slot_addr);
1536 /* We are going to construct *&return_slot and we can't do that
1537 for variables believed to be not addressable.
1539 FIXME: This check possibly can match, because values returned
1540 via return slot optimization are not believed to have address
1541 taken by alias analysis. */
1542 gcc_assert (TREE_CODE (return_slot) != SSA_NAME);
1543 if (gimple_in_ssa_p (cfun))
1545 HOST_WIDE_INT bitsize;
1546 HOST_WIDE_INT bitpos;
1547 tree offset;
1548 enum machine_mode mode;
1549 int unsignedp;
1550 int volatilep;
1551 tree base;
1552 base = get_inner_reference (return_slot, &bitsize, &bitpos,
1553 &offset,
1554 &mode, &unsignedp, &volatilep,
1555 false);
1556 if (TREE_CODE (base) == INDIRECT_REF)
1557 base = TREE_OPERAND (base, 0);
1558 if (TREE_CODE (base) == SSA_NAME)
1559 base = SSA_NAME_VAR (base);
1560 mark_sym_for_renaming (base);
1562 var = return_slot_addr;
1564 else
1566 var = return_slot;
1567 gcc_assert (TREE_CODE (var) != SSA_NAME);
1569 if ((TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
1570 || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
1571 && !DECL_GIMPLE_REG_P (result)
1572 && DECL_P (var))
1573 DECL_GIMPLE_REG_P (var) = 0;
1574 use = NULL;
1575 goto done;
1578 /* All types requiring non-trivial constructors should have been handled. */
1579 gcc_assert (!TREE_ADDRESSABLE (callee_type));
1581 /* Attempt to avoid creating a new temporary variable. */
1582 if (modify_dest
1583 && TREE_CODE (modify_dest) != SSA_NAME)
1585 bool use_it = false;
1587 /* We can't use MODIFY_DEST if there's type promotion involved. */
1588 if (!lang_hooks.types_compatible_p (caller_type, callee_type))
1589 use_it = false;
1591 /* ??? If we're assigning to a variable sized type, then we must
1592 reuse the destination variable, because we've no good way to
1593 create variable sized temporaries at this point. */
1594 else if (TREE_CODE (TYPE_SIZE_UNIT (caller_type)) != INTEGER_CST)
1595 use_it = true;
1597 /* If the callee cannot possibly modify MODIFY_DEST, then we can
1598 reuse it as the result of the call directly. Don't do this if
1599 it would promote MODIFY_DEST to addressable. */
1600 else if (TREE_ADDRESSABLE (result))
1601 use_it = false;
1602 else
1604 tree base_m = get_base_address (modify_dest);
1606 /* If the base isn't a decl, then it's a pointer, and we don't
1607 know where that's going to go. */
1608 if (!DECL_P (base_m))
1609 use_it = false;
1610 else if (is_global_var (base_m))
1611 use_it = false;
1612 else if ((TREE_CODE (TREE_TYPE (result)) == COMPLEX_TYPE
1613 || TREE_CODE (TREE_TYPE (result)) == VECTOR_TYPE)
1614 && !DECL_GIMPLE_REG_P (result)
1615 && DECL_GIMPLE_REG_P (base_m))
1616 use_it = false;
1617 else if (!TREE_ADDRESSABLE (base_m))
1618 use_it = true;
1621 if (use_it)
1623 var = modify_dest;
1624 use = NULL;
1625 goto done;
1629 gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (callee_type)) == INTEGER_CST);
1631 var = copy_result_decl_to_var (result, id);
1632 if (gimple_in_ssa_p (cfun))
1634 get_var_ann (var);
1635 add_referenced_var (var);
1638 DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
1639 DECL_STRUCT_FUNCTION (caller)->unexpanded_var_list
1640 = tree_cons (NULL_TREE, var,
1641 DECL_STRUCT_FUNCTION (caller)->unexpanded_var_list);
1643 /* Do not have the rest of GCC warn about this variable as it should
1644 not be visible to the user. */
1645 TREE_NO_WARNING (var) = 1;
1647 declare_inline_vars (id->block, var);
1649 /* Build the use expr. If the return type of the function was
1650 promoted, convert it back to the expected type. */
1651 use = var;
1652 if (!lang_hooks.types_compatible_p (TREE_TYPE (var), caller_type))
1653 use = fold_convert (caller_type, var);
1655 STRIP_USELESS_TYPE_CONVERSION (use);
1657 if (DECL_BY_REFERENCE (result))
1658 var = build_fold_addr_expr (var);
1660 done:
1661 /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
1662 way, when the RESULT_DECL is encountered, it will be
1663 automatically replaced by the VAR_DECL. */
1664 insert_decl_map (id, result, var);
1666 /* Remember this so we can ignore it in remap_decls. */
1667 id->retvar = var;
1669 *use_p = use;
1670 return var;
1673 /* Returns nonzero if a function can be inlined as a tree. */
1675 bool
1676 tree_inlinable_function_p (tree fn)
1678 return inlinable_function_p (fn);
1681 static const char *inline_forbidden_reason;
1683 static tree
1684 inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
1685 void *fnp)
1687 tree node = *nodep;
1688 tree fn = (tree) fnp;
1689 tree t;
1691 switch (TREE_CODE (node))
1693 case CALL_EXPR:
1694 /* Refuse to inline alloca call unless user explicitly forced so as
1695 this may change program's memory overhead drastically when the
1696 function using alloca is called in loop. In GCC present in
1697 SPEC2000 inlining into schedule_block cause it to require 2GB of
1698 RAM instead of 256MB. */
1699 if (alloca_call_p (node)
1700 && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1702 inline_forbidden_reason
1703 = G_("function %q+F can never be inlined because it uses "
1704 "alloca (override using the always_inline attribute)");
1705 return node;
1707 t = get_callee_fndecl (node);
1708 if (! t)
1709 break;
1711 /* We cannot inline functions that call setjmp. */
1712 if (setjmp_call_p (t))
1714 inline_forbidden_reason
1715 = G_("function %q+F can never be inlined because it uses setjmp");
1716 return node;
1719 if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL)
1720 switch (DECL_FUNCTION_CODE (t))
1722 /* We cannot inline functions that take a variable number of
1723 arguments. */
1724 case BUILT_IN_VA_START:
1725 case BUILT_IN_STDARG_START:
1726 case BUILT_IN_NEXT_ARG:
1727 case BUILT_IN_VA_END:
1728 inline_forbidden_reason
1729 = G_("function %q+F can never be inlined because it "
1730 "uses variable argument lists");
1731 return node;
1733 case BUILT_IN_LONGJMP:
1734 /* We can't inline functions that call __builtin_longjmp at
1735 all. The non-local goto machinery really requires the
1736 destination be in a different function. If we allow the
1737 function calling __builtin_longjmp to be inlined into the
1738 function calling __builtin_setjmp, Things will Go Awry. */
1739 inline_forbidden_reason
1740 = G_("function %q+F can never be inlined because "
1741 "it uses setjmp-longjmp exception handling");
1742 return node;
1744 case BUILT_IN_NONLOCAL_GOTO:
1745 /* Similarly. */
1746 inline_forbidden_reason
1747 = G_("function %q+F can never be inlined because "
1748 "it uses non-local goto");
1749 return node;
1751 case BUILT_IN_RETURN:
1752 case BUILT_IN_APPLY_ARGS:
1753 /* If a __builtin_apply_args caller would be inlined,
1754 it would be saving arguments of the function it has
1755 been inlined into. Similarly __builtin_return would
1756 return from the function the inline has been inlined into. */
1757 inline_forbidden_reason
1758 = G_("function %q+F can never be inlined because "
1759 "it uses __builtin_return or __builtin_apply_args");
1760 return node;
1762 default:
1763 break;
1765 break;
1767 case GOTO_EXPR:
1768 t = TREE_OPERAND (node, 0);
1770 /* We will not inline a function which uses computed goto. The
1771 addresses of its local labels, which may be tucked into
1772 global storage, are of course not constant across
1773 instantiations, which causes unexpected behavior. */
1774 if (TREE_CODE (t) != LABEL_DECL)
1776 inline_forbidden_reason
1777 = G_("function %q+F can never be inlined "
1778 "because it contains a computed goto");
1779 return node;
1781 break;
1783 case LABEL_EXPR:
1784 t = TREE_OPERAND (node, 0);
1785 if (DECL_NONLOCAL (t))
1787 /* We cannot inline a function that receives a non-local goto
1788 because we cannot remap the destination label used in the
1789 function that is performing the non-local goto. */
1790 inline_forbidden_reason
1791 = G_("function %q+F can never be inlined "
1792 "because it receives a non-local goto");
1793 return node;
1795 break;
1797 case RECORD_TYPE:
1798 case UNION_TYPE:
1799 /* We cannot inline a function of the form
1801 void F (int i) { struct S { int ar[i]; } s; }
1803 Attempting to do so produces a catch-22.
1804 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
1805 UNION_TYPE nodes, then it goes into infinite recursion on a
1806 structure containing a pointer to its own type. If it doesn't,
1807 then the type node for S doesn't get adjusted properly when
1808 F is inlined.
1810 ??? This is likely no longer true, but it's too late in the 4.0
1811 cycle to try to find out. This should be checked for 4.1. */
1812 for (t = TYPE_FIELDS (node); t; t = TREE_CHAIN (t))
1813 if (variably_modified_type_p (TREE_TYPE (t), NULL))
1815 inline_forbidden_reason
1816 = G_("function %q+F can never be inlined "
1817 "because it uses variable sized variables");
1818 return node;
1821 default:
1822 break;
1825 return NULL_TREE;
1828 /* Return subexpression representing possible alloca call, if any. */
1829 static tree
1830 inline_forbidden_p (tree fndecl)
1832 location_t saved_loc = input_location;
1833 block_stmt_iterator bsi;
1834 basic_block bb;
1835 tree ret = NULL_TREE;
1837 FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (fndecl))
1838 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
1840 ret = walk_tree_without_duplicates (bsi_stmt_ptr (bsi),
1841 inline_forbidden_p_1, fndecl);
1842 if (ret)
1843 goto egress;
1846 egress:
1847 input_location = saved_loc;
1848 return ret;
1851 /* Returns nonzero if FN is a function that does not have any
1852 fundamental inline blocking properties. */
1854 static bool
1855 inlinable_function_p (tree fn)
1857 bool inlinable = true;
1859 /* If we've already decided this function shouldn't be inlined,
1860 there's no need to check again. */
1861 if (DECL_UNINLINABLE (fn))
1862 return false;
1864 /* See if there is any language-specific reason it cannot be
1865 inlined. (It is important that this hook be called early because
1866 in C++ it may result in template instantiation.)
1867 If the function is not inlinable for language-specific reasons,
1868 it is left up to the langhook to explain why. */
1869 inlinable = !lang_hooks.tree_inlining.cannot_inline_tree_fn (&fn);
1871 /* If we don't have the function body available, we can't inline it.
1872 However, this should not be recorded since we also get here for
1873 forward declared inline functions. Therefore, return at once. */
1874 if (!DECL_SAVED_TREE (fn))
1875 return false;
1877 /* If we're not inlining at all, then we cannot inline this function. */
1878 else if (!flag_inline_trees)
1879 inlinable = false;
1881 /* Only try to inline functions if DECL_INLINE is set. This should be
1882 true for all functions declared `inline', and for all other functions
1883 as well with -finline-functions.
1885 Don't think of disregarding DECL_INLINE when flag_inline_trees == 2;
1886 it's the front-end that must set DECL_INLINE in this case, because
1887 dwarf2out loses if a function that does not have DECL_INLINE set is
1888 inlined anyway. That is why we have both DECL_INLINE and
1889 DECL_DECLARED_INLINE_P. */
1890 /* FIXME: When flag_inline_trees dies, the check for flag_unit_at_a_time
1891 here should be redundant. */
1892 else if (!DECL_INLINE (fn) && !flag_unit_at_a_time)
1893 inlinable = false;
1895 else if (inline_forbidden_p (fn))
1897 /* See if we should warn about uninlinable functions. Previously,
1898 some of these warnings would be issued while trying to expand
1899 the function inline, but that would cause multiple warnings
1900 about functions that would for example call alloca. But since
1901 this a property of the function, just one warning is enough.
1902 As a bonus we can now give more details about the reason why a
1903 function is not inlinable.
1904 We only warn for functions declared `inline' by the user. */
1905 bool do_warning = (warn_inline
1906 && DECL_INLINE (fn)
1907 && DECL_DECLARED_INLINE_P (fn)
1908 && !DECL_IN_SYSTEM_HEADER (fn));
1910 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1911 sorry (inline_forbidden_reason, fn);
1912 else if (do_warning)
1913 warning (OPT_Winline, inline_forbidden_reason, fn);
1915 inlinable = false;
1918 /* Squirrel away the result so that we don't have to check again. */
1919 DECL_UNINLINABLE (fn) = !inlinable;
1921 return inlinable;
1924 /* Estimate the cost of a memory move. Use machine dependent
1925 word size and take possible memcpy call into account. */
1928 estimate_move_cost (tree type)
1930 HOST_WIDE_INT size;
1932 size = int_size_in_bytes (type);
1934 if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO)
1935 /* Cost of a memcpy call, 3 arguments and the call. */
1936 return 4;
1937 else
1938 return ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
1941 /* Arguments for estimate_num_insns_1. */
1943 struct eni_data
1945 /* Used to return the number of insns. */
1946 int count;
1948 /* Weights of various constructs. */
1949 eni_weights *weights;
1952 /* Used by estimate_num_insns. Estimate number of instructions seen
1953 by given statement. */
1955 static tree
1956 estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
1958 struct eni_data *d = data;
1959 tree x = *tp;
1960 unsigned cost;
1962 if (IS_TYPE_OR_DECL_P (x))
1964 *walk_subtrees = 0;
1965 return NULL;
1967 /* Assume that constants and references counts nothing. These should
1968 be majorized by amount of operations among them we count later
1969 and are common target of CSE and similar optimizations. */
1970 else if (CONSTANT_CLASS_P (x) || REFERENCE_CLASS_P (x))
1971 return NULL;
1973 switch (TREE_CODE (x))
1975 /* Containers have no cost. */
1976 case TREE_LIST:
1977 case TREE_VEC:
1978 case BLOCK:
1979 case COMPONENT_REF:
1980 case BIT_FIELD_REF:
1981 case INDIRECT_REF:
1982 case ALIGN_INDIRECT_REF:
1983 case MISALIGNED_INDIRECT_REF:
1984 case ARRAY_REF:
1985 case ARRAY_RANGE_REF:
1986 case OBJ_TYPE_REF:
1987 case EXC_PTR_EXPR: /* ??? */
1988 case FILTER_EXPR: /* ??? */
1989 case COMPOUND_EXPR:
1990 case BIND_EXPR:
1991 case WITH_CLEANUP_EXPR:
1992 case NOP_EXPR:
1993 case VIEW_CONVERT_EXPR:
1994 case SAVE_EXPR:
1995 case ADDR_EXPR:
1996 case COMPLEX_EXPR:
1997 case RANGE_EXPR:
1998 case CASE_LABEL_EXPR:
1999 case SSA_NAME:
2000 case CATCH_EXPR:
2001 case EH_FILTER_EXPR:
2002 case STATEMENT_LIST:
2003 case ERROR_MARK:
2004 case NON_LVALUE_EXPR:
2005 case FDESC_EXPR:
2006 case VA_ARG_EXPR:
2007 case TRY_CATCH_EXPR:
2008 case TRY_FINALLY_EXPR:
2009 case LABEL_EXPR:
2010 case GOTO_EXPR:
2011 case RETURN_EXPR:
2012 case EXIT_EXPR:
2013 case LOOP_EXPR:
2014 case PHI_NODE:
2015 case WITH_SIZE_EXPR:
2016 case OMP_CLAUSE:
2017 case OMP_RETURN:
2018 case OMP_CONTINUE:
2019 break;
2021 /* We don't account constants for now. Assume that the cost is amortized
2022 by operations that do use them. We may re-consider this decision once
2023 we are able to optimize the tree before estimating its size and break
2024 out static initializers. */
2025 case IDENTIFIER_NODE:
2026 case INTEGER_CST:
2027 case REAL_CST:
2028 case COMPLEX_CST:
2029 case VECTOR_CST:
2030 case STRING_CST:
2031 *walk_subtrees = 0;
2032 return NULL;
2034 /* Try to estimate the cost of assignments. We have three cases to
2035 deal with:
2036 1) Simple assignments to registers;
2037 2) Stores to things that must live in memory. This includes
2038 "normal" stores to scalars, but also assignments of large
2039 structures, or constructors of big arrays;
2040 3) TARGET_EXPRs.
2042 Let us look at the first two cases, assuming we have "a = b + C":
2043 <GIMPLE_MODIFY_STMT <var_decl "a">
2044 <plus_expr <var_decl "b"> <constant C>>
2045 If "a" is a GIMPLE register, the assignment to it is free on almost
2046 any target, because "a" usually ends up in a real register. Hence
2047 the only cost of this expression comes from the PLUS_EXPR, and we
2048 can ignore the GIMPLE_MODIFY_STMT.
2049 If "a" is not a GIMPLE register, the assignment to "a" will most
2050 likely be a real store, so the cost of the GIMPLE_MODIFY_STMT is the cost
2051 of moving something into "a", which we compute using the function
2052 estimate_move_cost.
2054 The third case deals with TARGET_EXPRs, for which the semantics are
2055 that a temporary is assigned, unless the TARGET_EXPR itself is being
2056 assigned to something else. In the latter case we do not need the
2057 temporary. E.g. in:
2058 <GIMPLE_MODIFY_STMT <var_decl "a"> <target_expr>>, the
2059 GIMPLE_MODIFY_STMT is free. */
2060 case INIT_EXPR:
2061 case GIMPLE_MODIFY_STMT:
2062 /* Is the right and side a TARGET_EXPR? */
2063 if (TREE_CODE (GENERIC_TREE_OPERAND (x, 1)) == TARGET_EXPR)
2064 break;
2065 /* ... fall through ... */
2067 case TARGET_EXPR:
2068 x = GENERIC_TREE_OPERAND (x, 0);
2069 /* Is this an assignments to a register? */
2070 if (is_gimple_reg (x))
2071 break;
2072 /* Otherwise it's a store, so fall through to compute the move cost. */
2074 case CONSTRUCTOR:
2075 d->count += estimate_move_cost (TREE_TYPE (x));
2076 break;
2078 /* Assign cost of 1 to usual operations.
2079 ??? We may consider mapping RTL costs to this. */
2080 case COND_EXPR:
2081 case VEC_COND_EXPR:
2083 case PLUS_EXPR:
2084 case MINUS_EXPR:
2085 case MULT_EXPR:
2087 case FIX_TRUNC_EXPR:
2089 case NEGATE_EXPR:
2090 case FLOAT_EXPR:
2091 case MIN_EXPR:
2092 case MAX_EXPR:
2093 case ABS_EXPR:
2095 case LSHIFT_EXPR:
2096 case RSHIFT_EXPR:
2097 case LROTATE_EXPR:
2098 case RROTATE_EXPR:
2099 case VEC_LSHIFT_EXPR:
2100 case VEC_RSHIFT_EXPR:
2102 case BIT_IOR_EXPR:
2103 case BIT_XOR_EXPR:
2104 case BIT_AND_EXPR:
2105 case BIT_NOT_EXPR:
2107 case TRUTH_ANDIF_EXPR:
2108 case TRUTH_ORIF_EXPR:
2109 case TRUTH_AND_EXPR:
2110 case TRUTH_OR_EXPR:
2111 case TRUTH_XOR_EXPR:
2112 case TRUTH_NOT_EXPR:
2114 case LT_EXPR:
2115 case LE_EXPR:
2116 case GT_EXPR:
2117 case GE_EXPR:
2118 case EQ_EXPR:
2119 case NE_EXPR:
2120 case ORDERED_EXPR:
2121 case UNORDERED_EXPR:
2123 case UNLT_EXPR:
2124 case UNLE_EXPR:
2125 case UNGT_EXPR:
2126 case UNGE_EXPR:
2127 case UNEQ_EXPR:
2128 case LTGT_EXPR:
2130 case CONVERT_EXPR:
2132 case CONJ_EXPR:
2134 case PREDECREMENT_EXPR:
2135 case PREINCREMENT_EXPR:
2136 case POSTDECREMENT_EXPR:
2137 case POSTINCREMENT_EXPR:
2139 case ASM_EXPR:
2141 case REALIGN_LOAD_EXPR:
2143 case REDUC_MAX_EXPR:
2144 case REDUC_MIN_EXPR:
2145 case REDUC_PLUS_EXPR:
2146 case WIDEN_SUM_EXPR:
2147 case DOT_PROD_EXPR:
2148 case VEC_WIDEN_MULT_HI_EXPR:
2149 case VEC_WIDEN_MULT_LO_EXPR:
2150 case VEC_UNPACK_HI_EXPR:
2151 case VEC_UNPACK_LO_EXPR:
2152 case VEC_PACK_MOD_EXPR:
2153 case VEC_PACK_SAT_EXPR:
2155 case WIDEN_MULT_EXPR:
2157 case VEC_EXTRACT_EVEN_EXPR:
2158 case VEC_EXTRACT_ODD_EXPR:
2159 case VEC_INTERLEAVE_HIGH_EXPR:
2160 case VEC_INTERLEAVE_LOW_EXPR:
2162 case RESX_EXPR:
2163 d->count += 1;
2164 break;
2166 case SWITCH_EXPR:
2167 /* TODO: Cost of a switch should be derived from the number of
2168 branches. */
2169 d->count += d->weights->switch_cost;
2170 break;
2172 /* Few special cases of expensive operations. This is useful
2173 to avoid inlining on functions having too many of these. */
2174 case TRUNC_DIV_EXPR:
2175 case CEIL_DIV_EXPR:
2176 case FLOOR_DIV_EXPR:
2177 case ROUND_DIV_EXPR:
2178 case EXACT_DIV_EXPR:
2179 case TRUNC_MOD_EXPR:
2180 case CEIL_MOD_EXPR:
2181 case FLOOR_MOD_EXPR:
2182 case ROUND_MOD_EXPR:
2183 case RDIV_EXPR:
2184 d->count += d->weights->div_mod_cost;
2185 break;
2186 case CALL_EXPR:
2188 tree decl = get_callee_fndecl (x);
2190 cost = d->weights->call_cost;
2191 if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
2192 switch (DECL_FUNCTION_CODE (decl))
2194 case BUILT_IN_CONSTANT_P:
2195 *walk_subtrees = 0;
2196 return NULL_TREE;
2197 case BUILT_IN_EXPECT:
2198 return NULL_TREE;
2199 /* Prefetch instruction is not expensive. */
2200 case BUILT_IN_PREFETCH:
2201 cost = 1;
2202 break;
2203 default:
2204 break;
2207 /* Our cost must be kept in sync with cgraph_estimate_size_after_inlining
2208 that does use function declaration to figure out the arguments. */
2209 if (!decl)
2211 tree a;
2212 call_expr_arg_iterator iter;
2213 FOR_EACH_CALL_EXPR_ARG (a, iter, x)
2214 d->count += estimate_move_cost (TREE_TYPE (a));
2216 else
2218 tree arg;
2219 for (arg = DECL_ARGUMENTS (decl); arg; arg = TREE_CHAIN (arg))
2220 d->count += estimate_move_cost (TREE_TYPE (arg));
2223 d->count += cost;
2224 break;
2227 case OMP_PARALLEL:
2228 case OMP_FOR:
2229 case OMP_SECTIONS:
2230 case OMP_SINGLE:
2231 case OMP_SECTION:
2232 case OMP_MASTER:
2233 case OMP_ORDERED:
2234 case OMP_CRITICAL:
2235 case OMP_ATOMIC:
2236 /* OpenMP directives are generally very expensive. */
2237 d->count += d->weights->omp_cost;
2238 break;
2240 default:
2241 gcc_unreachable ();
2243 return NULL;
2246 /* Estimate number of instructions that will be created by expanding EXPR.
2247 WEIGHTS contains weights attributed to various constructs. */
2250 estimate_num_insns (tree expr, eni_weights *weights)
2252 struct pointer_set_t *visited_nodes;
2253 basic_block bb;
2254 block_stmt_iterator bsi;
2255 struct function *my_function;
2256 struct eni_data data;
2258 data.count = 0;
2259 data.weights = weights;
2261 /* If we're given an entire function, walk the CFG. */
2262 if (TREE_CODE (expr) == FUNCTION_DECL)
2264 my_function = DECL_STRUCT_FUNCTION (expr);
2265 gcc_assert (my_function && my_function->cfg);
2266 visited_nodes = pointer_set_create ();
2267 FOR_EACH_BB_FN (bb, my_function)
2269 for (bsi = bsi_start (bb);
2270 !bsi_end_p (bsi);
2271 bsi_next (&bsi))
2273 walk_tree (bsi_stmt_ptr (bsi), estimate_num_insns_1,
2274 &data, visited_nodes);
2277 pointer_set_destroy (visited_nodes);
2279 else
2280 walk_tree_without_duplicates (&expr, estimate_num_insns_1, &data);
2282 return data.count;
2285 /* Initializes weights used by estimate_num_insns. */
2287 void
2288 init_inline_once (void)
2290 eni_inlining_weights.call_cost = PARAM_VALUE (PARAM_INLINE_CALL_COST);
2291 eni_inlining_weights.div_mod_cost = 10;
2292 eni_inlining_weights.switch_cost = 1;
2293 eni_inlining_weights.omp_cost = 40;
2295 eni_size_weights.call_cost = 1;
2296 eni_size_weights.div_mod_cost = 1;
2297 eni_size_weights.switch_cost = 10;
2298 eni_size_weights.omp_cost = 40;
2300 /* Estimating time for call is difficult, since we have no idea what the
2301 called function does. In the current uses of eni_time_weights,
2302 underestimating the cost does less harm than overestimating it, so
2303 we choose a rather small value here. */
2304 eni_time_weights.call_cost = 10;
2305 eni_time_weights.div_mod_cost = 10;
2306 eni_time_weights.switch_cost = 4;
2307 eni_time_weights.omp_cost = 40;
2310 typedef struct function *function_p;
2312 DEF_VEC_P(function_p);
2313 DEF_VEC_ALLOC_P(function_p,heap);
2315 /* Initialized with NOGC, making this poisonous to the garbage collector. */
2316 static VEC(function_p,heap) *cfun_stack;
2318 void
2319 push_cfun (struct function *new_cfun)
2321 VEC_safe_push (function_p, heap, cfun_stack, cfun);
2322 cfun = new_cfun;
2325 void
2326 pop_cfun (void)
2328 cfun = VEC_pop (function_p, cfun_stack);
2331 /* Install new lexical TREE_BLOCK underneath 'current_block'. */
2332 static void
2333 add_lexical_block (tree current_block, tree new_block)
2335 tree *blk_p;
2337 /* Walk to the last sub-block. */
2338 for (blk_p = &BLOCK_SUBBLOCKS (current_block);
2339 *blk_p;
2340 blk_p = &TREE_CHAIN (*blk_p))
2342 *blk_p = new_block;
2343 BLOCK_SUPERCONTEXT (new_block) = current_block;
2346 /* If *TP is a CALL_EXPR, replace it with its inline expansion. */
2348 static bool
2349 expand_call_inline (basic_block bb, tree stmt, tree *tp, void *data)
2351 copy_body_data *id;
2352 tree t;
2353 tree use_retvar;
2354 tree fn;
2355 struct pointer_map_t *st;
2356 tree return_slot;
2357 tree modify_dest;
2358 location_t saved_location;
2359 struct cgraph_edge *cg_edge;
2360 const char *reason;
2361 basic_block return_block;
2362 edge e;
2363 block_stmt_iterator bsi, stmt_bsi;
2364 bool successfully_inlined = FALSE;
2365 bool purge_dead_abnormal_edges;
2366 tree t_step;
2367 tree var;
2369 /* See what we've got. */
2370 id = (copy_body_data *) data;
2371 t = *tp;
2373 /* Set input_location here so we get the right instantiation context
2374 if we call instantiate_decl from inlinable_function_p. */
2375 saved_location = input_location;
2376 if (EXPR_HAS_LOCATION (t))
2377 input_location = EXPR_LOCATION (t);
2379 /* From here on, we're only interested in CALL_EXPRs. */
2380 if (TREE_CODE (t) != CALL_EXPR)
2381 goto egress;
2383 /* First, see if we can figure out what function is being called.
2384 If we cannot, then there is no hope of inlining the function. */
2385 fn = get_callee_fndecl (t);
2386 if (!fn)
2387 goto egress;
2389 /* Turn forward declarations into real ones. */
2390 fn = cgraph_node (fn)->decl;
2392 /* If fn is a declaration of a function in a nested scope that was
2393 globally declared inline, we don't set its DECL_INITIAL.
2394 However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
2395 C++ front-end uses it for cdtors to refer to their internal
2396 declarations, that are not real functions. Fortunately those
2397 don't have trees to be saved, so we can tell by checking their
2398 DECL_SAVED_TREE. */
2399 if (! DECL_INITIAL (fn)
2400 && DECL_ABSTRACT_ORIGIN (fn)
2401 && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
2402 fn = DECL_ABSTRACT_ORIGIN (fn);
2404 /* Objective C and fortran still calls tree_rest_of_compilation directly.
2405 Kill this check once this is fixed. */
2406 if (!id->dst_node->analyzed)
2407 goto egress;
2409 cg_edge = cgraph_edge (id->dst_node, stmt);
2411 /* Constant propagation on argument done during previous inlining
2412 may create new direct call. Produce an edge for it. */
2413 if (!cg_edge)
2415 struct cgraph_node *dest = cgraph_node (fn);
2417 /* We have missing edge in the callgraph. This can happen in one case
2418 where previous inlining turned indirect call into direct call by
2419 constant propagating arguments. In all other cases we hit a bug
2420 (incorrect node sharing is most common reason for missing edges. */
2421 gcc_assert (dest->needed || !flag_unit_at_a_time);
2422 cgraph_create_edge (id->dst_node, dest, stmt,
2423 bb->count, CGRAPH_FREQ_BASE,
2424 bb->loop_depth)->inline_failed
2425 = N_("originally indirect function call not considered for inlining");
2426 if (dump_file)
2428 fprintf (dump_file, "Created new direct edge to %s",
2429 cgraph_node_name (dest));
2431 goto egress;
2434 /* Don't try to inline functions that are not well-suited to
2435 inlining. */
2436 if (!cgraph_inline_p (cg_edge, &reason))
2438 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn))
2439 /* Avoid warnings during early inline pass. */
2440 && (!flag_unit_at_a_time || cgraph_global_info_ready))
2442 sorry ("inlining failed in call to %q+F: %s", fn, reason);
2443 sorry ("called from here");
2445 else if (warn_inline && DECL_DECLARED_INLINE_P (fn)
2446 && !DECL_IN_SYSTEM_HEADER (fn)
2447 && strlen (reason)
2448 && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn))
2449 /* Avoid warnings during early inline pass. */
2450 && (!flag_unit_at_a_time || cgraph_global_info_ready))
2452 warning (OPT_Winline, "inlining failed in call to %q+F: %s",
2453 fn, reason);
2454 warning (OPT_Winline, "called from here");
2456 goto egress;
2458 fn = cg_edge->callee->decl;
2460 #ifdef ENABLE_CHECKING
2461 if (cg_edge->callee->decl != id->dst_node->decl)
2462 verify_cgraph_node (cg_edge->callee);
2463 #endif
2465 /* We will be inlining this callee. */
2466 id->eh_region = lookup_stmt_eh_region (stmt);
2468 /* Split the block holding the CALL_EXPR. */
2469 e = split_block (bb, stmt);
2470 bb = e->src;
2471 return_block = e->dest;
2472 remove_edge (e);
2474 /* split_block splits after the statement; work around this by
2475 moving the call into the second block manually. Not pretty,
2476 but seems easier than doing the CFG manipulation by hand
2477 when the CALL_EXPR is in the last statement of BB. */
2478 stmt_bsi = bsi_last (bb);
2479 bsi_remove (&stmt_bsi, false);
2481 /* If the CALL_EXPR was in the last statement of BB, it may have
2482 been the source of abnormal edges. In this case, schedule
2483 the removal of dead abnormal edges. */
2484 bsi = bsi_start (return_block);
2485 if (bsi_end_p (bsi))
2487 bsi_insert_after (&bsi, stmt, BSI_NEW_STMT);
2488 purge_dead_abnormal_edges = true;
2490 else
2492 bsi_insert_before (&bsi, stmt, BSI_NEW_STMT);
2493 purge_dead_abnormal_edges = false;
2496 stmt_bsi = bsi_start (return_block);
2498 /* Build a block containing code to initialize the arguments, the
2499 actual inline expansion of the body, and a label for the return
2500 statements within the function to jump to. The type of the
2501 statement expression is the return type of the function call. */
2502 id->block = make_node (BLOCK);
2503 BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
2504 BLOCK_SOURCE_LOCATION (id->block) = input_location;
2505 add_lexical_block (TREE_BLOCK (stmt), id->block);
2507 /* Local declarations will be replaced by their equivalents in this
2508 map. */
2509 st = id->decl_map;
2510 id->decl_map = pointer_map_create ();
2512 /* Record the function we are about to inline. */
2513 id->src_fn = fn;
2514 id->src_node = cg_edge->callee;
2515 id->src_cfun = DECL_STRUCT_FUNCTION (fn);
2517 initialize_inlined_parameters (id, t, fn, bb);
2519 if (DECL_INITIAL (fn))
2520 add_lexical_block (id->block, remap_blocks (DECL_INITIAL (fn), id));
2522 /* Return statements in the function body will be replaced by jumps
2523 to the RET_LABEL. */
2525 gcc_assert (DECL_INITIAL (fn));
2526 gcc_assert (TREE_CODE (DECL_INITIAL (fn)) == BLOCK);
2528 /* Find the lhs to which the result of this call is assigned. */
2529 return_slot = NULL;
2530 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT)
2532 modify_dest = GIMPLE_STMT_OPERAND (stmt, 0);
2534 /* The function which we are inlining might not return a value,
2535 in which case we should issue a warning that the function
2536 does not return a value. In that case the optimizers will
2537 see that the variable to which the value is assigned was not
2538 initialized. We do not want to issue a warning about that
2539 uninitialized variable. */
2540 if (DECL_P (modify_dest))
2541 TREE_NO_WARNING (modify_dest) = 1;
2542 if (CALL_EXPR_RETURN_SLOT_OPT (t))
2544 return_slot = modify_dest;
2545 modify_dest = NULL;
2548 else
2549 modify_dest = NULL;
2551 /* Declare the return variable for the function. */
2552 declare_return_variable (id, return_slot,
2553 modify_dest, &use_retvar);
2555 /* This is it. Duplicate the callee body. Assume callee is
2556 pre-gimplified. Note that we must not alter the caller
2557 function in any way before this point, as this CALL_EXPR may be
2558 a self-referential call; if we're calling ourselves, we need to
2559 duplicate our body before altering anything. */
2560 copy_body (id, bb->count, bb->frequency, bb, return_block);
2562 /* Add local vars in this inlined callee to caller. */
2563 t_step = id->src_cfun->unexpanded_var_list;
2564 for (; t_step; t_step = TREE_CHAIN (t_step))
2566 var = TREE_VALUE (t_step);
2567 if (TREE_STATIC (var) && !TREE_ASM_WRITTEN (var))
2568 cfun->unexpanded_var_list = tree_cons (NULL_TREE, var,
2569 cfun->unexpanded_var_list);
2570 else
2571 cfun->unexpanded_var_list = tree_cons (NULL_TREE, remap_decl (var, id),
2572 cfun->unexpanded_var_list);
2575 /* Clean up. */
2576 pointer_map_destroy (id->decl_map);
2577 id->decl_map = st;
2579 /* If the inlined function returns a result that we care about,
2580 clobber the CALL_EXPR with a reference to the return variable. */
2581 if (use_retvar && (TREE_CODE (bsi_stmt (stmt_bsi)) != CALL_EXPR))
2583 *tp = use_retvar;
2584 if (gimple_in_ssa_p (cfun))
2586 update_stmt (stmt);
2587 mark_symbols_for_renaming (stmt);
2589 maybe_clean_or_replace_eh_stmt (stmt, stmt);
2591 else
2592 /* We're modifying a TSI owned by gimple_expand_calls_inline();
2593 tsi_delink() will leave the iterator in a sane state. */
2595 /* Handle case of inlining function that miss return statement so
2596 return value becomes undefined. */
2597 if (TREE_CODE (stmt) == GIMPLE_MODIFY_STMT
2598 && TREE_CODE (GIMPLE_STMT_OPERAND (stmt, 0)) == SSA_NAME)
2600 tree name = TREE_OPERAND (stmt, 0);
2601 tree var = SSA_NAME_VAR (TREE_OPERAND (stmt, 0));
2602 tree def = gimple_default_def (cfun, var);
2604 /* If the variable is used undefined, make this name undefined via
2605 move. */
2606 if (def)
2608 TREE_OPERAND (stmt, 1) = def;
2609 update_stmt (stmt);
2611 /* Otherwise make this variable undefined. */
2612 else
2614 bsi_remove (&stmt_bsi, true);
2615 set_default_def (var, name);
2616 SSA_NAME_DEF_STMT (name) = build_empty_stmt ();
2619 else
2620 bsi_remove (&stmt_bsi, true);
2623 if (purge_dead_abnormal_edges)
2624 tree_purge_dead_abnormal_call_edges (return_block);
2626 /* If the value of the new expression is ignored, that's OK. We
2627 don't warn about this for CALL_EXPRs, so we shouldn't warn about
2628 the equivalent inlined version either. */
2629 TREE_USED (*tp) = 1;
2631 /* Output the inlining info for this abstract function, since it has been
2632 inlined. If we don't do this now, we can lose the information about the
2633 variables in the function when the blocks get blown away as soon as we
2634 remove the cgraph node. */
2635 (*debug_hooks->outlining_inline_function) (cg_edge->callee->decl);
2637 /* Update callgraph if needed. */
2638 cgraph_remove_node (cg_edge->callee);
2640 id->block = NULL_TREE;
2641 successfully_inlined = TRUE;
2643 egress:
2644 input_location = saved_location;
2645 return successfully_inlined;
2648 /* Expand call statements reachable from STMT_P.
2649 We can only have CALL_EXPRs as the "toplevel" tree code or nested
2650 in a GIMPLE_MODIFY_STMT. See tree-gimple.c:get_call_expr_in(). We can
2651 unfortunately not use that function here because we need a pointer
2652 to the CALL_EXPR, not the tree itself. */
2654 static bool
2655 gimple_expand_calls_inline (basic_block bb, copy_body_data *id)
2657 block_stmt_iterator bsi;
2659 /* Register specific tree functions. */
2660 tree_register_cfg_hooks ();
2661 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2663 tree *expr_p = bsi_stmt_ptr (bsi);
2664 tree stmt = *expr_p;
2666 if (TREE_CODE (*expr_p) == GIMPLE_MODIFY_STMT)
2667 expr_p = &GIMPLE_STMT_OPERAND (*expr_p, 1);
2668 if (TREE_CODE (*expr_p) == WITH_SIZE_EXPR)
2669 expr_p = &TREE_OPERAND (*expr_p, 0);
2670 if (TREE_CODE (*expr_p) == CALL_EXPR)
2671 if (expand_call_inline (bb, stmt, expr_p, id))
2672 return true;
2674 return false;
2677 /* Walk all basic blocks created after FIRST and try to fold every statement
2678 in the STATEMENTS pointer set. */
2679 static void
2680 fold_marked_statements (int first, struct pointer_set_t *statements)
2682 for (;first < n_basic_blocks;first++)
2683 if (BASIC_BLOCK (first))
2685 block_stmt_iterator bsi;
2686 for (bsi = bsi_start (BASIC_BLOCK (first));
2687 !bsi_end_p (bsi); bsi_next (&bsi))
2688 if (pointer_set_contains (statements, bsi_stmt (bsi)))
2690 tree old_stmt = bsi_stmt (bsi);
2691 if (fold_stmt (bsi_stmt_ptr (bsi)))
2693 update_stmt (bsi_stmt (bsi));
2694 if (maybe_clean_or_replace_eh_stmt (old_stmt, bsi_stmt (bsi)))
2695 tree_purge_dead_eh_edges (BASIC_BLOCK (first));
2701 /* Return true if BB has at least one abnormal outgoing edge. */
2703 static inline bool
2704 has_abnormal_outgoing_edge_p (basic_block bb)
2706 edge e;
2707 edge_iterator ei;
2709 FOR_EACH_EDGE (e, ei, bb->succs)
2710 if (e->flags & EDGE_ABNORMAL)
2711 return true;
2713 return false;
2716 /* When a block from the inlined function contains a call with side-effects
2717 in the middle gets inlined in a function with non-locals labels, the call
2718 becomes a potential non-local goto so we need to add appropriate edge. */
2720 static void
2721 make_nonlocal_label_edges (void)
2723 block_stmt_iterator bsi;
2724 basic_block bb;
2726 FOR_EACH_BB (bb)
2728 for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
2730 tree stmt = bsi_stmt (bsi);
2731 if (tree_can_make_abnormal_goto (stmt))
2733 if (stmt == bsi_stmt (bsi_last (bb)))
2735 if (!has_abnormal_outgoing_edge_p (bb))
2736 make_abnormal_goto_edges (bb, true);
2738 else
2740 edge e = split_block (bb, stmt);
2741 bb = e->src;
2742 make_abnormal_goto_edges (bb, true);
2744 break;
2747 /* Update PHIs on nonlocal goto receivers we (possibly)
2748 just created new edges into. */
2749 if (TREE_CODE (stmt) == LABEL_EXPR
2750 && gimple_in_ssa_p (cfun))
2752 tree target = LABEL_EXPR_LABEL (stmt);
2753 if (DECL_NONLOCAL (target))
2755 tree phi;
2757 for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
2759 gcc_assert (SSA_NAME_OCCURS_IN_ABNORMAL_PHI
2760 (PHI_RESULT (phi)));
2761 mark_sym_for_renaming
2762 (SSA_NAME_VAR (PHI_RESULT (phi)));
2770 /* Expand calls to inline functions in the body of FN. */
2772 unsigned int
2773 optimize_inline_calls (tree fn)
2775 copy_body_data id;
2776 tree prev_fn;
2777 basic_block bb;
2778 int last = n_basic_blocks;
2779 /* There is no point in performing inlining if errors have already
2780 occurred -- and we might crash if we try to inline invalid
2781 code. */
2782 if (errorcount || sorrycount)
2783 return 0;
2785 /* Clear out ID. */
2786 memset (&id, 0, sizeof (id));
2788 id.src_node = id.dst_node = cgraph_node (fn);
2789 id.dst_fn = fn;
2790 /* Or any functions that aren't finished yet. */
2791 prev_fn = NULL_TREE;
2792 if (current_function_decl)
2794 id.dst_fn = current_function_decl;
2795 prev_fn = current_function_decl;
2798 id.copy_decl = copy_decl_maybe_to_var;
2799 id.transform_call_graph_edges = CB_CGE_DUPLICATE;
2800 id.transform_new_cfg = false;
2801 id.transform_return_to_modify = true;
2802 id.transform_lang_insert_block = false;
2803 id.statements_to_fold = pointer_set_create ();
2805 push_gimplify_context ();
2807 /* Reach the trees by walking over the CFG, and note the
2808 enclosing basic-blocks in the call edges. */
2809 /* We walk the blocks going forward, because inlined function bodies
2810 will split id->current_basic_block, and the new blocks will
2811 follow it; we'll trudge through them, processing their CALL_EXPRs
2812 along the way. */
2813 FOR_EACH_BB (bb)
2814 gimple_expand_calls_inline (bb, &id);
2816 pop_gimplify_context (NULL);
2817 /* Renumber the (code) basic_blocks consecutively. */
2818 compact_blocks ();
2819 /* Renumber the lexical scoping (non-code) blocks consecutively. */
2820 number_blocks (fn);
2822 #ifdef ENABLE_CHECKING
2824 struct cgraph_edge *e;
2826 verify_cgraph_node (id.dst_node);
2828 /* Double check that we inlined everything we are supposed to inline. */
2829 for (e = id.dst_node->callees; e; e = e->next_callee)
2830 gcc_assert (e->inline_failed);
2832 #endif
2834 /* We are not going to maintain the cgraph edges up to date.
2835 Kill it so it won't confuse us. */
2836 cgraph_node_remove_callees (id.dst_node);
2838 fold_marked_statements (last, id.statements_to_fold);
2839 pointer_set_destroy (id.statements_to_fold);
2840 fold_cond_expr_cond ();
2841 if (current_function_has_nonlocal_label)
2842 make_nonlocal_label_edges ();
2843 /* We make no attempts to keep dominance info up-to-date. */
2844 free_dominance_info (CDI_DOMINATORS);
2845 free_dominance_info (CDI_POST_DOMINATORS);
2846 /* It would be nice to check SSA/CFG/statement consistency here, but it is
2847 not possible yet - the IPA passes might make various functions to not
2848 throw and they don't care to proactively update local EH info. This is
2849 done later in fixup_cfg pass that also execute the verification. */
2850 return (TODO_update_ssa | TODO_cleanup_cfg
2851 | (gimple_in_ssa_p (cfun) ? TODO_remove_unused_locals : 0)
2852 | (profile_status != PROFILE_ABSENT ? TODO_rebuild_frequencies : 0));
2855 /* FN is a function that has a complete body, and CLONE is a function whose
2856 body is to be set to a copy of FN, mapping argument declarations according
2857 to the ARG_MAP splay_tree. */
2859 void
2860 clone_body (tree clone, tree fn, void *arg_map)
2862 copy_body_data id;
2864 /* Clone the body, as if we were making an inline call. But, remap the
2865 parameters in the callee to the parameters of caller. */
2866 memset (&id, 0, sizeof (id));
2867 id.src_fn = fn;
2868 id.dst_fn = clone;
2869 id.src_cfun = DECL_STRUCT_FUNCTION (fn);
2870 id.decl_map = (struct pointer_map_t *)arg_map;
2872 id.copy_decl = copy_decl_no_change;
2873 id.transform_call_graph_edges = CB_CGE_DUPLICATE;
2874 id.transform_new_cfg = true;
2875 id.transform_return_to_modify = false;
2876 id.transform_lang_insert_block = true;
2878 /* We're not inside any EH region. */
2879 id.eh_region = -1;
2881 /* Actually copy the body. */
2882 append_to_statement_list_force (copy_generic_body (&id), &DECL_SAVED_TREE (clone));
2885 /* Passed to walk_tree. Copies the node pointed to, if appropriate. */
2887 tree
2888 copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
2890 enum tree_code code = TREE_CODE (*tp);
2891 enum tree_code_class cl = TREE_CODE_CLASS (code);
2893 /* We make copies of most nodes. */
2894 if (IS_EXPR_CODE_CLASS (cl)
2895 || IS_GIMPLE_STMT_CODE_CLASS (cl)
2896 || code == TREE_LIST
2897 || code == TREE_VEC
2898 || code == TYPE_DECL
2899 || code == OMP_CLAUSE)
2901 /* Because the chain gets clobbered when we make a copy, we save it
2902 here. */
2903 tree chain = NULL_TREE, new;
2905 if (!GIMPLE_TUPLE_P (*tp))
2906 chain = TREE_CHAIN (*tp);
2908 /* Copy the node. */
2909 new = copy_node (*tp);
2911 /* Propagate mudflap marked-ness. */
2912 if (flag_mudflap && mf_marked_p (*tp))
2913 mf_mark (new);
2915 *tp = new;
2917 /* Now, restore the chain, if appropriate. That will cause
2918 walk_tree to walk into the chain as well. */
2919 if (code == PARM_DECL
2920 || code == TREE_LIST
2921 || code == OMP_CLAUSE)
2922 TREE_CHAIN (*tp) = chain;
2924 /* For now, we don't update BLOCKs when we make copies. So, we
2925 have to nullify all BIND_EXPRs. */
2926 if (TREE_CODE (*tp) == BIND_EXPR)
2927 BIND_EXPR_BLOCK (*tp) = NULL_TREE;
2929 else if (code == CONSTRUCTOR)
2931 /* CONSTRUCTOR nodes need special handling because
2932 we need to duplicate the vector of elements. */
2933 tree new;
2935 new = copy_node (*tp);
2937 /* Propagate mudflap marked-ness. */
2938 if (flag_mudflap && mf_marked_p (*tp))
2939 mf_mark (new);
2941 CONSTRUCTOR_ELTS (new) = VEC_copy (constructor_elt, gc,
2942 CONSTRUCTOR_ELTS (*tp));
2943 *tp = new;
2945 else if (TREE_CODE_CLASS (code) == tcc_type)
2946 *walk_subtrees = 0;
2947 else if (TREE_CODE_CLASS (code) == tcc_declaration)
2948 *walk_subtrees = 0;
2949 else if (TREE_CODE_CLASS (code) == tcc_constant)
2950 *walk_subtrees = 0;
2951 else
2952 gcc_assert (code != STATEMENT_LIST);
2953 return NULL_TREE;
2956 /* The SAVE_EXPR pointed to by TP is being copied. If ST contains
2957 information indicating to what new SAVE_EXPR this one should be mapped,
2958 use that one. Otherwise, create a new node and enter it in ST. FN is
2959 the function into which the copy will be placed. */
2961 static void
2962 remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
2964 struct pointer_map_t *st = (struct pointer_map_t *) st_;
2965 tree *n;
2966 tree t;
2968 /* See if we already encountered this SAVE_EXPR. */
2969 n = (tree *) pointer_map_contains (st, *tp);
2971 /* If we didn't already remap this SAVE_EXPR, do so now. */
2972 if (!n)
2974 t = copy_node (*tp);
2976 /* Remember this SAVE_EXPR. */
2977 *pointer_map_insert (st, *tp) = t;
2978 /* Make sure we don't remap an already-remapped SAVE_EXPR. */
2979 *pointer_map_insert (st, t) = t;
2981 else
2983 /* We've already walked into this SAVE_EXPR; don't do it again. */
2984 *walk_subtrees = 0;
2985 t = *n;
2988 /* Replace this SAVE_EXPR with the copy. */
2989 *tp = t;
2992 /* Called via walk_tree. If *TP points to a DECL_STMT for a local label,
2993 copies the declaration and enters it in the splay_tree in DATA (which is
2994 really an `copy_body_data *'). */
2996 static tree
2997 mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2998 void *data)
3000 copy_body_data *id = (copy_body_data *) data;
3002 /* Don't walk into types. */
3003 if (TYPE_P (*tp))
3004 *walk_subtrees = 0;
3006 else if (TREE_CODE (*tp) == LABEL_EXPR)
3008 tree decl = TREE_OPERAND (*tp, 0);
3010 /* Copy the decl and remember the copy. */
3011 insert_decl_map (id, decl, id->copy_decl (decl, id));
3014 return NULL_TREE;
3017 /* Perform any modifications to EXPR required when it is unsaved. Does
3018 not recurse into EXPR's subtrees. */
3020 static void
3021 unsave_expr_1 (tree expr)
3023 switch (TREE_CODE (expr))
3025 case TARGET_EXPR:
3026 /* Don't mess with a TARGET_EXPR that hasn't been expanded.
3027 It's OK for this to happen if it was part of a subtree that
3028 isn't immediately expanded, such as operand 2 of another
3029 TARGET_EXPR. */
3030 if (TREE_OPERAND (expr, 1))
3031 break;
3033 TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
3034 TREE_OPERAND (expr, 3) = NULL_TREE;
3035 break;
3037 default:
3038 break;
3042 /* Called via walk_tree when an expression is unsaved. Using the
3043 splay_tree pointed to by ST (which is really a `splay_tree'),
3044 remaps all local declarations to appropriate replacements. */
3046 static tree
3047 unsave_r (tree *tp, int *walk_subtrees, void *data)
3049 copy_body_data *id = (copy_body_data *) data;
3050 struct pointer_map_t *st = id->decl_map;
3051 tree *n;
3053 /* Only a local declaration (variable or label). */
3054 if ((TREE_CODE (*tp) == VAR_DECL && !TREE_STATIC (*tp))
3055 || TREE_CODE (*tp) == LABEL_DECL)
3057 /* Lookup the declaration. */
3058 n = (tree *) pointer_map_contains (st, *tp);
3060 /* If it's there, remap it. */
3061 if (n)
3062 *tp = *n;
3065 else if (TREE_CODE (*tp) == STATEMENT_LIST)
3066 copy_statement_list (tp);
3067 else if (TREE_CODE (*tp) == BIND_EXPR)
3068 copy_bind_expr (tp, walk_subtrees, id);
3069 else if (TREE_CODE (*tp) == SAVE_EXPR)
3070 remap_save_expr (tp, st, walk_subtrees);
3071 else
3073 copy_tree_r (tp, walk_subtrees, NULL);
3075 /* Do whatever unsaving is required. */
3076 unsave_expr_1 (*tp);
3079 /* Keep iterating. */
3080 return NULL_TREE;
3083 /* Copies everything in EXPR and replaces variables, labels
3084 and SAVE_EXPRs local to EXPR. */
3086 tree
3087 unsave_expr_now (tree expr)
3089 copy_body_data id;
3091 /* There's nothing to do for NULL_TREE. */
3092 if (expr == 0)
3093 return expr;
3095 /* Set up ID. */
3096 memset (&id, 0, sizeof (id));
3097 id.src_fn = current_function_decl;
3098 id.dst_fn = current_function_decl;
3099 id.decl_map = pointer_map_create ();
3101 id.copy_decl = copy_decl_no_change;
3102 id.transform_call_graph_edges = CB_CGE_DUPLICATE;
3103 id.transform_new_cfg = false;
3104 id.transform_return_to_modify = false;
3105 id.transform_lang_insert_block = false;
3107 /* Walk the tree once to find local labels. */
3108 walk_tree_without_duplicates (&expr, mark_local_for_remap_r, &id);
3110 /* Walk the tree again, copying, remapping, and unsaving. */
3111 walk_tree (&expr, unsave_r, &id, NULL);
3113 /* Clean up. */
3114 pointer_map_destroy (id.decl_map);
3116 return expr;
3119 /* Allow someone to determine if SEARCH is a child of TOP from gdb. */
3121 static tree
3122 debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
3124 if (*tp == data)
3125 return (tree) data;
3126 else
3127 return NULL;
3130 bool
3131 debug_find_tree (tree top, tree search)
3133 return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
3137 /* Declare the variables created by the inliner. Add all the variables in
3138 VARS to BIND_EXPR. */
3140 static void
3141 declare_inline_vars (tree block, tree vars)
3143 tree t;
3144 for (t = vars; t; t = TREE_CHAIN (t))
3146 DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
3147 gcc_assert (!TREE_STATIC (t) && !TREE_ASM_WRITTEN (t));
3148 cfun->unexpanded_var_list =
3149 tree_cons (NULL_TREE, t,
3150 cfun->unexpanded_var_list);
3153 if (block)
3154 BLOCK_VARS (block) = chainon (BLOCK_VARS (block), vars);
3158 /* Copy NODE (which must be a DECL). The DECL originally was in the FROM_FN,
3159 but now it will be in the TO_FN. PARM_TO_VAR means enable PARM_DECL to
3160 VAR_DECL translation. */
3162 static tree
3163 copy_decl_for_dup_finish (copy_body_data *id, tree decl, tree copy)
3165 /* Don't generate debug information for the copy if we wouldn't have
3166 generated it for the copy either. */
3167 DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (decl);
3168 DECL_IGNORED_P (copy) = DECL_IGNORED_P (decl);
3170 /* Set the DECL_ABSTRACT_ORIGIN so the debugging routines know what
3171 declaration inspired this copy. */
3172 DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
3174 /* The new variable/label has no RTL, yet. */
3175 if (CODE_CONTAINS_STRUCT (TREE_CODE (copy), TS_DECL_WRTL)
3176 && !TREE_STATIC (copy) && !DECL_EXTERNAL (copy))
3177 SET_DECL_RTL (copy, NULL_RTX);
3179 /* These args would always appear unused, if not for this. */
3180 TREE_USED (copy) = 1;
3182 /* Set the context for the new declaration. */
3183 if (!DECL_CONTEXT (decl))
3184 /* Globals stay global. */
3186 else if (DECL_CONTEXT (decl) != id->src_fn)
3187 /* Things that weren't in the scope of the function we're inlining
3188 from aren't in the scope we're inlining to, either. */
3190 else if (TREE_STATIC (decl))
3191 /* Function-scoped static variables should stay in the original
3192 function. */
3194 else
3195 /* Ordinary automatic local variables are now in the scope of the
3196 new function. */
3197 DECL_CONTEXT (copy) = id->dst_fn;
3199 return copy;
3202 static tree
3203 copy_decl_to_var (tree decl, copy_body_data *id)
3205 tree copy, type;
3207 gcc_assert (TREE_CODE (decl) == PARM_DECL
3208 || TREE_CODE (decl) == RESULT_DECL);
3210 type = TREE_TYPE (decl);
3212 copy = build_decl (VAR_DECL, DECL_NAME (decl), type);
3213 TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
3214 TREE_READONLY (copy) = TREE_READONLY (decl);
3215 TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
3216 DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (decl);
3218 return copy_decl_for_dup_finish (id, decl, copy);
3221 /* Like copy_decl_to_var, but create a return slot object instead of a
3222 pointer variable for return by invisible reference. */
3224 static tree
3225 copy_result_decl_to_var (tree decl, copy_body_data *id)
3227 tree copy, type;
3229 gcc_assert (TREE_CODE (decl) == PARM_DECL
3230 || TREE_CODE (decl) == RESULT_DECL);
3232 type = TREE_TYPE (decl);
3233 if (DECL_BY_REFERENCE (decl))
3234 type = TREE_TYPE (type);
3236 copy = build_decl (VAR_DECL, DECL_NAME (decl), type);
3237 TREE_READONLY (copy) = TREE_READONLY (decl);
3238 TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
3239 if (!DECL_BY_REFERENCE (decl))
3241 TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
3242 DECL_GIMPLE_REG_P (copy) = DECL_GIMPLE_REG_P (decl);
3245 return copy_decl_for_dup_finish (id, decl, copy);
3249 static tree
3250 copy_decl_no_change (tree decl, copy_body_data *id)
3252 tree copy;
3254 copy = copy_node (decl);
3256 /* The COPY is not abstract; it will be generated in DST_FN. */
3257 DECL_ABSTRACT (copy) = 0;
3258 lang_hooks.dup_lang_specific_decl (copy);
3260 /* TREE_ADDRESSABLE isn't used to indicate that a label's address has
3261 been taken; it's for internal bookkeeping in expand_goto_internal. */
3262 if (TREE_CODE (copy) == LABEL_DECL)
3264 TREE_ADDRESSABLE (copy) = 0;
3265 LABEL_DECL_UID (copy) = -1;
3268 return copy_decl_for_dup_finish (id, decl, copy);
3271 static tree
3272 copy_decl_maybe_to_var (tree decl, copy_body_data *id)
3274 if (TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == RESULT_DECL)
3275 return copy_decl_to_var (decl, id);
3276 else
3277 return copy_decl_no_change (decl, id);
3280 /* Return a copy of the function's argument tree. */
3281 static tree
3282 copy_arguments_for_versioning (tree orig_parm, copy_body_data * id)
3284 tree *arg_copy, *parg;
3286 arg_copy = &orig_parm;
3287 for (parg = arg_copy; *parg; parg = &TREE_CHAIN (*parg))
3289 tree new = remap_decl (*parg, id);
3290 lang_hooks.dup_lang_specific_decl (new);
3291 TREE_CHAIN (new) = TREE_CHAIN (*parg);
3292 *parg = new;
3294 return orig_parm;
3297 /* Return a copy of the function's static chain. */
3298 static tree
3299 copy_static_chain (tree static_chain, copy_body_data * id)
3301 tree *chain_copy, *pvar;
3303 chain_copy = &static_chain;
3304 for (pvar = chain_copy; *pvar; pvar = &TREE_CHAIN (*pvar))
3306 tree new = remap_decl (*pvar, id);
3307 lang_hooks.dup_lang_specific_decl (new);
3308 TREE_CHAIN (new) = TREE_CHAIN (*pvar);
3309 *pvar = new;
3311 return static_chain;
3314 /* Return true if the function is allowed to be versioned.
3315 This is a guard for the versioning functionality. */
3316 bool
3317 tree_versionable_function_p (tree fndecl)
3319 if (fndecl == NULL_TREE)
3320 return false;
3321 /* ??? There are cases where a function is
3322 uninlinable but can be versioned. */
3323 if (!tree_inlinable_function_p (fndecl))
3324 return false;
3326 return true;
3329 /* Create a copy of a function's tree.
3330 OLD_DECL and NEW_DECL are FUNCTION_DECL tree nodes
3331 of the original function and the new copied function
3332 respectively. In case we want to replace a DECL
3333 tree with another tree while duplicating the function's
3334 body, TREE_MAP represents the mapping between these
3335 trees. If UPDATE_CLONES is set, the call_stmt fields
3336 of edges of clones of the function will be updated. */
3337 void
3338 tree_function_versioning (tree old_decl, tree new_decl, varray_type tree_map,
3339 bool update_clones)
3341 struct cgraph_node *old_version_node;
3342 struct cgraph_node *new_version_node;
3343 copy_body_data id;
3344 tree p;
3345 unsigned i;
3346 struct ipa_replace_map *replace_info;
3347 basic_block old_entry_block;
3348 tree t_step;
3349 tree old_current_function_decl = current_function_decl;
3351 gcc_assert (TREE_CODE (old_decl) == FUNCTION_DECL
3352 && TREE_CODE (new_decl) == FUNCTION_DECL);
3353 DECL_POSSIBLY_INLINED (old_decl) = 1;
3355 old_version_node = cgraph_node (old_decl);
3356 new_version_node = cgraph_node (new_decl);
3358 DECL_ARTIFICIAL (new_decl) = 1;
3359 DECL_ABSTRACT_ORIGIN (new_decl) = DECL_ORIGIN (old_decl);
3361 /* Prepare the data structures for the tree copy. */
3362 memset (&id, 0, sizeof (id));
3364 /* Generate a new name for the new version. */
3365 if (!update_clones)
3367 DECL_NAME (new_decl) = create_tmp_var_name (NULL);
3368 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
3369 SET_DECL_RTL (new_decl, NULL_RTX);
3370 id.statements_to_fold = pointer_set_create ();
3373 id.decl_map = pointer_map_create ();
3374 id.src_fn = old_decl;
3375 id.dst_fn = new_decl;
3376 id.src_node = old_version_node;
3377 id.dst_node = new_version_node;
3378 id.src_cfun = DECL_STRUCT_FUNCTION (old_decl);
3380 id.copy_decl = copy_decl_no_change;
3381 id.transform_call_graph_edges
3382 = update_clones ? CB_CGE_MOVE_CLONES : CB_CGE_MOVE;
3383 id.transform_new_cfg = true;
3384 id.transform_return_to_modify = false;
3385 id.transform_lang_insert_block = false;
3387 current_function_decl = new_decl;
3388 old_entry_block = ENTRY_BLOCK_PTR_FOR_FUNCTION
3389 (DECL_STRUCT_FUNCTION (old_decl));
3390 initialize_cfun (new_decl, old_decl,
3391 old_entry_block->count,
3392 old_entry_block->frequency);
3393 push_cfun (DECL_STRUCT_FUNCTION (new_decl));
3395 /* Copy the function's static chain. */
3396 p = DECL_STRUCT_FUNCTION (old_decl)->static_chain_decl;
3397 if (p)
3398 DECL_STRUCT_FUNCTION (new_decl)->static_chain_decl =
3399 copy_static_chain (DECL_STRUCT_FUNCTION (old_decl)->static_chain_decl,
3400 &id);
3401 /* Copy the function's arguments. */
3402 if (DECL_ARGUMENTS (old_decl) != NULL_TREE)
3403 DECL_ARGUMENTS (new_decl) =
3404 copy_arguments_for_versioning (DECL_ARGUMENTS (old_decl), &id);
3406 /* If there's a tree_map, prepare for substitution. */
3407 if (tree_map)
3408 for (i = 0; i < VARRAY_ACTIVE_SIZE (tree_map); i++)
3410 replace_info = VARRAY_GENERIC_PTR (tree_map, i);
3411 if (replace_info->replace_p)
3412 insert_decl_map (&id, replace_info->old_tree,
3413 replace_info->new_tree);
3416 DECL_INITIAL (new_decl) = remap_blocks (DECL_INITIAL (id.src_fn), &id);
3418 /* Renumber the lexical scoping (non-code) blocks consecutively. */
3419 number_blocks (id.dst_fn);
3421 if (DECL_STRUCT_FUNCTION (old_decl)->unexpanded_var_list != NULL_TREE)
3422 /* Add local vars. */
3423 for (t_step = DECL_STRUCT_FUNCTION (old_decl)->unexpanded_var_list;
3424 t_step; t_step = TREE_CHAIN (t_step))
3426 tree var = TREE_VALUE (t_step);
3427 if (TREE_STATIC (var) && !TREE_ASM_WRITTEN (var))
3428 cfun->unexpanded_var_list = tree_cons (NULL_TREE, var,
3429 cfun->unexpanded_var_list);
3430 else
3431 cfun->unexpanded_var_list =
3432 tree_cons (NULL_TREE, remap_decl (var, &id),
3433 cfun->unexpanded_var_list);
3436 /* Copy the Function's body. */
3437 copy_body (&id, old_entry_block->count, old_entry_block->frequency, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR);
3439 if (DECL_RESULT (old_decl) != NULL_TREE)
3441 tree *res_decl = &DECL_RESULT (old_decl);
3442 DECL_RESULT (new_decl) = remap_decl (*res_decl, &id);
3443 lang_hooks.dup_lang_specific_decl (DECL_RESULT (new_decl));
3446 /* Renumber the lexical scoping (non-code) blocks consecutively. */
3447 number_blocks (new_decl);
3449 /* Clean up. */
3450 pointer_map_destroy (id.decl_map);
3451 if (!update_clones)
3453 fold_marked_statements (0, id.statements_to_fold);
3454 pointer_set_destroy (id.statements_to_fold);
3455 fold_cond_expr_cond ();
3457 if (gimple_in_ssa_p (cfun))
3459 free_dominance_info (CDI_DOMINATORS);
3460 free_dominance_info (CDI_POST_DOMINATORS);
3461 if (!update_clones)
3462 delete_unreachable_blocks ();
3463 update_ssa (TODO_update_ssa);
3464 if (!update_clones)
3466 fold_cond_expr_cond ();
3467 if (need_ssa_update_p ())
3468 update_ssa (TODO_update_ssa);
3471 free_dominance_info (CDI_DOMINATORS);
3472 free_dominance_info (CDI_POST_DOMINATORS);
3473 pop_cfun ();
3474 current_function_decl = old_current_function_decl;
3475 gcc_assert (!current_function_decl
3476 || DECL_STRUCT_FUNCTION (current_function_decl) == cfun);
3477 return;
3480 /* Duplicate a type, fields and all. */
3482 tree
3483 build_duplicate_type (tree type)
3485 struct copy_body_data id;
3487 memset (&id, 0, sizeof (id));
3488 id.src_fn = current_function_decl;
3489 id.dst_fn = current_function_decl;
3490 id.src_cfun = cfun;
3491 id.decl_map = pointer_map_create ();
3493 type = remap_type_1 (type, &id);
3495 pointer_map_destroy (id.decl_map);
3497 return type;