1 /* Control and data flow functions for trees.
2 Copyright 2001, 2002 Free Software Foundation, Inc.
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
24 #include "coretypes.h"
28 #include "tree-inline.h"
34 #include "insn-config.h"
35 #include "integrate.h"
38 #include "splay-tree.h"
39 #include "langhooks.h"
41 /* This should be eventually be generalized to other languages, but
42 this would require a shared function-as-trees infrastructure. */
43 #ifndef INLINER_FOR_JAVA
45 #else /* INLINER_FOR_JAVA */
47 #include "java-tree.h"
48 #endif /* INLINER_FOR_JAVA */
50 /* 0 if we should not perform inlining.
51 1 if we should expand functions calls inline at the tree level.
52 2 if we should consider *all* functions to be inline
55 int flag_inline_trees
= 0;
59 o In order to make inlining-on-trees work, we pessimized
60 function-local static constants. In particular, they are now
61 always output, even when not addressed. Fix this by treating
62 function-local static constants just like global static
63 constants; the back-end already knows not to output them if they
66 o Provide heuristics to clamp inlining of recursive template
69 /* Data required for function inlining. */
71 typedef struct inline_data
73 /* A stack of the functions we are inlining. For example, if we are
74 compiling `f', which calls `g', which calls `h', and we are
75 inlining the body of `h', the stack will contain, `h', followed
76 by `g', followed by `f'. The first few elements of the stack may
77 contain other functions that we know we should not recurse into,
78 even though they are not directly being inlined. */
80 /* The index of the first element of FNS that really represents an
82 unsigned first_inlined_fn
;
83 /* The label to jump to when a return statement is encountered. If
84 this value is NULL, then return statements will simply be
85 remapped as return statements, rather than as jumps. */
87 /* The map from local declarations in the inlined function to
88 equivalents in the function into which it is being inlined. */
90 /* Nonzero if we are currently within the cleanup for a
92 int in_target_cleanup_p
;
93 /* A list of the functions current function has inlined. */
94 varray_type inlined_fns
;
95 /* The approximate number of statements we have inlined in the
96 current call stack. */
98 /* We use the same mechanism to build clones that we do to perform
99 inlining. However, there are a few places where we need to
100 distinguish between those two situations. This flag is true if
101 we are cloning, rather than inlining. */
103 /* Hash table used to prevent walk_tree from visiting the same node
104 umpteen million times. */
110 static tree declare_return_variable
PARAMS ((inline_data
*, tree
, tree
*));
111 static tree copy_body_r
PARAMS ((tree
*, int *, void *));
112 static tree copy_body
PARAMS ((inline_data
*));
113 static tree expand_call_inline
PARAMS ((tree
*, int *, void *));
114 static void expand_calls_inline
PARAMS ((tree
*, inline_data
*));
115 static int inlinable_function_p
PARAMS ((tree
, inline_data
*));
116 static tree remap_decl
PARAMS ((tree
, inline_data
*));
117 #ifndef INLINER_FOR_JAVA
118 static tree initialize_inlined_parameters
PARAMS ((inline_data
*, tree
, tree
));
119 static void remap_block
PARAMS ((tree
, tree
, inline_data
*));
120 static void copy_scope_stmt
PARAMS ((tree
*, int *, inline_data
*));
121 #else /* INLINER_FOR_JAVA */
122 static tree initialize_inlined_parameters
PARAMS ((inline_data
*, tree
, tree
, tree
));
123 static void remap_block
PARAMS ((tree
*, tree
, inline_data
*));
124 static tree add_stmt_to_compound
PARAMS ((tree
, tree
, tree
));
125 #endif /* INLINER_FOR_JAVA */
126 static tree find_alloca_call_1
PARAMS ((tree
*, int *, void *));
127 static tree find_alloca_call
PARAMS ((tree
));
128 static tree find_builtin_longjmp_call_1
PARAMS ((tree
*, int *, void *));
129 static tree find_builtin_longjmp_call
PARAMS ((tree
));
131 /* The approximate number of instructions per statement. This number
132 need not be particularly accurate; it is used only to make
133 decisions about when a function is too big to inline. */
134 #define INSNS_PER_STMT (10)
136 /* Remap DECL during the copying of the BLOCK tree for the function. */
139 remap_decl (decl
, id
)
146 /* We only remap local variables in the current function. */
147 fn
= VARRAY_TOP_TREE (id
->fns
);
148 if (! (*lang_hooks
.tree_inlining
.auto_var_in_fn_p
) (decl
, fn
))
151 /* See if we have remapped this declaration. */
152 n
= splay_tree_lookup (id
->decl_map
, (splay_tree_key
) decl
);
153 /* If we didn't already have an equivalent for this declaration,
159 /* Make a copy of the variable or label. */
160 t
= copy_decl_for_inlining (decl
, fn
,
161 VARRAY_TREE (id
->fns
, 0));
163 /* The decl T could be a dynamic array or other variable size type,
164 in which case some fields need to be remapped because they may
165 contain SAVE_EXPRs. */
166 if (TREE_TYPE (t
) && TREE_CODE (TREE_TYPE (t
)) == ARRAY_TYPE
167 && TYPE_DOMAIN (TREE_TYPE (t
)))
169 TREE_TYPE (t
) = copy_node (TREE_TYPE (t
));
170 TYPE_DOMAIN (TREE_TYPE (t
))
171 = copy_node (TYPE_DOMAIN (TREE_TYPE (t
)));
172 walk_tree (&TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t
))),
173 copy_body_r
, id
, NULL
);
176 #ifndef INLINER_FOR_JAVA
177 if (! DECL_NAME (t
) && TREE_TYPE (t
)
178 && (*lang_hooks
.tree_inlining
.anon_aggr_type_p
) (TREE_TYPE (t
)))
180 /* For a VAR_DECL of anonymous type, we must also copy the
181 member VAR_DECLS here and rechain the
182 DECL_ANON_UNION_ELEMS. */
186 for (src
= DECL_ANON_UNION_ELEMS (t
); src
;
187 src
= TREE_CHAIN (src
))
189 tree member
= remap_decl (TREE_VALUE (src
), id
);
191 if (TREE_PURPOSE (src
))
193 members
= tree_cons (NULL
, member
, members
);
195 DECL_ANON_UNION_ELEMS (t
) = nreverse (members
);
197 #endif /* not INLINER_FOR_JAVA */
199 /* Remember it, so that if we encounter this local entity
200 again we can reuse this copy. */
201 n
= splay_tree_insert (id
->decl_map
,
202 (splay_tree_key
) decl
,
203 (splay_tree_value
) t
);
206 return (tree
) n
->value
;
209 #ifndef INLINER_FOR_JAVA
210 /* Copy the SCOPE_STMT_BLOCK associated with SCOPE_STMT to contain
211 remapped versions of the variables therein. And hook the new block
212 into the block-tree. If non-NULL, the DECLS are declarations to
213 add to use instead of the BLOCK_VARS in the old block. */
214 #else /* INLINER_FOR_JAVA */
215 /* Copy the BLOCK to contain remapped versions of the variables
216 therein. And hook the new block into the block-tree. */
217 #endif /* INLINER_FOR_JAVA */
220 #ifndef INLINER_FOR_JAVA
221 remap_block (scope_stmt
, decls
, id
)
223 #else /* INLINER_FOR_JAVA */
224 remap_block (block
, decls
, id
)
226 #endif /* INLINER_FOR_JAVA */
230 #ifndef INLINER_FOR_JAVA
231 /* We cannot do this in the cleanup for a TARGET_EXPR since we do
232 not know whether or not expand_expr will actually write out the
233 code we put there. If it does not, then we'll have more BLOCKs
234 than block-notes, and things will go awry. At some point, we
235 should make the back-end handle BLOCK notes in a tidier way,
236 without requiring a strict correspondence to the block-tree; then
237 this check can go. */
238 if (id
->in_target_cleanup_p
)
240 SCOPE_STMT_BLOCK (scope_stmt
) = NULL_TREE
;
244 /* If this is the beginning of a scope, remap the associated BLOCK. */
245 if (SCOPE_BEGIN_P (scope_stmt
) && SCOPE_STMT_BLOCK (scope_stmt
))
252 /* Make the new block. */
253 old_block
= SCOPE_STMT_BLOCK (scope_stmt
);
254 new_block
= make_node (BLOCK
);
255 TREE_USED (new_block
) = TREE_USED (old_block
);
256 BLOCK_ABSTRACT_ORIGIN (new_block
) = old_block
;
257 SCOPE_STMT_BLOCK (scope_stmt
) = new_block
;
259 /* Remap its variables. */
260 for (old_var
= decls
? decls
: BLOCK_VARS (old_block
);
262 old_var
= TREE_CHAIN (old_var
))
266 /* Remap the variable. */
267 new_var
= remap_decl (old_var
, id
);
268 /* If we didn't remap this variable, so we can't mess with
269 its TREE_CHAIN. If we remapped this variable to
270 something other than a declaration (say, if we mapped it
271 to a constant), then we must similarly omit any mention
273 if (!new_var
|| !DECL_P (new_var
))
277 TREE_CHAIN (new_var
) = BLOCK_VARS (new_block
);
278 BLOCK_VARS (new_block
) = new_var
;
281 /* We put the BLOCK_VARS in reverse order; fix that now. */
282 BLOCK_VARS (new_block
) = nreverse (BLOCK_VARS (new_block
));
283 fn
= VARRAY_TREE (id
->fns
, 0);
285 /* We're building a clone; DECL_INITIAL is still
286 error_mark_node, and current_binding_level is the parm
288 (*lang_hooks
.decls
.insert_block
) (new_block
);
291 /* Attach this new block after the DECL_INITIAL block for the
292 function into which this block is being inlined. In
293 rest_of_compilation we will straighten out the BLOCK tree. */
295 if (DECL_INITIAL (fn
))
296 first_block
= &BLOCK_CHAIN (DECL_INITIAL (fn
));
298 first_block
= &DECL_INITIAL (fn
);
299 BLOCK_CHAIN (new_block
) = *first_block
;
300 *first_block
= new_block
;
302 /* Remember the remapped block. */
303 splay_tree_insert (id
->decl_map
,
304 (splay_tree_key
) old_block
,
305 (splay_tree_value
) new_block
);
307 /* If this is the end of a scope, set the SCOPE_STMT_BLOCK to be the
309 else if (SCOPE_END_P (scope_stmt
) && SCOPE_STMT_BLOCK (scope_stmt
))
313 /* Find this block in the table of remapped things. */
314 n
= splay_tree_lookup (id
->decl_map
,
315 (splay_tree_key
) SCOPE_STMT_BLOCK (scope_stmt
));
318 SCOPE_STMT_BLOCK (scope_stmt
) = (tree
) n
->value
;
320 #else /* INLINER_FOR_JAVA */
326 /* Make the new block. */
328 new_block
= make_node (BLOCK
);
329 TREE_USED (new_block
) = TREE_USED (old_block
);
330 BLOCK_ABSTRACT_ORIGIN (new_block
) = old_block
;
331 BLOCK_SUBBLOCKS (new_block
) = BLOCK_SUBBLOCKS (old_block
);
332 TREE_SIDE_EFFECTS (new_block
) = TREE_SIDE_EFFECTS (old_block
);
333 TREE_TYPE (new_block
) = TREE_TYPE (old_block
);
336 /* Remap its variables. */
337 for (old_var
= decls
? decls
: BLOCK_VARS (old_block
);
339 old_var
= TREE_CHAIN (old_var
))
343 /* All local class initialization flags go in the outermost
345 if (LOCAL_CLASS_INITIALIZATION_FLAG_P (old_var
))
347 /* We may already have one. */
348 if (! splay_tree_lookup (id
->decl_map
, (splay_tree_key
) old_var
))
350 tree outermost_block
;
351 new_var
= remap_decl (old_var
, id
);
352 DECL_ABSTRACT_ORIGIN (new_var
) = NULL
;
353 outermost_block
= DECL_SAVED_TREE (current_function_decl
);
354 TREE_CHAIN (new_var
) = BLOCK_VARS (outermost_block
);
355 BLOCK_VARS (outermost_block
) = new_var
;
360 /* Remap the variable. */
361 new_var
= remap_decl (old_var
, id
);
362 /* If we didn't remap this variable, so we can't mess with
363 its TREE_CHAIN. If we remapped this variable to
364 something other than a declaration (say, if we mapped it
365 to a constant), then we must similarly omit any mention
367 if (!new_var
|| !DECL_P (new_var
))
371 TREE_CHAIN (new_var
) = BLOCK_VARS (new_block
);
372 BLOCK_VARS (new_block
) = new_var
;
375 /* We put the BLOCK_VARS in reverse order; fix that now. */
376 BLOCK_VARS (new_block
) = nreverse (BLOCK_VARS (new_block
));
377 fn
= VARRAY_TREE (id
->fns
, 0);
378 /* Remember the remapped block. */
379 splay_tree_insert (id
->decl_map
,
380 (splay_tree_key
) old_block
,
381 (splay_tree_value
) new_block
);
382 #endif /* INLINER_FOR_JAVA */
385 #ifndef INLINER_FOR_JAVA
386 /* Copy the SCOPE_STMT pointed to by TP. */
389 copy_scope_stmt (tp
, walk_subtrees
, id
)
396 /* Remember whether or not this statement was nullified. When
397 making a copy, copy_tree_r always sets SCOPE_NULLIFIED_P (and
398 doesn't copy the SCOPE_STMT_BLOCK) to free callers from having to
399 deal with copying BLOCKs if they do not wish to do so. */
400 block
= SCOPE_STMT_BLOCK (*tp
);
401 /* Copy (and replace) the statement. */
402 copy_tree_r (tp
, walk_subtrees
, NULL
);
403 /* Restore the SCOPE_STMT_BLOCK. */
404 SCOPE_STMT_BLOCK (*tp
) = block
;
406 /* Remap the associated block. */
407 remap_block (*tp
, NULL_TREE
, id
);
409 #endif /* not INLINER_FOR_JAVA */
411 /* Called from copy_body via walk_tree. DATA is really an
414 copy_body_r (tp
, walk_subtrees
, data
)
423 id
= (inline_data
*) data
;
424 fn
= VARRAY_TOP_TREE (id
->fns
);
427 /* All automatic variables should have a DECL_CONTEXT indicating
428 what function they come from. */
429 if ((TREE_CODE (*tp
) == VAR_DECL
|| TREE_CODE (*tp
) == LABEL_DECL
)
430 && DECL_NAMESPACE_SCOPE_P (*tp
))
431 if (! DECL_EXTERNAL (*tp
) && ! TREE_STATIC (*tp
))
435 #ifdef INLINER_FOR_JAVA
436 if (TREE_CODE (*tp
) == BLOCK
)
437 remap_block (tp
, NULL_TREE
, id
);
440 /* If this is a RETURN_STMT, change it into an EXPR_STMT and a
441 GOTO_STMT with the RET_LABEL as its target. */
442 #ifndef INLINER_FOR_JAVA
443 if (TREE_CODE (*tp
) == RETURN_STMT
&& id
->ret_label
)
444 #else /* INLINER_FOR_JAVA */
445 if (TREE_CODE (*tp
) == RETURN_EXPR
&& id
->ret_label
)
446 #endif /* INLINER_FOR_JAVA */
448 tree return_stmt
= *tp
;
451 /* Build the GOTO_STMT. */
452 #ifndef INLINER_FOR_JAVA
453 goto_stmt
= build_stmt (GOTO_STMT
, id
->ret_label
);
454 TREE_CHAIN (goto_stmt
) = TREE_CHAIN (return_stmt
);
455 GOTO_FAKE_P (goto_stmt
) = 1;
456 #else /* INLINER_FOR_JAVA */
457 tree assignment
= TREE_OPERAND (return_stmt
, 0);
458 goto_stmt
= build1 (GOTO_EXPR
, void_type_node
, id
->ret_label
);
459 TREE_SIDE_EFFECTS (goto_stmt
) = 1;
460 #endif /* INLINER_FOR_JAVA */
462 /* If we're returning something, just turn that into an
463 assignment into the equivalent of the original
465 #ifndef INLINER_FOR_JAVA
466 if (RETURN_STMT_EXPR (return_stmt
))
468 *tp
= build_stmt (EXPR_STMT
,
469 RETURN_STMT_EXPR (return_stmt
));
470 STMT_IS_FULL_EXPR_P (*tp
) = 1;
471 /* And then jump to the end of the function. */
472 TREE_CHAIN (*tp
) = goto_stmt
;
474 #else /* INLINER_FOR_JAVA */
477 copy_body_r (&assignment
, walk_subtrees
, data
);
478 *tp
= build (COMPOUND_EXPR
, void_type_node
, assignment
, goto_stmt
);
479 TREE_SIDE_EFFECTS (*tp
) = 1;
481 #endif /* INLINER_FOR_JAVA */
482 /* If we're not returning anything just do the jump. */
486 /* Local variables and labels need to be replaced by equivalent
487 variables. We don't want to copy static variables; there's only
488 one of those, no matter how many times we inline the containing
490 else if ((*lang_hooks
.tree_inlining
.auto_var_in_fn_p
) (*tp
, fn
))
494 /* Remap the declaration. */
495 new_decl
= remap_decl (*tp
, id
);
498 /* Replace this variable with the copy. */
499 STRIP_TYPE_NOPS (new_decl
);
503 else if (nonstatic_local_decl_p (*tp
)
504 && DECL_CONTEXT (*tp
) != VARRAY_TREE (id
->fns
, 0))
507 else if (TREE_CODE (*tp
) == SAVE_EXPR
)
508 remap_save_expr (tp
, id
->decl_map
, VARRAY_TREE (id
->fns
, 0),
510 else if (TREE_CODE (*tp
) == UNSAVE_EXPR
)
511 /* UNSAVE_EXPRs should not be generated until expansion time. */
513 #ifndef INLINER_FOR_JAVA
514 /* For a SCOPE_STMT, we must copy the associated block so that we
515 can write out debugging information for the inlined variables. */
516 else if (TREE_CODE (*tp
) == SCOPE_STMT
&& !id
->in_target_cleanup_p
)
517 copy_scope_stmt (tp
, walk_subtrees
, id
);
518 #else /* INLINER_FOR_JAVA */
519 else if (TREE_CODE (*tp
) == LABELED_BLOCK_EXPR
)
521 /* We need a new copy of this labeled block; the EXIT_BLOCK_EXPR
522 will refer to it, so save a copy ready for remapping. We
523 save it in the decl_map, although it isn't a decl. */
524 tree new_block
= copy_node (*tp
);
525 splay_tree_insert (id
->decl_map
,
526 (splay_tree_key
) *tp
,
527 (splay_tree_value
) new_block
);
530 else if (TREE_CODE (*tp
) == EXIT_BLOCK_EXPR
)
533 = splay_tree_lookup (id
->decl_map
,
534 (splay_tree_key
) TREE_OPERAND (*tp
, 0));
535 /* We _must_ have seen the enclosing LABELED_BLOCK_EXPR. */
538 *tp
= copy_node (*tp
);
539 TREE_OPERAND (*tp
, 0) = (tree
) n
->value
;
541 #endif /* INLINER_FOR_JAVA */
542 /* Otherwise, just copy the node. Note that copy_tree_r already
543 knows not to copy VAR_DECLs, etc., so this is safe. */
546 copy_tree_r (tp
, walk_subtrees
, NULL
);
548 /* The copied TARGET_EXPR has never been expanded, even if the
549 original node was expanded already. */
550 if (TREE_CODE (*tp
) == TARGET_EXPR
&& TREE_OPERAND (*tp
, 3))
552 TREE_OPERAND (*tp
, 1) = TREE_OPERAND (*tp
, 3);
553 TREE_OPERAND (*tp
, 3) = NULL_TREE
;
555 else if (TREE_CODE (*tp
) == MODIFY_EXPR
556 && TREE_OPERAND (*tp
, 0) == TREE_OPERAND (*tp
, 1)
557 && ((*lang_hooks
.tree_inlining
.auto_var_in_fn_p
)
558 (TREE_OPERAND (*tp
, 0), fn
)))
560 /* Some assignments VAR = VAR; don't generate any rtl code
561 and thus don't count as variable modification. Avoid
562 keeping bogosities like 0 = 0. */
563 tree decl
= TREE_OPERAND (*tp
, 0), value
;
566 n
= splay_tree_lookup (id
->decl_map
, (splay_tree_key
) decl
);
569 value
= (tree
) n
->value
;
570 STRIP_TYPE_NOPS (value
);
571 if (TREE_CONSTANT (value
) || TREE_READONLY_DECL_P (value
))
577 /* Keep iterating. */
581 /* Make a copy of the body of FN so that it can be inserted inline in
590 body
= DECL_SAVED_TREE (VARRAY_TOP_TREE (id
->fns
));
591 walk_tree (&body
, copy_body_r
, id
, NULL
);
596 /* Generate code to initialize the parameters of the function at the
597 top of the stack in ID from the ARGS (presented as a TREE_LIST). */
600 #ifndef INLINER_FOR_JAVA
601 initialize_inlined_parameters (id
, args
, fn
)
602 #else /* INLINER_FOR_JAVA */
603 initialize_inlined_parameters (id
, args
, fn
, block
)
604 #endif /* INLINER_FOR_JAVA */
608 #ifdef INLINER_FOR_JAVA
610 #endif /* INLINER_FOR_JAVA */
616 #ifdef INLINER_FOR_JAVA
617 tree vars
= NULL_TREE
;
618 #endif /* INLINER_FOR_JAVA */
620 /* Figure out what the parameters are. */
621 parms
= DECL_ARGUMENTS (fn
);
623 /* Start with no initializations whatsoever. */
624 init_stmts
= NULL_TREE
;
626 /* Loop through the parameter declarations, replacing each with an
627 equivalent VAR_DECL, appropriately initialized. */
628 for (p
= parms
, a
= args
; p
;
629 a
= a
? TREE_CHAIN (a
) : a
, p
= TREE_CHAIN (p
))
631 #ifndef INLINER_FOR_JAVA
634 #endif /* not INLINER_FOR_JAVA */
639 /* Find the initializer. */
640 value
= (*lang_hooks
.tree_inlining
.convert_parm_for_inlining
)
641 (p
, a
? TREE_VALUE (a
) : NULL_TREE
, fn
);
643 /* If the parameter is never assigned to, we may not need to
644 create a new variable here at all. Instead, we may be able
645 to just use the argument value. */
646 if (TREE_READONLY (p
)
647 && !TREE_ADDRESSABLE (p
)
648 && value
&& !TREE_SIDE_EFFECTS (value
))
650 /* Simplify the value, if possible. */
651 value
= fold (DECL_P (value
) ? decl_constant_value (value
) : value
);
653 /* We can't risk substituting complex expressions. They
654 might contain variables that will be assigned to later.
655 Theoretically, we could check the expression to see if
656 all of the variables that determine its value are
657 read-only, but we don't bother. */
658 if (TREE_CONSTANT (value
) || TREE_READONLY_DECL_P (value
))
660 /* If this is a declaration, wrap it a NOP_EXPR so that
661 we don't try to put the VALUE on the list of
664 value
= build1 (NOP_EXPR
, TREE_TYPE (value
), value
);
666 splay_tree_insert (id
->decl_map
,
668 (splay_tree_value
) value
);
673 /* Make an equivalent VAR_DECL. */
674 var
= copy_decl_for_inlining (p
, fn
, VARRAY_TREE (id
->fns
, 0));
676 /* See if the frontend wants to pass this by invisible reference. If
677 so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
678 replace uses of the PARM_DECL with dereferences. */
679 if (TREE_TYPE (var
) != TREE_TYPE (p
)
680 && POINTER_TYPE_P (TREE_TYPE (var
))
681 && TREE_TYPE (TREE_TYPE (var
)) == TREE_TYPE (p
))
682 var_sub
= build1 (INDIRECT_REF
, TREE_TYPE (p
), var
);
686 /* Register the VAR_DECL as the equivalent for the PARM_DECL;
687 that way, when the PARM_DECL is encountered, it will be
688 automatically replaced by the VAR_DECL. */
689 splay_tree_insert (id
->decl_map
,
691 (splay_tree_value
) var_sub
);
693 /* Declare this new variable. */
694 #ifndef INLINER_FOR_JAVA
695 init_stmt
= build_stmt (DECL_STMT
, var
);
696 TREE_CHAIN (init_stmt
) = init_stmts
;
697 init_stmts
= init_stmt
;
698 #else /* INLINER_FOR_JAVA */
699 TREE_CHAIN (var
) = vars
;
701 #endif /* INLINER_FOR_JAVA */
703 /* Initialize this VAR_DECL from the equivalent argument. If
704 the argument is an object, created via a constructor or copy,
705 this will not result in an extra copy: the TARGET_EXPR
706 representing the argument will be bound to VAR, and the
707 object will be constructed in VAR. */
708 if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p
)))
709 #ifndef INLINER_FOR_JAVA
710 DECL_INITIAL (var
) = value
;
713 /* Even if P was TREE_READONLY, the new VAR should not be.
714 In the original code, we would have constructed a
715 temporary, and then the function body would have never
716 changed the value of P. However, now, we will be
717 constructing VAR directly. The constructor body may
718 change its value multiple times as it is being
719 constructed. Therefore, it must not be TREE_READONLY;
720 the back-end assumes that TREE_READONLY variable is
721 assigned to only once. */
722 TREE_READONLY (var
) = 0;
724 /* Build a run-time initialization. */
725 init_stmt
= build_stmt (EXPR_STMT
,
726 build (INIT_EXPR
, TREE_TYPE (p
),
728 /* Add this initialization to the list. Note that we want the
729 declaration *after* the initialization because we are going
730 to reverse all the initialization statements below. */
731 TREE_CHAIN (init_stmt
) = init_stmts
;
732 init_stmts
= init_stmt
;
735 /* See if we need to clean up the declaration. */
736 cleanup
= (*lang_hooks
.maybe_build_cleanup
) (var
);
740 /* Build the cleanup statement. */
741 cleanup_stmt
= build_stmt (CLEANUP_STMT
, var
, cleanup
);
742 /* Add it to the *front* of the list; the list will be
744 TREE_CHAIN (cleanup_stmt
) = init_stmts
;
745 init_stmts
= cleanup_stmt
;
747 #else /* INLINER_FOR_JAVA */
749 tree assignment
= build (MODIFY_EXPR
, TREE_TYPE (p
), var
, value
);
750 init_stmts
= add_stmt_to_compound (init_stmts
, TREE_TYPE (p
),
755 /* Java objects don't ever need constructing when being
756 passed as arguments because only call by reference is
760 #endif /* INLINER_FOR_JAVA */
763 #ifndef INLINER_FOR_JAVA
764 /* Evaluate trailing arguments. */
765 for (; a
; a
= TREE_CHAIN (a
))
768 tree value
= TREE_VALUE (a
);
770 if (! value
|| ! TREE_SIDE_EFFECTS (value
))
773 init_stmt
= build_stmt (EXPR_STMT
, value
);
774 TREE_CHAIN (init_stmt
) = init_stmts
;
775 init_stmts
= init_stmt
;
778 /* The initialization statements have been built up in reverse
779 order. Straighten them out now. */
780 return nreverse (init_stmts
);
781 #else /* INLINER_FOR_JAVA */
782 BLOCK_VARS (block
) = nreverse (vars
);
784 #endif /* INLINER_FOR_JAVA */
787 /* Declare a return variable to replace the RESULT_DECL for the
788 function we are calling. An appropriate DECL_STMT is returned.
789 The USE_STMT is filled in to contain a use of the declaration to
790 indicate the return value of the function. */
792 #ifndef INLINER_FOR_JAVA
794 declare_return_variable (id
, return_slot_addr
, use_stmt
)
795 struct inline_data
*id
;
796 tree return_slot_addr
;
798 #else /* INLINER_FOR_JAVA */
800 declare_return_variable (id
, return_slot_addr
, var
)
801 struct inline_data
*id
;
802 tree return_slot_addr
;
804 #endif /* INLINER_FOR_JAVA */
806 tree fn
= VARRAY_TOP_TREE (id
->fns
);
807 tree result
= DECL_RESULT (fn
);
808 #ifndef INLINER_FOR_JAVA
810 #endif /* not INLINER_FOR_JAVA */
811 int need_return_decl
= 1;
813 /* We don't need to do anything for functions that don't return
815 if (!result
|| VOID_TYPE_P (TREE_TYPE (result
)))
817 #ifndef INLINER_FOR_JAVA
818 *use_stmt
= NULL_TREE
;
819 #else /* INLINER_FOR_JAVA */
821 #endif /* INLINER_FOR_JAVA */
825 #ifndef INLINER_FOR_JAVA
826 var
= ((*lang_hooks
.tree_inlining
.copy_res_decl_for_inlining
)
827 (result
, fn
, VARRAY_TREE (id
->fns
, 0), id
->decl_map
,
828 &need_return_decl
, return_slot_addr
));
830 /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
831 way, when the RESULT_DECL is encountered, it will be
832 automatically replaced by the VAR_DECL. */
833 splay_tree_insert (id
->decl_map
,
834 (splay_tree_key
) result
,
835 (splay_tree_value
) var
);
837 /* Build the USE_STMT. If the return type of the function was
838 promoted, convert it back to the expected type. */
839 if (TREE_TYPE (var
) == TREE_TYPE (TREE_TYPE (fn
)))
840 *use_stmt
= build_stmt (EXPR_STMT
, var
);
842 *use_stmt
= build_stmt (EXPR_STMT
,
843 build1 (NOP_EXPR
, TREE_TYPE (TREE_TYPE (fn
)),
845 TREE_ADDRESSABLE (*use_stmt
) = 1;
847 /* Build the declaration statement if FN does not return an
849 if (need_return_decl
)
850 return build_stmt (DECL_STMT
, var
);
851 #else /* INLINER_FOR_JAVA */
852 *var
= ((*lang_hooks
.tree_inlining
.copy_res_decl_for_inlining
)
853 (result
, fn
, VARRAY_TREE (id
->fns
, 0), id
->decl_map
,
854 &need_return_decl
, return_slot_addr
));
856 splay_tree_insert (id
->decl_map
,
857 (splay_tree_key
) result
,
858 (splay_tree_value
) *var
);
859 DECL_IGNORED_P (*var
) = 1;
860 if (need_return_decl
)
862 #endif /* INLINER_FOR_JAVA */
863 /* If FN does return an aggregate, there's no need to declare the
864 return variable; we're using a variable in our caller's frame. */
869 /* Returns nonzero if a function can be inlined as a tree. */
872 tree_inlinable_function_p (fn
)
875 return inlinable_function_p (fn
, NULL
);
878 /* If *TP is possibly call to alloca, return nonzero. */
880 find_alloca_call_1 (tp
, walk_subtrees
, data
)
882 int *walk_subtrees ATTRIBUTE_UNUSED
;
883 void *data ATTRIBUTE_UNUSED
;
885 if (alloca_call_p (*tp
))
890 /* Return subexpression representing possible alloca call, if any. */
892 find_alloca_call (exp
)
895 return walk_tree (&exp
, find_alloca_call_1
, NULL
, NULL
);
899 find_builtin_longjmp_call_1 (tp
, walk_subtrees
, data
)
901 int *walk_subtrees ATTRIBUTE_UNUSED
;
902 void *data ATTRIBUTE_UNUSED
;
904 tree exp
= *tp
, decl
;
906 if (TREE_CODE (exp
) == CALL_EXPR
907 && TREE_CODE (TREE_OPERAND (exp
, 0)) == ADDR_EXPR
908 && (decl
= TREE_OPERAND (TREE_OPERAND (exp
, 0), 0),
909 TREE_CODE (decl
) == FUNCTION_DECL
)
910 && DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
911 && DECL_FUNCTION_CODE (decl
) == BUILT_IN_LONGJMP
)
918 find_builtin_longjmp_call (exp
)
921 return walk_tree (&exp
, find_builtin_longjmp_call_1
, NULL
, NULL
);
924 /* Returns nonzero if FN is a function that can be inlined into the
925 inlining context ID_. If ID_ is NULL, check whether the function
926 can be inlined at all. */
929 inlinable_function_p (fn
, id
)
936 /* If we've already decided this function shouldn't be inlined,
937 there's no need to check again. */
938 if (DECL_UNINLINABLE (fn
))
941 /* Assume it is not inlinable. */
944 /* The number of instructions (estimated) of current function. */
945 currfn_insns
= DECL_NUM_STMTS (fn
) * INSNS_PER_STMT
;
947 /* If we're not inlining things, then nothing is inlinable. */
948 if (! flag_inline_trees
)
950 /* If we're not inlining all functions and the function was not
951 declared `inline', we don't inline it. Don't think of
952 disregarding DECL_INLINE when flag_inline_trees == 2; it's the
953 front-end that must set DECL_INLINE in this case, because
954 dwarf2out loses if a function is inlined that doesn't have
956 else if (! DECL_INLINE (fn
))
958 /* We can't inline functions that are too big. Only allow a single
959 function to be of MAX_INLINE_INSNS_SINGLE size. Make special
960 allowance for extern inline functions, though. */
961 else if (! (*lang_hooks
.tree_inlining
.disregard_inline_limits
) (fn
)
962 && currfn_insns
> MAX_INLINE_INSNS_SINGLE
)
964 /* We can't inline functions that call __builtin_longjmp at all.
965 The non-local goto machenery really requires the destination
966 be in a different function. If we allow the function calling
967 __builtin_longjmp to be inlined into the function calling
968 __builtin_setjmp, Things will Go Awry. */
969 /* ??? Need front end help to identify "regular" non-local goto. */
970 else if (find_builtin_longjmp_call (DECL_SAVED_TREE (fn
)))
972 /* Refuse to inline alloca call unless user explicitly forced so as this may
973 change program's memory overhead drastically when the function using alloca
974 is called in loop. In GCC present in SPEC2000 inlining into schedule_block
975 cause it to require 2GB of ram instead of 256MB. */
976 else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn
)) == NULL
977 && find_alloca_call (DECL_SAVED_TREE (fn
)))
979 /* All is well. We can inline this function. Traditionally, GCC
980 has refused to inline functions using alloca, or functions whose
981 values are returned in a PARALLEL, and a few other such obscure
982 conditions. We are not equally constrained at the tree level. */
986 /* Squirrel away the result so that we don't have to check again. */
987 DECL_UNINLINABLE (fn
) = ! inlinable
;
989 /* In case we don't disregard the inlining limits and we basically
990 can inline this function, investigate further. */
991 if (! (*lang_hooks
.tree_inlining
.disregard_inline_limits
) (fn
)
994 int sum_insns
= (id
? id
->inlined_stmts
: 0) * INSNS_PER_STMT
996 /* In the extreme case that we have exceeded the recursive inlining
997 limit by a huge factor (128), we just say no. Should not happen
999 if (sum_insns
> MAX_INLINE_INSNS
* 128)
1001 /* If we did not hit the extreme limit, we use a linear function
1002 with slope -1/MAX_INLINE_SLOPE to exceedingly decrease the
1003 allowable size. We always allow a size of MIN_INLINE_INSNS
1005 else if ((sum_insns
> MAX_INLINE_INSNS
)
1006 && (currfn_insns
> MIN_INLINE_INSNS
))
1008 int max_curr
= MAX_INLINE_INSNS_SINGLE
1009 - (sum_insns
- MAX_INLINE_INSNS
) / MAX_INLINE_SLOPE
;
1010 if (currfn_insns
> max_curr
)
1015 if (inlinable
&& (*lang_hooks
.tree_inlining
.cannot_inline_tree_fn
) (&fn
))
1018 /* If we don't have the function body available, we can't inline
1020 if (! DECL_SAVED_TREE (fn
))
1023 /* Check again, language hooks may have modified it. */
1024 if (! inlinable
|| DECL_UNINLINABLE (fn
))
1027 /* Don't do recursive inlining, either. We don't record this in
1028 DECL_UNINLINABLE; we may be able to inline this function later. */
1033 for (i
= 0; i
< VARRAY_ACTIVE_SIZE (id
->fns
); ++i
)
1034 if (VARRAY_TREE (id
->fns
, i
) == fn
)
1037 if (DECL_INLINED_FNS (fn
))
1040 tree inlined_fns
= DECL_INLINED_FNS (fn
);
1042 for (j
= 0; j
< TREE_VEC_LENGTH (inlined_fns
); ++j
)
1043 if (TREE_VEC_ELT (inlined_fns
, j
) == VARRAY_TREE (id
->fns
, 0))
1048 /* Return the result. */
1052 /* If *TP is a CALL_EXPR, replace it with its inline expansion. */
1055 expand_call_inline (tp
, walk_subtrees
, data
)
1064 #ifndef INLINER_FOR_JAVA
1068 #else /* INLINER_FOR_JAVA */
1070 #endif /* INLINER_FOR_JAVA */
1076 tree return_slot_addr
;
1078 /* See what we've got. */
1079 id
= (inline_data
*) data
;
1082 /* Recurse, but letting recursive invocations know that we are
1083 inside the body of a TARGET_EXPR. */
1084 if (TREE_CODE (*tp
) == TARGET_EXPR
)
1086 #ifndef INLINER_FOR_JAVA
1087 int i
, len
= first_rtl_op (TARGET_EXPR
);
1089 /* We're walking our own subtrees. */
1092 /* Actually walk over them. This loop is the body of
1093 walk_trees, omitting the case where the TARGET_EXPR
1094 itself is handled. */
1095 for (i
= 0; i
< len
; ++i
)
1098 ++id
->in_target_cleanup_p
;
1099 walk_tree (&TREE_OPERAND (*tp
, i
), expand_call_inline
, data
,
1102 --id
->in_target_cleanup_p
;
1106 #else /* INLINER_FOR_JAVA */
1108 #endif /* INLINER_FOR_JAVA */
1112 /* Because types were not copied in copy_body, CALL_EXPRs beneath
1113 them should not be expanded. This can happen if the type is a
1114 dynamic array type, for example. */
1117 /* From here on, we're only interested in CALL_EXPRs. */
1118 if (TREE_CODE (t
) != CALL_EXPR
)
1121 /* First, see if we can figure out what function is being called.
1122 If we cannot, then there is no hope of inlining the function. */
1123 fn
= get_callee_fndecl (t
);
1127 /* If fn is a declaration of a function in a nested scope that was
1128 globally declared inline, we don't set its DECL_INITIAL.
1129 However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1130 C++ front-end uses it for cdtors to refer to their internal
1131 declarations, that are not real functions. Fortunately those
1132 don't have trees to be saved, so we can tell by checking their
1134 if (! DECL_INITIAL (fn
)
1135 && DECL_ABSTRACT_ORIGIN (fn
)
1136 && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn
)))
1137 fn
= DECL_ABSTRACT_ORIGIN (fn
);
1139 /* Don't try to inline functions that are not well-suited to
1141 if (!inlinable_function_p (fn
, id
))
1144 if (! (*lang_hooks
.tree_inlining
.start_inlining
) (fn
))
1147 /* Set the current filename and line number to the function we are
1148 inlining so that when we create new _STMT nodes here they get
1149 line numbers corresponding to the function we are calling. We
1150 wrap the whole inlined body in an EXPR_WITH_FILE_AND_LINE as well
1151 because individual statements don't record the filename. */
1152 push_srcloc (DECL_SOURCE_FILE (fn
), DECL_SOURCE_LINE (fn
));
1154 #ifndef INLINER_FOR_JAVA
1155 /* Build a statement-expression containing code to initialize the
1156 arguments, the actual inline expansion of the body, and a label
1157 for the return statements within the function to jump to. The
1158 type of the statement expression is the return type of the
1160 expr
= build1 (STMT_EXPR
, TREE_TYPE (TREE_TYPE (fn
)), make_node (COMPOUND_STMT
));
1161 /* There is no scope associated with the statement-expression. */
1162 STMT_EXPR_NO_SCOPE (expr
) = 1;
1163 stmt
= STMT_EXPR_STMT (expr
);
1164 #else /* INLINER_FOR_JAVA */
1165 /* Build a block containing code to initialize the arguments, the
1166 actual inline expansion of the body, and a label for the return
1167 statements within the function to jump to. The type of the
1168 statement expression is the return type of the function call. */
1170 expr
= build (BLOCK
, TREE_TYPE (TREE_TYPE (fn
)), stmt
);
1171 #endif /* INLINER_FOR_JAVA */
1173 /* Local declarations will be replaced by their equivalents in this
1176 id
->decl_map
= splay_tree_new (splay_tree_compare_pointers
,
1179 /* Initialize the parameters. */
1180 args
= TREE_OPERAND (t
, 1);
1181 return_slot_addr
= NULL_TREE
;
1182 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t
))
1184 return_slot_addr
= TREE_VALUE (args
);
1185 args
= TREE_CHAIN (args
);
1188 #ifndef INLINER_FOR_JAVA
1189 arg_inits
= initialize_inlined_parameters (id
, args
, fn
);
1190 /* Expand any inlined calls in the initializers. Do this before we
1191 push FN on the stack of functions we are inlining; we want to
1192 inline calls to FN that appear in the initializers for the
1194 expand_calls_inline (&arg_inits
, id
);
1195 /* And add them to the tree. */
1196 COMPOUND_BODY (stmt
) = chainon (COMPOUND_BODY (stmt
), arg_inits
);
1197 #else /* INLINER_FOR_JAVA */
1198 arg_inits
= initialize_inlined_parameters (id
, args
, fn
, expr
);
1201 /* Expand any inlined calls in the initializers. Do this before we
1202 push FN on the stack of functions we are inlining; we want to
1203 inline calls to FN that appear in the initializers for the
1205 expand_calls_inline (&arg_inits
, id
);
1207 /* And add them to the tree. */
1208 BLOCK_EXPR_BODY (expr
) = add_stmt_to_compound (BLOCK_EXPR_BODY (expr
),
1209 TREE_TYPE (arg_inits
),
1212 #endif /* INLINER_FOR_JAVA */
1214 /* Record the function we are about to inline so that we can avoid
1215 recursing into it. */
1216 VARRAY_PUSH_TREE (id
->fns
, fn
);
1218 /* Record the function we are about to inline if optimize_function
1219 has not been called on it yet and we don't have it in the list. */
1220 if (! DECL_INLINED_FNS (fn
))
1224 for (i
= VARRAY_ACTIVE_SIZE (id
->inlined_fns
) - 1; i
>= 0; i
--)
1225 if (VARRAY_TREE (id
->inlined_fns
, i
) == fn
)
1228 VARRAY_PUSH_TREE (id
->inlined_fns
, fn
);
1231 /* Return statements in the function body will be replaced by jumps
1232 to the RET_LABEL. */
1233 id
->ret_label
= build_decl (LABEL_DECL
, NULL_TREE
, NULL_TREE
);
1234 DECL_CONTEXT (id
->ret_label
) = VARRAY_TREE (id
->fns
, 0);
1236 if (! DECL_INITIAL (fn
)
1237 || TREE_CODE (DECL_INITIAL (fn
)) != BLOCK
)
1240 #ifndef INLINER_FOR_JAVA
1241 /* Create a block to put the parameters in. We have to do this
1242 after the parameters have been remapped because remapping
1243 parameters is different from remapping ordinary variables. */
1244 scope_stmt
= build_stmt (SCOPE_STMT
, DECL_INITIAL (fn
));
1245 SCOPE_BEGIN_P (scope_stmt
) = 1;
1246 SCOPE_NO_CLEANUPS_P (scope_stmt
) = 1;
1247 remap_block (scope_stmt
, DECL_ARGUMENTS (fn
), id
);
1248 TREE_CHAIN (scope_stmt
) = COMPOUND_BODY (stmt
);
1249 COMPOUND_BODY (stmt
) = scope_stmt
;
1251 /* Tell the debugging backends that this block represents the
1252 outermost scope of the inlined function. */
1253 if (SCOPE_STMT_BLOCK (scope_stmt
))
1254 BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope_stmt
)) = DECL_ORIGIN (fn
);
1256 /* Declare the return variable for the function. */
1257 COMPOUND_BODY (stmt
)
1258 = chainon (COMPOUND_BODY (stmt
),
1259 declare_return_variable (id
, return_slot_addr
, &use_stmt
));
1260 #else /* INLINER_FOR_JAVA */
1262 /* Declare the return variable for the function. */
1263 tree decl
= declare_return_variable (id
, return_slot_addr
, &retvar
);
1266 tree
*next
= &BLOCK_VARS (expr
);
1268 next
= &TREE_CHAIN (*next
);
1272 #endif /* INLINER_FOR_JAVA */
1274 /* After we've initialized the parameters, we insert the body of the
1276 #ifndef INLINER_FOR_JAVA
1277 inlined_body
= &COMPOUND_BODY (stmt
);
1278 while (*inlined_body
)
1279 inlined_body
= &TREE_CHAIN (*inlined_body
);
1280 *inlined_body
= copy_body (id
);
1281 #else /* INLINER_FOR_JAVA */
1284 java_inlining_map_static_initializers (fn
, id
->decl_map
);
1285 new_body
= copy_body (id
);
1286 TREE_TYPE (new_body
) = TREE_TYPE (TREE_TYPE (fn
));
1287 BLOCK_EXPR_BODY (expr
)
1288 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr
),
1289 TREE_TYPE (new_body
), new_body
);
1290 inlined_body
= &BLOCK_EXPR_BODY (expr
);
1292 #endif /* INLINER_FOR_JAVA */
1294 /* After the body of the function comes the RET_LABEL. This must come
1295 before we evaluate the returned value below, because that evaluation
1296 may cause RTL to be generated. */
1297 #ifndef INLINER_FOR_JAVA
1298 COMPOUND_BODY (stmt
)
1299 = chainon (COMPOUND_BODY (stmt
),
1300 build_stmt (LABEL_STMT
, id
->ret_label
));
1301 #else /* INLINER_FOR_JAVA */
1303 tree label
= build1 (LABEL_EXPR
, void_type_node
, id
->ret_label
);
1304 BLOCK_EXPR_BODY (expr
)
1305 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr
), void_type_node
, label
);
1306 TREE_SIDE_EFFECTS (label
) = TREE_SIDE_EFFECTS (t
);
1308 #endif /* INLINER_FOR_JAVA */
1310 /* Finally, mention the returned value so that the value of the
1311 statement-expression is the returned value of the function. */
1312 #ifndef INLINER_FOR_JAVA
1313 COMPOUND_BODY (stmt
) = chainon (COMPOUND_BODY (stmt
), use_stmt
);
1315 /* Close the block for the parameters. */
1316 scope_stmt
= build_stmt (SCOPE_STMT
, DECL_INITIAL (fn
));
1317 SCOPE_NO_CLEANUPS_P (scope_stmt
) = 1;
1318 remap_block (scope_stmt
, NULL_TREE
, id
);
1319 COMPOUND_BODY (stmt
)
1320 = chainon (COMPOUND_BODY (stmt
), scope_stmt
);
1321 #else /* INLINER_FOR_JAVA */
1324 /* Mention the retvar. If the return type of the function was
1325 promoted, convert it back to the expected type. */
1326 if (TREE_TYPE (TREE_TYPE (fn
)) != TREE_TYPE (retvar
))
1327 retvar
= build1 (NOP_EXPR
, TREE_TYPE (TREE_TYPE (fn
)), retvar
);
1328 BLOCK_EXPR_BODY (expr
)
1329 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr
),
1330 TREE_TYPE (retvar
), retvar
);
1333 java_inlining_merge_static_initializers (fn
, id
->decl_map
);
1334 #endif /* INLINER_FOR_JAVA */
1337 splay_tree_delete (id
->decl_map
);
1340 /* The new expression has side-effects if the old one did. */
1341 TREE_SIDE_EFFECTS (expr
) = TREE_SIDE_EFFECTS (t
);
1343 /* Replace the call by the inlined body. Wrap it in an
1344 EXPR_WITH_FILE_LOCATION so that we'll get debugging line notes
1345 pointing to the right place. */
1346 #ifndef INLINER_FOR_JAVA
1347 chain
= TREE_CHAIN (*tp
);
1348 *tp
= build_expr_wfl (expr
, DECL_SOURCE_FILE (fn
), DECL_SOURCE_LINE (fn
),
1350 #else /* INLINER_FOR_JAVA */
1351 *tp
= build_expr_wfl (expr
, DECL_SOURCE_FILE (fn
),
1352 DECL_SOURCE_LINE_FIRST(fn
),
1354 #endif /* INLINER_FOR_JAVA */
1355 EXPR_WFL_EMIT_LINE_NOTE (*tp
) = 1;
1356 #ifndef INLINER_FOR_JAVA
1357 TREE_CHAIN (*tp
) = chain
;
1358 #endif /* not INLINER_FOR_JAVA */
1361 /* If the value of the new expression is ignored, that's OK. We
1362 don't warn about this for CALL_EXPRs, so we shouldn't warn about
1363 the equivalent inlined version either. */
1364 TREE_USED (*tp
) = 1;
1366 /* Our function now has more statements than it did before. */
1367 DECL_NUM_STMTS (VARRAY_TREE (id
->fns
, 0)) += DECL_NUM_STMTS (fn
);
1368 /* For accounting, subtract one for the saved call/ret. */
1369 id
->inlined_stmts
+= DECL_NUM_STMTS (fn
) - 1;
1371 /* Recurse into the body of the just inlined function. */
1372 expand_calls_inline (inlined_body
, id
);
1373 VARRAY_POP (id
->fns
);
1375 /* If we've returned to the top level, clear out the record of how
1376 much inlining has been done. */
1377 if (VARRAY_ACTIVE_SIZE (id
->fns
) == id
->first_inlined_fn
)
1378 id
->inlined_stmts
= 0;
1380 /* Don't walk into subtrees. We've already handled them above. */
1383 (*lang_hooks
.tree_inlining
.end_inlining
) (fn
);
1385 /* Keep iterating. */
1388 /* Walk over the entire tree *TP, replacing CALL_EXPRs with inline
1389 expansions as appropriate. */
1392 expand_calls_inline (tp
, id
)
1396 /* Search through *TP, replacing all calls to inline functions by
1397 appropriate equivalents. Use walk_tree in no-duplicates mode
1398 to avoid exponential time complexity. (We can't just use
1399 walk_tree_without_duplicates, because of the special TARGET_EXPR
1400 handling in expand_calls. The hash table is set up in
1401 optimize_function. */
1402 walk_tree (tp
, expand_call_inline
, id
, id
->tree_pruner
);
1405 /* Expand calls to inline functions in the body of FN. */
1408 optimize_inline_calls (fn
)
1415 memset (&id
, 0, sizeof (id
));
1417 /* Don't allow recursion into FN. */
1418 VARRAY_TREE_INIT (id
.fns
, 32, "fns");
1419 VARRAY_PUSH_TREE (id
.fns
, fn
);
1420 /* Or any functions that aren't finished yet. */
1421 prev_fn
= NULL_TREE
;
1422 if (current_function_decl
)
1424 VARRAY_PUSH_TREE (id
.fns
, current_function_decl
);
1425 prev_fn
= current_function_decl
;
1428 prev_fn
= ((*lang_hooks
.tree_inlining
.add_pending_fn_decls
)
1429 (&id
.fns
, prev_fn
));
1431 /* Create the list of functions this call will inline. */
1432 VARRAY_TREE_INIT (id
.inlined_fns
, 32, "inlined_fns");
1434 /* Keep track of the low-water mark, i.e., the point where the first
1435 real inlining is represented in ID.FNS. */
1436 id
.first_inlined_fn
= VARRAY_ACTIVE_SIZE (id
.fns
);
1438 /* Replace all calls to inline functions with the bodies of those
1440 id
.tree_pruner
= htab_create (37, htab_hash_pointer
,
1441 htab_eq_pointer
, NULL
);
1442 expand_calls_inline (&DECL_SAVED_TREE (fn
), &id
);
1445 htab_delete (id
.tree_pruner
);
1446 if (DECL_LANG_SPECIFIC (fn
))
1448 tree ifn
= make_tree_vec (VARRAY_ACTIVE_SIZE (id
.inlined_fns
));
1450 if (VARRAY_ACTIVE_SIZE (id
.inlined_fns
))
1451 memcpy (&TREE_VEC_ELT (ifn
, 0), &VARRAY_TREE (id
.inlined_fns
, 0),
1452 VARRAY_ACTIVE_SIZE (id
.inlined_fns
) * sizeof (tree
));
1453 DECL_INLINED_FNS (fn
) = ifn
;
1457 /* FN is a function that has a complete body, and CLONE is a function
1458 whose body is to be set to a copy of FN, mapping argument
1459 declarations according to the ARG_MAP splay_tree. */
1462 clone_body (clone
, fn
, arg_map
)
1468 /* Clone the body, as if we were making an inline call. But, remap
1469 the parameters in the callee to the parameters of caller. If
1470 there's an in-charge parameter, map it to an appropriate
1472 memset (&id
, 0, sizeof (id
));
1473 VARRAY_TREE_INIT (id
.fns
, 2, "fns");
1474 VARRAY_PUSH_TREE (id
.fns
, clone
);
1475 VARRAY_PUSH_TREE (id
.fns
, fn
);
1476 id
.decl_map
= (splay_tree
)arg_map
;
1478 /* Cloning is treated slightly differently from inlining. Set
1479 CLONING_P so that it's clear which operation we're performing. */
1480 id
.cloning_p
= true;
1482 /* Actually copy the body. */
1483 TREE_CHAIN (DECL_SAVED_TREE (clone
)) = copy_body (&id
);
1486 /* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1487 FUNC is called with the DATA and the address of each sub-tree. If
1488 FUNC returns a non-NULL value, the traversal is aborted, and the
1489 value returned by FUNC is returned. If HTAB is non-NULL it is used
1490 to record the nodes visited, and to avoid visiting a node more than
1494 walk_tree (tp
, func
, data
, htab_
)
1500 htab_t htab
= (htab_t
) htab_
;
1501 enum tree_code code
;
1505 #define WALK_SUBTREE(NODE) \
1508 result = walk_tree (&(NODE), func, data, htab); \
1514 #define WALK_SUBTREE_TAIL(NODE) \
1518 goto tail_recurse; \
1523 /* Skip empty subtrees. */
1531 /* Don't walk the same tree twice, if the user has requested
1532 that we avoid doing so. */
1533 slot
= htab_find_slot (htab
, *tp
, INSERT
);
1539 /* Call the function. */
1541 result
= (*func
) (tp
, &walk_subtrees
, data
);
1543 /* If we found something, return it. */
1547 code
= TREE_CODE (*tp
);
1549 #ifndef INLINER_FOR_JAVA
1550 /* Even if we didn't, FUNC may have decided that there was nothing
1551 interesting below this point in the tree. */
1554 if (statement_code_p (code
) || code
== TREE_LIST
1555 || (*lang_hooks
.tree_inlining
.tree_chain_matters_p
) (*tp
))
1556 /* But we still need to check our siblings. */
1557 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp
));
1562 /* Handle common cases up front. */
1563 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code
))
1564 || TREE_CODE_CLASS (code
) == 'r'
1565 || TREE_CODE_CLASS (code
) == 's')
1566 #else /* INLINER_FOR_JAVA */
1567 if (code
!= EXIT_BLOCK_EXPR
1568 && code
!= SAVE_EXPR
1569 && (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code
))
1570 || TREE_CODE_CLASS (code
) == 'r'
1571 || TREE_CODE_CLASS (code
) == 's'))
1572 #endif /* INLINER_FOR_JAVA */
1576 #ifndef INLINER_FOR_JAVA
1577 /* Set lineno here so we get the right instantiation context
1578 if we call instantiate_decl from inlinable_function_p. */
1579 if (statement_code_p (code
) && !STMT_LINENO_FOR_FN_P (*tp
))
1580 lineno
= STMT_LINENO (*tp
);
1581 #endif /* not INLINER_FOR_JAVA */
1583 /* Walk over all the sub-trees of this operand. */
1584 len
= first_rtl_op (code
);
1585 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
1586 But, we only want to walk once. */
1587 if (code
== TARGET_EXPR
1588 && TREE_OPERAND (*tp
, 3) == TREE_OPERAND (*tp
, 1))
1590 /* Go through the subtrees. We need to do this in forward order so
1591 that the scope of a FOR_EXPR is handled properly. */
1592 for (i
= 0; i
< len
; ++i
)
1593 WALK_SUBTREE (TREE_OPERAND (*tp
, i
));
1595 #ifndef INLINER_FOR_JAVA
1596 /* For statements, we also walk the chain so that we cover the
1597 entire statement tree. */
1598 if (statement_code_p (code
))
1600 if (code
== DECL_STMT
1601 && DECL_STMT_DECL (*tp
)
1602 && DECL_P (DECL_STMT_DECL (*tp
)))
1604 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
1605 into declarations that are just mentioned, rather than
1606 declared; they don't really belong to this part of the tree.
1607 And, we can see cycles: the initializer for a declaration can
1608 refer to the declaration itself. */
1609 WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp
)));
1610 WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp
)));
1611 WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp
)));
1614 /* This can be tail-recursion optimized if we write it this way. */
1615 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp
));
1618 #endif /* not INLINER_FOR_JAVA */
1619 /* We didn't find what we were looking for. */
1622 else if (TREE_CODE_CLASS (code
) == 'd')
1624 WALK_SUBTREE_TAIL (TREE_TYPE (*tp
));
1626 else if (TREE_CODE_CLASS (code
) == 't')
1628 WALK_SUBTREE (TYPE_SIZE (*tp
));
1629 WALK_SUBTREE (TYPE_SIZE_UNIT (*tp
));
1630 /* Also examine various special fields, below. */
1633 result
= (*lang_hooks
.tree_inlining
.walk_subtrees
) (tp
, &walk_subtrees
, func
,
1635 if (result
|| ! walk_subtrees
)
1638 /* Not one of the easy cases. We must explicitly go through the
1643 case IDENTIFIER_NODE
:
1658 /* None of thse have subtrees other than those already walked
1663 case REFERENCE_TYPE
:
1664 WALK_SUBTREE_TAIL (TREE_TYPE (*tp
));
1668 WALK_SUBTREE (TREE_VALUE (*tp
));
1669 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp
));
1674 int len
= TREE_VEC_LENGTH (*tp
);
1679 /* Walk all elements but the first. */
1681 WALK_SUBTREE (TREE_VEC_ELT (*tp
, len
));
1683 /* Now walk the first one as a tail call. */
1684 WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp
, 0));
1688 WALK_SUBTREE (TREE_REALPART (*tp
));
1689 WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp
));
1692 WALK_SUBTREE_TAIL (CONSTRUCTOR_ELTS (*tp
));
1695 WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp
));
1699 WALK_SUBTREE (TREE_TYPE (*tp
));
1701 tree arg
= TYPE_ARG_TYPES (*tp
);
1703 /* We never want to walk into default arguments. */
1704 for (; arg
; arg
= TREE_CHAIN (arg
))
1705 WALK_SUBTREE (TREE_VALUE (arg
));
1710 WALK_SUBTREE (TREE_TYPE (*tp
));
1711 WALK_SUBTREE_TAIL (TYPE_DOMAIN (*tp
));
1714 WALK_SUBTREE (TYPE_MIN_VALUE (*tp
));
1715 WALK_SUBTREE_TAIL (TYPE_MAX_VALUE (*tp
));
1718 WALK_SUBTREE (TREE_TYPE (*tp
));
1719 WALK_SUBTREE_TAIL (TYPE_OFFSET_BASETYPE (*tp
));
1721 #ifdef INLINER_FOR_JAVA
1722 case EXIT_BLOCK_EXPR
:
1723 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp
, 1));
1726 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp
, 0));
1727 #endif /* INLINER_FOR_JAVA */
1733 /* We didn't find what we were looking for. */
1737 #undef WALK_SUBTREE_TAIL
1740 /* Like walk_tree, but does not walk duplicate nodes more than
1744 walk_tree_without_duplicates (tp
, func
, data
)
1752 htab
= htab_create (37, htab_hash_pointer
, htab_eq_pointer
, NULL
);
1753 result
= walk_tree (tp
, func
, data
, htab
);
1758 /* Passed to walk_tree. Copies the node pointed to, if appropriate. */
1761 copy_tree_r (tp
, walk_subtrees
, data
)
1764 void *data ATTRIBUTE_UNUSED
;
1766 enum tree_code code
= TREE_CODE (*tp
);
1768 /* We make copies of most nodes. */
1769 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code
))
1770 || TREE_CODE_CLASS (code
) == 'r'
1771 || TREE_CODE_CLASS (code
) == 'c'
1772 || TREE_CODE_CLASS (code
) == 's'
1773 || code
== TREE_LIST
1775 || (*lang_hooks
.tree_inlining
.tree_chain_matters_p
) (*tp
))
1777 /* Because the chain gets clobbered when we make a copy, we save it
1779 tree chain
= TREE_CHAIN (*tp
);
1781 /* Copy the node. */
1782 *tp
= copy_node (*tp
);
1784 /* Now, restore the chain, if appropriate. That will cause
1785 walk_tree to walk into the chain as well. */
1786 if (code
== PARM_DECL
|| code
== TREE_LIST
1787 #ifndef INLINER_FOR_JAVA
1788 || (*lang_hooks
.tree_inlining
.tree_chain_matters_p
) (*tp
)
1789 || statement_code_p (code
))
1790 TREE_CHAIN (*tp
) = chain
;
1792 /* For now, we don't update BLOCKs when we make copies. So, we
1793 have to nullify all scope-statements. */
1794 if (TREE_CODE (*tp
) == SCOPE_STMT
)
1795 SCOPE_STMT_BLOCK (*tp
) = NULL_TREE
;
1796 #else /* INLINER_FOR_JAVA */
1797 || (*lang_hooks
.tree_inlining
.tree_chain_matters_p
) (*tp
))
1798 TREE_CHAIN (*tp
) = chain
;
1799 #endif /* INLINER_FOR_JAVA */
1801 else if (TREE_CODE_CLASS (code
) == 't' && !variably_modified_type_p (*tp
))
1802 /* Types only need to be copied if they are variably modified. */
1808 /* The SAVE_EXPR pointed to by TP is being copied. If ST contains
1809 information indicating to what new SAVE_EXPR this one should be
1810 mapped, use that one. Otherwise, create a new node and enter it in
1811 ST. FN is the function into which the copy will be placed. */
1814 remap_save_expr (tp
, st_
, fn
, walk_subtrees
)
1820 splay_tree st
= (splay_tree
) st_
;
1823 /* See if we already encountered this SAVE_EXPR. */
1824 n
= splay_tree_lookup (st
, (splay_tree_key
) *tp
);
1826 /* If we didn't already remap this SAVE_EXPR, do so now. */
1829 tree t
= copy_node (*tp
);
1831 /* The SAVE_EXPR is now part of the function into which we
1832 are inlining this body. */
1833 SAVE_EXPR_CONTEXT (t
) = fn
;
1834 /* And we haven't evaluated it yet. */
1835 SAVE_EXPR_RTL (t
) = NULL_RTX
;
1836 /* Remember this SAVE_EXPR. */
1837 n
= splay_tree_insert (st
,
1838 (splay_tree_key
) *tp
,
1839 (splay_tree_value
) t
);
1840 /* Make sure we don't remap an already-remapped SAVE_EXPR. */
1841 splay_tree_insert (st
, (splay_tree_key
) t
,
1842 (splay_tree_value
) error_mark_node
);
1845 /* We've already walked into this SAVE_EXPR, so we needn't do it
1849 /* Replace this SAVE_EXPR with the copy. */
1850 *tp
= (tree
) n
->value
;
1853 #ifdef INLINER_FOR_JAVA
1854 /* Add STMT to EXISTING if possible, otherwise create a new
1855 COMPOUND_EXPR and add STMT to it. */
1858 add_stmt_to_compound (existing
, type
, stmt
)
1859 tree existing
, type
, stmt
;
1864 return build (COMPOUND_EXPR
, type
, existing
, stmt
);
1869 #endif /* INLINER_FOR_JAVA */