OSDN Git Service

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