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