OSDN Git Service

Oops - forgot to include ChangeLog entry for m32r patch
[pf3gnuchains/gcc-fork.git] / gcc / tree-inline.c
1 /* Tree inlining.
2    Copyright 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
3    Contributed by Alexandre Oliva <aoliva@redhat.com>
4
5 This file is part of GCC.
6
7 GCC 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.
11
12 GCC 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.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
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"
40 #include "cgraph.h"
41 #include "intl.h"
42 #include "tree-mudflap.h"
43 #include "tree-flow.h"
44 #include "function.h"
45 #include "diagnostic.h"
46 #include "debug.h"
47
48 /* I'm not real happy about this, but we need to handle gimple and
49    non-gimple trees.  */
50 #include "tree-iterator.h"
51 #include "tree-gimple.h"
52
53 /* 0 if we should not perform inlining.
54    1 if we should expand functions calls inline at the tree level.
55    2 if we should consider *all* functions to be inline
56    candidates.  */
57
58 int flag_inline_trees = 0;
59
60 /* To Do:
61
62    o In order to make inlining-on-trees work, we pessimized
63      function-local static constants.  In particular, they are now
64      always output, even when not addressed.  Fix this by treating
65      function-local static constants just like global static
66      constants; the back-end already knows not to output them if they
67      are not needed.
68
69    o Provide heuristics to clamp inlining of recursive template
70      calls?  */
71
72 /* Data required for function inlining.  */
73
74 typedef struct inline_data
75 {
76   /* A stack of the functions we are inlining.  For example, if we are
77      compiling `f', which calls `g', which calls `h', and we are
78      inlining the body of `h', the stack will contain, `h', followed
79      by `g', followed by `f'.  The first few elements of the stack may
80      contain other functions that we know we should not recurse into,
81      even though they are not directly being inlined.  */
82   varray_type fns;
83   /* The index of the first element of FNS that really represents an
84      inlined function.  */
85   unsigned first_inlined_fn;
86   /* The label to jump to when a return statement is encountered.  If
87      this value is NULL, then return statements will simply be
88      remapped as return statements, rather than as jumps.  */
89   tree ret_label;
90   /* The VAR_DECL for the return value.  */
91   tree retvar;
92   /* The map from local declarations in the inlined function to
93      equivalents in the function into which it is being inlined.  */
94   splay_tree decl_map;
95   /* Nonzero if we are currently within the cleanup for a
96      TARGET_EXPR.  */
97   int in_target_cleanup_p;
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   /* Similarly for saving function body.  */
104   bool saving_p;
105   /* Hash table used to prevent walk_tree from visiting the same node
106      umpteen million times.  */
107   htab_t tree_pruner;
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;
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;
116 } inline_data;
117
118 /* Prototypes.  */
119
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
125 static tree copy_body_r (tree *, int *, void *);
126 static tree copy_body (inline_data *);
127 static tree expand_call_inline (tree *, int *, void *);
128 static void expand_calls_inline (tree *, inline_data *);
129 static bool inlinable_function_p (tree);
130 static tree remap_decl (tree, inline_data *);
131 static tree remap_type (tree, inline_data *);
132 static tree initialize_inlined_parameters (inline_data *, tree,
133                                            tree, tree, tree);
134 static void remap_block (tree *, inline_data *);
135 static tree remap_decls (tree, inline_data *);
136 static void copy_bind_expr (tree *, int *, inline_data *);
137 static tree mark_local_for_remap_r (tree *, int *, void *);
138 static void unsave_expr_1 (tree);
139 static tree unsave_r (tree *, int *, void *);
140 static void declare_inline_vars (tree bind_expr, tree vars);
141 static void remap_save_expr (tree *, void *, int *);
142
143 /* Insert a tree->tree mapping for ID.  Despite the name suggests
144    that the trees should be variables, it is used for more than that.  */
145
146 static void
147 insert_decl_map (inline_data *id, tree key, tree value)
148 {
149   splay_tree_insert (id->decl_map, (splay_tree_key) key,
150                      (splay_tree_value) value);
151
152   /* Always insert an identity map as well.  If we see this same new
153      node again, we won't want to duplicate it a second time.  */
154   if (key != value)
155     splay_tree_insert (id->decl_map, (splay_tree_key) value,
156                        (splay_tree_value) value);
157 }
158
159 /* Remap DECL during the copying of the BLOCK tree for the function.
160    We are only called to remap local variables in the current function.  */
161
162 static tree
163 remap_decl (tree decl, inline_data *id)
164 {
165   splay_tree_node n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
166   tree fn = VARRAY_TOP_TREE (id->fns);
167
168   /* See if we have remapped this declaration.  If we didn't already have an
169      equivalent for this declaration, create one now.  */
170   if (!n)
171     {
172       /* Make a copy of the variable or label.  */
173       tree t = copy_decl_for_inlining (decl, fn, VARRAY_TREE (id->fns, 0));
174
175       /* Remap types, if necessary.  */
176       TREE_TYPE (t) = remap_type (TREE_TYPE (t), id);
177       if (TREE_CODE (t) == TYPE_DECL)
178         DECL_ORIGINAL_TYPE (t) = remap_type (DECL_ORIGINAL_TYPE (t), id);
179       else if (TREE_CODE (t) == PARM_DECL)
180         DECL_ARG_TYPE_AS_WRITTEN (t)
181           = remap_type (DECL_ARG_TYPE_AS_WRITTEN (t), id);
182
183       /* Remap sizes as necessary.  */
184       walk_tree (&DECL_SIZE (t), copy_body_r, id, NULL);
185       walk_tree (&DECL_SIZE_UNIT (t), copy_body_r, id, NULL);
186
187       /* If fields, do likewise for offset and qualifier.  */
188       if (TREE_CODE (t) == FIELD_DECL)
189         {
190           walk_tree (&DECL_FIELD_OFFSET (t), copy_body_r, id, NULL);
191           if (TREE_CODE (DECL_CONTEXT (t)) == QUAL_UNION_TYPE)
192             walk_tree (&DECL_QUALIFIER (t), copy_body_r, id, NULL);
193         }
194
195 #if 0
196       /* FIXME handle anon aggrs.  */
197       if (! DECL_NAME (t) && TREE_TYPE (t)
198           && lang_hooks.tree_inlining.anon_aggr_type_p (TREE_TYPE (t)))
199         {
200           /* For a VAR_DECL of anonymous type, we must also copy the
201              member VAR_DECLS here and rechain the DECL_ANON_UNION_ELEMS.  */
202           tree members = NULL;
203           tree src;
204
205           for (src = DECL_ANON_UNION_ELEMS (t); src;
206                src = TREE_CHAIN (src))
207             {
208               tree member = remap_decl (TREE_VALUE (src), id);
209
210               gcc_assert (!TREE_PURPOSE (src));
211               members = tree_cons (NULL, member, members);
212             }
213           DECL_ANON_UNION_ELEMS (t) = nreverse (members);
214         }
215 #endif
216
217       /* Remember it, so that if we encounter this local entity
218          again we can reuse this copy.  */
219       insert_decl_map (id, decl, t);
220       return t;
221     }
222
223   return unshare_expr ((tree) n->value);
224 }
225
226 static tree
227 remap_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
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)))
243     {
244       insert_decl_map (id, type, type);
245       return type;
246     }
247
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
270   insert_decl_map (id, type, new);
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);
302
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
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 OFFSET_TYPE:
326     default:
327       /* Shouldn't have been thought variable sized.  */
328       gcc_unreachable ();
329     }
330
331   walk_tree (&TYPE_SIZE (new), copy_body_r, id, NULL);
332   walk_tree (&TYPE_SIZE_UNIT (new), copy_body_r, id, NULL);
333
334   return new;
335 }
336
337 static tree
338 remap_decls (tree decls, inline_data *id)
339 {
340   tree old_var;
341   tree new_decls = NULL_TREE;
342
343   /* Remap its variables.  */
344   for (old_var = decls; old_var; old_var = TREE_CHAIN (old_var))
345     {
346       tree new_var;
347
348       /* Remap the variable.  */
349       new_var = remap_decl (old_var, id);
350
351       /* If we didn't remap this variable, so we can't mess with its
352          TREE_CHAIN.  If we remapped this variable to the return slot, it's
353          already declared somewhere else, so don't declare it here.  */
354       if (!new_var || new_var == id->retvar)
355         ;
356       else
357         {
358           gcc_assert (DECL_P (new_var));
359           TREE_CHAIN (new_var) = new_decls;
360           new_decls = new_var;
361         }
362     }
363
364   return nreverse (new_decls);
365 }
366
367 /* Copy the BLOCK to contain remapped versions of the variables
368    therein.  And hook the new block into the block-tree.  */
369
370 static void
371 remap_block (tree *block, inline_data *id)
372 {
373   tree old_block;
374   tree new_block;
375   tree fn;
376
377   /* Make the new block.  */
378   old_block = *block;
379   new_block = make_node (BLOCK);
380   TREE_USED (new_block) = TREE_USED (old_block);
381   BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
382   *block = new_block;
383
384   /* Remap its variables.  */
385   BLOCK_VARS (new_block) = remap_decls (BLOCK_VARS (old_block), id);
386
387   fn = VARRAY_TREE (id->fns, 0);
388 #if 1
389   /* FIXME!  It shouldn't be so hard to manage blocks.  Rebuilding them in
390      rest_of_compilation is a good start.  */
391   if (id->cloning_p)
392     /* We're building a clone; DECL_INITIAL is still
393        error_mark_node, and current_binding_level is the parm
394        binding level.  */
395     lang_hooks.decls.insert_block (new_block);
396   else
397     {
398       /* Attach this new block after the DECL_INITIAL block for the
399          function into which this block is being inlined.  In
400          rest_of_compilation we will straighten out the BLOCK tree.  */
401       tree *first_block;
402       if (DECL_INITIAL (fn))
403         first_block = &BLOCK_CHAIN (DECL_INITIAL (fn));
404       else
405         first_block = &DECL_INITIAL (fn);
406       BLOCK_CHAIN (new_block) = *first_block;
407       *first_block = new_block;
408     }
409 #endif
410   /* Remember the remapped block.  */
411   insert_decl_map (id, old_block, new_block);
412 }
413
414 static void
415 copy_statement_list (tree *tp)
416 {
417   tree_stmt_iterator oi, ni;
418   tree new;
419
420   new = alloc_stmt_list ();
421   ni = tsi_start (new);
422   oi = tsi_start (*tp);
423   *tp = new;
424
425   for (; !tsi_end_p (oi); tsi_next (&oi))
426     tsi_link_after (&ni, tsi_stmt (oi), TSI_NEW_STMT);
427 }
428
429 static void
430 copy_bind_expr (tree *tp, int *walk_subtrees, inline_data *id)
431 {
432   tree block = BIND_EXPR_BLOCK (*tp);
433   /* Copy (and replace) the statement.  */
434   copy_tree_r (tp, walk_subtrees, NULL);
435   if (block)
436     {
437       remap_block (&block, id);
438       BIND_EXPR_BLOCK (*tp) = block;
439     }
440
441   if (BIND_EXPR_VARS (*tp))
442     /* This will remap a lot of the same decls again, but this should be
443        harmless.  */
444     BIND_EXPR_VARS (*tp) = remap_decls (BIND_EXPR_VARS (*tp), id);
445 }
446
447 /* Called from copy_body via walk_tree.  DATA is really an `inline_data *'.  */
448
449 static tree
450 copy_body_r (tree *tp, int *walk_subtrees, void *data)
451 {
452   inline_data *id = (inline_data *) data;
453   tree fn = VARRAY_TOP_TREE (id->fns);
454
455 #if 0
456   /* All automatic variables should have a DECL_CONTEXT indicating
457      what function they come from.  */
458   if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL)
459       && DECL_NAMESPACE_SCOPE_P (*tp))
460     gcc_assert (DECL_EXTERNAL (*tp) || TREE_STATIC (*tp));
461 #endif
462
463   /* If this is a RETURN_EXPR, change it into a MODIFY_EXPR and a
464      GOTO_EXPR with the RET_LABEL as its target.  */
465   if (TREE_CODE (*tp) == RETURN_EXPR && id->ret_label)
466     {
467       tree return_stmt = *tp;
468       tree goto_stmt;
469
470       /* Build the GOTO_EXPR.  */
471       tree assignment = TREE_OPERAND (return_stmt, 0);
472       goto_stmt = build1 (GOTO_EXPR, void_type_node, id->ret_label);
473       TREE_USED (id->ret_label) = 1;
474
475       /* If we're returning something, just turn that into an
476          assignment into the equivalent of the original
477          RESULT_DECL.  */
478       if (assignment)
479         {
480           /* Do not create a statement containing a naked RESULT_DECL.  */
481           if (TREE_CODE (assignment) == RESULT_DECL)
482             gimplify_stmt (&assignment);
483
484           *tp = build (BIND_EXPR, void_type_node, NULL, NULL, NULL);
485           append_to_statement_list (assignment, &BIND_EXPR_BODY (*tp));
486           append_to_statement_list (goto_stmt, &BIND_EXPR_BODY (*tp));
487         }
488       /* If we're not returning anything just do the jump.  */
489       else
490         *tp = goto_stmt;
491     }
492   /* Local variables and labels need to be replaced by equivalent
493      variables.  We don't want to copy static variables; there's only
494      one of those, no matter how many times we inline the containing
495      function.  Similarly for globals from an outer function.  */
496   else if (lang_hooks.tree_inlining.auto_var_in_fn_p (*tp, fn))
497     {
498       tree new_decl;
499
500       /* Remap the declaration.  */
501       new_decl = remap_decl (*tp, id);
502       gcc_assert (new_decl);
503       /* Replace this variable with the copy.  */
504       STRIP_TYPE_NOPS (new_decl);
505       *tp = new_decl;
506       *walk_subtrees = 0;
507     }
508   else if (TREE_CODE (*tp) == STATEMENT_LIST)
509     copy_statement_list (tp);
510   else if (TREE_CODE (*tp) == SAVE_EXPR)
511     remap_save_expr (tp, id->decl_map, walk_subtrees);
512   else if (TREE_CODE (*tp) == BIND_EXPR)
513     copy_bind_expr (tp, walk_subtrees, id);
514   /* Types may need remapping as well.  */
515   else if (TYPE_P (*tp))
516     *tp = remap_type (*tp, id);
517
518   /* If this is a constant, we have to copy the node iff the type will be
519      remapped.  copy_tree_r will not copy a constant.  */
520   else if (TREE_CODE_CLASS (TREE_CODE (*tp)) == tcc_constant)
521     {
522       tree new_type = remap_type (TREE_TYPE (*tp), id);
523
524       if (new_type == TREE_TYPE (*tp))
525         *walk_subtrees = 0;
526
527       else if (TREE_CODE (*tp) == INTEGER_CST)
528         *tp = build_int_cst_wide (new_type, TREE_INT_CST_LOW (*tp),
529                                   TREE_INT_CST_HIGH (*tp));
530       else
531         {
532           *tp = copy_node (*tp);
533           TREE_TYPE (*tp) = new_type;
534         }
535     }
536
537   /* Otherwise, just copy the node.  Note that copy_tree_r already
538      knows not to copy VAR_DECLs, etc., so this is safe.  */
539   else
540     {
541       tree old_node = *tp;
542
543       if (TREE_CODE (*tp) == MODIFY_EXPR
544           && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
545           && (lang_hooks.tree_inlining.auto_var_in_fn_p
546               (TREE_OPERAND (*tp, 0), fn)))
547         {
548           /* Some assignments VAR = VAR; don't generate any rtl code
549              and thus don't count as variable modification.  Avoid
550              keeping bogosities like 0 = 0.  */
551           tree decl = TREE_OPERAND (*tp, 0), value;
552           splay_tree_node n;
553
554           n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
555           if (n)
556             {
557               value = (tree) n->value;
558               STRIP_TYPE_NOPS (value);
559               if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
560                 {
561                   *tp = build_empty_stmt ();
562                   return copy_body_r (tp, walk_subtrees, data);
563                 }
564             }
565         }
566       else if (TREE_CODE (*tp) == INDIRECT_REF)
567         {
568           /* Get rid of *& from inline substitutions that can happen when a
569              pointer argument is an ADDR_EXPR.  */
570           tree decl = TREE_OPERAND (*tp, 0), value;
571           splay_tree_node n;
572
573           n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
574           if (n)
575             {
576               value = (tree) n->value;
577               STRIP_NOPS (value);
578               if (TREE_CODE (value) == ADDR_EXPR
579                   && (lang_hooks.types_compatible_p
580                       (TREE_TYPE (*tp), TREE_TYPE (TREE_OPERAND (value, 0)))))
581                 {
582                   *tp = TREE_OPERAND (value, 0);
583                   return copy_body_r (tp, walk_subtrees, data);
584                 }
585             }
586         }
587
588       copy_tree_r (tp, walk_subtrees, NULL);
589
590       if (TREE_CODE (*tp) == CALL_EXPR && id->node && get_callee_fndecl (*tp))
591         {
592           if (id->saving_p)
593             {
594               struct cgraph_node *node;
595               struct cgraph_edge *edge;
596
597               for (node = id->node->next_clone; node; node = node->next_clone)
598                 {
599                   edge = cgraph_edge (node, old_node);
600                   gcc_assert (edge);
601                   edge->call_expr = *tp;
602                 }
603             }
604           else
605             {
606               struct cgraph_edge *edge
607                 = cgraph_edge (id->current_node, old_node);
608
609               if (edge)
610                 cgraph_clone_edge (edge, id->node, *tp);
611             }
612         }
613
614       TREE_TYPE (*tp) = remap_type (TREE_TYPE (*tp), id);
615
616       /* The copied TARGET_EXPR has never been expanded, even if the
617          original node was expanded already.  */
618       if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
619         {
620           TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
621           TREE_OPERAND (*tp, 3) = NULL_TREE;
622         }
623
624       /* Variable substitution need not be simple.  In particular, the
625          INDIRECT_REF substitution above.  Make sure that TREE_CONSTANT
626          and friends are up-to-date.  */
627       else if (TREE_CODE (*tp) == ADDR_EXPR)
628         {
629           walk_tree (&TREE_OPERAND (*tp, 0), copy_body_r, id, NULL);
630           recompute_tree_invarant_for_addr_expr (*tp);
631           *walk_subtrees = 0;
632         }
633     }
634
635   /* Keep iterating.  */
636   return NULL_TREE;
637 }
638
639 /* Make a copy of the body of FN so that it can be inserted inline in
640    another function.  */
641
642 static tree
643 copy_body (inline_data *id)
644 {
645   tree body;
646   tree fndecl = VARRAY_TOP_TREE (id->fns);
647
648   if (fndecl == current_function_decl
649       && cfun->saved_tree)
650     body = cfun->saved_tree;
651   else
652     body = DECL_SAVED_TREE (fndecl);
653   walk_tree (&body, copy_body_r, id, NULL);
654
655   return body;
656 }
657
658 /* Return true if VALUE is an ADDR_EXPR of an automatic variable
659    defined in function FN, or of a data member thereof.  */
660
661 static bool
662 self_inlining_addr_expr (tree value, tree fn)
663 {
664   tree var;
665
666   if (TREE_CODE (value) != ADDR_EXPR)
667     return false;
668
669   var = get_base_address (TREE_OPERAND (value, 0));
670               
671   return var && lang_hooks.tree_inlining.auto_var_in_fn_p (var, fn);
672 }
673
674 static void
675 setup_one_parameter (inline_data *id, tree p, tree value, tree fn,
676                      tree *init_stmts, tree *vars, bool *gimplify_init_stmts_p)
677 {
678   tree init_stmt;
679   tree var;
680
681   /* If the parameter is never assigned to, we may not need to
682      create a new variable here at all.  Instead, we may be able
683      to just use the argument value.  */
684   if (TREE_READONLY (p)
685       && !TREE_ADDRESSABLE (p)
686       && value && !TREE_SIDE_EFFECTS (value))
687     {
688       /* We can't risk substituting complex expressions.  They
689          might contain variables that will be assigned to later.
690          Theoretically, we could check the expression to see if
691          all of the variables that determine its value are
692          read-only, but we don't bother.  */
693       /* We may produce non-gimple trees by adding NOPs or introduce
694          invalid sharing when operand is not really constant.
695          It is not big deal to prohibit constant propagation here as
696          we will constant propagate in DOM1 pass anyway.  */
697       if (is_gimple_min_invariant (value)
698           && lang_hooks.types_compatible_p (TREE_TYPE (value), TREE_TYPE (p))
699           /* We have to be very careful about ADDR_EXPR.  Make sure
700              the base variable isn't a local variable of the inlined
701              function, e.g., when doing recursive inlining, direct or
702              mutually-recursive or whatever, which is why we don't
703              just test whether fn == current_function_decl.  */
704           && ! self_inlining_addr_expr (value, fn))
705         {
706           insert_decl_map (id, p, value);
707           return;
708         }
709     }
710
711   /* Make an equivalent VAR_DECL.  Note that we must NOT remap the type
712      here since the type of this decl must be visible to the calling
713      function.  */
714   var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0));
715
716   /* Register the VAR_DECL as the equivalent for the PARM_DECL;
717      that way, when the PARM_DECL is encountered, it will be
718      automatically replaced by the VAR_DECL.  */
719   insert_decl_map (id, p, var);
720
721   /* Declare this new variable.  */
722   TREE_CHAIN (var) = *vars;
723   *vars = var;
724
725   /* Make gimplifier happy about this variable.  */
726   DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
727
728   /* Even if P was TREE_READONLY, the new VAR should not be.
729      In the original code, we would have constructed a
730      temporary, and then the function body would have never
731      changed the value of P.  However, now, we will be
732      constructing VAR directly.  The constructor body may
733      change its value multiple times as it is being
734      constructed.  Therefore, it must not be TREE_READONLY;
735      the back-end assumes that TREE_READONLY variable is
736      assigned to only once.  */
737   if (TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
738     TREE_READONLY (var) = 0;
739
740   /* Initialize this VAR_DECL from the equivalent argument.  Convert
741      the argument to the proper type in case it was promoted.  */
742   if (value)
743     {
744       tree rhs = fold_convert (TREE_TYPE (var), value);
745
746       if (rhs == error_mark_node)
747         return;
748
749       /* We want to use MODIFY_EXPR, not INIT_EXPR here so that we
750          keep our trees in gimple form.  */
751       init_stmt = build (MODIFY_EXPR, TREE_TYPE (var), var, rhs);
752       append_to_statement_list (init_stmt, init_stmts);
753
754       /* If we did not create a gimple value and we did not create a gimple
755          cast of a gimple value, then we will need to gimplify INIT_STMTS
756          at the end.  Note that is_gimple_cast only checks the outer
757          tree code, not its operand.  Thus the explicit check that it's
758          operand is a gimple value.  */
759       if (!is_gimple_val (rhs)
760           && (!is_gimple_cast (rhs)
761               || !is_gimple_val (TREE_OPERAND (rhs, 0))))
762         *gimplify_init_stmts_p = true;
763     }
764 }
765
766 /* Generate code to initialize the parameters of the function at the
767    top of the stack in ID from the ARGS (presented as a TREE_LIST).  */
768
769 static tree
770 initialize_inlined_parameters (inline_data *id, tree args, tree static_chain,
771                                tree fn, tree bind_expr)
772 {
773   tree init_stmts = NULL_TREE;
774   tree parms;
775   tree a;
776   tree p;
777   tree vars = NULL_TREE;
778   bool gimplify_init_stmts_p = false;
779   int argnum = 0;
780
781   /* Figure out what the parameters are.  */
782   parms = DECL_ARGUMENTS (fn);
783   if (fn == current_function_decl)
784     parms = cfun->saved_args;
785
786   /* Loop through the parameter declarations, replacing each with an
787      equivalent VAR_DECL, appropriately initialized.  */
788   for (p = parms, a = args; p;
789        a = a ? TREE_CHAIN (a) : a, p = TREE_CHAIN (p))
790     {
791       tree value;
792
793       ++argnum;
794
795       /* Find the initializer.  */
796       value = lang_hooks.tree_inlining.convert_parm_for_inlining
797               (p, a ? TREE_VALUE (a) : NULL_TREE, fn, argnum);
798
799       setup_one_parameter (id, p, value, fn, &init_stmts, &vars,
800                            &gimplify_init_stmts_p);
801     }
802
803   /* Evaluate trailing arguments.  */
804   for (; a; a = TREE_CHAIN (a))
805     {
806       tree value = TREE_VALUE (a);
807       append_to_statement_list (value, &init_stmts);
808     }
809
810   /* Initialize the static chain.  */
811   p = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
812   if (fn == current_function_decl)
813     p = DECL_STRUCT_FUNCTION (fn)->saved_static_chain_decl;
814   if (p)
815     {
816       /* No static chain?  Seems like a bug in tree-nested.c.  */
817       gcc_assert (static_chain);
818
819       setup_one_parameter (id, p, static_chain, fn, &init_stmts, &vars,
820                            &gimplify_init_stmts_p);
821     }
822
823   if (gimplify_init_stmts_p)
824     gimplify_body (&init_stmts, current_function_decl, false);
825
826   declare_inline_vars (bind_expr, vars);
827   return init_stmts;
828 }
829
830 /* Declare a return variable to replace the RESULT_DECL for the function we
831    are calling.  RETURN_SLOT_ADDR, if non-null, was a fake parameter that
832    took the address of the result.  MODIFY_DEST, if non-null, was the LHS of
833    the MODIFY_EXPR to which this call is the RHS.
834
835    The return value is a (possibly null) value that is the result of the
836    function as seen by the callee.  *USE_P is a (possibly null) value that
837    holds the result as seen by the caller.  */
838
839 static tree
840 declare_return_variable (inline_data *id, tree return_slot_addr,
841                          tree modify_dest, tree *use_p)
842 {
843   tree callee = VARRAY_TOP_TREE (id->fns);
844   tree caller = VARRAY_TREE (id->fns, 0);
845   tree result = DECL_RESULT (callee);
846   tree callee_type = TREE_TYPE (result);
847   tree caller_type = TREE_TYPE (TREE_TYPE (callee));
848   tree var, use;
849
850   /* We don't need to do anything for functions that don't return
851      anything.  */
852   if (!result || VOID_TYPE_P (callee_type))
853     {
854       *use_p = NULL_TREE;
855       return NULL_TREE;
856     }
857
858   /* If there was a return slot, then the return value is the
859      dereferenced address of that object.  */
860   if (return_slot_addr)
861     {
862       /* The front end shouldn't have used both return_slot_addr and
863          a modify expression.  */
864       gcc_assert (!modify_dest);
865       if (DECL_BY_REFERENCE (result))
866         var = return_slot_addr;
867       else
868         var = build_fold_indirect_ref (return_slot_addr);
869       use = NULL;
870       goto done;
871     }
872
873   /* All types requiring non-trivial constructors should have been handled.  */
874   gcc_assert (!TREE_ADDRESSABLE (callee_type));
875
876   /* Attempt to avoid creating a new temporary variable.  */
877   if (modify_dest)
878     {
879       bool use_it = false;
880
881       /* We can't use MODIFY_DEST if there's type promotion involved.  */
882       if (!lang_hooks.types_compatible_p (caller_type, callee_type))
883         use_it = false;
884
885       /* ??? If we're assigning to a variable sized type, then we must
886          reuse the destination variable, because we've no good way to
887          create variable sized temporaries at this point.  */
888       else if (TREE_CODE (TYPE_SIZE_UNIT (caller_type)) != INTEGER_CST)
889         use_it = true;
890
891       /* If the callee cannot possibly modify MODIFY_DEST, then we can
892          reuse it as the result of the call directly.  Don't do this if
893          it would promote MODIFY_DEST to addressable.  */
894       else if (!TREE_STATIC (modify_dest)
895                && !TREE_ADDRESSABLE (modify_dest)
896                && !TREE_ADDRESSABLE (result))
897         use_it = true;
898
899       if (use_it)
900         {
901           var = modify_dest;
902           use = NULL;
903           goto done;
904         }
905     }
906
907   gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (callee_type)) == INTEGER_CST);
908
909   var = copy_decl_for_inlining (result, callee, caller);
910   DECL_SEEN_IN_BIND_EXPR_P (var) = 1;
911   DECL_STRUCT_FUNCTION (caller)->unexpanded_var_list
912     = tree_cons (NULL_TREE, var,
913                  DECL_STRUCT_FUNCTION (caller)->unexpanded_var_list);
914
915   /* Do not have the rest of GCC warn about this variable as it should
916      not be visible to the user.  */
917   TREE_NO_WARNING (var) = 1;
918
919   /* Build the use expr.  If the return type of the function was
920      promoted, convert it back to the expected type.  */
921   use = var;
922   if (!lang_hooks.types_compatible_p (TREE_TYPE (var), caller_type))
923     use = fold_convert (caller_type, var);
924
925  done:
926   /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
927      way, when the RESULT_DECL is encountered, it will be
928      automatically replaced by the VAR_DECL.  */
929   insert_decl_map (id, result, var);
930
931   /* Remember this so we can ignore it in remap_decls.  */
932   id->retvar = var;
933
934   *use_p = use;
935   return var;
936 }
937
938 /* Returns nonzero if a function can be inlined as a tree.  */
939
940 bool
941 tree_inlinable_function_p (tree fn)
942 {
943   return inlinable_function_p (fn);
944 }
945
946 static const char *inline_forbidden_reason;
947
948 static tree
949 inline_forbidden_p_1 (tree *nodep, int *walk_subtrees ATTRIBUTE_UNUSED,
950                       void *fnp)
951 {
952   tree node = *nodep;
953   tree fn = (tree) fnp;
954   tree t;
955
956   switch (TREE_CODE (node))
957     {
958     case CALL_EXPR:
959       /* Refuse to inline alloca call unless user explicitly forced so as
960          this may change program's memory overhead drastically when the
961          function using alloca is called in loop.  In GCC present in
962          SPEC2000 inlining into schedule_block cause it to require 2GB of
963          RAM instead of 256MB.  */
964       if (alloca_call_p (node)
965           && !lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
966         {
967           inline_forbidden_reason
968             = N_("%Jfunction %qF can never be inlined because it uses "
969                  "alloca (override using the always_inline attribute)");
970           return node;
971         }
972       t = get_callee_fndecl (node);
973       if (! t)
974         break;
975
976       /* We cannot inline functions that call setjmp.  */
977       if (setjmp_call_p (t))
978         {
979           inline_forbidden_reason
980             = N_("%Jfunction %qF can never be inlined because it uses setjmp");
981           return node;
982         }
983
984       if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL)
985         switch (DECL_FUNCTION_CODE (t))
986           {
987             /* We cannot inline functions that take a variable number of
988                arguments.  */
989           case BUILT_IN_VA_START:
990           case BUILT_IN_STDARG_START:
991           case BUILT_IN_NEXT_ARG:
992           case BUILT_IN_VA_END:
993             inline_forbidden_reason
994               = N_("%Jfunction %qF can never be inlined because it "
995                    "uses variable argument lists");
996             return node;
997
998           case BUILT_IN_LONGJMP:
999             /* We can't inline functions that call __builtin_longjmp at
1000                all.  The non-local goto machinery really requires the
1001                destination be in a different function.  If we allow the
1002                function calling __builtin_longjmp to be inlined into the
1003                function calling __builtin_setjmp, Things will Go Awry.  */
1004             inline_forbidden_reason
1005               = N_("%Jfunction %qF can never be inlined because "
1006                    "it uses setjmp-longjmp exception handling");
1007             return node;
1008
1009           case BUILT_IN_NONLOCAL_GOTO:
1010             /* Similarly.  */
1011             inline_forbidden_reason
1012               = N_("%Jfunction %qF can never be inlined because "
1013                    "it uses non-local goto");
1014             return node;
1015
1016           default:
1017             break;
1018           }
1019       break;
1020
1021     case GOTO_EXPR:
1022       t = TREE_OPERAND (node, 0);
1023
1024       /* We will not inline a function which uses computed goto.  The
1025          addresses of its local labels, which may be tucked into
1026          global storage, are of course not constant across
1027          instantiations, which causes unexpected behavior.  */
1028       if (TREE_CODE (t) != LABEL_DECL)
1029         {
1030           inline_forbidden_reason
1031             = N_("%Jfunction %qF can never be inlined "
1032                  "because it contains a computed goto");
1033           return node;
1034         }
1035       break;
1036
1037     case LABEL_EXPR:
1038       t = TREE_OPERAND (node, 0);
1039       if (DECL_NONLOCAL (t))
1040         {
1041           /* We cannot inline a function that receives a non-local goto
1042              because we cannot remap the destination label used in the
1043              function that is performing the non-local goto.  */
1044           inline_forbidden_reason
1045             = N_("%Jfunction %qF can never be inlined "
1046                  "because it receives a non-local goto");
1047           return node;
1048         }
1049       break;
1050
1051     case RECORD_TYPE:
1052     case UNION_TYPE:
1053       /* We cannot inline a function of the form
1054
1055            void F (int i) { struct S { int ar[i]; } s; }
1056
1057          Attempting to do so produces a catch-22.
1058          If walk_tree examines the TYPE_FIELDS chain of RECORD_TYPE/
1059          UNION_TYPE nodes, then it goes into infinite recursion on a
1060          structure containing a pointer to its own type.  If it doesn't,
1061          then the type node for S doesn't get adjusted properly when
1062          F is inlined, and we abort in find_function_data.
1063
1064          ??? This is likely no longer true, but it's too late in the 4.0
1065          cycle to try to find out.  This should be checked for 4.1.  */
1066       for (t = TYPE_FIELDS (node); t; t = TREE_CHAIN (t))
1067         if (variably_modified_type_p (TREE_TYPE (t), NULL))
1068           {
1069             inline_forbidden_reason
1070               = N_("%Jfunction %qF can never be inlined "
1071                    "because it uses variable sized variables");
1072             return node;
1073           }
1074
1075     default:
1076       break;
1077     }
1078
1079   return NULL_TREE;
1080 }
1081
1082 /* Return subexpression representing possible alloca call, if any.  */
1083 static tree
1084 inline_forbidden_p (tree fndecl)
1085 {
1086   location_t saved_loc = input_location;
1087   tree ret = walk_tree_without_duplicates (&DECL_SAVED_TREE (fndecl),
1088                                            inline_forbidden_p_1, fndecl);
1089
1090   input_location = saved_loc;
1091   return ret;
1092 }
1093
1094 /* Returns nonzero if FN is a function that does not have any
1095    fundamental inline blocking properties.  */
1096
1097 static bool
1098 inlinable_function_p (tree fn)
1099 {
1100   bool inlinable = true;
1101
1102   /* If we've already decided this function shouldn't be inlined,
1103      there's no need to check again.  */
1104   if (DECL_UNINLINABLE (fn))
1105     return false;
1106
1107   /* See if there is any language-specific reason it cannot be
1108      inlined.  (It is important that this hook be called early because
1109      in C++ it may result in template instantiation.)
1110      If the function is not inlinable for language-specific reasons,
1111      it is left up to the langhook to explain why.  */
1112   inlinable = !lang_hooks.tree_inlining.cannot_inline_tree_fn (&fn);
1113
1114   /* If we don't have the function body available, we can't inline it.
1115      However, this should not be recorded since we also get here for
1116      forward declared inline functions.  Therefore, return at once.  */
1117   if (!DECL_SAVED_TREE (fn))
1118     return false;
1119
1120   /* If we're not inlining at all, then we cannot inline this function.  */
1121   else if (!flag_inline_trees)
1122     inlinable = false;
1123
1124   /* Only try to inline functions if DECL_INLINE is set.  This should be
1125      true for all functions declared `inline', and for all other functions
1126      as well with -finline-functions.
1127
1128      Don't think of disregarding DECL_INLINE when flag_inline_trees == 2;
1129      it's the front-end that must set DECL_INLINE in this case, because
1130      dwarf2out loses if a function that does not have DECL_INLINE set is
1131      inlined anyway.  That is why we have both DECL_INLINE and
1132      DECL_DECLARED_INLINE_P.  */
1133   /* FIXME: When flag_inline_trees dies, the check for flag_unit_at_a_time
1134             here should be redundant.  */
1135   else if (!DECL_INLINE (fn) && !flag_unit_at_a_time)
1136     inlinable = false;
1137
1138   else if (inline_forbidden_p (fn))
1139     {
1140       /* See if we should warn about uninlinable functions.  Previously,
1141          some of these warnings would be issued while trying to expand
1142          the function inline, but that would cause multiple warnings
1143          about functions that would for example call alloca.  But since
1144          this a property of the function, just one warning is enough.
1145          As a bonus we can now give more details about the reason why a
1146          function is not inlinable.
1147          We only warn for functions declared `inline' by the user.  */
1148       bool do_warning = (warn_inline
1149                          && DECL_INLINE (fn)
1150                          && DECL_DECLARED_INLINE_P (fn)
1151                          && !DECL_IN_SYSTEM_HEADER (fn));
1152
1153       if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1154         sorry (inline_forbidden_reason, fn, fn);
1155       else if (do_warning)
1156         warning (inline_forbidden_reason, fn, fn);
1157
1158       inlinable = false;
1159     }
1160
1161   /* Squirrel away the result so that we don't have to check again.  */
1162   DECL_UNINLINABLE (fn) = !inlinable;
1163
1164   return inlinable;
1165 }
1166
1167 /* Used by estimate_num_insns.  Estimate number of instructions seen
1168    by given statement.  */
1169
1170 static tree
1171 estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
1172 {
1173   int *count = data;
1174   tree x = *tp;
1175
1176   if (IS_TYPE_OR_DECL_P (x))
1177     {
1178       *walk_subtrees = 0;
1179       return NULL;
1180     }
1181   /* Assume that constants and references counts nothing.  These should
1182      be majorized by amount of operations among them we count later
1183      and are common target of CSE and similar optimizations.  */
1184   else if (CONSTANT_CLASS_P (x) || REFERENCE_CLASS_P (x))
1185     return NULL;
1186
1187   switch (TREE_CODE (x))
1188     {
1189     /* Containers have no cost.  */
1190     case TREE_LIST:
1191     case TREE_VEC:
1192     case BLOCK:
1193     case COMPONENT_REF:
1194     case BIT_FIELD_REF:
1195     case INDIRECT_REF:
1196     case ALIGN_INDIRECT_REF:
1197     case MISALIGNED_INDIRECT_REF:
1198     case ARRAY_REF:
1199     case ARRAY_RANGE_REF:
1200     case OBJ_TYPE_REF:
1201     case EXC_PTR_EXPR: /* ??? */
1202     case FILTER_EXPR: /* ??? */
1203     case COMPOUND_EXPR:
1204     case BIND_EXPR:
1205     case WITH_CLEANUP_EXPR:
1206     case NOP_EXPR:
1207     case VIEW_CONVERT_EXPR:
1208     case SAVE_EXPR:
1209     case ADDR_EXPR:
1210     case COMPLEX_EXPR:
1211     case RANGE_EXPR:
1212     case CASE_LABEL_EXPR:
1213     case SSA_NAME:
1214     case CATCH_EXPR:
1215     case EH_FILTER_EXPR:
1216     case STATEMENT_LIST:
1217     case ERROR_MARK:
1218     case NON_LVALUE_EXPR:
1219     case FDESC_EXPR:
1220     case VA_ARG_EXPR:
1221     case TRY_CATCH_EXPR:
1222     case TRY_FINALLY_EXPR:
1223     case LABEL_EXPR:
1224     case GOTO_EXPR:
1225     case RETURN_EXPR:
1226     case EXIT_EXPR:
1227     case LOOP_EXPR:
1228     case PHI_NODE:
1229     case WITH_SIZE_EXPR:
1230       break;
1231
1232     /* We don't account constants for now.  Assume that the cost is amortized
1233        by operations that do use them.  We may re-consider this decision once
1234        we are able to optimize the tree before estimating it's size and break
1235        out static initializers.  */
1236     case IDENTIFIER_NODE:
1237     case INTEGER_CST:
1238     case REAL_CST:
1239     case COMPLEX_CST:
1240     case VECTOR_CST:
1241     case STRING_CST:
1242       *walk_subtrees = 0;
1243       return NULL;
1244
1245     /* Recognize assignments of large structures and constructors of
1246        big arrays.  */
1247     case INIT_EXPR:
1248     case MODIFY_EXPR:
1249       x = TREE_OPERAND (x, 0);
1250       /* FALLTHRU */
1251     case TARGET_EXPR:
1252     case CONSTRUCTOR:
1253       {
1254         HOST_WIDE_INT size;
1255
1256         size = int_size_in_bytes (TREE_TYPE (x));
1257
1258         if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO)
1259           *count += 10;
1260         else
1261           *count += ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
1262       }
1263       break;
1264
1265       /* Assign cost of 1 to usual operations.
1266          ??? We may consider mapping RTL costs to this.  */
1267     case COND_EXPR:
1268
1269     case PLUS_EXPR:
1270     case MINUS_EXPR:
1271     case MULT_EXPR:
1272
1273     case FIX_TRUNC_EXPR:
1274     case FIX_CEIL_EXPR:
1275     case FIX_FLOOR_EXPR:
1276     case FIX_ROUND_EXPR:
1277
1278     case NEGATE_EXPR:
1279     case FLOAT_EXPR:
1280     case MIN_EXPR:
1281     case MAX_EXPR:
1282     case ABS_EXPR:
1283
1284     case LSHIFT_EXPR:
1285     case RSHIFT_EXPR:
1286     case LROTATE_EXPR:
1287     case RROTATE_EXPR:
1288
1289     case BIT_IOR_EXPR:
1290     case BIT_XOR_EXPR:
1291     case BIT_AND_EXPR:
1292     case BIT_NOT_EXPR:
1293
1294     case TRUTH_ANDIF_EXPR:
1295     case TRUTH_ORIF_EXPR:
1296     case TRUTH_AND_EXPR:
1297     case TRUTH_OR_EXPR:
1298     case TRUTH_XOR_EXPR:
1299     case TRUTH_NOT_EXPR:
1300
1301     case LT_EXPR:
1302     case LE_EXPR:
1303     case GT_EXPR:
1304     case GE_EXPR:
1305     case EQ_EXPR:
1306     case NE_EXPR:
1307     case ORDERED_EXPR:
1308     case UNORDERED_EXPR:
1309
1310     case UNLT_EXPR:
1311     case UNLE_EXPR:
1312     case UNGT_EXPR:
1313     case UNGE_EXPR:
1314     case UNEQ_EXPR:
1315     case LTGT_EXPR:
1316
1317     case CONVERT_EXPR:
1318
1319     case CONJ_EXPR:
1320
1321     case PREDECREMENT_EXPR:
1322     case PREINCREMENT_EXPR:
1323     case POSTDECREMENT_EXPR:
1324     case POSTINCREMENT_EXPR:
1325
1326     case SWITCH_EXPR:
1327
1328     case ASM_EXPR:
1329
1330     case REALIGN_LOAD_EXPR:
1331
1332     case RESX_EXPR:
1333       *count += 1;
1334       break;
1335
1336     /* Few special cases of expensive operations.  This is useful
1337        to avoid inlining on functions having too many of these.  */
1338     case TRUNC_DIV_EXPR:
1339     case CEIL_DIV_EXPR:
1340     case FLOOR_DIV_EXPR:
1341     case ROUND_DIV_EXPR:
1342     case EXACT_DIV_EXPR:
1343     case TRUNC_MOD_EXPR:
1344     case CEIL_MOD_EXPR:
1345     case FLOOR_MOD_EXPR:
1346     case ROUND_MOD_EXPR:
1347     case RDIV_EXPR:
1348       *count += 10;
1349       break;
1350     case CALL_EXPR:
1351       {
1352         tree decl = get_callee_fndecl (x);
1353
1354         if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
1355           switch (DECL_FUNCTION_CODE (decl))
1356             {
1357             case BUILT_IN_CONSTANT_P:
1358               *walk_subtrees = 0;
1359               return NULL_TREE;
1360             case BUILT_IN_EXPECT:
1361               return NULL_TREE;
1362             default:
1363               break;
1364             }
1365         *count += 10;
1366         break;
1367       }
1368     default:
1369       /* Abort here se we know we don't miss any nodes.  */
1370       gcc_unreachable ();
1371     }
1372   return NULL;
1373 }
1374
1375 /* Estimate number of instructions that will be created by expanding EXPR.  */
1376
1377 int
1378 estimate_num_insns (tree expr)
1379 {
1380   int num = 0;
1381   walk_tree_without_duplicates (&expr, estimate_num_insns_1, &num);
1382   return num;
1383 }
1384
1385 /* If *TP is a CALL_EXPR, replace it with its inline expansion.  */
1386
1387 static tree
1388 expand_call_inline (tree *tp, int *walk_subtrees, void *data)
1389 {
1390   inline_data *id;
1391   tree t;
1392   tree expr;
1393   tree stmt;
1394   tree use_retvar;
1395   tree fn;
1396   tree arg_inits;
1397   tree *inlined_body;
1398   splay_tree st;
1399   tree args;
1400   tree return_slot_addr;
1401   tree modify_dest;
1402   location_t saved_location;
1403   struct cgraph_edge *edge;
1404   const char *reason;
1405
1406   /* See what we've got.  */
1407   id = (inline_data *) data;
1408   t = *tp;
1409
1410   /* Set input_location here so we get the right instantiation context
1411      if we call instantiate_decl from inlinable_function_p.  */
1412   saved_location = input_location;
1413   if (EXPR_HAS_LOCATION (t))
1414     input_location = EXPR_LOCATION (t);
1415
1416   /* Recurse, but letting recursive invocations know that we are
1417      inside the body of a TARGET_EXPR.  */
1418   if (TREE_CODE (*tp) == TARGET_EXPR)
1419     {
1420 #if 0
1421       int i, len = TREE_CODE_LENGTH (TARGET_EXPR);
1422
1423       /* We're walking our own subtrees.  */
1424       *walk_subtrees = 0;
1425
1426       /* Actually walk over them.  This loop is the body of
1427          walk_trees, omitting the case where the TARGET_EXPR
1428          itself is handled.  */
1429       for (i = 0; i < len; ++i)
1430         {
1431           if (i == 2)
1432             ++id->in_target_cleanup_p;
1433           walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1434                      id->tree_pruner);
1435           if (i == 2)
1436             --id->in_target_cleanup_p;
1437         }
1438
1439       goto egress;
1440 #endif
1441     }
1442
1443   if (TYPE_P (t))
1444     /* Because types were not copied in copy_body, CALL_EXPRs beneath
1445        them should not be expanded.  This can happen if the type is a
1446        dynamic array type, for example.  */
1447     *walk_subtrees = 0;
1448
1449   /* From here on, we're only interested in CALL_EXPRs.  */
1450   if (TREE_CODE (t) != CALL_EXPR)
1451     goto egress;
1452
1453   /* First, see if we can figure out what function is being called.
1454      If we cannot, then there is no hope of inlining the function.  */
1455   fn = get_callee_fndecl (t);
1456   if (!fn)
1457     goto egress;
1458
1459   /* Turn forward declarations into real ones.  */
1460   fn = cgraph_node (fn)->decl;
1461
1462   /* If fn is a declaration of a function in a nested scope that was
1463      globally declared inline, we don't set its DECL_INITIAL.
1464      However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1465      C++ front-end uses it for cdtors to refer to their internal
1466      declarations, that are not real functions.  Fortunately those
1467      don't have trees to be saved, so we can tell by checking their
1468      DECL_SAVED_TREE.  */
1469   if (! DECL_INITIAL (fn)
1470       && DECL_ABSTRACT_ORIGIN (fn)
1471       && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1472     fn = DECL_ABSTRACT_ORIGIN (fn);
1473
1474   /* Objective C and fortran still calls tree_rest_of_compilation directly.
1475      Kill this check once this is fixed.  */
1476   if (!id->current_node->analyzed)
1477     goto egress;
1478
1479   edge = cgraph_edge (id->current_node, t);
1480
1481   /* Constant propagation on argument done during previous inlining
1482      may create new direct call.  Produce an edge for it.  */
1483   if (!edge)
1484     {
1485       struct cgraph_node *dest = cgraph_node (fn);
1486
1487       /* We have missing edge in the callgraph.  This can happen in one case
1488          where previous inlining turned indirect call into direct call by
1489          constant propagating arguments.  In all other cases we hit a bug
1490          (incorrect node sharing is most common reason for missing edges.  */
1491       gcc_assert (dest->needed || !flag_unit_at_a_time);
1492       cgraph_create_edge (id->node, dest, t)->inline_failed
1493         = N_("originally indirect function call not considered for inlining");
1494       goto egress;
1495     }
1496
1497   /* Don't try to inline functions that are not well-suited to
1498      inlining.  */
1499   if (!cgraph_inline_p (edge, &reason))
1500     {
1501       if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1502         {
1503           sorry ("%Jinlining failed in call to %qF: %s", fn, fn, reason);
1504           sorry ("called from here");
1505         }
1506       else if (warn_inline && DECL_DECLARED_INLINE_P (fn)
1507                && !DECL_IN_SYSTEM_HEADER (fn)
1508                && strlen (reason)
1509                && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn)))
1510         {
1511           warning ("%Jinlining failed in call to %qF: %s", fn, fn, reason);
1512           warning ("called from here");
1513         }
1514       goto egress;
1515     }
1516
1517 #ifdef ENABLE_CHECKING
1518   if (edge->callee->decl != id->node->decl)
1519     verify_cgraph_node (edge->callee);
1520 #endif
1521
1522   if (! lang_hooks.tree_inlining.start_inlining (fn))
1523     goto egress;
1524
1525   /* Build a block containing code to initialize the arguments, the
1526      actual inline expansion of the body, and a label for the return
1527      statements within the function to jump to.  The type of the
1528      statement expression is the return type of the function call.  */
1529   stmt = NULL;
1530   expr = build (BIND_EXPR, void_type_node, NULL_TREE,
1531                 stmt, make_node (BLOCK));
1532   BLOCK_ABSTRACT_ORIGIN (BIND_EXPR_BLOCK (expr)) = fn;
1533
1534   /* Local declarations will be replaced by their equivalents in this
1535      map.  */
1536   st = id->decl_map;
1537   id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1538                                  NULL, NULL);
1539
1540   /* Initialize the parameters.  */
1541   args = TREE_OPERAND (t, 1);
1542   return_slot_addr = NULL_TREE;
1543   if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1544     {
1545       return_slot_addr = TREE_VALUE (args);
1546       args = TREE_CHAIN (args);
1547       TREE_TYPE (expr) = void_type_node;
1548     }
1549
1550   arg_inits = initialize_inlined_parameters (id, args, TREE_OPERAND (t, 2),
1551                                              fn, expr);
1552   if (arg_inits)
1553     {
1554       /* Expand any inlined calls in the initializers.  Do this before we
1555          push FN on the stack of functions we are inlining; we want to
1556          inline calls to FN that appear in the initializers for the
1557          parameters.
1558
1559          Note we need to save and restore the saved tree statement iterator
1560          to avoid having it clobbered by expand_calls_inline.  */
1561       tree_stmt_iterator save_tsi;
1562
1563       save_tsi = id->tsi;
1564       expand_calls_inline (&arg_inits, id);
1565       id->tsi = save_tsi;
1566
1567       /* And add them to the tree.  */
1568       append_to_statement_list (arg_inits, &BIND_EXPR_BODY (expr));
1569     }
1570
1571   /* Record the function we are about to inline so that we can avoid
1572      recursing into it.  */
1573   VARRAY_PUSH_TREE (id->fns, fn);
1574
1575   /* Return statements in the function body will be replaced by jumps
1576      to the RET_LABEL.  */
1577   id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
1578   DECL_ARTIFICIAL (id->ret_label) = 1;
1579   DECL_IGNORED_P (id->ret_label) = 1;
1580   DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
1581   insert_decl_map (id, id->ret_label, id->ret_label);
1582
1583   gcc_assert (DECL_INITIAL (fn));
1584   gcc_assert (TREE_CODE (DECL_INITIAL (fn)) == BLOCK);
1585
1586   /* Find the lhs to which the result of this call is assigned.  */
1587   modify_dest = tsi_stmt (id->tsi);
1588   if (TREE_CODE (modify_dest) == MODIFY_EXPR)
1589     {
1590       modify_dest = TREE_OPERAND (modify_dest, 0);
1591
1592       /* The function which we are inlining might not return a value,
1593          in which case we should issue a warning that the function
1594          does not return a value.  In that case the optimizers will
1595          see that the variable to which the value is assigned was not
1596          initialized.  We do not want to issue a warning about that
1597          uninitialized variable.  */
1598       if (DECL_P (modify_dest))
1599         TREE_NO_WARNING (modify_dest) = 1;
1600     }
1601   else
1602     modify_dest = NULL;
1603
1604   /* Declare the return variable for the function.  */
1605   declare_return_variable (id, return_slot_addr,
1606                            modify_dest, &use_retvar);
1607
1608   /* After we've initialized the parameters, we insert the body of the
1609      function itself.  */
1610   {
1611     struct cgraph_node *old_node = id->current_node;
1612     tree copy;
1613
1614     id->current_node = edge->callee;
1615     copy = copy_body (id);
1616
1617     /* If the function uses a return slot, then it may legitimately
1618        fall through while still returning a value, so we have to skip
1619        the warning here.  */
1620     if (warn_return_type
1621         && !TREE_NO_WARNING (fn)
1622         && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))
1623         && return_slot_addr == NULL_TREE
1624         && block_may_fallthru (copy))
1625       {
1626         warning ("control may reach end of non-void function %qD being inlined",
1627                  fn);
1628         TREE_NO_WARNING (fn) = 1;
1629       }
1630
1631     append_to_statement_list (copy, &BIND_EXPR_BODY (expr));
1632     id->current_node = old_node;
1633   }
1634   inlined_body = &BIND_EXPR_BODY (expr);
1635
1636   /* After the body of the function comes the RET_LABEL.  This must come
1637      before we evaluate the returned value below, because that evaluation
1638      may cause RTL to be generated.  */
1639   if (TREE_USED (id->ret_label))
1640     {
1641       tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1642       append_to_statement_list (label, &BIND_EXPR_BODY (expr));
1643     }
1644
1645   /* Clean up.  */
1646   splay_tree_delete (id->decl_map);
1647   id->decl_map = st;
1648
1649   /* Although, from the semantic viewpoint, the new expression has
1650      side-effects only if the old one did, it is not possible, from
1651      the technical viewpoint, to evaluate the body of a function
1652      multiple times without serious havoc.  */
1653   TREE_SIDE_EFFECTS (expr) = 1;
1654
1655   tsi_link_before (&id->tsi, expr, TSI_SAME_STMT);
1656
1657   /* If the inlined function returns a result that we care about,
1658      then we're going to need to splice in a MODIFY_EXPR.  Otherwise
1659      the call was a standalone statement and we can just replace it
1660      with the BIND_EXPR inline representation of the called function.  */
1661   if (!use_retvar || !modify_dest)
1662     *tsi_stmt_ptr (id->tsi) = build_empty_stmt ();
1663   else
1664     *tp = use_retvar;
1665
1666   /* When we gimplify a function call, we may clear TREE_SIDE_EFFECTS on
1667      the call if it is to a "const" function.  Thus the copy of
1668      TREE_SIDE_EFFECTS from the CALL_EXPR to the BIND_EXPR above with
1669      result in TREE_SIDE_EFFECTS not being set for the inlined copy of a
1670      "const" function.
1671
1672      Unfortunately, that is wrong as inlining the function can create/expose
1673      interesting side effects (such as setting of a return value).
1674
1675      The easiest solution is to simply recalculate TREE_SIDE_EFFECTS for
1676      the toplevel expression.  */
1677   recalculate_side_effects (expr);
1678   
1679   /* Output the inlining info for this abstract function, since it has been
1680      inlined.  If we don't do this now, we can lose the information about the
1681      variables in the function when the blocks get blown away as soon as we
1682      remove the cgraph node.  */
1683   (*debug_hooks->outlining_inline_function) (edge->callee->decl);
1684
1685   /* Update callgraph if needed.  */
1686   cgraph_remove_node (edge->callee);
1687
1688   /* Recurse into the body of the just inlined function.  */
1689   expand_calls_inline (inlined_body, id);
1690   VARRAY_POP (id->fns);
1691
1692   /* Don't walk into subtrees.  We've already handled them above.  */
1693   *walk_subtrees = 0;
1694
1695   lang_hooks.tree_inlining.end_inlining (fn);
1696
1697   /* Keep iterating.  */
1698  egress:
1699   input_location = saved_location;
1700   return NULL_TREE;
1701 }
1702
1703 static void
1704 expand_calls_inline (tree *stmt_p, inline_data *id)
1705 {
1706   tree stmt = *stmt_p;
1707   enum tree_code code = TREE_CODE (stmt);
1708   int dummy;
1709
1710   switch (code)
1711     {
1712     case STATEMENT_LIST:
1713       {
1714         tree_stmt_iterator i;
1715         tree new;
1716
1717         for (i = tsi_start (stmt); !tsi_end_p (i); )
1718           {
1719             id->tsi = i;
1720             expand_calls_inline (tsi_stmt_ptr (i), id);
1721
1722             new = tsi_stmt (i);
1723             if (TREE_CODE (new) == STATEMENT_LIST)
1724               {
1725                 tsi_link_before (&i, new, TSI_SAME_STMT);
1726                 tsi_delink (&i);
1727               }
1728             else
1729               tsi_next (&i);
1730           }
1731       }
1732       break;
1733
1734     case COND_EXPR:
1735       expand_calls_inline (&COND_EXPR_THEN (stmt), id);
1736       expand_calls_inline (&COND_EXPR_ELSE (stmt), id);
1737       break;
1738
1739     case CATCH_EXPR:
1740       expand_calls_inline (&CATCH_BODY (stmt), id);
1741       break;
1742
1743     case EH_FILTER_EXPR:
1744       expand_calls_inline (&EH_FILTER_FAILURE (stmt), id);
1745       break;
1746
1747     case TRY_CATCH_EXPR:
1748     case TRY_FINALLY_EXPR:
1749       expand_calls_inline (&TREE_OPERAND (stmt, 0), id);
1750       expand_calls_inline (&TREE_OPERAND (stmt, 1), id);
1751       break;
1752
1753     case BIND_EXPR:
1754       expand_calls_inline (&BIND_EXPR_BODY (stmt), id);
1755       break;
1756
1757     case COMPOUND_EXPR:
1758       /* We're gimple.  We should have gotten rid of all these.  */
1759       gcc_unreachable ();
1760
1761     case RETURN_EXPR:
1762       stmt_p = &TREE_OPERAND (stmt, 0);
1763       stmt = *stmt_p;
1764       if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
1765         break;
1766
1767       /* FALLTHRU */
1768
1769     case MODIFY_EXPR:
1770       stmt_p = &TREE_OPERAND (stmt, 1);
1771       stmt = *stmt_p;
1772       if (TREE_CODE (stmt) == WITH_SIZE_EXPR)
1773         {
1774           stmt_p = &TREE_OPERAND (stmt, 0);
1775           stmt = *stmt_p;
1776         }
1777       if (TREE_CODE (stmt) != CALL_EXPR)
1778         break;
1779
1780       /* FALLTHRU */
1781
1782     case CALL_EXPR:
1783       expand_call_inline (stmt_p, &dummy, id);
1784       break;
1785
1786     default:
1787       break;
1788     }
1789 }
1790
1791 /* Expand calls to inline functions in the body of FN.  */
1792
1793 void
1794 optimize_inline_calls (tree fn)
1795 {
1796   inline_data id;
1797   tree prev_fn;
1798
1799   /* There is no point in performing inlining if errors have already
1800      occurred -- and we might crash if we try to inline invalid
1801      code.  */
1802   if (errorcount || sorrycount)
1803     return;
1804
1805   /* Clear out ID.  */
1806   memset (&id, 0, sizeof (id));
1807
1808   id.current_node = id.node = cgraph_node (fn);
1809   /* Don't allow recursion into FN.  */
1810   VARRAY_TREE_INIT (id.fns, 32, "fns");
1811   VARRAY_PUSH_TREE (id.fns, fn);
1812   /* Or any functions that aren't finished yet.  */
1813   prev_fn = NULL_TREE;
1814   if (current_function_decl)
1815     {
1816       VARRAY_PUSH_TREE (id.fns, current_function_decl);
1817       prev_fn = current_function_decl;
1818     }
1819
1820   prev_fn = lang_hooks.tree_inlining.add_pending_fn_decls (&id.fns, prev_fn);
1821
1822   /* Keep track of the low-water mark, i.e., the point where the first
1823      real inlining is represented in ID.FNS.  */
1824   id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1825
1826   /* Replace all calls to inline functions with the bodies of those
1827      functions.  */
1828   id.tree_pruner = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
1829   expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1830
1831   /* Clean up.  */
1832   htab_delete (id.tree_pruner);
1833
1834 #ifdef ENABLE_CHECKING
1835     {
1836       struct cgraph_edge *e;
1837
1838       verify_cgraph_node (id.node);
1839
1840       /* Double check that we inlined everything we are supposed to inline.  */
1841       for (e = id.node->callees; e; e = e->next_callee)
1842         gcc_assert (e->inline_failed);
1843     }
1844 #endif
1845 }
1846
1847 /* FN is a function that has a complete body, and CLONE is a function whose
1848    body is to be set to a copy of FN, mapping argument declarations according
1849    to the ARG_MAP splay_tree.  */
1850
1851 void
1852 clone_body (tree clone, tree fn, void *arg_map)
1853 {
1854   inline_data id;
1855
1856   /* Clone the body, as if we were making an inline call.  But, remap the
1857      parameters in the callee to the parameters of caller.  If there's an
1858      in-charge parameter, map it to an appropriate constant.  */
1859   memset (&id, 0, sizeof (id));
1860   VARRAY_TREE_INIT (id.fns, 2, "fns");
1861   VARRAY_PUSH_TREE (id.fns, clone);
1862   VARRAY_PUSH_TREE (id.fns, fn);
1863   id.decl_map = (splay_tree)arg_map;
1864
1865   /* Cloning is treated slightly differently from inlining.  Set
1866      CLONING_P so that it's clear which operation we're performing.  */
1867   id.cloning_p = true;
1868
1869   /* Actually copy the body.  */
1870   append_to_statement_list_force (copy_body (&id), &DECL_SAVED_TREE (clone));
1871 }
1872
1873 /* Make and return duplicate of body in FN.  Put copies of DECL_ARGUMENTS
1874    in *arg_copy and of the static chain, if any, in *sc_copy.  */
1875
1876 tree
1877 save_body (tree fn, tree *arg_copy, tree *sc_copy)
1878 {
1879   inline_data id;
1880   tree body, *parg;
1881
1882   memset (&id, 0, sizeof (id));
1883   VARRAY_TREE_INIT (id.fns, 1, "fns");
1884   VARRAY_PUSH_TREE (id.fns, fn);
1885   id.node = cgraph_node (fn);
1886   id.saving_p = true;
1887   id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
1888   *arg_copy = DECL_ARGUMENTS (fn);
1889
1890   for (parg = arg_copy; *parg; parg = &TREE_CHAIN (*parg))
1891     {
1892       tree new = copy_node (*parg);
1893
1894       lang_hooks.dup_lang_specific_decl (new);
1895       DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*parg);
1896       insert_decl_map (&id, *parg, new);
1897       TREE_CHAIN (new) = TREE_CHAIN (*parg);
1898       *parg = new;
1899     }
1900
1901   *sc_copy = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
1902   if (*sc_copy)
1903     {
1904       tree new = copy_node (*sc_copy);
1905
1906       lang_hooks.dup_lang_specific_decl (new);
1907       DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*sc_copy);
1908       insert_decl_map (&id, *sc_copy, new);
1909       TREE_CHAIN (new) = TREE_CHAIN (*sc_copy);
1910       *sc_copy = new;
1911     }
1912
1913   insert_decl_map (&id, DECL_RESULT (fn), DECL_RESULT (fn));
1914
1915   /* Actually copy the body.  */
1916   body = copy_body (&id);
1917
1918   /* Clean up.  */
1919   splay_tree_delete (id.decl_map);
1920   return body;
1921 }
1922
1923 /* Passed to walk_tree.  Copies the node pointed to, if appropriate.  */
1924
1925 tree
1926 copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1927 {
1928   enum tree_code code = TREE_CODE (*tp);
1929
1930   /* We make copies of most nodes.  */
1931   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1932       || code == TREE_LIST
1933       || code == TREE_VEC
1934       || code == TYPE_DECL)
1935     {
1936       /* Because the chain gets clobbered when we make a copy, we save it
1937          here.  */
1938       tree chain = TREE_CHAIN (*tp);
1939       tree new;
1940
1941       /* Copy the node.  */
1942       new = copy_node (*tp);
1943
1944       /* Propagate mudflap marked-ness.  */
1945       if (flag_mudflap && mf_marked_p (*tp))
1946         mf_mark (new);
1947
1948       *tp = new;
1949
1950       /* Now, restore the chain, if appropriate.  That will cause
1951          walk_tree to walk into the chain as well.  */
1952       if (code == PARM_DECL || code == TREE_LIST)
1953         TREE_CHAIN (*tp) = chain;
1954
1955       /* For now, we don't update BLOCKs when we make copies.  So, we
1956          have to nullify all BIND_EXPRs.  */
1957       if (TREE_CODE (*tp) == BIND_EXPR)
1958         BIND_EXPR_BLOCK (*tp) = NULL_TREE;
1959     }
1960
1961   else if (TREE_CODE_CLASS (code) == tcc_type)
1962     *walk_subtrees = 0;
1963   else if (TREE_CODE_CLASS (code) == tcc_declaration)
1964     *walk_subtrees = 0;
1965   else if (TREE_CODE_CLASS (code) == tcc_constant)
1966     *walk_subtrees = 0;
1967   else
1968     gcc_assert (code != STATEMENT_LIST);
1969   return NULL_TREE;
1970 }
1971
1972 /* The SAVE_EXPR pointed to by TP is being copied.  If ST contains
1973    information indicating to what new SAVE_EXPR this one should be mapped,
1974    use that one.  Otherwise, create a new node and enter it in ST.  */
1975
1976 static void
1977 remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
1978 {
1979   splay_tree st = (splay_tree) st_;
1980   splay_tree_node n;
1981   tree t;
1982
1983   /* See if we already encountered this SAVE_EXPR.  */
1984   n = splay_tree_lookup (st, (splay_tree_key) *tp);
1985
1986   /* If we didn't already remap this SAVE_EXPR, do so now.  */
1987   if (!n)
1988     {
1989       t = copy_node (*tp);
1990
1991       /* Remember this SAVE_EXPR.  */
1992       splay_tree_insert (st, (splay_tree_key) *tp, (splay_tree_value) t);
1993       /* Make sure we don't remap an already-remapped SAVE_EXPR.  */
1994       splay_tree_insert (st, (splay_tree_key) t, (splay_tree_value) t);
1995     }
1996   else
1997     {
1998       /* We've already walked into this SAVE_EXPR; don't do it again.  */
1999       *walk_subtrees = 0;
2000       t = (tree) n->value;
2001     }
2002
2003   /* Replace this SAVE_EXPR with the copy.  */
2004   *tp = t;
2005 }
2006
2007 /* Called via walk_tree.  If *TP points to a DECL_STMT for a local label,
2008    copies the declaration and enters it in the splay_tree in DATA (which is
2009    really an `inline_data *').  */
2010
2011 static tree
2012 mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2013                         void *data)
2014 {
2015   inline_data *id = (inline_data *) data;
2016
2017   /* Don't walk into types.  */
2018   if (TYPE_P (*tp))
2019     *walk_subtrees = 0;
2020
2021   else if (TREE_CODE (*tp) == LABEL_EXPR)
2022     {
2023       tree decl = TREE_OPERAND (*tp, 0);
2024
2025       /* Copy the decl and remember the copy.  */
2026       insert_decl_map (id, decl,
2027                        copy_decl_for_inlining (decl, DECL_CONTEXT (decl),
2028                                                DECL_CONTEXT (decl)));
2029     }
2030
2031   return NULL_TREE;
2032 }
2033
2034 /* Perform any modifications to EXPR required when it is unsaved.  Does
2035    not recurse into EXPR's subtrees.  */
2036
2037 static void
2038 unsave_expr_1 (tree expr)
2039 {
2040   switch (TREE_CODE (expr))
2041     {
2042     case TARGET_EXPR:
2043       /* Don't mess with a TARGET_EXPR that hasn't been expanded.
2044          It's OK for this to happen if it was part of a subtree that
2045          isn't immediately expanded, such as operand 2 of another
2046          TARGET_EXPR.  */
2047       if (TREE_OPERAND (expr, 1))
2048         break;
2049
2050       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
2051       TREE_OPERAND (expr, 3) = NULL_TREE;
2052       break;
2053
2054     default:
2055       break;
2056     }
2057 }
2058
2059 /* Called via walk_tree when an expression is unsaved.  Using the
2060    splay_tree pointed to by ST (which is really a `splay_tree'),
2061    remaps all local declarations to appropriate replacements.  */
2062
2063 static tree
2064 unsave_r (tree *tp, int *walk_subtrees, void *data)
2065 {
2066   inline_data *id = (inline_data *) data;
2067   splay_tree st = id->decl_map;
2068   splay_tree_node n;
2069
2070   /* Only a local declaration (variable or label).  */
2071   if ((TREE_CODE (*tp) == VAR_DECL && !TREE_STATIC (*tp))
2072       || TREE_CODE (*tp) == LABEL_DECL)
2073     {
2074       /* Lookup the declaration.  */
2075       n = splay_tree_lookup (st, (splay_tree_key) *tp);
2076
2077       /* If it's there, remap it.  */
2078       if (n)
2079         *tp = (tree) n->value;
2080     }
2081
2082   else if (TREE_CODE (*tp) == STATEMENT_LIST)
2083     copy_statement_list (tp);
2084   else if (TREE_CODE (*tp) == BIND_EXPR)
2085     copy_bind_expr (tp, walk_subtrees, id);
2086   else if (TREE_CODE (*tp) == SAVE_EXPR)
2087     remap_save_expr (tp, st, walk_subtrees);
2088   else
2089     {
2090       copy_tree_r (tp, walk_subtrees, NULL);
2091
2092       /* Do whatever unsaving is required.  */
2093       unsave_expr_1 (*tp);
2094     }
2095
2096   /* Keep iterating.  */
2097   return NULL_TREE;
2098 }
2099
2100 /* Copies everything in EXPR and replaces variables, labels
2101    and SAVE_EXPRs local to EXPR.  */
2102
2103 tree
2104 unsave_expr_now (tree expr)
2105 {
2106   inline_data id;
2107
2108   /* There's nothing to do for NULL_TREE.  */
2109   if (expr == 0)
2110     return expr;
2111
2112   /* Set up ID.  */
2113   memset (&id, 0, sizeof (id));
2114   VARRAY_TREE_INIT (id.fns, 1, "fns");
2115   VARRAY_PUSH_TREE (id.fns, current_function_decl);
2116   id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2117
2118   /* Walk the tree once to find local labels.  */
2119   walk_tree_without_duplicates (&expr, mark_local_for_remap_r, &id);
2120
2121   /* Walk the tree again, copying, remapping, and unsaving.  */
2122   walk_tree (&expr, unsave_r, &id, NULL);
2123
2124   /* Clean up.  */
2125   splay_tree_delete (id.decl_map);
2126
2127   return expr;
2128 }
2129
2130 /* Allow someone to determine if SEARCH is a child of TOP from gdb.  */
2131
2132 static tree
2133 debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
2134 {
2135   if (*tp == data)
2136     return (tree) data;
2137   else
2138     return NULL;
2139 }
2140
2141 bool
2142 debug_find_tree (tree top, tree search)
2143 {
2144   return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
2145 }
2146
2147 /* Declare the variables created by the inliner.  Add all the variables in
2148    VARS to BIND_EXPR.  */
2149
2150 static void
2151 declare_inline_vars (tree bind_expr, tree vars)
2152 {
2153   tree t;
2154   for (t = vars; t; t = TREE_CHAIN (t))
2155     DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
2156
2157   add_var_to_bind_expr (bind_expr, vars);
2158 }