OSDN Git Service

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