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