]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-inline.c
os-dep.c (GC_task_self): Declare as static and remove the second declaration.
[thirdparty/gcc.git] / gcc / tree-inline.c
CommitLineData
ac534736 1/* Tree inlining.
d9221e01 2 Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
588d3ade
AO
3 Contributed by Alexandre Oliva <aoliva@redhat.com>
4
54a7b573 5This file is part of GCC.
588d3ade 6
54a7b573 7GCC is free software; you can redistribute it and/or modify
588d3ade
AO
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
54a7b573 12GCC is distributed in the hope that it will be useful,
588d3ade
AO
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
54a7b573 18along with GCC; see the file COPYING. If not, write to
588d3ade
AO
19the Free Software Foundation, 59 Temple Place - Suite 330,
20Boston, MA 02111-1307, USA. */
21
22#include "config.h"
23#include "system.h"
4977bab6
ZW
24#include "coretypes.h"
25#include "tm.h"
69dcadff 26#include "toplev.h"
588d3ade
AO
27#include "tree.h"
28#include "tree-inline.h"
d4e4baa9
AO
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"
d23c55c2 39#include "langhooks.h"
1c4a429a 40#include "cgraph.h"
ddd2d57e 41#include "intl.h"
6de9cd9a 42#include "tree-mudflap.h"
18c6ada9 43#include "function.h"
6de9cd9a 44#include "diagnostic.h"
d4e4baa9 45
6de9cd9a
DN
46/* I'm not real happy about this, but we need to handle gimple and
47 non-gimple trees. */
48#include "tree-iterator.h"
eadf906f 49#include "tree-gimple.h"
588d3ade 50
588d3ade 51/* 0 if we should not perform inlining.
d92b4486
KH
52 1 if we should expand functions calls inline at the tree level.
53 2 if we should consider *all* functions to be inline
588d3ade
AO
54 candidates. */
55
56int flag_inline_trees = 0;
d4e4baa9
AO
57
58/* To Do:
59
60 o In order to make inlining-on-trees work, we pessimized
61 function-local static constants. In particular, they are now
62 always output, even when not addressed. Fix this by treating
63 function-local static constants just like global static
64 constants; the back-end already knows not to output them if they
65 are not needed.
66
67 o Provide heuristics to clamp inlining of recursive template
68 calls? */
69
70/* Data required for function inlining. */
71
72typedef struct inline_data
73{
74 /* A stack of the functions we are inlining. For example, if we are
75 compiling `f', which calls `g', which calls `h', and we are
76 inlining the body of `h', the stack will contain, `h', followed
77 by `g', followed by `f'. The first few elements of the stack may
78 contain other functions that we know we should not recurse into,
79 even though they are not directly being inlined. */
80 varray_type fns;
81 /* The index of the first element of FNS that really represents an
82 inlined function. */
83 unsigned first_inlined_fn;
84 /* The label to jump to when a return statement is encountered. If
85 this value is NULL, then return statements will simply be
86 remapped as return statements, rather than as jumps. */
87 tree ret_label;
6de9cd9a
DN
88 /* The VAR_DECL for the return value. */
89 tree retvar;
d4e4baa9
AO
90 /* The map from local declarations in the inlined function to
91 equivalents in the function into which it is being inlined. */
92 splay_tree decl_map;
93 /* Nonzero if we are currently within the cleanup for a
94 TARGET_EXPR. */
95 int in_target_cleanup_p;
d4e4baa9
AO
96 /* A list of the functions current function has inlined. */
97 varray_type inlined_fns;
d4e4baa9
AO
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;
18c6ada9
JH
103 /* Similarly for saving function body. */
104 bool saving_p;
d4e4baa9
AO
105 /* Hash table used to prevent walk_tree from visiting the same node
106 umpteen million times. */
107 htab_t tree_pruner;
18c6ada9
JH
108 /* Callgraph node of function we are inlining into. */
109 struct cgraph_node *node;
110 /* Callgraph node of currently inlined function. */
111 struct cgraph_node *current_node;
6de9cd9a
DN
112 /* Statement iterator. We need this so we can keep the tree in
113 gimple form when we insert the inlined function. It is not
114 used when we are not dealing with gimple trees. */
115 tree_stmt_iterator tsi;
d4e4baa9
AO
116} inline_data;
117
118/* Prototypes. */
119
6de9cd9a
DN
120/* The approximate number of instructions per statement. This number
121 need not be particularly accurate; it is used only to make
122 decisions about when a function is too big to inline. */
123#define INSNS_PER_STMT (10)
124
46c5ad27
AJ
125static tree declare_return_variable (inline_data *, tree, tree *);
126static tree copy_body_r (tree *, int *, void *);
127static tree copy_body (inline_data *);
128static tree expand_call_inline (tree *, int *, void *);
129static void expand_calls_inline (tree *, inline_data *);
b3c3af2f 130static bool inlinable_function_p (tree);
46c5ad27 131static tree remap_decl (tree, inline_data *);
3c2a7a6a 132static tree remap_type (tree, inline_data *);
6de9cd9a
DN
133static tree initialize_inlined_parameters (inline_data *, tree,
134 tree, tree, tree);
135static void remap_block (tree *, inline_data *);
136static tree remap_decls (tree, inline_data *);
137static void copy_bind_expr (tree *, int *, inline_data *);
138static tree mark_local_for_remap_r (tree *, int *, void *);
139static tree unsave_r (tree *, int *, void *);
140static void declare_inline_vars (tree bind_expr, tree vars);
d4e4baa9 141
5e20bdd7
JZ
142/* Insert a tree->tree mapping for ID. Despite the name suggests
143 that the trees should be variables, it is used for more than that. */
144
145static void
146insert_decl_map (inline_data *id, tree key, tree value)
147{
148 splay_tree_insert (id->decl_map, (splay_tree_key) key,
149 (splay_tree_value) value);
150
151 /* Always insert an identity map as well. If we see this same new
152 node again, we won't want to duplicate it a second time. */
153 if (key != value)
154 splay_tree_insert (id->decl_map, (splay_tree_key) value,
155 (splay_tree_value) value);
156}
157
5377d5ba
RK
158/* Remap DECL during the copying of the BLOCK tree for the function.
159 We are only called to remap local variables in the current function. */
d4e4baa9
AO
160
161static tree
46c5ad27 162remap_decl (tree decl, inline_data *id)
d4e4baa9 163{
5377d5ba
RK
164 splay_tree_node n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
165 tree fn = VARRAY_TOP_TREE (id->fns);
3c2a7a6a 166
5377d5ba
RK
167 /* See if we have remapped this declaration. If we didn't already have an
168 equivalent for this declaration, create one now. */
d4e4baa9
AO
169 if (!n)
170 {
d4e4baa9 171 /* Make a copy of the variable or label. */
5377d5ba 172 tree t = copy_decl_for_inlining (decl, fn, VARRAY_TREE (id->fns, 0));
3c2a7a6a
RH
173
174 /* Remap types, if necessary. */
175 TREE_TYPE (t) = remap_type (TREE_TYPE (t), id);
176 if (TREE_CODE (t) == TYPE_DECL)
177 DECL_ORIGINAL_TYPE (t) = remap_type (DECL_ORIGINAL_TYPE (t), id);
178 else if (TREE_CODE (t) == PARM_DECL)
179 DECL_ARG_TYPE_AS_WRITTEN (t)
180 = remap_type (DECL_ARG_TYPE_AS_WRITTEN (t), id);
181
182 /* Remap sizes as necessary. */
183 walk_tree (&DECL_SIZE (t), copy_body_r, id, NULL);
184 walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id, NULL);
d4e4baa9 185
5377d5ba
RK
186 /* If fields, do likewise for offset and qualifier. */
187 if (TREE_CODE (t) == FIELD_DECL)
188 {
189 walk_tree (&DECL_FIELD_OFFSET (t), copy_body_r, id, NULL);
190 if (TREE_CODE (DECL_CONTEXT (t)) == QUAL_UNION_TYPE)
191 walk_tree (&DECL_QUALIFIER (t), copy_body_r, id, NULL);
192 }
193
6de9cd9a
DN
194#if 0
195 /* FIXME handle anon aggrs. */
d4e4baa9 196 if (! DECL_NAME (t) && TREE_TYPE (t)
ae2bcd98 197 && lang_hooks.tree_inlining.anon_aggr_type_p (TREE_TYPE (t)))
d4e4baa9
AO
198 {
199 /* For a VAR_DECL of anonymous type, we must also copy the
3c2a7a6a 200 member VAR_DECLS here and rechain the DECL_ANON_UNION_ELEMS. */
d4e4baa9
AO
201 tree members = NULL;
202 tree src;
d92b4486 203
d4e4baa9
AO
204 for (src = DECL_ANON_UNION_ELEMS (t); src;
205 src = TREE_CHAIN (src))
206 {
207 tree member = remap_decl (TREE_VALUE (src), id);
208
209 if (TREE_PURPOSE (src))
210 abort ();
211 members = tree_cons (NULL, member, members);
212 }
213 DECL_ANON_UNION_ELEMS (t) = nreverse (members);
214 }
6de9cd9a 215#endif
d92b4486 216
d4e4baa9
AO
217 /* Remember it, so that if we encounter this local entity
218 again we can reuse this copy. */
5e20bdd7
JZ
219 insert_decl_map (id, decl, t);
220 return t;
d4e4baa9
AO
221 }
222
6de9cd9a 223 return unshare_expr ((tree) n->value);
d4e4baa9
AO
224}
225
3c2a7a6a
RH
226static tree
227remap_type (tree type, inline_data *id)
228{
229 splay_tree_node node;
230 tree new, t;
231
232 if (type == NULL)
233 return type;
234
235 /* See if we have remapped this type. */
236 node = splay_tree_lookup (id->decl_map, (splay_tree_key) type);
237 if (node)
238 return (tree) node->value;
239
5377d5ba
RK
240 /* The type only needs remapping if it's variably modified by a variable
241 in the function we are inlining. */
242 if (! variably_modified_type_p (type, VARRAY_TOP_TREE (id->fns)))
3c2a7a6a 243 {
5e20bdd7 244 insert_decl_map (id, type, type);
3c2a7a6a
RH
245 return type;
246 }
247
ed397c43
RK
248 /* We do need a copy. build and register it now. If this is a pointer or
249 reference type, remap the designated type and make a new pointer or
250 reference type. */
251 if (TREE_CODE (type) == POINTER_TYPE)
252 {
253 new = build_pointer_type_for_mode (remap_type (TREE_TYPE (type), id),
254 TYPE_MODE (type),
255 TYPE_REF_CAN_ALIAS_ALL (type));
256 insert_decl_map (id, type, new);
257 return new;
258 }
259 else if (TREE_CODE (type) == REFERENCE_TYPE)
260 {
261 new = build_reference_type_for_mode (remap_type (TREE_TYPE (type), id),
262 TYPE_MODE (type),
263 TYPE_REF_CAN_ALIAS_ALL (type));
264 insert_decl_map (id, type, new);
265 return new;
266 }
267 else
268 new = copy_node (type);
269
5e20bdd7 270 insert_decl_map (id, type, new);
3c2a7a6a
RH
271
272 /* This is a new type, not a copy of an old type. Need to reassociate
273 variants. We can handle everything except the main variant lazily. */
274 t = TYPE_MAIN_VARIANT (type);
275 if (type != t)
276 {
277 t = remap_type (t, id);
278 TYPE_MAIN_VARIANT (new) = t;
279 TYPE_NEXT_VARIANT (new) = TYPE_MAIN_VARIANT (t);
280 TYPE_NEXT_VARIANT (t) = new;
281 }
282 else
283 {
284 TYPE_MAIN_VARIANT (new) = new;
285 TYPE_NEXT_VARIANT (new) = NULL;
286 }
287
288 /* Lazily create pointer and reference types. */
289 TYPE_POINTER_TO (new) = NULL;
290 TYPE_REFERENCE_TO (new) = NULL;
291
292 switch (TREE_CODE (new))
293 {
294 case INTEGER_TYPE:
295 case REAL_TYPE:
296 case ENUMERAL_TYPE:
297 case BOOLEAN_TYPE:
298 case CHAR_TYPE:
299 t = TYPE_MIN_VALUE (new);
300 if (t && TREE_CODE (t) != INTEGER_CST)
301 walk_tree (&TYPE_MIN_VALUE (new), copy_body_r, id, NULL);
1c9766da 302
3c2a7a6a
RH
303 t = TYPE_MAX_VALUE (new);
304 if (t && TREE_CODE (t) != INTEGER_CST)
305 walk_tree (&TYPE_MAX_VALUE (new), copy_body_r, id, NULL);
306 return new;
307
3c2a7a6a
RH
308 case FUNCTION_TYPE:
309 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
310 walk_tree (&TYPE_ARG_TYPES (new), copy_body_r, id, NULL);
311 return new;
312
313 case ARRAY_TYPE:
314 TREE_TYPE (new) = remap_type (TREE_TYPE (new), id);
315 TYPE_DOMAIN (new) = remap_type (TYPE_DOMAIN (new), id);
316 break;
317
318 case RECORD_TYPE:
319 case UNION_TYPE:
320 case QUAL_UNION_TYPE:
321 walk_tree (&TYPE_FIELDS (new), copy_body_r, id, NULL);
322 break;
323
324 case FILE_TYPE:
325 case SET_TYPE:
326 case OFFSET_TYPE:
327 default:
328 /* Shouldn't have been thought variable sized. */
329 abort ();
330 }
331
332 walk_tree (&TYPE_SIZE (new), copy_body_r, id, NULL);
333 walk_tree (&TYPE_SIZE_UNIT (new), copy_body_r, id, NULL);
334
335 return new;
336}
337
6de9cd9a
DN
338static tree
339remap_decls (tree decls, inline_data *id)
d4e4baa9 340{
6de9cd9a
DN
341 tree old_var;
342 tree new_decls = NULL_TREE;
d4e4baa9 343
6de9cd9a
DN
344 /* Remap its variables. */
345 for (old_var = decls; old_var; old_var = TREE_CHAIN (old_var))
d4e4baa9 346 {
6de9cd9a
DN
347 tree new_var;
348
349 /* Remap the variable. */
350 new_var = remap_decl (old_var, id);
351
352 /* If we didn't remap this variable, so we can't mess with its
353 TREE_CHAIN. If we remapped this variable to the return slot, it's
354 already declared somewhere else, so don't declare it here. */
355 if (!new_var || new_var == id->retvar)
356 ;
357#ifdef ENABLE_CHECKING
358 else if (!DECL_P (new_var))
359 abort ();
360#endif
d4e4baa9
AO
361 else
362 {
6de9cd9a
DN
363 TREE_CHAIN (new_var) = new_decls;
364 new_decls = new_var;
d4e4baa9 365 }
d4e4baa9 366 }
d4e4baa9 367
6de9cd9a
DN
368 return nreverse (new_decls);
369}
370
371/* Copy the BLOCK to contain remapped versions of the variables
372 therein. And hook the new block into the block-tree. */
373
374static void
375remap_block (tree *block, inline_data *id)
376{
d436bff8
AH
377 tree old_block;
378 tree new_block;
d436bff8
AH
379 tree fn;
380
381 /* Make the new block. */
382 old_block = *block;
383 new_block = make_node (BLOCK);
384 TREE_USED (new_block) = TREE_USED (old_block);
385 BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
d436bff8
AH
386 *block = new_block;
387
388 /* Remap its variables. */
6de9cd9a 389 BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block), id);
d436bff8 390
6de9cd9a
DN
391 fn = VARRAY_TREE (id->fns, 0);
392#if 1
393 /* FIXME! It shouldn't be so hard to manage blocks. Rebuilding them in
394 rest_of_compilation is a good start. */
395 if (id->cloning_p)
396 /* We're building a clone; DECL_INITIAL is still
397 error_mark_node, and current_binding_level is the parm
398 binding level. */
673fda6b 399 lang_hooks.decls.insert_block (new_block);
6de9cd9a
DN
400 else
401 {
402 /* Attach this new block after the DECL_INITIAL block for the
403 function into which this block is being inlined. In
404 rest_of_compilation we will straighten out the BLOCK tree. */
405 tree *first_block;
406 if (DECL_INITIAL (fn))
407 first_block = &BLOCK_CHAIN (DECL_INITIAL (fn));
d436bff8 408 else
6de9cd9a
DN
409 first_block = &DECL_INITIAL (fn);
410 BLOCK_CHAIN (new_block) = *first_block;
411 *first_block = new_block;
d436bff8 412 }
6de9cd9a 413#endif
d436bff8 414 /* Remember the remapped block. */
6de9cd9a 415 insert_decl_map (id, old_block, new_block);
d4e4baa9
AO
416}
417
d4e4baa9 418static void
6de9cd9a 419copy_statement_list (tree *tp)
d4e4baa9 420{
6de9cd9a
DN
421 tree_stmt_iterator oi, ni;
422 tree new;
423
424 new = alloc_stmt_list ();
425 ni = tsi_start (new);
426 oi = tsi_start (*tp);
427 *tp = new;
428
429 for (; !tsi_end_p (oi); tsi_next (&oi))
430 tsi_link_after (&ni, tsi_stmt (oi), TSI_NEW_STMT);
431}
d4e4baa9 432
6de9cd9a
DN
433static void
434copy_bind_expr (tree *tp, int *walk_subtrees, inline_data *id)
435{
436 tree block = BIND_EXPR_BLOCK (*tp);
d4e4baa9
AO
437 /* Copy (and replace) the statement. */
438 copy_tree_r (tp, walk_subtrees, NULL);
6de9cd9a
DN
439 if (block)
440 {
441 remap_block (&block, id);
442 BIND_EXPR_BLOCK (*tp) = block;
443 }
d4e4baa9 444
6de9cd9a
DN
445 if (BIND_EXPR_VARS (*tp))
446 /* This will remap a lot of the same decls again, but this should be
447 harmless. */
448 BIND_EXPR_VARS (*tp) = remap_decls (BIND_EXPR_VARS (*tp), id);
d4e4baa9
AO
449}
450
aa4a53af
RK
451/* Called from copy_body via walk_tree. DATA is really an `inline_data *'. */
452
d4e4baa9 453static tree
46c5ad27 454copy_body_r (tree *tp, int *walk_subtrees, void *data)
d4e4baa9 455{
5377d5ba
RK
456 inline_data *id = (inline_data *) data;
457 tree fn = VARRAY_TOP_TREE (id->fns);
d4e4baa9
AO
458
459#if 0
460 /* All automatic variables should have a DECL_CONTEXT indicating
461 what function they come from. */
462 if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL)
463 && DECL_NAMESPACE_SCOPE_P (*tp))
464 if (! DECL_EXTERNAL (*tp) && ! TREE_STATIC (*tp))
465 abort ();
466#endif
467
9e14e18f
RH
468 /* If this is a RETURN_EXPR, change it into a MODIFY_EXPR and a
469 GOTO_EXPR with the RET_LABEL as its target. */
6de9cd9a 470 if (TREE_CODE (*tp) == RETURN_EXPR && id->ret_label)
d4e4baa9
AO
471 {
472 tree return_stmt = *tp;
473 tree goto_stmt;
474
6de9cd9a 475 /* Build the GOTO_EXPR. */
d436bff8
AH
476 tree assignment = TREE_OPERAND (return_stmt, 0);
477 goto_stmt = build1 (GOTO_EXPR, void_type_node, id->ret_label);
6de9cd9a 478 TREE_USED (id->ret_label) = 1;
d4e4baa9
AO
479
480 /* If we're returning something, just turn that into an
481 assignment into the equivalent of the original
482 RESULT_DECL. */
d436bff8 483 if (assignment)
6de9cd9a
DN
484 {
485 /* Do not create a statement containing a naked RESULT_DECL. */
486 if (lang_hooks.gimple_before_inlining)
487 if (TREE_CODE (assignment) == RESULT_DECL)
488 gimplify_stmt (&assignment);
489
9e14e18f 490 *tp = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
6de9cd9a
DN
491 append_to_statement_list (assignment, &BIND_EXPR_BODY (*tp));
492 append_to_statement_list (goto_stmt, &BIND_EXPR_BODY (*tp));
493 }
d4e4baa9
AO
494 /* If we're not returning anything just do the jump. */
495 else
496 *tp = goto_stmt;
497 }
498 /* Local variables and labels need to be replaced by equivalent
499 variables. We don't want to copy static variables; there's only
500 one of those, no matter how many times we inline the containing
5377d5ba 501 function. Similarly for globals from an outer function. */
ae2bcd98 502 else if (lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
d4e4baa9
AO
503 {
504 tree new_decl;
505
506 /* Remap the declaration. */
507 new_decl = remap_decl (*tp, id);
508 if (! new_decl)
509 abort ();
510 /* Replace this variable with the copy. */
511 STRIP_TYPE_NOPS (new_decl);
512 *tp = new_decl;
513 }
514#if 0
515 else if (nonstatic_local_decl_p (*tp)
516 && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
517 abort ();
518#endif
6de9cd9a
DN
519 else if (TREE_CODE (*tp) == STATEMENT_LIST)
520 copy_statement_list (tp);
d4e4baa9 521 else if (TREE_CODE (*tp) == SAVE_EXPR)
82c82743 522 remap_save_expr (tp, id->decl_map, walk_subtrees);
d4e4baa9
AO
523 else if (TREE_CODE (*tp) == UNSAVE_EXPR)
524 /* UNSAVE_EXPRs should not be generated until expansion time. */
525 abort ();
6de9cd9a
DN
526 else if (TREE_CODE (*tp) == BIND_EXPR)
527 copy_bind_expr (tp, walk_subtrees, id);
d436bff8
AH
528 else if (TREE_CODE (*tp) == LABELED_BLOCK_EXPR)
529 {
530 /* We need a new copy of this labeled block; the EXIT_BLOCK_EXPR
531 will refer to it, so save a copy ready for remapping. We
532 save it in the decl_map, although it isn't a decl. */
533 tree new_block = copy_node (*tp);
5e20bdd7 534 insert_decl_map (id, *tp, new_block);
d436bff8
AH
535 *tp = new_block;
536 }
537 else if (TREE_CODE (*tp) == EXIT_BLOCK_EXPR)
538 {
50aadcbc
AJ
539 splay_tree_node n
540 = splay_tree_lookup (id->decl_map,
d436bff8
AH
541 (splay_tree_key) TREE_OPERAND (*tp, 0));
542 /* We _must_ have seen the enclosing LABELED_BLOCK_EXPR. */
543 if (! n)
544 abort ();
545 *tp = copy_node (*tp);
546 TREE_OPERAND (*tp, 0) = (tree) n->value;
547 }
3c2a7a6a
RH
548 /* Types may need remapping as well. */
549 else if (TYPE_P (*tp))
550 *tp = remap_type (*tp, id);
551
d4e4baa9
AO
552 /* Otherwise, just copy the node. Note that copy_tree_r already
553 knows not to copy VAR_DECLs, etc., so this is safe. */
554 else
555 {
18c6ada9
JH
556 tree old_node = *tp;
557
68594ce7
JM
558 if (TREE_CODE (*tp) == MODIFY_EXPR
559 && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
ae2bcd98 560 && (lang_hooks.tree_inlining.auto_var_in_fn_p
68594ce7 561 (TREE_OPERAND (*tp, 0), fn)))
d4e4baa9
AO
562 {
563 /* Some assignments VAR = VAR; don't generate any rtl code
564 and thus don't count as variable modification. Avoid
565 keeping bogosities like 0 = 0. */
566 tree decl = TREE_OPERAND (*tp, 0), value;
567 splay_tree_node n;
568
569 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
570 if (n)
571 {
572 value = (tree) n->value;
573 STRIP_TYPE_NOPS (value);
574 if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
68594ce7
JM
575 {
576 *tp = value;
577 return copy_body_r (tp, walk_subtrees, data);
578 }
d4e4baa9
AO
579 }
580 }
68594ce7 581 else if (TREE_CODE (*tp) == ADDR_EXPR
ae2bcd98 582 && (lang_hooks.tree_inlining.auto_var_in_fn_p
68594ce7
JM
583 (TREE_OPERAND (*tp, 0), fn)))
584 {
585 /* Get rid of &* from inline substitutions. It can occur when
586 someone takes the address of a parm or return slot passed by
587 invisible reference. */
588 tree decl = TREE_OPERAND (*tp, 0), value;
589 splay_tree_node n;
590
591 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
592 if (n)
593 {
594 value = (tree) n->value;
595 if (TREE_CODE (value) == INDIRECT_REF)
596 {
5377d5ba
RK
597 if (!lang_hooks.types_compatible_p
598 (TREE_TYPE (*tp), TREE_TYPE (TREE_OPERAND (value, 0))))
599 *tp = fold_convert (TREE_TYPE (*tp),
600 TREE_OPERAND (value, 0));
601 else
602 *tp = TREE_OPERAND (value, 0);
603
6de9cd9a
DN
604 return copy_body_r (tp, walk_subtrees, data);
605 }
606 }
607 }
608 else if (TREE_CODE (*tp) == INDIRECT_REF)
609 {
610 /* Get rid of *& from inline substitutions that can happen when a
611 pointer argument is an ADDR_EXPR. */
612 tree decl = TREE_OPERAND (*tp, 0), value;
613 splay_tree_node n;
614
615 n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
616 if (n)
617 {
618 value = (tree) n->value;
619 STRIP_NOPS (value);
5377d5ba
RK
620 if (TREE_CODE (value) == ADDR_EXPR
621 && (lang_hooks.types_compatible_p
622 (TREE_TYPE (*tp), TREE_TYPE (TREE_OPERAND (value, 0)))))
6de9cd9a
DN
623 {
624 *tp = TREE_OPERAND (value, 0);
68594ce7
JM
625 return copy_body_r (tp, walk_subtrees, data);
626 }
627 }
628 }
629
630 copy_tree_r (tp, walk_subtrees, NULL);
631
18c6ada9
JH
632 if (TREE_CODE (*tp) == CALL_EXPR && id->node && get_callee_fndecl (*tp))
633 {
634 if (id->saving_p)
635 {
636 struct cgraph_node *node;
637 struct cgraph_edge *edge;
638
639 for (node = id->node->next_clone; node; node = node->next_clone)
640 {
641 edge = cgraph_edge (node, old_node);
642 if (edge)
643 edge->call_expr = *tp;
644 else
645 abort ();
646 }
647 }
6de9cd9a 648 else
18c6ada9 649 {
aa4a53af
RK
650 struct cgraph_edge *edge
651 = cgraph_edge (id->current_node, old_node);
18c6ada9 652
18c6ada9
JH
653 if (edge)
654 cgraph_clone_edge (edge, id->node, *tp);
655 }
656 }
657
3c2a7a6a
RH
658 TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
659
68594ce7
JM
660 /* The copied TARGET_EXPR has never been expanded, even if the
661 original node was expanded already. */
662 if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
663 {
664 TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
665 TREE_OPERAND (*tp, 3) = NULL_TREE;
666 }
d4e4baa9
AO
667 }
668
669 /* Keep iterating. */
670 return NULL_TREE;
671}
672
673/* Make a copy of the body of FN so that it can be inserted inline in
674 another function. */
675
676static tree
46c5ad27 677copy_body (inline_data *id)
d4e4baa9
AO
678{
679 tree body;
18c6ada9 680 tree fndecl = VARRAY_TOP_TREE (id->fns);
d4e4baa9 681
18c6ada9
JH
682 if (fndecl == current_function_decl
683 && cfun->saved_tree)
684 body = cfun->saved_tree;
685 else
686 body = DECL_SAVED_TREE (fndecl);
d4e4baa9
AO
687 walk_tree (&body, copy_body_r, id, NULL);
688
689 return body;
690}
691
6de9cd9a 692static void
aa4a53af
RK
693setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
694 tree *init_stmts, tree *vars, bool *gimplify_init_stmts_p)
6de9cd9a
DN
695{
696 tree init_stmt;
697 tree var;
698 tree var_sub;
699
700 /* If the parameter is never assigned to, we may not need to
701 create a new variable here at all. Instead, we may be able
702 to just use the argument value. */
703 if (TREE_READONLY (p)
704 && !TREE_ADDRESSABLE (p)
705 && value && !TREE_SIDE_EFFECTS (value))
706 {
707 /* We can't risk substituting complex expressions. They
708 might contain variables that will be assigned to later.
709 Theoretically, we could check the expression to see if
710 all of the variables that determine its value are
711 read-only, but we don't bother. */
712 if ((TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
713 /* We may produce non-gimple trees by adding NOPs or introduce
714 invalid sharing when operand is not really constant.
715 It is not big deal to prohibit constant propagation here as
716 we will constant propagate in DOM1 pass anyway. */
717 && (!lang_hooks.gimple_before_inlining
718 || (is_gimple_min_invariant (value)
719 && TREE_TYPE (value) == TREE_TYPE (p))))
720 {
721 /* If this is a declaration, wrap it a NOP_EXPR so that
722 we don't try to put the VALUE on the list of BLOCK_VARS. */
723 if (DECL_P (value))
724 value = build1 (NOP_EXPR, TREE_TYPE (value), value);
725
726 /* If this is a constant, make sure it has the right type. */
727 else if (TREE_TYPE (value) != TREE_TYPE (p))
728 value = fold (build1 (NOP_EXPR, TREE_TYPE (p), value));
729
730 insert_decl_map (id, p, value);
731 return;
732 }
733 }
734
5377d5ba
RK
735 /* Make an equivalent VAR_DECL. Note that we must NOT remap the type
736 here since the type of this decl must be visible to the calling
737 function. */
6de9cd9a
DN
738 var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0));
739
740 /* See if the frontend wants to pass this by invisible reference. If
741 so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
742 replace uses of the PARM_DECL with dereferences. */
743 if (TREE_TYPE (var) != TREE_TYPE (p)
744 && POINTER_TYPE_P (TREE_TYPE (var))
745 && TREE_TYPE (TREE_TYPE (var)) == TREE_TYPE (p))
746 {
747 insert_decl_map (id, var, var);
748 var_sub = build1 (INDIRECT_REF, TREE_TYPE (p), var);
749 }
750 else
751 var_sub = var;
752
753 /* Register the VAR_DECL as the equivalent for the PARM_DECL;
754 that way, when the PARM_DECL is encountered, it will be
755 automatically replaced by the VAR_DECL. */
756 insert_decl_map (id, p, var_sub);
757
758 /* Declare this new variable. */
759 TREE_CHAIN (var) = *vars;
760 *vars = var;
761
762 /* Make gimplifier happy about this variable. */
48eb4e53 763 DECL_SEEN_IN_BIND_EXPR_P (var) = lang_hooks.gimple_before_inlining;
6de9cd9a
DN
764
765 /* Even if P was TREE_READONLY, the new VAR should not be.
766 In the original code, we would have constructed a
767 temporary, and then the function body would have never
768 changed the value of P. However, now, we will be
769 constructing VAR directly. The constructor body may
770 change its value multiple times as it is being
771 constructed. Therefore, it must not be TREE_READONLY;
772 the back-end assumes that TREE_READONLY variable is
773 assigned to only once. */
774 if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
775 TREE_READONLY (var) = 0;
776
777 /* Initialize this VAR_DECL from the equivalent argument. Convert
778 the argument to the proper type in case it was promoted. */
779 if (value)
780 {
e072ae27 781 tree rhs = fold_convert (TREE_TYPE (var), value);
6de9cd9a
DN
782
783 if (rhs == error_mark_node)
784 return;
785
786 /* We want to use MODIFY_EXPR, not INIT_EXPR here so that we
787 keep our trees in gimple form. */
788 init_stmt = build (MODIFY_EXPR, TREE_TYPE (var), var, rhs);
789 append_to_statement_list (init_stmt, init_stmts);
790
791 /* If we did not create a gimple value and we did not create a gimple
792 cast of a gimple value, then we will need to gimplify INIT_STMTS
793 at the end. Note that is_gimple_cast only checks the outer
794 tree code, not its operand. Thus the explicit check that it's
795 operand is a gimple value. */
796 if (!is_gimple_val (rhs)
797 && (!is_gimple_cast (rhs)
798 || !is_gimple_val (TREE_OPERAND (rhs, 0))))
799 *gimplify_init_stmts_p = true;
800 }
801}
802
d4e4baa9
AO
803/* Generate code to initialize the parameters of the function at the
804 top of the stack in ID from the ARGS (presented as a TREE_LIST). */
805
806static tree
6de9cd9a
DN
807initialize_inlined_parameters (inline_data *id, tree args, tree static_chain,
808 tree fn, tree bind_expr)
d4e4baa9 809{
6de9cd9a 810 tree init_stmts = NULL_TREE;
d4e4baa9
AO
811 tree parms;
812 tree a;
813 tree p;
d436bff8 814 tree vars = NULL_TREE;
6de9cd9a 815 bool gimplify_init_stmts_p = false;
d5123bae 816 int argnum = 0;
d4e4baa9
AO
817
818 /* Figure out what the parameters are. */
18c6ada9 819 parms = DECL_ARGUMENTS (fn);
6de9cd9a 820 if (fn == current_function_decl)
18c6ada9 821 parms = cfun->saved_args;
d4e4baa9 822
d4e4baa9
AO
823 /* Loop through the parameter declarations, replacing each with an
824 equivalent VAR_DECL, appropriately initialized. */
4838c5ee
AO
825 for (p = parms, a = args; p;
826 a = a ? TREE_CHAIN (a) : a, p = TREE_CHAIN (p))
d4e4baa9 827 {
d4e4baa9
AO
828 tree value;
829
d5123bae
MS
830 ++argnum;
831
d4e4baa9 832 /* Find the initializer. */
ae2bcd98 833 value = lang_hooks.tree_inlining.convert_parm_for_inlining
d5123bae 834 (p, a ? TREE_VALUE (a) : NULL_TREE, fn, argnum);
4838c5ee 835
6de9cd9a
DN
836 setup_one_parameter (id, p, value, fn, &init_stmts, &vars,
837 &gimplify_init_stmts_p);
d4e4baa9
AO
838 }
839
4838c5ee
AO
840 /* Evaluate trailing arguments. */
841 for (; a; a = TREE_CHAIN (a))
842 {
6e4ae815 843 tree value = TREE_VALUE (a);
6de9cd9a
DN
844 append_to_statement_list (value, &init_stmts);
845 }
4838c5ee 846
6de9cd9a
DN
847 /* Initialize the static chain. */
848 p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
849 if (p)
850 {
851 /* No static chain? Seems like a bug in tree-nested.c. */
852 if (!static_chain)
853 abort ();
4838c5ee 854
6de9cd9a
DN
855 setup_one_parameter (id, p, static_chain, fn, &init_stmts, &vars,
856 &gimplify_init_stmts_p);
4838c5ee
AO
857 }
858
6de9cd9a 859 if (gimplify_init_stmts_p && lang_hooks.gimple_before_inlining)
83e113ae 860 gimplify_body (&init_stmts, current_function_decl);
6de9cd9a
DN
861
862 declare_inline_vars (bind_expr, vars);
d436bff8 863 return init_stmts;
d4e4baa9
AO
864}
865
866/* Declare a return variable to replace the RESULT_DECL for the
aa4a53af
RK
867 function we are calling. An appropriate decl is returned.
868
869 ??? Needs documentation of parameters. */
d4e4baa9 870
d436bff8 871static tree
6de9cd9a 872declare_return_variable (inline_data *id, tree return_slot_addr, tree *use_p)
d4e4baa9
AO
873{
874 tree fn = VARRAY_TOP_TREE (id->fns);
875 tree result = DECL_RESULT (fn);
d4e4baa9 876 int need_return_decl = 1;
6de9cd9a 877 tree var;
d4e4baa9
AO
878
879 /* We don't need to do anything for functions that don't return
880 anything. */
881 if (!result || VOID_TYPE_P (TREE_TYPE (result)))
882 {
6de9cd9a 883 *use_p = NULL_TREE;
d4e4baa9
AO
884 return NULL_TREE;
885 }
886
ae2bcd98 887 var = (lang_hooks.tree_inlining.copy_res_decl_for_inlining
69dcadff 888 (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
4977bab6 889 &need_return_decl, return_slot_addr));
6de9cd9a
DN
890
891 /* Do not have the rest of GCC warn about this variable as it should
892 not be visible to the user. */
893 TREE_NO_WARNING (var) = 1;
d4e4baa9
AO
894
895 /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
896 way, when the RESULT_DECL is encountered, it will be
897 automatically replaced by the VAR_DECL. */
5e20bdd7 898 insert_decl_map (id, result, var);
d4e4baa9 899
6de9cd9a
DN
900 /* Remember this so we can ignore it in remap_decls. */
901 id->retvar = var;
902
903 /* Build the use expr. If the return type of the function was
4838c5ee 904 promoted, convert it back to the expected type. */
6de9cd9a
DN
905 if (return_slot_addr)
906 /* The function returns through an explicit return slot, not a normal
907 return value. */
908 *use_p = NULL_TREE;
909 else if (TREE_TYPE (var) == TREE_TYPE (TREE_TYPE (fn)))
910 *use_p = var;
911 else if (TREE_CODE (var) == INDIRECT_REF)
912 *use_p = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (fn)),
913 TREE_OPERAND (var, 0));
914 else if (TREE_ADDRESSABLE (TREE_TYPE (var)))
915 abort ();
4838c5ee 916 else
6de9cd9a 917 *use_p = build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)), var);
1574ef13 918
d4e4baa9
AO
919 /* Build the declaration statement if FN does not return an
920 aggregate. */
921 if (need_return_decl)
6de9cd9a 922 return var;
d4e4baa9
AO
923 /* If FN does return an aggregate, there's no need to declare the
924 return variable; we're using a variable in our caller's frame. */
925 else
926 return NULL_TREE;
927}
928
0e9e1e0a 929/* Returns nonzero if a function can be inlined as a tree. */
4838c5ee 930
b3c3af2f
SB
931bool
932tree_inlinable_function_p (tree fn)
4838c5ee 933{
b3c3af2f 934 return inlinable_function_p (fn);
4838c5ee
AO
935}
936
f08545a8 937static const char *inline_forbidden_reason;
c986baf6 938
c986baf6 939static tree
f08545a8 940inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
edeb3871 941 void *fnp)
c986baf6 942{
f08545a8 943 tree node = *nodep;
edeb3871 944 tree fn = (tree) fnp;
f08545a8 945 tree t;
c986baf6 946
f08545a8
JH
947 switch (TREE_CODE (node))
948 {
949 case CALL_EXPR:
3197c4fd
AS
950 /* Refuse to inline alloca call unless user explicitly forced so as
951 this may change program's memory overhead drastically when the
952 function using alloca is called in loop. In GCC present in
953 SPEC2000 inlining into schedule_block cause it to require 2GB of
954 RAM instead of 256MB. */
f08545a8
JH
955 if (alloca_call_p (node)
956 && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
957 {
ddd2d57e
RH
958 inline_forbidden_reason
959 = N_("%Jfunction '%F' can never be inlined because it uses "
960 "alloca (override using the always_inline attribute)");
f08545a8
JH
961 return node;
962 }
963 t = get_callee_fndecl (node);
964 if (! t)
965 break;
84f5e1b1 966
f08545a8
JH
967 /* We cannot inline functions that call setjmp. */
968 if (setjmp_call_p (t))
969 {
ddd2d57e
RH
970 inline_forbidden_reason
971 = N_("%Jfunction '%F' can never be inlined because it uses setjmp");
f08545a8
JH
972 return node;
973 }
974
6de9cd9a 975 if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL)
3197c4fd 976 switch (DECL_FUNCTION_CODE (t))
f08545a8 977 {
3197c4fd
AS
978 /* We cannot inline functions that take a variable number of
979 arguments. */
980 case BUILT_IN_VA_START:
981 case BUILT_IN_STDARG_START:
982 case BUILT_IN_NEXT_ARG:
983 case BUILT_IN_VA_END:
6de9cd9a
DN
984 inline_forbidden_reason
985 = N_("%Jfunction '%F' can never be inlined because it "
986 "uses variable argument lists");
987 return node;
988
3197c4fd 989 case BUILT_IN_LONGJMP:
6de9cd9a
DN
990 /* We can't inline functions that call __builtin_longjmp at
991 all. The non-local goto machinery really requires the
992 destination be in a different function. If we allow the
993 function calling __builtin_longjmp to be inlined into the
994 function calling __builtin_setjmp, Things will Go Awry. */
995 inline_forbidden_reason
996 = N_("%Jfunction '%F' can never be inlined because "
997 "it uses setjmp-longjmp exception handling");
998 return node;
999
1000 case BUILT_IN_NONLOCAL_GOTO:
1001 /* Similarly. */
1002 inline_forbidden_reason
1003 = N_("%Jfunction '%F' can never be inlined because "
1004 "it uses non-local goto");
1005 return node;
f08545a8 1006
3197c4fd
AS
1007 default:
1008 break;
1009 }
f08545a8
JH
1010 break;
1011
6de9cd9a
DN
1012 case BIND_EXPR:
1013 for (t = BIND_EXPR_VARS (node); t ; t = TREE_CHAIN (t))
f08545a8 1014 {
6de9cd9a
DN
1015 /* We cannot inline functions that contain other functions. */
1016 if (TREE_CODE (t) == FUNCTION_DECL && DECL_INITIAL (t))
1017 {
1018 inline_forbidden_reason
1019 = N_("%Jfunction '%F' can never be inlined "
1020 "because it contains a nested function");
1021 return node;
1022 }
f08545a8
JH
1023 }
1024 break;
1025
f08545a8
JH
1026 case GOTO_EXPR:
1027 t = TREE_OPERAND (node, 0);
1028
1029 /* We will not inline a function which uses computed goto. The
1030 addresses of its local labels, which may be tucked into
1031 global storage, are of course not constant across
1032 instantiations, which causes unexpected behavior. */
1033 if (TREE_CODE (t) != LABEL_DECL)
1034 {
ddd2d57e
RH
1035 inline_forbidden_reason
1036 = N_("%Jfunction '%F' can never be inlined "
1037 "because it contains a computed goto");
f08545a8
JH
1038 return node;
1039 }
6de9cd9a 1040 break;
f08545a8 1041
6de9cd9a
DN
1042 case LABEL_EXPR:
1043 t = TREE_OPERAND (node, 0);
1044 if (DECL_NONLOCAL (t))
f08545a8 1045 {
6de9cd9a
DN
1046 /* We cannot inline a function that receives a non-local goto
1047 because we cannot remap the destination label used in the
1048 function that is performing the non-local goto. */
ddd2d57e
RH
1049 inline_forbidden_reason
1050 = N_("%Jfunction '%F' can never be inlined "
6de9cd9a 1051 "because it receives a non-local goto");
ed397c43 1052 return node;
f08545a8 1053 }
f08545a8
JH
1054 break;
1055
1056 case RECORD_TYPE:
1057 case UNION_TYPE:
1058 /* We cannot inline a function of the form
1059
1060 void F (int i) { struct S { int ar[i]; } s; }
1061
1062 Attempting to do so produces a catch-22.
1063 If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
1064 UNION_TYPE nodes, then it goes into infinite recursion on a
1065 structure containing a pointer to its own type. If it doesn't,
1066 then the type node for S doesn't get adjusted properly when
1067 F is inlined, and we abort in find_function_data. */
1068 for (t = TYPE_FIELDS (node); t; t = TREE_CHAIN (t))
5377d5ba 1069 if (variably_modified_type_p (TREE_TYPE (t), NULL))
f08545a8 1070 {
ddd2d57e
RH
1071 inline_forbidden_reason
1072 = N_("%Jfunction '%F' can never be inlined "
1073 "because it uses variable sized variables");
f08545a8
JH
1074 return node;
1075 }
6de9cd9a 1076
f08545a8
JH
1077 default:
1078 break;
1079 }
1080
1081 return NULL_TREE;
84f5e1b1
RH
1082}
1083
f08545a8 1084/* Return subexpression representing possible alloca call, if any. */
84f5e1b1 1085static tree
f08545a8 1086inline_forbidden_p (tree fndecl)
84f5e1b1 1087{
070588f0 1088 location_t saved_loc = input_location;
ed397c43
RK
1089 tree ret = walk_tree_without_duplicates (&DECL_SAVED_TREE (fndecl),
1090 inline_forbidden_p_1, fndecl);
1091
070588f0 1092 input_location = saved_loc;
d1a74aa7 1093 return ret;
84f5e1b1
RH
1094}
1095
b3c3af2f
SB
1096/* Returns nonzero if FN is a function that does not have any
1097 fundamental inline blocking properties. */
d4e4baa9 1098
b3c3af2f
SB
1099static bool
1100inlinable_function_p (tree fn)
d4e4baa9 1101{
b3c3af2f 1102 bool inlinable = true;
d4e4baa9
AO
1103
1104 /* If we've already decided this function shouldn't be inlined,
1105 there's no need to check again. */
1106 if (DECL_UNINLINABLE (fn))
b3c3af2f 1107 return false;
d4e4baa9 1108
d58b7c2d
MM
1109 /* See if there is any language-specific reason it cannot be
1110 inlined. (It is important that this hook be called early because
b3c3af2f
SB
1111 in C++ it may result in template instantiation.)
1112 If the function is not inlinable for language-specific reasons,
1113 it is left up to the langhook to explain why. */
ae2bcd98 1114 inlinable = !lang_hooks.tree_inlining.cannot_inline_tree_fn (&fn);
46c5ad27 1115
b3c3af2f
SB
1116 /* If we don't have the function body available, we can't inline it.
1117 However, this should not be recorded since we also get here for
1118 forward declared inline functions. Therefore, return at once. */
1119 if (!DECL_SAVED_TREE (fn))
1120 return false;
1121
1122 /* If we're not inlining at all, then we cannot inline this function. */
1123 else if (!flag_inline_trees)
1124 inlinable = false;
1125
1126 /* Only try to inline functions if DECL_INLINE is set. This should be
1127 true for all functions declared `inline', and for all other functions
1128 as well with -finline-functions.
1129
1130 Don't think of disregarding DECL_INLINE when flag_inline_trees == 2;
1131 it's the front-end that must set DECL_INLINE in this case, because
1132 dwarf2out loses if a function that does not have DECL_INLINE set is
1133 inlined anyway. That is why we have both DECL_INLINE and
1134 DECL_DECLARED_INLINE_P. */
1135 /* FIXME: When flag_inline_trees dies, the check for flag_unit_at_a_time
1136 here should be redundant. */
1137 else if (!DECL_INLINE (fn) && !flag_unit_at_a_time)
1138 inlinable = false;
a0c8285b 1139
f08545a8 1140 else if (inline_forbidden_p (fn))
b3c3af2f
SB
1141 {
1142 /* See if we should warn about uninlinable functions. Previously,
1143 some of these warnings would be issued while trying to expand
1144 the function inline, but that would cause multiple warnings
1145 about functions that would for example call alloca. But since
1146 this a property of the function, just one warning is enough.
1147 As a bonus we can now give more details about the reason why a
1148 function is not inlinable.
1149 We only warn for functions declared `inline' by the user. */
1150 bool do_warning = (warn_inline
1151 && DECL_INLINE (fn)
1152 && DECL_DECLARED_INLINE_P (fn)
1153 && !DECL_IN_SYSTEM_HEADER (fn));
1154
aa4a53af 1155 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
2d327012
JH
1156 sorry (inline_forbidden_reason, fn, fn);
1157 else if (do_warning)
ddd2d57e 1158 warning (inline_forbidden_reason, fn, fn);
b3c3af2f
SB
1159
1160 inlinable = false;
1161 }
d4e4baa9
AO
1162
1163 /* Squirrel away the result so that we don't have to check again. */
b3c3af2f 1164 DECL_UNINLINABLE (fn) = !inlinable;
d4e4baa9 1165
b3c3af2f
SB
1166 return inlinable;
1167}
1168
6de9cd9a
DN
1169/* Used by estimate_num_insns. Estimate number of instructions seen
1170 by given statement. */
aa4a53af 1171
6de9cd9a
DN
1172static tree
1173estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
1174{
1175 int *count = data;
1176 tree x = *tp;
1177
1178 if (TYPE_P (x) || DECL_P (x))
1179 {
1180 *walk_subtrees = 0;
1181 return NULL;
1182 }
1183 /* Assume that constants and references counts nothing. These should
1184 be majorized by amount of operations among them we count later
1185 and are common target of CSE and similar optimizations. */
ed397c43
RK
1186 else if (TREE_CODE_CLASS (TREE_CODE (x)) == 'c'
1187 || TREE_CODE_CLASS (TREE_CODE (x)) == 'r')
6de9cd9a 1188 return NULL;
ed397c43 1189
6de9cd9a
DN
1190 switch (TREE_CODE (x))
1191 {
1192 /* Containers have no cost. */
1193 case TREE_LIST:
1194 case TREE_VEC:
1195 case BLOCK:
1196 case COMPONENT_REF:
1197 case BIT_FIELD_REF:
1198 case INDIRECT_REF:
1199 case BUFFER_REF:
1200 case ARRAY_REF:
1201 case ARRAY_RANGE_REF:
0f59171d 1202 case OBJ_TYPE_REF:
6de9cd9a
DN
1203 case EXC_PTR_EXPR: /* ??? */
1204 case FILTER_EXPR: /* ??? */
1205 case COMPOUND_EXPR:
1206 case BIND_EXPR:
1207 case LABELED_BLOCK_EXPR:
1208 case WITH_CLEANUP_EXPR:
1209 case NOP_EXPR:
1210 case VIEW_CONVERT_EXPR:
1211 case SAVE_EXPR:
1212 case UNSAVE_EXPR:
1213 case ADDR_EXPR:
6de9cd9a 1214 case COMPLEX_EXPR:
6de9cd9a
DN
1215 case EXIT_BLOCK_EXPR:
1216 case CASE_LABEL_EXPR:
1217 case SSA_NAME:
1218 case CATCH_EXPR:
1219 case EH_FILTER_EXPR:
1220 case STATEMENT_LIST:
1221 case ERROR_MARK:
1222 case NON_LVALUE_EXPR:
1223 case ENTRY_VALUE_EXPR:
1224 case FDESC_EXPR:
1225 case VA_ARG_EXPR:
1226 case TRY_CATCH_EXPR:
1227 case TRY_FINALLY_EXPR:
1228 case LABEL_EXPR:
1229 case GOTO_EXPR:
1230 case RETURN_EXPR:
1231 case EXIT_EXPR:
1232 case LOOP_EXPR:
6de9cd9a
DN
1233 case PHI_NODE:
1234 break;
aa4a53af 1235
6de9cd9a
DN
1236 /* We don't account constants for now. Assume that the cost is amortized
1237 by operations that do use them. We may re-consider this decision once
1238 we are able to optimize the tree before estimating it's size and break
1239 out static initializers. */
1240 case IDENTIFIER_NODE:
1241 case INTEGER_CST:
1242 case REAL_CST:
1243 case COMPLEX_CST:
1244 case VECTOR_CST:
1245 case STRING_CST:
1246 *walk_subtrees = 0;
1247 return NULL;
3a5b9284 1248
6de9cd9a
DN
1249 /* Recognize assignments of large structures and constructors of
1250 big arrays. */
1251 case INIT_EXPR:
6de9cd9a 1252 case MODIFY_EXPR:
3a5b9284
RH
1253 x = TREE_OPERAND (x, 0);
1254 /* FALLTHRU */
1255 case TARGET_EXPR:
6de9cd9a
DN
1256 case CONSTRUCTOR:
1257 {
1258 HOST_WIDE_INT size;
1259
1260 size = int_size_in_bytes (TREE_TYPE (x));
1261
1262 if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO)
1263 *count += 10;
1264 else
1265 *count += ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
1266 }
1267 break;
1268
1269 /* Assign cost of 1 to usual operations.
1270 ??? We may consider mapping RTL costs to this. */
1271 case COND_EXPR:
1272
1273 case PLUS_EXPR:
1274 case MINUS_EXPR:
1275 case MULT_EXPR:
1276
1277 case FIX_TRUNC_EXPR:
1278 case FIX_CEIL_EXPR:
1279 case FIX_FLOOR_EXPR:
1280 case FIX_ROUND_EXPR:
1281
1282 case NEGATE_EXPR:
1283 case FLOAT_EXPR:
1284 case MIN_EXPR:
1285 case MAX_EXPR:
1286 case ABS_EXPR:
1287
1288 case LSHIFT_EXPR:
1289 case RSHIFT_EXPR:
1290 case LROTATE_EXPR:
1291 case RROTATE_EXPR:
1292
1293 case BIT_IOR_EXPR:
1294 case BIT_XOR_EXPR:
1295 case BIT_AND_EXPR:
1296 case BIT_NOT_EXPR:
1297
1298 case TRUTH_ANDIF_EXPR:
1299 case TRUTH_ORIF_EXPR:
1300 case TRUTH_AND_EXPR:
1301 case TRUTH_OR_EXPR:
1302 case TRUTH_XOR_EXPR:
1303 case TRUTH_NOT_EXPR:
1304
1305 case LT_EXPR:
1306 case LE_EXPR:
1307 case GT_EXPR:
1308 case GE_EXPR:
1309 case EQ_EXPR:
1310 case NE_EXPR:
1311 case ORDERED_EXPR:
1312 case UNORDERED_EXPR:
1313
1314 case UNLT_EXPR:
1315 case UNLE_EXPR:
1316 case UNGT_EXPR:
1317 case UNGE_EXPR:
1318 case UNEQ_EXPR:
d1a7edaf 1319 case LTGT_EXPR:
6de9cd9a
DN
1320
1321 case CONVERT_EXPR:
1322
1323 case CONJ_EXPR:
1324
1325 case PREDECREMENT_EXPR:
1326 case PREINCREMENT_EXPR:
1327 case POSTDECREMENT_EXPR:
1328 case POSTINCREMENT_EXPR:
1329
1330 case SWITCH_EXPR:
1331
1332 case ASM_EXPR:
1333
1334 case RESX_EXPR:
1335 *count++;
1336 break;
1337
1ea7e6ad 1338 /* Few special cases of expensive operations. This is useful
6de9cd9a
DN
1339 to avoid inlining on functions having too many of these. */
1340 case TRUNC_DIV_EXPR:
1341 case CEIL_DIV_EXPR:
1342 case FLOOR_DIV_EXPR:
1343 case ROUND_DIV_EXPR:
1344 case EXACT_DIV_EXPR:
1345 case TRUNC_MOD_EXPR:
1346 case CEIL_MOD_EXPR:
1347 case FLOOR_MOD_EXPR:
1348 case ROUND_MOD_EXPR:
1349 case RDIV_EXPR:
1350 *count += 10;
1351 break;
1352 case CALL_EXPR:
1353 {
1354 tree decl = get_callee_fndecl (x);
1355
1356 if (decl && DECL_BUILT_IN (decl))
1357 switch (DECL_FUNCTION_CODE (decl))
1358 {
1359 case BUILT_IN_CONSTANT_P:
1360 *walk_subtrees = 0;
1361 return NULL_TREE;
1362 case BUILT_IN_EXPECT:
1363 return NULL_TREE;
1364 default:
1365 break;
1366 }
1367 *count += 10;
1368 break;
1369 }
1370 default:
1371 /* Abort here se we know we don't miss any nodes. */
1372 abort ();
1373 }
1374 return NULL;
1375}
1376
1377/* Estimate number of instructions that will be created by expanding EXPR. */
aa4a53af 1378
6de9cd9a
DN
1379int
1380estimate_num_insns (tree expr)
1381{
1382 int num = 0;
1383 walk_tree_without_duplicates (&expr, estimate_num_insns_1, &num);
1384 return num;
1385}
1386
d4e4baa9
AO
1387/* If *TP is a CALL_EXPR, replace it with its inline expansion. */
1388
1389static tree
46c5ad27 1390expand_call_inline (tree *tp, int *walk_subtrees, void *data)
d4e4baa9
AO
1391{
1392 inline_data *id;
1393 tree t;
1394 tree expr;
e2405951 1395 tree stmt;
6de9cd9a
DN
1396 tree use_retvar;
1397 tree decl;
d436bff8 1398 tree fn;
d4e4baa9
AO
1399 tree arg_inits;
1400 tree *inlined_body;
6de9cd9a 1401 tree inline_result;
d4e4baa9 1402 splay_tree st;
4977bab6
ZW
1403 tree args;
1404 tree return_slot_addr;
6de9cd9a 1405 location_t saved_location;
18c6ada9 1406 struct cgraph_edge *edge;
dc0bfe6a 1407 const char *reason;
d4e4baa9
AO
1408
1409 /* See what we've got. */
1410 id = (inline_data *) data;
1411 t = *tp;
1412
6de9cd9a
DN
1413 /* Set input_location here so we get the right instantiation context
1414 if we call instantiate_decl from inlinable_function_p. */
1415 saved_location = input_location;
1416 if (EXPR_HAS_LOCATION (t))
1417 input_location = EXPR_LOCATION (t);
1418
d4e4baa9
AO
1419 /* Recurse, but letting recursive invocations know that we are
1420 inside the body of a TARGET_EXPR. */
1421 if (TREE_CODE (*tp) == TARGET_EXPR)
1422 {
6de9cd9a 1423#if 0
d4e4baa9
AO
1424 int i, len = first_rtl_op (TARGET_EXPR);
1425
1426 /* We're walking our own subtrees. */
1427 *walk_subtrees = 0;
1428
d4e4baa9
AO
1429 /* Actually walk over them. This loop is the body of
1430 walk_trees, omitting the case where the TARGET_EXPR
1431 itself is handled. */
1432 for (i = 0; i < len; ++i)
1433 {
1434 if (i == 2)
1435 ++id->in_target_cleanup_p;
1436 walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1437 id->tree_pruner);
1438 if (i == 2)
1439 --id->in_target_cleanup_p;
1440 }
1441
6de9cd9a
DN
1442 goto egress;
1443#endif
a833faa5 1444 }
d4e4baa9
AO
1445
1446 if (TYPE_P (t))
1447 /* Because types were not copied in copy_body, CALL_EXPRs beneath
1448 them should not be expanded. This can happen if the type is a
1449 dynamic array type, for example. */
1450 *walk_subtrees = 0;
1451
1452 /* From here on, we're only interested in CALL_EXPRs. */
1453 if (TREE_CODE (t) != CALL_EXPR)
6de9cd9a 1454 goto egress;
d4e4baa9
AO
1455
1456 /* First, see if we can figure out what function is being called.
1457 If we cannot, then there is no hope of inlining the function. */
1458 fn = get_callee_fndecl (t);
1459 if (!fn)
6de9cd9a 1460 goto egress;
d4e4baa9 1461
b58b1157 1462 /* Turn forward declarations into real ones. */
d4d1ebc1 1463 fn = cgraph_node (fn)->decl;
b58b1157 1464
a1a0fd4e
AO
1465 /* If fn is a declaration of a function in a nested scope that was
1466 globally declared inline, we don't set its DECL_INITIAL.
1467 However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1468 C++ front-end uses it for cdtors to refer to their internal
1469 declarations, that are not real functions. Fortunately those
1470 don't have trees to be saved, so we can tell by checking their
1471 DECL_SAVED_TREE. */
1472 if (! DECL_INITIAL (fn)
1473 && DECL_ABSTRACT_ORIGIN (fn)
1474 && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1475 fn = DECL_ABSTRACT_ORIGIN (fn);
1476
18c6ada9
JH
1477 /* Objective C and fortran still calls tree_rest_of_compilation directly.
1478 Kill this check once this is fixed. */
1479 if (!id->current_node->analyzed)
6de9cd9a 1480 goto egress;
18c6ada9
JH
1481
1482 edge = cgraph_edge (id->current_node, t);
1483
1484 /* Constant propagation on argument done during previous inlining
1485 may create new direct call. Produce an edge for it. */
1486 if (!edge)
1487 {
1488 struct cgraph_node *dest = cgraph_node (fn);
1489
6de9cd9a
DN
1490 /* We have missing edge in the callgraph. This can happen in one case
1491 where previous inlining turned indirect call into direct call by
1492 constant propagating arguments. In all other cases we hit a bug
1493 (incorrect node sharing is most common reason for missing edges. */
18c6ada9
JH
1494 if (!dest->needed)
1495 abort ();
1496 cgraph_create_edge (id->node, dest, t)->inline_failed
1497 = N_("originally indirect function call not considered for inlining");
6de9cd9a 1498 goto egress;
18c6ada9
JH
1499 }
1500
d4e4baa9
AO
1501 /* Don't try to inline functions that are not well-suited to
1502 inlining. */
18c6ada9 1503 if (!cgraph_inline_p (edge, &reason))
a833faa5 1504 {
2d327012
JH
1505 if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1506 {
1507 sorry ("%Jinlining failed in call to '%F': %s", fn, fn, reason);
1508 sorry ("called from here");
1509 }
1510 else if (warn_inline && DECL_DECLARED_INLINE_P (fn)
1511 && !DECL_IN_SYSTEM_HEADER (fn)
1512 && strlen (reason))
a833faa5 1513 {
dc0bfe6a 1514 warning ("%Jinlining failed in call to '%F': %s", fn, fn, reason);
a833faa5
MM
1515 warning ("called from here");
1516 }
6de9cd9a 1517 goto egress;
a833faa5 1518 }
d4e4baa9 1519
18c6ada9
JH
1520#ifdef ENABLE_CHECKING
1521 if (edge->callee->decl != id->node->decl)
1522 verify_cgraph_node (edge->callee);
1523#endif
1524
ae2bcd98 1525 if (! lang_hooks.tree_inlining.start_inlining (fn))
6de9cd9a 1526 goto egress;
742a37d5 1527
d436bff8
AH
1528 /* Build a block containing code to initialize the arguments, the
1529 actual inline expansion of the body, and a label for the return
1530 statements within the function to jump to. The type of the
1531 statement expression is the return type of the function call. */
1532 stmt = NULL;
6de9cd9a
DN
1533 expr = build (BIND_EXPR, TREE_TYPE (TREE_TYPE (fn)), NULL_TREE,
1534 stmt, make_node (BLOCK));
1535 BLOCK_ABSTRACT_ORIGIN (BIND_EXPR_BLOCK (expr)) = fn;
d436bff8 1536
d4e4baa9
AO
1537 /* Local declarations will be replaced by their equivalents in this
1538 map. */
1539 st = id->decl_map;
1540 id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1541 NULL, NULL);
1542
1543 /* Initialize the parameters. */
4977bab6
ZW
1544 args = TREE_OPERAND (t, 1);
1545 return_slot_addr = NULL_TREE;
1546 if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1547 {
1548 return_slot_addr = TREE_VALUE (args);
1549 args = TREE_CHAIN (args);
6de9cd9a 1550 TREE_TYPE (expr) = void_type_node;
4977bab6
ZW
1551 }
1552
6de9cd9a
DN
1553 arg_inits = initialize_inlined_parameters (id, args, TREE_OPERAND (t, 2),
1554 fn, expr);
d436bff8
AH
1555 if (arg_inits)
1556 {
1557 /* Expand any inlined calls in the initializers. Do this before we
1558 push FN on the stack of functions we are inlining; we want to
1559 inline calls to FN that appear in the initializers for the
6de9cd9a
DN
1560 parameters.
1561
1562 Note we need to save and restore the saved tree statement iterator
1563 to avoid having it clobbered by expand_calls_inline. */
1564 tree_stmt_iterator save_tsi;
1565
1566 save_tsi = id->tsi;
d436bff8 1567 expand_calls_inline (&arg_inits, id);
6de9cd9a 1568 id->tsi = save_tsi;
50aadcbc 1569
d436bff8 1570 /* And add them to the tree. */
6de9cd9a 1571 append_to_statement_list (arg_inits, &BIND_EXPR_BODY (expr));
d436bff8 1572 }
d4e4baa9
AO
1573
1574 /* Record the function we are about to inline so that we can avoid
1575 recursing into it. */
1576 VARRAY_PUSH_TREE (id->fns, fn);
1577
1578 /* Record the function we are about to inline if optimize_function
1579 has not been called on it yet and we don't have it in the list. */
1580 if (! DECL_INLINED_FNS (fn))
1581 {
1582 int i;
1583
1584 for (i = VARRAY_ACTIVE_SIZE (id->inlined_fns) - 1; i >= 0; i--)
1585 if (VARRAY_TREE (id->inlined_fns, i) == fn)
1586 break;
1587 if (i < 0)
1588 VARRAY_PUSH_TREE (id->inlined_fns, fn);
1589 }
1590
1591 /* Return statements in the function body will be replaced by jumps
1592 to the RET_LABEL. */
1593 id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
6de9cd9a 1594 DECL_ARTIFICIAL (id->ret_label) = 1;
d4e4baa9 1595 DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
6de9cd9a 1596 insert_decl_map (id, id->ret_label, id->ret_label);
d4e4baa9 1597
23700f65
AO
1598 if (! DECL_INITIAL (fn)
1599 || TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
1600 abort ();
1601
d4e4baa9 1602 /* Declare the return variable for the function. */
6de9cd9a
DN
1603 decl = declare_return_variable (id, return_slot_addr, &use_retvar);
1604 if (decl)
1605 declare_inline_vars (expr, decl);
d4e4baa9
AO
1606
1607 /* After we've initialized the parameters, we insert the body of the
1608 function itself. */
18c6ada9
JH
1609 {
1610 struct cgraph_node *old_node = id->current_node;
1611
1612 id->current_node = edge->callee;
6de9cd9a 1613 append_to_statement_list (copy_body (id), &BIND_EXPR_BODY (expr));
18c6ada9
JH
1614 id->current_node = old_node;
1615 }
6de9cd9a 1616 inlined_body = &BIND_EXPR_BODY (expr);
d4e4baa9 1617
d4e4baa9 1618 /* After the body of the function comes the RET_LABEL. This must come
14b493d6 1619 before we evaluate the returned value below, because that evaluation
d4e4baa9 1620 may cause RTL to be generated. */
6de9cd9a 1621 if (TREE_USED (id->ret_label))
3eb429b2 1622 {
6de9cd9a
DN
1623 tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1624 append_to_statement_list (label, &BIND_EXPR_BODY (expr));
3eb429b2 1625 }
50aadcbc 1626
6de9cd9a
DN
1627 /* Finally, mention the returned value so that the value of the
1628 statement-expression is the returned value of the function. */
1629 if (use_retvar)
1630 /* Set TREE_TYPE on BIND_EXPR? */
1631 append_to_statement_list_force (use_retvar, &BIND_EXPR_BODY (expr));
d4e4baa9
AO
1632
1633 /* Clean up. */
1634 splay_tree_delete (id->decl_map);
1635 id->decl_map = st;
1636
1637 /* The new expression has side-effects if the old one did. */
1638 TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t);
1639
6de9cd9a
DN
1640 /* If we are working with gimple form, then we need to keep the tree
1641 in gimple form. If we are not in gimple form, we can just replace
1642 *tp with the new BIND_EXPR. */
1643 if (lang_hooks.gimple_before_inlining)
1644 {
1645 tree save_decl;
1646
aa4a53af
RK
1647 /* We want to create a new variable to hold the result of the inlined
1648 body. This new variable needs to be added to the function which we
1649 are inlining into, thus the saving and restoring of
1650 current_function_decl. */
6de9cd9a
DN
1651 save_decl = current_function_decl;
1652 current_function_decl = id->node->decl;
325c3691 1653 inline_result = voidify_wrapper_expr (expr, NULL);
6de9cd9a
DN
1654 current_function_decl = save_decl;
1655
1656 /* If the inlined function returns a result that we care about,
1657 then we're going to need to splice in a MODIFY_EXPR. Otherwise
1658 the call was a standalone statement and we can just replace it
1659 with the BIND_EXPR inline representation of the called function. */
1660 if (TREE_CODE (tsi_stmt (id->tsi)) != CALL_EXPR)
1661 {
1662 tsi_link_before (&id->tsi, expr, TSI_SAME_STMT);
1663 *tp = inline_result;
1664 }
1665 else
1666 *tp = expr;
1667
aa4a53af
RK
1668 /* When we gimplify a function call, we may clear TREE_SIDE_EFFECTS on
1669 the call if it is to a "const" function. Thus the copy of
1670 TREE_SIDE_EFFECTS from the CALL_EXPR to the BIND_EXPR above with
1671 result in TREE_SIDE_EFFECTS not being set for the inlined copy of a
1672 "const" function.
6de9cd9a 1673
aa4a53af
RK
1674 Unfortunately, that is wrong as inlining the function can
1675 create/expose interesting side effects (such as setting of a return
1676 value).
6de9cd9a 1677
aa4a53af
RK
1678 The easiest solution is to simply recalculate TREE_SIDE_EFFECTS for
1679 the toplevel expression. */
6de9cd9a
DN
1680 recalculate_side_effects (expr);
1681 }
1682 else
1683 *tp = expr;
d4e4baa9
AO
1684
1685 /* If the value of the new expression is ignored, that's OK. We
1686 don't warn about this for CALL_EXPRs, so we shouldn't warn about
1687 the equivalent inlined version either. */
1688 TREE_USED (*tp) = 1;
1689
e72fcfe8 1690 /* Update callgraph if needed. */
18c6ada9 1691 cgraph_remove_node (edge->callee);
e72fcfe8 1692
d4e4baa9 1693 /* Recurse into the body of the just inlined function. */
18c6ada9 1694 expand_calls_inline (inlined_body, id);
d4e4baa9
AO
1695 VARRAY_POP (id->fns);
1696
d4e4baa9
AO
1697 /* Don't walk into subtrees. We've already handled them above. */
1698 *walk_subtrees = 0;
1699
ae2bcd98 1700 lang_hooks.tree_inlining.end_inlining (fn);
742a37d5 1701
d4e4baa9 1702 /* Keep iterating. */
6de9cd9a
DN
1703 egress:
1704 input_location = saved_location;
d4e4baa9
AO
1705 return NULL_TREE;
1706}
6de9cd9a
DN
1707
1708static void
1709gimple_expand_calls_inline (tree *stmt_p, inline_data *id)
1710{
1711 tree stmt = *stmt_p;
1712 enum tree_code code = TREE_CODE (stmt);
1713 int dummy;
1714
1715 switch (code)
1716 {
1717 case STATEMENT_LIST:
1718 {
1719 tree_stmt_iterator i;
1720 tree new;
1721
1722 for (i = tsi_start (stmt); !tsi_end_p (i); )
1723 {
1724 id->tsi = i;
1725 gimple_expand_calls_inline (tsi_stmt_ptr (i), id);
1726
1727 new = tsi_stmt (i);
1728 if (TREE_CODE (new) == STATEMENT_LIST)
1729 {
1730 tsi_link_before (&i, new, TSI_SAME_STMT);
1731 tsi_delink (&i);
1732 }
1733 else
1734 tsi_next (&i);
1735 }
1736 }
1737 break;
1738
1739 case COND_EXPR:
1740 gimple_expand_calls_inline (&COND_EXPR_THEN (stmt), id);
1741 gimple_expand_calls_inline (&COND_EXPR_ELSE (stmt), id);
1742 break;
aa4a53af 1743
6de9cd9a
DN
1744 case CATCH_EXPR:
1745 gimple_expand_calls_inline (&CATCH_BODY (stmt), id);
1746 break;
aa4a53af 1747
6de9cd9a
DN
1748 case EH_FILTER_EXPR:
1749 gimple_expand_calls_inline (&EH_FILTER_FAILURE (stmt), id);
1750 break;
aa4a53af 1751
6de9cd9a
DN
1752 case TRY_CATCH_EXPR:
1753 case TRY_FINALLY_EXPR:
1754 gimple_expand_calls_inline (&TREE_OPERAND (stmt, 0), id);
1755 gimple_expand_calls_inline (&TREE_OPERAND (stmt, 1), id);
1756 break;
aa4a53af 1757
6de9cd9a
DN
1758 case BIND_EXPR:
1759 gimple_expand_calls_inline (&BIND_EXPR_BODY (stmt), id);
1760 break;
1761
1762 case COMPOUND_EXPR:
1763 /* We're gimple. We should have gotten rid of all these. */
1764 abort ();
1765
1766 case RETURN_EXPR:
1767 stmt_p = &TREE_OPERAND (stmt, 0);
1768 stmt = *stmt_p;
1769 if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
1770 break;
aa4a53af 1771
6de9cd9a 1772 /* FALLTHRU */
aa4a53af 1773
6de9cd9a
DN
1774 case MODIFY_EXPR:
1775 stmt_p = &TREE_OPERAND (stmt, 1);
1776 stmt = *stmt_p;
1777 if (TREE_CODE (stmt) != CALL_EXPR)
1778 break;
aa4a53af 1779
6de9cd9a 1780 /* FALLTHRU */
aa4a53af 1781
6de9cd9a
DN
1782 case CALL_EXPR:
1783 expand_call_inline (stmt_p, &dummy, id);
1784 break;
1785
1786 default:
1787 break;
1788 }
1789}
1790
d4e4baa9
AO
1791/* Walk over the entire tree *TP, replacing CALL_EXPRs with inline
1792 expansions as appropriate. */
1793
1794static void
46c5ad27 1795expand_calls_inline (tree *tp, inline_data *id)
d4e4baa9 1796{
6de9cd9a
DN
1797 /* If we are not in gimple form, then we want to walk the tree
1798 recursively as we do not know anything about the structure
1799 of the tree. */
1800
1801 if (!lang_hooks.gimple_before_inlining)
1802 {
1803 walk_tree (tp, expand_call_inline, id, id->tree_pruner);
1804 return;
1805 }
1806
1807 /* We are in gimple form. We want to stay in gimple form. Walk
1808 the statements, inlining calls in each statement. By walking
1809 the statements, we have enough information to keep the tree
1810 in gimple form as we insert inline bodies. */
1811
1812 gimple_expand_calls_inline (tp, id);
d4e4baa9
AO
1813}
1814
1815/* Expand calls to inline functions in the body of FN. */
1816
1817void
46c5ad27 1818optimize_inline_calls (tree fn)
d4e4baa9
AO
1819{
1820 inline_data id;
1821 tree prev_fn;
d92b4486 1822
c5b6f18e
MM
1823 /* There is no point in performing inlining if errors have already
1824 occurred -- and we might crash if we try to inline invalid
1825 code. */
1826 if (errorcount || sorrycount)
1827 return;
1828
d4e4baa9
AO
1829 /* Clear out ID. */
1830 memset (&id, 0, sizeof (id));
1831
18c6ada9 1832 id.current_node = id.node = cgraph_node (fn);
d4e4baa9
AO
1833 /* Don't allow recursion into FN. */
1834 VARRAY_TREE_INIT (id.fns, 32, "fns");
1835 VARRAY_PUSH_TREE (id.fns, fn);
1836 /* Or any functions that aren't finished yet. */
1837 prev_fn = NULL_TREE;
1838 if (current_function_decl)
1839 {
1840 VARRAY_PUSH_TREE (id.fns, current_function_decl);
1841 prev_fn = current_function_decl;
1842 }
1843
aa4a53af 1844 prev_fn = lang_hooks.tree_inlining.add_pending_fn_decls (&id.fns, prev_fn);
d92b4486 1845
d4e4baa9
AO
1846 /* Create the list of functions this call will inline. */
1847 VARRAY_TREE_INIT (id.inlined_fns, 32, "inlined_fns");
1848
1849 /* Keep track of the low-water mark, i.e., the point where the first
1850 real inlining is represented in ID.FNS. */
1851 id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1852
1853 /* Replace all calls to inline functions with the bodies of those
1854 functions. */
aa4a53af 1855 id.tree_pruner = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
d4e4baa9
AO
1856 expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1857
1858 /* Clean up. */
1859 htab_delete (id.tree_pruner);
d4e4baa9
AO
1860 if (DECL_LANG_SPECIFIC (fn))
1861 {
1862 tree ifn = make_tree_vec (VARRAY_ACTIVE_SIZE (id.inlined_fns));
d92b4486 1863
fa7b533b
ZW
1864 if (VARRAY_ACTIVE_SIZE (id.inlined_fns))
1865 memcpy (&TREE_VEC_ELT (ifn, 0), &VARRAY_TREE (id.inlined_fns, 0),
1866 VARRAY_ACTIVE_SIZE (id.inlined_fns) * sizeof (tree));
d4e4baa9
AO
1867 DECL_INLINED_FNS (fn) = ifn;
1868 }
6de9cd9a 1869
18c6ada9
JH
1870#ifdef ENABLE_CHECKING
1871 {
1872 struct cgraph_edge *e;
1873
1874 verify_cgraph_node (id.node);
1875
1876 /* Double check that we inlined everything we are supposed to inline. */
1877 for (e = id.node->callees; e; e = e->next_callee)
1878 if (!e->inline_failed)
1879 abort ();
1880 }
1881#endif
d4e4baa9
AO
1882}
1883
aa4a53af
RK
1884/* FN is a function that has a complete body, and CLONE is a function whose
1885 body is to be set to a copy of FN, mapping argument declarations according
1886 to the ARG_MAP splay_tree. */
d4e4baa9
AO
1887
1888void
46c5ad27 1889clone_body (tree clone, tree fn, void *arg_map)
d4e4baa9
AO
1890{
1891 inline_data id;
1892
aa4a53af
RK
1893 /* Clone the body, as if we were making an inline call. But, remap the
1894 parameters in the callee to the parameters of caller. If there's an
1895 in-charge parameter, map it to an appropriate constant. */
d4e4baa9
AO
1896 memset (&id, 0, sizeof (id));
1897 VARRAY_TREE_INIT (id.fns, 2, "fns");
1898 VARRAY_PUSH_TREE (id.fns, clone);
1899 VARRAY_PUSH_TREE (id.fns, fn);
1900 id.decl_map = (splay_tree)arg_map;
1901
1902 /* Cloning is treated slightly differently from inlining. Set
1903 CLONING_P so that it's clear which operation we're performing. */
1904 id.cloning_p = true;
1905
1906 /* Actually copy the body. */
325c3691 1907 append_to_statement_list_force (copy_body (&id), &DECL_SAVED_TREE (clone));
d4e4baa9
AO
1908}
1909
18c6ada9
JH
1910/* Save duplicate of body in FN. MAP is used to pass around splay tree
1911 used to update arguments in restore_body. */
1912tree
1913save_body (tree fn, tree *arg_copy)
1914{
1915 inline_data id;
1916 tree body, *parg;
1917
1918 memset (&id, 0, sizeof (id));
1919 VARRAY_TREE_INIT (id.fns, 1, "fns");
1920 VARRAY_PUSH_TREE (id.fns, fn);
1921 id.node = cgraph_node (fn);
1922 id.saving_p = true;
1923 id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
1924 *arg_copy = DECL_ARGUMENTS (fn);
aa4a53af 1925
18c6ada9
JH
1926 for (parg = arg_copy; *parg; parg = &TREE_CHAIN (*parg))
1927 {
1928 tree new = copy_node (*parg);
aa4a53af 1929
673fda6b 1930 lang_hooks.dup_lang_specific_decl (new);
18c6ada9
JH
1931 DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*parg);
1932 insert_decl_map (&id, *parg, new);
1933 TREE_CHAIN (new) = TREE_CHAIN (*parg);
1934 *parg = new;
1935 }
aa4a53af 1936
18c6ada9
JH
1937 insert_decl_map (&id, DECL_RESULT (fn), DECL_RESULT (fn));
1938
1939 /* Actually copy the body. */
1940 body = copy_body (&id);
18c6ada9
JH
1941
1942 /* Clean up. */
1943 splay_tree_delete (id.decl_map);
1944 return body;
1945}
1946
48eb4e53
RK
1947#define WALK_SUBTREE(NODE) \
1948 do \
1949 { \
1950 result = walk_tree (&(NODE), func, data, htab); \
1951 if (result) \
1952 return result; \
1953 } \
1954 while (0)
1955
1956/* This is a subroutine of walk_tree that walks field of TYPE that are to
1957 be walked whenever a type is seen in the tree. Rest of operands and return
1958 value are as for walk_tree. */
1959
1960static tree
1961walk_type_fields (tree type, walk_tree_fn func, void *data, void *htab)
1962{
1963 tree result = NULL_TREE;
1964
1965 switch (TREE_CODE (type))
1966 {
1967 case POINTER_TYPE:
1968 case REFERENCE_TYPE:
1969 /* We have to worry about mutually recursive pointers. These can't
1970 be written in C. They can in Ada. It's pathlogical, but
1971 there's an ACATS test (c38102a) that checks it. Deal with this
1972 by checking if we're pointing to another pointer, that one
1973 points to another pointer, that one does too, and we have no htab.
1974 If so, get a hash table. We check three levels deep to avoid
1975 the cost of the hash table if we don't need one. */
1976 if (POINTER_TYPE_P (TREE_TYPE (type))
1977 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (type)))
1978 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (TREE_TYPE (type))))
1979 && !htab)
1980 {
1981 result = walk_tree_without_duplicates (&TREE_TYPE (type),
1982 func, data);
1983 if (result)
1984 return result;
1985
1986 break;
1987 }
1988
1989 /* ... fall through ... */
1990
1991 case COMPLEX_TYPE:
1992 WALK_SUBTREE (TREE_TYPE (type));
1993 break;
1994
1995 case METHOD_TYPE:
1996 WALK_SUBTREE (TYPE_METHOD_BASETYPE (type));
1997
1998 /* Fall through. */
1999
2000 case FUNCTION_TYPE:
2001 WALK_SUBTREE (TREE_TYPE (type));
2002 {
2003 tree arg;
2004
2005 /* We never want to walk into default arguments. */
2006 for (arg = TYPE_ARG_TYPES (type); arg; arg = TREE_CHAIN (arg))
2007 WALK_SUBTREE (TREE_VALUE (arg));
2008 }
2009 break;
2010
2011 case ARRAY_TYPE:
2012 /* Don't follow this nodes's type if a pointer for fear that we'll
2013 have infinite recursion. Those types are uninteresting anyway. */
2014 if (!POINTER_TYPE_P (TREE_TYPE (type))
2015 && TREE_CODE (TREE_TYPE (type)) != OFFSET_TYPE)
2016 WALK_SUBTREE (TREE_TYPE (type));
2017 WALK_SUBTREE (TYPE_DOMAIN (type));
2018 break;
2019
2020 case BOOLEAN_TYPE:
2021 case ENUMERAL_TYPE:
2022 case INTEGER_TYPE:
2023 case CHAR_TYPE:
2024 case REAL_TYPE:
2025 WALK_SUBTREE (TYPE_MIN_VALUE (type));
2026 WALK_SUBTREE (TYPE_MAX_VALUE (type));
2027 break;
2028
2029 case OFFSET_TYPE:
2030 WALK_SUBTREE (TREE_TYPE (type));
2031 WALK_SUBTREE (TYPE_OFFSET_BASETYPE (type));
2032 break;
2033
2034 default:
2035 break;
2036 }
2037
2038 return NULL_TREE;
2039}
2040
aa4a53af
RK
2041/* Apply FUNC to all the sub-trees of TP in a pre-order traversal. FUNC is
2042 called with the DATA and the address of each sub-tree. If FUNC returns a
2043 non-NULL value, the traversal is aborted, and the value returned by FUNC
2044 is returned. If HTAB is non-NULL it is used to record the nodes visited,
2045 and to avoid visiting a node more than once. */
d4e4baa9 2046
d92b4486 2047tree
46c5ad27 2048walk_tree (tree *tp, walk_tree_fn func, void *data, void *htab_)
d4e4baa9
AO
2049{
2050 htab_t htab = (htab_t) htab_;
2051 enum tree_code code;
2052 int walk_subtrees;
2053 tree result;
d92b4486 2054
6c624f7f
AO
2055#define WALK_SUBTREE_TAIL(NODE) \
2056 do \
2057 { \
2058 tp = & (NODE); \
2059 goto tail_recurse; \
2060 } \
2061 while (0)
2062
2063 tail_recurse:
d4e4baa9
AO
2064 /* Skip empty subtrees. */
2065 if (!*tp)
2066 return NULL_TREE;
2067
2068 if (htab)
2069 {
2070 void **slot;
d92b4486 2071
d4e4baa9 2072 /* Don't walk the same tree twice, if the user has requested
2ba84f36 2073 that we avoid doing so. */
d4e4baa9 2074 slot = htab_find_slot (htab, *tp, INSERT);
c35c7e52
RH
2075 if (*slot)
2076 return NULL_TREE;
d4e4baa9
AO
2077 *slot = *tp;
2078 }
2079
2080 /* Call the function. */
2081 walk_subtrees = 1;
2082 result = (*func) (tp, &walk_subtrees, data);
2083
2084 /* If we found something, return it. */
2085 if (result)
2086 return result;
2087
2088 code = TREE_CODE (*tp);
2089
2090 /* Even if we didn't, FUNC may have decided that there was nothing
2091 interesting below this point in the tree. */
2092 if (!walk_subtrees)
2093 {
325c3691 2094 if (code == TREE_LIST)
d4e4baa9 2095 /* But we still need to check our siblings. */
6c624f7f 2096 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
d4e4baa9
AO
2097 else
2098 return NULL_TREE;
2099 }
2100
673fda6b
SB
2101 result = lang_hooks.tree_inlining.walk_subtrees (tp, &walk_subtrees, func,
2102 data, htab);
6de9cd9a
DN
2103 if (result || ! walk_subtrees)
2104 return result;
2105
48eb4e53
RK
2106 /* If this is a DECL_EXPR, walk into various fields of the type that it's
2107 defining. We only want to walk into these fields of a type in this
2108 case. Note that decls get walked as part of the processing of a
2109 BIND_EXPR.
350fae66
RK
2110
2111 ??? Precisely which fields of types that we are supposed to walk in
2112 this case vs. the normal case aren't well defined. */
2113 if (code == DECL_EXPR
48eb4e53 2114 && TREE_CODE (DECL_EXPR_DECL (*tp)) == TYPE_DECL
350fae66
RK
2115 && TREE_CODE (TREE_TYPE (DECL_EXPR_DECL (*tp))) != ERROR_MARK)
2116 {
48eb4e53 2117 tree *type_p = &TREE_TYPE (DECL_EXPR_DECL (*tp));
350fae66 2118
48eb4e53
RK
2119 /* Call the function for the type. See if it returns anything or
2120 doesn't want us to continue. If we are to continue, walk both
2121 the normal fields and those for the declaration case. */
2122 result = (*func) (type_p, &walk_subtrees, data);
2123 if (result || !walk_subtrees)
2124 return NULL_TREE;
83e113ae 2125
48eb4e53
RK
2126 result = walk_type_fields (*type_p, func, data, htab_);
2127 if (result)
2128 return result;
350fae66 2129
48eb4e53
RK
2130 WALK_SUBTREE (TYPE_SIZE (*type_p));
2131 WALK_SUBTREE (TYPE_SIZE_UNIT (*type_p));
350fae66
RK
2132
2133 /* If this is a record type, also walk the fields. */
48eb4e53
RK
2134 if (TREE_CODE (*type_p) == RECORD_TYPE
2135 || TREE_CODE (*type_p) == UNION_TYPE
2136 || TREE_CODE (*type_p) == QUAL_UNION_TYPE)
350fae66
RK
2137 {
2138 tree field;
2139
48eb4e53
RK
2140 for (field = TYPE_FIELDS (*type_p); field;
2141 field = TREE_CHAIN (field))
350fae66
RK
2142 {
2143 /* We'd like to look at the type of the field, but we can easily
2144 get infinite recursion. So assume it's pointed to elsewhere
2145 in the tree. Also, ignore things that aren't fields. */
2146 if (TREE_CODE (field) != FIELD_DECL)
2147 continue;
2148
2149 WALK_SUBTREE (DECL_FIELD_OFFSET (field));
2150 WALK_SUBTREE (DECL_SIZE (field));
2151 WALK_SUBTREE (DECL_SIZE_UNIT (field));
48eb4e53 2152 if (TREE_CODE (*type_p) == QUAL_UNION_TYPE)
350fae66
RK
2153 WALK_SUBTREE (DECL_QUALIFIER (field));
2154 }
2155 }
2156 }
2157
2158 else if (code != EXIT_BLOCK_EXPR
2159 && code != SAVE_EXPR
2160 && code != BIND_EXPR
2161 && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code)))
d4e4baa9
AO
2162 {
2163 int i, len;
2164
d4e4baa9
AO
2165 /* Walk over all the sub-trees of this operand. */
2166 len = first_rtl_op (code);
2167 /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
2168 But, we only want to walk once. */
2169 if (code == TARGET_EXPR
2170 && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
2171 --len;
aa4a53af 2172
d4e4baa9
AO
2173 /* Go through the subtrees. We need to do this in forward order so
2174 that the scope of a FOR_EXPR is handled properly. */
6de9cd9a 2175#ifdef DEBUG_WALK_TREE
d4e4baa9
AO
2176 for (i = 0; i < len; ++i)
2177 WALK_SUBTREE (TREE_OPERAND (*tp, i));
6de9cd9a
DN
2178#else
2179 for (i = 0; i < len - 1; ++i)
2180 WALK_SUBTREE (TREE_OPERAND (*tp, i));
d4e4baa9 2181
6de9cd9a 2182 if (len)
d4e4baa9 2183 {
6de9cd9a
DN
2184 /* The common case is that we may tail recurse here. */
2185 if (code != BIND_EXPR
2186 && !TREE_CHAIN (*tp))
2187 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, len - 1));
2188 else
2189 WALK_SUBTREE (TREE_OPERAND (*tp, len - 1));
d4e4baa9 2190 }
6de9cd9a 2191#endif
d4e4baa9 2192 }
44de5aeb 2193
48eb4e53
RK
2194 /* If this is a type, walk the needed fields in the type. */
2195 else if (TYPE_P (*tp))
2196 {
2197 result = walk_type_fields (*tp, func, data, htab_);
2198 if (result)
2199 return result;
2200 }
6de9cd9a 2201 else
f3763a44 2202 {
6de9cd9a
DN
2203 /* Not one of the easy cases. We must explicitly go through the
2204 children. */
2205 switch (code)
2206 {
2207 case ERROR_MARK:
2208 case IDENTIFIER_NODE:
2209 case INTEGER_CST:
2210 case REAL_CST:
2211 case VECTOR_CST:
2212 case STRING_CST:
6de9cd9a 2213 case BLOCK:
6de9cd9a
DN
2214 case PLACEHOLDER_EXPR:
2215 case SSA_NAME:
44de5aeb
RK
2216 case FIELD_DECL:
2217 case RESULT_DECL:
6de9cd9a
DN
2218 /* None of thse have subtrees other than those already walked
2219 above. */
2220 break;
d4e4baa9 2221
6de9cd9a
DN
2222 case TREE_LIST:
2223 WALK_SUBTREE (TREE_VALUE (*tp));
2224 WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
2225 break;
d4e4baa9 2226
6de9cd9a
DN
2227 case TREE_VEC:
2228 {
2229 int len = TREE_VEC_LENGTH (*tp);
d4e4baa9 2230
6de9cd9a
DN
2231 if (len == 0)
2232 break;
6c624f7f 2233
6de9cd9a
DN
2234 /* Walk all elements but the first. */
2235 while (--len)
2236 WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
6c624f7f 2237
6de9cd9a
DN
2238 /* Now walk the first one as a tail call. */
2239 WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0));
2240 }
6c624f7f 2241
6de9cd9a
DN
2242 case COMPLEX_CST:
2243 WALK_SUBTREE (TREE_REALPART (*tp));
2244 WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp));
d4e4baa9 2245
6de9cd9a
DN
2246 case CONSTRUCTOR:
2247 WALK_SUBTREE_TAIL (CONSTRUCTOR_ELTS (*tp));
d4e4baa9 2248
350fae66
RK
2249 case EXIT_BLOCK_EXPR:
2250 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 1));
2251
2252 case SAVE_EXPR:
2253 WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 0));
2254
2255 case BIND_EXPR:
2256 {
2257 tree decl;
2258 for (decl = BIND_EXPR_VARS (*tp); decl; decl = TREE_CHAIN (decl))
2259 {
2260 /* Walk the DECL_INITIAL and DECL_SIZE. We don't want to walk
2261 into declarations that are just mentioned, rather than
2262 declared; they don't really belong to this part of the tree.
2263 And, we can see cycles: the initializer for a declaration
2264 can refer to the declaration itself. */
2265 WALK_SUBTREE (DECL_INITIAL (decl));
2266 WALK_SUBTREE (DECL_SIZE (decl));
2267 WALK_SUBTREE (DECL_SIZE_UNIT (decl));
350fae66
RK
2268 }
2269 WALK_SUBTREE_TAIL (BIND_EXPR_BODY (*tp));
2270 }
2271
2272 case STATEMENT_LIST:
2273 {
2274 tree_stmt_iterator i;
2275 for (i = tsi_start (*tp); !tsi_end_p (i); tsi_next (&i))
2276 WALK_SUBTREE (*tsi_stmt_ptr (i));
2277 }
2278 break;
2279
6de9cd9a 2280 default:
44de5aeb
RK
2281 /* ??? This could be a language-defined node. We really should make
2282 a hook for it, but right now just ignore it. */
2283 break;
6de9cd9a 2284 }
d4e4baa9
AO
2285 }
2286
2287 /* We didn't find what we were looking for. */
2288 return NULL_TREE;
2289
2290#undef WALK_SUBTREE
8bcefb43 2291#undef WALK_SUBTREE_TAIL
d4e4baa9
AO
2292}
2293
aa4a53af 2294/* Like walk_tree, but does not walk duplicate nodes more than once. */
d4e4baa9 2295
d92b4486 2296tree
46c5ad27 2297walk_tree_without_duplicates (tree *tp, walk_tree_fn func, void *data)
d4e4baa9
AO
2298{
2299 tree result;
2300 htab_t htab;
2301
2302 htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
2303 result = walk_tree (tp, func, data, htab);
2304 htab_delete (htab);
2305 return result;
2306}
2307
2308/* Passed to walk_tree. Copies the node pointed to, if appropriate. */
2309
2310tree
46c5ad27 2311copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
d4e4baa9
AO
2312{
2313 enum tree_code code = TREE_CODE (*tp);
2314
2315 /* We make copies of most nodes. */
2316 if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
d4e4baa9 2317 || TREE_CODE_CLASS (code) == 'c'
d4e4baa9
AO
2318 || code == TREE_LIST
2319 || code == TREE_VEC
325c3691 2320 || code == TYPE_DECL)
d4e4baa9
AO
2321 {
2322 /* Because the chain gets clobbered when we make a copy, we save it
2323 here. */
2324 tree chain = TREE_CHAIN (*tp);
6de9cd9a 2325 tree new;
d4e4baa9
AO
2326
2327 /* Copy the node. */
6de9cd9a
DN
2328 new = copy_node (*tp);
2329
2330 /* Propagate mudflap marked-ness. */
2331 if (flag_mudflap && mf_marked_p (*tp))
2332 mf_mark (new);
2333
2334 *tp = new;
d4e4baa9
AO
2335
2336 /* Now, restore the chain, if appropriate. That will cause
2337 walk_tree to walk into the chain as well. */
325c3691 2338 if (code == PARM_DECL || code == TREE_LIST)
d4e4baa9
AO
2339 TREE_CHAIN (*tp) = chain;
2340
2341 /* For now, we don't update BLOCKs when we make copies. So, we
6de9cd9a
DN
2342 have to nullify all BIND_EXPRs. */
2343 if (TREE_CODE (*tp) == BIND_EXPR)
2344 BIND_EXPR_BLOCK (*tp) = NULL_TREE;
d4e4baa9 2345 }
aa4a53af 2346
3c2a7a6a 2347 else if (TREE_CODE_CLASS (code) == 't')
d4e4baa9 2348 *walk_subtrees = 0;
6de9cd9a
DN
2349 else if (TREE_CODE_CLASS (code) == 'd')
2350 *walk_subtrees = 0;
aa4a53af 2351 else if (code == STATEMENT_LIST)
6de9cd9a 2352 abort ();
d4e4baa9
AO
2353
2354 return NULL_TREE;
2355}
2356
2357/* The SAVE_EXPR pointed to by TP is being copied. If ST contains
aa4a53af 2358 information indicating to what new SAVE_EXPR this one should be mapped,
82c82743 2359 use that one. Otherwise, create a new node and enter it in ST. */
d4e4baa9
AO
2360
2361void
82c82743 2362remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
d4e4baa9
AO
2363{
2364 splay_tree st = (splay_tree) st_;
2365 splay_tree_node n;
5e20bdd7 2366 tree t;
d4e4baa9
AO
2367
2368 /* See if we already encountered this SAVE_EXPR. */
2369 n = splay_tree_lookup (st, (splay_tree_key) *tp);
d92b4486 2370
d4e4baa9
AO
2371 /* If we didn't already remap this SAVE_EXPR, do so now. */
2372 if (!n)
2373 {
5e20bdd7 2374 t = copy_node (*tp);
d4e4baa9 2375
d4e4baa9 2376 /* Remember this SAVE_EXPR. */
5e20bdd7 2377 splay_tree_insert (st, (splay_tree_key) *tp, (splay_tree_value) t);
350ebd54 2378 /* Make sure we don't remap an already-remapped SAVE_EXPR. */
1593ad2e 2379 splay_tree_insert (st, (splay_tree_key) t, (splay_tree_value) t);
d4e4baa9
AO
2380 }
2381 else
5e20bdd7
JZ
2382 {
2383 /* We've already walked into this SAVE_EXPR; don't do it again. */
2384 *walk_subtrees = 0;
2385 t = (tree) n->value;
2386 }
d4e4baa9
AO
2387
2388 /* Replace this SAVE_EXPR with the copy. */
5e20bdd7 2389 *tp = t;
d4e4baa9 2390}
d436bff8 2391
aa4a53af
RK
2392/* Called via walk_tree. If *TP points to a DECL_STMT for a local label,
2393 copies the declaration and enters it in the splay_tree in DATA (which is
2394 really an `inline_data *'). */
6de9cd9a
DN
2395
2396static tree
2397mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2398 void *data)
2399{
6de9cd9a 2400 inline_data *id = (inline_data *) data;
6de9cd9a
DN
2401
2402 /* Don't walk into types. */
350fae66
RK
2403 if (TYPE_P (*tp))
2404 *walk_subtrees = 0;
6de9cd9a 2405
350fae66 2406 else if (TREE_CODE (*tp) == LABEL_EXPR)
6de9cd9a 2407 {
350fae66 2408 tree decl = TREE_OPERAND (*tp, 0);
6de9cd9a 2409
350fae66
RK
2410 /* Copy the decl and remember the copy. */
2411 insert_decl_map (id, decl,
2412 copy_decl_for_inlining (decl, DECL_CONTEXT (decl),
2413 DECL_CONTEXT (decl)));
6de9cd9a
DN
2414 }
2415
2416 return NULL_TREE;
2417}
2418
2419/* Called via walk_tree when an expression is unsaved. Using the
2420 splay_tree pointed to by ST (which is really a `splay_tree'),
2421 remaps all local declarations to appropriate replacements. */
d436bff8
AH
2422
2423static tree
6de9cd9a 2424unsave_r (tree *tp, int *walk_subtrees, void *data)
d436bff8 2425{
6de9cd9a
DN
2426 inline_data *id = (inline_data *) data;
2427 splay_tree st = id->decl_map;
2428 splay_tree_node n;
2429
2430 /* Only a local declaration (variable or label). */
2431 if ((TREE_CODE (*tp) == VAR_DECL && !TREE_STATIC (*tp))
2432 || TREE_CODE (*tp) == LABEL_DECL)
2433 {
2434 /* Lookup the declaration. */
2435 n = splay_tree_lookup (st, (splay_tree_key) *tp);
2436
2437 /* If it's there, remap it. */
2438 if (n)
2439 *tp = (tree) n->value;
2440 }
aa4a53af 2441
6de9cd9a
DN
2442 else if (TREE_CODE (*tp) == STATEMENT_LIST)
2443 copy_statement_list (tp);
2444 else if (TREE_CODE (*tp) == BIND_EXPR)
2445 copy_bind_expr (tp, walk_subtrees, id);
2446 else if (TREE_CODE (*tp) == SAVE_EXPR)
82c82743 2447 remap_save_expr (tp, st, walk_subtrees);
d436bff8 2448 else
6de9cd9a
DN
2449 {
2450 copy_tree_r (tp, walk_subtrees, NULL);
2451
2452 /* Do whatever unsaving is required. */
2453 unsave_expr_1 (*tp);
2454 }
2455
2456 /* Keep iterating. */
2457 return NULL_TREE;
d436bff8
AH
2458}
2459
6de9cd9a
DN
2460/* Default lang hook for "unsave_expr_now". Copies everything in EXPR and
2461 replaces variables, labels and SAVE_EXPRs local to EXPR. */
2462
2463tree
2464lhd_unsave_expr_now (tree expr)
2465{
2466 inline_data id;
2467
2468 /* There's nothing to do for NULL_TREE. */
2469 if (expr == 0)
2470 return expr;
2471
2472 /* Set up ID. */
2473 memset (&id, 0, sizeof (id));
2474 VARRAY_TREE_INIT (id.fns, 1, "fns");
2475 VARRAY_PUSH_TREE (id.fns, current_function_decl);
2476 id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2477
2478 /* Walk the tree once to find local labels. */
2479 walk_tree_without_duplicates (&expr, mark_local_for_remap_r, &id);
2480
2481 /* Walk the tree again, copying, remapping, and unsaving. */
2482 walk_tree (&expr, unsave_r, &id, NULL);
2483
2484 /* Clean up. */
2485 splay_tree_delete (id.decl_map);
2486
2487 return expr;
2488}
2489
2490/* Allow someone to determine if SEARCH is a child of TOP from gdb. */
aa4a53af 2491
6de9cd9a
DN
2492static tree
2493debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
2494{
2495 if (*tp == data)
2496 return (tree) data;
2497 else
2498 return NULL;
2499}
2500
6de9cd9a
DN
2501bool
2502debug_find_tree (tree top, tree search)
2503{
2504 return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
2505}
2506
6de9cd9a
DN
2507/* Declare the variables created by the inliner. Add all the variables in
2508 VARS to BIND_EXPR. */
2509
2510static void
2511declare_inline_vars (tree bind_expr, tree vars)
2512{
2513 if (lang_hooks.gimple_before_inlining)
2514 {
2515 tree t;
aa4a53af 2516
6de9cd9a 2517 for (t = vars; t; t = TREE_CHAIN (t))
48eb4e53 2518 DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
6de9cd9a
DN
2519 }
2520
2521 add_var_to_bind_expr (bind_expr, vars);
2522}