OSDN Git Service

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