configure.in (GLIBCPP_ENABLE_CXX_FLAGS): Do not pass arguments, let the defaults...
[official-gcc.git] / gcc / tree-inline.c
blob110f93889c990cbcc9abb89155819159a6a6342f
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)
10 any later version.
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. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "toplev.h"
27 #include "tree.h"
28 #include "tree-inline.h"
29 #include "rtl.h"
30 #include "expr.h"
31 #include "flags.h"
32 #include "params.h"
33 #include "input.h"
34 #include "insn-config.h"
35 #include "integrate.h"
36 #include "varray.h"
37 #include "hashtab.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
44 #include "c-common.h"
45 #else /* INLINER_FOR_JAVA */
46 #include "parse.h"
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
53 candidates. */
55 int flag_inline_trees = 0;
57 /* To Do:
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
64 are not needed.
66 o Provide heuristics to clamp inlining of recursive template
67 calls? */
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. */
79 varray_type fns;
80 /* The index of the first element of FNS that really represents an
81 inlined function. */
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. */
86 tree ret_label;
87 /* The map from local declarations in the inlined function to
88 equivalents in the function into which it is being inlined. */
89 splay_tree decl_map;
90 /* Nonzero if we are currently within the cleanup for a
91 TARGET_EXPR. */
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. */
97 int inlined_stmts;
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. */
102 bool cloning_p;
103 /* Hash table used to prevent walk_tree from visiting the same node
104 umpteen million times. */
105 htab_t tree_pruner;
106 } inline_data;
108 /* Prototypes. */
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));
129 /* The approximate number of instructions per statement. This number
130 need not be particularly accurate; it is used only to make
131 decisions about when a function is too big to inline. */
132 #define INSNS_PER_STMT (10)
134 /* Remap DECL during the copying of the BLOCK tree for the function. */
136 static tree
137 remap_decl (decl, id)
138 tree decl;
139 inline_data *id;
141 splay_tree_node n;
142 tree fn;
144 /* We only remap local variables in the current function. */
145 fn = VARRAY_TOP_TREE (id->fns);
146 if (! (*lang_hooks.tree_inlining.auto_var_in_fn_p) (decl, fn))
147 return NULL_TREE;
149 /* See if we have remapped this declaration. */
150 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
151 /* If we didn't already have an equivalent for this declaration,
152 create one now. */
153 if (!n)
155 tree t;
157 /* Make a copy of the variable or label. */
158 t = copy_decl_for_inlining (decl, fn,
159 VARRAY_TREE (id->fns, 0));
161 /* The decl T could be a dynamic array or other variable size type,
162 in which case some fields need to be remapped because they may
163 contain SAVE_EXPRs. */
164 if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
165 && TYPE_DOMAIN (TREE_TYPE (t)))
167 TREE_TYPE (t) = copy_node (TREE_TYPE (t));
168 TYPE_DOMAIN (TREE_TYPE (t))
169 = copy_node (TYPE_DOMAIN (TREE_TYPE (t)));
170 walk_tree (&TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))),
171 copy_body_r, id, NULL);
174 #ifndef INLINER_FOR_JAVA
175 if (! DECL_NAME (t) && TREE_TYPE (t)
176 && (*lang_hooks.tree_inlining.anon_aggr_type_p) (TREE_TYPE (t)))
178 /* For a VAR_DECL of anonymous type, we must also copy the
179 member VAR_DECLS here and rechain the
180 DECL_ANON_UNION_ELEMS. */
181 tree members = NULL;
182 tree src;
184 for (src = DECL_ANON_UNION_ELEMS (t); src;
185 src = TREE_CHAIN (src))
187 tree member = remap_decl (TREE_VALUE (src), id);
189 if (TREE_PURPOSE (src))
190 abort ();
191 members = tree_cons (NULL, member, members);
193 DECL_ANON_UNION_ELEMS (t) = nreverse (members);
195 #endif /* not INLINER_FOR_JAVA */
197 /* Remember it, so that if we encounter this local entity
198 again we can reuse this copy. */
199 n = splay_tree_insert (id->decl_map,
200 (splay_tree_key) decl,
201 (splay_tree_value) t);
204 return (tree) n->value;
207 #ifndef INLINER_FOR_JAVA
208 /* Copy the SCOPE_STMT_BLOCK associated with SCOPE_STMT to contain
209 remapped versions of the variables therein. And hook the new block
210 into the block-tree. If non-NULL, the DECLS are declarations to
211 add to use instead of the BLOCK_VARS in the old block. */
212 #else /* INLINER_FOR_JAVA */
213 /* Copy the BLOCK to contain remapped versions of the variables
214 therein. And hook the new block into the block-tree. */
215 #endif /* INLINER_FOR_JAVA */
217 static void
218 #ifndef INLINER_FOR_JAVA
219 remap_block (scope_stmt, decls, id)
220 tree scope_stmt;
221 #else /* INLINER_FOR_JAVA */
222 remap_block (block, decls, id)
223 tree *block;
224 #endif /* INLINER_FOR_JAVA */
225 tree decls;
226 inline_data *id;
228 #ifndef INLINER_FOR_JAVA
229 /* We cannot do this in the cleanup for a TARGET_EXPR since we do
230 not know whether or not expand_expr will actually write out the
231 code we put there. If it does not, then we'll have more BLOCKs
232 than block-notes, and things will go awry. At some point, we
233 should make the back-end handle BLOCK notes in a tidier way,
234 without requiring a strict correspondence to the block-tree; then
235 this check can go. */
236 if (id->in_target_cleanup_p)
238 SCOPE_STMT_BLOCK (scope_stmt) = NULL_TREE;
239 return;
242 /* If this is the beginning of a scope, remap the associated BLOCK. */
243 if (SCOPE_BEGIN_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt))
245 tree old_block;
246 tree new_block;
247 tree old_var;
248 tree fn;
250 /* Make the new block. */
251 old_block = SCOPE_STMT_BLOCK (scope_stmt);
252 new_block = make_node (BLOCK);
253 TREE_USED (new_block) = TREE_USED (old_block);
254 BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
255 SCOPE_STMT_BLOCK (scope_stmt) = new_block;
257 /* Remap its variables. */
258 for (old_var = decls ? decls : BLOCK_VARS (old_block);
259 old_var;
260 old_var = TREE_CHAIN (old_var))
262 tree new_var;
264 /* Remap the variable. */
265 new_var = remap_decl (old_var, id);
266 /* If we didn't remap this variable, so we can't mess with
267 its TREE_CHAIN. If we remapped this variable to
268 something other than a declaration (say, if we mapped it
269 to a constant), then we must similarly omit any mention
270 of it here. */
271 if (!new_var || !DECL_P (new_var))
273 else
275 TREE_CHAIN (new_var) = BLOCK_VARS (new_block);
276 BLOCK_VARS (new_block) = new_var;
279 /* We put the BLOCK_VARS in reverse order; fix that now. */
280 BLOCK_VARS (new_block) = nreverse (BLOCK_VARS (new_block));
281 fn = VARRAY_TREE (id->fns, 0);
282 if (id->cloning_p)
283 /* We're building a clone; DECL_INITIAL is still
284 error_mark_node, and current_binding_level is the parm
285 binding level. */
286 (*lang_hooks.decls.insert_block) (new_block);
287 else
289 /* Attach this new block after the DECL_INITIAL block for the
290 function into which this block is being inlined. In
291 rest_of_compilation we will straighten out the BLOCK tree. */
292 tree *first_block;
293 if (DECL_INITIAL (fn))
294 first_block = &BLOCK_CHAIN (DECL_INITIAL (fn));
295 else
296 first_block = &DECL_INITIAL (fn);
297 BLOCK_CHAIN (new_block) = *first_block;
298 *first_block = new_block;
300 /* Remember the remapped block. */
301 splay_tree_insert (id->decl_map,
302 (splay_tree_key) old_block,
303 (splay_tree_value) new_block);
305 /* If this is the end of a scope, set the SCOPE_STMT_BLOCK to be the
306 remapped block. */
307 else if (SCOPE_END_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt))
309 splay_tree_node n;
311 /* Find this block in the table of remapped things. */
312 n = splay_tree_lookup (id->decl_map,
313 (splay_tree_key) SCOPE_STMT_BLOCK (scope_stmt));
314 if (! n)
315 abort ();
316 SCOPE_STMT_BLOCK (scope_stmt) = (tree) n->value;
318 #else /* INLINER_FOR_JAVA */
319 tree old_block;
320 tree new_block;
321 tree old_var;
322 tree fn;
324 /* Make the new block. */
325 old_block = *block;
326 new_block = make_node (BLOCK);
327 TREE_USED (new_block) = TREE_USED (old_block);
328 BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
329 BLOCK_SUBBLOCKS (new_block) = BLOCK_SUBBLOCKS (old_block);
330 TREE_SIDE_EFFECTS (new_block) = TREE_SIDE_EFFECTS (old_block);
331 TREE_TYPE (new_block) = TREE_TYPE (old_block);
332 *block = new_block;
334 /* Remap its variables. */
335 for (old_var = decls ? decls : BLOCK_VARS (old_block);
336 old_var;
337 old_var = TREE_CHAIN (old_var))
339 tree new_var;
341 /* All local class initialization flags go in the outermost
342 scope. */
343 if (LOCAL_CLASS_INITIALIZATION_FLAG_P (old_var))
345 /* We may already have one. */
346 if (! splay_tree_lookup (id->decl_map, (splay_tree_key) old_var))
348 tree outermost_block;
349 new_var = remap_decl (old_var, id);
350 DECL_ABSTRACT_ORIGIN (new_var) = NULL;
351 outermost_block = DECL_SAVED_TREE (current_function_decl);
352 TREE_CHAIN (new_var) = BLOCK_VARS (outermost_block);
353 BLOCK_VARS (outermost_block) = new_var;
355 continue;
358 /* Remap the variable. */
359 new_var = remap_decl (old_var, id);
360 /* If we didn't remap this variable, so we can't mess with
361 its TREE_CHAIN. If we remapped this variable to
362 something other than a declaration (say, if we mapped it
363 to a constant), then we must similarly omit any mention
364 of it here. */
365 if (!new_var || !DECL_P (new_var))
367 else
369 TREE_CHAIN (new_var) = BLOCK_VARS (new_block);
370 BLOCK_VARS (new_block) = new_var;
373 /* We put the BLOCK_VARS in reverse order; fix that now. */
374 BLOCK_VARS (new_block) = nreverse (BLOCK_VARS (new_block));
375 fn = VARRAY_TREE (id->fns, 0);
376 /* Remember the remapped block. */
377 splay_tree_insert (id->decl_map,
378 (splay_tree_key) old_block,
379 (splay_tree_value) new_block);
380 #endif /* INLINER_FOR_JAVA */
383 #ifndef INLINER_FOR_JAVA
384 /* Copy the SCOPE_STMT pointed to by TP. */
386 static void
387 copy_scope_stmt (tp, walk_subtrees, id)
388 tree *tp;
389 int *walk_subtrees;
390 inline_data *id;
392 tree block;
394 /* Remember whether or not this statement was nullified. When
395 making a copy, copy_tree_r always sets SCOPE_NULLIFIED_P (and
396 doesn't copy the SCOPE_STMT_BLOCK) to free callers from having to
397 deal with copying BLOCKs if they do not wish to do so. */
398 block = SCOPE_STMT_BLOCK (*tp);
399 /* Copy (and replace) the statement. */
400 copy_tree_r (tp, walk_subtrees, NULL);
401 /* Restore the SCOPE_STMT_BLOCK. */
402 SCOPE_STMT_BLOCK (*tp) = block;
404 /* Remap the associated block. */
405 remap_block (*tp, NULL_TREE, id);
407 #endif /* not INLINER_FOR_JAVA */
409 /* Called from copy_body via walk_tree. DATA is really an
410 `inline_data *'. */
411 static tree
412 copy_body_r (tp, walk_subtrees, data)
413 tree *tp;
414 int *walk_subtrees;
415 void *data;
417 inline_data* id;
418 tree fn;
420 /* Set up. */
421 id = (inline_data *) data;
422 fn = VARRAY_TOP_TREE (id->fns);
424 #if 0
425 /* All automatic variables should have a DECL_CONTEXT indicating
426 what function they come from. */
427 if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL)
428 && DECL_NAMESPACE_SCOPE_P (*tp))
429 if (! DECL_EXTERNAL (*tp) && ! TREE_STATIC (*tp))
430 abort ();
431 #endif
433 #ifdef INLINER_FOR_JAVA
434 if (TREE_CODE (*tp) == BLOCK)
435 remap_block (tp, NULL_TREE, id);
436 #endif
438 /* If this is a RETURN_STMT, change it into an EXPR_STMT and a
439 GOTO_STMT with the RET_LABEL as its target. */
440 #ifndef INLINER_FOR_JAVA
441 if (TREE_CODE (*tp) == RETURN_STMT && id->ret_label)
442 #else /* INLINER_FOR_JAVA */
443 if (TREE_CODE (*tp) == RETURN_EXPR && id->ret_label)
444 #endif /* INLINER_FOR_JAVA */
446 tree return_stmt = *tp;
447 tree goto_stmt;
449 /* Build the GOTO_STMT. */
450 #ifndef INLINER_FOR_JAVA
451 goto_stmt = build_stmt (GOTO_STMT, id->ret_label);
452 TREE_CHAIN (goto_stmt) = TREE_CHAIN (return_stmt);
453 GOTO_FAKE_P (goto_stmt) = 1;
454 #else /* INLINER_FOR_JAVA */
455 tree assignment = TREE_OPERAND (return_stmt, 0);
456 goto_stmt = build1 (GOTO_EXPR, void_type_node, id->ret_label);
457 TREE_SIDE_EFFECTS (goto_stmt) = 1;
458 #endif /* INLINER_FOR_JAVA */
460 /* If we're returning something, just turn that into an
461 assignment into the equivalent of the original
462 RESULT_DECL. */
463 #ifndef INLINER_FOR_JAVA
464 if (RETURN_STMT_EXPR (return_stmt))
466 *tp = build_stmt (EXPR_STMT,
467 RETURN_STMT_EXPR (return_stmt));
468 STMT_IS_FULL_EXPR_P (*tp) = 1;
469 /* And then jump to the end of the function. */
470 TREE_CHAIN (*tp) = goto_stmt;
472 #else /* INLINER_FOR_JAVA */
473 if (assignment)
475 copy_body_r (&assignment, walk_subtrees, data);
476 *tp = build (COMPOUND_EXPR, void_type_node, assignment, goto_stmt);
477 TREE_SIDE_EFFECTS (*tp) = 1;
479 #endif /* INLINER_FOR_JAVA */
480 /* If we're not returning anything just do the jump. */
481 else
482 *tp = goto_stmt;
484 /* Local variables and labels need to be replaced by equivalent
485 variables. We don't want to copy static variables; there's only
486 one of those, no matter how many times we inline the containing
487 function. */
488 else if ((*lang_hooks.tree_inlining.auto_var_in_fn_p) (*tp, fn))
490 tree new_decl;
492 /* Remap the declaration. */
493 new_decl = remap_decl (*tp, id);
494 if (! new_decl)
495 abort ();
496 /* Replace this variable with the copy. */
497 STRIP_TYPE_NOPS (new_decl);
498 *tp = new_decl;
500 #if 0
501 else if (nonstatic_local_decl_p (*tp)
502 && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
503 abort ();
504 #endif
505 else if (TREE_CODE (*tp) == SAVE_EXPR)
506 remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
507 walk_subtrees);
508 else if (TREE_CODE (*tp) == UNSAVE_EXPR)
509 /* UNSAVE_EXPRs should not be generated until expansion time. */
510 abort ();
511 #ifndef INLINER_FOR_JAVA
512 /* For a SCOPE_STMT, we must copy the associated block so that we
513 can write out debugging information for the inlined variables. */
514 else if (TREE_CODE (*tp) == SCOPE_STMT && !id->in_target_cleanup_p)
515 copy_scope_stmt (tp, walk_subtrees, id);
516 #else /* INLINER_FOR_JAVA */
517 else if (TREE_CODE (*tp) == LABELED_BLOCK_EXPR)
519 /* We need a new copy of this labeled block; the EXIT_BLOCK_EXPR
520 will refer to it, so save a copy ready for remapping. We
521 save it in the decl_map, although it isn't a decl. */
522 tree new_block = copy_node (*tp);
523 splay_tree_insert (id->decl_map,
524 (splay_tree_key) *tp,
525 (splay_tree_value) new_block);
526 *tp = new_block;
528 else if (TREE_CODE (*tp) == EXIT_BLOCK_EXPR)
530 splay_tree_node n
531 = splay_tree_lookup (id->decl_map,
532 (splay_tree_key) TREE_OPERAND (*tp, 0));
533 /* We _must_ have seen the enclosing LABELED_BLOCK_EXPR. */
534 if (! n)
535 abort ();
536 *tp = copy_node (*tp);
537 TREE_OPERAND (*tp, 0) = (tree) n->value;
539 #endif /* INLINER_FOR_JAVA */
540 /* Otherwise, just copy the node. Note that copy_tree_r already
541 knows not to copy VAR_DECLs, etc., so this is safe. */
542 else
544 copy_tree_r (tp, walk_subtrees, NULL);
546 /* The copied TARGET_EXPR has never been expanded, even if the
547 original node was expanded already. */
548 if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
550 TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
551 TREE_OPERAND (*tp, 3) = NULL_TREE;
553 else if (TREE_CODE (*tp) == MODIFY_EXPR
554 && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
555 && ((*lang_hooks.tree_inlining.auto_var_in_fn_p)
556 (TREE_OPERAND (*tp, 0), fn)))
558 /* Some assignments VAR = VAR; don't generate any rtl code
559 and thus don't count as variable modification. Avoid
560 keeping bogosities like 0 = 0. */
561 tree decl = TREE_OPERAND (*tp, 0), value;
562 splay_tree_node n;
564 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
565 if (n)
567 value = (tree) n->value;
568 STRIP_TYPE_NOPS (value);
569 if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
570 *tp = value;
575 /* Keep iterating. */
576 return NULL_TREE;
579 /* Make a copy of the body of FN so that it can be inserted inline in
580 another function. */
582 static tree
583 copy_body (id)
584 inline_data *id;
586 tree body;
588 body = DECL_SAVED_TREE (VARRAY_TOP_TREE (id->fns));
589 walk_tree (&body, copy_body_r, id, NULL);
591 return body;
594 /* Generate code to initialize the parameters of the function at the
595 top of the stack in ID from the ARGS (presented as a TREE_LIST). */
597 static tree
598 #ifndef INLINER_FOR_JAVA
599 initialize_inlined_parameters (id, args, fn)
600 #else /* INLINER_FOR_JAVA */
601 initialize_inlined_parameters (id, args, fn, block)
602 #endif /* INLINER_FOR_JAVA */
603 inline_data *id;
604 tree args;
605 tree fn;
606 #ifdef INLINER_FOR_JAVA
607 tree block;
608 #endif /* INLINER_FOR_JAVA */
610 tree init_stmts;
611 tree parms;
612 tree a;
613 tree p;
614 #ifdef INLINER_FOR_JAVA
615 tree vars = NULL_TREE;
616 #endif /* INLINER_FOR_JAVA */
618 /* Figure out what the parameters are. */
619 parms = DECL_ARGUMENTS (fn);
621 /* Start with no initializations whatsoever. */
622 init_stmts = NULL_TREE;
624 /* Loop through the parameter declarations, replacing each with an
625 equivalent VAR_DECL, appropriately initialized. */
626 for (p = parms, a = args; p;
627 a = a ? TREE_CHAIN (a) : a, p = TREE_CHAIN (p))
629 #ifndef INLINER_FOR_JAVA
630 tree init_stmt;
631 tree cleanup;
632 #endif /* not INLINER_FOR_JAVA */
633 tree var;
634 tree value;
635 tree var_sub;
637 /* Find the initializer. */
638 value = (*lang_hooks.tree_inlining.convert_parm_for_inlining)
639 (p, a ? TREE_VALUE (a) : NULL_TREE, fn);
641 /* If the parameter is never assigned to, we may not need to
642 create a new variable here at all. Instead, we may be able
643 to just use the argument value. */
644 if (TREE_READONLY (p)
645 && !TREE_ADDRESSABLE (p)
646 && value && !TREE_SIDE_EFFECTS (value))
648 /* Simplify the value, if possible. */
649 value = fold (DECL_P (value) ? decl_constant_value (value) : value);
651 /* We can't risk substituting complex expressions. They
652 might contain variables that will be assigned to later.
653 Theoretically, we could check the expression to see if
654 all of the variables that determine its value are
655 read-only, but we don't bother. */
656 if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
658 /* If this is a declaration, wrap it a NOP_EXPR so that
659 we don't try to put the VALUE on the list of
660 BLOCK_VARS. */
661 if (DECL_P (value))
662 value = build1 (NOP_EXPR, TREE_TYPE (value), value);
664 splay_tree_insert (id->decl_map,
665 (splay_tree_key) p,
666 (splay_tree_value) value);
667 continue;
671 /* Make an equivalent VAR_DECL. */
672 var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0));
674 /* See if the frontend wants to pass this by invisible reference. If
675 so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
676 replace uses of the PARM_DECL with dereferences. */
677 if (TREE_TYPE (var) != TREE_TYPE (p)
678 && POINTER_TYPE_P (TREE_TYPE (var))
679 && TREE_TYPE (TREE_TYPE (var)) == TREE_TYPE (p))
680 var_sub = build1 (INDIRECT_REF, TREE_TYPE (p), var);
681 else
682 var_sub = var;
684 /* Register the VAR_DECL as the equivalent for the PARM_DECL;
685 that way, when the PARM_DECL is encountered, it will be
686 automatically replaced by the VAR_DECL. */
687 splay_tree_insert (id->decl_map,
688 (splay_tree_key) p,
689 (splay_tree_value) var_sub);
691 /* Declare this new variable. */
692 #ifndef INLINER_FOR_JAVA
693 init_stmt = build_stmt (DECL_STMT, var);
694 TREE_CHAIN (init_stmt) = init_stmts;
695 init_stmts = init_stmt;
696 #else /* INLINER_FOR_JAVA */
697 TREE_CHAIN (var) = vars;
698 vars = var;
699 #endif /* INLINER_FOR_JAVA */
701 /* Initialize this VAR_DECL from the equivalent argument. If
702 the argument is an object, created via a constructor or copy,
703 this will not result in an extra copy: the TARGET_EXPR
704 representing the argument will be bound to VAR, and the
705 object will be constructed in VAR. */
706 if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
707 #ifndef INLINER_FOR_JAVA
708 DECL_INITIAL (var) = value;
709 else
711 /* Even if P was TREE_READONLY, the new VAR should not be.
712 In the original code, we would have constructed a
713 temporary, and then the function body would have never
714 changed the value of P. However, now, we will be
715 constructing VAR directly. The constructor body may
716 change its value multiple times as it is being
717 constructed. Therefore, it must not be TREE_READONLY;
718 the back-end assumes that TREE_READONLY variable is
719 assigned to only once. */
720 TREE_READONLY (var) = 0;
722 /* Build a run-time initialization. */
723 init_stmt = build_stmt (EXPR_STMT,
724 build (INIT_EXPR, TREE_TYPE (p),
725 var, value));
726 /* Add this initialization to the list. Note that we want the
727 declaration *after* the initialization because we are going
728 to reverse all the initialization statements below. */
729 TREE_CHAIN (init_stmt) = init_stmts;
730 init_stmts = init_stmt;
733 /* See if we need to clean up the declaration. */
734 cleanup = (*lang_hooks.maybe_build_cleanup) (var);
735 if (cleanup)
737 tree cleanup_stmt;
738 /* Build the cleanup statement. */
739 cleanup_stmt = build_stmt (CLEANUP_STMT, var, cleanup);
740 /* Add it to the *front* of the list; the list will be
741 reversed below. */
742 TREE_CHAIN (cleanup_stmt) = init_stmts;
743 init_stmts = cleanup_stmt;
745 #else /* INLINER_FOR_JAVA */
747 tree assignment = build (MODIFY_EXPR, TREE_TYPE (p), var, value);
748 init_stmts = add_stmt_to_compound (init_stmts, TREE_TYPE (p),
749 assignment);
751 else
753 /* Java objects don't ever need constructing when being
754 passed as arguments because only call by reference is
755 supported. */
756 abort ();
758 #endif /* INLINER_FOR_JAVA */
761 #ifndef INLINER_FOR_JAVA
762 /* Evaluate trailing arguments. */
763 for (; a; a = TREE_CHAIN (a))
765 tree init_stmt;
766 tree value = TREE_VALUE (a);
768 if (! value || ! TREE_SIDE_EFFECTS (value))
769 continue;
771 init_stmt = build_stmt (EXPR_STMT, value);
772 TREE_CHAIN (init_stmt) = init_stmts;
773 init_stmts = init_stmt;
776 /* The initialization statements have been built up in reverse
777 order. Straighten them out now. */
778 return nreverse (init_stmts);
779 #else /* INLINER_FOR_JAVA */
780 BLOCK_VARS (block) = nreverse (vars);
781 return init_stmts;
782 #endif /* INLINER_FOR_JAVA */
785 /* Declare a return variable to replace the RESULT_DECL for the
786 function we are calling. An appropriate DECL_STMT is returned.
787 The USE_STMT is filled in to contain a use of the declaration to
788 indicate the return value of the function. */
790 #ifndef INLINER_FOR_JAVA
791 static tree
792 declare_return_variable (id, return_slot_addr, use_stmt)
793 struct inline_data *id;
794 tree return_slot_addr;
795 tree *use_stmt;
796 #else /* INLINER_FOR_JAVA */
797 static tree
798 declare_return_variable (id, return_slot_addr, var)
799 struct inline_data *id;
800 tree return_slot_addr;
801 tree *var;
802 #endif /* INLINER_FOR_JAVA */
804 tree fn = VARRAY_TOP_TREE (id->fns);
805 tree result = DECL_RESULT (fn);
806 #ifndef INLINER_FOR_JAVA
807 tree var;
808 #endif /* not INLINER_FOR_JAVA */
809 int need_return_decl = 1;
811 /* We don't need to do anything for functions that don't return
812 anything. */
813 if (!result || VOID_TYPE_P (TREE_TYPE (result)))
815 #ifndef INLINER_FOR_JAVA
816 *use_stmt = NULL_TREE;
817 #else /* INLINER_FOR_JAVA */
818 *var = NULL_TREE;
819 #endif /* INLINER_FOR_JAVA */
820 return NULL_TREE;
823 #ifndef INLINER_FOR_JAVA
824 var = ((*lang_hooks.tree_inlining.copy_res_decl_for_inlining)
825 (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
826 &need_return_decl, return_slot_addr));
828 /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
829 way, when the RESULT_DECL is encountered, it will be
830 automatically replaced by the VAR_DECL. */
831 splay_tree_insert (id->decl_map,
832 (splay_tree_key) result,
833 (splay_tree_value) var);
835 /* Build the USE_STMT. If the return type of the function was
836 promoted, convert it back to the expected type. */
837 if (TREE_TYPE (var) == TREE_TYPE (TREE_TYPE (fn)))
838 *use_stmt = build_stmt (EXPR_STMT, var);
839 else
840 *use_stmt = build_stmt (EXPR_STMT,
841 build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)),
842 var));
843 TREE_ADDRESSABLE (*use_stmt) = 1;
845 /* Build the declaration statement if FN does not return an
846 aggregate. */
847 if (need_return_decl)
848 return build_stmt (DECL_STMT, var);
849 #else /* INLINER_FOR_JAVA */
850 *var = ((*lang_hooks.tree_inlining.copy_res_decl_for_inlining)
851 (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
852 &need_return_decl, return_slot_addr));
854 splay_tree_insert (id->decl_map,
855 (splay_tree_key) result,
856 (splay_tree_value) *var);
857 DECL_IGNORED_P (*var) = 1;
858 if (need_return_decl)
859 return *var;
860 #endif /* INLINER_FOR_JAVA */
861 /* If FN does return an aggregate, there's no need to declare the
862 return variable; we're using a variable in our caller's frame. */
863 else
864 return NULL_TREE;
867 /* Returns nonzero if a function can be inlined as a tree. */
870 tree_inlinable_function_p (fn)
871 tree fn;
873 return inlinable_function_p (fn, NULL);
876 /* if *TP is possibly call to alloca, return nonzero. */
877 static tree
878 find_alloca_call_1 (tp, walk_subtrees, data)
879 tree *tp;
880 int *walk_subtrees ATTRIBUTE_UNUSED;
881 void *data ATTRIBUTE_UNUSED;
883 if (alloca_call_p (*tp))
884 return *tp;
885 return NULL;
888 /* Return subexpression representing possible alloca call,
889 if any. */
890 static tree
891 find_alloca_call (exp)
892 tree exp;
894 return walk_tree (&exp, find_alloca_call_1, NULL, NULL);
897 /* Returns nonzero if FN is a function that can be inlined into the
898 inlining context ID_. If ID_ is NULL, check whether the function
899 can be inlined at all. */
901 static int
902 inlinable_function_p (fn, id)
903 tree fn;
904 inline_data *id;
906 int inlinable;
907 int currfn_insns;
909 /* If we've already decided this function shouldn't be inlined,
910 there's no need to check again. */
911 if (DECL_UNINLINABLE (fn))
912 return 0;
914 /* Assume it is not inlinable. */
915 inlinable = 0;
917 /* The number of instructions (estimated) of current function. */
918 currfn_insns = DECL_NUM_STMTS (fn) * INSNS_PER_STMT;
920 /* If we're not inlining things, then nothing is inlinable. */
921 if (! flag_inline_trees)
923 /* If we're not inlining all functions and the function was not
924 declared `inline', we don't inline it. Don't think of
925 disregarding DECL_INLINE when flag_inline_trees == 2; it's the
926 front-end that must set DECL_INLINE in this case, because
927 dwarf2out loses if a function is inlined that doesn't have
928 DECL_INLINE set. */
929 else if (! DECL_INLINE (fn))
931 /* We can't inline functions that are too big. Only allow a single
932 function to be of MAX_INLINE_INSNS_SINGLE size. Make special
933 allowance for extern inline functions, though. */
934 else if (! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn)
935 && currfn_insns > MAX_INLINE_INSNS_SINGLE)
937 /* Refuse to inline alloca call unless user explicitly forced so as this may
938 change program's memory overhead drastically when the function using alloca
939 is called in loop. In GCC present in SPEC2000 inlining into schedule_block
940 cause it to require 2GB of ram instead of 256MB. */
941 else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL
942 && find_alloca_call (DECL_SAVED_TREE (fn)))
944 /* All is well. We can inline this function. Traditionally, GCC
945 has refused to inline functions using alloca, or functions whose
946 values are returned in a PARALLEL, and a few other such obscure
947 conditions. We are not equally constrained at the tree level. */
948 else
949 inlinable = 1;
951 /* Squirrel away the result so that we don't have to check again. */
952 DECL_UNINLINABLE (fn) = ! inlinable;
954 /* In case we don't disregard the inlining limits and we basically
955 can inline this function, investigate further. */
956 if (! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn)
957 && inlinable)
959 int sum_insns = (id ? id->inlined_stmts : 0) * INSNS_PER_STMT
960 + currfn_insns;
961 /* In the extreme case that we have exceeded the recursive inlining
962 limit by a huge factor (128), we just say no. Should not happen
963 in real life. */
964 if (sum_insns > MAX_INLINE_INSNS * 128)
965 inlinable = 0;
966 /* If we did not hit the extreme limit, we use a linear function
967 with slope -1/MAX_INLINE_SLOPE to exceedingly decrease the
968 allowable size. We always allow a size of MIN_INLINE_INSNS
969 though. */
970 else if ((sum_insns > MAX_INLINE_INSNS)
971 && (currfn_insns > MIN_INLINE_INSNS))
973 int max_curr = MAX_INLINE_INSNS_SINGLE
974 - (sum_insns - MAX_INLINE_INSNS) / MAX_INLINE_SLOPE;
975 if (currfn_insns > max_curr)
976 inlinable = 0;
980 if (inlinable && (*lang_hooks.tree_inlining.cannot_inline_tree_fn) (&fn))
981 inlinable = 0;
983 /* If we don't have the function body available, we can't inline
984 it. */
985 if (! DECL_SAVED_TREE (fn))
986 inlinable = 0;
988 /* Check again, language hooks may have modified it. */
989 if (! inlinable || DECL_UNINLINABLE (fn))
990 return 0;
992 /* Don't do recursive inlining, either. We don't record this in
993 DECL_UNINLINABLE; we may be able to inline this function later. */
994 if (id)
996 size_t i;
998 for (i = 0; i < VARRAY_ACTIVE_SIZE (id->fns); ++i)
999 if (VARRAY_TREE (id->fns, i) == fn)
1000 return 0;
1002 if (DECL_INLINED_FNS (fn))
1004 int j;
1005 tree inlined_fns = DECL_INLINED_FNS (fn);
1007 for (j = 0; j < TREE_VEC_LENGTH (inlined_fns); ++j)
1008 if (TREE_VEC_ELT (inlined_fns, j) == VARRAY_TREE (id->fns, 0))
1009 return 0;
1013 /* Return the result. */
1014 return inlinable;
1017 /* If *TP is a CALL_EXPR, replace it with its inline expansion. */
1019 static tree
1020 expand_call_inline (tp, walk_subtrees, data)
1021 tree *tp;
1022 int *walk_subtrees;
1023 void *data;
1025 inline_data *id;
1026 tree t;
1027 tree expr;
1028 tree stmt;
1029 #ifndef INLINER_FOR_JAVA
1030 tree chain;
1031 tree scope_stmt;
1032 tree use_stmt;
1033 #else /* INLINER_FOR_JAVA */
1034 tree retvar;
1035 #endif /* INLINER_FOR_JAVA */
1036 tree fn;
1037 tree arg_inits;
1038 tree *inlined_body;
1039 splay_tree st;
1040 tree args;
1041 tree return_slot_addr;
1043 /* See what we've got. */
1044 id = (inline_data *) data;
1045 t = *tp;
1047 /* Recurse, but letting recursive invocations know that we are
1048 inside the body of a TARGET_EXPR. */
1049 if (TREE_CODE (*tp) == TARGET_EXPR)
1051 #ifndef INLINER_FOR_JAVA
1052 int i, len = first_rtl_op (TARGET_EXPR);
1054 /* We're walking our own subtrees. */
1055 *walk_subtrees = 0;
1057 /* Actually walk over them. This loop is the body of
1058 walk_trees, omitting the case where the TARGET_EXPR
1059 itself is handled. */
1060 for (i = 0; i < len; ++i)
1062 if (i == 2)
1063 ++id->in_target_cleanup_p;
1064 walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1065 id->tree_pruner);
1066 if (i == 2)
1067 --id->in_target_cleanup_p;
1070 return NULL_TREE;
1071 #else /* INLINER_FOR_JAVA */
1072 abort ();
1073 #endif /* INLINER_FOR_JAVA */
1076 if (TYPE_P (t))
1077 /* Because types were not copied in copy_body, CALL_EXPRs beneath
1078 them should not be expanded. This can happen if the type is a
1079 dynamic array type, for example. */
1080 *walk_subtrees = 0;
1082 /* From here on, we're only interested in CALL_EXPRs. */
1083 if (TREE_CODE (t) != CALL_EXPR)
1084 return NULL_TREE;
1086 /* First, see if we can figure out what function is being called.
1087 If we cannot, then there is no hope of inlining the function. */
1088 fn = get_callee_fndecl (t);
1089 if (!fn)
1090 return NULL_TREE;
1092 /* If fn is a declaration of a function in a nested scope that was
1093 globally declared inline, we don't set its DECL_INITIAL.
1094 However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1095 C++ front-end uses it for cdtors to refer to their internal
1096 declarations, that are not real functions. Fortunately those
1097 don't have trees to be saved, so we can tell by checking their
1098 DECL_SAVED_TREE. */
1099 if (! DECL_INITIAL (fn)
1100 && DECL_ABSTRACT_ORIGIN (fn)
1101 && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1102 fn = DECL_ABSTRACT_ORIGIN (fn);
1104 /* Don't try to inline functions that are not well-suited to
1105 inlining. */
1106 if (!inlinable_function_p (fn, id))
1107 return NULL_TREE;
1109 if (! (*lang_hooks.tree_inlining.start_inlining) (fn))
1110 return NULL_TREE;
1112 /* Set the current filename and line number to the function we are
1113 inlining so that when we create new _STMT nodes here they get
1114 line numbers corresponding to the function we are calling. We
1115 wrap the whole inlined body in an EXPR_WITH_FILE_AND_LINE as well
1116 because individual statements don't record the filename. */
1117 push_srcloc (DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn));
1119 #ifndef INLINER_FOR_JAVA
1120 /* Build a statement-expression containing code to initialize the
1121 arguments, the actual inline expansion of the body, and a label
1122 for the return statements within the function to jump to. The
1123 type of the statement expression is the return type of the
1124 function call. */
1125 expr = build1 (STMT_EXPR, TREE_TYPE (TREE_TYPE (fn)), make_node (COMPOUND_STMT));
1126 /* There is no scope associated with the statement-expression. */
1127 STMT_EXPR_NO_SCOPE (expr) = 1;
1128 stmt = STMT_EXPR_STMT (expr);
1129 #else /* INLINER_FOR_JAVA */
1130 /* Build a block containing code to initialize the arguments, the
1131 actual inline expansion of the body, and a label for the return
1132 statements within the function to jump to. The type of the
1133 statement expression is the return type of the function call. */
1134 stmt = NULL;
1135 expr = build (BLOCK, TREE_TYPE (TREE_TYPE (fn)), stmt);
1136 #endif /* INLINER_FOR_JAVA */
1138 /* Local declarations will be replaced by their equivalents in this
1139 map. */
1140 st = id->decl_map;
1141 id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1142 NULL, NULL);
1144 /* Initialize the parameters. */
1145 args = TREE_OPERAND (t, 1);
1146 return_slot_addr = NULL_TREE;
1147 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1149 return_slot_addr = TREE_VALUE (args);
1150 args = TREE_CHAIN (args);
1153 #ifndef INLINER_FOR_JAVA
1154 arg_inits = initialize_inlined_parameters (id, args, fn);
1155 /* Expand any inlined calls in the initializers. Do this before we
1156 push FN on the stack of functions we are inlining; we want to
1157 inline calls to FN that appear in the initializers for the
1158 parameters. */
1159 expand_calls_inline (&arg_inits, id);
1160 /* And add them to the tree. */
1161 COMPOUND_BODY (stmt) = chainon (COMPOUND_BODY (stmt), arg_inits);
1162 #else /* INLINER_FOR_JAVA */
1163 arg_inits = initialize_inlined_parameters (id, args, fn, expr);
1164 if (arg_inits)
1166 /* Expand any inlined calls in the initializers. Do this before we
1167 push FN on the stack of functions we are inlining; we want to
1168 inline calls to FN that appear in the initializers for the
1169 parameters. */
1170 expand_calls_inline (&arg_inits, id);
1172 /* And add them to the tree. */
1173 BLOCK_EXPR_BODY (expr) = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1174 TREE_TYPE (arg_inits),
1175 arg_inits);
1177 #endif /* INLINER_FOR_JAVA */
1179 /* Record the function we are about to inline so that we can avoid
1180 recursing into it. */
1181 VARRAY_PUSH_TREE (id->fns, fn);
1183 /* Record the function we are about to inline if optimize_function
1184 has not been called on it yet and we don't have it in the list. */
1185 if (! DECL_INLINED_FNS (fn))
1187 int i;
1189 for (i = VARRAY_ACTIVE_SIZE (id->inlined_fns) - 1; i >= 0; i--)
1190 if (VARRAY_TREE (id->inlined_fns, i) == fn)
1191 break;
1192 if (i < 0)
1193 VARRAY_PUSH_TREE (id->inlined_fns, fn);
1196 /* Return statements in the function body will be replaced by jumps
1197 to the RET_LABEL. */
1198 id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
1199 DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
1201 if (! DECL_INITIAL (fn)
1202 || TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
1203 abort ();
1205 #ifndef INLINER_FOR_JAVA
1206 /* Create a block to put the parameters in. We have to do this
1207 after the parameters have been remapped because remapping
1208 parameters is different from remapping ordinary variables. */
1209 scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
1210 SCOPE_BEGIN_P (scope_stmt) = 1;
1211 SCOPE_NO_CLEANUPS_P (scope_stmt) = 1;
1212 remap_block (scope_stmt, DECL_ARGUMENTS (fn), id);
1213 TREE_CHAIN (scope_stmt) = COMPOUND_BODY (stmt);
1214 COMPOUND_BODY (stmt) = scope_stmt;
1216 /* Tell the debugging backends that this block represents the
1217 outermost scope of the inlined function. */
1218 if (SCOPE_STMT_BLOCK (scope_stmt))
1219 BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope_stmt)) = DECL_ORIGIN (fn);
1221 /* Declare the return variable for the function. */
1222 COMPOUND_BODY (stmt)
1223 = chainon (COMPOUND_BODY (stmt),
1224 declare_return_variable (id, return_slot_addr, &use_stmt));
1225 #else /* INLINER_FOR_JAVA */
1227 /* Declare the return variable for the function. */
1228 tree decl = declare_return_variable (id, return_slot_addr, &retvar);
1229 if (retvar)
1231 tree *next = &BLOCK_VARS (expr);
1232 while (*next)
1233 next = &TREE_CHAIN (*next);
1234 *next = decl;
1237 #endif /* INLINER_FOR_JAVA */
1239 /* After we've initialized the parameters, we insert the body of the
1240 function itself. */
1241 #ifndef INLINER_FOR_JAVA
1242 inlined_body = &COMPOUND_BODY (stmt);
1243 while (*inlined_body)
1244 inlined_body = &TREE_CHAIN (*inlined_body);
1245 *inlined_body = copy_body (id);
1246 #else /* INLINER_FOR_JAVA */
1248 tree new_body;
1249 java_inlining_map_static_initializers (fn, id->decl_map);
1250 new_body = copy_body (id);
1251 TREE_TYPE (new_body) = TREE_TYPE (TREE_TYPE (fn));
1252 BLOCK_EXPR_BODY (expr)
1253 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1254 TREE_TYPE (new_body), new_body);
1255 inlined_body = &BLOCK_EXPR_BODY (expr);
1257 #endif /* INLINER_FOR_JAVA */
1259 /* After the body of the function comes the RET_LABEL. This must come
1260 before we evaluate the returned value below, because that evaluation
1261 may cause RTL to be generated. */
1262 #ifndef INLINER_FOR_JAVA
1263 COMPOUND_BODY (stmt)
1264 = chainon (COMPOUND_BODY (stmt),
1265 build_stmt (LABEL_STMT, id->ret_label));
1266 #else /* INLINER_FOR_JAVA */
1268 tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1269 BLOCK_EXPR_BODY (expr)
1270 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr), void_type_node, label);
1271 TREE_SIDE_EFFECTS (label) = TREE_SIDE_EFFECTS (t);
1273 #endif /* INLINER_FOR_JAVA */
1275 /* Finally, mention the returned value so that the value of the
1276 statement-expression is the returned value of the function. */
1277 #ifndef INLINER_FOR_JAVA
1278 COMPOUND_BODY (stmt) = chainon (COMPOUND_BODY (stmt), use_stmt);
1280 /* Close the block for the parameters. */
1281 scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
1282 SCOPE_NO_CLEANUPS_P (scope_stmt) = 1;
1283 remap_block (scope_stmt, NULL_TREE, id);
1284 COMPOUND_BODY (stmt)
1285 = chainon (COMPOUND_BODY (stmt), scope_stmt);
1286 #else /* INLINER_FOR_JAVA */
1287 if (retvar)
1289 /* Mention the retvar. If the return type of the function was
1290 promoted, convert it back to the expected type. */
1291 if (TREE_TYPE (TREE_TYPE (fn)) != TREE_TYPE (retvar))
1292 retvar = build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)), retvar);
1293 BLOCK_EXPR_BODY (expr)
1294 = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1295 TREE_TYPE (retvar), retvar);
1298 java_inlining_merge_static_initializers (fn, id->decl_map);
1299 #endif /* INLINER_FOR_JAVA */
1301 /* Clean up. */
1302 splay_tree_delete (id->decl_map);
1303 id->decl_map = st;
1305 /* The new expression has side-effects if the old one did. */
1306 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t);
1308 /* Replace the call by the inlined body. Wrap it in an
1309 EXPR_WITH_FILE_LOCATION so that we'll get debugging line notes
1310 pointing to the right place. */
1311 #ifndef INLINER_FOR_JAVA
1312 chain = TREE_CHAIN (*tp);
1313 *tp = build_expr_wfl (expr, DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn),
1314 /*col=*/0);
1315 #else /* INLINER_FOR_JAVA */
1316 *tp = build_expr_wfl (expr, DECL_SOURCE_FILE (fn),
1317 DECL_SOURCE_LINE_FIRST(fn),
1318 /*col=*/0);
1319 #endif /* INLINER_FOR_JAVA */
1320 EXPR_WFL_EMIT_LINE_NOTE (*tp) = 1;
1321 #ifndef INLINER_FOR_JAVA
1322 TREE_CHAIN (*tp) = chain;
1323 #endif /* not INLINER_FOR_JAVA */
1324 pop_srcloc ();
1326 /* If the value of the new expression is ignored, that's OK. We
1327 don't warn about this for CALL_EXPRs, so we shouldn't warn about
1328 the equivalent inlined version either. */
1329 TREE_USED (*tp) = 1;
1331 /* Our function now has more statements than it did before. */
1332 DECL_NUM_STMTS (VARRAY_TREE (id->fns, 0)) += DECL_NUM_STMTS (fn);
1333 /* For accounting, subtract one for the saved call/ret. */
1334 id->inlined_stmts += DECL_NUM_STMTS (fn) - 1;
1336 /* Recurse into the body of the just inlined function. */
1337 expand_calls_inline (inlined_body, id);
1338 VARRAY_POP (id->fns);
1340 /* If we've returned to the top level, clear out the record of how
1341 much inlining has been done. */
1342 if (VARRAY_ACTIVE_SIZE (id->fns) == id->first_inlined_fn)
1343 id->inlined_stmts = 0;
1345 /* Don't walk into subtrees. We've already handled them above. */
1346 *walk_subtrees = 0;
1348 (*lang_hooks.tree_inlining.end_inlining) (fn);
1350 /* Keep iterating. */
1351 return NULL_TREE;
1353 /* Walk over the entire tree *TP, replacing CALL_EXPRs with inline
1354 expansions as appropriate. */
1356 static void
1357 expand_calls_inline (tp, id)
1358 tree *tp;
1359 inline_data *id;
1361 /* Search through *TP, replacing all calls to inline functions by
1362 appropriate equivalents. Use walk_tree in no-duplicates mode
1363 to avoid exponential time complexity. (We can't just use
1364 walk_tree_without_duplicates, because of the special TARGET_EXPR
1365 handling in expand_calls. The hash table is set up in
1366 optimize_function. */
1367 walk_tree (tp, expand_call_inline, id, id->tree_pruner);
1370 /* Expand calls to inline functions in the body of FN. */
1372 void
1373 optimize_inline_calls (fn)
1374 tree fn;
1376 inline_data id;
1377 tree prev_fn;
1379 /* Clear out ID. */
1380 memset (&id, 0, sizeof (id));
1382 /* Don't allow recursion into FN. */
1383 VARRAY_TREE_INIT (id.fns, 32, "fns");
1384 VARRAY_PUSH_TREE (id.fns, fn);
1385 /* Or any functions that aren't finished yet. */
1386 prev_fn = NULL_TREE;
1387 if (current_function_decl)
1389 VARRAY_PUSH_TREE (id.fns, current_function_decl);
1390 prev_fn = current_function_decl;
1393 prev_fn = ((*lang_hooks.tree_inlining.add_pending_fn_decls)
1394 (&id.fns, prev_fn));
1396 /* Create the list of functions this call will inline. */
1397 VARRAY_TREE_INIT (id.inlined_fns, 32, "inlined_fns");
1399 /* Keep track of the low-water mark, i.e., the point where the first
1400 real inlining is represented in ID.FNS. */
1401 id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1403 /* Replace all calls to inline functions with the bodies of those
1404 functions. */
1405 id.tree_pruner = htab_create (37, htab_hash_pointer,
1406 htab_eq_pointer, NULL);
1407 expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1409 /* Clean up. */
1410 htab_delete (id.tree_pruner);
1411 if (DECL_LANG_SPECIFIC (fn))
1413 tree ifn = make_tree_vec (VARRAY_ACTIVE_SIZE (id.inlined_fns));
1415 if (VARRAY_ACTIVE_SIZE (id.inlined_fns))
1416 memcpy (&TREE_VEC_ELT (ifn, 0), &VARRAY_TREE (id.inlined_fns, 0),
1417 VARRAY_ACTIVE_SIZE (id.inlined_fns) * sizeof (tree));
1418 DECL_INLINED_FNS (fn) = ifn;
1422 /* FN is a function that has a complete body, and CLONE is a function
1423 whose body is to be set to a copy of FN, mapping argument
1424 declarations according to the ARG_MAP splay_tree. */
1426 void
1427 clone_body (clone, fn, arg_map)
1428 tree clone, fn;
1429 void *arg_map;
1431 inline_data id;
1433 /* Clone the body, as if we were making an inline call. But, remap
1434 the parameters in the callee to the parameters of caller. If
1435 there's an in-charge parameter, map it to an appropriate
1436 constant. */
1437 memset (&id, 0, sizeof (id));
1438 VARRAY_TREE_INIT (id.fns, 2, "fns");
1439 VARRAY_PUSH_TREE (id.fns, clone);
1440 VARRAY_PUSH_TREE (id.fns, fn);
1441 id.decl_map = (splay_tree)arg_map;
1443 /* Cloning is treated slightly differently from inlining. Set
1444 CLONING_P so that it's clear which operation we're performing. */
1445 id.cloning_p = true;
1447 /* Actually copy the body. */
1448 TREE_CHAIN (DECL_SAVED_TREE (clone)) = copy_body (&id);
1451 /* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1452 FUNC is called with the DATA and the address of each sub-tree. If
1453 FUNC returns a non-NULL value, the traversal is aborted, and the
1454 value returned by FUNC is returned. If HTAB is non-NULL it is used
1455 to record the nodes visited, and to avoid visiting a node more than
1456 once. */
1458 tree
1459 walk_tree (tp, func, data, htab_)
1460 tree *tp;
1461 walk_tree_fn func;
1462 void *data;
1463 void *htab_;
1465 htab_t htab = (htab_t) htab_;
1466 enum tree_code code;
1467 int walk_subtrees;
1468 tree result;
1470 #define WALK_SUBTREE(NODE) \
1471 do \
1473 result = walk_tree (&(NODE), func, data, htab); \
1474 if (result) \
1475 return result; \
1477 while (0)
1479 #define WALK_SUBTREE_TAIL(NODE) \
1480 do \
1482 tp = & (NODE); \
1483 goto tail_recurse; \
1485 while (0)
1487 tail_recurse:
1488 /* Skip empty subtrees. */
1489 if (!*tp)
1490 return NULL_TREE;
1492 if (htab)
1494 void **slot;
1496 /* Don't walk the same tree twice, if the user has requested
1497 that we avoid doing so. */
1498 if (htab_find (htab, *tp))
1499 return NULL_TREE;
1500 /* If we haven't already seen this node, add it to the table. */
1501 slot = htab_find_slot (htab, *tp, INSERT);
1502 *slot = *tp;
1505 /* Call the function. */
1506 walk_subtrees = 1;
1507 result = (*func) (tp, &walk_subtrees, data);
1509 /* If we found something, return it. */
1510 if (result)
1511 return result;
1513 code = TREE_CODE (*tp);
1515 #ifndef INLINER_FOR_JAVA
1516 /* Even if we didn't, FUNC may have decided that there was nothing
1517 interesting below this point in the tree. */
1518 if (!walk_subtrees)
1520 if (statement_code_p (code) || code == TREE_LIST
1521 || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1522 /* But we still need to check our siblings. */
1523 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1524 else
1525 return NULL_TREE;
1528 /* Handle common cases up front. */
1529 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1530 || TREE_CODE_CLASS (code) == 'r'
1531 || TREE_CODE_CLASS (code) == 's')
1532 #else /* INLINER_FOR_JAVA */
1533 if (code != EXIT_BLOCK_EXPR
1534 && code != SAVE_EXPR
1535 && (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1536 || TREE_CODE_CLASS (code) == 'r'
1537 || TREE_CODE_CLASS (code) == 's'))
1538 #endif /* INLINER_FOR_JAVA */
1540 int i, len;
1542 #ifndef INLINER_FOR_JAVA
1543 /* Set lineno here so we get the right instantiation context
1544 if we call instantiate_decl from inlinable_function_p. */
1545 if (statement_code_p (code) && !STMT_LINENO_FOR_FN_P (*tp))
1546 lineno = STMT_LINENO (*tp);
1547 #endif /* not INLINER_FOR_JAVA */
1549 /* Walk over all the sub-trees of this operand. */
1550 len = first_rtl_op (code);
1551 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
1552 But, we only want to walk once. */
1553 if (code == TARGET_EXPR
1554 && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
1555 --len;
1556 /* Go through the subtrees. We need to do this in forward order so
1557 that the scope of a FOR_EXPR is handled properly. */
1558 for (i = 0; i < len; ++i)
1559 WALK_SUBTREE (TREE_OPERAND (*tp, i));
1561 #ifndef INLINER_FOR_JAVA
1562 /* For statements, we also walk the chain so that we cover the
1563 entire statement tree. */
1564 if (statement_code_p (code))
1566 if (code == DECL_STMT
1567 && DECL_STMT_DECL (*tp)
1568 && DECL_P (DECL_STMT_DECL (*tp)))
1570 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
1571 into declarations that are just mentioned, rather than
1572 declared; they don't really belong to this part of the tree.
1573 And, we can see cycles: the initializer for a declaration can
1574 refer to the declaration itself. */
1575 WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
1576 WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
1577 WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp)));
1580 /* This can be tail-recursion optimized if we write it this way. */
1581 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1584 #endif /* not INLINER_FOR_JAVA */
1585 /* We didn't find what we were looking for. */
1586 return NULL_TREE;
1588 else if (TREE_CODE_CLASS (code) == 'd')
1590 WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
1592 else if (TREE_CODE_CLASS (code) == 't')
1594 WALK_SUBTREE (TYPE_SIZE (*tp));
1595 WALK_SUBTREE (TYPE_SIZE_UNIT (*tp));
1596 /* Also examine various special fields, below. */
1599 result = (*lang_hooks.tree_inlining.walk_subtrees) (tp, &walk_subtrees, func,
1600 data, htab);
1601 if (result || ! walk_subtrees)
1602 return result;
1604 /* Not one of the easy cases. We must explicitly go through the
1605 children. */
1606 switch (code)
1608 case ERROR_MARK:
1609 case IDENTIFIER_NODE:
1610 case INTEGER_CST:
1611 case REAL_CST:
1612 case VECTOR_CST:
1613 case STRING_CST:
1614 case REAL_TYPE:
1615 case COMPLEX_TYPE:
1616 case VECTOR_TYPE:
1617 case VOID_TYPE:
1618 case BOOLEAN_TYPE:
1619 case UNION_TYPE:
1620 case ENUMERAL_TYPE:
1621 case BLOCK:
1622 case RECORD_TYPE:
1623 /* None of thse have subtrees other than those already walked
1624 above. */
1625 break;
1627 case POINTER_TYPE:
1628 case REFERENCE_TYPE:
1629 WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
1630 break;
1632 case TREE_LIST:
1633 WALK_SUBTREE (TREE_VALUE (*tp));
1634 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1635 break;
1637 case TREE_VEC:
1639 int len = TREE_VEC_LENGTH (*tp);
1641 if (len == 0)
1642 break;
1644 /* Walk all elements but the first. */
1645 while (--len)
1646 WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
1648 /* Now walk the first one as a tail call. */
1649 WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0));
1652 case COMPLEX_CST:
1653 WALK_SUBTREE (TREE_REALPART (*tp));
1654 WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp));
1656 case CONSTRUCTOR:
1657 WALK_SUBTREE_TAIL (CONSTRUCTOR_ELTS (*tp));
1659 case METHOD_TYPE:
1660 WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp));
1661 /* Fall through. */
1663 case FUNCTION_TYPE:
1664 WALK_SUBTREE (TREE_TYPE (*tp));
1666 tree arg = TYPE_ARG_TYPES (*tp);
1668 /* We never want to walk into default arguments. */
1669 for (; arg; arg = TREE_CHAIN (arg))
1670 WALK_SUBTREE (TREE_VALUE (arg));
1672 break;
1674 case ARRAY_TYPE:
1675 WALK_SUBTREE (TREE_TYPE (*tp));
1676 WALK_SUBTREE_TAIL (TYPE_DOMAIN (*tp));
1678 case INTEGER_TYPE:
1679 WALK_SUBTREE (TYPE_MIN_VALUE (*tp));
1680 WALK_SUBTREE_TAIL (TYPE_MAX_VALUE (*tp));
1682 case OFFSET_TYPE:
1683 WALK_SUBTREE (TREE_TYPE (*tp));
1684 WALK_SUBTREE_TAIL (TYPE_OFFSET_BASETYPE (*tp));
1686 #ifdef INLINER_FOR_JAVA
1687 case EXIT_BLOCK_EXPR:
1688 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 1));
1690 case SAVE_EXPR:
1691 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 0));
1692 #endif /* INLINER_FOR_JAVA */
1694 default:
1695 abort ();
1698 /* We didn't find what we were looking for. */
1699 return NULL_TREE;
1701 #undef WALK_SUBTREE
1702 #undef WALK_SUBTREE_TAIL
1705 /* Like walk_tree, but does not walk duplicate nodes more than
1706 once. */
1708 tree
1709 walk_tree_without_duplicates (tp, func, data)
1710 tree *tp;
1711 walk_tree_fn func;
1712 void *data;
1714 tree result;
1715 htab_t htab;
1717 htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
1718 result = walk_tree (tp, func, data, htab);
1719 htab_delete (htab);
1720 return result;
1723 /* Passed to walk_tree. Copies the node pointed to, if appropriate. */
1725 tree
1726 copy_tree_r (tp, walk_subtrees, data)
1727 tree *tp;
1728 int *walk_subtrees;
1729 void *data ATTRIBUTE_UNUSED;
1731 enum tree_code code = TREE_CODE (*tp);
1733 /* We make copies of most nodes. */
1734 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1735 || TREE_CODE_CLASS (code) == 'r'
1736 || TREE_CODE_CLASS (code) == 'c'
1737 || TREE_CODE_CLASS (code) == 's'
1738 || code == TREE_LIST
1739 || code == TREE_VEC
1740 || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1742 /* Because the chain gets clobbered when we make a copy, we save it
1743 here. */
1744 tree chain = TREE_CHAIN (*tp);
1746 /* Copy the node. */
1747 *tp = copy_node (*tp);
1749 /* Now, restore the chain, if appropriate. That will cause
1750 walk_tree to walk into the chain as well. */
1751 if (code == PARM_DECL || code == TREE_LIST
1752 #ifndef INLINER_FOR_JAVA
1753 || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp)
1754 || statement_code_p (code))
1755 TREE_CHAIN (*tp) = chain;
1757 /* For now, we don't update BLOCKs when we make copies. So, we
1758 have to nullify all scope-statements. */
1759 if (TREE_CODE (*tp) == SCOPE_STMT)
1760 SCOPE_STMT_BLOCK (*tp) = NULL_TREE;
1761 #else /* INLINER_FOR_JAVA */
1762 || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1763 TREE_CHAIN (*tp) = chain;
1764 #endif /* INLINER_FOR_JAVA */
1766 else if (TREE_CODE_CLASS (code) == 't' && !variably_modified_type_p (*tp))
1767 /* Types only need to be copied if they are variably modified. */
1768 *walk_subtrees = 0;
1770 return NULL_TREE;
1773 /* The SAVE_EXPR pointed to by TP is being copied. If ST contains
1774 information indicating to what new SAVE_EXPR this one should be
1775 mapped, use that one. Otherwise, create a new node and enter it in
1776 ST. FN is the function into which the copy will be placed. */
1778 void
1779 remap_save_expr (tp, st_, fn, walk_subtrees)
1780 tree *tp;
1781 void *st_;
1782 tree fn;
1783 int *walk_subtrees;
1785 splay_tree st = (splay_tree) st_;
1786 splay_tree_node n;
1788 /* See if we already encountered this SAVE_EXPR. */
1789 n = splay_tree_lookup (st, (splay_tree_key) *tp);
1791 /* If we didn't already remap this SAVE_EXPR, do so now. */
1792 if (!n)
1794 tree t = copy_node (*tp);
1796 /* The SAVE_EXPR is now part of the function into which we
1797 are inlining this body. */
1798 SAVE_EXPR_CONTEXT (t) = fn;
1799 /* And we haven't evaluated it yet. */
1800 SAVE_EXPR_RTL (t) = NULL_RTX;
1801 /* Remember this SAVE_EXPR. */
1802 n = splay_tree_insert (st,
1803 (splay_tree_key) *tp,
1804 (splay_tree_value) t);
1805 /* Make sure we don't remap an already-remapped SAVE_EXPR. */
1806 splay_tree_insert (st, (splay_tree_key) t,
1807 (splay_tree_value) error_mark_node);
1809 else
1810 /* We've already walked into this SAVE_EXPR, so we needn't do it
1811 again. */
1812 *walk_subtrees = 0;
1814 /* Replace this SAVE_EXPR with the copy. */
1815 *tp = (tree) n->value;
1818 #ifdef INLINER_FOR_JAVA
1819 /* Add STMT to EXISTING if possible, otherwise create a new
1820 COMPOUND_EXPR and add STMT to it. */
1822 static tree
1823 add_stmt_to_compound (existing, type, stmt)
1824 tree existing, type, stmt;
1826 if (!stmt)
1827 return existing;
1828 else if (existing)
1829 return build (COMPOUND_EXPR, type, existing, stmt);
1830 else
1831 return stmt;
1834 #endif /* INLINER_FOR_JAVA */