OSDN Git Service

* tree-inline.c (estimate_num_insns_1): Use declaration to discover argument
[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 /* Estimate the cost of a memory move.  Use machine dependent
1168    word size and take possible memcpy call into account.  */
1169
1170 int
1171 estimate_move_cost (tree type)
1172 {
1173   HOST_WIDE_INT size;
1174
1175   size = int_size_in_bytes (type);
1176
1177   if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO)
1178     /* Cost of a memcpy call, 3 arguments and the call.  */
1179     return 4;
1180   else
1181     return ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES);
1182 }
1183
1184 /* Used by estimate_num_insns.  Estimate number of instructions seen
1185    by given statement.  */
1186
1187 static tree
1188 estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data)
1189 {
1190   int *count = data;
1191   tree x = *tp;
1192
1193   if (IS_TYPE_OR_DECL_P (x))
1194     {
1195       *walk_subtrees = 0;
1196       return NULL;
1197     }
1198   /* Assume that constants and references counts nothing.  These should
1199      be majorized by amount of operations among them we count later
1200      and are common target of CSE and similar optimizations.  */
1201   else if (CONSTANT_CLASS_P (x) || REFERENCE_CLASS_P (x))
1202     return NULL;
1203
1204   switch (TREE_CODE (x))
1205     {
1206     /* Containers have no cost.  */
1207     case TREE_LIST:
1208     case TREE_VEC:
1209     case BLOCK:
1210     case COMPONENT_REF:
1211     case BIT_FIELD_REF:
1212     case INDIRECT_REF:
1213     case ALIGN_INDIRECT_REF:
1214     case MISALIGNED_INDIRECT_REF:
1215     case ARRAY_REF:
1216     case ARRAY_RANGE_REF:
1217     case OBJ_TYPE_REF:
1218     case EXC_PTR_EXPR: /* ??? */
1219     case FILTER_EXPR: /* ??? */
1220     case COMPOUND_EXPR:
1221     case BIND_EXPR:
1222     case WITH_CLEANUP_EXPR:
1223     case NOP_EXPR:
1224     case VIEW_CONVERT_EXPR:
1225     case SAVE_EXPR:
1226     case ADDR_EXPR:
1227     case COMPLEX_EXPR:
1228     case RANGE_EXPR:
1229     case CASE_LABEL_EXPR:
1230     case SSA_NAME:
1231     case CATCH_EXPR:
1232     case EH_FILTER_EXPR:
1233     case STATEMENT_LIST:
1234     case ERROR_MARK:
1235     case NON_LVALUE_EXPR:
1236     case FDESC_EXPR:
1237     case VA_ARG_EXPR:
1238     case TRY_CATCH_EXPR:
1239     case TRY_FINALLY_EXPR:
1240     case LABEL_EXPR:
1241     case GOTO_EXPR:
1242     case RETURN_EXPR:
1243     case EXIT_EXPR:
1244     case LOOP_EXPR:
1245     case PHI_NODE:
1246     case WITH_SIZE_EXPR:
1247       break;
1248
1249     /* We don't account constants for now.  Assume that the cost is amortized
1250        by operations that do use them.  We may re-consider this decision once
1251        we are able to optimize the tree before estimating it's size and break
1252        out static initializers.  */
1253     case IDENTIFIER_NODE:
1254     case INTEGER_CST:
1255     case REAL_CST:
1256     case COMPLEX_CST:
1257     case VECTOR_CST:
1258     case STRING_CST:
1259       *walk_subtrees = 0;
1260       return NULL;
1261
1262     /* Try to estimate the cost of assignments.  We have three cases to
1263        deal with:
1264         1) Simple assignments to registers;
1265         2) Stores to things that must live in memory.  This includes
1266            "normal" stores to scalars, but also assignments of large
1267            structures, or constructors of big arrays;
1268         3) TARGET_EXPRs.
1269
1270        Let us look at the first two cases, assuming we have "a = b + C":
1271        <modify_expr <var_decl "a"> <plus_expr <var_decl "b"> <constant C>>
1272        If "a" is a GIMPLE register, the assignment to it is free on almost
1273        any target, because "a" usually ends up in a real register.  Hence
1274        the only cost of this expression comes from the PLUS_EXPR, and we
1275        can ignore the MODIFY_EXPR.
1276        If "a" is not a GIMPLE register, the assignment to "a" will most
1277        likely be a real store, so the cost of the MODIFY_EXPR is the cost
1278        of moving something into "a", which we compute using the function
1279        estimate_move_cost.
1280
1281        The third case deals with TARGET_EXPRs, for which the semantics are
1282        that a temporary is assigned, unless the TARGET_EXPR itself is being
1283        assigned to something else.  In the latter case we do not need the
1284        temporary.  E.g. in <modify_expr <var_decl "a"> <target_expr>>, the
1285        MODIFY_EXPR is free.  */
1286     case INIT_EXPR:
1287     case MODIFY_EXPR:
1288       /* Is the right and side a TARGET_EXPR?  */
1289       if (TREE_CODE (TREE_OPERAND (x, 1)) == TARGET_EXPR)
1290         break;
1291       /* ... fall through ...  */
1292
1293     case TARGET_EXPR:
1294       x = TREE_OPERAND (x, 0);
1295       /* Is this an assignments to a register?  */
1296       if (is_gimple_reg (x))
1297         break;
1298       /* Otherwise it's a store, so fall through to compute the move cost.  */
1299       
1300     case CONSTRUCTOR:
1301       *count += estimate_move_cost (TREE_TYPE (x));
1302       break;
1303
1304     /* Assign cost of 1 to usual operations.
1305        ??? We may consider mapping RTL costs to this.  */
1306     case COND_EXPR:
1307
1308     case PLUS_EXPR:
1309     case MINUS_EXPR:
1310     case MULT_EXPR:
1311
1312     case FIX_TRUNC_EXPR:
1313     case FIX_CEIL_EXPR:
1314     case FIX_FLOOR_EXPR:
1315     case FIX_ROUND_EXPR:
1316
1317     case NEGATE_EXPR:
1318     case FLOAT_EXPR:
1319     case MIN_EXPR:
1320     case MAX_EXPR:
1321     case ABS_EXPR:
1322
1323     case LSHIFT_EXPR:
1324     case RSHIFT_EXPR:
1325     case LROTATE_EXPR:
1326     case RROTATE_EXPR:
1327
1328     case BIT_IOR_EXPR:
1329     case BIT_XOR_EXPR:
1330     case BIT_AND_EXPR:
1331     case BIT_NOT_EXPR:
1332
1333     case TRUTH_ANDIF_EXPR:
1334     case TRUTH_ORIF_EXPR:
1335     case TRUTH_AND_EXPR:
1336     case TRUTH_OR_EXPR:
1337     case TRUTH_XOR_EXPR:
1338     case TRUTH_NOT_EXPR:
1339
1340     case LT_EXPR:
1341     case LE_EXPR:
1342     case GT_EXPR:
1343     case GE_EXPR:
1344     case EQ_EXPR:
1345     case NE_EXPR:
1346     case ORDERED_EXPR:
1347     case UNORDERED_EXPR:
1348
1349     case UNLT_EXPR:
1350     case UNLE_EXPR:
1351     case UNGT_EXPR:
1352     case UNGE_EXPR:
1353     case UNEQ_EXPR:
1354     case LTGT_EXPR:
1355
1356     case CONVERT_EXPR:
1357
1358     case CONJ_EXPR:
1359
1360     case PREDECREMENT_EXPR:
1361     case PREINCREMENT_EXPR:
1362     case POSTDECREMENT_EXPR:
1363     case POSTINCREMENT_EXPR:
1364
1365     case SWITCH_EXPR:
1366
1367     case ASM_EXPR:
1368
1369     case REALIGN_LOAD_EXPR:
1370
1371     case RESX_EXPR:
1372       *count += 1;
1373       break;
1374
1375     /* Few special cases of expensive operations.  This is useful
1376        to avoid inlining on functions having too many of these.  */
1377     case TRUNC_DIV_EXPR:
1378     case CEIL_DIV_EXPR:
1379     case FLOOR_DIV_EXPR:
1380     case ROUND_DIV_EXPR:
1381     case EXACT_DIV_EXPR:
1382     case TRUNC_MOD_EXPR:
1383     case CEIL_MOD_EXPR:
1384     case FLOOR_MOD_EXPR:
1385     case ROUND_MOD_EXPR:
1386     case RDIV_EXPR:
1387       *count += 10;
1388       break;
1389     case CALL_EXPR:
1390       {
1391         tree decl = get_callee_fndecl (x);
1392         tree arg;
1393
1394         if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
1395           switch (DECL_FUNCTION_CODE (decl))
1396             {
1397             case BUILT_IN_CONSTANT_P:
1398               *walk_subtrees = 0;
1399               return NULL_TREE;
1400             case BUILT_IN_EXPECT:
1401               return NULL_TREE;
1402             default:
1403               break;
1404             }
1405
1406         /* Our cost must be kept in sync with cgraph_estimate_size_after_inlining
1407            that does use function declaration to figure out the arguments.  */
1408         if (!decl)
1409           {
1410             for (arg = TREE_OPERAND (x, 1); arg; arg = TREE_CHAIN (arg))
1411               *count += estimate_move_cost (TREE_TYPE (TREE_VALUE (arg)));
1412           }
1413         else
1414           {
1415             for (arg = DECL_ARGUMENTS (decl); arg; arg = TREE_CHAIN (arg))
1416               *count += estimate_move_cost (TREE_TYPE (arg));
1417           }
1418
1419         *count += PARAM_VALUE (PARAM_INLINE_CALL_COST);
1420         break;
1421       }
1422     default:
1423       /* Abort here se we know we don't miss any nodes.  */
1424       gcc_unreachable ();
1425     }
1426   return NULL;
1427 }
1428
1429 /* Estimate number of instructions that will be created by expanding EXPR.  */
1430
1431 int
1432 estimate_num_insns (tree expr)
1433 {
1434   int num = 0;
1435   walk_tree_without_duplicates (&expr, estimate_num_insns_1, &num);
1436   return num;
1437 }
1438
1439 /* If *TP is a CALL_EXPR, replace it with its inline expansion.  */
1440
1441 static tree
1442 expand_call_inline (tree *tp, int *walk_subtrees, void *data)
1443 {
1444   inline_data *id;
1445   tree t;
1446   tree expr;
1447   tree stmt;
1448   tree use_retvar;
1449   tree fn;
1450   tree arg_inits;
1451   tree *inlined_body;
1452   splay_tree st;
1453   tree args;
1454   tree return_slot_addr;
1455   tree modify_dest;
1456   location_t saved_location;
1457   struct cgraph_edge *edge;
1458   const char *reason;
1459
1460   /* See what we've got.  */
1461   id = (inline_data *) data;
1462   t = *tp;
1463
1464   /* Set input_location here so we get the right instantiation context
1465      if we call instantiate_decl from inlinable_function_p.  */
1466   saved_location = input_location;
1467   if (EXPR_HAS_LOCATION (t))
1468     input_location = EXPR_LOCATION (t);
1469
1470   /* Recurse, but letting recursive invocations know that we are
1471      inside the body of a TARGET_EXPR.  */
1472   if (TREE_CODE (*tp) == TARGET_EXPR)
1473     {
1474 #if 0
1475       int i, len = TREE_CODE_LENGTH (TARGET_EXPR);
1476
1477       /* We're walking our own subtrees.  */
1478       *walk_subtrees = 0;
1479
1480       /* Actually walk over them.  This loop is the body of
1481          walk_trees, omitting the case where the TARGET_EXPR
1482          itself is handled.  */
1483       for (i = 0; i < len; ++i)
1484         {
1485           if (i == 2)
1486             ++id->in_target_cleanup_p;
1487           walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1488                      id->tree_pruner);
1489           if (i == 2)
1490             --id->in_target_cleanup_p;
1491         }
1492
1493       goto egress;
1494 #endif
1495     }
1496
1497   if (TYPE_P (t))
1498     /* Because types were not copied in copy_body, CALL_EXPRs beneath
1499        them should not be expanded.  This can happen if the type is a
1500        dynamic array type, for example.  */
1501     *walk_subtrees = 0;
1502
1503   /* From here on, we're only interested in CALL_EXPRs.  */
1504   if (TREE_CODE (t) != CALL_EXPR)
1505     goto egress;
1506
1507   /* First, see if we can figure out what function is being called.
1508      If we cannot, then there is no hope of inlining the function.  */
1509   fn = get_callee_fndecl (t);
1510   if (!fn)
1511     goto egress;
1512
1513   /* Turn forward declarations into real ones.  */
1514   fn = cgraph_node (fn)->decl;
1515
1516   /* If fn is a declaration of a function in a nested scope that was
1517      globally declared inline, we don't set its DECL_INITIAL.
1518      However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1519      C++ front-end uses it for cdtors to refer to their internal
1520      declarations, that are not real functions.  Fortunately those
1521      don't have trees to be saved, so we can tell by checking their
1522      DECL_SAVED_TREE.  */
1523   if (! DECL_INITIAL (fn)
1524       && DECL_ABSTRACT_ORIGIN (fn)
1525       && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1526     fn = DECL_ABSTRACT_ORIGIN (fn);
1527
1528   /* Objective C and fortran still calls tree_rest_of_compilation directly.
1529      Kill this check once this is fixed.  */
1530   if (!id->current_node->analyzed)
1531     goto egress;
1532
1533   edge = cgraph_edge (id->current_node, t);
1534
1535   /* Constant propagation on argument done during previous inlining
1536      may create new direct call.  Produce an edge for it.  */
1537   if (!edge)
1538     {
1539       struct cgraph_node *dest = cgraph_node (fn);
1540
1541       /* We have missing edge in the callgraph.  This can happen in one case
1542          where previous inlining turned indirect call into direct call by
1543          constant propagating arguments.  In all other cases we hit a bug
1544          (incorrect node sharing is most common reason for missing edges.  */
1545       gcc_assert (dest->needed || !flag_unit_at_a_time);
1546       cgraph_create_edge (id->node, dest, t)->inline_failed
1547         = N_("originally indirect function call not considered for inlining");
1548       goto egress;
1549     }
1550
1551   /* Don't try to inline functions that are not well-suited to
1552      inlining.  */
1553   if (!cgraph_inline_p (edge, &reason))
1554     {
1555       if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)))
1556         {
1557           sorry ("%Jinlining failed in call to %qF: %s", fn, fn, reason);
1558           sorry ("called from here");
1559         }
1560       else if (warn_inline && DECL_DECLARED_INLINE_P (fn)
1561                && !DECL_IN_SYSTEM_HEADER (fn)
1562                && strlen (reason)
1563                && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn)))
1564         {
1565           warning ("%Jinlining failed in call to %qF: %s", fn, fn, reason);
1566           warning ("called from here");
1567         }
1568       goto egress;
1569     }
1570
1571 #ifdef ENABLE_CHECKING
1572   if (edge->callee->decl != id->node->decl)
1573     verify_cgraph_node (edge->callee);
1574 #endif
1575
1576   if (! lang_hooks.tree_inlining.start_inlining (fn))
1577     goto egress;
1578
1579   /* Build a block containing code to initialize the arguments, the
1580      actual inline expansion of the body, and a label for the return
1581      statements within the function to jump to.  The type of the
1582      statement expression is the return type of the function call.  */
1583   stmt = NULL;
1584   expr = build (BIND_EXPR, void_type_node, NULL_TREE,
1585                 stmt, make_node (BLOCK));
1586   BLOCK_ABSTRACT_ORIGIN (BIND_EXPR_BLOCK (expr)) = fn;
1587
1588   /* Local declarations will be replaced by their equivalents in this
1589      map.  */
1590   st = id->decl_map;
1591   id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1592                                  NULL, NULL);
1593
1594   /* Initialize the parameters.  */
1595   args = TREE_OPERAND (t, 1);
1596   return_slot_addr = NULL_TREE;
1597   if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1598     {
1599       return_slot_addr = TREE_VALUE (args);
1600       args = TREE_CHAIN (args);
1601       TREE_TYPE (expr) = void_type_node;
1602     }
1603
1604   arg_inits = initialize_inlined_parameters (id, args, TREE_OPERAND (t, 2),
1605                                              fn, expr);
1606   if (arg_inits)
1607     {
1608       /* Expand any inlined calls in the initializers.  Do this before we
1609          push FN on the stack of functions we are inlining; we want to
1610          inline calls to FN that appear in the initializers for the
1611          parameters.
1612
1613          Note we need to save and restore the saved tree statement iterator
1614          to avoid having it clobbered by expand_calls_inline.  */
1615       tree_stmt_iterator save_tsi;
1616
1617       save_tsi = id->tsi;
1618       expand_calls_inline (&arg_inits, id);
1619       id->tsi = save_tsi;
1620
1621       /* And add them to the tree.  */
1622       append_to_statement_list (arg_inits, &BIND_EXPR_BODY (expr));
1623     }
1624
1625   /* Record the function we are about to inline so that we can avoid
1626      recursing into it.  */
1627   VARRAY_PUSH_TREE (id->fns, fn);
1628
1629   /* Return statements in the function body will be replaced by jumps
1630      to the RET_LABEL.  */
1631   id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
1632   DECL_ARTIFICIAL (id->ret_label) = 1;
1633   DECL_IGNORED_P (id->ret_label) = 1;
1634   DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
1635   insert_decl_map (id, id->ret_label, id->ret_label);
1636
1637   gcc_assert (DECL_INITIAL (fn));
1638   gcc_assert (TREE_CODE (DECL_INITIAL (fn)) == BLOCK);
1639
1640   /* Find the lhs to which the result of this call is assigned.  */
1641   modify_dest = tsi_stmt (id->tsi);
1642   if (TREE_CODE (modify_dest) == MODIFY_EXPR)
1643     {
1644       modify_dest = TREE_OPERAND (modify_dest, 0);
1645
1646       /* The function which we are inlining might not return a value,
1647          in which case we should issue a warning that the function
1648          does not return a value.  In that case the optimizers will
1649          see that the variable to which the value is assigned was not
1650          initialized.  We do not want to issue a warning about that
1651          uninitialized variable.  */
1652       if (DECL_P (modify_dest))
1653         TREE_NO_WARNING (modify_dest) = 1;
1654     }
1655   else
1656     modify_dest = NULL;
1657
1658   /* Declare the return variable for the function.  */
1659   declare_return_variable (id, return_slot_addr,
1660                            modify_dest, &use_retvar);
1661
1662   /* After we've initialized the parameters, we insert the body of the
1663      function itself.  */
1664   {
1665     struct cgraph_node *old_node = id->current_node;
1666     tree copy;
1667
1668     id->current_node = edge->callee;
1669     copy = copy_body (id);
1670
1671     /* If the function uses a return slot, then it may legitimately
1672        fall through while still returning a value, so we have to skip
1673        the warning here.  */
1674     if (warn_return_type
1675         && !TREE_NO_WARNING (fn)
1676         && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn)))
1677         && return_slot_addr == NULL_TREE
1678         && block_may_fallthru (copy))
1679       {
1680         warning ("control may reach end of non-void function %qD being inlined",
1681                  fn);
1682         TREE_NO_WARNING (fn) = 1;
1683       }
1684
1685     append_to_statement_list (copy, &BIND_EXPR_BODY (expr));
1686     id->current_node = old_node;
1687   }
1688   inlined_body = &BIND_EXPR_BODY (expr);
1689
1690   /* After the body of the function comes the RET_LABEL.  This must come
1691      before we evaluate the returned value below, because that evaluation
1692      may cause RTL to be generated.  */
1693   if (TREE_USED (id->ret_label))
1694     {
1695       tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1696       append_to_statement_list (label, &BIND_EXPR_BODY (expr));
1697     }
1698
1699   /* Clean up.  */
1700   splay_tree_delete (id->decl_map);
1701   id->decl_map = st;
1702
1703   /* Although, from the semantic viewpoint, the new expression has
1704      side-effects only if the old one did, it is not possible, from
1705      the technical viewpoint, to evaluate the body of a function
1706      multiple times without serious havoc.  */
1707   TREE_SIDE_EFFECTS (expr) = 1;
1708
1709   tsi_link_before (&id->tsi, expr, TSI_SAME_STMT);
1710
1711   /* If the inlined function returns a result that we care about,
1712      then we're going to need to splice in a MODIFY_EXPR.  Otherwise
1713      the call was a standalone statement and we can just replace it
1714      with the BIND_EXPR inline representation of the called function.  */
1715   if (!use_retvar || !modify_dest)
1716     *tsi_stmt_ptr (id->tsi) = build_empty_stmt ();
1717   else
1718     *tp = use_retvar;
1719
1720   /* When we gimplify a function call, we may clear TREE_SIDE_EFFECTS on
1721      the call if it is to a "const" function.  Thus the copy of
1722      TREE_SIDE_EFFECTS from the CALL_EXPR to the BIND_EXPR above with
1723      result in TREE_SIDE_EFFECTS not being set for the inlined copy of a
1724      "const" function.
1725
1726      Unfortunately, that is wrong as inlining the function can create/expose
1727      interesting side effects (such as setting of a return value).
1728
1729      The easiest solution is to simply recalculate TREE_SIDE_EFFECTS for
1730      the toplevel expression.  */
1731   recalculate_side_effects (expr);
1732   
1733   /* Output the inlining info for this abstract function, since it has been
1734      inlined.  If we don't do this now, we can lose the information about the
1735      variables in the function when the blocks get blown away as soon as we
1736      remove the cgraph node.  */
1737   (*debug_hooks->outlining_inline_function) (edge->callee->decl);
1738
1739   /* Update callgraph if needed.  */
1740   cgraph_remove_node (edge->callee);
1741
1742   /* Recurse into the body of the just inlined function.  */
1743   expand_calls_inline (inlined_body, id);
1744   VARRAY_POP (id->fns);
1745
1746   /* Don't walk into subtrees.  We've already handled them above.  */
1747   *walk_subtrees = 0;
1748
1749   lang_hooks.tree_inlining.end_inlining (fn);
1750
1751   /* Keep iterating.  */
1752  egress:
1753   input_location = saved_location;
1754   return NULL_TREE;
1755 }
1756
1757 static void
1758 expand_calls_inline (tree *stmt_p, inline_data *id)
1759 {
1760   tree stmt = *stmt_p;
1761   enum tree_code code = TREE_CODE (stmt);
1762   int dummy;
1763
1764   switch (code)
1765     {
1766     case STATEMENT_LIST:
1767       {
1768         tree_stmt_iterator i;
1769         tree new;
1770
1771         for (i = tsi_start (stmt); !tsi_end_p (i); )
1772           {
1773             id->tsi = i;
1774             expand_calls_inline (tsi_stmt_ptr (i), id);
1775
1776             new = tsi_stmt (i);
1777             if (TREE_CODE (new) == STATEMENT_LIST)
1778               {
1779                 tsi_link_before (&i, new, TSI_SAME_STMT);
1780                 tsi_delink (&i);
1781               }
1782             else
1783               tsi_next (&i);
1784           }
1785       }
1786       break;
1787
1788     case COND_EXPR:
1789       expand_calls_inline (&COND_EXPR_THEN (stmt), id);
1790       expand_calls_inline (&COND_EXPR_ELSE (stmt), id);
1791       break;
1792
1793     case CATCH_EXPR:
1794       expand_calls_inline (&CATCH_BODY (stmt), id);
1795       break;
1796
1797     case EH_FILTER_EXPR:
1798       expand_calls_inline (&EH_FILTER_FAILURE (stmt), id);
1799       break;
1800
1801     case TRY_CATCH_EXPR:
1802     case TRY_FINALLY_EXPR:
1803       expand_calls_inline (&TREE_OPERAND (stmt, 0), id);
1804       expand_calls_inline (&TREE_OPERAND (stmt, 1), id);
1805       break;
1806
1807     case BIND_EXPR:
1808       expand_calls_inline (&BIND_EXPR_BODY (stmt), id);
1809       break;
1810
1811     case COMPOUND_EXPR:
1812       /* We're gimple.  We should have gotten rid of all these.  */
1813       gcc_unreachable ();
1814
1815     case RETURN_EXPR:
1816       stmt_p = &TREE_OPERAND (stmt, 0);
1817       stmt = *stmt_p;
1818       if (!stmt || TREE_CODE (stmt) != MODIFY_EXPR)
1819         break;
1820
1821       /* FALLTHRU */
1822
1823     case MODIFY_EXPR:
1824       stmt_p = &TREE_OPERAND (stmt, 1);
1825       stmt = *stmt_p;
1826       if (TREE_CODE (stmt) == WITH_SIZE_EXPR)
1827         {
1828           stmt_p = &TREE_OPERAND (stmt, 0);
1829           stmt = *stmt_p;
1830         }
1831       if (TREE_CODE (stmt) != CALL_EXPR)
1832         break;
1833
1834       /* FALLTHRU */
1835
1836     case CALL_EXPR:
1837       expand_call_inline (stmt_p, &dummy, id);
1838       break;
1839
1840     default:
1841       break;
1842     }
1843 }
1844
1845 /* Expand calls to inline functions in the body of FN.  */
1846
1847 void
1848 optimize_inline_calls (tree fn)
1849 {
1850   inline_data id;
1851   tree prev_fn;
1852
1853   /* There is no point in performing inlining if errors have already
1854      occurred -- and we might crash if we try to inline invalid
1855      code.  */
1856   if (errorcount || sorrycount)
1857     return;
1858
1859   /* Clear out ID.  */
1860   memset (&id, 0, sizeof (id));
1861
1862   id.current_node = id.node = cgraph_node (fn);
1863   /* Don't allow recursion into FN.  */
1864   VARRAY_TREE_INIT (id.fns, 32, "fns");
1865   VARRAY_PUSH_TREE (id.fns, fn);
1866   /* Or any functions that aren't finished yet.  */
1867   prev_fn = NULL_TREE;
1868   if (current_function_decl)
1869     {
1870       VARRAY_PUSH_TREE (id.fns, current_function_decl);
1871       prev_fn = current_function_decl;
1872     }
1873
1874   prev_fn = lang_hooks.tree_inlining.add_pending_fn_decls (&id.fns, prev_fn);
1875
1876   /* Keep track of the low-water mark, i.e., the point where the first
1877      real inlining is represented in ID.FNS.  */
1878   id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1879
1880   /* Replace all calls to inline functions with the bodies of those
1881      functions.  */
1882   id.tree_pruner = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
1883   expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1884
1885   /* Clean up.  */
1886   htab_delete (id.tree_pruner);
1887
1888 #ifdef ENABLE_CHECKING
1889     {
1890       struct cgraph_edge *e;
1891
1892       verify_cgraph_node (id.node);
1893
1894       /* Double check that we inlined everything we are supposed to inline.  */
1895       for (e = id.node->callees; e; e = e->next_callee)
1896         gcc_assert (e->inline_failed);
1897     }
1898 #endif
1899 }
1900
1901 /* FN is a function that has a complete body, and CLONE is a function whose
1902    body is to be set to a copy of FN, mapping argument declarations according
1903    to the ARG_MAP splay_tree.  */
1904
1905 void
1906 clone_body (tree clone, tree fn, void *arg_map)
1907 {
1908   inline_data id;
1909
1910   /* Clone the body, as if we were making an inline call.  But, remap the
1911      parameters in the callee to the parameters of caller.  If there's an
1912      in-charge parameter, map it to an appropriate constant.  */
1913   memset (&id, 0, sizeof (id));
1914   VARRAY_TREE_INIT (id.fns, 2, "fns");
1915   VARRAY_PUSH_TREE (id.fns, clone);
1916   VARRAY_PUSH_TREE (id.fns, fn);
1917   id.decl_map = (splay_tree)arg_map;
1918
1919   /* Cloning is treated slightly differently from inlining.  Set
1920      CLONING_P so that it's clear which operation we're performing.  */
1921   id.cloning_p = true;
1922
1923   /* Actually copy the body.  */
1924   append_to_statement_list_force (copy_body (&id), &DECL_SAVED_TREE (clone));
1925 }
1926
1927 /* Make and return duplicate of body in FN.  Put copies of DECL_ARGUMENTS
1928    in *arg_copy and of the static chain, if any, in *sc_copy.  */
1929
1930 tree
1931 save_body (tree fn, tree *arg_copy, tree *sc_copy)
1932 {
1933   inline_data id;
1934   tree body, *parg;
1935
1936   memset (&id, 0, sizeof (id));
1937   VARRAY_TREE_INIT (id.fns, 1, "fns");
1938   VARRAY_PUSH_TREE (id.fns, fn);
1939   id.node = cgraph_node (fn);
1940   id.saving_p = true;
1941   id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
1942   *arg_copy = DECL_ARGUMENTS (fn);
1943
1944   for (parg = arg_copy; *parg; parg = &TREE_CHAIN (*parg))
1945     {
1946       tree new = copy_node (*parg);
1947
1948       lang_hooks.dup_lang_specific_decl (new);
1949       DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*parg);
1950       insert_decl_map (&id, *parg, new);
1951       TREE_CHAIN (new) = TREE_CHAIN (*parg);
1952       *parg = new;
1953     }
1954
1955   *sc_copy = DECL_STRUCT_FUNCTION (fn)->static_chain_decl;
1956   if (*sc_copy)
1957     {
1958       tree new = copy_node (*sc_copy);
1959
1960       lang_hooks.dup_lang_specific_decl (new);
1961       DECL_ABSTRACT_ORIGIN (new) = DECL_ORIGIN (*sc_copy);
1962       insert_decl_map (&id, *sc_copy, new);
1963       TREE_CHAIN (new) = TREE_CHAIN (*sc_copy);
1964       *sc_copy = new;
1965     }
1966
1967   insert_decl_map (&id, DECL_RESULT (fn), DECL_RESULT (fn));
1968
1969   /* Actually copy the body.  */
1970   body = copy_body (&id);
1971
1972   /* Clean up.  */
1973   splay_tree_delete (id.decl_map);
1974   return body;
1975 }
1976
1977 /* Passed to walk_tree.  Copies the node pointed to, if appropriate.  */
1978
1979 tree
1980 copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1981 {
1982   enum tree_code code = TREE_CODE (*tp);
1983
1984   /* We make copies of most nodes.  */
1985   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1986       || code == TREE_LIST
1987       || code == TREE_VEC
1988       || code == TYPE_DECL)
1989     {
1990       /* Because the chain gets clobbered when we make a copy, we save it
1991          here.  */
1992       tree chain = TREE_CHAIN (*tp);
1993       tree new;
1994
1995       /* Copy the node.  */
1996       new = copy_node (*tp);
1997
1998       /* Propagate mudflap marked-ness.  */
1999       if (flag_mudflap && mf_marked_p (*tp))
2000         mf_mark (new);
2001
2002       *tp = new;
2003
2004       /* Now, restore the chain, if appropriate.  That will cause
2005          walk_tree to walk into the chain as well.  */
2006       if (code == PARM_DECL || code == TREE_LIST)
2007         TREE_CHAIN (*tp) = chain;
2008
2009       /* For now, we don't update BLOCKs when we make copies.  So, we
2010          have to nullify all BIND_EXPRs.  */
2011       if (TREE_CODE (*tp) == BIND_EXPR)
2012         BIND_EXPR_BLOCK (*tp) = NULL_TREE;
2013     }
2014
2015   else if (TREE_CODE_CLASS (code) == tcc_type)
2016     *walk_subtrees = 0;
2017   else if (TREE_CODE_CLASS (code) == tcc_declaration)
2018     *walk_subtrees = 0;
2019   else if (TREE_CODE_CLASS (code) == tcc_constant)
2020     *walk_subtrees = 0;
2021   else
2022     gcc_assert (code != STATEMENT_LIST);
2023   return NULL_TREE;
2024 }
2025
2026 /* The SAVE_EXPR pointed to by TP is being copied.  If ST contains
2027    information indicating to what new SAVE_EXPR this one should be mapped,
2028    use that one.  Otherwise, create a new node and enter it in ST.  */
2029
2030 static void
2031 remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
2032 {
2033   splay_tree st = (splay_tree) st_;
2034   splay_tree_node n;
2035   tree t;
2036
2037   /* See if we already encountered this SAVE_EXPR.  */
2038   n = splay_tree_lookup (st, (splay_tree_key) *tp);
2039
2040   /* If we didn't already remap this SAVE_EXPR, do so now.  */
2041   if (!n)
2042     {
2043       t = copy_node (*tp);
2044
2045       /* Remember this SAVE_EXPR.  */
2046       splay_tree_insert (st, (splay_tree_key) *tp, (splay_tree_value) t);
2047       /* Make sure we don't remap an already-remapped SAVE_EXPR.  */
2048       splay_tree_insert (st, (splay_tree_key) t, (splay_tree_value) t);
2049     }
2050   else
2051     {
2052       /* We've already walked into this SAVE_EXPR; don't do it again.  */
2053       *walk_subtrees = 0;
2054       t = (tree) n->value;
2055     }
2056
2057   /* Replace this SAVE_EXPR with the copy.  */
2058   *tp = t;
2059 }
2060
2061 /* Called via walk_tree.  If *TP points to a DECL_STMT for a local label,
2062    copies the declaration and enters it in the splay_tree in DATA (which is
2063    really an `inline_data *').  */
2064
2065 static tree
2066 mark_local_for_remap_r (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED,
2067                         void *data)
2068 {
2069   inline_data *id = (inline_data *) data;
2070
2071   /* Don't walk into types.  */
2072   if (TYPE_P (*tp))
2073     *walk_subtrees = 0;
2074
2075   else if (TREE_CODE (*tp) == LABEL_EXPR)
2076     {
2077       tree decl = TREE_OPERAND (*tp, 0);
2078
2079       /* Copy the decl and remember the copy.  */
2080       insert_decl_map (id, decl,
2081                        copy_decl_for_inlining (decl, DECL_CONTEXT (decl),
2082                                                DECL_CONTEXT (decl)));
2083     }
2084
2085   return NULL_TREE;
2086 }
2087
2088 /* Perform any modifications to EXPR required when it is unsaved.  Does
2089    not recurse into EXPR's subtrees.  */
2090
2091 static void
2092 unsave_expr_1 (tree expr)
2093 {
2094   switch (TREE_CODE (expr))
2095     {
2096     case TARGET_EXPR:
2097       /* Don't mess with a TARGET_EXPR that hasn't been expanded.
2098          It's OK for this to happen if it was part of a subtree that
2099          isn't immediately expanded, such as operand 2 of another
2100          TARGET_EXPR.  */
2101       if (TREE_OPERAND (expr, 1))
2102         break;
2103
2104       TREE_OPERAND (expr, 1) = TREE_OPERAND (expr, 3);
2105       TREE_OPERAND (expr, 3) = NULL_TREE;
2106       break;
2107
2108     default:
2109       break;
2110     }
2111 }
2112
2113 /* Called via walk_tree when an expression is unsaved.  Using the
2114    splay_tree pointed to by ST (which is really a `splay_tree'),
2115    remaps all local declarations to appropriate replacements.  */
2116
2117 static tree
2118 unsave_r (tree *tp, int *walk_subtrees, void *data)
2119 {
2120   inline_data *id = (inline_data *) data;
2121   splay_tree st = id->decl_map;
2122   splay_tree_node n;
2123
2124   /* Only a local declaration (variable or label).  */
2125   if ((TREE_CODE (*tp) == VAR_DECL && !TREE_STATIC (*tp))
2126       || TREE_CODE (*tp) == LABEL_DECL)
2127     {
2128       /* Lookup the declaration.  */
2129       n = splay_tree_lookup (st, (splay_tree_key) *tp);
2130
2131       /* If it's there, remap it.  */
2132       if (n)
2133         *tp = (tree) n->value;
2134     }
2135
2136   else if (TREE_CODE (*tp) == STATEMENT_LIST)
2137     copy_statement_list (tp);
2138   else if (TREE_CODE (*tp) == BIND_EXPR)
2139     copy_bind_expr (tp, walk_subtrees, id);
2140   else if (TREE_CODE (*tp) == SAVE_EXPR)
2141     remap_save_expr (tp, st, walk_subtrees);
2142   else
2143     {
2144       copy_tree_r (tp, walk_subtrees, NULL);
2145
2146       /* Do whatever unsaving is required.  */
2147       unsave_expr_1 (*tp);
2148     }
2149
2150   /* Keep iterating.  */
2151   return NULL_TREE;
2152 }
2153
2154 /* Copies everything in EXPR and replaces variables, labels
2155    and SAVE_EXPRs local to EXPR.  */
2156
2157 tree
2158 unsave_expr_now (tree expr)
2159 {
2160   inline_data id;
2161
2162   /* There's nothing to do for NULL_TREE.  */
2163   if (expr == 0)
2164     return expr;
2165
2166   /* Set up ID.  */
2167   memset (&id, 0, sizeof (id));
2168   VARRAY_TREE_INIT (id.fns, 1, "fns");
2169   VARRAY_PUSH_TREE (id.fns, current_function_decl);
2170   id.decl_map = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
2171
2172   /* Walk the tree once to find local labels.  */
2173   walk_tree_without_duplicates (&expr, mark_local_for_remap_r, &id);
2174
2175   /* Walk the tree again, copying, remapping, and unsaving.  */
2176   walk_tree (&expr, unsave_r, &id, NULL);
2177
2178   /* Clean up.  */
2179   splay_tree_delete (id.decl_map);
2180
2181   return expr;
2182 }
2183
2184 /* Allow someone to determine if SEARCH is a child of TOP from gdb.  */
2185
2186 static tree
2187 debug_find_tree_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, void *data)
2188 {
2189   if (*tp == data)
2190     return (tree) data;
2191   else
2192     return NULL;
2193 }
2194
2195 bool
2196 debug_find_tree (tree top, tree search)
2197 {
2198   return walk_tree_without_duplicates (&top, debug_find_tree_1, search) != 0;
2199 }
2200
2201 /* Declare the variables created by the inliner.  Add all the variables in
2202    VARS to BIND_EXPR.  */
2203
2204 static void
2205 declare_inline_vars (tree bind_expr, tree vars)
2206 {
2207   tree t;
2208   for (t = vars; t; t = TREE_CHAIN (t))
2209     DECL_SEEN_IN_BIND_EXPR_P (t) = 1;
2210
2211   add_var_to_bind_expr (bind_expr, vars);
2212 }