OSDN Git Service

* config/freebsd-spec.h (FBSD_CPP_PREDEFINES): Remove.
[pf3gnuchains/gcc-fork.git] / gcc / tree-inline.c
1 /* Control and data flow functions for trees.
2    Copyright 2001, 2002 Free Software Foundation, Inc.
3    Contributed by Alexandre Oliva <aoliva@redhat.com>
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
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
42 /* This should be eventually be generalized to other languages, but
43    this would require a shared function-as-trees infrastructure.  */
44 #ifndef INLINER_FOR_JAVA
45 #include "c-common.h"
46 #else /* INLINER_FOR_JAVA */
47 #include "parse.h"
48 #include "java-tree.h"
49 #endif /* INLINER_FOR_JAVA */
50
51 /* 0 if we should not perform inlining.
52    1 if we should expand functions calls inline at the tree level.
53    2 if we should consider *all* functions to be inline
54    candidates.  */
55
56 int flag_inline_trees = 0;
57
58 /* To Do:
59
60    o In order to make inlining-on-trees work, we pessimized
61      function-local static constants.  In particular, they are now
62      always output, even when not addressed.  Fix this by treating
63      function-local static constants just like global static
64      constants; the back-end already knows not to output them if they
65      are not needed.
66
67    o Provide heuristics to clamp inlining of recursive template
68      calls?  */
69
70 /* Data required for function inlining.  */
71
72 typedef struct inline_data
73 {
74   /* A stack of the functions we are inlining.  For example, if we are
75      compiling `f', which calls `g', which calls `h', and we are
76      inlining the body of `h', the stack will contain, `h', followed
77      by `g', followed by `f'.  The first few elements of the stack may
78      contain other functions that we know we should not recurse into,
79      even though they are not directly being inlined.  */
80   varray_type fns;
81   /* The index of the first element of FNS that really represents an
82      inlined function.  */
83   unsigned first_inlined_fn;
84   /* The label to jump to when a return statement is encountered.  If
85      this value is NULL, then return statements will simply be
86      remapped as return statements, rather than as jumps.  */
87   tree ret_label;
88   /* The map from local declarations in the inlined function to
89      equivalents in the function into which it is being inlined.  */
90   splay_tree decl_map;
91   /* Nonzero if we are currently within the cleanup for a
92      TARGET_EXPR.  */
93   int in_target_cleanup_p;
94   /* A list of the functions current function has inlined.  */
95   varray_type inlined_fns;
96   /* The approximate number of statements we have inlined in the
97      current call stack.  */
98   int inlined_stmts;
99   /* We use the same mechanism to build clones that we do to perform
100      inlining.  However, there are a few places where we need to
101      distinguish between those two situations.  This flag is true if
102      we are cloning, rather than inlining.  */
103   bool cloning_p;
104   /* Hash table used to prevent walk_tree from visiting the same node
105      umpteen million times.  */
106   htab_t tree_pruner;
107   /* Decl of function we are inlining into.  */
108   tree decl;
109 } inline_data;
110
111 /* Prototypes.  */
112
113 static tree declare_return_variable PARAMS ((inline_data *, tree, tree *));
114 static tree copy_body_r PARAMS ((tree *, int *, void *));
115 static tree copy_body PARAMS ((inline_data *));
116 static tree expand_call_inline PARAMS ((tree *, int *, void *));
117 static void expand_calls_inline PARAMS ((tree *, inline_data *));
118 static int inlinable_function_p PARAMS ((tree, inline_data *, int));
119 static tree remap_decl PARAMS ((tree, inline_data *));
120 #ifndef INLINER_FOR_JAVA
121 static tree initialize_inlined_parameters PARAMS ((inline_data *, tree, tree));
122 static void remap_block PARAMS ((tree, tree, inline_data *));
123 static void copy_scope_stmt PARAMS ((tree *, int *, inline_data *));
124 #else /* INLINER_FOR_JAVA */
125 static tree initialize_inlined_parameters PARAMS ((inline_data *, tree, tree, tree));
126 static void remap_block PARAMS ((tree *, tree, inline_data *));
127 static tree add_stmt_to_compound PARAMS ((tree, tree, tree));
128 #endif /* INLINER_FOR_JAVA */
129 static tree find_alloca_call_1 PARAMS ((tree *, int *, void *));
130 static tree find_alloca_call PARAMS ((tree));
131 static tree find_builtin_longjmp_call_1 PARAMS ((tree *, int *, void *));
132 static tree find_builtin_longjmp_call PARAMS ((tree));
133
134 /* The approximate number of instructions per statement.  This number
135    need not be particularly accurate; it is used only to make
136    decisions about when a function is too big to inline.  */
137 #define INSNS_PER_STMT (10)
138
139 /* Remap DECL during the copying of the BLOCK tree for the function.  */
140
141 static tree
142 remap_decl (decl, id)
143      tree decl;
144      inline_data *id;
145 {
146   splay_tree_node n;
147   tree fn;
148
149   /* We only remap local variables in the current function.  */
150   fn = VARRAY_TOP_TREE (id->fns);
151   if (! (*lang_hooks.tree_inlining.auto_var_in_fn_p) (decl, fn))
152     return NULL_TREE;
153
154   /* See if we have remapped this declaration.  */
155   n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
156   /* If we didn't already have an equivalent for this declaration,
157      create one now.  */
158   if (!n)
159     {
160       tree t;
161
162       /* Make a copy of the variable or label.  */
163       t = copy_decl_for_inlining (decl, fn,
164                                   VARRAY_TREE (id->fns, 0));
165
166       /* The decl T could be a dynamic array or other variable size type,
167          in which case some fields need to be remapped because they may
168          contain SAVE_EXPRs.  */
169       if (TREE_TYPE (t) && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
170           && TYPE_DOMAIN (TREE_TYPE (t)))
171         {
172           TREE_TYPE (t) = copy_node (TREE_TYPE (t));
173           TYPE_DOMAIN (TREE_TYPE (t))
174             = copy_node (TYPE_DOMAIN (TREE_TYPE (t)));
175           walk_tree (&TYPE_MAX_VALUE (TYPE_DOMAIN (TREE_TYPE (t))),
176                      copy_body_r, id, NULL);
177         }
178
179 #ifndef INLINER_FOR_JAVA
180       if (! DECL_NAME (t) && TREE_TYPE (t)
181           && (*lang_hooks.tree_inlining.anon_aggr_type_p) (TREE_TYPE (t)))
182         {
183           /* For a VAR_DECL of anonymous type, we must also copy the
184              member VAR_DECLS here and rechain the
185              DECL_ANON_UNION_ELEMS.  */
186           tree members = NULL;
187           tree src;
188
189           for (src = DECL_ANON_UNION_ELEMS (t); src;
190                src = TREE_CHAIN (src))
191             {
192               tree member = remap_decl (TREE_VALUE (src), id);
193
194               if (TREE_PURPOSE (src))
195                 abort ();
196               members = tree_cons (NULL, member, members);
197             }
198           DECL_ANON_UNION_ELEMS (t) = nreverse (members);
199         }
200 #endif /* not INLINER_FOR_JAVA */
201
202       /* Remember it, so that if we encounter this local entity
203          again we can reuse this copy.  */
204       n = splay_tree_insert (id->decl_map,
205                              (splay_tree_key) decl,
206                              (splay_tree_value) t);
207     }
208
209   return (tree) n->value;
210 }
211
212 #ifndef INLINER_FOR_JAVA
213 /* Copy the SCOPE_STMT_BLOCK associated with SCOPE_STMT to contain
214    remapped versions of the variables therein.  And hook the new block
215    into the block-tree.  If non-NULL, the DECLS are declarations to
216    add to use instead of the BLOCK_VARS in the old block.  */
217 #else /* INLINER_FOR_JAVA */
218 /* Copy the BLOCK to contain remapped versions of the variables
219    therein.  And hook the new block into the block-tree.  */
220 #endif /* INLINER_FOR_JAVA */
221
222 static void
223 #ifndef INLINER_FOR_JAVA
224 remap_block (scope_stmt, decls, id)
225      tree scope_stmt;
226 #else /* INLINER_FOR_JAVA */
227 remap_block (block, decls, id)
228      tree *block;
229 #endif /* INLINER_FOR_JAVA */
230      tree decls;
231      inline_data *id;
232 {
233 #ifndef INLINER_FOR_JAVA
234   /* We cannot do this in the cleanup for a TARGET_EXPR since we do
235      not know whether or not expand_expr will actually write out the
236      code we put there.  If it does not, then we'll have more BLOCKs
237      than block-notes, and things will go awry.  At some point, we
238      should make the back-end handle BLOCK notes in a tidier way,
239      without requiring a strict correspondence to the block-tree; then
240      this check can go.  */
241   if (id->in_target_cleanup_p)
242     {
243       SCOPE_STMT_BLOCK (scope_stmt) = NULL_TREE;
244       return;
245     }
246
247   /* If this is the beginning of a scope, remap the associated BLOCK.  */
248   if (SCOPE_BEGIN_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt))
249     {
250       tree old_block;
251       tree new_block;
252       tree old_var;
253       tree fn;
254
255       /* Make the new block.  */
256       old_block = SCOPE_STMT_BLOCK (scope_stmt);
257       new_block = make_node (BLOCK);
258       TREE_USED (new_block) = TREE_USED (old_block);
259       BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
260       SCOPE_STMT_BLOCK (scope_stmt) = new_block;
261
262       /* Remap its variables.  */
263       for (old_var = decls ? decls : BLOCK_VARS (old_block);
264            old_var;
265            old_var = TREE_CHAIN (old_var))
266         {
267           tree new_var;
268
269           /* Remap the variable.  */
270           new_var = remap_decl (old_var, id);
271           /* If we didn't remap this variable, so we can't mess with
272              its TREE_CHAIN.  If we remapped this variable to
273              something other than a declaration (say, if we mapped it
274              to a constant), then we must similarly omit any mention
275              of it here.  */
276           if (!new_var || !DECL_P (new_var))
277             ;
278           else
279             {
280               TREE_CHAIN (new_var) = BLOCK_VARS (new_block);
281               BLOCK_VARS (new_block) = new_var;
282             }
283         }
284       /* We put the BLOCK_VARS in reverse order; fix that now.  */
285       BLOCK_VARS (new_block) = nreverse (BLOCK_VARS (new_block));
286       fn = VARRAY_TREE (id->fns, 0);
287       if (id->cloning_p)
288         /* We're building a clone; DECL_INITIAL is still
289            error_mark_node, and current_binding_level is the parm
290            binding level.  */
291         (*lang_hooks.decls.insert_block) (new_block);
292       else
293         {
294           /* Attach this new block after the DECL_INITIAL block for the
295              function into which this block is being inlined.  In
296              rest_of_compilation we will straighten out the BLOCK tree.  */
297           tree *first_block;
298           if (DECL_INITIAL (fn))
299             first_block = &BLOCK_CHAIN (DECL_INITIAL (fn));
300           else
301             first_block = &DECL_INITIAL (fn);
302           BLOCK_CHAIN (new_block) = *first_block;
303           *first_block = new_block;
304         }
305       /* Remember the remapped block.  */
306       splay_tree_insert (id->decl_map,
307                          (splay_tree_key) old_block,
308                          (splay_tree_value) new_block);
309     }
310   /* If this is the end of a scope, set the SCOPE_STMT_BLOCK to be the
311      remapped block.  */
312   else if (SCOPE_END_P (scope_stmt) && SCOPE_STMT_BLOCK (scope_stmt))
313     {
314       splay_tree_node n;
315
316       /* Find this block in the table of remapped things.  */
317       n = splay_tree_lookup (id->decl_map,
318                              (splay_tree_key) SCOPE_STMT_BLOCK (scope_stmt));
319       if (! n)
320         abort ();
321       SCOPE_STMT_BLOCK (scope_stmt) = (tree) n->value;
322     }
323 #else /* INLINER_FOR_JAVA */
324   tree old_block;
325   tree new_block;
326   tree old_var;
327   tree fn;
328
329   /* Make the new block.  */
330   old_block = *block;
331   new_block = make_node (BLOCK);
332   TREE_USED (new_block) = TREE_USED (old_block);
333   BLOCK_ABSTRACT_ORIGIN (new_block) = old_block;
334   BLOCK_SUBBLOCKS (new_block) = BLOCK_SUBBLOCKS (old_block);
335   TREE_SIDE_EFFECTS (new_block) = TREE_SIDE_EFFECTS (old_block);
336   TREE_TYPE (new_block) = TREE_TYPE (old_block);
337   *block = new_block;
338
339   /* Remap its variables.  */
340   for (old_var = decls ? decls : BLOCK_VARS (old_block);
341        old_var;
342        old_var = TREE_CHAIN (old_var))
343     {
344       tree new_var;
345
346       /* All local class initialization flags go in the outermost
347          scope.  */
348       if (LOCAL_CLASS_INITIALIZATION_FLAG_P (old_var))
349         {
350           /* We may already have one.  */
351           if (! splay_tree_lookup (id->decl_map, (splay_tree_key) old_var))
352             {
353               tree outermost_block;
354               new_var = remap_decl (old_var, id);
355               DECL_ABSTRACT_ORIGIN (new_var) = NULL;
356               outermost_block = DECL_SAVED_TREE (current_function_decl);
357               TREE_CHAIN (new_var) = BLOCK_VARS (outermost_block);
358               BLOCK_VARS (outermost_block) = new_var;
359             }
360           continue;
361         }
362
363       /* Remap the variable.  */
364       new_var = remap_decl (old_var, id);
365       /* If we didn't remap this variable, so we can't mess with
366          its TREE_CHAIN.  If we remapped this variable to
367          something other than a declaration (say, if we mapped it
368          to a constant), then we must similarly omit any mention
369          of it here.  */
370       if (!new_var || !DECL_P (new_var))
371         ;
372       else
373         {
374           TREE_CHAIN (new_var) = BLOCK_VARS (new_block);
375           BLOCK_VARS (new_block) = new_var;
376         }
377     }
378   /* We put the BLOCK_VARS in reverse order; fix that now.  */
379   BLOCK_VARS (new_block) = nreverse (BLOCK_VARS (new_block));
380   fn = VARRAY_TREE (id->fns, 0);
381   /* Remember the remapped block.  */
382   splay_tree_insert (id->decl_map,
383                      (splay_tree_key) old_block,
384                      (splay_tree_value) new_block);
385 #endif /* INLINER_FOR_JAVA */
386 }
387
388 #ifndef INLINER_FOR_JAVA
389 /* Copy the SCOPE_STMT pointed to by TP.  */
390
391 static void
392 copy_scope_stmt (tp, walk_subtrees, id)
393      tree *tp;
394      int *walk_subtrees;
395      inline_data *id;
396 {
397   tree block;
398
399   /* Remember whether or not this statement was nullified.  When
400      making a copy, copy_tree_r always sets SCOPE_NULLIFIED_P (and
401      doesn't copy the SCOPE_STMT_BLOCK) to free callers from having to
402      deal with copying BLOCKs if they do not wish to do so.  */
403   block = SCOPE_STMT_BLOCK (*tp);
404   /* Copy (and replace) the statement.  */
405   copy_tree_r (tp, walk_subtrees, NULL);
406   /* Restore the SCOPE_STMT_BLOCK.  */
407   SCOPE_STMT_BLOCK (*tp) = block;
408
409   /* Remap the associated block.  */
410   remap_block (*tp, NULL_TREE, id);
411 }
412 #endif /* not INLINER_FOR_JAVA */
413
414 /* Called from copy_body via walk_tree.  DATA is really an
415    `inline_data *'.  */
416 static tree
417 copy_body_r (tp, walk_subtrees, data)
418      tree *tp;
419      int *walk_subtrees;
420      void *data;
421 {
422   inline_data* id;
423   tree fn;
424
425   /* Set up.  */
426   id = (inline_data *) data;
427   fn = VARRAY_TOP_TREE (id->fns);
428
429 #if 0
430   /* All automatic variables should have a DECL_CONTEXT indicating
431      what function they come from.  */
432   if ((TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == LABEL_DECL)
433       && DECL_NAMESPACE_SCOPE_P (*tp))
434     if (! DECL_EXTERNAL (*tp) && ! TREE_STATIC (*tp))
435       abort ();
436 #endif
437
438 #ifdef INLINER_FOR_JAVA
439   if (TREE_CODE (*tp) == BLOCK)
440     remap_block (tp, NULL_TREE, id);
441 #endif
442
443   /* If this is a RETURN_STMT, change it into an EXPR_STMT and a
444      GOTO_STMT with the RET_LABEL as its target.  */
445 #ifndef INLINER_FOR_JAVA
446   if (TREE_CODE (*tp) == RETURN_STMT && id->ret_label)
447 #else /* INLINER_FOR_JAVA */
448   if (TREE_CODE (*tp) == RETURN_EXPR && id->ret_label)
449 #endif /* INLINER_FOR_JAVA */
450     {
451       tree return_stmt = *tp;
452       tree goto_stmt;
453
454       /* Build the GOTO_STMT.  */
455 #ifndef INLINER_FOR_JAVA
456       goto_stmt = build_stmt (GOTO_STMT, id->ret_label);
457       TREE_CHAIN (goto_stmt) = TREE_CHAIN (return_stmt);
458       GOTO_FAKE_P (goto_stmt) = 1;
459 #else /* INLINER_FOR_JAVA */
460       tree assignment = TREE_OPERAND (return_stmt, 0);
461       goto_stmt = build1 (GOTO_EXPR, void_type_node, id->ret_label);
462       TREE_SIDE_EFFECTS (goto_stmt) = 1;
463 #endif /* INLINER_FOR_JAVA */
464
465       /* If we're returning something, just turn that into an
466          assignment into the equivalent of the original
467          RESULT_DECL.  */
468 #ifndef INLINER_FOR_JAVA
469       if (RETURN_STMT_EXPR (return_stmt))
470         {
471           *tp = build_stmt (EXPR_STMT,
472                             RETURN_STMT_EXPR (return_stmt));
473           STMT_IS_FULL_EXPR_P (*tp) = 1;
474           /* And then jump to the end of the function.  */
475           TREE_CHAIN (*tp) = goto_stmt;
476         }
477 #else /* INLINER_FOR_JAVA */
478       if (assignment)
479         {
480           copy_body_r (&assignment, walk_subtrees, data);
481           *tp = build (COMPOUND_EXPR, void_type_node, assignment, goto_stmt);
482           TREE_SIDE_EFFECTS (*tp) = 1;
483         }
484 #endif /* INLINER_FOR_JAVA */
485       /* If we're not returning anything just do the jump.  */
486       else
487         *tp = goto_stmt;
488     }
489   /* Local variables and labels need to be replaced by equivalent
490      variables.  We don't want to copy static variables; there's only
491      one of those, no matter how many times we inline the containing
492      function.  */
493   else if ((*lang_hooks.tree_inlining.auto_var_in_fn_p) (*tp, fn))
494     {
495       tree new_decl;
496
497       /* Remap the declaration.  */
498       new_decl = remap_decl (*tp, id);
499       if (! new_decl)
500         abort ();
501       /* Replace this variable with the copy.  */
502       STRIP_TYPE_NOPS (new_decl);
503       *tp = new_decl;
504     }
505 #if 0
506   else if (nonstatic_local_decl_p (*tp)
507            && DECL_CONTEXT (*tp) != VARRAY_TREE (id->fns, 0))
508     abort ();
509 #endif
510   else if (TREE_CODE (*tp) == SAVE_EXPR)
511     remap_save_expr (tp, id->decl_map, VARRAY_TREE (id->fns, 0),
512                      walk_subtrees);
513   else if (TREE_CODE (*tp) == UNSAVE_EXPR)
514     /* UNSAVE_EXPRs should not be generated until expansion time.  */
515     abort ();
516 #ifndef INLINER_FOR_JAVA
517   /* For a SCOPE_STMT, we must copy the associated block so that we
518      can write out debugging information for the inlined variables.  */
519   else if (TREE_CODE (*tp) == SCOPE_STMT && !id->in_target_cleanup_p)
520     copy_scope_stmt (tp, walk_subtrees, id);
521 #else /* INLINER_FOR_JAVA */
522   else if (TREE_CODE (*tp) == LABELED_BLOCK_EXPR)
523     {
524       /* We need a new copy of this labeled block; the EXIT_BLOCK_EXPR
525          will refer to it, so save a copy ready for remapping.  We
526          save it in the decl_map, although it isn't a decl.  */
527       tree new_block = copy_node (*tp);
528       splay_tree_insert (id->decl_map,
529                          (splay_tree_key) *tp,
530                          (splay_tree_value) new_block);
531       *tp = new_block;
532     }
533   else if (TREE_CODE (*tp) == EXIT_BLOCK_EXPR)
534     {
535       splay_tree_node n
536         = splay_tree_lookup (id->decl_map,
537                              (splay_tree_key) TREE_OPERAND (*tp, 0));
538       /* We _must_ have seen the enclosing LABELED_BLOCK_EXPR.  */
539       if (! n)
540         abort ();
541       *tp = copy_node (*tp);
542       TREE_OPERAND (*tp, 0) = (tree) n->value;
543     }
544 #endif /* INLINER_FOR_JAVA */
545   /* Otherwise, just copy the node.  Note that copy_tree_r already
546      knows not to copy VAR_DECLs, etc., so this is safe.  */
547   else
548     {
549       copy_tree_r (tp, walk_subtrees, NULL);
550
551       /* The copied TARGET_EXPR has never been expanded, even if the
552          original node was expanded already.  */
553       if (TREE_CODE (*tp) == TARGET_EXPR && TREE_OPERAND (*tp, 3))
554         {
555           TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
556           TREE_OPERAND (*tp, 3) = NULL_TREE;
557         }
558       else if (TREE_CODE (*tp) == MODIFY_EXPR
559                && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
560                && ((*lang_hooks.tree_inlining.auto_var_in_fn_p)
561                    (TREE_OPERAND (*tp, 0), fn)))
562         {
563           /* Some assignments VAR = VAR; don't generate any rtl code
564              and thus don't count as variable modification.  Avoid
565              keeping bogosities like 0 = 0.  */
566           tree decl = TREE_OPERAND (*tp, 0), value;
567           splay_tree_node n;
568
569           n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
570           if (n)
571             {
572               value = (tree) n->value;
573               STRIP_TYPE_NOPS (value);
574               if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
575                 *tp = value;
576             }
577         }
578     }
579
580   /* Keep iterating.  */
581   return NULL_TREE;
582 }
583
584 /* Make a copy of the body of FN so that it can be inserted inline in
585    another function.  */
586
587 static tree
588 copy_body (id)
589      inline_data *id;
590 {
591   tree body;
592
593   body = DECL_SAVED_TREE (VARRAY_TOP_TREE (id->fns));
594   walk_tree (&body, copy_body_r, id, NULL);
595
596   return body;
597 }
598
599 /* Generate code to initialize the parameters of the function at the
600    top of the stack in ID from the ARGS (presented as a TREE_LIST).  */
601
602 static tree
603 #ifndef INLINER_FOR_JAVA
604 initialize_inlined_parameters (id, args, fn)
605 #else /* INLINER_FOR_JAVA */
606 initialize_inlined_parameters (id, args, fn, block)
607 #endif /* INLINER_FOR_JAVA */
608      inline_data *id;
609      tree args;
610      tree fn;
611 #ifdef INLINER_FOR_JAVA
612      tree block;
613 #endif /* INLINER_FOR_JAVA */
614 {
615   tree init_stmts;
616   tree parms;
617   tree a;
618   tree p;
619 #ifdef INLINER_FOR_JAVA
620   tree vars = NULL_TREE;
621 #endif /* INLINER_FOR_JAVA */
622
623   /* Figure out what the parameters are.  */
624   parms = DECL_ARGUMENTS (fn);
625
626   /* Start with no initializations whatsoever.  */
627   init_stmts = NULL_TREE;
628
629   /* Loop through the parameter declarations, replacing each with an
630      equivalent VAR_DECL, appropriately initialized.  */
631   for (p = parms, a = args; p;
632        a = a ? TREE_CHAIN (a) : a, p = TREE_CHAIN (p))
633     {
634 #ifndef INLINER_FOR_JAVA
635       tree init_stmt;
636       tree cleanup;
637 #endif /* not INLINER_FOR_JAVA */
638       tree var;
639       tree value;
640       tree var_sub;
641
642       /* Find the initializer.  */
643       value = (*lang_hooks.tree_inlining.convert_parm_for_inlining)
644               (p, a ? TREE_VALUE (a) : NULL_TREE, fn);
645
646       /* If the parameter is never assigned to, we may not need to
647          create a new variable here at all.  Instead, we may be able
648          to just use the argument value.  */
649       if (TREE_READONLY (p)
650           && !TREE_ADDRESSABLE (p)
651           && value && !TREE_SIDE_EFFECTS (value))
652         {
653           /* Simplify the value, if possible.  */
654           value = fold (DECL_P (value) ? decl_constant_value (value) : value);
655
656           /* We can't risk substituting complex expressions.  They
657              might contain variables that will be assigned to later.
658              Theoretically, we could check the expression to see if
659              all of the variables that determine its value are
660              read-only, but we don't bother.  */
661           if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
662             {
663               /* If this is a declaration, wrap it a NOP_EXPR so that
664                  we don't try to put the VALUE on the list of
665                  BLOCK_VARS.  */
666               if (DECL_P (value))
667                 value = build1 (NOP_EXPR, TREE_TYPE (value), value);
668
669               splay_tree_insert (id->decl_map,
670                                  (splay_tree_key) p,
671                                  (splay_tree_value) value);
672               continue;
673             }
674         }
675
676       /* Make an equivalent VAR_DECL.  */
677       var = copy_decl_for_inlining (p, fn, VARRAY_TREE (id->fns, 0));
678
679       /* See if the frontend wants to pass this by invisible reference.  If
680          so, our new VAR_DECL will have REFERENCE_TYPE, and we need to
681          replace uses of the PARM_DECL with dereferences.  */
682       if (TREE_TYPE (var) != TREE_TYPE (p)
683           && POINTER_TYPE_P (TREE_TYPE (var))
684           && TREE_TYPE (TREE_TYPE (var)) == TREE_TYPE (p))
685         var_sub = build1 (INDIRECT_REF, TREE_TYPE (p), var);
686       else
687         var_sub = var;
688
689       /* Register the VAR_DECL as the equivalent for the PARM_DECL;
690          that way, when the PARM_DECL is encountered, it will be
691          automatically replaced by the VAR_DECL.  */
692       splay_tree_insert (id->decl_map,
693                          (splay_tree_key) p,
694                          (splay_tree_value) var_sub);
695
696       /* Declare this new variable.  */
697 #ifndef INLINER_FOR_JAVA
698       init_stmt = build_stmt (DECL_STMT, var);
699       TREE_CHAIN (init_stmt) = init_stmts;
700       init_stmts = init_stmt;
701 #else /* INLINER_FOR_JAVA */
702       TREE_CHAIN (var) = vars;
703       vars = var;
704 #endif /* INLINER_FOR_JAVA */
705
706       /* Initialize this VAR_DECL from the equivalent argument.  If
707          the argument is an object, created via a constructor or copy,
708          this will not result in an extra copy: the TARGET_EXPR
709          representing the argument will be bound to VAR, and the
710          object will be constructed in VAR.  */
711       if (! TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (p)))
712 #ifndef INLINER_FOR_JAVA
713         DECL_INITIAL (var) = value;
714       else
715         {
716           /* Even if P was TREE_READONLY, the new VAR should not be.
717              In the original code, we would have constructed a
718              temporary, and then the function body would have never
719              changed the value of P.  However, now, we will be
720              constructing VAR directly.  The constructor body may
721              change its value multiple times as it is being
722              constructed.  Therefore, it must not be TREE_READONLY;
723              the back-end assumes that TREE_READONLY variable is
724              assigned to only once.  */
725           TREE_READONLY (var) = 0;
726
727           /* Build a run-time initialization.  */
728           init_stmt = build_stmt (EXPR_STMT,
729                                   build (INIT_EXPR, TREE_TYPE (p),
730                                          var, value));
731           /* Add this initialization to the list.  Note that we want the
732              declaration *after* the initialization because we are going
733              to reverse all the initialization statements below.  */
734           TREE_CHAIN (init_stmt) = init_stmts;
735           init_stmts = init_stmt;
736         }
737
738       /* See if we need to clean up the declaration.  */
739       cleanup = (*lang_hooks.maybe_build_cleanup) (var);
740       if (cleanup)
741         {
742           tree cleanup_stmt;
743           /* Build the cleanup statement.  */
744           cleanup_stmt = build_stmt (CLEANUP_STMT, var, cleanup);
745           /* Add it to the *front* of the list; the list will be
746              reversed below.  */
747           TREE_CHAIN (cleanup_stmt) = init_stmts;
748           init_stmts = cleanup_stmt;
749         }
750 #else /* INLINER_FOR_JAVA */
751         {
752           tree assignment = build (MODIFY_EXPR, TREE_TYPE (p), var, value);
753           init_stmts = add_stmt_to_compound (init_stmts, TREE_TYPE (p),
754                                              assignment);
755         }
756       else
757         {
758           /* Java objects don't ever need constructing when being
759              passed as arguments because only call by reference is
760              supported.  */
761           abort ();
762         }
763 #endif /* INLINER_FOR_JAVA */
764     }
765
766 #ifndef INLINER_FOR_JAVA
767   /* Evaluate trailing arguments.  */
768   for (; a; a = TREE_CHAIN (a))
769     {
770       tree init_stmt;
771       tree value = TREE_VALUE (a);
772
773       if (! value || ! TREE_SIDE_EFFECTS (value))
774         continue;
775
776       init_stmt = build_stmt (EXPR_STMT, value);
777       TREE_CHAIN (init_stmt) = init_stmts;
778       init_stmts = init_stmt;
779     }
780
781   /* The initialization statements have been built up in reverse
782      order.  Straighten them out now.  */
783   return nreverse (init_stmts);
784 #else /* INLINER_FOR_JAVA */
785   BLOCK_VARS (block) = nreverse (vars);
786   return init_stmts;
787 #endif /* INLINER_FOR_JAVA */
788 }
789
790 /* Declare a return variable to replace the RESULT_DECL for the
791    function we are calling.  An appropriate DECL_STMT is returned.
792    The USE_STMT is filled in to contain a use of the declaration to
793    indicate the return value of the function.  */
794
795 #ifndef INLINER_FOR_JAVA
796 static tree
797 declare_return_variable (id, return_slot_addr, use_stmt)
798      struct inline_data *id;
799      tree return_slot_addr;
800      tree *use_stmt;
801 #else /* INLINER_FOR_JAVA */
802 static tree
803 declare_return_variable (id, return_slot_addr, var)
804      struct inline_data *id;
805      tree return_slot_addr;
806      tree *var;
807 #endif /* INLINER_FOR_JAVA */
808 {
809   tree fn = VARRAY_TOP_TREE (id->fns);
810   tree result = DECL_RESULT (fn);
811 #ifndef INLINER_FOR_JAVA
812   tree var;
813 #endif /* not INLINER_FOR_JAVA */
814   int need_return_decl = 1;
815
816   /* We don't need to do anything for functions that don't return
817      anything.  */
818   if (!result || VOID_TYPE_P (TREE_TYPE (result)))
819     {
820 #ifndef INLINER_FOR_JAVA
821       *use_stmt = NULL_TREE;
822 #else /* INLINER_FOR_JAVA */
823       *var = NULL_TREE;
824 #endif /* INLINER_FOR_JAVA */
825       return NULL_TREE;
826     }
827
828 #ifndef INLINER_FOR_JAVA
829   var = ((*lang_hooks.tree_inlining.copy_res_decl_for_inlining)
830          (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
831           &need_return_decl, return_slot_addr));
832
833   /* Register the VAR_DECL as the equivalent for the RESULT_DECL; that
834      way, when the RESULT_DECL is encountered, it will be
835      automatically replaced by the VAR_DECL.  */
836   splay_tree_insert (id->decl_map,
837                      (splay_tree_key) result,
838                      (splay_tree_value) var);
839
840   /* Build the USE_STMT.  If the return type of the function was
841      promoted, convert it back to the expected type.  */
842   if (TREE_TYPE (var) == TREE_TYPE (TREE_TYPE (fn)))
843     *use_stmt = build_stmt (EXPR_STMT, var);
844   else
845     *use_stmt = build_stmt (EXPR_STMT,
846                             build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)),
847                                     var));
848   TREE_ADDRESSABLE (*use_stmt) = 1;
849
850   /* Build the declaration statement if FN does not return an
851      aggregate.  */
852   if (need_return_decl)
853     return build_stmt (DECL_STMT, var);
854 #else /* INLINER_FOR_JAVA */
855   *var = ((*lang_hooks.tree_inlining.copy_res_decl_for_inlining)
856          (result, fn, VARRAY_TREE (id->fns, 0), id->decl_map,
857           &need_return_decl, return_slot_addr));
858
859   splay_tree_insert (id->decl_map,
860                      (splay_tree_key) result,
861                      (splay_tree_value) *var);
862   DECL_IGNORED_P (*var) = 1;
863   if (need_return_decl)
864     return *var;
865 #endif /* INLINER_FOR_JAVA */
866   /* If FN does return an aggregate, there's no need to declare the
867      return variable; we're using a variable in our caller's frame.  */
868   else
869     return NULL_TREE;
870 }
871
872 /* Returns nonzero if a function can be inlined as a tree.  */
873
874 int
875 tree_inlinable_function_p (fn, nolimit)
876      tree fn;
877      int nolimit;
878 {
879   return inlinable_function_p (fn, NULL, nolimit);
880 }
881
882 /* If *TP is possibly call to alloca, return nonzero.  */
883 static tree
884 find_alloca_call_1 (tp, walk_subtrees, data)
885      tree *tp;
886      int *walk_subtrees ATTRIBUTE_UNUSED;
887      void *data ATTRIBUTE_UNUSED;
888 {
889   if (alloca_call_p (*tp))
890     return *tp;
891   return NULL;
892 }
893
894 /* Return subexpression representing possible alloca call, if any.  */
895 static tree
896 find_alloca_call (exp)
897      tree exp;
898 {
899   int line = lineno;
900   const char *file = input_filename;
901   tree ret = walk_tree (&exp, find_alloca_call_1, NULL, NULL);
902   lineno = line;
903   input_filename = file;
904   return ret;
905 }
906
907 static tree
908 find_builtin_longjmp_call_1 (tp, walk_subtrees, data)
909      tree *tp;
910      int *walk_subtrees ATTRIBUTE_UNUSED;
911      void *data ATTRIBUTE_UNUSED;
912 {
913   tree exp = *tp, decl;
914
915   if (TREE_CODE (exp) == CALL_EXPR
916       && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
917       && (decl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
918           TREE_CODE (decl) == FUNCTION_DECL)
919       && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
920       && DECL_FUNCTION_CODE (decl) == BUILT_IN_LONGJMP)
921     return decl;
922
923   return NULL;
924 }
925
926 static tree
927 find_builtin_longjmp_call (exp)
928      tree exp;
929 {
930   int line = lineno;
931   const char *file = input_filename;
932   tree ret = walk_tree (&exp, find_builtin_longjmp_call_1, NULL, NULL);
933   lineno = line;
934   input_filename = file;
935   return ret;
936 }
937
938 /* Returns nonzero if FN is a function that can be inlined into the
939    inlining context ID_.  If ID_ is NULL, check whether the function
940    can be inlined at all.  */
941
942 static int
943 inlinable_function_p (fn, id, nolimit)
944      tree fn;
945      inline_data *id;
946      int nolimit;
947 {
948   int inlinable;
949   int currfn_insns;
950   int max_inline_insns_single = MAX_INLINE_INSNS_SINGLE;
951
952   /* If we've already decided this function shouldn't be inlined,
953      there's no need to check again.  */
954   if (DECL_UNINLINABLE (fn))
955     return 0;
956
957   /* Assume it is not inlinable.  */
958   inlinable = 0;
959        
960   /* We may be here either because fn is declared inline or because
961      we use -finline-functions.  For the second case, we are more
962      restrictive.  */
963   if (DID_INLINE_FUNC (fn))
964     max_inline_insns_single = MAX_INLINE_INSNS_AUTO;
965         
966   /* The number of instructions (estimated) of current function.  */
967   currfn_insns = DECL_NUM_STMTS (fn) * INSNS_PER_STMT;
968
969   /* If we're not inlining things, then nothing is inlinable.  */
970   if (! flag_inline_trees)
971     ;
972   /* If we're not inlining all functions and the function was not
973      declared `inline', we don't inline it.  Don't think of
974      disregarding DECL_INLINE when flag_inline_trees == 2; it's the
975      front-end that must set DECL_INLINE in this case, because
976      dwarf2out loses if a function is inlined that doesn't have
977      DECL_INLINE set.  */
978   else if (! DECL_INLINE (fn) && !nolimit)
979     ;
980   /* We can't inline functions that are too big.  Only allow a single
981      function to be of MAX_INLINE_INSNS_SINGLE size.  Make special
982      allowance for extern inline functions, though.  */
983   else if (!nolimit
984            && ! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn)
985            && currfn_insns > max_inline_insns_single)
986     ;
987   /* We can't inline functions that call __builtin_longjmp at all.
988      The non-local goto machenery really requires the destination
989      be in a different function.  If we allow the function calling
990      __builtin_longjmp to be inlined into the function calling
991      __builtin_setjmp, Things will Go Awry.  */
992   /* ??? Need front end help to identify "regular" non-local goto.  */
993   else if (find_builtin_longjmp_call (DECL_SAVED_TREE (fn)))
994     ;
995   /* Refuse to inline alloca call unless user explicitly forced so as this may
996      change program's memory overhead drastically when the function using alloca
997      is called in loop.  In GCC present in SPEC2000 inlining into schedule_block
998      cause it to require 2GB of ram instead of 256MB.  */
999   else if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (fn)) == NULL
1000            && find_alloca_call (DECL_SAVED_TREE (fn)))
1001     ;
1002   /* All is well.  We can inline this function.  Traditionally, GCC
1003      has refused to inline functions using alloca, or functions whose
1004      values are returned in a PARALLEL, and a few other such obscure
1005      conditions.  We are not equally constrained at the tree level.  */
1006   else
1007     inlinable = 1;
1008
1009   /* Squirrel away the result so that we don't have to check again.  */
1010   DECL_UNINLINABLE (fn) = ! inlinable;
1011
1012   /* In case we don't disregard the inlining limits and we basically
1013      can inline this function, investigate further.  */
1014   if (! (*lang_hooks.tree_inlining.disregard_inline_limits) (fn)
1015       && inlinable && !nolimit)
1016     {
1017       int sum_insns = (id ? id->inlined_stmts : 0) * INSNS_PER_STMT
1018                      + currfn_insns;
1019       /* In the extreme case that we have exceeded the recursive inlining
1020          limit by a huge factor (128), we just say no. Should not happen
1021          in real life.  */
1022       if (sum_insns > MAX_INLINE_INSNS * 128)
1023          inlinable = 0;
1024       /* If we did not hit the extreme limit, we use a linear function
1025          with slope -1/MAX_INLINE_SLOPE to exceedingly decrease the
1026          allowable size. We always allow a size of MIN_INLINE_INSNS
1027          though.  */
1028       else if ((sum_insns > MAX_INLINE_INSNS)
1029                && (currfn_insns > MIN_INLINE_INSNS))
1030         {
1031           int max_curr = MAX_INLINE_INSNS_SINGLE
1032                         - (sum_insns - MAX_INLINE_INSNS) / MAX_INLINE_SLOPE;
1033           if (currfn_insns > max_curr)
1034             inlinable = 0;
1035         }
1036     }
1037
1038   if (inlinable && (*lang_hooks.tree_inlining.cannot_inline_tree_fn) (&fn))
1039     inlinable = 0;
1040
1041   /* If we don't have the function body available, we can't inline
1042      it.  */
1043   if (! DECL_SAVED_TREE (fn))
1044     inlinable = 0;
1045
1046   /* Check again, language hooks may have modified it.  */
1047   if (! inlinable || DECL_UNINLINABLE (fn))
1048     return 0;
1049
1050   /* Don't do recursive inlining, either.  We don't record this in
1051      DECL_UNINLINABLE; we may be able to inline this function later.  */
1052   if (id)
1053     {
1054       size_t i;
1055
1056       for (i = 0; i < VARRAY_ACTIVE_SIZE (id->fns); ++i)
1057         if (VARRAY_TREE (id->fns, i) == fn)
1058           return 0;
1059
1060       if (DECL_INLINED_FNS (fn))
1061         {
1062           int j;
1063           tree inlined_fns = DECL_INLINED_FNS (fn);
1064
1065           for (j = 0; j < TREE_VEC_LENGTH (inlined_fns); ++j)
1066             if (TREE_VEC_ELT (inlined_fns, j) == VARRAY_TREE (id->fns, 0))
1067               return 0;
1068         }
1069     }
1070
1071   /* Return the result.  */
1072   return inlinable;
1073 }
1074
1075 /* If *TP is a CALL_EXPR, replace it with its inline expansion.  */
1076
1077 static tree
1078 expand_call_inline (tp, walk_subtrees, data)
1079      tree *tp;
1080      int *walk_subtrees;
1081      void *data;
1082 {
1083   inline_data *id;
1084   tree t;
1085   tree expr;
1086   tree stmt;
1087 #ifndef INLINER_FOR_JAVA
1088   tree chain;
1089   tree scope_stmt;
1090   tree use_stmt;
1091 #else /* INLINER_FOR_JAVA */
1092   tree retvar;
1093 #endif /* INLINER_FOR_JAVA */
1094   tree fn;
1095   tree arg_inits;
1096   tree *inlined_body;
1097   splay_tree st;
1098   tree args;
1099   tree return_slot_addr;
1100
1101   /* See what we've got.  */
1102   id = (inline_data *) data;
1103   t = *tp;
1104
1105   /* Recurse, but letting recursive invocations know that we are
1106      inside the body of a TARGET_EXPR.  */
1107   if (TREE_CODE (*tp) == TARGET_EXPR)
1108     {
1109 #ifndef INLINER_FOR_JAVA
1110       int i, len = first_rtl_op (TARGET_EXPR);
1111
1112       /* We're walking our own subtrees.  */
1113       *walk_subtrees = 0;
1114
1115       /* Actually walk over them.  This loop is the body of
1116          walk_trees, omitting the case where the TARGET_EXPR
1117          itself is handled.  */
1118       for (i = 0; i < len; ++i)
1119         {
1120           if (i == 2)
1121             ++id->in_target_cleanup_p;
1122           walk_tree (&TREE_OPERAND (*tp, i), expand_call_inline, data,
1123                      id->tree_pruner);
1124           if (i == 2)
1125             --id->in_target_cleanup_p;
1126         }
1127
1128       return NULL_TREE;
1129 #else /* INLINER_FOR_JAVA */
1130       abort ();
1131 #endif /* INLINER_FOR_JAVA */
1132     }
1133
1134   if (TYPE_P (t))
1135     /* Because types were not copied in copy_body, CALL_EXPRs beneath
1136        them should not be expanded.  This can happen if the type is a
1137        dynamic array type, for example.  */
1138     *walk_subtrees = 0;
1139
1140   /* From here on, we're only interested in CALL_EXPRs.  */
1141   if (TREE_CODE (t) != CALL_EXPR)
1142     return NULL_TREE;
1143
1144   /* First, see if we can figure out what function is being called.
1145      If we cannot, then there is no hope of inlining the function.  */
1146   fn = get_callee_fndecl (t);
1147   if (!fn)
1148     return NULL_TREE;
1149
1150   /* If fn is a declaration of a function in a nested scope that was
1151      globally declared inline, we don't set its DECL_INITIAL.
1152      However, we can't blindly follow DECL_ABSTRACT_ORIGIN because the
1153      C++ front-end uses it for cdtors to refer to their internal
1154      declarations, that are not real functions.  Fortunately those
1155      don't have trees to be saved, so we can tell by checking their
1156      DECL_SAVED_TREE.  */
1157   if (! DECL_INITIAL (fn)
1158       && DECL_ABSTRACT_ORIGIN (fn)
1159       && DECL_SAVED_TREE (DECL_ABSTRACT_ORIGIN (fn)))
1160     fn = DECL_ABSTRACT_ORIGIN (fn);
1161
1162   /* Don't try to inline functions that are not well-suited to
1163      inlining.  */
1164   if ((!flag_unit_at_a_time || !DECL_SAVED_TREE (fn)
1165        || !cgraph_global_info (fn)->inline_once)
1166       && !inlinable_function_p (fn, id, 0))
1167     return NULL_TREE;
1168
1169   if (! (*lang_hooks.tree_inlining.start_inlining) (fn))
1170     return NULL_TREE;
1171
1172   /* Set the current filename and line number to the function we are
1173      inlining so that when we create new _STMT nodes here they get
1174      line numbers corresponding to the function we are calling.  We
1175      wrap the whole inlined body in an EXPR_WITH_FILE_AND_LINE as well
1176      because individual statements don't record the filename.  */
1177   push_srcloc (DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn));
1178
1179 #ifndef INLINER_FOR_JAVA
1180   /* Build a statement-expression containing code to initialize the
1181      arguments, the actual inline expansion of the body, and a label
1182      for the return statements within the function to jump to.  The
1183      type of the statement expression is the return type of the
1184      function call.  */
1185   expr = build1 (STMT_EXPR, TREE_TYPE (TREE_TYPE (fn)), make_node (COMPOUND_STMT));
1186   /* There is no scope associated with the statement-expression.  */
1187   STMT_EXPR_NO_SCOPE (expr) = 1;
1188   stmt = STMT_EXPR_STMT (expr);
1189 #else /* INLINER_FOR_JAVA */
1190   /* Build a block containing code to initialize the arguments, the
1191      actual inline expansion of the body, and a label for the return
1192      statements within the function to jump to.  The type of the
1193      statement expression is the return type of the function call.  */
1194   stmt = NULL;
1195   expr = build (BLOCK, TREE_TYPE (TREE_TYPE (fn)), stmt);
1196 #endif /* INLINER_FOR_JAVA */
1197
1198   /* Local declarations will be replaced by their equivalents in this
1199      map.  */
1200   st = id->decl_map;
1201   id->decl_map = splay_tree_new (splay_tree_compare_pointers,
1202                                  NULL, NULL);
1203
1204   /* Initialize the parameters.  */
1205   args = TREE_OPERAND (t, 1);
1206   return_slot_addr = NULL_TREE;
1207   if (CALL_EXPR_HAS_RETURN_SLOT_ADDR (t))
1208     {
1209       return_slot_addr = TREE_VALUE (args);
1210       args = TREE_CHAIN (args);
1211     }
1212
1213 #ifndef INLINER_FOR_JAVA
1214   arg_inits = initialize_inlined_parameters (id, args, fn);
1215   /* Expand any inlined calls in the initializers.  Do this before we
1216      push FN on the stack of functions we are inlining; we want to
1217      inline calls to FN that appear in the initializers for the
1218      parameters.  */
1219   expand_calls_inline (&arg_inits, id);
1220   /* And add them to the tree.  */
1221   COMPOUND_BODY (stmt) = chainon (COMPOUND_BODY (stmt), arg_inits);
1222 #else /* INLINER_FOR_JAVA */
1223   arg_inits = initialize_inlined_parameters (id, args, fn, expr);
1224   if (arg_inits)
1225     {
1226       /* Expand any inlined calls in the initializers.  Do this before we
1227          push FN on the stack of functions we are inlining; we want to
1228          inline calls to FN that appear in the initializers for the
1229          parameters.  */
1230       expand_calls_inline (&arg_inits, id);
1231
1232       /* And add them to the tree.  */
1233       BLOCK_EXPR_BODY (expr) = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1234                                                      TREE_TYPE (arg_inits),
1235                                                      arg_inits);
1236     }
1237 #endif /* INLINER_FOR_JAVA */
1238
1239   /* Record the function we are about to inline so that we can avoid
1240      recursing into it.  */
1241   VARRAY_PUSH_TREE (id->fns, fn);
1242
1243   /* Record the function we are about to inline if optimize_function
1244      has not been called on it yet and we don't have it in the list.  */
1245   if (! DECL_INLINED_FNS (fn))
1246     {
1247       int i;
1248
1249       for (i = VARRAY_ACTIVE_SIZE (id->inlined_fns) - 1; i >= 0; i--)
1250         if (VARRAY_TREE (id->inlined_fns, i) == fn)
1251           break;
1252       if (i < 0)
1253         VARRAY_PUSH_TREE (id->inlined_fns, fn);
1254     }
1255
1256   /* Return statements in the function body will be replaced by jumps
1257      to the RET_LABEL.  */
1258   id->ret_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
1259   DECL_CONTEXT (id->ret_label) = VARRAY_TREE (id->fns, 0);
1260
1261   if (! DECL_INITIAL (fn)
1262       || TREE_CODE (DECL_INITIAL (fn)) != BLOCK)
1263     abort ();
1264
1265 #ifndef INLINER_FOR_JAVA
1266   /* Create a block to put the parameters in.  We have to do this
1267      after the parameters have been remapped because remapping
1268      parameters is different from remapping ordinary variables.  */
1269   scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
1270   SCOPE_BEGIN_P (scope_stmt) = 1;
1271   SCOPE_NO_CLEANUPS_P (scope_stmt) = 1;
1272   remap_block (scope_stmt, DECL_ARGUMENTS (fn), id);
1273   TREE_CHAIN (scope_stmt) = COMPOUND_BODY (stmt);
1274   COMPOUND_BODY (stmt) = scope_stmt;
1275
1276   /* Tell the debugging backends that this block represents the
1277      outermost scope of the inlined function.  */
1278   if (SCOPE_STMT_BLOCK (scope_stmt))
1279     BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope_stmt)) = DECL_ORIGIN (fn);
1280
1281   /* Declare the return variable for the function.  */
1282   COMPOUND_BODY (stmt)
1283     = chainon (COMPOUND_BODY (stmt),
1284                declare_return_variable (id, return_slot_addr, &use_stmt));
1285 #else /* INLINER_FOR_JAVA */
1286   {
1287     /* Declare the return variable for the function.  */
1288     tree decl = declare_return_variable (id, return_slot_addr, &retvar);
1289     if (retvar)
1290       {
1291         tree *next = &BLOCK_VARS (expr);
1292         while (*next)
1293           next = &TREE_CHAIN (*next);
1294         *next = decl;
1295       }
1296   }
1297 #endif /* INLINER_FOR_JAVA */
1298
1299   /* After we've initialized the parameters, we insert the body of the
1300      function itself.  */
1301 #ifndef INLINER_FOR_JAVA
1302   inlined_body = &COMPOUND_BODY (stmt);
1303   while (*inlined_body)
1304     inlined_body = &TREE_CHAIN (*inlined_body);
1305   *inlined_body = copy_body (id);
1306 #else /* INLINER_FOR_JAVA */
1307   {
1308     tree new_body;
1309     java_inlining_map_static_initializers (fn, id->decl_map);
1310     new_body = copy_body (id);
1311     TREE_TYPE (new_body) = TREE_TYPE (TREE_TYPE (fn));
1312     BLOCK_EXPR_BODY (expr)
1313       = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1314                               TREE_TYPE (new_body), new_body);
1315     inlined_body = &BLOCK_EXPR_BODY (expr);
1316   }
1317 #endif /* INLINER_FOR_JAVA */
1318
1319   /* After the body of the function comes the RET_LABEL.  This must come
1320      before we evaluate the returned value below, because that evaluation
1321      may cause RTL to be generated.  */
1322 #ifndef INLINER_FOR_JAVA
1323   COMPOUND_BODY (stmt)
1324     = chainon (COMPOUND_BODY (stmt),
1325                build_stmt (LABEL_STMT, id->ret_label));
1326 #else /* INLINER_FOR_JAVA */
1327   {
1328     tree label = build1 (LABEL_EXPR, void_type_node, id->ret_label);
1329     BLOCK_EXPR_BODY (expr)
1330       = add_stmt_to_compound (BLOCK_EXPR_BODY (expr), void_type_node, label);
1331     TREE_SIDE_EFFECTS (label) = TREE_SIDE_EFFECTS (t);
1332   }
1333 #endif /* INLINER_FOR_JAVA */
1334
1335   /* Finally, mention the returned value so that the value of the
1336      statement-expression is the returned value of the function.  */
1337 #ifndef INLINER_FOR_JAVA
1338   COMPOUND_BODY (stmt) = chainon (COMPOUND_BODY (stmt), use_stmt);
1339
1340   /* Close the block for the parameters.  */
1341   scope_stmt = build_stmt (SCOPE_STMT, DECL_INITIAL (fn));
1342   SCOPE_NO_CLEANUPS_P (scope_stmt) = 1;
1343   remap_block (scope_stmt, NULL_TREE, id);
1344   COMPOUND_BODY (stmt)
1345     = chainon (COMPOUND_BODY (stmt), scope_stmt);
1346 #else /* INLINER_FOR_JAVA */
1347   if (retvar)
1348     {
1349       /* Mention the retvar.  If the return type of the function was
1350          promoted, convert it back to the expected type.  */
1351       if (TREE_TYPE (TREE_TYPE (fn)) != TREE_TYPE (retvar))
1352         retvar = build1 (NOP_EXPR, TREE_TYPE (TREE_TYPE (fn)), retvar);
1353       BLOCK_EXPR_BODY (expr)
1354         = add_stmt_to_compound (BLOCK_EXPR_BODY (expr),
1355                                 TREE_TYPE (retvar), retvar);
1356     }
1357
1358   java_inlining_merge_static_initializers (fn, id->decl_map);
1359 #endif /* INLINER_FOR_JAVA */
1360
1361   /* Clean up.  */
1362   splay_tree_delete (id->decl_map);
1363   id->decl_map = st;
1364
1365   /* The new expression has side-effects if the old one did.  */
1366   TREE_SIDE_EFFECTS (expr) = TREE_SIDE_EFFECTS (t);
1367
1368   /* Replace the call by the inlined body.  Wrap it in an
1369      EXPR_WITH_FILE_LOCATION so that we'll get debugging line notes
1370      pointing to the right place.  */
1371 #ifndef INLINER_FOR_JAVA
1372   chain = TREE_CHAIN (*tp);
1373   *tp = build_expr_wfl (expr, DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn),
1374                         /*col=*/0);
1375 #else /* INLINER_FOR_JAVA */
1376   *tp = build_expr_wfl (expr, DECL_SOURCE_FILE (fn),
1377                         DECL_SOURCE_LINE_FIRST(fn),
1378                         /*col=*/0);
1379 #endif /* INLINER_FOR_JAVA */
1380   EXPR_WFL_EMIT_LINE_NOTE (*tp) = 1;
1381 #ifndef INLINER_FOR_JAVA
1382   TREE_CHAIN (*tp) = chain;
1383 #endif /* not INLINER_FOR_JAVA */
1384   pop_srcloc ();
1385
1386   /* If the value of the new expression is ignored, that's OK.  We
1387      don't warn about this for CALL_EXPRs, so we shouldn't warn about
1388      the equivalent inlined version either.  */
1389   TREE_USED (*tp) = 1;
1390
1391   /* Our function now has more statements than it did before.  */
1392   DECL_NUM_STMTS (VARRAY_TREE (id->fns, 0)) += DECL_NUM_STMTS (fn);
1393   /* For accounting, subtract one for the saved call/ret.  */
1394   id->inlined_stmts += DECL_NUM_STMTS (fn) - 1;
1395
1396   /* Update callgraph if needed.  */
1397   if (id->decl && flag_unit_at_a_time)
1398     {
1399       cgraph_remove_call (id->decl, fn);
1400       cgraph_create_edges (id->decl, *inlined_body);
1401     }
1402
1403   /* Recurse into the body of the just inlined function.  */
1404   expand_calls_inline (inlined_body, id);
1405   VARRAY_POP (id->fns);
1406
1407   /* If we've returned to the top level, clear out the record of how
1408      much inlining has been done.  */
1409   if (VARRAY_ACTIVE_SIZE (id->fns) == id->first_inlined_fn)
1410     id->inlined_stmts = 0;
1411
1412   /* Don't walk into subtrees.  We've already handled them above.  */
1413   *walk_subtrees = 0;
1414
1415   (*lang_hooks.tree_inlining.end_inlining) (fn);
1416
1417   /* Keep iterating.  */
1418   return NULL_TREE;
1419 }
1420 /* Walk over the entire tree *TP, replacing CALL_EXPRs with inline
1421    expansions as appropriate.  */
1422
1423 static void
1424 expand_calls_inline (tp, id)
1425      tree *tp;
1426      inline_data *id;
1427 {
1428   /* Search through *TP, replacing all calls to inline functions by
1429      appropriate equivalents.  Use walk_tree in no-duplicates mode
1430      to avoid exponential time complexity.  (We can't just use
1431      walk_tree_without_duplicates, because of the special TARGET_EXPR
1432      handling in expand_calls.  The hash table is set up in
1433      optimize_function.  */
1434   walk_tree (tp, expand_call_inline, id, id->tree_pruner);
1435 }
1436
1437 /* Expand calls to inline functions in the body of FN.  */
1438
1439 void
1440 optimize_inline_calls (fn)
1441      tree fn;
1442 {
1443   inline_data id;
1444   tree prev_fn;
1445
1446   /* Clear out ID.  */
1447   memset (&id, 0, sizeof (id));
1448
1449   id.decl = fn;
1450   /* Don't allow recursion into FN.  */
1451   VARRAY_TREE_INIT (id.fns, 32, "fns");
1452   VARRAY_PUSH_TREE (id.fns, fn);
1453   /* Or any functions that aren't finished yet.  */
1454   prev_fn = NULL_TREE;
1455   if (current_function_decl)
1456     {
1457       VARRAY_PUSH_TREE (id.fns, current_function_decl);
1458       prev_fn = current_function_decl;
1459     }
1460
1461   prev_fn = ((*lang_hooks.tree_inlining.add_pending_fn_decls)
1462              (&id.fns, prev_fn));
1463
1464   /* Create the list of functions this call will inline.  */
1465   VARRAY_TREE_INIT (id.inlined_fns, 32, "inlined_fns");
1466
1467   /* Keep track of the low-water mark, i.e., the point where the first
1468      real inlining is represented in ID.FNS.  */
1469   id.first_inlined_fn = VARRAY_ACTIVE_SIZE (id.fns);
1470
1471   /* Replace all calls to inline functions with the bodies of those
1472      functions.  */
1473   id.tree_pruner = htab_create (37, htab_hash_pointer,
1474                                 htab_eq_pointer, NULL);
1475   expand_calls_inline (&DECL_SAVED_TREE (fn), &id);
1476
1477   /* Clean up.  */
1478   htab_delete (id.tree_pruner);
1479   if (DECL_LANG_SPECIFIC (fn))
1480     {
1481       tree ifn = make_tree_vec (VARRAY_ACTIVE_SIZE (id.inlined_fns));
1482
1483       if (VARRAY_ACTIVE_SIZE (id.inlined_fns))
1484         memcpy (&TREE_VEC_ELT (ifn, 0), &VARRAY_TREE (id.inlined_fns, 0),
1485                 VARRAY_ACTIVE_SIZE (id.inlined_fns) * sizeof (tree));
1486       DECL_INLINED_FNS (fn) = ifn;
1487     }
1488 }
1489
1490 /* FN is a function that has a complete body, and CLONE is a function
1491    whose body is to be set to a copy of FN, mapping argument
1492    declarations according to the ARG_MAP splay_tree.  */
1493
1494 void
1495 clone_body (clone, fn, arg_map)
1496      tree clone, fn;
1497      void *arg_map;
1498 {
1499   inline_data id;
1500
1501   /* Clone the body, as if we were making an inline call.  But, remap
1502      the parameters in the callee to the parameters of caller.  If
1503      there's an in-charge parameter, map it to an appropriate
1504      constant.  */
1505   memset (&id, 0, sizeof (id));
1506   VARRAY_TREE_INIT (id.fns, 2, "fns");
1507   VARRAY_PUSH_TREE (id.fns, clone);
1508   VARRAY_PUSH_TREE (id.fns, fn);
1509   id.decl_map = (splay_tree)arg_map;
1510
1511   /* Cloning is treated slightly differently from inlining.  Set
1512      CLONING_P so that it's clear which operation we're performing.  */
1513   id.cloning_p = true;
1514
1515   /* Actually copy the body.  */
1516   TREE_CHAIN (DECL_SAVED_TREE (clone)) = copy_body (&id);
1517 }
1518
1519 /* Apply FUNC to all the sub-trees of TP in a pre-order traversal.
1520    FUNC is called with the DATA and the address of each sub-tree.  If
1521    FUNC returns a non-NULL value, the traversal is aborted, and the
1522    value returned by FUNC is returned.  If HTAB is non-NULL it is used
1523    to record the nodes visited, and to avoid visiting a node more than
1524    once.  */
1525
1526 tree
1527 walk_tree (tp, func, data, htab_)
1528      tree *tp;
1529      walk_tree_fn func;
1530      void *data;
1531      void *htab_;
1532 {
1533   htab_t htab = (htab_t) htab_;
1534   enum tree_code code;
1535   int walk_subtrees;
1536   tree result;
1537
1538 #define WALK_SUBTREE(NODE)                              \
1539   do                                                    \
1540     {                                                   \
1541       result = walk_tree (&(NODE), func, data, htab);   \
1542       if (result)                                       \
1543         return result;                                  \
1544     }                                                   \
1545   while (0)
1546
1547 #define WALK_SUBTREE_TAIL(NODE)                         \
1548   do                                                    \
1549     {                                                   \
1550        tp = & (NODE);                                   \
1551        goto tail_recurse;                               \
1552     }                                                   \
1553   while (0)
1554
1555  tail_recurse:
1556   /* Skip empty subtrees.  */
1557   if (!*tp)
1558     return NULL_TREE;
1559
1560   if (htab)
1561     {
1562       void **slot;
1563
1564       /* Don't walk the same tree twice, if the user has requested
1565          that we avoid doing so.  */
1566       slot = htab_find_slot (htab, *tp, INSERT);
1567       if (*slot)
1568         return NULL_TREE;
1569       *slot = *tp;
1570     }
1571
1572   /* Call the function.  */
1573   walk_subtrees = 1;
1574   result = (*func) (tp, &walk_subtrees, data);
1575
1576   /* If we found something, return it.  */
1577   if (result)
1578     return result;
1579
1580   code = TREE_CODE (*tp);
1581
1582 #ifndef INLINER_FOR_JAVA
1583   /* Even if we didn't, FUNC may have decided that there was nothing
1584      interesting below this point in the tree.  */
1585   if (!walk_subtrees)
1586     {
1587       if (statement_code_p (code) || code == TREE_LIST
1588           || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1589         /* But we still need to check our siblings.  */
1590         WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1591       else
1592         return NULL_TREE;
1593     }
1594
1595   /* Handle common cases up front.  */
1596   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1597       || TREE_CODE_CLASS (code) == 'r'
1598       || TREE_CODE_CLASS (code) == 's')
1599 #else /* INLINER_FOR_JAVA */
1600   if (code != EXIT_BLOCK_EXPR
1601       && code != SAVE_EXPR
1602       && (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1603           || TREE_CODE_CLASS (code) == 'r'
1604           || TREE_CODE_CLASS (code) == 's'))
1605 #endif /* INLINER_FOR_JAVA */
1606     {
1607       int i, len;
1608
1609 #ifndef INLINER_FOR_JAVA
1610       /* Set lineno here so we get the right instantiation context
1611          if we call instantiate_decl from inlinable_function_p.  */
1612       if (statement_code_p (code) && !STMT_LINENO_FOR_FN_P (*tp))
1613         lineno = STMT_LINENO (*tp);
1614 #endif /* not INLINER_FOR_JAVA */
1615
1616       /* Walk over all the sub-trees of this operand.  */
1617       len = first_rtl_op (code);
1618       /* TARGET_EXPRs are peculiar: operands 1 and 3 can be the same.
1619          But, we only want to walk once.  */
1620       if (code == TARGET_EXPR
1621           && TREE_OPERAND (*tp, 3) == TREE_OPERAND (*tp, 1))
1622         --len;
1623       /* Go through the subtrees.  We need to do this in forward order so
1624          that the scope of a FOR_EXPR is handled properly.  */
1625       for (i = 0; i < len; ++i)
1626         WALK_SUBTREE (TREE_OPERAND (*tp, i));
1627
1628 #ifndef INLINER_FOR_JAVA
1629       /* For statements, we also walk the chain so that we cover the
1630          entire statement tree.  */
1631       if (statement_code_p (code))
1632         {
1633           if (code == DECL_STMT
1634               && DECL_STMT_DECL (*tp)
1635               && DECL_P (DECL_STMT_DECL (*tp)))
1636             {
1637               /* Walk the DECL_INITIAL and DECL_SIZE.  We don't want to walk
1638                  into declarations that are just mentioned, rather than
1639                  declared; they don't really belong to this part of the tree.
1640                  And, we can see cycles: the initializer for a declaration can
1641                  refer to the declaration itself.  */
1642               WALK_SUBTREE (DECL_INITIAL (DECL_STMT_DECL (*tp)));
1643               WALK_SUBTREE (DECL_SIZE (DECL_STMT_DECL (*tp)));
1644               WALK_SUBTREE (DECL_SIZE_UNIT (DECL_STMT_DECL (*tp)));
1645             }
1646
1647           /* This can be tail-recursion optimized if we write it this way.  */
1648           WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1649         }
1650
1651 #endif /* not INLINER_FOR_JAVA */
1652       /* We didn't find what we were looking for.  */
1653       return NULL_TREE;
1654     }
1655   else if (TREE_CODE_CLASS (code) == 'd')
1656     {
1657       WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
1658     }
1659   else if (TREE_CODE_CLASS (code) == 't')
1660     {
1661       WALK_SUBTREE (TYPE_SIZE (*tp));
1662       WALK_SUBTREE (TYPE_SIZE_UNIT (*tp));
1663       /* Also examine various special fields, below.  */
1664     }
1665
1666   result = (*lang_hooks.tree_inlining.walk_subtrees) (tp, &walk_subtrees, func,
1667                                                       data, htab);
1668   if (result || ! walk_subtrees)
1669     return result;
1670
1671   /* Not one of the easy cases.  We must explicitly go through the
1672      children.  */
1673   switch (code)
1674     {
1675     case ERROR_MARK:
1676     case IDENTIFIER_NODE:
1677     case INTEGER_CST:
1678     case REAL_CST:
1679     case VECTOR_CST:
1680     case STRING_CST:
1681     case REAL_TYPE:
1682     case COMPLEX_TYPE:
1683     case VECTOR_TYPE:
1684     case VOID_TYPE:
1685     case BOOLEAN_TYPE:
1686     case UNION_TYPE:
1687     case ENUMERAL_TYPE:
1688     case BLOCK:
1689     case RECORD_TYPE:
1690     case CHAR_TYPE:
1691       /* None of thse have subtrees other than those already walked
1692          above.  */
1693       break;
1694
1695     case POINTER_TYPE:
1696     case REFERENCE_TYPE:
1697       WALK_SUBTREE_TAIL (TREE_TYPE (*tp));
1698       break;
1699
1700     case TREE_LIST:
1701       WALK_SUBTREE (TREE_VALUE (*tp));
1702       WALK_SUBTREE_TAIL (TREE_CHAIN (*tp));
1703       break;
1704
1705     case TREE_VEC:
1706       {
1707         int len = TREE_VEC_LENGTH (*tp);
1708
1709         if (len == 0)
1710           break;
1711
1712         /* Walk all elements but the first.  */
1713         while (--len)
1714           WALK_SUBTREE (TREE_VEC_ELT (*tp, len));
1715
1716         /* Now walk the first one as a tail call.  */
1717         WALK_SUBTREE_TAIL (TREE_VEC_ELT (*tp, 0));
1718       }
1719
1720     case COMPLEX_CST:
1721       WALK_SUBTREE (TREE_REALPART (*tp));
1722       WALK_SUBTREE_TAIL (TREE_IMAGPART (*tp));
1723
1724     case CONSTRUCTOR:
1725       WALK_SUBTREE_TAIL (CONSTRUCTOR_ELTS (*tp));
1726
1727     case METHOD_TYPE:
1728       WALK_SUBTREE (TYPE_METHOD_BASETYPE (*tp));
1729       /* Fall through.  */
1730
1731     case FUNCTION_TYPE:
1732       WALK_SUBTREE (TREE_TYPE (*tp));
1733       {
1734         tree arg = TYPE_ARG_TYPES (*tp);
1735
1736         /* We never want to walk into default arguments.  */
1737         for (; arg; arg = TREE_CHAIN (arg))
1738           WALK_SUBTREE (TREE_VALUE (arg));
1739       }
1740       break;
1741
1742     case ARRAY_TYPE:
1743       WALK_SUBTREE (TREE_TYPE (*tp));
1744       WALK_SUBTREE_TAIL (TYPE_DOMAIN (*tp));
1745
1746     case INTEGER_TYPE:
1747       WALK_SUBTREE (TYPE_MIN_VALUE (*tp));
1748       WALK_SUBTREE_TAIL (TYPE_MAX_VALUE (*tp));
1749
1750     case OFFSET_TYPE:
1751       WALK_SUBTREE (TREE_TYPE (*tp));
1752       WALK_SUBTREE_TAIL (TYPE_OFFSET_BASETYPE (*tp));
1753
1754 #ifdef INLINER_FOR_JAVA
1755     case EXIT_BLOCK_EXPR:
1756       WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 1));
1757
1758     case SAVE_EXPR:
1759       WALK_SUBTREE_TAIL (TREE_OPERAND (*tp, 0));
1760 #endif /* INLINER_FOR_JAVA */
1761
1762     default:
1763       abort ();
1764     }
1765
1766   /* We didn't find what we were looking for.  */
1767   return NULL_TREE;
1768
1769 #undef WALK_SUBTREE
1770 #undef WALK_SUBTREE_TAIL
1771 }
1772
1773 /* Like walk_tree, but does not walk duplicate nodes more than
1774    once.  */
1775
1776 tree
1777 walk_tree_without_duplicates (tp, func, data)
1778      tree *tp;
1779      walk_tree_fn func;
1780      void *data;
1781 {
1782   tree result;
1783   htab_t htab;
1784
1785   htab = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
1786   result = walk_tree (tp, func, data, htab);
1787   htab_delete (htab);
1788   return result;
1789 }
1790
1791 /* Passed to walk_tree.  Copies the node pointed to, if appropriate.  */
1792
1793 tree
1794 copy_tree_r (tp, walk_subtrees, data)
1795      tree *tp;
1796      int *walk_subtrees;
1797      void *data ATTRIBUTE_UNUSED;
1798 {
1799   enum tree_code code = TREE_CODE (*tp);
1800
1801   /* We make copies of most nodes.  */
1802   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
1803       || TREE_CODE_CLASS (code) == 'r'
1804       || TREE_CODE_CLASS (code) == 'c'
1805       || TREE_CODE_CLASS (code) == 's'
1806       || code == TREE_LIST
1807       || code == TREE_VEC
1808       || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1809     {
1810       /* Because the chain gets clobbered when we make a copy, we save it
1811          here.  */
1812       tree chain = TREE_CHAIN (*tp);
1813
1814       /* Copy the node.  */
1815       *tp = copy_node (*tp);
1816
1817       /* Now, restore the chain, if appropriate.  That will cause
1818          walk_tree to walk into the chain as well.  */
1819       if (code == PARM_DECL || code == TREE_LIST
1820 #ifndef INLINER_FOR_JAVA
1821           || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp)
1822           || statement_code_p (code))
1823         TREE_CHAIN (*tp) = chain;
1824
1825       /* For now, we don't update BLOCKs when we make copies.  So, we
1826          have to nullify all scope-statements.  */
1827       if (TREE_CODE (*tp) == SCOPE_STMT)
1828         SCOPE_STMT_BLOCK (*tp) = NULL_TREE;
1829 #else /* INLINER_FOR_JAVA */
1830           || (*lang_hooks.tree_inlining.tree_chain_matters_p) (*tp))
1831         TREE_CHAIN (*tp) = chain;
1832 #endif /* INLINER_FOR_JAVA */
1833     }
1834   else if (TREE_CODE_CLASS (code) == 't' && !variably_modified_type_p (*tp))
1835     /* Types only need to be copied if they are variably modified.  */
1836     *walk_subtrees = 0;
1837
1838   return NULL_TREE;
1839 }
1840
1841 /* The SAVE_EXPR pointed to by TP is being copied.  If ST contains
1842    information indicating to what new SAVE_EXPR this one should be
1843    mapped, use that one.  Otherwise, create a new node and enter it in
1844    ST.  FN is the function into which the copy will be placed.  */
1845
1846 void
1847 remap_save_expr (tp, st_, fn, walk_subtrees)
1848      tree *tp;
1849      void *st_;
1850      tree fn;
1851      int *walk_subtrees;
1852 {
1853   splay_tree st = (splay_tree) st_;
1854   splay_tree_node n;
1855
1856   /* See if we already encountered this SAVE_EXPR.  */
1857   n = splay_tree_lookup (st, (splay_tree_key) *tp);
1858
1859   /* If we didn't already remap this SAVE_EXPR, do so now.  */
1860   if (!n)
1861     {
1862       tree t = copy_node (*tp);
1863
1864       /* The SAVE_EXPR is now part of the function into which we
1865          are inlining this body.  */
1866       SAVE_EXPR_CONTEXT (t) = fn;
1867       /* And we haven't evaluated it yet.  */
1868       SAVE_EXPR_RTL (t) = NULL_RTX;
1869       /* Remember this SAVE_EXPR.  */
1870       n = splay_tree_insert (st,
1871                              (splay_tree_key) *tp,
1872                              (splay_tree_value) t);
1873       /* Make sure we don't remap an already-remapped SAVE_EXPR.  */
1874       splay_tree_insert (st, (splay_tree_key) t,
1875                          (splay_tree_value) error_mark_node);
1876     }
1877   else
1878     /* We've already walked into this SAVE_EXPR, so we needn't do it
1879        again.  */
1880     *walk_subtrees = 0;
1881
1882   /* Replace this SAVE_EXPR with the copy.  */
1883   *tp = (tree) n->value;
1884 }
1885
1886 #ifdef INLINER_FOR_JAVA
1887 /* Add STMT to EXISTING if possible, otherwise create a new
1888    COMPOUND_EXPR and add STMT to it.  */
1889
1890 static tree
1891 add_stmt_to_compound (existing, type, stmt)
1892      tree existing, type, stmt;
1893 {
1894   if (!stmt)
1895     return existing;
1896   else if (existing)
1897     return build (COMPOUND_EXPR, type, existing, stmt);
1898   else
1899     return stmt;
1900 }
1901
1902 #endif /* INLINER_FOR_JAVA */