OSDN Git Service

* toplev.c (rest_of_compilation): Avoid cfg_cleanup calls when not
[pf3gnuchains/gcc-fork.git] / gcc / integrate.c
1 /* Procedure integration for GCC.
2    Copyright (C) 1988, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003 Free Software Foundation, Inc.
4    Contributed by Michael Tiemann (tiemann@cygnus.com)
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27
28 #include "rtl.h"
29 #include "tree.h"
30 #include "tm_p.h"
31 #include "regs.h"
32 #include "flags.h"
33 #include "debug.h"
34 #include "insn-config.h"
35 #include "expr.h"
36 #include "output.h"
37 #include "recog.h"
38 #include "integrate.h"
39 #include "real.h"
40 #include "except.h"
41 #include "function.h"
42 #include "toplev.h"
43 #include "intl.h"
44 #include "loop.h"
45 #include "params.h"
46 #include "ggc.h"
47 #include "target.h"
48 #include "langhooks.h"
49
50 /* Similar, but round to the next highest integer that meets the
51    alignment.  */
52 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
53
54 /* Default max number of insns a function can have and still be inline.
55    This is overridden on RISC machines.  */
56 #ifndef INTEGRATE_THRESHOLD
57 /* Inlining small functions might save more space then not inlining at
58    all.  Assume 1 instruction for the call and 1.5 insns per argument.  */
59 #define INTEGRATE_THRESHOLD(DECL) \
60   (optimize_size \
61    ? (1 + (3 * list_length (DECL_ARGUMENTS (DECL))) / 2) \
62    : (8 * (8 + list_length (DECL_ARGUMENTS (DECL)))))
63 #endif
64 \f
65
66 /* Private type used by {get/has}_func_hard_reg_initial_val.  */
67 typedef struct initial_value_pair GTY(()) {
68   rtx hard_reg;
69   rtx pseudo;
70 } initial_value_pair;
71 typedef struct initial_value_struct GTY(()) {
72   int num_entries;
73   int max_entries;
74   initial_value_pair * GTY ((length ("%h.num_entries"))) entries;
75 } initial_value_struct;
76
77 static void setup_initial_hard_reg_value_integration PARAMS ((struct function *, struct inline_remap *));
78
79 static rtvec initialize_for_inline      PARAMS ((tree));
80 static void note_modified_parmregs      PARAMS ((rtx, rtx, void *));
81 static void integrate_parm_decls        PARAMS ((tree, struct inline_remap *,
82                                                  rtvec));
83 static tree integrate_decl_tree         PARAMS ((tree,
84                                                  struct inline_remap *));
85 static void subst_constants             PARAMS ((rtx *, rtx,
86                                                  struct inline_remap *, int));
87 static void set_block_origin_self       PARAMS ((tree));
88 static void set_block_abstract_flags    PARAMS ((tree, int));
89 static void process_reg_param           PARAMS ((struct inline_remap *, rtx,
90                                                  rtx));
91 void set_decl_abstract_flags            PARAMS ((tree, int));
92 static void mark_stores                 PARAMS ((rtx, rtx, void *));
93 static void save_parm_insns             PARAMS ((rtx, rtx));
94 static void copy_insn_list              PARAMS ((rtx, struct inline_remap *,
95                                                  rtx));
96 static void copy_insn_notes             PARAMS ((rtx, struct inline_remap *,
97                                                  int));
98 static int compare_blocks               PARAMS ((const PTR, const PTR));
99 static int find_block                   PARAMS ((const PTR, const PTR));
100
101 /* Used by copy_rtx_and_substitute; this indicates whether the function is
102    called for the purpose of inlining or some other purpose (i.e. loop
103    unrolling).  This affects how constant pool references are handled.
104    This variable contains the FUNCTION_DECL for the inlined function.  */
105 static struct function *inlining = 0;
106 \f
107 /* Returns the Ith entry in the label_map contained in MAP.  If the
108    Ith entry has not yet been set, return a fresh label.  This function
109    performs a lazy initialization of label_map, thereby avoiding huge memory
110    explosions when the label_map gets very large.  */
111
112 rtx
113 get_label_from_map (map, i)
114      struct inline_remap *map;
115      int i;
116 {
117   rtx x = map->label_map[i];
118
119   if (x == NULL_RTX)
120     x = map->label_map[i] = gen_label_rtx ();
121
122   return x;
123 }
124
125 /* Return false if the function FNDECL cannot be inlined on account of its
126    attributes, true otherwise.  */
127 bool
128 function_attribute_inlinable_p (fndecl)
129      tree fndecl;
130 {
131   if (targetm.attribute_table)
132     {
133       tree a;
134
135       for (a = DECL_ATTRIBUTES (fndecl); a; a = TREE_CHAIN (a))
136         {
137           tree name = TREE_PURPOSE (a);
138           int i;
139
140           for (i = 0; targetm.attribute_table[i].name != NULL; i++)
141             if (is_attribute_p (targetm.attribute_table[i].name, name))
142               return (*targetm.function_attribute_inlinable_p) (fndecl);
143         }
144     }
145
146   return true;
147 }
148
149 /* Zero if the current function (whose FUNCTION_DECL is FNDECL)
150    is safe and reasonable to integrate into other functions.
151    Nonzero means value is a warning msgid with a single %s
152    for the function's name.  */
153
154 const char *
155 function_cannot_inline_p (fndecl)
156      tree fndecl;
157 {
158   rtx insn;
159   tree last = tree_last (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
160
161   /* For functions marked as inline increase the maximum size to
162      MAX_INLINE_INSNS_RTL (--param max-inline-insn-rtl=<n>). For
163      regular functions use the limit given by INTEGRATE_THRESHOLD.
164      Note that the RTL inliner is not used by the languages that use
165      the tree inliner (C, C++).  */
166
167   int max_insns = (DECL_INLINE (fndecl))
168                    ? (MAX_INLINE_INSNS_RTL
169                       + 8 * list_length (DECL_ARGUMENTS (fndecl)))
170                    : INTEGRATE_THRESHOLD (fndecl);
171
172   int ninsns = 0;
173   tree parms;
174
175   if (DECL_UNINLINABLE (fndecl))
176     return N_("function cannot be inline");
177
178   /* No inlines with varargs.  */
179   if (last && TREE_VALUE (last) != void_type_node)
180     return N_("varargs function cannot be inline");
181
182   if (current_function_calls_alloca)
183     return N_("function using alloca cannot be inline");
184
185   if (current_function_calls_setjmp)
186     return N_("function using setjmp cannot be inline");
187
188   if (current_function_calls_eh_return)
189     return N_("function uses __builtin_eh_return");
190
191   if (current_function_contains_functions)
192     return N_("function with nested functions cannot be inline");
193
194   if (forced_labels)
195     return
196       N_("function with label addresses used in initializers cannot inline");
197
198   if (current_function_cannot_inline)
199     return current_function_cannot_inline;
200
201   /* If its not even close, don't even look.  */
202   if (get_max_uid () > 3 * max_insns)
203     return N_("function too large to be inline");
204
205 #if 0
206   /* Don't inline functions which do not specify a function prototype and
207      have BLKmode argument or take the address of a parameter.  */
208   for (parms = DECL_ARGUMENTS (fndecl); parms; parms = TREE_CHAIN (parms))
209     {
210       if (TYPE_MODE (TREE_TYPE (parms)) == BLKmode)
211         TREE_ADDRESSABLE (parms) = 1;
212       if (last == NULL_TREE && TREE_ADDRESSABLE (parms))
213         return N_("no prototype, and parameter address used; cannot be inline");
214     }
215 #endif
216
217   /* We can't inline functions that return structures
218      the old-fashioned PCC way, copying into a static block.  */
219   if (current_function_returns_pcc_struct)
220     return N_("inline functions not supported for this return value type");
221
222   /* We can't inline functions that return structures of varying size.  */
223   if (TREE_CODE (TREE_TYPE (TREE_TYPE (fndecl))) != VOID_TYPE
224       && int_size_in_bytes (TREE_TYPE (TREE_TYPE (fndecl))) < 0)
225     return N_("function with varying-size return value cannot be inline");
226
227   /* Cannot inline a function with a varying size argument or one that
228      receives a transparent union.  */
229   for (parms = DECL_ARGUMENTS (fndecl); parms; parms = TREE_CHAIN (parms))
230     {
231       if (int_size_in_bytes (TREE_TYPE (parms)) < 0)
232         return N_("function with varying-size parameter cannot be inline");
233       else if (TREE_CODE (TREE_TYPE (parms)) == UNION_TYPE
234                && TYPE_TRANSPARENT_UNION (TREE_TYPE (parms)))
235         return N_("function with transparent unit parameter cannot be inline");
236     }
237
238   if (get_max_uid () > max_insns)
239     {
240       for (ninsns = 0, insn = get_first_nonparm_insn ();
241            insn && ninsns < max_insns;
242            insn = NEXT_INSN (insn))
243         if (INSN_P (insn))
244           ninsns++;
245
246       if (ninsns >= max_insns)
247         return N_("function too large to be inline");
248     }
249
250   /* We will not inline a function which uses computed goto.  The addresses of
251      its local labels, which may be tucked into global storage, are of course
252      not constant across instantiations, which causes unexpected behavior.  */
253   if (current_function_has_computed_jump)
254     return N_("function with computed jump cannot inline");
255
256   /* We cannot inline a nested function that jumps to a nonlocal label.  */
257   if (current_function_has_nonlocal_goto)
258     return N_("function with nonlocal goto cannot be inline");
259
260   /* We can't inline functions that return a PARALLEL rtx.  */
261   if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
262     {
263       rtx result = DECL_RTL (DECL_RESULT (fndecl));
264       if (GET_CODE (result) == PARALLEL)
265         return N_("inline functions not supported for this return value type");
266     }
267
268   /* If the function has a target specific attribute attached to it,
269      then we assume that we should not inline it.  This can be overridden
270      by the target if it defines TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P.  */
271   if (!function_attribute_inlinable_p (fndecl))
272     return N_("function with target specific attribute(s) cannot be inlined");
273
274   return NULL;
275 }
276 \f
277 /* Map pseudo reg number into the PARM_DECL for the parm living in the reg.
278    Zero for a reg that isn't a parm's home.
279    Only reg numbers less than max_parm_reg are mapped here.  */
280 static tree *parmdecl_map;
281
282 /* In save_for_inline, nonzero if past the parm-initialization insns.  */
283 static int in_nonparm_insns;
284 \f
285 /* Subroutine for `save_for_inline'.  Performs initialization
286    needed to save FNDECL's insns and info for future inline expansion.  */
287
288 static rtvec
289 initialize_for_inline (fndecl)
290      tree fndecl;
291 {
292   int i;
293   rtvec arg_vector;
294   tree parms;
295
296   /* Clear out PARMDECL_MAP.  It was allocated in the caller's frame.  */
297   memset ((char *) parmdecl_map, 0, max_parm_reg * sizeof (tree));
298   arg_vector = rtvec_alloc (list_length (DECL_ARGUMENTS (fndecl)));
299
300   for (parms = DECL_ARGUMENTS (fndecl), i = 0;
301        parms;
302        parms = TREE_CHAIN (parms), i++)
303     {
304       rtx p = DECL_RTL (parms);
305
306       /* If we have (mem (addressof (mem ...))), use the inner MEM since
307          otherwise the copy_rtx call below will not unshare the MEM since
308          it shares ADDRESSOF.  */
309       if (GET_CODE (p) == MEM && GET_CODE (XEXP (p, 0)) == ADDRESSOF
310           && GET_CODE (XEXP (XEXP (p, 0), 0)) == MEM)
311         p = XEXP (XEXP (p, 0), 0);
312
313       RTVEC_ELT (arg_vector, i) = p;
314
315       if (GET_CODE (p) == REG)
316         parmdecl_map[REGNO (p)] = parms;
317       else if (GET_CODE (p) == CONCAT)
318         {
319           rtx preal = gen_realpart (GET_MODE (XEXP (p, 0)), p);
320           rtx pimag = gen_imagpart (GET_MODE (preal), p);
321
322           if (GET_CODE (preal) == REG)
323             parmdecl_map[REGNO (preal)] = parms;
324           if (GET_CODE (pimag) == REG)
325             parmdecl_map[REGNO (pimag)] = parms;
326         }
327
328       /* This flag is cleared later
329          if the function ever modifies the value of the parm.  */
330       TREE_READONLY (parms) = 1;
331     }
332
333   return arg_vector;
334 }
335
336 /* Copy NODE (which must be a DECL, but not a PARM_DECL).  The DECL
337    originally was in the FROM_FN, but now it will be in the
338    TO_FN.  */
339
340 tree
341 copy_decl_for_inlining (decl, from_fn, to_fn)
342      tree decl;
343      tree from_fn;
344      tree to_fn;
345 {
346   tree copy;
347
348   /* Copy the declaration.  */
349   if (TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == RESULT_DECL)
350     {
351       tree type;
352       int invisiref = 0;
353
354       /* See if the frontend wants to pass this by invisible reference.  */
355       if (TREE_CODE (decl) == PARM_DECL
356           && DECL_ARG_TYPE (decl) != TREE_TYPE (decl)
357           && POINTER_TYPE_P (DECL_ARG_TYPE (decl))
358           && TREE_TYPE (DECL_ARG_TYPE (decl)) == TREE_TYPE (decl))
359         {
360           invisiref = 1;
361           type = DECL_ARG_TYPE (decl);
362         }
363       else
364         type = TREE_TYPE (decl);
365
366       /* For a parameter, we must make an equivalent VAR_DECL, not a
367          new PARM_DECL.  */
368       copy = build_decl (VAR_DECL, DECL_NAME (decl), type);
369       if (!invisiref)
370         {
371           TREE_ADDRESSABLE (copy) = TREE_ADDRESSABLE (decl);
372           TREE_READONLY (copy) = TREE_READONLY (decl);
373           TREE_THIS_VOLATILE (copy) = TREE_THIS_VOLATILE (decl);
374         }
375       else
376         {
377           TREE_ADDRESSABLE (copy) = 0;
378           TREE_READONLY (copy) = 1;
379           TREE_THIS_VOLATILE (copy) = 0;
380         }
381     }
382   else
383     {
384       copy = copy_node (decl);
385       (*lang_hooks.dup_lang_specific_decl) (copy);
386
387       /* TREE_ADDRESSABLE isn't used to indicate that a label's
388          address has been taken; it's for internal bookkeeping in
389          expand_goto_internal.  */
390       if (TREE_CODE (copy) == LABEL_DECL)
391         TREE_ADDRESSABLE (copy) = 0;
392     }
393
394   /* Set the DECL_ABSTRACT_ORIGIN so the debugging routines know what
395      declaration inspired this copy.  */
396   DECL_ABSTRACT_ORIGIN (copy) = DECL_ORIGIN (decl);
397
398   /* The new variable/label has no RTL, yet.  */
399   if (!TREE_STATIC (copy) && !DECL_EXTERNAL (copy))
400     SET_DECL_RTL (copy, NULL_RTX);
401
402   /* These args would always appear unused, if not for this.  */
403   TREE_USED (copy) = 1;
404
405   /* Set the context for the new declaration.  */
406   if (!DECL_CONTEXT (decl))
407     /* Globals stay global.  */
408     ;
409   else if (DECL_CONTEXT (decl) != from_fn)
410     /* Things that weren't in the scope of the function we're inlining
411        from aren't in the scope we're inlining to, either.  */
412     ;
413   else if (TREE_STATIC (decl))
414     /* Function-scoped static variables should stay in the original
415        function.  */
416     ;
417   else
418     /* Ordinary automatic local variables are now in the scope of the
419        new function.  */
420     DECL_CONTEXT (copy) = to_fn;
421
422   return copy;
423 }
424
425 /* Make the insns and PARM_DECLs of the current function permanent
426    and record other information in DECL_SAVED_INSNS to allow inlining
427    of this function in subsequent calls.
428
429    This routine need not copy any insns because we are not going
430    to immediately compile the insns in the insn chain.  There
431    are two cases when we would compile the insns for FNDECL:
432    (1) when FNDECL is expanded inline, and (2) when FNDECL needs to
433    be output at the end of other compilation, because somebody took
434    its address.  In the first case, the insns of FNDECL are copied
435    as it is expanded inline, so FNDECL's saved insns are not
436    modified.  In the second case, FNDECL is used for the last time,
437    so modifying the rtl is not a problem.
438
439    We don't have to worry about FNDECL being inline expanded by
440    other functions which are written at the end of compilation
441    because flag_no_inline is turned on when we begin writing
442    functions at the end of compilation.  */
443
444 void
445 save_for_inline (fndecl)
446      tree fndecl;
447 {
448   rtx insn;
449   rtvec argvec;
450   rtx first_nonparm_insn;
451
452   /* Set up PARMDECL_MAP which maps pseudo-reg number to its PARM_DECL.
453      Later we set TREE_READONLY to 0 if the parm is modified inside the fn.
454      Also set up ARG_VECTOR, which holds the unmodified DECL_RTX values
455      for the parms, prior to elimination of virtual registers.
456      These values are needed for substituting parms properly.  */
457   if (! flag_no_inline)
458     parmdecl_map = (tree *) xmalloc (max_parm_reg * sizeof (tree));
459
460   /* Make and emit a return-label if we have not already done so.  */
461
462   if (return_label == 0)
463     {
464       return_label = gen_label_rtx ();
465       emit_label (return_label);
466     }
467
468   if (! flag_no_inline)
469     argvec = initialize_for_inline (fndecl);
470   else
471     argvec = NULL;
472
473   /* Delete basic block notes created by early run of find_basic_block.
474      The notes would be later used by find_basic_blocks to reuse the memory
475      for basic_block structures on already freed obstack.  */
476   for (insn = get_insns (); insn ; insn = NEXT_INSN (insn))
477     if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) == NOTE_INSN_BASIC_BLOCK)
478       delete_related_insns (insn);
479
480   /* If there are insns that copy parms from the stack into pseudo registers,
481      those insns are not copied.  `expand_inline_function' must
482      emit the correct code to handle such things.  */
483
484   insn = get_insns ();
485   if (GET_CODE (insn) != NOTE)
486     abort ();
487
488   if (! flag_no_inline)
489     {
490       /* Get the insn which signals the end of parameter setup code.  */
491       first_nonparm_insn = get_first_nonparm_insn ();
492
493       /* Now just scan the chain of insns to see what happens to our
494          PARM_DECLs.  If a PARM_DECL is used but never modified, we
495          can substitute its rtl directly when expanding inline (and
496          perform constant folding when its incoming value is
497          constant).  Otherwise, we have to copy its value into a new
498          register and track the new register's life.  */
499       in_nonparm_insns = 0;
500       save_parm_insns (insn, first_nonparm_insn);
501
502       cfun->inl_max_label_num = max_label_num ();
503       cfun->inl_last_parm_insn = cfun->x_last_parm_insn;
504       cfun->original_arg_vector = argvec;
505     }
506   cfun->original_decl_initial = DECL_INITIAL (fndecl);
507   cfun->no_debugging_symbols = (write_symbols == NO_DEBUG);
508   DECL_SAVED_INSNS (fndecl) = cfun;
509
510   /* Clean up.  */
511   if (! flag_no_inline)
512     free (parmdecl_map);
513 }
514
515 /* Scan the chain of insns to see what happens to our PARM_DECLs.  If a
516    PARM_DECL is used but never modified, we can substitute its rtl directly
517    when expanding inline (and perform constant folding when its incoming
518    value is constant). Otherwise, we have to copy its value into a new
519    register and track the new register's life.  */
520
521 static void
522 save_parm_insns (insn, first_nonparm_insn)
523      rtx insn;
524      rtx first_nonparm_insn;
525 {
526   if (insn == NULL_RTX)
527     return;
528
529   for (insn = NEXT_INSN (insn); insn; insn = NEXT_INSN (insn))
530     {
531       if (insn == first_nonparm_insn)
532         in_nonparm_insns = 1;
533
534       if (INSN_P (insn))
535         {
536           /* Record what interesting things happen to our parameters.  */
537           note_stores (PATTERN (insn), note_modified_parmregs, NULL);
538
539           /* If this is a CALL_PLACEHOLDER insn then we need to look into the
540              three attached sequences: normal call, sibling call and tail
541              recursion.  */
542           if (GET_CODE (insn) == CALL_INSN
543               && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
544             {
545               int i;
546
547               for (i = 0; i < 3; i++)
548                 save_parm_insns (XEXP (PATTERN (insn), i),
549                                  first_nonparm_insn);
550             }
551         }
552     }
553 }
554 \f
555 /* Note whether a parameter is modified or not.  */
556
557 static void
558 note_modified_parmregs (reg, x, data)
559      rtx reg;
560      rtx x ATTRIBUTE_UNUSED;
561      void *data ATTRIBUTE_UNUSED;
562 {
563   if (GET_CODE (reg) == REG && in_nonparm_insns
564       && REGNO (reg) < max_parm_reg
565       && REGNO (reg) >= FIRST_PSEUDO_REGISTER
566       && parmdecl_map[REGNO (reg)] != 0)
567     TREE_READONLY (parmdecl_map[REGNO (reg)]) = 0;
568 }
569
570 /* Unfortunately, we need a global copy of const_equiv map for communication
571    with a function called from note_stores.  Be *very* careful that this
572    is used properly in the presence of recursion.  */
573
574 varray_type global_const_equiv_varray;
575 \f
576 #define FIXED_BASE_PLUS_P(X) \
577   (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT  \
578    && GET_CODE (XEXP (X, 0)) == REG                             \
579    && REGNO (XEXP (X, 0)) >= FIRST_VIRTUAL_REGISTER             \
580    && REGNO (XEXP (X, 0)) <= LAST_VIRTUAL_REGISTER)
581
582 /* Called to set up a mapping for the case where a parameter is in a
583    register.  If it is read-only and our argument is a constant, set up the
584    constant equivalence.
585
586    If LOC is REG_USERVAR_P, the usual case, COPY must also have that flag set
587    if it is a register.
588
589    Also, don't allow hard registers here; they might not be valid when
590    substituted into insns.  */
591 static void
592 process_reg_param (map, loc, copy)
593      struct inline_remap *map;
594      rtx loc, copy;
595 {
596   if ((GET_CODE (copy) != REG && GET_CODE (copy) != SUBREG)
597       || (GET_CODE (copy) == REG && REG_USERVAR_P (loc)
598           && ! REG_USERVAR_P (copy))
599       || (GET_CODE (copy) == REG
600           && REGNO (copy) < FIRST_PSEUDO_REGISTER))
601     {
602       rtx temp = copy_to_mode_reg (GET_MODE (loc), copy);
603       REG_USERVAR_P (temp) = REG_USERVAR_P (loc);
604       if (CONSTANT_P (copy) || FIXED_BASE_PLUS_P (copy))
605         SET_CONST_EQUIV_DATA (map, temp, copy, CONST_AGE_PARM);
606       copy = temp;
607     }
608   map->reg_map[REGNO (loc)] = copy;
609 }
610
611 /* Compare two BLOCKs for qsort.  The key we sort on is the
612    BLOCK_ABSTRACT_ORIGIN of the blocks.  We cannot just subtract the
613    two pointers, because it may overflow sizeof(int).  */
614
615 static int
616 compare_blocks (v1, v2)
617      const PTR v1;
618      const PTR v2;
619 {
620   tree b1 = *((const tree *) v1);
621   tree b2 = *((const tree *) v2);
622   char *p1 = (char *) BLOCK_ABSTRACT_ORIGIN (b1);
623   char *p2 = (char *) BLOCK_ABSTRACT_ORIGIN (b2);
624
625   if (p1 == p2)
626     return 0;
627   return p1 < p2 ? -1 : 1;
628 }
629
630 /* Compare two BLOCKs for bsearch.  The first pointer corresponds to
631    an original block; the second to a remapped equivalent.  */
632
633 static int
634 find_block (v1, v2)
635      const PTR v1;
636      const PTR v2;
637 {
638   const union tree_node *b1 = (const union tree_node *) v1;
639   tree b2 = *((const tree *) v2);
640   char *p1 = (char *) b1;
641   char *p2 = (char *) BLOCK_ABSTRACT_ORIGIN (b2);
642
643   if (p1 == p2)
644     return 0;
645   return p1 < p2 ? -1 : 1;
646 }
647
648 /* Integrate the procedure defined by FNDECL.  Note that this function
649    may wind up calling itself.  Since the static variables are not
650    reentrant, we do not assign them until after the possibility
651    of recursion is eliminated.
652
653    If IGNORE is nonzero, do not produce a value.
654    Otherwise store the value in TARGET if it is nonzero and that is convenient.
655
656    Value is:
657    (rtx)-1 if we could not substitute the function
658    0 if we substituted it and it does not produce a value
659    else an rtx for where the value is stored.  */
660
661 rtx
662 expand_inline_function (fndecl, parms, target, ignore, type,
663                         structure_value_addr)
664      tree fndecl, parms;
665      rtx target;
666      int ignore;
667      tree type;
668      rtx structure_value_addr;
669 {
670   struct function *inlining_previous;
671   struct function *inl_f = DECL_SAVED_INSNS (fndecl);
672   tree formal, actual, block;
673   rtx parm_insns = inl_f->emit->x_first_insn;
674   rtx insns = (inl_f->inl_last_parm_insn
675                ? NEXT_INSN (inl_f->inl_last_parm_insn)
676                : parm_insns);
677   tree *arg_trees;
678   rtx *arg_vals;
679   int max_regno;
680   int i;
681   int min_labelno = inl_f->emit->x_first_label_num;
682   int max_labelno = inl_f->inl_max_label_num;
683   int nargs;
684   rtx loc;
685   rtx stack_save = 0;
686   rtx temp;
687   struct inline_remap *map = 0;
688   rtvec arg_vector = inl_f->original_arg_vector;
689   rtx static_chain_value = 0;
690   int inl_max_uid;
691   int eh_region_offset;
692
693   /* The pointer used to track the true location of the memory used
694      for MAP->LABEL_MAP.  */
695   rtx *real_label_map = 0;
696
697   /* Allow for equivalences of the pseudos we make for virtual fp and ap.  */
698   max_regno = inl_f->emit->x_reg_rtx_no + 3;
699   if (max_regno < FIRST_PSEUDO_REGISTER)
700     abort ();
701
702   /* Pull out the decl for the function definition; fndecl may be a
703      local declaration, which would break DECL_ABSTRACT_ORIGIN.  */
704   fndecl = inl_f->decl;
705
706   nargs = list_length (DECL_ARGUMENTS (fndecl));
707
708   if (cfun->preferred_stack_boundary < inl_f->preferred_stack_boundary)
709     cfun->preferred_stack_boundary = inl_f->preferred_stack_boundary;
710
711   /* Check that the parms type match and that sufficient arguments were
712      passed.  Since the appropriate conversions or default promotions have
713      already been applied, the machine modes should match exactly.  */
714
715   for (formal = DECL_ARGUMENTS (fndecl), actual = parms;
716        formal;
717        formal = TREE_CHAIN (formal), actual = TREE_CHAIN (actual))
718     {
719       tree arg;
720       enum machine_mode mode;
721
722       if (actual == 0)
723         return (rtx) (size_t) -1;
724
725       arg = TREE_VALUE (actual);
726       mode = TYPE_MODE (DECL_ARG_TYPE (formal));
727
728       if (arg == error_mark_node
729           || mode != TYPE_MODE (TREE_TYPE (arg))
730           /* If they are block mode, the types should match exactly.
731              They don't match exactly if TREE_TYPE (FORMAL) == ERROR_MARK_NODE,
732              which could happen if the parameter has incomplete type.  */
733           || (mode == BLKmode
734               && (TYPE_MAIN_VARIANT (TREE_TYPE (arg))
735                   != TYPE_MAIN_VARIANT (TREE_TYPE (formal)))))
736         return (rtx) (size_t) -1;
737     }
738
739   /* Extra arguments are valid, but will be ignored below, so we must
740      evaluate them here for side-effects.  */
741   for (; actual; actual = TREE_CHAIN (actual))
742     expand_expr (TREE_VALUE (actual), const0_rtx,
743                  TYPE_MODE (TREE_TYPE (TREE_VALUE (actual))), 0);
744
745   /* Expand the function arguments.  Do this first so that any
746      new registers get created before we allocate the maps.  */
747
748   arg_vals = (rtx *) xmalloc (nargs * sizeof (rtx));
749   arg_trees = (tree *) xmalloc (nargs * sizeof (tree));
750
751   for (formal = DECL_ARGUMENTS (fndecl), actual = parms, i = 0;
752        formal;
753        formal = TREE_CHAIN (formal), actual = TREE_CHAIN (actual), i++)
754     {
755       /* Actual parameter, converted to the type of the argument within the
756          function.  */
757       tree arg = convert (TREE_TYPE (formal), TREE_VALUE (actual));
758       /* Mode of the variable used within the function.  */
759       enum machine_mode mode = TYPE_MODE (TREE_TYPE (formal));
760       int invisiref = 0;
761
762       arg_trees[i] = arg;
763       loc = RTVEC_ELT (arg_vector, i);
764
765       /* If this is an object passed by invisible reference, we copy the
766          object into a stack slot and save its address.  If this will go
767          into memory, we do nothing now.  Otherwise, we just expand the
768          argument.  */
769       if (GET_CODE (loc) == MEM && GET_CODE (XEXP (loc, 0)) == REG
770           && REGNO (XEXP (loc, 0)) > LAST_VIRTUAL_REGISTER)
771         {
772           rtx stack_slot = assign_temp (TREE_TYPE (arg), 1, 1, 1);
773
774           store_expr (arg, stack_slot, 0);
775           arg_vals[i] = XEXP (stack_slot, 0);
776           invisiref = 1;
777         }
778       else if (GET_CODE (loc) != MEM)
779         {
780           if (GET_MODE (loc) != TYPE_MODE (TREE_TYPE (arg)))
781             {
782               int unsignedp = TREE_UNSIGNED (TREE_TYPE (formal));
783               enum machine_mode pmode = TYPE_MODE (TREE_TYPE (formal));
784
785               pmode = promote_mode (TREE_TYPE (formal), pmode,
786                                     &unsignedp, 0);
787
788               if (GET_MODE (loc) != pmode)
789                 abort ();
790
791               /* The mode if LOC and ARG can differ if LOC was a variable
792                  that had its mode promoted via PROMOTED_MODE.  */
793               arg_vals[i] = convert_modes (pmode,
794                                            TYPE_MODE (TREE_TYPE (arg)),
795                                            expand_expr (arg, NULL_RTX, mode,
796                                                         EXPAND_SUM),
797                                            unsignedp);
798             }
799           else
800             arg_vals[i] = expand_expr (arg, NULL_RTX, mode, EXPAND_SUM);
801         }
802       else
803         arg_vals[i] = 0;
804
805       if (arg_vals[i] != 0
806           && (! TREE_READONLY (formal)
807               /* If the parameter is not read-only, copy our argument through
808                  a register.  Also, we cannot use ARG_VALS[I] if it overlaps
809                  TARGET in any way.  In the inline function, they will likely
810                  be two different pseudos, and `safe_from_p' will make all
811                  sorts of smart assumptions about their not conflicting.
812                  But if ARG_VALS[I] overlaps TARGET, these assumptions are
813                  wrong, so put ARG_VALS[I] into a fresh register.
814                  Don't worry about invisible references, since their stack
815                  temps will never overlap the target.  */
816               || (target != 0
817                   && ! invisiref
818                   && (GET_CODE (arg_vals[i]) == REG
819                       || GET_CODE (arg_vals[i]) == SUBREG
820                       || GET_CODE (arg_vals[i]) == MEM)
821                   && reg_overlap_mentioned_p (arg_vals[i], target))
822               /* ??? We must always copy a SUBREG into a REG, because it might
823                  get substituted into an address, and not all ports correctly
824                  handle SUBREGs in addresses.  */
825               || (GET_CODE (arg_vals[i]) == SUBREG)))
826         arg_vals[i] = copy_to_mode_reg (GET_MODE (loc), arg_vals[i]);
827
828       if (arg_vals[i] != 0 && GET_CODE (arg_vals[i]) == REG
829           && POINTER_TYPE_P (TREE_TYPE (formal)))
830         mark_reg_pointer (arg_vals[i],
831                           TYPE_ALIGN (TREE_TYPE (TREE_TYPE (formal))));
832     }
833
834   /* Allocate the structures we use to remap things.  */
835
836   map = (struct inline_remap *) xcalloc (1, sizeof (struct inline_remap));
837   map->fndecl = fndecl;
838
839   VARRAY_TREE_INIT (map->block_map, 10, "block_map");
840   map->reg_map = (rtx *) xcalloc (max_regno, sizeof (rtx));
841
842   /* We used to use alloca here, but the size of what it would try to
843      allocate would occasionally cause it to exceed the stack limit and
844      cause unpredictable core dumps.  */
845   real_label_map
846     = (rtx *) xmalloc ((max_labelno) * sizeof (rtx));
847   map->label_map = real_label_map;
848   map->local_return_label = NULL_RTX;
849
850   inl_max_uid = (inl_f->emit->x_cur_insn_uid + 1);
851   map->insn_map = (rtx *) xcalloc (inl_max_uid, sizeof (rtx));
852   map->min_insnno = 0;
853   map->max_insnno = inl_max_uid;
854
855   map->integrating = 1;
856   map->compare_src = NULL_RTX;
857   map->compare_mode = VOIDmode;
858
859   /* const_equiv_varray maps pseudos in our routine to constants, so
860      it needs to be large enough for all our pseudos.  This is the
861      number we are currently using plus the number in the called
862      routine, plus 15 for each arg, five to compute the virtual frame
863      pointer, and five for the return value.  This should be enough
864      for most cases.  We do not reference entries outside the range of
865      the map.
866
867      ??? These numbers are quite arbitrary and were obtained by
868      experimentation.  At some point, we should try to allocate the
869      table after all the parameters are set up so we can more accurately
870      estimate the number of pseudos we will need.  */
871
872   VARRAY_CONST_EQUIV_INIT (map->const_equiv_varray,
873                            (max_reg_num ()
874                             + (max_regno - FIRST_PSEUDO_REGISTER)
875                             + 15 * nargs
876                             + 10),
877                            "expand_inline_function");
878   map->const_age = 0;
879
880   /* Record the current insn in case we have to set up pointers to frame
881      and argument memory blocks.  If there are no insns yet, add a dummy
882      insn that can be used as an insertion point.  */
883   map->insns_at_start = get_last_insn ();
884   if (map->insns_at_start == 0)
885     map->insns_at_start = emit_note (NULL, NOTE_INSN_DELETED);
886
887   map->regno_pointer_align = inl_f->emit->regno_pointer_align;
888   map->x_regno_reg_rtx = inl_f->emit->x_regno_reg_rtx;
889
890   /* Update the outgoing argument size to allow for those in the inlined
891      function.  */
892   if (inl_f->outgoing_args_size > current_function_outgoing_args_size)
893     current_function_outgoing_args_size = inl_f->outgoing_args_size;
894
895   /* If the inline function needs to make PIC references, that means
896      that this function's PIC offset table must be used.  */
897   if (inl_f->uses_pic_offset_table)
898     current_function_uses_pic_offset_table = 1;
899
900   /* If this function needs a context, set it up.  */
901   if (inl_f->needs_context)
902     static_chain_value = lookup_static_chain (fndecl);
903
904   /* If the inlined function calls __builtin_constant_p, then we'll
905      need to call purge_builtin_constant_p on this function.  */
906   if (inl_f->calls_constant_p)
907     current_function_calls_constant_p = 1;
908
909   if (GET_CODE (parm_insns) == NOTE
910       && NOTE_LINE_NUMBER (parm_insns) > 0)
911     {
912       rtx note = emit_note (NOTE_SOURCE_FILE (parm_insns),
913                             NOTE_LINE_NUMBER (parm_insns));
914       if (note)
915         RTX_INTEGRATED_P (note) = 1;
916     }
917
918   /* Process each argument.  For each, set up things so that the function's
919      reference to the argument will refer to the argument being passed.
920      We only replace REG with REG here.  Any simplifications are done
921      via const_equiv_map.
922
923      We make two passes:  In the first, we deal with parameters that will
924      be placed into registers, since we need to ensure that the allocated
925      register number fits in const_equiv_map.  Then we store all non-register
926      parameters into their memory location.  */
927
928   /* Don't try to free temp stack slots here, because we may put one of the
929      parameters into a temp stack slot.  */
930
931   for (i = 0; i < nargs; i++)
932     {
933       rtx copy = arg_vals[i];
934
935       loc = RTVEC_ELT (arg_vector, i);
936
937       /* There are three cases, each handled separately.  */
938       if (GET_CODE (loc) == MEM && GET_CODE (XEXP (loc, 0)) == REG
939           && REGNO (XEXP (loc, 0)) > LAST_VIRTUAL_REGISTER)
940         {
941           /* This must be an object passed by invisible reference (it could
942              also be a variable-sized object, but we forbid inlining functions
943              with variable-sized arguments).  COPY is the address of the
944              actual value (this computation will cause it to be copied).  We
945              map that address for the register, noting the actual address as
946              an equivalent in case it can be substituted into the insns.  */
947
948           if (GET_CODE (copy) != REG)
949             {
950               temp = copy_addr_to_reg (copy);
951               if (CONSTANT_P (copy) || FIXED_BASE_PLUS_P (copy))
952                 SET_CONST_EQUIV_DATA (map, temp, copy, CONST_AGE_PARM);
953               copy = temp;
954             }
955           map->reg_map[REGNO (XEXP (loc, 0))] = copy;
956         }
957       else if (GET_CODE (loc) == MEM)
958         {
959           /* This is the case of a parameter that lives in memory.  It
960              will live in the block we allocate in the called routine's
961              frame that simulates the incoming argument area.  Do nothing
962              with the parameter now; we will call store_expr later.  In
963              this case, however, we must ensure that the virtual stack and
964              incoming arg rtx values are expanded now so that we can be
965              sure we have enough slots in the const equiv map since the
966              store_expr call can easily blow the size estimate.  */
967           if (DECL_SAVED_INSNS (fndecl)->args_size != 0)
968             copy_rtx_and_substitute (virtual_incoming_args_rtx, map, 0);
969         }
970       else if (GET_CODE (loc) == REG)
971         process_reg_param (map, loc, copy);
972       else if (GET_CODE (loc) == CONCAT)
973         {
974           rtx locreal = gen_realpart (GET_MODE (XEXP (loc, 0)), loc);
975           rtx locimag = gen_imagpart (GET_MODE (XEXP (loc, 0)), loc);
976           rtx copyreal = gen_realpart (GET_MODE (locreal), copy);
977           rtx copyimag = gen_imagpart (GET_MODE (locimag), copy);
978
979           process_reg_param (map, locreal, copyreal);
980           process_reg_param (map, locimag, copyimag);
981         }
982       else
983         abort ();
984     }
985
986   /* Tell copy_rtx_and_substitute to handle constant pool SYMBOL_REFs
987      specially.  This function can be called recursively, so we need to
988      save the previous value.  */
989   inlining_previous = inlining;
990   inlining = inl_f;
991
992   /* Now do the parameters that will be placed in memory.  */
993
994   for (formal = DECL_ARGUMENTS (fndecl), i = 0;
995        formal; formal = TREE_CHAIN (formal), i++)
996     {
997       loc = RTVEC_ELT (arg_vector, i);
998
999       if (GET_CODE (loc) == MEM
1000           /* Exclude case handled above.  */
1001           && ! (GET_CODE (XEXP (loc, 0)) == REG
1002                 && REGNO (XEXP (loc, 0)) > LAST_VIRTUAL_REGISTER))
1003         {
1004           rtx note = emit_note (DECL_SOURCE_FILE (formal),
1005                                 DECL_SOURCE_LINE (formal));
1006           if (note)
1007             RTX_INTEGRATED_P (note) = 1;
1008
1009           /* Compute the address in the area we reserved and store the
1010              value there.  */
1011           temp = copy_rtx_and_substitute (loc, map, 1);
1012           subst_constants (&temp, NULL_RTX, map, 1);
1013           apply_change_group ();
1014           if (! memory_address_p (GET_MODE (temp), XEXP (temp, 0)))
1015             temp = change_address (temp, VOIDmode, XEXP (temp, 0));
1016           store_expr (arg_trees[i], temp, 0);
1017         }
1018     }
1019
1020   /* Deal with the places that the function puts its result.
1021      We are driven by what is placed into DECL_RESULT.
1022
1023      Initially, we assume that we don't have anything special handling for
1024      REG_FUNCTION_RETURN_VALUE_P.  */
1025
1026   map->inline_target = 0;
1027   loc = (DECL_RTL_SET_P (DECL_RESULT (fndecl)) 
1028          ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
1029
1030   if (TYPE_MODE (type) == VOIDmode)
1031     /* There is no return value to worry about.  */
1032     ;
1033   else if (GET_CODE (loc) == MEM)
1034     {
1035       if (GET_CODE (XEXP (loc, 0)) == ADDRESSOF)
1036         {
1037           temp = copy_rtx_and_substitute (loc, map, 1);
1038           subst_constants (&temp, NULL_RTX, map, 1);
1039           apply_change_group ();
1040           target = temp;
1041         }
1042       else
1043         {
1044           if (! structure_value_addr
1045               || ! aggregate_value_p (DECL_RESULT (fndecl)))
1046             abort ();
1047
1048           /* Pass the function the address in which to return a structure
1049              value.  Note that a constructor can cause someone to call us
1050              with STRUCTURE_VALUE_ADDR, but the initialization takes place
1051              via the first parameter, rather than the struct return address.
1052
1053              We have two cases: If the address is a simple register
1054              indirect, use the mapping mechanism to point that register to
1055              our structure return address.  Otherwise, store the structure
1056              return value into the place that it will be referenced from.  */
1057
1058           if (GET_CODE (XEXP (loc, 0)) == REG)
1059             {
1060               temp = force_operand (structure_value_addr, NULL_RTX);
1061               temp = force_reg (Pmode, temp);
1062               /* A virtual register might be invalid in an insn, because
1063                  it can cause trouble in reload.  Since we don't have access
1064                  to the expanders at map translation time, make sure we have
1065                  a proper register now.
1066                  If a virtual register is actually valid, cse or combine
1067                  can put it into the mapped insns.  */
1068               if (REGNO (temp) >= FIRST_VIRTUAL_REGISTER
1069                   && REGNO (temp) <= LAST_VIRTUAL_REGISTER)
1070               temp = copy_to_mode_reg (Pmode, temp);
1071               map->reg_map[REGNO (XEXP (loc, 0))] = temp;
1072
1073               if (CONSTANT_P (structure_value_addr)
1074                   || GET_CODE (structure_value_addr) == ADDRESSOF
1075                   || (GET_CODE (structure_value_addr) == PLUS
1076                       && (XEXP (structure_value_addr, 0)
1077                           == virtual_stack_vars_rtx)
1078                       && (GET_CODE (XEXP (structure_value_addr, 1))
1079                           == CONST_INT)))
1080                 {
1081                   SET_CONST_EQUIV_DATA (map, temp, structure_value_addr,
1082                                         CONST_AGE_PARM);
1083                 }
1084             }
1085           else
1086             {
1087               temp = copy_rtx_and_substitute (loc, map, 1);
1088               subst_constants (&temp, NULL_RTX, map, 0);
1089               apply_change_group ();
1090               emit_move_insn (temp, structure_value_addr);
1091             }
1092         }
1093     }
1094   else if (ignore)
1095     /* We will ignore the result value, so don't look at its structure.
1096        Note that preparations for an aggregate return value
1097        do need to be made (above) even if it will be ignored.  */
1098     ;
1099   else if (GET_CODE (loc) == REG)
1100     {
1101       /* The function returns an object in a register and we use the return
1102          value.  Set up our target for remapping.  */
1103
1104       /* Machine mode function was declared to return.  */
1105       enum machine_mode departing_mode = TYPE_MODE (type);
1106       /* (Possibly wider) machine mode it actually computes
1107          (for the sake of callers that fail to declare it right).
1108          We have to use the mode of the result's RTL, rather than
1109          its type, since expand_function_start may have promoted it.  */
1110       enum machine_mode arriving_mode
1111         = GET_MODE (DECL_RTL (DECL_RESULT (fndecl)));
1112       rtx reg_to_map;
1113
1114       /* Don't use MEMs as direct targets because on some machines
1115          substituting a MEM for a REG makes invalid insns.
1116          Let the combiner substitute the MEM if that is valid.  */
1117       if (target == 0 || GET_CODE (target) != REG
1118           || GET_MODE (target) != departing_mode)
1119         {
1120           /* Don't make BLKmode registers.  If this looks like
1121              a BLKmode object being returned in a register, get
1122              the mode from that, otherwise abort.  */
1123           if (departing_mode == BLKmode)
1124             {
1125               if (REG == GET_CODE (DECL_RTL (DECL_RESULT (fndecl))))
1126                 {
1127                   departing_mode = GET_MODE (DECL_RTL (DECL_RESULT (fndecl)));
1128                   arriving_mode = departing_mode;
1129                 }
1130               else
1131                 abort ();
1132             }
1133
1134           target = gen_reg_rtx (departing_mode);
1135         }
1136
1137       /* If function's value was promoted before return,
1138          avoid machine mode mismatch when we substitute INLINE_TARGET.
1139          But TARGET is what we will return to the caller.  */
1140       if (arriving_mode != departing_mode)
1141         {
1142           /* Avoid creating a paradoxical subreg wider than
1143              BITS_PER_WORD, since that is illegal.  */
1144           if (GET_MODE_BITSIZE (arriving_mode) > BITS_PER_WORD)
1145             {
1146               if (!TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (departing_mode),
1147                                           GET_MODE_BITSIZE (arriving_mode)))
1148                 /* Maybe could be handled by using convert_move () ?  */
1149                 abort ();
1150               reg_to_map = gen_reg_rtx (arriving_mode);
1151               target = gen_lowpart (departing_mode, reg_to_map);
1152             }
1153           else
1154             reg_to_map = gen_rtx_SUBREG (arriving_mode, target, 0);
1155         }
1156       else
1157         reg_to_map = target;
1158
1159       /* Usually, the result value is the machine's return register.
1160          Sometimes it may be a pseudo. Handle both cases.  */
1161       if (REG_FUNCTION_VALUE_P (loc))
1162         map->inline_target = reg_to_map;
1163       else
1164         map->reg_map[REGNO (loc)] = reg_to_map;
1165     }
1166   else if (GET_CODE (loc) == CONCAT)
1167     {
1168       enum machine_mode departing_mode = TYPE_MODE (type);
1169       enum machine_mode arriving_mode
1170         = GET_MODE (DECL_RTL (DECL_RESULT (fndecl)));
1171
1172       if (departing_mode != arriving_mode)
1173         abort ();
1174       if (GET_CODE (XEXP (loc, 0)) != REG
1175           || GET_CODE (XEXP (loc, 1)) != REG)
1176         abort ();
1177
1178       /* Don't use MEMs as direct targets because on some machines
1179          substituting a MEM for a REG makes invalid insns.
1180          Let the combiner substitute the MEM if that is valid.  */
1181       if (target == 0 || GET_CODE (target) != REG
1182           || GET_MODE (target) != departing_mode)
1183         target = gen_reg_rtx (departing_mode);
1184
1185       if (GET_CODE (target) != CONCAT)
1186         abort ();
1187
1188       map->reg_map[REGNO (XEXP (loc, 0))] = XEXP (target, 0);
1189       map->reg_map[REGNO (XEXP (loc, 1))] = XEXP (target, 1);
1190     }
1191   else
1192     abort ();
1193
1194   /* Remap the exception handler data pointer from one to the other.  */
1195   temp = get_exception_pointer (inl_f);
1196   if (temp)
1197     map->reg_map[REGNO (temp)] = get_exception_pointer (cfun);
1198
1199   /* Initialize label_map.  get_label_from_map will actually make
1200      the labels.  */
1201   memset ((char *) &map->label_map[min_labelno], 0,
1202          (max_labelno - min_labelno) * sizeof (rtx));
1203
1204   /* Make copies of the decls of the symbols in the inline function, so that
1205      the copies of the variables get declared in the current function.  Set
1206      up things so that lookup_static_chain knows that to interpret registers
1207      in SAVE_EXPRs for TYPE_SIZEs as local.  */
1208   inline_function_decl = fndecl;
1209   integrate_parm_decls (DECL_ARGUMENTS (fndecl), map, arg_vector);
1210   block = integrate_decl_tree (inl_f->original_decl_initial, map);
1211   BLOCK_ABSTRACT_ORIGIN (block) = DECL_ORIGIN (fndecl);
1212   inline_function_decl = 0;
1213
1214   /* Make a fresh binding contour that we can easily remove.  Do this after
1215      expanding our arguments so cleanups are properly scoped.  */
1216   expand_start_bindings_and_block (0, block);
1217
1218   /* Sort the block-map so that it will be easy to find remapped
1219      blocks later.  */
1220   qsort (&VARRAY_TREE (map->block_map, 0),
1221          map->block_map->elements_used,
1222          sizeof (tree),
1223          compare_blocks);
1224
1225   /* Perform postincrements before actually calling the function.  */
1226   emit_queue ();
1227
1228   /* Clean up stack so that variables might have smaller offsets.  */
1229   do_pending_stack_adjust ();
1230
1231   /* Save a copy of the location of const_equiv_varray for
1232      mark_stores, called via note_stores.  */
1233   global_const_equiv_varray = map->const_equiv_varray;
1234
1235   /* If the called function does an alloca, save and restore the
1236      stack pointer around the call.  This saves stack space, but
1237      also is required if this inline is being done between two
1238      pushes.  */
1239   if (inl_f->calls_alloca)
1240     emit_stack_save (SAVE_BLOCK, &stack_save, NULL_RTX);
1241
1242   /* Map pseudos used for initial hard reg values.  */
1243   setup_initial_hard_reg_value_integration (inl_f, map);
1244
1245   /* Now copy the insns one by one.  */
1246   copy_insn_list (insns, map, static_chain_value);
1247
1248   /* Duplicate the EH regions.  This will create an offset from the
1249      region numbers in the function we're inlining to the region
1250      numbers in the calling function.  This must wait until after
1251      copy_insn_list, as we need the insn map to be complete.  */
1252   eh_region_offset = duplicate_eh_regions (inl_f, map);
1253
1254   /* Now copy the REG_NOTES for those insns.  */
1255   copy_insn_notes (insns, map, eh_region_offset);
1256
1257   /* If the insn sequence required one, emit the return label.  */
1258   if (map->local_return_label)
1259     emit_label (map->local_return_label);
1260
1261   /* Restore the stack pointer if we saved it above.  */
1262   if (inl_f->calls_alloca)
1263     emit_stack_restore (SAVE_BLOCK, stack_save, NULL_RTX);
1264
1265   if (! cfun->x_whole_function_mode_p)
1266     /* In statement-at-a-time mode, we just tell the front-end to add
1267        this block to the list of blocks at this binding level.  We
1268        can't do it the way it's done for function-at-a-time mode the
1269        superblocks have not been created yet.  */
1270     (*lang_hooks.decls.insert_block) (block);
1271   else
1272     {
1273       BLOCK_CHAIN (block)
1274         = BLOCK_CHAIN (DECL_INITIAL (current_function_decl));
1275       BLOCK_CHAIN (DECL_INITIAL (current_function_decl)) = block;
1276     }
1277
1278   /* End the scope containing the copied formal parameter variables
1279      and copied LABEL_DECLs.  We pass NULL_TREE for the variables list
1280      here so that expand_end_bindings will not check for unused
1281      variables.  That's already been checked for when the inlined
1282      function was defined.  */
1283   expand_end_bindings (NULL_TREE, 1, 1);
1284
1285   /* Must mark the line number note after inlined functions as a repeat, so
1286      that the test coverage code can avoid counting the call twice.  This
1287      just tells the code to ignore the immediately following line note, since
1288      there already exists a copy of this note before the expanded inline call.
1289      This line number note is still needed for debugging though, so we can't
1290      delete it.  */
1291   if (flag_test_coverage)
1292     emit_note (0, NOTE_INSN_REPEATED_LINE_NUMBER);
1293
1294   emit_line_note (input_filename, lineno);
1295
1296   /* If the function returns a BLKmode object in a register, copy it
1297      out of the temp register into a BLKmode memory object.  */
1298   if (target
1299       && TYPE_MODE (TREE_TYPE (TREE_TYPE (fndecl))) == BLKmode
1300       && ! aggregate_value_p (TREE_TYPE (TREE_TYPE (fndecl))))
1301     target = copy_blkmode_from_reg (0, target, TREE_TYPE (TREE_TYPE (fndecl)));
1302
1303   if (structure_value_addr)
1304     {
1305       target = gen_rtx_MEM (TYPE_MODE (type),
1306                             memory_address (TYPE_MODE (type),
1307                                             structure_value_addr));
1308       set_mem_attributes (target, type, 1);
1309     }
1310
1311   /* Make sure we free the things we explicitly allocated with xmalloc.  */
1312   if (real_label_map)
1313     free (real_label_map);
1314   VARRAY_FREE (map->const_equiv_varray);
1315   free (map->reg_map);
1316   free (map->insn_map);
1317   free (map);
1318   free (arg_vals);
1319   free (arg_trees);
1320
1321   inlining = inlining_previous;
1322
1323   return target;
1324 }
1325
1326 /* Make copies of each insn in the given list using the mapping
1327    computed in expand_inline_function. This function may call itself for
1328    insns containing sequences.
1329
1330    Copying is done in two passes, first the insns and then their REG_NOTES.
1331
1332    If static_chain_value is nonzero, it represents the context-pointer
1333    register for the function.  */
1334
1335 static void
1336 copy_insn_list (insns, map, static_chain_value)
1337      rtx insns;
1338      struct inline_remap *map;
1339      rtx static_chain_value;
1340 {
1341   int i;
1342   rtx insn;
1343   rtx temp;
1344 #ifdef HAVE_cc0
1345   rtx cc0_insn = 0;
1346 #endif
1347   rtx static_chain_mem = 0;
1348
1349   /* Copy the insns one by one.  Do this in two passes, first the insns and
1350      then their REG_NOTES.  */
1351
1352   /* This loop is very similar to the loop in copy_loop_body in unroll.c.  */
1353
1354   for (insn = insns; insn; insn = NEXT_INSN (insn))
1355     {
1356       rtx copy, pattern, set;
1357
1358       map->orig_asm_operands_vector = 0;
1359
1360       switch (GET_CODE (insn))
1361         {
1362         case INSN:
1363           pattern = PATTERN (insn);
1364           set = single_set (insn);
1365           copy = 0;
1366           if (GET_CODE (pattern) == USE
1367               && GET_CODE (XEXP (pattern, 0)) == REG
1368               && REG_FUNCTION_VALUE_P (XEXP (pattern, 0)))
1369             /* The (USE (REG n)) at return from the function should
1370                be ignored since we are changing (REG n) into
1371                inline_target.  */
1372             break;
1373
1374           /* Ignore setting a function value that we don't want to use.  */
1375           if (map->inline_target == 0
1376               && set != 0
1377               && GET_CODE (SET_DEST (set)) == REG
1378               && REG_FUNCTION_VALUE_P (SET_DEST (set)))
1379             {
1380               if (volatile_refs_p (SET_SRC (set)))
1381                 {
1382                   rtx new_set;
1383
1384                   /* If we must not delete the source,
1385                      load it into a new temporary.  */
1386                   copy = emit_insn (copy_rtx_and_substitute (pattern, map, 0));
1387
1388                   new_set = single_set (copy);
1389                   if (new_set == 0)
1390                     abort ();
1391
1392                   SET_DEST (new_set)
1393                     = gen_reg_rtx (GET_MODE (SET_DEST (new_set)));
1394                 }
1395               /* If the source and destination are the same and it
1396                  has a note on it, keep the insn.  */
1397               else if (rtx_equal_p (SET_DEST (set), SET_SRC (set))
1398                        && REG_NOTES (insn) != 0)
1399                 copy = emit_insn (copy_rtx_and_substitute (pattern, map, 0));
1400               else
1401                 break;
1402             }
1403
1404           /* Similarly if an ignored return value is clobbered.  */
1405           else if (map->inline_target == 0
1406                    && GET_CODE (pattern) == CLOBBER
1407                    && GET_CODE (XEXP (pattern, 0)) == REG
1408                    && REG_FUNCTION_VALUE_P (XEXP (pattern, 0)))
1409             break;
1410
1411           /* Look for the address of the static chain slot. The
1412              rtx_equal_p comparisons against the
1413              static_chain_incoming_rtx below may fail if the static
1414              chain is in memory and the address specified is not
1415              "legitimate".  This happens on Xtensa where the static
1416              chain is at a negative offset from argp and where only
1417              positive offsets are legitimate.  When the RTL is
1418              generated, the address is "legitimized" by copying it
1419              into a register, causing the rtx_equal_p comparisons to
1420              fail.  This workaround looks for code that sets a
1421              register to the address of the static chain.  Subsequent
1422              memory references via that register can then be
1423              identified as static chain references.  We assume that
1424              the register is only assigned once, and that the static
1425              chain address is only live in one register at a time.  */
1426
1427           else if (static_chain_value != 0
1428                    && set != 0
1429                    && GET_CODE (static_chain_incoming_rtx) == MEM
1430                    && GET_CODE (SET_DEST (set)) == REG
1431                    && rtx_equal_p (SET_SRC (set),
1432                                    XEXP (static_chain_incoming_rtx, 0)))
1433             {
1434               static_chain_mem =
1435                   gen_rtx_MEM (GET_MODE (static_chain_incoming_rtx),
1436                                SET_DEST (set));
1437
1438               /* emit the instruction in case it is used for something
1439                  other than setting the static chain; if it's not used,
1440                  it can always be removed as dead code */
1441               copy = emit_insn (copy_rtx_and_substitute (pattern, map, 0));
1442             }
1443
1444           /* If this is setting the static chain rtx, omit it.  */
1445           else if (static_chain_value != 0
1446                    && set != 0
1447                    && (rtx_equal_p (SET_DEST (set),
1448                                     static_chain_incoming_rtx)
1449                        || (static_chain_mem
1450                            && rtx_equal_p (SET_DEST (set), static_chain_mem))))
1451             break;
1452
1453           /* If this is setting the static chain pseudo, set it from
1454              the value we want to give it instead.  */
1455           else if (static_chain_value != 0
1456                    && set != 0
1457                    && (rtx_equal_p (SET_SRC (set),
1458                                     static_chain_incoming_rtx)
1459                        || (static_chain_mem
1460                            && rtx_equal_p (SET_SRC (set), static_chain_mem))))
1461             {
1462               rtx newdest = copy_rtx_and_substitute (SET_DEST (set), map, 1);
1463
1464               copy = emit_move_insn (newdest, static_chain_value);
1465               if (GET_CODE (static_chain_incoming_rtx) != MEM)
1466                 static_chain_value = 0;
1467             }
1468
1469           /* If this is setting the virtual stack vars register, this must
1470              be the code at the handler for a builtin longjmp.  The value
1471              saved in the setjmp buffer will be the address of the frame
1472              we've made for this inlined instance within our frame.  But we
1473              know the offset of that value so we can use it to reconstruct
1474              our virtual stack vars register from that value.  If we are
1475              copying it from the stack pointer, leave it unchanged.  */
1476           else if (set != 0
1477                    && rtx_equal_p (SET_DEST (set), virtual_stack_vars_rtx))
1478             {
1479               HOST_WIDE_INT offset;
1480               temp = map->reg_map[REGNO (SET_DEST (set))];
1481               temp = VARRAY_CONST_EQUIV (map->const_equiv_varray,
1482                                          REGNO (temp)).rtx;
1483
1484               if (rtx_equal_p (temp, virtual_stack_vars_rtx))
1485                 offset = 0;
1486               else if (GET_CODE (temp) == PLUS
1487                        && rtx_equal_p (XEXP (temp, 0), virtual_stack_vars_rtx)
1488                        && GET_CODE (XEXP (temp, 1)) == CONST_INT)
1489                 offset = INTVAL (XEXP (temp, 1));
1490               else
1491                 abort ();
1492
1493               if (rtx_equal_p (SET_SRC (set), stack_pointer_rtx))
1494                 temp = SET_SRC (set);
1495               else
1496                 temp = force_operand (plus_constant (SET_SRC (set),
1497                                                      - offset),
1498                                       NULL_RTX);
1499
1500               copy = emit_move_insn (virtual_stack_vars_rtx, temp);
1501             }
1502
1503           else
1504             copy = emit_insn (copy_rtx_and_substitute (pattern, map, 0));
1505           /* REG_NOTES will be copied later.  */
1506
1507 #ifdef HAVE_cc0
1508           /* If this insn is setting CC0, it may need to look at
1509              the insn that uses CC0 to see what type of insn it is.
1510              In that case, the call to recog via validate_change will
1511              fail.  So don't substitute constants here.  Instead,
1512              do it when we emit the following insn.
1513
1514              For example, see the pyr.md file.  That machine has signed and
1515              unsigned compares.  The compare patterns must check the
1516              following branch insn to see which what kind of compare to
1517              emit.
1518
1519              If the previous insn set CC0, substitute constants on it as
1520              well.  */
1521           if (sets_cc0_p (PATTERN (copy)) != 0)
1522             cc0_insn = copy;
1523           else
1524             {
1525               if (cc0_insn)
1526                 try_constants (cc0_insn, map);
1527               cc0_insn = 0;
1528               try_constants (copy, map);
1529             }
1530 #else
1531           try_constants (copy, map);
1532 #endif
1533           INSN_SCOPE (copy) = INSN_SCOPE (insn);
1534           break;
1535
1536         case JUMP_INSN:
1537           if (map->integrating && returnjump_p (insn))
1538             {
1539               if (map->local_return_label == 0)
1540                 map->local_return_label = gen_label_rtx ();
1541               pattern = gen_jump (map->local_return_label);
1542             }
1543           else
1544             pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
1545
1546           copy = emit_jump_insn (pattern);
1547
1548 #ifdef HAVE_cc0
1549           if (cc0_insn)
1550             try_constants (cc0_insn, map);
1551           cc0_insn = 0;
1552 #endif
1553           try_constants (copy, map);
1554           INSN_SCOPE (copy) = INSN_SCOPE (insn);
1555
1556           /* If this used to be a conditional jump insn but whose branch
1557              direction is now know, we must do something special.  */
1558           if (any_condjump_p (insn) && onlyjump_p (insn) && map->last_pc_value)
1559             {
1560 #ifdef HAVE_cc0
1561               /* If the previous insn set cc0 for us, delete it.  */
1562               if (only_sets_cc0_p (PREV_INSN (copy)))
1563                 delete_related_insns (PREV_INSN (copy));
1564 #endif
1565
1566               /* If this is now a no-op, delete it.  */
1567               if (map->last_pc_value == pc_rtx)
1568                 {
1569                   delete_related_insns (copy);
1570                   copy = 0;
1571                 }
1572               else
1573                 /* Otherwise, this is unconditional jump so we must put a
1574                    BARRIER after it.  We could do some dead code elimination
1575                    here, but jump.c will do it just as well.  */
1576                 emit_barrier ();
1577             }
1578           break;
1579
1580         case CALL_INSN:
1581           /* If this is a CALL_PLACEHOLDER insn then we need to copy the
1582              three attached sequences: normal call, sibling call and tail
1583              recursion.  */
1584           if (GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
1585             {
1586               rtx sequence[3];
1587               rtx tail_label;
1588
1589               for (i = 0; i < 3; i++)
1590                 {
1591                   rtx seq;
1592
1593                   sequence[i] = NULL_RTX;
1594                   seq = XEXP (PATTERN (insn), i);
1595                   if (seq)
1596                     {
1597                       start_sequence ();
1598                       copy_insn_list (seq, map, static_chain_value);
1599                       sequence[i] = get_insns ();
1600                       end_sequence ();
1601                     }
1602                 }
1603
1604               /* Find the new tail recursion label.
1605                  It will already be substituted into sequence[2].  */
1606               tail_label = copy_rtx_and_substitute (XEXP (PATTERN (insn), 3),
1607                                                     map, 0);
1608
1609               copy = emit_call_insn (gen_rtx_CALL_PLACEHOLDER (VOIDmode,
1610                                                                sequence[0],
1611                                                                sequence[1],
1612                                                                sequence[2],
1613                                                                tail_label));
1614               break;
1615             }
1616
1617           pattern = copy_rtx_and_substitute (PATTERN (insn), map, 0);
1618           copy = emit_call_insn (pattern);
1619
1620           SIBLING_CALL_P (copy) = SIBLING_CALL_P (insn);
1621           CONST_OR_PURE_CALL_P (copy) = CONST_OR_PURE_CALL_P (insn);
1622           INSN_SCOPE (copy) = INSN_SCOPE (insn);
1623
1624           /* Because the USAGE information potentially contains objects other
1625              than hard registers, we need to copy it.  */
1626
1627           CALL_INSN_FUNCTION_USAGE (copy)
1628             = copy_rtx_and_substitute (CALL_INSN_FUNCTION_USAGE (insn),
1629                                        map, 0);
1630
1631 #ifdef HAVE_cc0
1632           if (cc0_insn)
1633             try_constants (cc0_insn, map);
1634           cc0_insn = 0;
1635 #endif
1636           try_constants (copy, map);
1637
1638           /* Be lazy and assume CALL_INSNs clobber all hard registers.  */
1639           for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1640             VARRAY_CONST_EQUIV (map->const_equiv_varray, i).rtx = 0;
1641           break;
1642
1643         case CODE_LABEL:
1644           copy = emit_label (get_label_from_map (map,
1645                                                  CODE_LABEL_NUMBER (insn)));
1646           LABEL_NAME (copy) = LABEL_NAME (insn);
1647           map->const_age++;
1648           break;
1649
1650         case BARRIER:
1651           copy = emit_barrier ();
1652           break;
1653
1654         case NOTE:
1655           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_DELETED_LABEL)
1656             {
1657               copy = emit_label (get_label_from_map (map,
1658                                                     CODE_LABEL_NUMBER (insn)));
1659               LABEL_NAME (copy) = NOTE_SOURCE_FILE (insn);
1660               map->const_age++;
1661               break;
1662             }
1663
1664           /* NOTE_INSN_FUNCTION_END and NOTE_INSN_FUNCTION_BEG are
1665              discarded because it is important to have only one of
1666              each in the current function.
1667
1668              NOTE_INSN_DELETED notes aren't useful.  */
1669
1670           if (NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_END
1671               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_BEG
1672               && NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED)
1673             {
1674               copy = emit_note (NOTE_SOURCE_FILE (insn),
1675                                 NOTE_LINE_NUMBER (insn));
1676               if (copy
1677                   && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_BLOCK_BEG
1678                       || NOTE_LINE_NUMBER (copy) == NOTE_INSN_BLOCK_END)
1679                   && NOTE_BLOCK (insn))
1680                 {
1681                   tree *mapped_block_p;
1682
1683                   mapped_block_p
1684                     = (tree *) bsearch (NOTE_BLOCK (insn),
1685                                         &VARRAY_TREE (map->block_map, 0),
1686                                         map->block_map->elements_used,
1687                                         sizeof (tree),
1688                                         find_block);
1689
1690                   if (!mapped_block_p)
1691                     abort ();
1692                   else
1693                     NOTE_BLOCK (copy) = *mapped_block_p;
1694                 }
1695               else if (copy
1696                        && NOTE_LINE_NUMBER (copy) == NOTE_INSN_EXPECTED_VALUE)
1697                 NOTE_EXPECTED_VALUE (copy)
1698                   = copy_rtx_and_substitute (NOTE_EXPECTED_VALUE (insn),
1699                                              map, 0);
1700             }
1701           else
1702             copy = 0;
1703           break;
1704
1705         default:
1706           abort ();
1707         }
1708
1709       if (copy)
1710         RTX_INTEGRATED_P (copy) = 1;
1711
1712       map->insn_map[INSN_UID (insn)] = copy;
1713     }
1714 }
1715
1716 /* Copy the REG_NOTES.  Increment const_age, so that only constants
1717    from parameters can be substituted in.  These are the only ones
1718    that are valid across the entire function.  */
1719
1720 static void
1721 copy_insn_notes (insns, map, eh_region_offset)
1722      rtx insns;
1723      struct inline_remap *map;
1724      int eh_region_offset;
1725 {
1726   rtx insn, new_insn;
1727
1728   map->const_age++;
1729   for (insn = insns; insn; insn = NEXT_INSN (insn))
1730     {
1731       if (! INSN_P (insn))
1732         continue;
1733
1734       new_insn = map->insn_map[INSN_UID (insn)];
1735       if (! new_insn)
1736         continue;
1737
1738       if (REG_NOTES (insn))
1739         {
1740           rtx next, note = copy_rtx_and_substitute (REG_NOTES (insn), map, 0);
1741
1742           /* We must also do subst_constants, in case one of our parameters
1743              has const type and constant value.  */
1744           subst_constants (&note, NULL_RTX, map, 0);
1745           apply_change_group ();
1746           REG_NOTES (new_insn) = note;
1747
1748           /* Delete any REG_LABEL notes from the chain.  Remap any
1749              REG_EH_REGION notes.  */
1750           for (; note; note = next)
1751             {
1752               next = XEXP (note, 1);
1753               if (REG_NOTE_KIND (note) == REG_LABEL)
1754                 remove_note (new_insn, note);
1755               else if (REG_NOTE_KIND (note) == REG_EH_REGION
1756                        && INTVAL (XEXP (note, 0)) > 0)
1757                 XEXP (note, 0) = GEN_INT (INTVAL (XEXP (note, 0))
1758                                           + eh_region_offset);
1759             }
1760         }
1761
1762       if (GET_CODE (insn) == CALL_INSN
1763           && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
1764         {
1765           int i;
1766           for (i = 0; i < 3; i++)
1767             copy_insn_notes (XEXP (PATTERN (insn), i), map, eh_region_offset);
1768         }
1769
1770       if (GET_CODE (insn) == JUMP_INSN
1771           && GET_CODE (PATTERN (insn)) == RESX)
1772         XINT (PATTERN (new_insn), 0) += eh_region_offset;
1773     }
1774 }
1775 \f
1776 /* Given a chain of PARM_DECLs, ARGS, copy each decl into a VAR_DECL,
1777    push all of those decls and give each one the corresponding home.  */
1778
1779 static void
1780 integrate_parm_decls (args, map, arg_vector)
1781      tree args;
1782      struct inline_remap *map;
1783      rtvec arg_vector;
1784 {
1785   tree tail;
1786   int i;
1787
1788   for (tail = args, i = 0; tail; tail = TREE_CHAIN (tail), i++)
1789     {
1790       tree decl = copy_decl_for_inlining (tail, map->fndecl,
1791                                           current_function_decl);
1792       rtx new_decl_rtl
1793         = copy_rtx_and_substitute (RTVEC_ELT (arg_vector, i), map, 1);
1794
1795       /* We really should be setting DECL_INCOMING_RTL to something reasonable
1796          here, but that's going to require some more work.  */
1797       /* DECL_INCOMING_RTL (decl) = ?; */
1798       /* Fully instantiate the address with the equivalent form so that the
1799          debugging information contains the actual register, instead of the
1800          virtual register.   Do this by not passing an insn to
1801          subst_constants.  */
1802       subst_constants (&new_decl_rtl, NULL_RTX, map, 1);
1803       apply_change_group ();
1804       SET_DECL_RTL (decl, new_decl_rtl);
1805     }
1806 }
1807
1808 /* Given a BLOCK node LET, push decls and levels so as to construct in the
1809    current function a tree of contexts isomorphic to the one that is given.
1810
1811    MAP, if nonzero, is a pointer to an inline_remap map which indicates how
1812    registers used in the DECL_RTL field should be remapped.  If it is zero,
1813    no mapping is necessary.  */
1814
1815 static tree
1816 integrate_decl_tree (let, map)
1817      tree let;
1818      struct inline_remap *map;
1819 {
1820   tree t;
1821   tree new_block;
1822   tree *next;
1823
1824   new_block = make_node (BLOCK);
1825   VARRAY_PUSH_TREE (map->block_map, new_block);
1826   next = &BLOCK_VARS (new_block);
1827
1828   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
1829     {
1830       tree d;
1831
1832       d = copy_decl_for_inlining (t, map->fndecl, current_function_decl);
1833
1834       if (DECL_RTL_SET_P (t))
1835         {
1836           rtx r;
1837
1838           SET_DECL_RTL (d, copy_rtx_and_substitute (DECL_RTL (t), map, 1));
1839
1840           /* Fully instantiate the address with the equivalent form so that the
1841              debugging information contains the actual register, instead of the
1842              virtual register.   Do this by not passing an insn to
1843              subst_constants.  */
1844           r = DECL_RTL (d);
1845           subst_constants (&r, NULL_RTX, map, 1);
1846           SET_DECL_RTL (d, r);
1847
1848           apply_change_group ();
1849         }
1850
1851       /* Add this declaration to the list of variables in the new
1852          block.  */
1853       *next = d;
1854       next = &TREE_CHAIN (d);
1855     }
1856
1857   next = &BLOCK_SUBBLOCKS (new_block);
1858   for (t = BLOCK_SUBBLOCKS (let); t; t = BLOCK_CHAIN (t))
1859     {
1860       *next = integrate_decl_tree (t, map);
1861       BLOCK_SUPERCONTEXT (*next) = new_block;
1862       next = &BLOCK_CHAIN (*next);
1863     }
1864
1865   TREE_USED (new_block) = TREE_USED (let);
1866   BLOCK_ABSTRACT_ORIGIN (new_block) = let;
1867
1868   return new_block;
1869 }
1870 \f
1871 /* Create a new copy of an rtx. Recursively copies the operands of the rtx,
1872    except for those few rtx codes that are sharable.
1873
1874    We always return an rtx that is similar to that incoming rtx, with the
1875    exception of possibly changing a REG to a SUBREG or vice versa.  No
1876    rtl is ever emitted.
1877
1878    If FOR_LHS is nonzero, if means we are processing something that will
1879    be the LHS of a SET.  In that case, we copy RTX_UNCHANGING_P even if
1880    inlining since we need to be conservative in how it is set for
1881    such cases.
1882
1883    Handle constants that need to be placed in the constant pool by
1884    calling `force_const_mem'.  */
1885
1886 rtx
1887 copy_rtx_and_substitute (orig, map, for_lhs)
1888      rtx orig;
1889      struct inline_remap *map;
1890      int for_lhs;
1891 {
1892   rtx copy, temp;
1893   int i, j;
1894   RTX_CODE code;
1895   enum machine_mode mode;
1896   const char *format_ptr;
1897   int regno;
1898
1899   if (orig == 0)
1900     return 0;
1901
1902   code = GET_CODE (orig);
1903   mode = GET_MODE (orig);
1904
1905   switch (code)
1906     {
1907     case REG:
1908       /* If the stack pointer register shows up, it must be part of
1909          stack-adjustments (*not* because we eliminated the frame pointer!).
1910          Small hard registers are returned as-is.  Pseudo-registers
1911          go through their `reg_map'.  */
1912       regno = REGNO (orig);
1913       if (regno <= LAST_VIRTUAL_REGISTER
1914           || (map->integrating
1915               && DECL_SAVED_INSNS (map->fndecl)->internal_arg_pointer == orig))
1916         {
1917           /* Some hard registers are also mapped,
1918              but others are not translated.  */
1919           if (map->reg_map[regno] != 0)
1920             return map->reg_map[regno];
1921
1922           /* If this is the virtual frame pointer, make space in current
1923              function's stack frame for the stack frame of the inline function.
1924
1925              Copy the address of this area into a pseudo.  Map
1926              virtual_stack_vars_rtx to this pseudo and set up a constant
1927              equivalence for it to be the address.  This will substitute the
1928              address into insns where it can be substituted and use the new
1929              pseudo where it can't.  */
1930           else if (regno == VIRTUAL_STACK_VARS_REGNUM)
1931             {
1932               rtx loc, seq;
1933               int size = get_func_frame_size (DECL_SAVED_INSNS (map->fndecl));
1934 #ifdef FRAME_GROWS_DOWNWARD
1935               int alignment
1936                 = (DECL_SAVED_INSNS (map->fndecl)->stack_alignment_needed
1937                    / BITS_PER_UNIT);
1938
1939               /* In this case, virtual_stack_vars_rtx points to one byte
1940                  higher than the top of the frame area.  So make sure we
1941                  allocate a big enough chunk to keep the frame pointer
1942                  aligned like a real one.  */
1943               if (alignment)
1944                 size = CEIL_ROUND (size, alignment);
1945 #endif
1946               start_sequence ();
1947               loc = assign_stack_temp (BLKmode, size, 1);
1948               loc = XEXP (loc, 0);
1949 #ifdef FRAME_GROWS_DOWNWARD
1950               /* In this case, virtual_stack_vars_rtx points to one byte
1951                  higher than the top of the frame area.  So compute the offset
1952                  to one byte higher than our substitute frame.  */
1953               loc = plus_constant (loc, size);
1954 #endif
1955               map->reg_map[regno] = temp
1956                 = force_reg (Pmode, force_operand (loc, NULL_RTX));
1957
1958 #ifdef STACK_BOUNDARY
1959               mark_reg_pointer (map->reg_map[regno], STACK_BOUNDARY);
1960 #endif
1961
1962               SET_CONST_EQUIV_DATA (map, temp, loc, CONST_AGE_PARM);
1963
1964               seq = get_insns ();
1965               end_sequence ();
1966               emit_insn_after (seq, map->insns_at_start);
1967               return temp;
1968             }
1969           else if (regno == VIRTUAL_INCOMING_ARGS_REGNUM
1970                    || (map->integrating
1971                        && (DECL_SAVED_INSNS (map->fndecl)->internal_arg_pointer
1972                            == orig)))
1973             {
1974               /* Do the same for a block to contain any arguments referenced
1975                  in memory.  */
1976               rtx loc, seq;
1977               int size = DECL_SAVED_INSNS (map->fndecl)->args_size;
1978
1979               start_sequence ();
1980               loc = assign_stack_temp (BLKmode, size, 1);
1981               loc = XEXP (loc, 0);
1982               /* When arguments grow downward, the virtual incoming
1983                  args pointer points to the top of the argument block,
1984                  so the remapped location better do the same.  */
1985 #ifdef ARGS_GROW_DOWNWARD
1986               loc = plus_constant (loc, size);
1987 #endif
1988               map->reg_map[regno] = temp
1989                 = force_reg (Pmode, force_operand (loc, NULL_RTX));
1990
1991 #ifdef STACK_BOUNDARY
1992               mark_reg_pointer (map->reg_map[regno], STACK_BOUNDARY);
1993 #endif
1994
1995               SET_CONST_EQUIV_DATA (map, temp, loc, CONST_AGE_PARM);
1996
1997               seq = get_insns ();
1998               end_sequence ();
1999               emit_insn_after (seq, map->insns_at_start);
2000               return temp;
2001             }
2002           else if (REG_FUNCTION_VALUE_P (orig))
2003             {
2004               /* This is a reference to the function return value.  If
2005                  the function doesn't have a return value, error.  If the
2006                  mode doesn't agree, and it ain't BLKmode, make a SUBREG.  */
2007               if (map->inline_target == 0)
2008                 {
2009                   if (rtx_equal_function_value_matters)
2010                     /* This is an ignored return value.  We must not
2011                        leave it in with REG_FUNCTION_VALUE_P set, since
2012                        that would confuse subsequent inlining of the
2013                        current function into a later function.  */
2014                     return gen_rtx_REG (GET_MODE (orig), regno);
2015                   else
2016                     /* Must be unrolling loops or replicating code if we
2017                        reach here, so return the register unchanged.  */
2018                     return orig;
2019                 }
2020               else if (GET_MODE (map->inline_target) != BLKmode
2021                        && mode != GET_MODE (map->inline_target))
2022                 return gen_lowpart (mode, map->inline_target);
2023               else
2024                 return map->inline_target;
2025             }
2026 #if defined (LEAF_REGISTERS) && defined (LEAF_REG_REMAP)
2027           /* If leaf_renumber_regs_insn() might remap this register to
2028              some other number, make sure we don't share it with the
2029              inlined function, otherwise delayed optimization of the
2030              inlined function may change it in place, breaking our
2031              reference to it.  We may still shared it within the
2032              function, so create an entry for this register in the
2033              reg_map.  */
2034           if (map->integrating && regno < FIRST_PSEUDO_REGISTER
2035               && LEAF_REGISTERS[regno] && LEAF_REG_REMAP (regno) != regno)
2036             {
2037               if (!map->leaf_reg_map[regno][mode])
2038                 map->leaf_reg_map[regno][mode] = gen_rtx_REG (mode, regno);
2039               return map->leaf_reg_map[regno][mode]; 
2040             }
2041 #endif
2042           else
2043             return orig;
2044
2045           abort ();
2046         }
2047       if (map->reg_map[regno] == NULL)
2048         {
2049           map->reg_map[regno] = gen_reg_rtx (mode);
2050           REG_USERVAR_P (map->reg_map[regno]) = REG_USERVAR_P (orig);
2051           REG_LOOP_TEST_P (map->reg_map[regno]) = REG_LOOP_TEST_P (orig);
2052           RTX_UNCHANGING_P (map->reg_map[regno]) = RTX_UNCHANGING_P (orig);
2053           /* A reg with REG_FUNCTION_VALUE_P true will never reach here.  */
2054
2055           if (REG_POINTER (map->x_regno_reg_rtx[regno]))
2056             mark_reg_pointer (map->reg_map[regno],
2057                               map->regno_pointer_align[regno]);
2058         }
2059       return map->reg_map[regno];
2060
2061     case SUBREG:
2062       copy = copy_rtx_and_substitute (SUBREG_REG (orig), map, for_lhs);
2063       return simplify_gen_subreg (GET_MODE (orig), copy,
2064                                   GET_MODE (SUBREG_REG (orig)),
2065                                   SUBREG_BYTE (orig));
2066
2067     case ADDRESSOF:
2068       copy = gen_rtx_ADDRESSOF (mode,
2069                                 copy_rtx_and_substitute (XEXP (orig, 0),
2070                                                          map, for_lhs),
2071                                 0, ADDRESSOF_DECL (orig));
2072       regno = ADDRESSOF_REGNO (orig);
2073       if (map->reg_map[regno])
2074         regno = REGNO (map->reg_map[regno]);
2075       else if (regno > LAST_VIRTUAL_REGISTER)
2076         {
2077           temp = XEXP (orig, 0);
2078           map->reg_map[regno] = gen_reg_rtx (GET_MODE (temp));
2079           REG_USERVAR_P (map->reg_map[regno]) = REG_USERVAR_P (temp);
2080           REG_LOOP_TEST_P (map->reg_map[regno]) = REG_LOOP_TEST_P (temp);
2081           RTX_UNCHANGING_P (map->reg_map[regno]) = RTX_UNCHANGING_P (temp);
2082           /* A reg with REG_FUNCTION_VALUE_P true will never reach here.  */
2083
2084           /* Objects may initially be represented as registers, but
2085              but turned into a MEM if their address is taken by
2086              put_var_into_stack.  Therefore, the register table may have
2087              entries which are MEMs.
2088
2089              We briefly tried to clear such entries, but that ended up
2090              cascading into many changes due to the optimizers not being
2091              prepared for empty entries in the register table.  So we've
2092              decided to allow the MEMs in the register table for now.  */
2093           if (REG_P (map->x_regno_reg_rtx[regno])
2094               && REG_POINTER (map->x_regno_reg_rtx[regno]))
2095             mark_reg_pointer (map->reg_map[regno],
2096                               map->regno_pointer_align[regno]);
2097           regno = REGNO (map->reg_map[regno]);
2098         }
2099       ADDRESSOF_REGNO (copy) = regno;
2100       return copy;
2101
2102     case USE:
2103     case CLOBBER:
2104       /* USE and CLOBBER are ordinary, but we convert (use (subreg foo))
2105          to (use foo) if the original insn didn't have a subreg.
2106          Removing the subreg distorts the VAX movstrhi pattern
2107          by changing the mode of an operand.  */
2108       copy = copy_rtx_and_substitute (XEXP (orig, 0), map, code == CLOBBER);
2109       if (GET_CODE (copy) == SUBREG && GET_CODE (XEXP (orig, 0)) != SUBREG)
2110         copy = SUBREG_REG (copy);
2111       return gen_rtx_fmt_e (code, VOIDmode, copy);
2112
2113     /* We need to handle "deleted" labels that appear in the DECL_RTL
2114        of a LABEL_DECL.  */
2115     case NOTE:
2116       if (NOTE_LINE_NUMBER (orig) != NOTE_INSN_DELETED_LABEL)
2117         break;
2118
2119       /* ... FALLTHRU ...  */
2120     case CODE_LABEL:
2121       LABEL_PRESERVE_P (get_label_from_map (map, CODE_LABEL_NUMBER (orig)))
2122         = LABEL_PRESERVE_P (orig);
2123       return get_label_from_map (map, CODE_LABEL_NUMBER (orig));
2124
2125     case LABEL_REF:
2126       copy
2127         = gen_rtx_LABEL_REF
2128           (mode,
2129            LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
2130            : get_label_from_map (map, CODE_LABEL_NUMBER (XEXP (orig, 0))));
2131
2132       LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
2133
2134       /* The fact that this label was previously nonlocal does not mean
2135          it still is, so we must check if it is within the range of
2136          this function's labels.  */
2137       LABEL_REF_NONLOCAL_P (copy)
2138         = (LABEL_REF_NONLOCAL_P (orig)
2139            && ! (CODE_LABEL_NUMBER (XEXP (copy, 0)) >= get_first_label_num ()
2140                  && CODE_LABEL_NUMBER (XEXP (copy, 0)) < max_label_num ()));
2141
2142       /* If we have made a nonlocal label local, it means that this
2143          inlined call will be referring to our nonlocal goto handler.
2144          So make sure we create one for this block; we normally would
2145          not since this is not otherwise considered a "call".  */
2146       if (LABEL_REF_NONLOCAL_P (orig) && ! LABEL_REF_NONLOCAL_P (copy))
2147         function_call_count++;
2148
2149       return copy;
2150
2151     case PC:
2152     case CC0:
2153     case CONST_INT:
2154     case CONST_VECTOR:
2155       return orig;
2156
2157     case SYMBOL_REF:
2158       /* Symbols which represent the address of a label stored in the constant
2159          pool must be modified to point to a constant pool entry for the
2160          remapped label.  Otherwise, symbols are returned unchanged.  */
2161       if (CONSTANT_POOL_ADDRESS_P (orig))
2162         {
2163           struct function *f = inlining ? inlining : cfun;
2164           rtx constant = get_pool_constant_for_function (f, orig);
2165           enum machine_mode const_mode = get_pool_mode_for_function (f, orig);
2166           if (inlining)
2167             {
2168               rtx temp = force_const_mem (const_mode,
2169                                           copy_rtx_and_substitute (constant,
2170                                                                    map, 0));
2171
2172 #if 0
2173               /* Legitimizing the address here is incorrect.
2174
2175                  Since we had a SYMBOL_REF before, we can assume it is valid
2176                  to have one in this position in the insn.
2177
2178                  Also, change_address may create new registers.  These
2179                  registers will not have valid reg_map entries.  This can
2180                  cause try_constants() to fail because assumes that all
2181                  registers in the rtx have valid reg_map entries, and it may
2182                  end up replacing one of these new registers with junk.  */
2183
2184               if (! memory_address_p (GET_MODE (temp), XEXP (temp, 0)))
2185                 temp = change_address (temp, GET_MODE (temp), XEXP (temp, 0));
2186 #endif
2187
2188               temp = XEXP (temp, 0);
2189
2190 #ifdef POINTERS_EXTEND_UNSIGNED
2191               if (GET_MODE (temp) != GET_MODE (orig))
2192                 temp = convert_memory_address (GET_MODE (orig), temp);
2193 #endif
2194               return temp;
2195             }
2196           else if (GET_CODE (constant) == LABEL_REF)
2197             return XEXP (force_const_mem
2198                          (GET_MODE (orig),
2199                           copy_rtx_and_substitute (constant, map, for_lhs)),
2200                          0);
2201         }
2202
2203       return orig;
2204
2205     case CONST_DOUBLE:
2206       /* We have to make a new copy of this CONST_DOUBLE because don't want
2207          to use the old value of CONST_DOUBLE_MEM.  Also, this may be a
2208          duplicate of a CONST_DOUBLE we have already seen.  */
2209       if (GET_MODE_CLASS (GET_MODE (orig)) == MODE_FLOAT)
2210         {
2211           REAL_VALUE_TYPE d;
2212
2213           REAL_VALUE_FROM_CONST_DOUBLE (d, orig);
2214           return CONST_DOUBLE_FROM_REAL_VALUE (d, GET_MODE (orig));
2215         }
2216       else
2217         return immed_double_const (CONST_DOUBLE_LOW (orig),
2218                                    CONST_DOUBLE_HIGH (orig), VOIDmode);
2219
2220     case CONST:
2221       /* Make new constant pool entry for a constant
2222          that was in the pool of the inline function.  */
2223       if (RTX_INTEGRATED_P (orig))
2224         abort ();
2225       break;
2226
2227     case ASM_OPERANDS:
2228       /* If a single asm insn contains multiple output operands then
2229          it contains multiple ASM_OPERANDS rtx's that share the input
2230          and constraint vecs.  We must make sure that the copied insn
2231          continues to share it.  */
2232       if (map->orig_asm_operands_vector == ASM_OPERANDS_INPUT_VEC (orig))
2233         {
2234           copy = rtx_alloc (ASM_OPERANDS);
2235           RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
2236           PUT_MODE (copy, GET_MODE (orig));
2237           ASM_OPERANDS_TEMPLATE (copy) = ASM_OPERANDS_TEMPLATE (orig);
2238           ASM_OPERANDS_OUTPUT_CONSTRAINT (copy)
2239             = ASM_OPERANDS_OUTPUT_CONSTRAINT (orig);
2240           ASM_OPERANDS_OUTPUT_IDX (copy) = ASM_OPERANDS_OUTPUT_IDX (orig);
2241           ASM_OPERANDS_INPUT_VEC (copy) = map->copy_asm_operands_vector;
2242           ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy)
2243             = map->copy_asm_constraints_vector;
2244           ASM_OPERANDS_SOURCE_FILE (copy) = ASM_OPERANDS_SOURCE_FILE (orig);
2245           ASM_OPERANDS_SOURCE_LINE (copy) = ASM_OPERANDS_SOURCE_LINE (orig);
2246           return copy;
2247         }
2248       break;
2249
2250     case CALL:
2251       /* This is given special treatment because the first
2252          operand of a CALL is a (MEM ...) which may get
2253          forced into a register for cse.  This is undesirable
2254          if function-address cse isn't wanted or if we won't do cse.  */
2255 #ifndef NO_FUNCTION_CSE
2256       if (! (optimize && ! flag_no_function_cse))
2257 #endif
2258         {
2259           rtx copy
2260             = gen_rtx_MEM (GET_MODE (XEXP (orig, 0)),
2261                            copy_rtx_and_substitute (XEXP (XEXP (orig, 0), 0),
2262                                                     map, 0));
2263
2264           MEM_COPY_ATTRIBUTES (copy, XEXP (orig, 0));
2265
2266           return
2267             gen_rtx_CALL (GET_MODE (orig), copy, 
2268                           copy_rtx_and_substitute (XEXP (orig, 1), map, 0));
2269         }
2270       break;
2271
2272 #if 0
2273       /* Must be ifdefed out for loop unrolling to work.  */
2274     case RETURN:
2275       abort ();
2276 #endif
2277
2278     case SET:
2279       /* If this is setting fp or ap, it means that we have a nonlocal goto.
2280          Adjust the setting by the offset of the area we made.
2281          If the nonlocal goto is into the current function,
2282          this will result in unnecessarily bad code, but should work.  */
2283       if (SET_DEST (orig) == virtual_stack_vars_rtx
2284           || SET_DEST (orig) == virtual_incoming_args_rtx)
2285         {
2286           /* In case a translation hasn't occurred already, make one now.  */
2287           rtx equiv_reg;
2288           rtx equiv_loc;
2289           HOST_WIDE_INT loc_offset;
2290
2291           copy_rtx_and_substitute (SET_DEST (orig), map, for_lhs);
2292           equiv_reg = map->reg_map[REGNO (SET_DEST (orig))];
2293           equiv_loc = VARRAY_CONST_EQUIV (map->const_equiv_varray,
2294                                           REGNO (equiv_reg)).rtx;
2295           loc_offset
2296             = GET_CODE (equiv_loc) == REG ? 0 : INTVAL (XEXP (equiv_loc, 1));
2297
2298           return gen_rtx_SET (VOIDmode, SET_DEST (orig),
2299                               force_operand
2300                               (plus_constant
2301                                (copy_rtx_and_substitute (SET_SRC (orig),
2302                                                          map, 0),
2303                                 - loc_offset),
2304                                NULL_RTX));
2305         }
2306       else
2307         return gen_rtx_SET (VOIDmode,
2308                             copy_rtx_and_substitute (SET_DEST (orig), map, 1),
2309                             copy_rtx_and_substitute (SET_SRC (orig), map, 0));
2310       break;
2311
2312     case MEM:
2313       if (inlining
2314           && GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
2315           && CONSTANT_POOL_ADDRESS_P (XEXP (orig, 0)))
2316         {
2317           enum machine_mode const_mode
2318             = get_pool_mode_for_function (inlining, XEXP (orig, 0));
2319           rtx constant
2320             = get_pool_constant_for_function (inlining, XEXP (orig, 0));
2321
2322           constant = copy_rtx_and_substitute (constant, map, 0);
2323
2324           /* If this was an address of a constant pool entry that itself
2325              had to be placed in the constant pool, it might not be a
2326              valid address.  So the recursive call might have turned it
2327              into a register.  In that case, it isn't a constant any
2328              more, so return it.  This has the potential of changing a
2329              MEM into a REG, but we'll assume that it safe.  */
2330           if (! CONSTANT_P (constant))
2331             return constant;
2332
2333           return validize_mem (force_const_mem (const_mode, constant));
2334         }
2335
2336       copy = gen_rtx_MEM (mode, copy_rtx_and_substitute (XEXP (orig, 0),
2337                                                          map, 0));
2338       MEM_COPY_ATTRIBUTES (copy, orig);
2339
2340       /* If inlining and this is not for the LHS, turn off RTX_UNCHANGING_P
2341          since this may be an indirect reference to a parameter and the
2342          actual may not be readonly.  */
2343       if (inlining && !for_lhs)
2344         RTX_UNCHANGING_P (copy) = 0;
2345
2346       /* If inlining, squish aliasing data that references the subroutine's
2347          parameter list, since that's no longer applicable.  */
2348       if (inlining && MEM_EXPR (copy)
2349           && TREE_CODE (MEM_EXPR (copy)) == INDIRECT_REF
2350           && TREE_CODE (TREE_OPERAND (MEM_EXPR (copy), 0)) == PARM_DECL)
2351         set_mem_expr (copy, NULL_TREE);
2352
2353       return copy;
2354
2355     default:
2356       break;
2357     }
2358
2359   copy = rtx_alloc (code);
2360   PUT_MODE (copy, mode);
2361   RTX_FLAG (copy, in_struct) = RTX_FLAG (orig, in_struct);
2362   RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
2363   RTX_FLAG (copy, unchanging) = RTX_FLAG (orig, unchanging);
2364
2365   format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
2366
2367   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
2368     {
2369       switch (*format_ptr++)
2370         {
2371         case '0':
2372           /* Copy this through the wide int field; that's safest.  */
2373           X0WINT (copy, i) = X0WINT (orig, i);
2374           break;
2375
2376         case 'e':
2377           XEXP (copy, i)
2378             = copy_rtx_and_substitute (XEXP (orig, i), map, for_lhs);
2379           break;
2380
2381         case 'u':
2382           /* Change any references to old-insns to point to the
2383              corresponding copied insns.  */
2384           XEXP (copy, i) = map->insn_map[INSN_UID (XEXP (orig, i))];
2385           break;
2386
2387         case 'E':
2388           XVEC (copy, i) = XVEC (orig, i);
2389           if (XVEC (orig, i) != NULL && XVECLEN (orig, i) != 0)
2390             {
2391               XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
2392               for (j = 0; j < XVECLEN (copy, i); j++)
2393                 XVECEXP (copy, i, j)
2394                   = copy_rtx_and_substitute (XVECEXP (orig, i, j),
2395                                              map, for_lhs);
2396             }
2397           break;
2398
2399         case 'w':
2400           XWINT (copy, i) = XWINT (orig, i);
2401           break;
2402
2403         case 'i':
2404           XINT (copy, i) = XINT (orig, i);
2405           break;
2406
2407         case 's':
2408           XSTR (copy, i) = XSTR (orig, i);
2409           break;
2410
2411         case 't':
2412           XTREE (copy, i) = XTREE (orig, i);
2413           break;
2414
2415         default:
2416           abort ();
2417         }
2418     }
2419
2420   if (code == ASM_OPERANDS && map->orig_asm_operands_vector == 0)
2421     {
2422       map->orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
2423       map->copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
2424       map->copy_asm_constraints_vector
2425         = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
2426     }
2427
2428   return copy;
2429 }
2430 \f
2431 /* Substitute known constant values into INSN, if that is valid.  */
2432
2433 void
2434 try_constants (insn, map)
2435      rtx insn;
2436      struct inline_remap *map;
2437 {
2438   int i;
2439
2440   map->num_sets = 0;
2441
2442   /* First try just updating addresses, then other things.  This is
2443      important when we have something like the store of a constant
2444      into memory and we can update the memory address but the machine
2445      does not support a constant source.  */
2446   subst_constants (&PATTERN (insn), insn, map, 1);
2447   apply_change_group ();
2448   subst_constants (&PATTERN (insn), insn, map, 0);
2449   apply_change_group ();
2450
2451   /* Show we don't know the value of anything stored or clobbered.  */
2452   note_stores (PATTERN (insn), mark_stores, NULL);
2453   map->last_pc_value = 0;
2454 #ifdef HAVE_cc0
2455   map->last_cc0_value = 0;
2456 #endif
2457
2458   /* Set up any constant equivalences made in this insn.  */
2459   for (i = 0; i < map->num_sets; i++)
2460     {
2461       if (GET_CODE (map->equiv_sets[i].dest) == REG)
2462         {
2463           int regno = REGNO (map->equiv_sets[i].dest);
2464
2465           MAYBE_EXTEND_CONST_EQUIV_VARRAY (map, regno);
2466           if (VARRAY_CONST_EQUIV (map->const_equiv_varray, regno).rtx == 0
2467               /* Following clause is a hack to make case work where GNU C++
2468                  reassigns a variable to make cse work right.  */
2469               || ! rtx_equal_p (VARRAY_CONST_EQUIV (map->const_equiv_varray,
2470                                                     regno).rtx,
2471                                 map->equiv_sets[i].equiv))
2472             SET_CONST_EQUIV_DATA (map, map->equiv_sets[i].dest,
2473                                   map->equiv_sets[i].equiv, map->const_age);
2474         }
2475       else if (map->equiv_sets[i].dest == pc_rtx)
2476         map->last_pc_value = map->equiv_sets[i].equiv;
2477 #ifdef HAVE_cc0
2478       else if (map->equiv_sets[i].dest == cc0_rtx)
2479         map->last_cc0_value = map->equiv_sets[i].equiv;
2480 #endif
2481     }
2482 }
2483 \f
2484 /* Substitute known constants for pseudo regs in the contents of LOC,
2485    which are part of INSN.
2486    If INSN is zero, the substitution should always be done (this is used to
2487    update DECL_RTL).
2488    These changes are taken out by try_constants if the result is not valid.
2489
2490    Note that we are more concerned with determining when the result of a SET
2491    is a constant, for further propagation, than actually inserting constants
2492    into insns; cse will do the latter task better.
2493
2494    This function is also used to adjust address of items previously addressed
2495    via the virtual stack variable or virtual incoming arguments registers.
2496
2497    If MEMONLY is nonzero, only make changes inside a MEM.  */
2498
2499 static void
2500 subst_constants (loc, insn, map, memonly)
2501      rtx *loc;
2502      rtx insn;
2503      struct inline_remap *map;
2504      int memonly;
2505 {
2506   rtx x = *loc;
2507   int i, j;
2508   enum rtx_code code;
2509   const char *format_ptr;
2510   int num_changes = num_validated_changes ();
2511   rtx new = 0;
2512   enum machine_mode op0_mode = MAX_MACHINE_MODE;
2513
2514   code = GET_CODE (x);
2515
2516   switch (code)
2517     {
2518     case PC:
2519     case CONST_INT:
2520     case CONST_DOUBLE:
2521     case CONST_VECTOR:
2522     case SYMBOL_REF:
2523     case CONST:
2524     case LABEL_REF:
2525     case ADDRESS:
2526       return;
2527
2528 #ifdef HAVE_cc0
2529     case CC0:
2530       if (! memonly)
2531         validate_change (insn, loc, map->last_cc0_value, 1);
2532       return;
2533 #endif
2534
2535     case USE:
2536     case CLOBBER:
2537       /* The only thing we can do with a USE or CLOBBER is possibly do
2538          some substitutions in a MEM within it.  */
2539       if (GET_CODE (XEXP (x, 0)) == MEM)
2540         subst_constants (&XEXP (XEXP (x, 0), 0), insn, map, 0);
2541       return;
2542
2543     case REG:
2544       /* Substitute for parms and known constants.  Don't replace
2545          hard regs used as user variables with constants.  */
2546       if (! memonly)
2547         {
2548           int regno = REGNO (x);
2549           struct const_equiv_data *p;
2550
2551           if (! (regno < FIRST_PSEUDO_REGISTER && REG_USERVAR_P (x))
2552               && (size_t) regno < VARRAY_SIZE (map->const_equiv_varray)
2553               && (p = &VARRAY_CONST_EQUIV (map->const_equiv_varray, regno),
2554                   p->rtx != 0)
2555               && p->age >= map->const_age)
2556             validate_change (insn, loc, p->rtx, 1);
2557         }
2558       return;
2559
2560     case SUBREG:
2561       /* SUBREG applied to something other than a reg
2562          should be treated as ordinary, since that must
2563          be a special hack and we don't know how to treat it specially.
2564          Consider for example mulsidi3 in m68k.md.
2565          Ordinary SUBREG of a REG needs this special treatment.  */
2566       if (! memonly && GET_CODE (SUBREG_REG (x)) == REG)
2567         {
2568           rtx inner = SUBREG_REG (x);
2569           rtx new = 0;
2570
2571           /* We can't call subst_constants on &SUBREG_REG (x) because any
2572              constant or SUBREG wouldn't be valid inside our SUBEG.  Instead,
2573              see what is inside, try to form the new SUBREG and see if that is
2574              valid.  We handle two cases: extracting a full word in an
2575              integral mode and extracting the low part.  */
2576           subst_constants (&inner, NULL_RTX, map, 0);
2577           new = simplify_gen_subreg (GET_MODE (x), inner,
2578                                      GET_MODE (SUBREG_REG (x)),
2579                                      SUBREG_BYTE (x));
2580
2581           if (new)
2582             validate_change (insn, loc, new, 1);
2583           else
2584             cancel_changes (num_changes);
2585
2586           return;
2587         }
2588       break;
2589
2590     case MEM:
2591       subst_constants (&XEXP (x, 0), insn, map, 0);
2592
2593       /* If a memory address got spoiled, change it back.  */
2594       if (! memonly && insn != 0 && num_validated_changes () != num_changes
2595           && ! memory_address_p (GET_MODE (x), XEXP (x, 0)))
2596         cancel_changes (num_changes);
2597       return;
2598
2599     case SET:
2600       {
2601         /* Substitute constants in our source, and in any arguments to a
2602            complex (e..g, ZERO_EXTRACT) destination, but not in the destination
2603            itself.  */
2604         rtx *dest_loc = &SET_DEST (x);
2605         rtx dest = *dest_loc;
2606         rtx src, tem;
2607         enum machine_mode compare_mode = VOIDmode;
2608
2609         /* If SET_SRC is a COMPARE which subst_constants would turn into
2610            COMPARE of 2 VOIDmode constants, note the mode in which comparison
2611            is to be done.  */
2612         if (GET_CODE (SET_SRC (x)) == COMPARE)
2613           {
2614             src = SET_SRC (x);
2615             if (GET_MODE_CLASS (GET_MODE (src)) == MODE_CC
2616                 || CC0_P (dest))
2617               {
2618                 compare_mode = GET_MODE (XEXP (src, 0));
2619                 if (compare_mode == VOIDmode)
2620                   compare_mode = GET_MODE (XEXP (src, 1));
2621               }
2622           }
2623
2624         subst_constants (&SET_SRC (x), insn, map, memonly);
2625         src = SET_SRC (x);
2626
2627         while (GET_CODE (*dest_loc) == ZERO_EXTRACT
2628                || GET_CODE (*dest_loc) == SUBREG
2629                || GET_CODE (*dest_loc) == STRICT_LOW_PART)
2630           {
2631             if (GET_CODE (*dest_loc) == ZERO_EXTRACT)
2632               {
2633                 subst_constants (&XEXP (*dest_loc, 1), insn, map, memonly);
2634                 subst_constants (&XEXP (*dest_loc, 2), insn, map, memonly);
2635               }
2636             dest_loc = &XEXP (*dest_loc, 0);
2637           }
2638
2639         /* Do substitute in the address of a destination in memory.  */
2640         if (GET_CODE (*dest_loc) == MEM)
2641           subst_constants (&XEXP (*dest_loc, 0), insn, map, 0);
2642
2643         /* Check for the case of DEST a SUBREG, both it and the underlying
2644            register are less than one word, and the SUBREG has the wider mode.
2645            In the case, we are really setting the underlying register to the
2646            source converted to the mode of DEST.  So indicate that.  */
2647         if (GET_CODE (dest) == SUBREG
2648             && GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD
2649             && GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))) <= UNITS_PER_WORD
2650             && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
2651                       <= GET_MODE_SIZE (GET_MODE (dest)))
2652             && (tem = gen_lowpart_if_possible (GET_MODE (SUBREG_REG (dest)),
2653                                                src)))
2654           src = tem, dest = SUBREG_REG (dest);
2655
2656         /* If storing a recognizable value save it for later recording.  */
2657         if ((map->num_sets < MAX_RECOG_OPERANDS)
2658             && (CONSTANT_P (src)
2659                 || (GET_CODE (src) == REG
2660                     && (REGNO (src) == VIRTUAL_INCOMING_ARGS_REGNUM
2661                         || REGNO (src) == VIRTUAL_STACK_VARS_REGNUM))
2662                 || (GET_CODE (src) == PLUS
2663                     && GET_CODE (XEXP (src, 0)) == REG
2664                     && (REGNO (XEXP (src, 0)) == VIRTUAL_INCOMING_ARGS_REGNUM
2665                         || REGNO (XEXP (src, 0)) == VIRTUAL_STACK_VARS_REGNUM)
2666                     && CONSTANT_P (XEXP (src, 1)))
2667                 || GET_CODE (src) == COMPARE
2668                 || CC0_P (dest)
2669                 || (dest == pc_rtx
2670                     && (src == pc_rtx || GET_CODE (src) == RETURN
2671                         || GET_CODE (src) == LABEL_REF))))
2672           {
2673             /* Normally, this copy won't do anything.  But, if SRC is a COMPARE
2674                it will cause us to save the COMPARE with any constants
2675                substituted, which is what we want for later.  */
2676             rtx src_copy = copy_rtx (src);
2677             map->equiv_sets[map->num_sets].equiv = src_copy;
2678             map->equiv_sets[map->num_sets++].dest = dest;
2679             if (compare_mode != VOIDmode
2680                 && GET_CODE (src) == COMPARE
2681                 && (GET_MODE_CLASS (GET_MODE (src)) == MODE_CC
2682                     || CC0_P (dest))
2683                 && GET_MODE (XEXP (src, 0)) == VOIDmode
2684                 && GET_MODE (XEXP (src, 1)) == VOIDmode)
2685               {
2686                 map->compare_src = src_copy;
2687                 map->compare_mode = compare_mode;
2688               }
2689           }
2690       }
2691       return;
2692
2693     default:
2694       break;
2695     }
2696
2697   format_ptr = GET_RTX_FORMAT (code);
2698
2699   /* If the first operand is an expression, save its mode for later.  */
2700   if (*format_ptr == 'e')
2701     op0_mode = GET_MODE (XEXP (x, 0));
2702
2703   for (i = 0; i < GET_RTX_LENGTH (code); i++)
2704     {
2705       switch (*format_ptr++)
2706         {
2707         case '0':
2708           break;
2709
2710         case 'e':
2711           if (XEXP (x, i))
2712             subst_constants (&XEXP (x, i), insn, map, memonly);
2713           break;
2714
2715         case 'u':
2716         case 'i':
2717         case 's':
2718         case 'w':
2719         case 'n':
2720         case 't':
2721         case 'B':
2722           break;
2723
2724         case 'E':
2725           if (XVEC (x, i) != NULL && XVECLEN (x, i) != 0)
2726             for (j = 0; j < XVECLEN (x, i); j++)
2727               subst_constants (&XVECEXP (x, i, j), insn, map, memonly);
2728
2729           break;
2730
2731         default:
2732           abort ();
2733         }
2734     }
2735
2736   /* If this is a commutative operation, move a constant to the second
2737      operand unless the second operand is already a CONST_INT.  */
2738   if (! memonly
2739       && (GET_RTX_CLASS (code) == 'c' || code == NE || code == EQ)
2740       && CONSTANT_P (XEXP (x, 0)) && GET_CODE (XEXP (x, 1)) != CONST_INT)
2741     {
2742       rtx tem = XEXP (x, 0);
2743       validate_change (insn, &XEXP (x, 0), XEXP (x, 1), 1);
2744       validate_change (insn, &XEXP (x, 1), tem, 1);
2745     }
2746
2747   /* Simplify the expression in case we put in some constants.  */
2748   if (! memonly)
2749     switch (GET_RTX_CLASS (code))
2750       {
2751       case '1':
2752         if (op0_mode == MAX_MACHINE_MODE)
2753           abort ();
2754         new = simplify_unary_operation (code, GET_MODE (x),
2755                                         XEXP (x, 0), op0_mode);
2756         break;
2757
2758       case '<':
2759         {
2760           enum machine_mode op_mode = GET_MODE (XEXP (x, 0));
2761
2762           if (op_mode == VOIDmode)
2763             op_mode = GET_MODE (XEXP (x, 1));
2764           new = simplify_relational_operation (code, op_mode,
2765                                                XEXP (x, 0), XEXP (x, 1));
2766 #ifdef FLOAT_STORE_FLAG_VALUE
2767           if (new != 0 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
2768             {
2769               enum machine_mode mode = GET_MODE (x);
2770               if (new == const0_rtx)
2771                 new = CONST0_RTX (mode);
2772               else
2773                 {
2774                   REAL_VALUE_TYPE val;
2775
2776                   /* Avoid automatic aggregate initialization.  */
2777                   val = FLOAT_STORE_FLAG_VALUE (mode);
2778                   new = CONST_DOUBLE_FROM_REAL_VALUE (val, mode);
2779                 }
2780             }
2781 #endif
2782           break;
2783         }
2784
2785       case '2':
2786       case 'c':
2787         new = simplify_binary_operation (code, GET_MODE (x),
2788                                          XEXP (x, 0), XEXP (x, 1));
2789         break;
2790
2791       case 'b':
2792       case '3':
2793         if (op0_mode == MAX_MACHINE_MODE)
2794           abort ();
2795
2796         if (code == IF_THEN_ELSE)
2797           {
2798             rtx op0 = XEXP (x, 0);
2799
2800             if (GET_RTX_CLASS (GET_CODE (op0)) == '<'
2801                 && GET_MODE (op0) == VOIDmode
2802                 && ! side_effects_p (op0)
2803                 && XEXP (op0, 0) == map->compare_src
2804                 && GET_MODE (XEXP (op0, 1)) == VOIDmode)
2805               {
2806                 /* We have compare of two VOIDmode constants for which
2807                    we recorded the comparison mode.  */
2808                 rtx temp =
2809                   simplify_relational_operation (GET_CODE (op0),
2810                                                  map->compare_mode,
2811                                                  XEXP (op0, 0),
2812                                                  XEXP (op0, 1));
2813
2814                 if (temp == const0_rtx)
2815                   new = XEXP (x, 2);
2816                 else if (temp == const1_rtx)
2817                   new = XEXP (x, 1);
2818               }
2819           }
2820         if (!new)
2821           new = simplify_ternary_operation (code, GET_MODE (x), op0_mode,
2822                                             XEXP (x, 0), XEXP (x, 1),
2823                                             XEXP (x, 2));
2824         break;
2825       }
2826
2827   if (new)
2828     validate_change (insn, loc, new, 1);
2829 }
2830
2831 /* Show that register modified no longer contain known constants.  We are
2832    called from note_stores with parts of the new insn.  */
2833
2834 static void
2835 mark_stores (dest, x, data)
2836      rtx dest;
2837      rtx x ATTRIBUTE_UNUSED;
2838      void *data ATTRIBUTE_UNUSED;
2839 {
2840   int regno = -1;
2841   enum machine_mode mode = VOIDmode;
2842
2843   /* DEST is always the innermost thing set, except in the case of
2844      SUBREGs of hard registers.  */
2845
2846   if (GET_CODE (dest) == REG)
2847     regno = REGNO (dest), mode = GET_MODE (dest);
2848   else if (GET_CODE (dest) == SUBREG && GET_CODE (SUBREG_REG (dest)) == REG)
2849     {
2850       regno = REGNO (SUBREG_REG (dest));
2851       if (regno < FIRST_PSEUDO_REGISTER)
2852         regno += subreg_regno_offset (REGNO (SUBREG_REG (dest)),
2853                                       GET_MODE (SUBREG_REG (dest)),
2854                                       SUBREG_BYTE (dest),
2855                                       GET_MODE (dest));
2856       mode = GET_MODE (SUBREG_REG (dest));
2857     }
2858
2859   if (regno >= 0)
2860     {
2861       unsigned int uregno = regno;
2862       unsigned int last_reg = (uregno >= FIRST_PSEUDO_REGISTER ? uregno
2863                                : uregno + HARD_REGNO_NREGS (uregno, mode) - 1);
2864       unsigned int i;
2865
2866       /* Ignore virtual stack var or virtual arg register since those
2867          are handled separately.  */
2868       if (uregno != VIRTUAL_INCOMING_ARGS_REGNUM
2869           && uregno != VIRTUAL_STACK_VARS_REGNUM)
2870         for (i = uregno; i <= last_reg; i++)
2871           if ((size_t) i < VARRAY_SIZE (global_const_equiv_varray))
2872             VARRAY_CONST_EQUIV (global_const_equiv_varray, i).rtx = 0;
2873     }
2874 }
2875 \f
2876 /* Given a pointer to some BLOCK node, if the BLOCK_ABSTRACT_ORIGIN for the
2877    given BLOCK node is NULL, set the BLOCK_ABSTRACT_ORIGIN for the node so
2878    that it points to the node itself, thus indicating that the node is its
2879    own (abstract) origin.  Additionally, if the BLOCK_ABSTRACT_ORIGIN for
2880    the given node is NULL, recursively descend the decl/block tree which
2881    it is the root of, and for each other ..._DECL or BLOCK node contained
2882    therein whose DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also
2883    still NULL, set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN
2884    values to point to themselves.  */
2885
2886 static void
2887 set_block_origin_self (stmt)
2888      tree stmt;
2889 {
2890   if (BLOCK_ABSTRACT_ORIGIN (stmt) == NULL_TREE)
2891     {
2892       BLOCK_ABSTRACT_ORIGIN (stmt) = stmt;
2893
2894       {
2895         tree local_decl;
2896
2897         for (local_decl = BLOCK_VARS (stmt);
2898              local_decl != NULL_TREE;
2899              local_decl = TREE_CHAIN (local_decl))
2900           set_decl_origin_self (local_decl);    /* Potential recursion.  */
2901       }
2902
2903       {
2904         tree subblock;
2905
2906         for (subblock = BLOCK_SUBBLOCKS (stmt);
2907              subblock != NULL_TREE;
2908              subblock = BLOCK_CHAIN (subblock))
2909           set_block_origin_self (subblock);     /* Recurse.  */
2910       }
2911     }
2912 }
2913
2914 /* Given a pointer to some ..._DECL node, if the DECL_ABSTRACT_ORIGIN for
2915    the given ..._DECL node is NULL, set the DECL_ABSTRACT_ORIGIN for the
2916    node to so that it points to the node itself, thus indicating that the
2917    node represents its own (abstract) origin.  Additionally, if the
2918    DECL_ABSTRACT_ORIGIN for the given node is NULL, recursively descend
2919    the decl/block tree of which the given node is the root of, and for
2920    each other ..._DECL or BLOCK node contained therein whose
2921    DECL_ABSTRACT_ORIGINs or BLOCK_ABSTRACT_ORIGINs are also still NULL,
2922    set *their* DECL_ABSTRACT_ORIGIN or BLOCK_ABSTRACT_ORIGIN values to
2923    point to themselves.  */
2924
2925 void
2926 set_decl_origin_self (decl)
2927      tree decl;
2928 {
2929   if (DECL_ABSTRACT_ORIGIN (decl) == NULL_TREE)
2930     {
2931       DECL_ABSTRACT_ORIGIN (decl) = decl;
2932       if (TREE_CODE (decl) == FUNCTION_DECL)
2933         {
2934           tree arg;
2935
2936           for (arg = DECL_ARGUMENTS (decl); arg; arg = TREE_CHAIN (arg))
2937             DECL_ABSTRACT_ORIGIN (arg) = arg;
2938           if (DECL_INITIAL (decl) != NULL_TREE
2939               && DECL_INITIAL (decl) != error_mark_node)
2940             set_block_origin_self (DECL_INITIAL (decl));
2941         }
2942     }
2943 }
2944 \f
2945 /* Given a pointer to some BLOCK node, and a boolean value to set the
2946    "abstract" flags to, set that value into the BLOCK_ABSTRACT flag for
2947    the given block, and for all local decls and all local sub-blocks
2948    (recursively) which are contained therein.  */
2949
2950 static void
2951 set_block_abstract_flags (stmt, setting)
2952      tree stmt;
2953      int setting;
2954 {
2955   tree local_decl;
2956   tree subblock;
2957
2958   BLOCK_ABSTRACT (stmt) = setting;
2959
2960   for (local_decl = BLOCK_VARS (stmt);
2961        local_decl != NULL_TREE;
2962        local_decl = TREE_CHAIN (local_decl))
2963     set_decl_abstract_flags (local_decl, setting);
2964
2965   for (subblock = BLOCK_SUBBLOCKS (stmt);
2966        subblock != NULL_TREE;
2967        subblock = BLOCK_CHAIN (subblock))
2968     set_block_abstract_flags (subblock, setting);
2969 }
2970
2971 /* Given a pointer to some ..._DECL node, and a boolean value to set the
2972    "abstract" flags to, set that value into the DECL_ABSTRACT flag for the
2973    given decl, and (in the case where the decl is a FUNCTION_DECL) also
2974    set the abstract flags for all of the parameters, local vars, local
2975    blocks and sub-blocks (recursively) to the same setting.  */
2976
2977 void
2978 set_decl_abstract_flags (decl, setting)
2979      tree decl;
2980      int setting;
2981 {
2982   DECL_ABSTRACT (decl) = setting;
2983   if (TREE_CODE (decl) == FUNCTION_DECL)
2984     {
2985       tree arg;
2986
2987       for (arg = DECL_ARGUMENTS (decl); arg; arg = TREE_CHAIN (arg))
2988         DECL_ABSTRACT (arg) = setting;
2989       if (DECL_INITIAL (decl) != NULL_TREE
2990           && DECL_INITIAL (decl) != error_mark_node)
2991         set_block_abstract_flags (DECL_INITIAL (decl), setting);
2992     }
2993 }
2994 \f
2995 /* Output the assembly language code for the function FNDECL
2996    from its DECL_SAVED_INSNS.  Used for inline functions that are output
2997    at end of compilation instead of where they came in the source.  */
2998
2999 static GTY(()) struct function *old_cfun;
3000
3001 void
3002 output_inline_function (fndecl)
3003      tree fndecl;
3004 {
3005   enum debug_info_type old_write_symbols = write_symbols;
3006   const struct gcc_debug_hooks *const old_debug_hooks = debug_hooks;
3007   struct function *f = DECL_SAVED_INSNS (fndecl);
3008
3009   old_cfun = cfun;
3010   cfun = f;
3011   current_function_decl = fndecl;
3012
3013   set_new_last_label_num (f->inl_max_label_num);
3014
3015   /* We're not deferring this any longer.  */
3016   DECL_DEFER_OUTPUT (fndecl) = 0;
3017
3018   /* If requested, suppress debugging information.  */
3019   if (f->no_debugging_symbols)
3020     {
3021       write_symbols = NO_DEBUG;
3022       debug_hooks = &do_nothing_debug_hooks;
3023     }
3024
3025   /* Make sure warnings emitted by the optimizers (e.g. control reaches
3026      end of non-void function) is not wildly incorrect.  */
3027   input_filename = DECL_SOURCE_FILE (fndecl);
3028   lineno = DECL_SOURCE_LINE (fndecl);
3029
3030   /* Compile this function all the way down to assembly code.  As a
3031      side effect this destroys the saved RTL representation, but
3032      that's okay, because we don't need to inline this anymore.  */
3033   rest_of_compilation (fndecl);
3034   DECL_INLINE (fndecl) = 0;
3035
3036   cfun = old_cfun;
3037   current_function_decl = old_cfun ? old_cfun->decl : 0;
3038   write_symbols = old_write_symbols;
3039   debug_hooks = old_debug_hooks;
3040 }
3041
3042 \f
3043 /* Functions to keep track of the values hard regs had at the start of
3044    the function.  */
3045
3046 rtx
3047 get_hard_reg_initial_reg (fun, reg)
3048      struct function *fun;
3049      rtx reg;
3050 {
3051   struct initial_value_struct *ivs = fun->hard_reg_initial_vals;
3052   int i;
3053
3054   if (ivs == 0)
3055     return NULL_RTX;
3056
3057   for (i = 0; i < ivs->num_entries; i++)
3058     if (rtx_equal_p (ivs->entries[i].pseudo, reg))
3059       return ivs->entries[i].hard_reg;
3060
3061   return NULL_RTX;
3062 }
3063
3064 rtx
3065 has_func_hard_reg_initial_val (fun, reg)
3066      struct function *fun;
3067      rtx reg;
3068 {
3069   struct initial_value_struct *ivs = fun->hard_reg_initial_vals;
3070   int i;
3071
3072   if (ivs == 0)
3073     return NULL_RTX;
3074
3075   for (i = 0; i < ivs->num_entries; i++)
3076     if (rtx_equal_p (ivs->entries[i].hard_reg, reg))
3077       return ivs->entries[i].pseudo;
3078
3079   return NULL_RTX;
3080 }
3081
3082 rtx
3083 get_func_hard_reg_initial_val (fun, reg)
3084      struct function *fun;
3085      rtx reg;
3086 {
3087   struct initial_value_struct *ivs = fun->hard_reg_initial_vals;
3088   rtx rv = has_func_hard_reg_initial_val (fun, reg);
3089
3090   if (rv)
3091     return rv;
3092
3093   if (ivs == 0)
3094     {
3095       fun->hard_reg_initial_vals = (void *) ggc_alloc (sizeof (initial_value_struct));
3096       ivs = fun->hard_reg_initial_vals;
3097       ivs->num_entries = 0;
3098       ivs->max_entries = 5;
3099       ivs->entries = (initial_value_pair *) ggc_alloc (5 * sizeof (initial_value_pair));
3100     }
3101
3102   if (ivs->num_entries >= ivs->max_entries)
3103     {
3104       ivs->max_entries += 5;
3105       ivs->entries = 
3106         (initial_value_pair *) ggc_realloc (ivs->entries,
3107                                             ivs->max_entries
3108                                             * sizeof (initial_value_pair));
3109     }
3110
3111   ivs->entries[ivs->num_entries].hard_reg = reg;
3112   ivs->entries[ivs->num_entries].pseudo = gen_reg_rtx (GET_MODE (reg));
3113
3114   return ivs->entries[ivs->num_entries++].pseudo;
3115 }
3116
3117 rtx
3118 get_hard_reg_initial_val (mode, regno)
3119      enum machine_mode mode;
3120      int regno;
3121 {
3122   return get_func_hard_reg_initial_val (cfun, gen_rtx_REG (mode, regno));
3123 }
3124
3125 rtx
3126 has_hard_reg_initial_val (mode, regno)
3127      enum machine_mode mode;
3128      int regno;
3129 {
3130   return has_func_hard_reg_initial_val (cfun, gen_rtx_REG (mode, regno));
3131 }
3132
3133 static void
3134 setup_initial_hard_reg_value_integration (inl_f, remap)
3135      struct function *inl_f;
3136      struct inline_remap *remap;
3137 {
3138   struct initial_value_struct *ivs = inl_f->hard_reg_initial_vals;
3139   int i;
3140
3141   if (ivs == 0)
3142     return;
3143
3144   for (i = 0; i < ivs->num_entries; i ++)
3145     remap->reg_map[REGNO (ivs->entries[i].pseudo)]
3146       = get_func_hard_reg_initial_val (cfun, ivs->entries[i].hard_reg);
3147 }
3148
3149
3150 void
3151 emit_initial_value_sets ()
3152 {
3153   struct initial_value_struct *ivs = cfun->hard_reg_initial_vals;
3154   int i;
3155   rtx seq;
3156
3157   if (ivs == 0)
3158     return;
3159
3160   start_sequence ();
3161   for (i = 0; i < ivs->num_entries; i++)
3162     emit_move_insn (ivs->entries[i].pseudo, ivs->entries[i].hard_reg);
3163   seq = get_insns ();
3164   end_sequence ();
3165
3166   emit_insn_after (seq, get_insns ());
3167 }
3168
3169 /* If the backend knows where to allocate pseudos for hard
3170    register initial values, register these allocations now.  */
3171 void
3172 allocate_initial_values (reg_equiv_memory_loc)
3173      rtx *reg_equiv_memory_loc ATTRIBUTE_UNUSED;
3174 {
3175 #ifdef ALLOCATE_INITIAL_VALUE
3176   struct initial_value_struct *ivs = cfun->hard_reg_initial_vals;
3177   int i;
3178
3179   if (ivs == 0)
3180     return;
3181
3182   for (i = 0; i < ivs->num_entries; i++)
3183     {
3184       int regno = REGNO (ivs->entries[i].pseudo);
3185       rtx x = ALLOCATE_INITIAL_VALUE (ivs->entries[i].hard_reg);
3186
3187       if (x == NULL_RTX || REG_N_SETS (REGNO (ivs->entries[i].pseudo)) > 1)
3188         ; /* Do nothing.  */
3189       else if (GET_CODE (x) == MEM)
3190         reg_equiv_memory_loc[regno] = x;
3191       else if (GET_CODE (x) == REG)
3192         {
3193           reg_renumber[regno] = REGNO (x);
3194           /* Poke the regno right into regno_reg_rtx
3195              so that even fixed regs are accepted.  */
3196           REGNO (ivs->entries[i].pseudo) = REGNO (x);
3197         }
3198       else abort ();
3199     }
3200 #endif
3201 }
3202
3203 #include "gt-integrate.h"