OSDN Git Service

(instantiate_decls{,_1}): Don't do instantiation here if the address
[pf3gnuchains/gcc-fork.git] / gcc / function.c
1 /* Expands front end tree to back end RTL for GNU C-Compiler
2    Copyright (C) 1987, 1988, 1989, 1991 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
10
11 GNU CC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING.  If not, write to
18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
19
20
21 /* This file handles the generation of rtl code from tree structure
22    at the level of the function as a whole.
23    It creates the rtl expressions for parameters and auto variables
24    and has full responsibility for allocating stack slots.
25
26    `expand_function_start' is called at the beginning of a function,
27    before the function body is parsed, and `expand_function_end' is
28    called after parsing the body.
29
30    Call `assign_stack_local' to allocate a stack slot for a local variable.
31    This is usually done during the RTL generation for the function body,
32    but it can also be done in the reload pass when a pseudo-register does
33    not get a hard register.
34
35    Call `put_var_into_stack' when you learn, belatedly, that a variable
36    previously given a pseudo-register must in fact go in the stack.
37    This function changes the DECL_RTL to be a stack slot instead of a reg
38    then scans all the RTL instructions so far generated to correct them.  */
39
40 #include "config.h"
41
42 #include <stdio.h>
43
44 #include "rtl.h"
45 #include "tree.h"
46 #include "flags.h"
47 #include "function.h"
48 #include "insn-flags.h"
49 #include "expr.h"
50 #include "insn-codes.h"
51 #include "regs.h"
52 #include "hard-reg-set.h"
53 #include "insn-config.h"
54 #include "recog.h"
55 #include "output.h"
56 #include "basic-block.h"
57
58 /* Round a value to the lowest integer less than it that is a multiple of
59    the required alignment.  Avoid using division in case the value is
60    negative.  Assume the alignment is a power of two.  */
61 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
62
63 /* Similar, but round to the next highest integer that meets the
64    alignment.  */
65 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
66
67 /* NEED_SEPARATE_AP means that we cannot derive ap from the value of fp
68    during rtl generation.  If they are different register numbers, this is
69    always true.  It may also be true if
70    FIRST_PARM_OFFSET - STARTING_FRAME_OFFSET is not a constant during rtl
71    generation.  See fix_lexical_addr for details.  */
72
73 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
74 #define NEED_SEPARATE_AP
75 #endif
76
77 /* Number of bytes of args popped by function being compiled on its return.
78    Zero if no bytes are to be popped.
79    May affect compilation of return insn or of function epilogue.  */
80
81 int current_function_pops_args;
82
83 /* Nonzero if function being compiled needs to be given an address
84    where the value should be stored.  */
85
86 int current_function_returns_struct;
87
88 /* Nonzero if function being compiled needs to
89    return the address of where it has put a structure value.  */
90
91 int current_function_returns_pcc_struct;
92
93 /* Nonzero if function being compiled needs to be passed a static chain.  */
94
95 int current_function_needs_context;
96
97 /* Nonzero if function being compiled can call setjmp.  */
98
99 int current_function_calls_setjmp;
100
101 /* Nonzero if function being compiled can call longjmp.  */
102
103 int current_function_calls_longjmp;
104
105 /* Nonzero if function being compiled receives nonlocal gotos
106    from nested functions.  */
107
108 int current_function_has_nonlocal_label;
109
110 /* Nonzero if function being compiled contains nested functions.  */
111
112 int current_function_contains_functions;
113
114 /* Nonzero if function being compiled can call alloca,
115    either as a subroutine or builtin.  */
116
117 int current_function_calls_alloca;
118
119 /* Nonzero if the current function returns a pointer type */
120
121 int current_function_returns_pointer;
122
123 /* If some insns can be deferred to the delay slots of the epilogue, the
124    delay list for them is recorded here.  */
125
126 rtx current_function_epilogue_delay_list;
127
128 /* If function's args have a fixed size, this is that size, in bytes.
129    Otherwise, it is -1.
130    May affect compilation of return insn or of function epilogue.  */
131
132 int current_function_args_size;
133
134 /* # bytes the prologue should push and pretend that the caller pushed them.
135    The prologue must do this, but only if parms can be passed in registers.  */
136
137 int current_function_pretend_args_size;
138
139 /* # of bytes of outgoing arguments required to be pushed by the prologue.
140    If this is non-zero, it means that ACCUMULATE_OUTGOING_ARGS was defined
141    and no stack adjusts will be done on function calls.  */
142
143 int current_function_outgoing_args_size;
144
145 /* This is the offset from the arg pointer to the place where the first
146    anonymous arg can be found, if there is one.  */
147
148 rtx current_function_arg_offset_rtx;
149
150 /* Nonzero if current function uses varargs.h or equivalent.
151    Zero for functions that use stdarg.h.  */
152
153 int current_function_varargs;
154
155 /* Quantities of various kinds of registers
156    used for the current function's args.  */
157
158 CUMULATIVE_ARGS current_function_args_info;
159
160 /* Name of function now being compiled.  */
161
162 char *current_function_name;
163
164 /* If non-zero, an RTL expression for that location at which the current
165    function returns its result.  Always equal to
166    DECL_RTL (DECL_RESULT (current_function_decl)), but provided
167    independently of the tree structures.  */
168
169 rtx current_function_return_rtx;
170
171 /* Nonzero if the current function uses the constant pool.  */
172
173 int current_function_uses_const_pool;
174
175 /* Nonzero if the current function uses pic_offset_table_rtx.  */
176 int current_function_uses_pic_offset_table;
177
178 /* The arg pointer hard register, or the pseudo into which it was copied.  */
179 rtx current_function_internal_arg_pointer;
180
181 /* The FUNCTION_DECL for an inline function currently being expanded.  */
182 tree inline_function_decl;
183
184 /* Number of function calls seen so far in current function.  */
185
186 int function_call_count;
187
188 /* List (chain of TREE_LIST) of LABEL_DECLs for all nonlocal labels
189    (labels to which there can be nonlocal gotos from nested functions)
190    in this function.  */
191
192 tree nonlocal_labels;
193
194 /* RTX for stack slot that holds the current handler for nonlocal gotos.
195    Zero when function does not have nonlocal labels.  */
196
197 rtx nonlocal_goto_handler_slot;
198
199 /* RTX for stack slot that holds the stack pointer value to restore
200    for a nonlocal goto.
201    Zero when function does not have nonlocal labels.  */
202
203 rtx nonlocal_goto_stack_level;
204
205 /* Label that will go on parm cleanup code, if any.
206    Jumping to this label runs cleanup code for parameters, if
207    such code must be run.  Following this code is the logical return label.  */
208
209 rtx cleanup_label;
210
211 /* Label that will go on function epilogue.
212    Jumping to this label serves as a "return" instruction
213    on machines which require execution of the epilogue on all returns.  */
214
215 rtx return_label;
216
217 /* List (chain of EXPR_LISTs) of pseudo-regs of SAVE_EXPRs.
218    So we can mark them all live at the end of the function, if nonopt.  */
219 rtx save_expr_regs;
220
221 /* List (chain of EXPR_LISTs) of all stack slots in this function.
222    Made for the sake of unshare_all_rtl.  */
223 rtx stack_slot_list;
224
225 /* Chain of all RTL_EXPRs that have insns in them.  */
226 tree rtl_expr_chain;
227
228 /* Label to jump back to for tail recursion, or 0 if we have
229    not yet needed one for this function.  */
230 rtx tail_recursion_label;
231
232 /* Place after which to insert the tail_recursion_label if we need one.  */
233 rtx tail_recursion_reentry;
234
235 /* Location at which to save the argument pointer if it will need to be
236    referenced.  There are two cases where this is done: if nonlocal gotos
237    exist, or if vars stored at an offset from the argument pointer will be
238    needed by inner routines.  */
239
240 rtx arg_pointer_save_area;
241
242 /* Offset to end of allocated area of stack frame.
243    If stack grows down, this is the address of the last stack slot allocated.
244    If stack grows up, this is the address for the next slot.  */
245 int frame_offset;
246
247 /* List (chain of TREE_LISTs) of static chains for containing functions.
248    Each link has a FUNCTION_DECL in the TREE_PURPOSE and a reg rtx
249    in an RTL_EXPR in the TREE_VALUE.  */
250 static tree context_display;
251
252 /* List (chain of TREE_LISTs) of trampolines for nested functions.
253    The trampoline sets up the static chain and jumps to the function.
254    We supply the trampoline's address when the function's address is requested.
255
256    Each link has a FUNCTION_DECL in the TREE_PURPOSE and a reg rtx
257    in an RTL_EXPR in the TREE_VALUE.  */
258 static tree trampoline_list;
259
260 /* Insn after which register parms and SAVE_EXPRs are born, if nonopt.  */
261 static rtx parm_birth_insn;
262
263 #if 0
264 /* Nonzero if a stack slot has been generated whose address is not
265    actually valid.  It means that the generated rtl must all be scanned
266    to detect and correct the invalid addresses where they occur.  */
267 static int invalid_stack_slot;
268 #endif
269
270 /* Last insn of those whose job was to put parms into their nominal homes.  */
271 static rtx last_parm_insn;
272
273 /* 1 + last pseudo register number used for loading a copy
274    of a parameter of this function.  */
275 static int max_parm_reg;
276
277 /* Vector indexed by REGNO, containing location on stack in which
278    to put the parm which is nominally in pseudo register REGNO,
279    if we discover that that parm must go in the stack.  */
280 static rtx *parm_reg_stack_loc;
281
282 #if 0  /* Turned off because 0 seems to work just as well.  */
283 /* Cleanup lists are required for binding levels regardless of whether
284    that binding level has cleanups or not.  This node serves as the
285    cleanup list whenever an empty list is required.  */
286 static tree empty_cleanup_list;
287 #endif
288
289 /* Nonzero once virtual register instantiation has been done.
290    assign_stack_local uses frame_pointer_rtx when this is nonzero.  */
291 static int virtuals_instantiated;
292
293 /* Nonzero if we need to distinguish between the return value of this function
294    and the return value of a function called by this function.  This helps
295    integrate.c  */
296
297 extern int rtx_equal_function_value_matters;
298
299 void fixup_gotos ();
300
301 static tree round_down ();
302 static rtx round_trampoline_addr ();
303 static rtx fixup_stack_1 ();
304 static void fixup_var_refs ();
305 static void fixup_var_refs_insns ();
306 static void fixup_var_refs_1 ();
307 static void optimize_bit_field ();
308 static void instantiate_decls ();
309 static void instantiate_decls_1 ();
310 static int instantiate_virtual_regs_1 ();
311 static rtx fixup_memory_subreg ();
312 static rtx walk_fixup_memory_subreg ();
313 \f
314 /* In order to evaluate some expressions, such as function calls returning
315    structures in memory, we need to temporarily allocate stack locations.
316    We record each allocated temporary in the following structure.
317
318    Associated with each temporary slot is a nesting level.  When we pop up
319    one level, all temporaries associated with the previous level are freed.
320    Normally, all temporaries are freed after the execution of the statement
321    in which they were created.  However, if we are inside a ({...}) grouping,
322    the result may be in a temporary and hence must be preserved.  If the
323    result could be in a temporary, we preserve it if we can determine which
324    one it is in.  If we cannot determine which temporary may contain the
325    result, all temporaries are preserved.  A temporary is preserved by
326    pretending it was allocated at the previous nesting level.
327
328    Automatic variables are also assigned temporary slots, at the nesting
329    level where they are defined.  They are marked a "kept" so that
330    free_temp_slots will not free them.  */
331
332 struct temp_slot
333 {
334   /* Points to next temporary slot.  */
335   struct temp_slot *next;
336   /* The rtx to used to reference the slot. */
337   rtx slot;
338   /* The size, in units, of the slot.  */
339   int size;
340   /* Non-zero if this temporary is currently in use.  */
341   char in_use;
342   /* Nesting level at which this slot is being used.  */
343   int level;
344   /* Non-zero if this should survive a call to free_temp_slots.  */
345   int keep;
346 };
347
348 /* List of all temporaries allocated, both available and in use.  */
349
350 struct temp_slot *temp_slots;
351
352 /* Current nesting level for temporaries.  */
353
354 int temp_slot_level;
355 \f
356 /* Pointer to chain of `struct function' for containing functions.  */
357 struct function *outer_function_chain;
358
359 /* Given a function decl for a containing function,
360    return the `struct function' for it.  */
361
362 struct function *
363 find_function_data (decl)
364      tree decl;
365 {
366   struct function *p;
367   for (p = outer_function_chain; p; p = p->next)
368     if (p->decl == decl)
369       return p;
370   abort ();
371 }
372
373 /* Save the current context for compilation of a nested function.
374    This is called from language-specific code.
375    The caller is responsible for saving any language-specific status,
376    since this function knows only about language-independent variables.  */
377
378 void
379 push_function_context ()
380 {
381   struct function *p = (struct function *) xmalloc (sizeof (struct function));
382
383   p->next = outer_function_chain;
384   outer_function_chain = p;
385
386   p->name = current_function_name;
387   p->decl = current_function_decl;
388   p->pops_args = current_function_pops_args;
389   p->returns_struct = current_function_returns_struct;
390   p->returns_pcc_struct = current_function_returns_pcc_struct;
391   p->needs_context = current_function_needs_context;
392   p->calls_setjmp = current_function_calls_setjmp;
393   p->calls_longjmp = current_function_calls_longjmp;
394   p->calls_alloca = current_function_calls_alloca;
395   p->has_nonlocal_label = current_function_has_nonlocal_label;
396   p->args_size = current_function_args_size;
397   p->pretend_args_size = current_function_pretend_args_size;
398   p->arg_offset_rtx = current_function_arg_offset_rtx;
399   p->uses_const_pool = current_function_uses_const_pool;
400   p->uses_pic_offset_table = current_function_uses_pic_offset_table;
401   p->internal_arg_pointer = current_function_internal_arg_pointer;
402   p->max_parm_reg = max_parm_reg;
403   p->parm_reg_stack_loc = parm_reg_stack_loc;
404   p->outgoing_args_size = current_function_outgoing_args_size;
405   p->return_rtx = current_function_return_rtx;
406   p->nonlocal_goto_handler_slot = nonlocal_goto_handler_slot;
407   p->nonlocal_goto_stack_level = nonlocal_goto_stack_level;
408   p->nonlocal_labels = nonlocal_labels;
409   p->cleanup_label = cleanup_label;
410   p->return_label = return_label;
411   p->save_expr_regs = save_expr_regs;
412   p->stack_slot_list = stack_slot_list;
413   p->parm_birth_insn = parm_birth_insn;
414   p->frame_offset = frame_offset;
415   p->tail_recursion_label = tail_recursion_label;
416   p->tail_recursion_reentry = tail_recursion_reentry;
417   p->arg_pointer_save_area = arg_pointer_save_area;
418   p->rtl_expr_chain = rtl_expr_chain;
419   p->last_parm_insn = last_parm_insn;
420   p->context_display = context_display;
421   p->trampoline_list = trampoline_list;
422   p->function_call_count = function_call_count;
423   p->temp_slots = temp_slots;
424   p->temp_slot_level = temp_slot_level;
425   p->fixup_var_refs_queue = 0;
426
427   save_tree_status (p);
428   save_storage_status (p);
429   save_emit_status (p);
430   init_emit ();
431   save_expr_status (p);
432   save_stmt_status (p);
433 }
434
435 /* Restore the last saved context, at the end of a nested function.
436    This function is called from language-specific code.  */
437
438 void
439 pop_function_context ()
440 {
441   struct function *p = outer_function_chain;
442
443   outer_function_chain = p->next;
444
445   current_function_name = p->name;
446   current_function_decl = p->decl;
447   current_function_pops_args = p->pops_args;
448   current_function_returns_struct = p->returns_struct;
449   current_function_returns_pcc_struct = p->returns_pcc_struct;
450   current_function_needs_context = p->needs_context;
451   current_function_calls_setjmp = p->calls_setjmp;
452   current_function_calls_longjmp = p->calls_longjmp;
453   current_function_calls_alloca = p->calls_alloca;
454   current_function_has_nonlocal_label = p->has_nonlocal_label;
455   current_function_contains_functions = 1;
456   current_function_args_size = p->args_size;
457   current_function_pretend_args_size = p->pretend_args_size;
458   current_function_arg_offset_rtx = p->arg_offset_rtx;
459   current_function_uses_const_pool = p->uses_const_pool;
460   current_function_uses_pic_offset_table = p->uses_pic_offset_table;
461   current_function_internal_arg_pointer = p->internal_arg_pointer;
462   max_parm_reg = p->max_parm_reg;
463   parm_reg_stack_loc = p->parm_reg_stack_loc;
464   current_function_outgoing_args_size = p->outgoing_args_size;
465   current_function_return_rtx = p->return_rtx;
466   nonlocal_goto_handler_slot = p->nonlocal_goto_handler_slot;
467   nonlocal_goto_stack_level = p->nonlocal_goto_stack_level;
468   nonlocal_labels = p->nonlocal_labels;
469   cleanup_label = p->cleanup_label;
470   return_label = p->return_label;
471   save_expr_regs = p->save_expr_regs;
472   stack_slot_list = p->stack_slot_list;
473   parm_birth_insn = p->parm_birth_insn;
474   frame_offset = p->frame_offset;
475   tail_recursion_label = p->tail_recursion_label;
476   tail_recursion_reentry = p->tail_recursion_reentry;
477   arg_pointer_save_area = p->arg_pointer_save_area;
478   rtl_expr_chain = p->rtl_expr_chain;
479   last_parm_insn = p->last_parm_insn;
480   context_display = p->context_display;
481   trampoline_list = p->trampoline_list;
482   function_call_count = p->function_call_count;
483   temp_slots = p->temp_slots;
484   temp_slot_level = p->temp_slot_level;
485
486   restore_tree_status (p);
487   restore_storage_status (p);
488   restore_expr_status (p);
489   restore_emit_status (p);
490   restore_stmt_status (p);
491
492   /* Finish doing put_var_into_stack for any of our variables
493      which became addressable during the nested function.  */
494   {
495     struct var_refs_queue *queue = p->fixup_var_refs_queue;
496     for (; queue; queue = queue->next)
497       fixup_var_refs (queue->modified);
498   }
499
500   free (p);
501
502   /* Reset variables that have known state during rtx generation.  */
503   rtx_equal_function_value_matters = 1;
504   virtuals_instantiated = 0;
505 }
506 \f
507 /* Allocate fixed slots in the stack frame of the current function.  */
508
509 /* Return size needed for stack frame based on slots so far allocated.
510    This size counts from zero.  It is not rounded to STACK_BOUNDARY;
511    the caller may have to do that.  */
512
513 int
514 get_frame_size ()
515 {
516 #ifdef FRAME_GROWS_DOWNWARD
517   return -frame_offset;
518 #else
519   return frame_offset;
520 #endif
521 }
522
523 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
524    with machine mode MODE.
525    
526    ALIGN controls the amount of alignment for the address of the slot:
527    0 means according to MODE,
528    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
529    positive specifies alignment boundary in bits.
530
531    We do not round to stack_boundary here.  */
532
533 rtx
534 assign_stack_local (mode, size, align)
535      enum machine_mode mode;
536      int size;
537      int align;
538 {
539   register rtx x, addr;
540   int bigend_correction = 0;
541   int alignment;
542
543   if (align == 0)
544     {
545       alignment = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
546       if (mode == BLKmode)
547         alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
548     }
549   else if (align == -1)
550     {
551       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
552       size = CEIL_ROUND (size, alignment);
553     }
554   else
555     alignment = align / BITS_PER_UNIT;
556
557   /* Round frame offset to that alignment.
558      We must be careful here, since FRAME_OFFSET might be negative and
559      division with a negative dividend isn't as well defined as we might
560      like.  So we instead assume that ALIGNMENT is a power of two and
561      use logical operations which are unambiguous.  */
562 #ifdef FRAME_GROWS_DOWNWARD
563   frame_offset = FLOOR_ROUND (frame_offset, alignment);
564 #else
565   frame_offset = CEIL_ROUND (frame_offset, alignment);
566 #endif
567
568   /* On a big-endian machine, if we are allocating more space than we will use,
569      use the least significant bytes of those that are allocated.  */
570 #if BYTES_BIG_ENDIAN
571   if (mode != BLKmode)
572     bigend_correction = size - GET_MODE_SIZE (mode);
573 #endif
574
575 #ifdef FRAME_GROWS_DOWNWARD
576   frame_offset -= size;
577 #endif
578
579   /* If we have already instantiated virtual registers, return the actual
580      address relative to the frame pointer.  */
581   if (virtuals_instantiated)
582     addr = plus_constant (frame_pointer_rtx,
583                           (frame_offset + bigend_correction
584                            + STARTING_FRAME_OFFSET));
585   else
586     addr = plus_constant (virtual_stack_vars_rtx,
587                           frame_offset + bigend_correction);
588
589 #ifndef FRAME_GROWS_DOWNWARD
590   frame_offset += size;
591 #endif
592
593   x = gen_rtx (MEM, mode, addr);
594
595   stack_slot_list = gen_rtx (EXPR_LIST, VOIDmode, x, stack_slot_list);
596
597   return x;
598 }
599
600 /* Assign a stack slot in a containing function.
601    First three arguments are same as in preceding function.
602    The last argument specifies the function to allocate in.  */
603
604 rtx
605 assign_outer_stack_local (mode, size, align, function)
606      enum machine_mode mode;
607      int size;
608      int align;
609      struct function *function;
610 {
611   register rtx x, addr;
612   int bigend_correction = 0;
613   int alignment;
614
615   /* Allocate in the memory associated with the function in whose frame
616      we are assigning.  */
617   push_obstacks (function->function_obstack,
618                  function->function_maybepermanent_obstack);
619
620   if (align == 0)
621     {
622       alignment = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
623       if (mode == BLKmode)
624         alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
625     }
626   else if (align == -1)
627     {
628       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
629       size = CEIL_ROUND (size, alignment);
630     }
631   else
632     alignment = align / BITS_PER_UNIT;
633
634   /* Round frame offset to that alignment.  */
635 #ifdef FRAME_GROWS_DOWNWARD
636   frame_offset = FLOOR_ROUND (frame_offset, alignment);
637 #else
638   frame_offset = CEIL_ROUND (frame_offset, alignment);
639 #endif
640
641   /* On a big-endian machine, if we are allocating more space than we will use,
642      use the least significant bytes of those that are allocated.  */
643 #if BYTES_BIG_ENDIAN
644   if (mode != BLKmode)
645     bigend_correction = size - GET_MODE_SIZE (mode);
646 #endif
647
648 #ifdef FRAME_GROWS_DOWNWARD
649   function->frame_offset -= size;
650 #endif
651   addr = plus_constant (virtual_stack_vars_rtx,
652                         function->frame_offset + bigend_correction);
653 #ifndef FRAME_GROWS_DOWNWARD
654   function->frame_offset += size;
655 #endif
656
657   x = gen_rtx (MEM, mode, addr);
658
659   function->stack_slot_list
660     = gen_rtx (EXPR_LIST, VOIDmode, x, function->stack_slot_list);
661
662   pop_obstacks ();
663
664   return x;
665 }
666 \f
667 /* Allocate a temporary stack slot and record it for possible later
668    reuse.
669
670    MODE is the machine mode to be given to the returned rtx.
671
672    SIZE is the size in units of the space required.  We do no rounding here
673    since assign_stack_local will do any required rounding.
674
675    KEEP is non-zero if this slot is to be retained after a call to
676    free_temp_slots.  Automatic variables for a block are allocated with this
677    flag.  */
678
679 rtx
680 assign_stack_temp (mode, size, keep)
681      enum machine_mode mode;
682      int size;
683      int keep;
684 {
685   struct temp_slot *p, *best_p = 0;
686
687   /* First try to find an available, already-allocated temporary that is the
688      exact size we require.  */
689   for (p = temp_slots; p; p = p->next)
690     if (p->size == size && GET_MODE (p->slot) == mode && ! p->in_use)
691       break;
692
693   /* If we didn't find, one, try one that is larger than what we want.  We
694      find the smallest such.  */
695   if (p == 0)
696     for (p = temp_slots; p; p = p->next)
697       if (p->size > size && GET_MODE (p->slot) == mode && ! p->in_use
698           && (best_p == 0 || best_p->size > p->size))
699         best_p = p;
700
701   /* Make our best, if any, the one to use.  */
702   if (best_p)
703     p = best_p;
704
705   /* If we still didn't find one, make a new temporary.  */
706   if (p == 0)
707     {
708       p = (struct temp_slot *) oballoc (sizeof (struct temp_slot));
709       p->size = size;
710       /* If the temp slot mode doesn't indicate the alignment,
711          use the largest possible, so no one will be disappointed.  */
712       p->slot = assign_stack_local (mode, size, mode == BLKmode ? -1 : 0); 
713       p->next = temp_slots;
714       temp_slots = p;
715     }
716
717   p->in_use = 1;
718   p->level = temp_slot_level;
719   p->keep = keep;
720   return p->slot;
721 }
722 \f
723 /* If X could be a reference to a temporary slot, mark that slot as belonging
724    to the to one level higher.  If X matched one of our slots, just mark that
725    one.  Otherwise, we can't easily predict which it is, so upgrade all of
726    them.  Kept slots need not be touched.
727
728    This is called when an ({...}) construct occurs and a statement
729    returns a value in memory.  */
730
731 void
732 preserve_temp_slots (x)
733      rtx x;
734 {
735   struct temp_slot *p;
736
737   /* If X is not in memory or is at a constant address, it cannot be in
738      a temporary slot.  */
739   if (x == 0 || GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0)))
740     return;
741
742   /* First see if we can find a match.  */
743   for (p = temp_slots; p; p = p->next)
744     if (p->in_use && x == p->slot)
745       {
746         p->level--;
747         return;
748       }
749
750   /* Otherwise, preserve all non-kept slots at this level.  */
751   for (p = temp_slots; p; p = p->next)
752     if (p->in_use && p->level == temp_slot_level && ! p->keep)
753       p->level--;
754 }
755
756 /* Free all temporaries used so far.  This is normally called at the end
757    of generating code for a statement.  */
758
759 void
760 free_temp_slots ()
761 {
762   struct temp_slot *p;
763
764   for (p = temp_slots; p; p = p->next)
765     if (p->in_use && p->level == temp_slot_level && ! p->keep)
766       p->in_use = 0;
767 }
768
769 /* Push deeper into the nesting level for stack temporaries.  */
770
771 void
772 push_temp_slots ()
773 {
774   /* For GNU C++, we must allow a sequence to be emitted anywhere in
775      the level where the sequence was started.  By not changing levels
776      when the compiler is inside a sequence, the temporaries for the
777      sequence and the temporaries will not unwittingly conflict with
778      the temporaries for other sequences and/or code at that level.  */
779   if (in_sequence_p ())
780     return;
781
782   temp_slot_level++;
783 }
784
785 /* Pop a temporary nesting level.  All slots in use in the current level
786    are freed.  */
787
788 void
789 pop_temp_slots ()
790 {
791   struct temp_slot *p;
792
793   /* See comment in push_temp_slots about why we don't change levels
794      in sequences.  */
795   if (in_sequence_p ())
796     return;
797
798   for (p = temp_slots; p; p = p->next)
799     if (p->in_use && p->level == temp_slot_level)
800       p->in_use = 0;
801
802   temp_slot_level--;
803 }
804 \f
805 /* Retroactively move an auto variable from a register to a stack slot.
806    This is done when an address-reference to the variable is seen.  */
807
808 void
809 put_var_into_stack (decl)
810      tree decl;
811 {
812   register rtx reg;
813   register rtx new = 0;
814   struct function *function = 0;
815   tree context = decl_function_context (decl);
816
817   /* Get the current rtl used for this object.  */
818   reg = TREE_CODE (decl) == SAVE_EXPR ? SAVE_EXPR_RTL (decl) : DECL_RTL (decl);
819
820   /* If this variable comes from an outer function,
821      find that function's saved context.  */
822   if (context != current_function_decl)
823     for (function = outer_function_chain; function; function = function->next)
824       if (function->decl == context)
825         break;
826
827   /* No need to do anything if decl has no rtx yet
828      since in that case caller is setting TREE_ADDRESSABLE
829      and a stack slot will be assigned when the rtl is made.  */
830   if (reg == 0)
831     return;
832
833   /* If this is a variable-size object with a pseudo to address it,
834      put that pseudo into the stack, if the var is nonlocal.  */
835   if (DECL_NONLOCAL (decl)
836       && GET_CODE (reg) == MEM
837       && GET_CODE (XEXP (reg, 0)) == REG
838       && REGNO (XEXP (reg, 0)) > LAST_VIRTUAL_REGISTER)
839     reg = XEXP (reg, 0);
840   if (GET_CODE (reg) != REG)
841     return;
842
843   if (function)
844     {
845       if (REGNO (reg) < function->max_parm_reg)
846         new = function->parm_reg_stack_loc[REGNO (reg)];
847       if (new == 0)
848         new = assign_outer_stack_local (GET_MODE (reg),
849                                         GET_MODE_SIZE (GET_MODE (reg)),
850                                         0, function);
851     }
852   else
853     {
854       if (REGNO (reg) < max_parm_reg)
855         new = parm_reg_stack_loc[REGNO (reg)];
856       if (new == 0)
857         new = assign_stack_local (GET_MODE (reg),
858                                   GET_MODE_SIZE (GET_MODE (reg)),
859                                   0);
860     }
861
862   XEXP (reg, 0) = XEXP (new, 0);
863   /* `volatil' bit means one thing for MEMs, another entirely for REGs.  */
864   REG_USERVAR_P (reg) = 0;
865   PUT_CODE (reg, MEM);
866
867   /* If this is a memory ref that contains aggregate components,
868      mark it as such for cse and loop optimize.  */
869   MEM_IN_STRUCT_P (reg)
870     = (TREE_CODE (TREE_TYPE (decl)) == ARRAY_TYPE
871        || TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
872        || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE);
873
874   /* Now make sure that all refs to the variable, previously made
875      when it was a register, are fixed up to be valid again.  */
876   if (function)
877     {
878       struct var_refs_queue *temp;
879
880       /* Variable is inherited; fix it up when we get back to its function.  */
881       push_obstacks (function->function_obstack,
882                      function->function_maybepermanent_obstack);
883       temp
884         = (struct var_refs_queue *) oballoc (sizeof (struct var_refs_queue));
885       temp->modified = reg;
886       temp->next = function->fixup_var_refs_queue;
887       function->fixup_var_refs_queue = temp;
888       pop_obstacks ();
889     }
890   else
891     /* Variable is local; fix it up now.  */
892     fixup_var_refs (reg);
893 }
894 \f
895 static void
896 fixup_var_refs (var)
897      rtx var;
898 {
899   tree pending;
900   rtx first_insn = get_insns ();
901   struct sequence_stack *stack = sequence_stack;
902   tree rtl_exps = rtl_expr_chain;
903
904   /* Must scan all insns for stack-refs that exceed the limit.  */
905   fixup_var_refs_insns (var, first_insn, stack == 0);
906
907   /* Scan all pending sequences too.  */
908   for (; stack; stack = stack->next)
909     {
910       push_to_sequence (stack->first);
911       fixup_var_refs_insns (var, stack->first, stack->next != 0);
912       /* Update remembered end of sequence
913          in case we added an insn at the end.  */
914       stack->last = get_last_insn ();
915       end_sequence ();
916     }
917
918   /* Scan all waiting RTL_EXPRs too.  */
919   for (pending = rtl_exps; pending; pending = TREE_CHAIN (pending))
920     {
921       rtx seq = RTL_EXPR_SEQUENCE (TREE_VALUE (pending));
922       if (seq != const0_rtx && seq != 0)
923         {
924           push_to_sequence (seq);
925           fixup_var_refs_insns (var, seq, 0);
926           end_sequence ();
927         }
928     }
929 }
930 \f
931 /* This structure is used by the following two functions to record MEMs or
932    pseudos used to replace VAR, any SUBREGs of VAR, and any MEMs containing
933    VAR as an address.  We need to maintain this list in case two operands of
934    an insn were required to match; in that case we must ensure we use the
935    same replacement.  */
936
937 struct fixup_replacement
938 {
939   rtx old;
940   rtx new;
941   struct fixup_replacement *next;
942 };
943    
944 /* REPLACEMENTS is a pointer to a list of the above structures and X is
945    some part of an insn.  Return a struct fixup_replacement whose OLD
946    value is equal to X.  Allocate a new structure if no such entry exists. */
947
948 static struct fixup_replacement *
949 find_replacement (replacements, x)
950      struct fixup_replacement **replacements;
951      rtx x;
952 {
953   struct fixup_replacement *p;
954
955   /* See if we have already replaced this.  */
956   for (p = *replacements; p && p->old != x; p = p->next)
957     ;
958
959   if (p == 0)
960     {
961       p = (struct fixup_replacement *) oballoc (sizeof (struct fixup_replacement));
962       p->old = x;
963       p->new = 0;
964       p->next = *replacements;
965       *replacements = p;
966     }
967
968   return p;
969 }
970
971 /* Scan the insn-chain starting with INSN for refs to VAR
972    and fix them up.  TOPLEVEL is nonzero if this chain is the
973    main chain of insns for the current function.  */
974
975 static void
976 fixup_var_refs_insns (var, insn, toplevel)
977      rtx var;
978      rtx insn;
979      int toplevel;
980 {
981   while (insn)
982     {
983       rtx next = NEXT_INSN (insn);
984       rtx note;
985       if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
986           || GET_CODE (insn) == JUMP_INSN)
987         {
988           /* The insn to load VAR from a home in the arglist
989              is now a no-op.  When we see it, just delete it.  */
990           if (toplevel
991               && GET_CODE (PATTERN (insn)) == SET
992               && SET_DEST (PATTERN (insn)) == var
993               && rtx_equal_p (SET_SRC (PATTERN (insn)), var))
994             {
995               next = delete_insn (insn);
996               if (insn == last_parm_insn)
997                 last_parm_insn = PREV_INSN (next);
998             }
999           else
1000             {
1001               /* See if we have to do anything to INSN now that VAR is in
1002                  memory.  If it needs to be loaded into a pseudo, use a single
1003                  pseudo for the entire insn in case there is a MATCH_DUP
1004                  between two operands.  We pass a pointer to the head of
1005                  a list of struct fixup_replacements.  If fixup_var_refs_1
1006                  needs to allocate pseudos or replacement MEMs (for SUBREGs),
1007                  it will record them in this list.
1008                  
1009                  If it allocated a pseudo for any replacement, we copy into
1010                  it here.  */
1011
1012               struct fixup_replacement *replacements = 0;
1013
1014               fixup_var_refs_1 (var, &PATTERN (insn), insn, &replacements);
1015
1016               while (replacements)
1017                 {
1018                   if (GET_CODE (replacements->new) == REG)
1019                     {
1020                       rtx insert_before;
1021
1022                       /* OLD might be a (subreg (mem)).  */
1023                       if (GET_CODE (replacements->old) == SUBREG)
1024                         replacements->old
1025                           = fixup_memory_subreg (replacements->old, insn, 0);
1026                       else
1027                         replacements->old
1028                           = fixup_stack_1 (replacements->old, insn);
1029
1030                       /* We can not separate USE insns from the CALL_INSN
1031                          that they belong to.  If this is a CALL_INSN, insert
1032                          the move insn before the USE insns preceding it
1033                          instead of immediately before the insn.  */
1034                       if (GET_CODE (insn) == CALL_INSN)
1035                         {
1036                           insert_before = insn;
1037                           while (GET_CODE (PREV_INSN (insert_before)) == INSN
1038                                  && GET_CODE (PATTERN (PREV_INSN (insert_before))) == USE)
1039                             insert_before = PREV_INSN (insert_before);
1040                         }
1041                       else
1042                         insert_before = insn;
1043
1044                       emit_insn_before (gen_move_insn (replacements->new,
1045                                                        replacements->old),
1046                                         insert_before);
1047                     }
1048
1049                   replacements = replacements->next;
1050                 }
1051             }
1052
1053           /* Also fix up any invalid exprs in the REG_NOTES of this insn.
1054              But don't touch other insns referred to by reg-notes;
1055              we will get them elsewhere.  */
1056           for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
1057             if (GET_CODE (note) != INSN_LIST)
1058               XEXP (note, 0) = walk_fixup_memory_subreg (XEXP (note, 0), insn);
1059         }
1060       insn = next;
1061     }
1062 }
1063 \f
1064 /* VAR is a MEM that used to be a pseudo register.  See if the rtx expression
1065    at *LOC in INSN needs to be changed.
1066
1067    REPLACEMENTS is a pointer to a list head that starts out zero, but may
1068    contain a list of original rtx's and replacements. If we find that we need
1069    to modify this insn by replacing a memory reference with a pseudo or by
1070    making a new MEM to implement a SUBREG, we consult that list to see if
1071    we have already chosen a replacement. If none has already been allocated,
1072    we allocate it and update the list.  fixup_var_refs_insns will copy VAR
1073    or the SUBREG, as appropriate, to the pseudo.  */
1074
1075 static void
1076 fixup_var_refs_1 (var, loc, insn, replacements)
1077      register rtx var;
1078      register rtx *loc;
1079      rtx insn;
1080      struct fixup_replacement **replacements;
1081 {
1082   register int i;
1083   register rtx x = *loc;
1084   RTX_CODE code = GET_CODE (x);
1085   register char *fmt;
1086   register rtx tem, tem1;
1087   struct fixup_replacement *replacement;
1088
1089   switch (code)
1090     {
1091     case MEM:
1092       if (var == x)
1093         {
1094           /* If we already have a replacement, use it.  Otherwise, 
1095              try to fix up this address in case it is invalid.  */
1096
1097           replacement = find_replacement (replacements, var);
1098           if (replacement->new)
1099             {
1100               *loc = replacement->new;
1101               return;
1102             }
1103
1104           *loc = replacement->new = x = fixup_stack_1 (x, insn);
1105
1106           /* Unless we are forcing memory to register, we can leave things
1107              the way they are if the insn is valid.  */
1108              
1109           INSN_CODE (insn) = -1;
1110           if (! flag_force_mem && recog_memoized (insn) >= 0)
1111             return;
1112
1113           *loc = replacement->new = gen_reg_rtx (GET_MODE (x));
1114           return;
1115         }
1116
1117       /* If X contains VAR, we need to unshare it here so that we update
1118          each occurrence separately.  But all identical MEMs in one insn
1119          must be replaced with the same rtx because of the possibility of
1120          MATCH_DUPs.  */
1121
1122       if (reg_mentioned_p (var, x))
1123         {
1124           replacement = find_replacement (replacements, x);
1125           if (replacement->new == 0)
1126             replacement->new = copy_most_rtx (x, var);
1127
1128           *loc = x = replacement->new;
1129         }
1130       break;
1131
1132     case REG:
1133     case CC0:
1134     case PC:
1135     case CONST_INT:
1136     case CONST:
1137     case SYMBOL_REF:
1138     case LABEL_REF:
1139     case CONST_DOUBLE:
1140       return;
1141
1142     case SIGN_EXTRACT:
1143     case ZERO_EXTRACT:
1144       /* Note that in some cases those types of expressions are altered
1145          by optimize_bit_field, and do not survive to get here.  */
1146       if (XEXP (x, 0) == var
1147           || (GET_CODE (XEXP (x, 0)) == SUBREG
1148               && SUBREG_REG (XEXP (x, 0)) == var))
1149         {
1150           /* Get TEM as a valid MEM in the mode presently in the insn.
1151
1152              We don't worry about the possibility of MATCH_DUP here; it
1153              is highly unlikely and would be tricky to handle.  */
1154
1155           tem = XEXP (x, 0);
1156           if (GET_CODE (tem) == SUBREG)
1157             tem = fixup_memory_subreg (tem, insn, 1);
1158           tem = fixup_stack_1 (tem, insn);
1159
1160           /* Unless we want to load from memory, get TEM into the proper mode
1161              for an extract from memory.  This can only be done if the
1162              extract is at a constant position and length.  */
1163
1164           if (! flag_force_mem && GET_CODE (XEXP (x, 1)) == CONST_INT
1165               && GET_CODE (XEXP (x, 2)) == CONST_INT
1166               && ! mode_dependent_address_p (XEXP (tem, 0))
1167               && ! MEM_VOLATILE_P (tem))
1168             {
1169               enum machine_mode wanted_mode = VOIDmode;
1170               enum machine_mode is_mode = GET_MODE (tem);
1171               int width = INTVAL (XEXP (x, 1));
1172               int pos = INTVAL (XEXP (x, 2));
1173
1174 #ifdef HAVE_extzv
1175               if (GET_CODE (x) == ZERO_EXTRACT)
1176                 wanted_mode = insn_operand_mode[(int) CODE_FOR_extzv][1];
1177 #endif
1178 #ifdef HAVE_extv
1179               if (GET_CODE (x) == SIGN_EXTRACT)
1180                 wanted_mode = insn_operand_mode[(int) CODE_FOR_extv][1];
1181 #endif
1182               /* If we have a narrower mode, we can do something.  */
1183               if (wanted_mode != VOIDmode
1184                   && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
1185                 {
1186                   int offset = pos / BITS_PER_UNIT;
1187                   rtx old_pos = XEXP (x, 2);
1188                   rtx newmem;
1189
1190                   /* If the bytes and bits are counted differently, we
1191                      must adjust the offset.  */
1192 #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
1193                   offset = (GET_MODE_SIZE (is_mode)
1194                             - GET_MODE_SIZE (wanted_mode) - offset);
1195 #endif
1196
1197                   pos %= GET_MODE_BITSIZE (wanted_mode);
1198
1199                   newmem = gen_rtx (MEM, wanted_mode,
1200                                     plus_constant (XEXP (tem, 0), offset));
1201                   RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (tem);
1202                   MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (tem);
1203                   MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (tem);
1204
1205                   /* Make the change and see if the insn remains valid.  */
1206                   INSN_CODE (insn) = -1;
1207                   XEXP (x, 0) = newmem;
1208                   XEXP (x, 2) = GEN_INT (pos);
1209
1210                   if (recog_memoized (insn) >= 0)
1211                     return;
1212
1213                   /* Otherwise, restore old position.  XEXP (x, 0) will be
1214                      restored later.  */
1215                   XEXP (x, 2) = old_pos;
1216                 }
1217             }
1218
1219           /* If we get here, the bitfield extract insn can't accept a memory
1220              reference.  Copy the input into a register.  */
1221
1222           tem1 = gen_reg_rtx (GET_MODE (tem));
1223           emit_insn_before (gen_move_insn (tem1, tem), insn);
1224           XEXP (x, 0) = tem1;
1225           return;
1226         }
1227       break;
1228               
1229     case SUBREG:
1230       if (SUBREG_REG (x) == var)
1231         {
1232           /* If this SUBREG makes VAR wider, it has become a paradoxical
1233              SUBREG with VAR in memory, but these aren't allowed at this 
1234              stage of the compilation.  So load VAR into a pseudo and take
1235              a SUBREG of that pseudo.  */
1236           if (GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (var)))
1237             {
1238               replacement = find_replacement (replacements, var);
1239               if (replacement->new == 0)
1240                 replacement->new = gen_reg_rtx (GET_MODE (var));
1241               SUBREG_REG (x) = replacement->new;
1242               return;
1243             }
1244
1245           /* See if we have already found a replacement for this SUBREG.
1246              If so, use it.  Otherwise, make a MEM and see if the insn
1247              is recognized.  If not, or if we should force MEM into a register,
1248              make a pseudo for this SUBREG.  */
1249           replacement = find_replacement (replacements, x);
1250           if (replacement->new)
1251             {
1252               *loc = replacement->new;
1253               return;
1254             }
1255           
1256           replacement->new = *loc = fixup_memory_subreg (x, insn, 0);
1257
1258           if (! flag_force_mem && recog_memoized (insn) >= 0)
1259             return;
1260
1261           *loc = replacement->new = gen_reg_rtx (GET_MODE (x));
1262           return;
1263         }
1264       break;
1265
1266     case SET:
1267       /* First do special simplification of bit-field references.  */
1268       if (GET_CODE (SET_DEST (x)) == SIGN_EXTRACT
1269           || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
1270         optimize_bit_field (x, insn, 0);
1271       if (GET_CODE (SET_SRC (x)) == SIGN_EXTRACT
1272           || GET_CODE (SET_SRC (x)) == ZERO_EXTRACT)
1273         optimize_bit_field (x, insn, NULL_PTR);
1274
1275       /* If SET_DEST is now a paradoxical SUBREG, put the result of this
1276          insn into a pseudo and store the low part of the pseudo into VAR. */
1277       if (GET_CODE (SET_DEST (x)) == SUBREG
1278           && SUBREG_REG (SET_DEST (x)) == var
1279           && (GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
1280               > GET_MODE_SIZE (GET_MODE (var))))
1281         {
1282           SET_DEST (x) = tem = gen_reg_rtx (GET_MODE (SET_DEST (x)));
1283           emit_insn_after (gen_move_insn (var, gen_lowpart (GET_MODE (var),
1284                                                             tem)),
1285                            insn);
1286           break;
1287         }
1288           
1289       {
1290         rtx dest = SET_DEST (x);
1291         rtx src = SET_SRC (x);
1292         rtx outerdest = dest;
1293
1294         while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
1295                || GET_CODE (dest) == SIGN_EXTRACT
1296                || GET_CODE (dest) == ZERO_EXTRACT)
1297           dest = XEXP (dest, 0);
1298
1299         if (GET_CODE (src) == SUBREG)
1300           src = XEXP (src, 0);
1301
1302         /* If VAR does not appear at the top level of the SET
1303            just scan the lower levels of the tree.  */
1304
1305         if (src != var && dest != var)
1306           break;
1307
1308         /* We will need to rerecognize this insn.  */
1309         INSN_CODE (insn) = -1;
1310
1311 #ifdef HAVE_insv
1312         if (GET_CODE (outerdest) == ZERO_EXTRACT && dest == var)
1313           {
1314             /* Since this case will return, ensure we fixup all the
1315                operands here.  */
1316             fixup_var_refs_1 (var, &XEXP (outerdest, 1), insn, replacements);
1317             fixup_var_refs_1 (var, &XEXP (outerdest, 2), insn, replacements);
1318             fixup_var_refs_1 (var, &SET_SRC (x), insn, replacements);
1319
1320             tem = XEXP (outerdest, 0);
1321
1322             /* Clean up (SUBREG:SI (MEM:mode ...) 0)
1323                that may appear inside a ZERO_EXTRACT.
1324                This was legitimate when the MEM was a REG.  */
1325             if (GET_CODE (tem) == SUBREG
1326                 && SUBREG_REG (tem) == var)
1327               tem = fixup_memory_subreg (tem, insn, 1);
1328             else
1329               tem = fixup_stack_1 (tem, insn);
1330
1331             if (GET_CODE (XEXP (outerdest, 1)) == CONST_INT
1332                 && GET_CODE (XEXP (outerdest, 2)) == CONST_INT
1333                 && ! mode_dependent_address_p (XEXP (tem, 0))
1334                 && ! MEM_VOLATILE_P (tem))
1335               {
1336                 enum machine_mode wanted_mode
1337                   = insn_operand_mode[(int) CODE_FOR_insv][0];
1338                 enum machine_mode is_mode = GET_MODE (tem);
1339                 int width = INTVAL (XEXP (outerdest, 1));
1340                 int pos = INTVAL (XEXP (outerdest, 2));
1341
1342                 /* If we have a narrower mode, we can do something.  */
1343                 if (GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
1344                   {
1345                     int offset = pos / BITS_PER_UNIT;
1346                     rtx old_pos = XEXP (outerdest, 2);
1347                     rtx newmem;
1348
1349 #if BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN
1350                     offset = (GET_MODE_SIZE (is_mode)
1351                               - GET_MODE_SIZE (wanted_mode) - offset);
1352 #endif
1353
1354                     pos %= GET_MODE_BITSIZE (wanted_mode);
1355
1356                     newmem = gen_rtx (MEM, wanted_mode,
1357                                       plus_constant (XEXP (tem, 0), offset));
1358                     RTX_UNCHANGING_P (newmem) = RTX_UNCHANGING_P (tem);
1359                     MEM_VOLATILE_P (newmem) = MEM_VOLATILE_P (tem);
1360                     MEM_IN_STRUCT_P (newmem) = MEM_IN_STRUCT_P (tem);
1361
1362                     /* Make the change and see if the insn remains valid.  */
1363                     INSN_CODE (insn) = -1;
1364                     XEXP (outerdest, 0) = newmem;
1365                     XEXP (outerdest, 2) = GEN_INT (pos);
1366                     
1367                     if (recog_memoized (insn) >= 0)
1368                       return;
1369                     
1370                     /* Otherwise, restore old position.  XEXP (x, 0) will be
1371                        restored later.  */
1372                     XEXP (outerdest, 2) = old_pos;
1373                   }
1374               }
1375
1376             /* If we get here, the bit-field store doesn't allow memory
1377                or isn't located at a constant position.  Load the value into
1378                a register, do the store, and put it back into memory.  */
1379
1380             tem1 = gen_reg_rtx (GET_MODE (tem));
1381             emit_insn_before (gen_move_insn (tem1, tem), insn);
1382             emit_insn_after (gen_move_insn (tem, tem1), insn);
1383             XEXP (outerdest, 0) = tem1;
1384             return;
1385           }
1386 #endif
1387
1388         /* STRICT_LOW_PART is a no-op on memory references
1389            and it can cause combinations to be unrecognizable,
1390            so eliminate it.  */
1391
1392         if (dest == var && GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
1393           SET_DEST (x) = XEXP (SET_DEST (x), 0);
1394
1395         /* A valid insn to copy VAR into or out of a register
1396            must be left alone, to avoid an infinite loop here.
1397            If the reference to VAR is by a subreg, fix that up,
1398            since SUBREG is not valid for a memref.
1399            Also fix up the address of the stack slot.  */
1400
1401         if ((SET_SRC (x) == var
1402              || (GET_CODE (SET_SRC (x)) == SUBREG
1403                  && SUBREG_REG (SET_SRC (x)) == var))
1404             && (GET_CODE (SET_DEST (x)) == REG
1405                 || (GET_CODE (SET_DEST (x)) == SUBREG
1406                     && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG))
1407             && recog_memoized (insn) >= 0)
1408           {
1409             replacement = find_replacement (replacements, SET_SRC (x));
1410             if (replacement->new)
1411               {
1412               SET_SRC (x) = replacement->new;
1413               return;
1414             }
1415             else if (GET_CODE (SET_SRC (x)) == SUBREG)
1416               SET_SRC (x) = replacement->new
1417                 = fixup_memory_subreg (SET_SRC (x), insn, 0);
1418             else
1419               SET_SRC (x) = replacement->new
1420                 = fixup_stack_1 (SET_SRC (x), insn);
1421             return;
1422           }
1423
1424         if ((SET_DEST (x) == var
1425              || (GET_CODE (SET_DEST (x)) == SUBREG
1426                  && SUBREG_REG (SET_DEST (x)) == var))
1427             && (GET_CODE (SET_SRC (x)) == REG
1428                 || (GET_CODE (SET_SRC (x)) == SUBREG
1429                     && GET_CODE (SUBREG_REG (SET_SRC (x))) == REG))
1430             && recog_memoized (insn) >= 0)
1431           {
1432             if (GET_CODE (SET_DEST (x)) == SUBREG)
1433               SET_DEST (x) = fixup_memory_subreg (SET_DEST (x), insn, 0);
1434             else
1435               SET_DEST (x) = fixup_stack_1 (SET_DEST (x), insn);
1436             return;
1437           }
1438
1439         /* Otherwise, storing into VAR must be handled specially
1440            by storing into a temporary and copying that into VAR
1441            with a new insn after this one.  */
1442
1443         if (dest == var)
1444           {
1445             rtx temp;
1446             rtx fixeddest;
1447             tem = SET_DEST (x);
1448             /* STRICT_LOW_PART can be discarded, around a MEM.  */
1449             if (GET_CODE (tem) == STRICT_LOW_PART)
1450               tem = XEXP (tem, 0);
1451             /* Convert (SUBREG (MEM)) to a MEM in a changed mode.  */
1452             if (GET_CODE (tem) == SUBREG)
1453               fixeddest = fixup_memory_subreg (tem, insn, 0);
1454             else
1455               fixeddest = fixup_stack_1 (tem, insn);
1456
1457             temp = gen_reg_rtx (GET_MODE (tem));
1458             emit_insn_after (gen_move_insn (fixeddest, temp), insn);
1459             SET_DEST (x) = temp;
1460           }
1461       }
1462     }
1463
1464   /* Nothing special about this RTX; fix its operands.  */
1465
1466   fmt = GET_RTX_FORMAT (code);
1467   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1468     {
1469       if (fmt[i] == 'e')
1470         fixup_var_refs_1 (var, &XEXP (x, i), insn, replacements);
1471       if (fmt[i] == 'E')
1472         {
1473           register int j;
1474           for (j = 0; j < XVECLEN (x, i); j++)
1475             fixup_var_refs_1 (var, &XVECEXP (x, i, j), insn, replacements);
1476         }
1477     }
1478 }
1479 \f
1480 /* Given X, an rtx of the form (SUBREG:m1 (MEM:m2 addr)),
1481    return an rtx (MEM:m1 newaddr) which is equivalent.
1482    If any insns must be emitted to compute NEWADDR, put them before INSN.
1483
1484    UNCRITICAL nonzero means accept paradoxical subregs.
1485    This is used for subregs found inside of ZERO_EXTRACTs.  */
1486
1487 static rtx
1488 fixup_memory_subreg (x, insn, uncritical)
1489      rtx x;
1490      rtx insn;
1491      int uncritical;
1492 {
1493   int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
1494   rtx addr = XEXP (SUBREG_REG (x), 0);
1495   enum machine_mode mode = GET_MODE (x);
1496   rtx saved, result;
1497
1498   /* Paradoxical SUBREGs are usually invalid during RTL generation.  */
1499   if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
1500       && ! uncritical)
1501     abort ();
1502
1503 #if BYTES_BIG_ENDIAN
1504   offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
1505              - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
1506 #endif
1507   addr = plus_constant (addr, offset);
1508   if (!flag_force_addr && memory_address_p (mode, addr))
1509     /* Shortcut if no insns need be emitted.  */
1510     return change_address (SUBREG_REG (x), mode, addr);
1511   start_sequence ();
1512   result = change_address (SUBREG_REG (x), mode, addr);
1513   emit_insn_before (gen_sequence (), insn);
1514   end_sequence ();
1515   return result;
1516 }
1517
1518 /* Do fixup_memory_subreg on all (SUBREG (MEM ...) ...) contained in X.
1519    Replace subexpressions of X in place.
1520    If X itself is a (SUBREG (MEM ...) ...), return the replacement expression.
1521    Otherwise return X, with its contents possibly altered.
1522
1523    If any insns must be emitted to compute NEWADDR, put them before INSN.  */
1524
1525 static rtx
1526 walk_fixup_memory_subreg (x, insn)
1527      register rtx x;
1528      rtx insn;
1529 {
1530   register enum rtx_code code;
1531   register char *fmt;
1532   register int i;
1533
1534   if (x == 0)
1535     return 0;
1536
1537   code = GET_CODE (x);
1538
1539   if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
1540     return fixup_memory_subreg (x, insn, 0);
1541
1542   /* Nothing special about this RTX; fix its operands.  */
1543
1544   fmt = GET_RTX_FORMAT (code);
1545   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1546     {
1547       if (fmt[i] == 'e')
1548         XEXP (x, i) = walk_fixup_memory_subreg (XEXP (x, i), insn);
1549       if (fmt[i] == 'E')
1550         {
1551           register int j;
1552           for (j = 0; j < XVECLEN (x, i); j++)
1553             XVECEXP (x, i, j)
1554               = walk_fixup_memory_subreg (XVECEXP (x, i, j), insn);
1555         }
1556     }
1557   return x;
1558 }
1559 \f
1560 #if 0
1561 /* Fix up any references to stack slots that are invalid memory addresses
1562    because they exceed the maximum range of a displacement.  */
1563
1564 void
1565 fixup_stack_slots ()
1566 {
1567   register rtx insn;
1568
1569   /* Did we generate a stack slot that is out of range
1570      or otherwise has an invalid address?  */
1571   if (invalid_stack_slot)
1572     {
1573       /* Yes.  Must scan all insns for stack-refs that exceed the limit.  */
1574       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1575         if (GET_CODE (insn) == INSN || GET_CODE (insn) == CALL_INSN
1576             || GET_CODE (insn) == JUMP_INSN)
1577           fixup_stack_1 (PATTERN (insn), insn);
1578     }
1579 }
1580 #endif
1581
1582 /* For each memory ref within X, if it refers to a stack slot
1583    with an out of range displacement, put the address in a temp register
1584    (emitting new insns before INSN to load these registers)
1585    and alter the memory ref to use that register.
1586    Replace each such MEM rtx with a copy, to avoid clobberage.  */
1587
1588 static rtx
1589 fixup_stack_1 (x, insn)
1590      rtx x;
1591      rtx insn;
1592 {
1593   register int i;
1594   register RTX_CODE code = GET_CODE (x);
1595   register char *fmt;
1596
1597   if (code == MEM)
1598     {
1599       register rtx ad = XEXP (x, 0);
1600       /* If we have address of a stack slot but it's not valid
1601          (displacement is too large), compute the sum in a register.  */
1602       if (GET_CODE (ad) == PLUS
1603           && GET_CODE (XEXP (ad, 0)) == REG
1604           && REGNO (XEXP (ad, 0)) >= FIRST_VIRTUAL_REGISTER
1605           && REGNO (XEXP (ad, 0)) <= LAST_VIRTUAL_REGISTER
1606           && GET_CODE (XEXP (ad, 1)) == CONST_INT)
1607         {
1608           rtx temp, seq;
1609           if (memory_address_p (GET_MODE (x), ad))
1610             return x;
1611
1612           start_sequence ();
1613           temp = copy_to_reg (ad);
1614           seq = gen_sequence ();
1615           end_sequence ();
1616           emit_insn_before (seq, insn);
1617           return change_address (x, VOIDmode, temp);
1618         }
1619       return x;
1620     }
1621
1622   fmt = GET_RTX_FORMAT (code);
1623   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1624     {
1625       if (fmt[i] == 'e')
1626         XEXP (x, i) = fixup_stack_1 (XEXP (x, i), insn);
1627       if (fmt[i] == 'E')
1628         {
1629           register int j;
1630           for (j = 0; j < XVECLEN (x, i); j++)
1631             XVECEXP (x, i, j) = fixup_stack_1 (XVECEXP (x, i, j), insn);
1632         }
1633     }
1634   return x;
1635 }
1636 \f
1637 /* Optimization: a bit-field instruction whose field
1638    happens to be a byte or halfword in memory
1639    can be changed to a move instruction.
1640
1641    We call here when INSN is an insn to examine or store into a bit-field.
1642    BODY is the SET-rtx to be altered.
1643
1644    EQUIV_MEM is the table `reg_equiv_mem' if that is available; else 0.
1645    (Currently this is called only from function.c, and EQUIV_MEM
1646    is always 0.)  */
1647
1648 static void
1649 optimize_bit_field (body, insn, equiv_mem)
1650      rtx body;
1651      rtx insn;
1652      rtx *equiv_mem;
1653 {
1654   register rtx bitfield;
1655   int destflag;
1656   rtx seq = 0;
1657   enum machine_mode mode;
1658
1659   if (GET_CODE (SET_DEST (body)) == SIGN_EXTRACT
1660       || GET_CODE (SET_DEST (body)) == ZERO_EXTRACT)
1661     bitfield = SET_DEST (body), destflag = 1;
1662   else
1663     bitfield = SET_SRC (body), destflag = 0;
1664
1665   /* First check that the field being stored has constant size and position
1666      and is in fact a byte or halfword suitably aligned.  */
1667
1668   if (GET_CODE (XEXP (bitfield, 1)) == CONST_INT
1669       && GET_CODE (XEXP (bitfield, 2)) == CONST_INT
1670       && ((mode = mode_for_size (INTVAL (XEXP (bitfield, 1)), MODE_INT, 1))
1671           != BLKmode)
1672       && INTVAL (XEXP (bitfield, 2)) % INTVAL (XEXP (bitfield, 1)) == 0)
1673     {
1674       register rtx memref = 0;
1675
1676       /* Now check that the containing word is memory, not a register,
1677          and that it is safe to change the machine mode.  */
1678
1679       if (GET_CODE (XEXP (bitfield, 0)) == MEM)
1680         memref = XEXP (bitfield, 0);
1681       else if (GET_CODE (XEXP (bitfield, 0)) == REG
1682                && equiv_mem != 0)
1683         memref = equiv_mem[REGNO (XEXP (bitfield, 0))];
1684       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
1685                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == MEM)
1686         memref = SUBREG_REG (XEXP (bitfield, 0));
1687       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
1688                && equiv_mem != 0
1689                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == REG)
1690         memref = equiv_mem[REGNO (SUBREG_REG (XEXP (bitfield, 0)))];
1691
1692       if (memref
1693           && ! mode_dependent_address_p (XEXP (memref, 0))
1694           && ! MEM_VOLATILE_P (memref))
1695         {
1696           /* Now adjust the address, first for any subreg'ing
1697              that we are now getting rid of,
1698              and then for which byte of the word is wanted.  */
1699
1700           register int offset = INTVAL (XEXP (bitfield, 2));
1701           /* Adjust OFFSET to count bits from low-address byte.  */
1702 #if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN
1703           offset = (GET_MODE_BITSIZE (GET_MODE (XEXP (bitfield, 0)))
1704                     - offset - INTVAL (XEXP (bitfield, 1)));
1705 #endif
1706           /* Adjust OFFSET to count bytes from low-address byte.  */
1707           offset /= BITS_PER_UNIT;
1708           if (GET_CODE (XEXP (bitfield, 0)) == SUBREG)
1709             {
1710               offset += SUBREG_WORD (XEXP (bitfield, 0)) * UNITS_PER_WORD;
1711 #if BYTES_BIG_ENDIAN
1712               offset -= (MIN (UNITS_PER_WORD,
1713                               GET_MODE_SIZE (GET_MODE (XEXP (bitfield, 0))))
1714                          - MIN (UNITS_PER_WORD,
1715                                 GET_MODE_SIZE (GET_MODE (memref))));
1716 #endif
1717             }
1718
1719           memref = change_address (memref, mode, 
1720                                    plus_constant (XEXP (memref, 0), offset));
1721
1722           /* Store this memory reference where
1723              we found the bit field reference.  */
1724
1725           if (destflag)
1726             {
1727               validate_change (insn, &SET_DEST (body), memref, 1);
1728               if (! CONSTANT_ADDRESS_P (SET_SRC (body)))
1729                 {
1730                   rtx src = SET_SRC (body);
1731                   while (GET_CODE (src) == SUBREG
1732                          && SUBREG_WORD (src) == 0)
1733                     src = SUBREG_REG (src);
1734                   if (GET_MODE (src) != GET_MODE (memref))
1735                     src = gen_lowpart (GET_MODE (memref), SET_SRC (body));
1736                   validate_change (insn, &SET_SRC (body), src, 1);
1737                 }
1738               else if (GET_MODE (SET_SRC (body)) != VOIDmode
1739                        && GET_MODE (SET_SRC (body)) != GET_MODE (memref))
1740                 /* This shouldn't happen because anything that didn't have
1741                    one of these modes should have got converted explicitly
1742                    and then referenced through a subreg.
1743                    This is so because the original bit-field was
1744                    handled by agg_mode and so its tree structure had
1745                    the same mode that memref now has.  */
1746                 abort ();
1747             }
1748           else
1749             {
1750               rtx dest = SET_DEST (body);
1751
1752               while (GET_CODE (dest) == SUBREG
1753                      && SUBREG_WORD (dest) == 0)
1754                 dest = SUBREG_REG (dest);
1755
1756               validate_change (insn, &SET_DEST (body), dest, 1);
1757
1758               if (GET_MODE (dest) == GET_MODE (memref))
1759                 validate_change (insn, &SET_SRC (body), memref, 1);
1760               else
1761                 {
1762                   /* Convert the mem ref to the destination mode.  */
1763                   rtx newreg = gen_reg_rtx (GET_MODE (dest));
1764
1765                   start_sequence ();
1766                   convert_move (newreg, memref,
1767                                 GET_CODE (SET_SRC (body)) == ZERO_EXTRACT);
1768                   seq = get_insns ();
1769                   end_sequence ();
1770
1771                   validate_change (insn, &SET_SRC (body), newreg, 1);
1772                 }
1773             }
1774
1775           /* See if we can convert this extraction or insertion into
1776              a simple move insn.  We might not be able to do so if this
1777              was, for example, part of a PARALLEL.
1778
1779              If we succeed, write out any needed conversions.  If we fail,
1780              it is hard to guess why we failed, so don't do anything
1781              special; just let the optimization be suppressed.  */
1782
1783           if (apply_change_group () && seq)
1784             emit_insns_before (seq, insn);
1785         }
1786     }
1787 }
1788 \f
1789 /* These routines are responsible for converting virtual register references
1790    to the actual hard register references once RTL generation is complete.
1791
1792    The following four variables are used for communication between the
1793    routines.  They contain the offsets of the virtual registers from their
1794    respective hard registers.  */
1795
1796 static int in_arg_offset;
1797 static int var_offset;
1798 static int dynamic_offset;
1799 static int out_arg_offset;
1800
1801 /* In most machines, the stack pointer register is equivalent to the bottom
1802    of the stack.  */
1803
1804 #ifndef STACK_POINTER_OFFSET
1805 #define STACK_POINTER_OFFSET    0
1806 #endif
1807
1808 /* If not defined, pick an appropriate default for the offset of dynamically
1809    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1810    REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
1811
1812 #ifndef STACK_DYNAMIC_OFFSET
1813
1814 #ifdef ACCUMULATE_OUTGOING_ARGS
1815 /* The bottom of the stack points to the actual arguments.  If
1816    REG_PARM_STACK_SPACE is defined, this includes the space for the register
1817    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
1818    stack space for register parameters is not pushed by the caller, but 
1819    rather part of the fixed stack areas and hence not included in
1820    `current_function_outgoing_args_size'.  Nevertheless, we must allow
1821    for it when allocating stack dynamic objects.  */
1822
1823 #if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
1824 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1825 (current_function_outgoing_args_size    \
1826  + REG_PARM_STACK_SPACE (FNDECL) + (STACK_POINTER_OFFSET))
1827
1828 #else
1829 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1830 (current_function_outgoing_args_size + (STACK_POINTER_OFFSET))
1831 #endif
1832
1833 #else
1834 #define STACK_DYNAMIC_OFFSET(FNDECL) STACK_POINTER_OFFSET
1835 #endif
1836 #endif
1837
1838 /* Pass through the INSNS of function FNDECL and convert virtual register
1839    references to hard register references.  */
1840
1841 void
1842 instantiate_virtual_regs (fndecl, insns)
1843      tree fndecl;
1844      rtx insns;
1845 {
1846   rtx insn;
1847
1848   /* Compute the offsets to use for this function.  */
1849   in_arg_offset = FIRST_PARM_OFFSET (fndecl);
1850   var_offset = STARTING_FRAME_OFFSET;
1851   dynamic_offset = STACK_DYNAMIC_OFFSET (fndecl);
1852   out_arg_offset = STACK_POINTER_OFFSET;
1853
1854   /* Scan all variables and parameters of this function.  For each that is
1855      in memory, instantiate all virtual registers if the result is a valid
1856      address.  If not, we do it later.  That will handle most uses of virtual
1857      regs on many machines.  */
1858   instantiate_decls (fndecl, 1);
1859
1860   /* Initialize recognition, indicating that volatile is OK.  */
1861   init_recog ();
1862
1863   /* Scan through all the insns, instantiating every virtual register still
1864      present.  */
1865   for (insn = insns; insn; insn = NEXT_INSN (insn))
1866     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
1867         || GET_CODE (insn) == CALL_INSN)
1868       {
1869         instantiate_virtual_regs_1 (&PATTERN (insn), insn, 1);
1870         instantiate_virtual_regs_1 (&REG_NOTES (insn), NULL_RTX, 0);
1871       }
1872
1873   /* Now instantiate the remaining register equivalences for debugging info.
1874      These will not be valid addresses.  */
1875   instantiate_decls (fndecl, 0);
1876
1877   /* Indicate that, from now on, assign_stack_local should use
1878      frame_pointer_rtx.  */
1879   virtuals_instantiated = 1;
1880 }
1881
1882 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1883    all virtual registers in their DECL_RTL's.
1884
1885    If VALID_ONLY, do this only if the resulting address is still valid.
1886    Otherwise, always do it.  */
1887
1888 static void
1889 instantiate_decls (fndecl, valid_only)
1890      tree fndecl;
1891      int valid_only;
1892 {
1893   tree decl;
1894
1895   if (DECL_INLINE (fndecl))
1896     /* When compiling an inline function, the obstack used for
1897        rtl allocation is the maybepermanent_obstack.  Calling
1898        `resume_temporary_allocation' switches us back to that
1899        obstack while we process this function's parameters.  */
1900     resume_temporary_allocation ();
1901
1902   /* Process all parameters of the function.  */
1903   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
1904     {
1905       if (DECL_RTL (decl) && GET_CODE (DECL_RTL (decl)) == MEM
1906           && (! valid_only
1907               || ! mode_dependent_address_p (XEXP (DECL_RTL (decl), 0))))
1908         instantiate_virtual_regs_1 (&XEXP (DECL_RTL (decl), 0),
1909                                     (valid_only ? DECL_RTL (decl) : NULL_RTX),
1910                                     0);
1911       if (DECL_INCOMING_RTL (decl)
1912           && GET_CODE (DECL_INCOMING_RTL (decl)) == MEM
1913           && (! valid_only
1914               || ! mode_dependent_address_p (XEXP (DECL_INCOMING_RTL (decl), 0))))
1915         instantiate_virtual_regs_1 (&XEXP (DECL_INCOMING_RTL (decl), 0),
1916                                     (valid_only ? DECL_INCOMING_RTL (decl)
1917                                      : NULL_RTX),
1918                                     0);
1919     }
1920
1921   /* Now process all variables defined in the function or its subblocks. */
1922   instantiate_decls_1 (DECL_INITIAL (fndecl), valid_only);
1923
1924   if (DECL_INLINE (fndecl))
1925     {
1926       /* Save all rtl allocated for this function by raising the
1927          high-water mark on the maybepermanent_obstack.  */
1928       preserve_data ();
1929       /* All further rtl allocation is now done in the current_obstack.  */
1930       rtl_in_current_obstack ();
1931     }
1932 }
1933
1934 /* Subroutine of instantiate_decls: Process all decls in the given
1935    BLOCK node and all its subblocks.  */
1936
1937 static void
1938 instantiate_decls_1 (let, valid_only)
1939      tree let;
1940      int valid_only;
1941 {
1942   tree t;
1943
1944   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
1945     if (DECL_RTL (t) && GET_CODE (DECL_RTL (t)) == MEM
1946         && (! valid_only
1947             || ! mode_dependent_address_p (XEXP (DECL_RTL (t), 0))))
1948       instantiate_virtual_regs_1 (& XEXP (DECL_RTL (t), 0),
1949                                   valid_only ? DECL_RTL (t) : NULL_RTX, 0);
1950
1951   /* Process all subblocks.  */
1952   for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
1953     instantiate_decls_1 (t, valid_only);
1954 }
1955 \f
1956 /* Given a pointer to a piece of rtx and an optional pointer to the
1957    containing object, instantiate any virtual registers present in it.
1958
1959    If EXTRA_INSNS, we always do the replacement and generate
1960    any extra insns before OBJECT.  If it zero, we do nothing if replacement
1961    is not valid.
1962
1963    Return 1 if we either had nothing to do or if we were able to do the
1964    needed replacement.  Return 0 otherwise; we only return zero if 
1965    EXTRA_INSNS is zero.
1966
1967    We first try some simple transformations to avoid the creation of extra
1968    pseudos.  */
1969
1970 static int
1971 instantiate_virtual_regs_1 (loc, object, extra_insns)
1972      rtx *loc;
1973      rtx object;
1974      int extra_insns;
1975 {
1976   rtx x;
1977   RTX_CODE code;
1978   rtx new = 0;
1979   int offset;
1980   rtx temp;
1981   rtx seq;
1982   int i, j;
1983   char *fmt;
1984
1985   /* Re-start here to avoid recursion in common cases.  */
1986  restart:
1987
1988   x = *loc;
1989   if (x == 0)
1990     return 1;
1991
1992   code = GET_CODE (x);
1993
1994   /* Check for some special cases.  */
1995   switch (code)
1996     {
1997     case CONST_INT:
1998     case CONST_DOUBLE:
1999     case CONST:
2000     case SYMBOL_REF:
2001     case CODE_LABEL:
2002     case PC:
2003     case CC0:
2004     case ASM_INPUT:
2005     case ADDR_VEC:
2006     case ADDR_DIFF_VEC:
2007     case RETURN:
2008       return 1;
2009
2010     case SET:
2011       /* We are allowed to set the virtual registers.  This means that
2012          that the actual register should receive the source minus the
2013          appropriate offset.  This is used, for example, in the handling
2014          of non-local gotos.  */
2015       if (SET_DEST (x) == virtual_incoming_args_rtx)
2016         new = arg_pointer_rtx, offset = - in_arg_offset;
2017       else if (SET_DEST (x) == virtual_stack_vars_rtx)
2018         new = frame_pointer_rtx, offset = - var_offset;
2019       else if (SET_DEST (x) == virtual_stack_dynamic_rtx)
2020         new = stack_pointer_rtx, offset = - dynamic_offset;
2021       else if (SET_DEST (x) == virtual_outgoing_args_rtx)
2022         new = stack_pointer_rtx, offset = - out_arg_offset;
2023
2024       if (new)
2025         {
2026           /* The only valid sources here are PLUS or REG.  Just do
2027              the simplest possible thing to handle them.  */
2028           if (GET_CODE (SET_SRC (x)) != REG
2029               && GET_CODE (SET_SRC (x)) != PLUS)
2030             abort ();
2031
2032           start_sequence ();
2033           if (GET_CODE (SET_SRC (x)) != REG)
2034             temp = force_operand (SET_SRC (x), NULL_RTX);
2035           else
2036             temp = SET_SRC (x);
2037           temp = force_operand (plus_constant (temp, offset), NULL_RTX);
2038           seq = get_insns ();
2039           end_sequence ();
2040
2041           emit_insns_before (seq, object);
2042           SET_DEST (x) = new;
2043
2044           if (!validate_change (object, &SET_SRC (x), temp, 0)
2045               || ! extra_insns)
2046             abort ();
2047
2048           return 1;
2049         }
2050
2051       instantiate_virtual_regs_1 (&SET_DEST (x), object, extra_insns);
2052       loc = &SET_SRC (x);
2053       goto restart;
2054
2055     case PLUS:
2056       /* Handle special case of virtual register plus constant.  */
2057       if (CONSTANT_P (XEXP (x, 1)))
2058         {
2059           rtx old;
2060
2061           /* Check for (plus (plus VIRT foo) (const_int)) first.  */
2062           if (GET_CODE (XEXP (x, 0)) == PLUS)
2063             {
2064               rtx inner = XEXP (XEXP (x, 0), 0);
2065
2066               if (inner == virtual_incoming_args_rtx)
2067                 new = arg_pointer_rtx, offset = in_arg_offset;
2068               else if (inner == virtual_stack_vars_rtx)
2069                 new = frame_pointer_rtx, offset = var_offset;
2070               else if (inner == virtual_stack_dynamic_rtx)
2071                 new = stack_pointer_rtx, offset = dynamic_offset;
2072               else if (inner == virtual_outgoing_args_rtx)
2073                 new = stack_pointer_rtx, offset = out_arg_offset;
2074               else
2075                 {
2076                   loc = &XEXP (x, 0);
2077                   goto restart;
2078                 }
2079
2080               instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 1), object,
2081                                           extra_insns);
2082               new = gen_rtx (PLUS, Pmode, new, XEXP (XEXP (x, 0), 1));
2083             }
2084
2085           else if (XEXP (x, 0) == virtual_incoming_args_rtx)
2086             new = arg_pointer_rtx, offset = in_arg_offset;
2087           else if (XEXP (x, 0) == virtual_stack_vars_rtx)
2088             new = frame_pointer_rtx, offset = var_offset;
2089           else if (XEXP (x, 0) == virtual_stack_dynamic_rtx)
2090             new = stack_pointer_rtx, offset = dynamic_offset;
2091           else if (XEXP (x, 0) == virtual_outgoing_args_rtx)
2092             new = stack_pointer_rtx, offset = out_arg_offset;
2093           else
2094             {
2095               /* We know the second operand is a constant.  Unless the
2096                  first operand is a REG (which has been already checked),
2097                  it needs to be checked.  */
2098               if (GET_CODE (XEXP (x, 0)) != REG)
2099                 {
2100                   loc = &XEXP (x, 0);
2101                   goto restart;
2102                 }
2103               return 1;
2104             }
2105
2106           old = XEXP (x, 0);
2107           XEXP (x, 0) = new;
2108           new = plus_constant (XEXP (x, 1), offset);
2109
2110           /* If the new constant is zero, try to replace the sum with its
2111              first operand.  */
2112           if (new == const0_rtx
2113               && validate_change (object, loc, XEXP (x, 0), 0))
2114             return 1;
2115
2116           /* Next try to replace constant with new one.  */
2117           if (!validate_change (object, &XEXP (x, 1), new, 0))
2118             {
2119               if (! extra_insns)
2120                 {
2121                   XEXP (x, 0) = old;
2122                   return 0;
2123                 }
2124
2125               /* Otherwise copy the new constant into a register and replace
2126                  constant with that register.  */
2127               temp = gen_reg_rtx (Pmode);
2128               if (validate_change (object, &XEXP (x, 1), temp, 0))
2129                 emit_insn_before (gen_move_insn (temp, new), object);
2130               else
2131                 {
2132                   /* If that didn't work, replace this expression with a
2133                      register containing the sum.  */
2134
2135                   new = gen_rtx (PLUS, Pmode, XEXP (x, 0), new);
2136                   XEXP (x, 0) = old;
2137
2138                   start_sequence ();
2139                   temp = force_operand (new, NULL_RTX);
2140                   seq = get_insns ();
2141                   end_sequence ();
2142
2143                   emit_insns_before (seq, object);
2144                   if (! validate_change (object, loc, temp, 0)
2145                       && ! validate_replace_rtx (x, temp, object))
2146                     abort ();
2147                 }
2148             }
2149
2150           return 1;
2151         }
2152
2153       /* Fall through to generic two-operand expression case.  */
2154     case EXPR_LIST:
2155     case CALL:
2156     case COMPARE:
2157     case MINUS:
2158     case MULT:
2159     case DIV:      case UDIV:
2160     case MOD:      case UMOD:
2161     case AND:      case IOR:      case XOR:
2162     case LSHIFT:   case ASHIFT:   case ROTATE:
2163     case ASHIFTRT: case LSHIFTRT: case ROTATERT:
2164     case NE:       case EQ:
2165     case GE:       case GT:       case GEU:    case GTU:
2166     case LE:       case LT:       case LEU:    case LTU:
2167       if (XEXP (x, 1) && ! CONSTANT_P (XEXP (x, 1)))
2168         instantiate_virtual_regs_1 (&XEXP (x, 1), object, extra_insns);
2169       loc = &XEXP (x, 0);
2170       goto restart;
2171
2172     case MEM:
2173       /* Most cases of MEM that convert to valid addresses have already been
2174          handled by our scan of regno_reg_rtx.  The only special handling we
2175          need here is to make a copy of the rtx to ensure it isn't being
2176          shared if we have to change it to a pseudo. 
2177
2178          If the rtx is a simple reference to an address via a virtual register,
2179          it can potentially be shared.  In such cases, first try to make it
2180          a valid address, which can also be shared.  Otherwise, copy it and
2181          proceed normally. 
2182
2183          First check for common cases that need no processing.  These are
2184          usually due to instantiation already being done on a previous instance
2185          of a shared rtx.  */
2186
2187       temp = XEXP (x, 0);
2188       if (CONSTANT_ADDRESS_P (temp)
2189 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
2190           || temp == arg_pointer_rtx
2191 #endif
2192           || temp == frame_pointer_rtx)
2193         return 1;
2194
2195       if (GET_CODE (temp) == PLUS
2196           && CONSTANT_ADDRESS_P (XEXP (temp, 1))
2197           && (XEXP (temp, 0) == frame_pointer_rtx
2198 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
2199               || XEXP (temp, 0) == arg_pointer_rtx
2200 #endif
2201               ))
2202         return 1;
2203
2204       if (temp == virtual_stack_vars_rtx
2205           || temp == virtual_incoming_args_rtx
2206           || (GET_CODE (temp) == PLUS
2207               && CONSTANT_ADDRESS_P (XEXP (temp, 1))
2208               && (XEXP (temp, 0) == virtual_stack_vars_rtx
2209                   || XEXP (temp, 0) == virtual_incoming_args_rtx)))
2210         {
2211           /* This MEM may be shared.  If the substitution can be done without
2212              the need to generate new pseudos, we want to do it in place
2213              so all copies of the shared rtx benefit.  The call below will
2214              only make substitutions if the resulting address is still
2215              valid.
2216
2217              Note that we cannot pass X as the object in the recursive call
2218              since the insn being processed may not allow all valid
2219              addresses.  However, if we were not passed on object, we can
2220              only modify X without copying it if X will have a valid
2221              address.
2222
2223              ??? Also note that this can still lose if OBJECT is an insn that
2224              has less restrictions on an address that some other insn.
2225              In that case, we will modify the shared address.  This case
2226              doesn't seem very likely, though.  */
2227
2228           if (instantiate_virtual_regs_1 (&XEXP (x, 0),
2229                                           object ? object : x, 0))
2230             return 1;
2231
2232           /* Otherwise make a copy and process that copy.  We copy the entire
2233              RTL expression since it might be a PLUS which could also be
2234              shared.  */
2235           *loc = x = copy_rtx (x);
2236         }
2237
2238       /* Fall through to generic unary operation case.  */
2239     case USE:
2240     case CLOBBER:
2241     case SUBREG:
2242     case STRICT_LOW_PART:
2243     case NEG:          case NOT:
2244     case PRE_DEC:      case PRE_INC:      case POST_DEC:    case POST_INC:
2245     case SIGN_EXTEND:  case ZERO_EXTEND:
2246     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
2247     case FLOAT:        case FIX:
2248     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
2249     case ABS:
2250     case SQRT:
2251     case FFS:
2252       /* These case either have just one operand or we know that we need not
2253          check the rest of the operands.  */
2254       loc = &XEXP (x, 0);
2255       goto restart;
2256
2257     case REG:
2258       /* Try to replace with a PLUS.  If that doesn't work, compute the sum
2259          in front of this insn and substitute the temporary.  */
2260       if (x == virtual_incoming_args_rtx)
2261         new = arg_pointer_rtx, offset = in_arg_offset;
2262       else if (x == virtual_stack_vars_rtx)
2263         new = frame_pointer_rtx, offset = var_offset;
2264       else if (x == virtual_stack_dynamic_rtx)
2265         new = stack_pointer_rtx, offset = dynamic_offset;
2266       else if (x == virtual_outgoing_args_rtx)
2267         new = stack_pointer_rtx, offset = out_arg_offset;
2268
2269       if (new)
2270         {
2271           temp = plus_constant (new, offset);
2272           if (!validate_change (object, loc, temp, 0))
2273             {
2274               if (! extra_insns)
2275                 return 0;
2276
2277               start_sequence ();
2278               temp = force_operand (temp, NULL_RTX);
2279               seq = get_insns ();
2280               end_sequence ();
2281
2282               emit_insns_before (seq, object);
2283               if (! validate_change (object, loc, temp, 0)
2284                   && ! validate_replace_rtx (x, temp, object))
2285                 abort ();
2286             }
2287         }
2288
2289       return 1;
2290     }
2291
2292   /* Scan all subexpressions.  */
2293   fmt = GET_RTX_FORMAT (code);
2294   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
2295     if (*fmt == 'e')
2296       {
2297         if (!instantiate_virtual_regs_1 (&XEXP (x, i), object, extra_insns))
2298           return 0;
2299       }
2300     else if (*fmt == 'E')
2301       for (j = 0; j < XVECLEN (x, i); j++)
2302         if (! instantiate_virtual_regs_1 (&XVECEXP (x, i, j), object,
2303                                           extra_insns))
2304           return 0;
2305
2306   return 1;
2307 }
2308 \f
2309 /* Optimization: assuming this function does not receive nonlocal gotos,
2310    delete the handlers for such, as well as the insns to establish
2311    and disestablish them.  */
2312
2313 static void
2314 delete_handlers ()
2315 {
2316   rtx insn;
2317   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
2318     {
2319       /* Delete the handler by turning off the flag that would
2320          prevent jump_optimize from deleting it.
2321          Also permit deletion of the nonlocal labels themselves
2322          if nothing local refers to them.  */
2323       if (GET_CODE (insn) == CODE_LABEL)
2324         LABEL_PRESERVE_P (insn) = 0;
2325       if (GET_CODE (insn) == INSN
2326           && ((nonlocal_goto_handler_slot != 0
2327                && reg_mentioned_p (nonlocal_goto_handler_slot, PATTERN (insn)))
2328               || (nonlocal_goto_stack_level != 0
2329                   && reg_mentioned_p (nonlocal_goto_stack_level,
2330                                       PATTERN (insn)))))
2331         delete_insn (insn);
2332     }
2333 }
2334
2335 /* Return a list (chain of EXPR_LIST nodes) for the nonlocal labels
2336    of the current function.  */
2337
2338 rtx
2339 nonlocal_label_rtx_list ()
2340 {
2341   tree t;
2342   rtx x = 0;
2343
2344   for (t = nonlocal_labels; t; t = TREE_CHAIN (t))
2345     x = gen_rtx (EXPR_LIST, VOIDmode, label_rtx (TREE_VALUE (t)), x);
2346
2347   return x;
2348 }
2349 \f
2350 /* Output a USE for any register use in RTL.
2351    This is used with -noreg to mark the extent of lifespan
2352    of any registers used in a user-visible variable's DECL_RTL.  */
2353
2354 void
2355 use_variable (rtl)
2356      rtx rtl;
2357 {
2358   if (GET_CODE (rtl) == REG)
2359     /* This is a register variable.  */
2360     emit_insn (gen_rtx (USE, VOIDmode, rtl));
2361   else if (GET_CODE (rtl) == MEM
2362            && GET_CODE (XEXP (rtl, 0)) == REG
2363            && (REGNO (XEXP (rtl, 0)) < FIRST_VIRTUAL_REGISTER
2364                || REGNO (XEXP (rtl, 0)) > LAST_VIRTUAL_REGISTER)
2365            && XEXP (rtl, 0) != current_function_internal_arg_pointer)
2366     /* This is a variable-sized structure.  */
2367     emit_insn (gen_rtx (USE, VOIDmode, XEXP (rtl, 0)));
2368 }
2369
2370 /* Like use_variable except that it outputs the USEs after INSN
2371    instead of at the end of the insn-chain.  */
2372
2373 void
2374 use_variable_after (rtl, insn)
2375      rtx rtl, insn;
2376 {
2377   if (GET_CODE (rtl) == REG)
2378     /* This is a register variable.  */
2379     emit_insn_after (gen_rtx (USE, VOIDmode, rtl), insn);
2380   else if (GET_CODE (rtl) == MEM
2381            && GET_CODE (XEXP (rtl, 0)) == REG
2382            && (REGNO (XEXP (rtl, 0)) < FIRST_VIRTUAL_REGISTER
2383                || REGNO (XEXP (rtl, 0)) > LAST_VIRTUAL_REGISTER)
2384            && XEXP (rtl, 0) != current_function_internal_arg_pointer)
2385     /* This is a variable-sized structure.  */
2386     emit_insn_after (gen_rtx (USE, VOIDmode, XEXP (rtl, 0)), insn);
2387 }
2388 \f
2389 int
2390 max_parm_reg_num ()
2391 {
2392   return max_parm_reg;
2393 }
2394
2395 /* Return the first insn following those generated by `assign_parms'.  */
2396
2397 rtx
2398 get_first_nonparm_insn ()
2399 {
2400   if (last_parm_insn)
2401     return NEXT_INSN (last_parm_insn);
2402   return get_insns ();
2403 }
2404
2405 /* Return 1 if EXP returns an aggregate value, for which an address
2406    must be passed to the function or returned by the function.  */
2407
2408 int
2409 aggregate_value_p (exp)
2410      tree exp;
2411 {
2412   if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
2413     return 1;
2414   if (RETURN_IN_MEMORY (TREE_TYPE (exp)))
2415     return 1;
2416   if (flag_pcc_struct_return
2417       && (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
2418           || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE))
2419     return 1;
2420   return 0;
2421 }
2422 \f
2423 /* Assign RTL expressions to the function's parameters.
2424    This may involve copying them into registers and using
2425    those registers as the RTL for them.
2426
2427    If SECOND_TIME is non-zero it means that this function is being
2428    called a second time.  This is done by integrate.c when a function's
2429    compilation is deferred.  We need to come back here in case the
2430    FUNCTION_ARG macro computes items needed for the rest of the compilation
2431    (such as changing which registers are fixed or caller-saved).  But suppress
2432    writing any insns or setting DECL_RTL of anything in this case.  */
2433
2434 void
2435 assign_parms (fndecl, second_time)
2436      tree fndecl;
2437      int second_time;
2438 {
2439   register tree parm;
2440   register rtx entry_parm = 0;
2441   register rtx stack_parm = 0;
2442   CUMULATIVE_ARGS args_so_far;
2443   enum machine_mode passed_mode, nominal_mode;
2444   /* Total space needed so far for args on the stack,
2445      given as a constant and a tree-expression.  */
2446   struct args_size stack_args_size;
2447   tree fntype = TREE_TYPE (fndecl);
2448   tree fnargs = DECL_ARGUMENTS (fndecl);
2449   /* This is used for the arg pointer when referring to stack args.  */
2450   rtx internal_arg_pointer;
2451   /* This is a dummy PARM_DECL that we used for the function result if 
2452      the function returns a structure.  */
2453   tree function_result_decl = 0;
2454   int nparmregs = list_length (fnargs) + LAST_VIRTUAL_REGISTER + 1;
2455   int varargs_setup = 0;
2456
2457   /* Nonzero if the last arg is named `__builtin_va_alist',
2458      which is used on some machines for old-fashioned non-ANSI varargs.h;
2459      this should be stuck onto the stack as if it had arrived there.  */
2460   int vararg
2461     = (fnargs
2462        && (parm = tree_last (fnargs)) != 0
2463        && DECL_NAME (parm)
2464        && (! strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
2465                      "__builtin_va_alist")));
2466
2467   /* Nonzero if function takes extra anonymous args.
2468      This means the last named arg must be on the stack
2469      right before the anonymous ones. */
2470   int stdarg
2471     = (TYPE_ARG_TYPES (fntype) != 0
2472        && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
2473            != void_type_node));
2474
2475   /* If the reg that the virtual arg pointer will be translated into is
2476      not a fixed reg or is the stack pointer, make a copy of the virtual
2477      arg pointer, and address parms via the copy.  The frame pointer is
2478      considered fixed even though it is not marked as such.
2479
2480      The second time through, simply use ap to avoid generating rtx.  */
2481
2482   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
2483        || ! (fixed_regs[ARG_POINTER_REGNUM]
2484              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM))
2485       && ! second_time)
2486     internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
2487   else
2488     internal_arg_pointer = virtual_incoming_args_rtx;
2489   current_function_internal_arg_pointer = internal_arg_pointer;
2490
2491   stack_args_size.constant = 0;
2492   stack_args_size.var = 0;
2493
2494   /* If struct value address is treated as the first argument, make it so.  */
2495   if (aggregate_value_p (DECL_RESULT (fndecl))
2496       && ! current_function_returns_pcc_struct
2497       && struct_value_incoming_rtx == 0)
2498     {
2499       tree type = build_pointer_type (fntype);
2500
2501       function_result_decl = build_decl (PARM_DECL, NULL_TREE, type);
2502
2503       DECL_ARG_TYPE (function_result_decl) = type;
2504       TREE_CHAIN (function_result_decl) = fnargs;
2505       fnargs = function_result_decl;
2506     }
2507                                
2508   parm_reg_stack_loc = (rtx *) oballoc (nparmregs * sizeof (rtx));
2509   bzero (parm_reg_stack_loc, nparmregs * sizeof (rtx));
2510
2511 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
2512   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far, fntype, NULL_PTR);
2513 #else
2514   INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_PTR);
2515 #endif
2516
2517   /* We haven't yet found an argument that we must push and pretend the
2518      caller did.  */
2519   current_function_pretend_args_size = 0;
2520
2521   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
2522     {
2523       int aggregate
2524         = (TREE_CODE (TREE_TYPE (parm)) == ARRAY_TYPE
2525            || TREE_CODE (TREE_TYPE (parm)) == RECORD_TYPE
2526            || TREE_CODE (TREE_TYPE (parm)) == UNION_TYPE);
2527       struct args_size stack_offset;
2528       struct args_size arg_size;
2529       int passed_pointer = 0;
2530       tree passed_type = DECL_ARG_TYPE (parm);
2531
2532       /* Set LAST_NAMED if this is last named arg before some
2533          anonymous args.  We treat it as if it were anonymous too.  */
2534       int last_named = ((TREE_CHAIN (parm) == 0
2535                          || DECL_NAME (TREE_CHAIN (parm)) == 0)
2536                         && (vararg || stdarg));
2537
2538       if (TREE_TYPE (parm) == error_mark_node
2539           /* This can happen after weird syntax errors
2540              or if an enum type is defined among the parms.  */
2541           || TREE_CODE (parm) != PARM_DECL
2542           || passed_type == NULL)
2543         {
2544           DECL_RTL (parm) = gen_rtx (MEM, BLKmode, const0_rtx);
2545           TREE_USED (parm) = 1;
2546           continue;
2547         }
2548
2549       /* For varargs.h function, save info about regs and stack space
2550          used by the individual args, not including the va_alist arg.  */
2551       if (vararg && last_named)
2552         current_function_args_info = args_so_far;
2553
2554       /* Find mode of arg as it is passed, and mode of arg
2555          as it should be during execution of this function.  */
2556       passed_mode = TYPE_MODE (passed_type);
2557       nominal_mode = TYPE_MODE (TREE_TYPE (parm));
2558
2559 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
2560       /* See if this arg was passed by invisible reference.  */
2561       if (FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, passed_mode,
2562                                           passed_type, ! last_named))
2563         {
2564           passed_type = build_pointer_type (passed_type);
2565           passed_pointer = 1;
2566           passed_mode = nominal_mode = Pmode;
2567         }
2568 #endif
2569
2570       /* Let machine desc say which reg (if any) the parm arrives in.
2571          0 means it arrives on the stack.  */
2572 #ifdef FUNCTION_INCOMING_ARG
2573       entry_parm = FUNCTION_INCOMING_ARG (args_so_far, passed_mode,
2574                                           passed_type, ! last_named);
2575 #else
2576       entry_parm = FUNCTION_ARG (args_so_far, passed_mode,
2577                                  passed_type, ! last_named);
2578 #endif
2579
2580 #ifdef SETUP_INCOMING_VARARGS
2581       /* If this is the last named parameter, do any required setup for
2582          varargs or stdargs.  We need to know about the case of this being an
2583          addressable type, in which case we skip the registers it
2584          would have arrived in.
2585
2586          For stdargs, LAST_NAMED will be set for two parameters, the one that
2587          is actually the last named, and the dummy parameter.  We only
2588          want to do this action once.
2589
2590          Also, indicate when RTL generation is to be suppressed.  */
2591       if (last_named && !varargs_setup)
2592         {
2593           SETUP_INCOMING_VARARGS (args_so_far, passed_mode, passed_type,
2594                                   current_function_pretend_args_size,
2595                                   second_time);
2596           varargs_setup = 1;
2597         }
2598 #endif
2599
2600       /* Determine parm's home in the stack,
2601          in case it arrives in the stack or we should pretend it did.
2602
2603          Compute the stack position and rtx where the argument arrives
2604          and its size.
2605
2606          There is one complexity here:  If this was a parameter that would
2607          have been passed in registers, but wasn't only because it is
2608          __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2609          it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2610          In this case, we call FUNCTION_ARG with NAMED set to 1 instead of
2611          0 as it was the previous time.  */
2612
2613       locate_and_pad_parm (passed_mode, passed_type,
2614 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2615                            1,
2616 #else
2617 #ifdef FUNCTION_INCOMING_ARG
2618                            FUNCTION_INCOMING_ARG (args_so_far, passed_mode,
2619                                                   passed_type,
2620                                                   (! last_named
2621                                                    || varargs_setup)) != 0,
2622 #else
2623                            FUNCTION_ARG (args_so_far, passed_mode,
2624                                          passed_type,
2625                                          ! last_named || varargs_setup) != 0,
2626 #endif
2627 #endif
2628                            fndecl, &stack_args_size, &stack_offset, &arg_size);
2629
2630       if (! second_time)
2631         {
2632           rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
2633
2634           if (offset_rtx == const0_rtx)
2635             stack_parm = gen_rtx (MEM, passed_mode, internal_arg_pointer);
2636           else
2637             stack_parm = gen_rtx (MEM, passed_mode,
2638                                   gen_rtx (PLUS, Pmode,
2639                                            internal_arg_pointer, offset_rtx));
2640
2641           /* If this is a memory ref that contains aggregate components,
2642              mark it as such for cse and loop optimize.  */
2643           MEM_IN_STRUCT_P (stack_parm) = aggregate;
2644         }
2645
2646       /* If this parameter was passed both in registers and in the stack,
2647          use the copy on the stack.  */
2648       if (MUST_PASS_IN_STACK (passed_mode, passed_type))
2649         entry_parm = 0;
2650
2651       /* If this parm was passed part in regs and part in memory,
2652          pretend it arrived entirely in memory
2653          by pushing the register-part onto the stack.
2654
2655          In the special case of a DImode or DFmode that is split,
2656          we could put it together in a pseudoreg directly,
2657          but for now that's not worth bothering with.  */
2658
2659       if (entry_parm)
2660         {
2661           int nregs = 0;
2662 #ifdef FUNCTION_ARG_PARTIAL_NREGS
2663           nregs = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, passed_mode,
2664                                               passed_type, ! last_named);
2665 #endif
2666
2667           if (nregs > 0)
2668             {
2669               current_function_pretend_args_size
2670                 = (((nregs * UNITS_PER_WORD) + (PARM_BOUNDARY / BITS_PER_UNIT) - 1)
2671                    / (PARM_BOUNDARY / BITS_PER_UNIT)
2672                    * (PARM_BOUNDARY / BITS_PER_UNIT));
2673
2674               if (! second_time)
2675                 move_block_from_reg (REGNO (entry_parm),
2676                                      validize_mem (stack_parm), nregs);
2677               entry_parm = stack_parm;
2678             }
2679         }
2680
2681       /* If we didn't decide this parm came in a register,
2682          by default it came on the stack.  */
2683       if (entry_parm == 0)
2684         entry_parm = stack_parm;
2685
2686       /* Record permanently how this parm was passed.  */
2687       if (! second_time)
2688         DECL_INCOMING_RTL (parm) = entry_parm;
2689
2690       /* If there is actually space on the stack for this parm,
2691          count it in stack_args_size; otherwise set stack_parm to 0
2692          to indicate there is no preallocated stack slot for the parm.  */
2693
2694       if (entry_parm == stack_parm
2695 #if defined (REG_PARM_STACK_SPACE) && ! defined (MAYBE_REG_PARM_STACK_SPACE)
2696           /* On some machines, even if a parm value arrives in a register
2697              there is still an (uninitialized) stack slot allocated for it.
2698
2699              ??? When MAYBE_REG_PARM_STACK_SPACE is defined, we can't tell
2700              whether this parameter already has a stack slot allocated,
2701              because an arg block exists only if current_function_args_size
2702              is larger than some threshhold, and we haven't calculated that
2703              yet.  So, for now, we just assume that stack slots never exist
2704              in this case.  */
2705           || REG_PARM_STACK_SPACE (fndecl) > 0
2706 #endif
2707           )
2708         {
2709           stack_args_size.constant += arg_size.constant;
2710           if (arg_size.var)
2711             ADD_PARM_SIZE (stack_args_size, arg_size.var);
2712         }
2713       else
2714         /* No stack slot was pushed for this parm.  */
2715         stack_parm = 0;
2716
2717       /* Update info on where next arg arrives in registers.  */
2718
2719       FUNCTION_ARG_ADVANCE (args_so_far, passed_mode,
2720                             passed_type, ! last_named);
2721
2722       /* If this is our second time through, we are done with this parm. */
2723       if (second_time)
2724         continue;
2725
2726       /* If we can't trust the parm stack slot to be aligned enough
2727          for its ultimate type, don't use that slot after entry.
2728          We'll make another stack slot, if we need one.  */
2729       {
2730 #ifdef FUNCTION_ARG_BOUNDARY
2731         int thisparm_boundary
2732           = FUNCTION_ARG_BOUNDARY (passed_mode, passed_type);
2733 #else
2734         int thisparm_boundary = PARM_BOUNDARY;
2735 #endif
2736
2737         if (GET_MODE_ALIGNMENT (nominal_mode) > thisparm_boundary)
2738           stack_parm = 0;
2739       }
2740
2741       /* Now adjust STACK_PARM to the mode and precise location
2742          where this parameter should live during execution,
2743          if we discover that it must live in the stack during execution.
2744          To make debuggers happier on big-endian machines, we store
2745          the value in the last bytes of the space available.  */
2746
2747       if (nominal_mode != BLKmode && nominal_mode != passed_mode
2748           && stack_parm != 0)
2749         {
2750           rtx offset_rtx;
2751
2752 #if BYTES_BIG_ENDIAN
2753           if (GET_MODE_SIZE (nominal_mode) < UNITS_PER_WORD)
2754             stack_offset.constant += (GET_MODE_SIZE (passed_mode)
2755                                       - GET_MODE_SIZE (nominal_mode));
2756 #endif
2757
2758           offset_rtx = ARGS_SIZE_RTX (stack_offset);
2759           if (offset_rtx == const0_rtx)
2760             stack_parm = gen_rtx (MEM, nominal_mode, internal_arg_pointer);
2761           else
2762             stack_parm = gen_rtx (MEM, nominal_mode,
2763                                   gen_rtx (PLUS, Pmode,
2764                                            internal_arg_pointer, offset_rtx));
2765
2766           /* If this is a memory ref that contains aggregate components,
2767              mark it as such for cse and loop optimize.  */
2768           MEM_IN_STRUCT_P (stack_parm) = aggregate;
2769         }
2770
2771       /* ENTRY_PARM is an RTX for the parameter as it arrives,
2772          in the mode in which it arrives.
2773          STACK_PARM is an RTX for a stack slot where the parameter can live
2774          during the function (in case we want to put it there).
2775          STACK_PARM is 0 if no stack slot was pushed for it.
2776
2777          Now output code if necessary to convert ENTRY_PARM to
2778          the type in which this function declares it,
2779          and store that result in an appropriate place,
2780          which may be a pseudo reg, may be STACK_PARM,
2781          or may be a local stack slot if STACK_PARM is 0.
2782
2783          Set DECL_RTL to that place.  */
2784
2785       if (nominal_mode == BLKmode)
2786         {
2787           /* If a BLKmode arrives in registers, copy it to a stack slot.  */
2788           if (GET_CODE (entry_parm) == REG)
2789             {
2790               int size_stored = CEIL_ROUND (int_size_in_bytes (TREE_TYPE (parm)),
2791                                             UNITS_PER_WORD);
2792
2793               /* Note that we will be storing an integral number of words.
2794                  So we have to be careful to ensure that we allocate an
2795                  integral number of words.  We do this below in the
2796                  assign_stack_local if space was not allocated in the argument
2797                  list.  If it was, this will not work if PARM_BOUNDARY is not
2798                  a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2799                  if it becomes a problem.  */
2800
2801               if (stack_parm == 0)
2802                 stack_parm
2803                   = assign_stack_local (GET_MODE (entry_parm), size_stored, 0);
2804               else if (PARM_BOUNDARY % BITS_PER_WORD != 0)
2805                 abort ();
2806
2807               move_block_from_reg (REGNO (entry_parm),
2808                                    validize_mem (stack_parm),
2809                                    size_stored / UNITS_PER_WORD);
2810             }
2811           DECL_RTL (parm) = stack_parm;
2812         }
2813       else if (! ((obey_regdecls && ! DECL_REGISTER (parm)
2814                    && ! DECL_INLINE (fndecl))
2815                   /* layout_decl may set this.  */
2816                   || TREE_ADDRESSABLE (parm)
2817                   || TREE_SIDE_EFFECTS (parm)
2818                   /* If -ffloat-store specified, don't put explicit
2819                      float variables into registers.  */
2820                   || (flag_float_store
2821                       && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE))
2822                /* Always assign pseudo to structure return or item passed
2823                   by invisible reference.  */
2824                || passed_pointer || parm == function_result_decl)
2825         {
2826           /* Store the parm in a pseudoregister during the function.  */
2827           register rtx parmreg = gen_reg_rtx (nominal_mode);
2828
2829           REG_USERVAR_P (parmreg) = 1;
2830
2831           /* If this was an item that we received a pointer to, set DECL_RTL
2832              appropriately.  */
2833           if (passed_pointer)
2834             {
2835               DECL_RTL (parm) = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (passed_type)), parmreg);
2836               MEM_IN_STRUCT_P (DECL_RTL (parm)) = aggregate;
2837             }
2838           else
2839             DECL_RTL (parm) = parmreg;
2840
2841           /* Copy the value into the register.  */
2842           if (GET_MODE (parmreg) != GET_MODE (entry_parm))
2843             {
2844               /* If ENTRY_PARM is a hard register, it might be in a register
2845                  not valid for operating in its mode (e.g., an odd-numbered
2846                  register for a DFmode).  In that case, moves are the only
2847                  thing valid, so we can't do a convert from there.  This
2848                  occurs when the calling sequence allow such misaligned
2849                  usages.  */
2850               if (GET_CODE (entry_parm) == REG
2851                   && REGNO (entry_parm) < FIRST_PSEUDO_REGISTER
2852                   && ! HARD_REGNO_MODE_OK (REGNO (entry_parm),
2853                                            GET_MODE (entry_parm)))
2854                 convert_move (parmreg, copy_to_reg (entry_parm), 0);
2855               else
2856                 convert_move (parmreg, validize_mem (entry_parm), 0);
2857             }
2858           else
2859             emit_move_insn (parmreg, validize_mem (entry_parm));
2860
2861           /* If we were passed a pointer but the actual value
2862              can safely live in a register, put it in one.  */
2863           if (passed_pointer && nominal_mode != BLKmode
2864               && ! ((obey_regdecls && ! DECL_REGISTER (parm)
2865                      && ! DECL_INLINE (fndecl))
2866                     /* layout_decl may set this.  */
2867                     || TREE_ADDRESSABLE (parm)
2868                     || TREE_SIDE_EFFECTS (parm)
2869                     /* If -ffloat-store specified, don't put explicit
2870                        float variables into registers.  */
2871                     || (flag_float_store
2872                         && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE)))
2873             {
2874               parmreg = gen_reg_rtx (nominal_mode);
2875               emit_move_insn (parmreg, DECL_RTL (parm));
2876               DECL_RTL (parm) = parmreg;
2877             }
2878
2879           /* In any case, record the parm's desired stack location
2880              in case we later discover it must live in the stack.  */
2881           if (REGNO (parmreg) >= nparmregs)
2882             {
2883               rtx *new;
2884               nparmregs = REGNO (parmreg) + 5;
2885               new = (rtx *) oballoc (nparmregs * sizeof (rtx));
2886               bcopy (parm_reg_stack_loc, new, nparmregs * sizeof (rtx));
2887               parm_reg_stack_loc = new;
2888             }
2889           parm_reg_stack_loc[REGNO (parmreg)] = stack_parm;
2890
2891           /* Mark the register as eliminable if we did no conversion
2892              and it was copied from memory at a fixed offset,
2893              and the arg pointer was not copied to a pseudo-reg.
2894              If the arg pointer is a pseudo reg or the offset formed
2895              an invalid address, such memory-equivalences
2896              as we make here would screw up life analysis for it.  */
2897           if (nominal_mode == passed_mode
2898               && GET_CODE (entry_parm) == MEM
2899               && entry_parm == stack_parm
2900               && stack_offset.var == 0
2901               && reg_mentioned_p (virtual_incoming_args_rtx,
2902                                   XEXP (entry_parm, 0)))
2903             REG_NOTES (get_last_insn ())
2904               = gen_rtx (EXPR_LIST, REG_EQUIV,
2905                          entry_parm, REG_NOTES (get_last_insn ()));
2906
2907           /* For pointer data type, suggest pointer register.  */
2908           if (TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE)
2909             mark_reg_pointer (parmreg);
2910         }
2911       else
2912         {
2913           /* Value must be stored in the stack slot STACK_PARM
2914              during function execution.  */
2915
2916           if (passed_mode != nominal_mode)
2917             {
2918               /* Conversion is required.   */
2919               if (GET_CODE (entry_parm) == REG
2920                   && REGNO (entry_parm) < FIRST_PSEUDO_REGISTER
2921                   && ! HARD_REGNO_MODE_OK (REGNO (entry_parm), passed_mode))
2922                 entry_parm = copy_to_reg (entry_parm);
2923
2924               entry_parm = convert_to_mode (nominal_mode, entry_parm, 0);
2925             }
2926
2927           if (entry_parm != stack_parm)
2928             {
2929               if (stack_parm == 0)
2930                 stack_parm = assign_stack_local (GET_MODE (entry_parm),
2931                                                  GET_MODE_SIZE (GET_MODE (entry_parm)), 0);
2932               emit_move_insn (validize_mem (stack_parm),
2933                               validize_mem (entry_parm));
2934             }
2935
2936           DECL_RTL (parm) = stack_parm;
2937         }
2938       
2939       /* If this "parameter" was the place where we are receiving the
2940          function's incoming structure pointer, set up the result.  */
2941       if (parm == function_result_decl)
2942         DECL_RTL (DECL_RESULT (fndecl))
2943           = gen_rtx (MEM, DECL_MODE (DECL_RESULT (fndecl)), DECL_RTL (parm));
2944
2945       if (TREE_THIS_VOLATILE (parm))
2946         MEM_VOLATILE_P (DECL_RTL (parm)) = 1;
2947       if (TREE_READONLY (parm))
2948         RTX_UNCHANGING_P (DECL_RTL (parm)) = 1;
2949     }
2950
2951   max_parm_reg = max_reg_num ();
2952   last_parm_insn = get_last_insn ();
2953
2954   current_function_args_size = stack_args_size.constant;
2955
2956   /* Adjust function incoming argument size for alignment and
2957      minimum length.  */
2958
2959 #ifdef REG_PARM_STACK_SPACE
2960 #ifndef MAYBE_REG_PARM_STACK_SPACE
2961   current_function_args_size = MAX (current_function_args_size,
2962                                     REG_PARM_STACK_SPACE (fndecl));
2963 #endif
2964 #endif
2965
2966 #ifdef STACK_BOUNDARY
2967 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
2968
2969   current_function_args_size
2970     = ((current_function_args_size + STACK_BYTES - 1)
2971        / STACK_BYTES) * STACK_BYTES;
2972 #endif  
2973
2974 #ifdef ARGS_GROW_DOWNWARD
2975   current_function_arg_offset_rtx
2976     = (stack_args_size.var == 0 ? GEN_INT (-stack_args_size.constant)
2977        : expand_expr (size_binop (MINUS_EXPR, stack_args_size.var,      
2978                                   size_int (-stack_args_size.constant)),   
2979                       NULL_RTX, VOIDmode, 0));
2980 #else
2981   current_function_arg_offset_rtx = ARGS_SIZE_RTX (stack_args_size);
2982 #endif
2983
2984   /* See how many bytes, if any, of its args a function should try to pop
2985      on return.  */
2986
2987   current_function_pops_args = RETURN_POPS_ARGS (TREE_TYPE (fndecl),
2988                                                  current_function_args_size);
2989
2990   /* For stdarg.h function, save info about regs and stack space
2991      used by the named args.  */
2992
2993   if (stdarg)
2994     current_function_args_info = args_so_far;
2995
2996   /* Set the rtx used for the function return value.  Put this in its
2997      own variable so any optimizers that need this information don't have
2998      to include tree.h.  Do this here so it gets done when an inlined
2999      function gets output.  */
3000
3001   current_function_return_rtx = DECL_RTL (DECL_RESULT (fndecl));
3002 }
3003 \f
3004 /* Compute the size and offset from the start of the stacked arguments for a
3005    parm passed in mode PASSED_MODE and with type TYPE.
3006
3007    INITIAL_OFFSET_PTR points to the current offset into the stacked
3008    arguments.
3009
3010    The starting offset and size for this parm are returned in *OFFSET_PTR
3011    and *ARG_SIZE_PTR, respectively.
3012
3013    IN_REGS is non-zero if the argument will be passed in registers.  It will
3014    never be set if REG_PARM_STACK_SPACE is not defined.
3015
3016    FNDECL is the function in which the argument was defined.
3017
3018    There are two types of rounding that are done.  The first, controlled by
3019    FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
3020    list to be aligned to the specific boundary (in bits).  This rounding
3021    affects the initial and starting offsets, but not the argument size.
3022
3023    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3024    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3025    initial offset is not affected by this rounding, while the size always
3026    is and the starting offset may be.  */
3027
3028 /*  offset_ptr will be negative for ARGS_GROW_DOWNWARD case; 
3029     initial_offset_ptr is positive because locate_and_pad_parm's
3030     callers pass in the total size of args so far as
3031     initial_offset_ptr. arg_size_ptr is always positive.*/
3032
3033 static void pad_to_arg_alignment (), pad_below ();
3034
3035 void
3036 locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
3037                      initial_offset_ptr, offset_ptr, arg_size_ptr)
3038      enum machine_mode passed_mode;
3039      tree type;
3040      int in_regs;
3041      tree fndecl;
3042      struct args_size *initial_offset_ptr;
3043      struct args_size *offset_ptr;
3044      struct args_size *arg_size_ptr;
3045 {
3046   tree sizetree
3047     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3048   enum direction where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3049   int boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
3050   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3051   int reg_parm_stack_space = 0;
3052
3053 #ifdef REG_PARM_STACK_SPACE
3054   /* If we have found a stack parm before we reach the end of the
3055      area reserved for registers, skip that area.  */
3056   if (! in_regs)
3057     {
3058 #ifdef MAYBE_REG_PARM_STACK_SPACE
3059       reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
3060 #else
3061       reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3062 #endif
3063       if (reg_parm_stack_space > 0)
3064         {
3065           if (initial_offset_ptr->var)
3066             {
3067               initial_offset_ptr->var
3068                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3069                               size_int (reg_parm_stack_space));
3070               initial_offset_ptr->constant = 0;
3071             }
3072           else if (initial_offset_ptr->constant < reg_parm_stack_space)
3073             initial_offset_ptr->constant = reg_parm_stack_space;
3074         }
3075     }
3076 #endif /* REG_PARM_STACK_SPACE */
3077
3078   arg_size_ptr->var = 0;
3079   arg_size_ptr->constant = 0;
3080
3081 #ifdef ARGS_GROW_DOWNWARD
3082   if (initial_offset_ptr->var)
3083     {
3084       offset_ptr->constant = 0;
3085       offset_ptr->var = size_binop (MINUS_EXPR, integer_zero_node,
3086                                     initial_offset_ptr->var);
3087     }
3088   else
3089     {
3090       offset_ptr->constant = - initial_offset_ptr->constant;
3091       offset_ptr->var = 0;
3092     }
3093   if (where_pad == upward
3094       && (TREE_CODE (sizetree) != INTEGER_CST
3095           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
3096     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3097   SUB_PARM_SIZE (*offset_ptr, sizetree);
3098   pad_to_arg_alignment (offset_ptr, boundary);
3099   if (initial_offset_ptr->var)
3100     {
3101       arg_size_ptr->var = size_binop (MINUS_EXPR,
3102                                       size_binop (MINUS_EXPR,
3103                                                   integer_zero_node,
3104                                                   initial_offset_ptr->var),
3105                                       offset_ptr->var);
3106     }
3107   else
3108     {
3109       arg_size_ptr->constant = (- initial_offset_ptr->constant -
3110                                 offset_ptr->constant); 
3111     }
3112 /*  ADD_PARM_SIZE (*arg_size_ptr, sizetree); */
3113   if (where_pad == downward)
3114     pad_below (arg_size_ptr, passed_mode, sizetree);
3115 #else /* !ARGS_GROW_DOWNWARD */
3116   pad_to_arg_alignment (initial_offset_ptr, boundary);
3117   *offset_ptr = *initial_offset_ptr;
3118   if (where_pad == downward)
3119     pad_below (offset_ptr, passed_mode, sizetree);
3120
3121 #ifdef PUSH_ROUNDING
3122   if (passed_mode != BLKmode)
3123     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3124 #endif
3125
3126   if (where_pad != none
3127       && (TREE_CODE (sizetree) != INTEGER_CST
3128           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
3129     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3130
3131   ADD_PARM_SIZE (*arg_size_ptr, sizetree);
3132 #endif /* ARGS_GROW_DOWNWARD */
3133 }
3134
3135 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3136    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
3137
3138 static void
3139 pad_to_arg_alignment (offset_ptr, boundary)
3140      struct args_size *offset_ptr;
3141      int boundary;
3142 {
3143   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3144   
3145   if (boundary > BITS_PER_UNIT)
3146     {
3147       if (offset_ptr->var)
3148         {
3149           offset_ptr->var  =
3150 #ifdef ARGS_GROW_DOWNWARD
3151             round_down 
3152 #else
3153             round_up
3154 #endif
3155               (ARGS_SIZE_TREE (*offset_ptr),
3156                boundary / BITS_PER_UNIT);
3157           offset_ptr->constant = 0; /*?*/
3158         }
3159       else
3160         offset_ptr->constant =
3161 #ifdef ARGS_GROW_DOWNWARD
3162           FLOOR_ROUND (offset_ptr->constant, boundary_in_bytes);
3163 #else
3164           CEIL_ROUND (offset_ptr->constant, boundary_in_bytes);
3165 #endif
3166     }
3167 }
3168
3169 static void
3170 pad_below (offset_ptr, passed_mode, sizetree)
3171      struct args_size *offset_ptr;
3172      enum machine_mode passed_mode;
3173      tree sizetree;
3174 {
3175   if (passed_mode != BLKmode)
3176     {
3177       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3178         offset_ptr->constant
3179           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3180                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3181               - GET_MODE_SIZE (passed_mode));
3182     }
3183   else
3184     {
3185       if (TREE_CODE (sizetree) != INTEGER_CST
3186           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3187         {
3188           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
3189           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3190           /* Add it in.  */
3191           ADD_PARM_SIZE (*offset_ptr, s2);
3192           SUB_PARM_SIZE (*offset_ptr, sizetree);
3193         }
3194     }
3195 }
3196
3197 static tree
3198 round_down (value, divisor)
3199      tree value;
3200      int divisor;
3201 {
3202   return size_binop (MULT_EXPR,
3203                      size_binop (FLOOR_DIV_EXPR, value, size_int (divisor)),
3204                      size_int (divisor));
3205 }
3206 \f
3207 /* Walk the tree of blocks describing the binding levels within a function
3208    and warn about uninitialized variables.
3209    This is done after calling flow_analysis and before global_alloc
3210    clobbers the pseudo-regs to hard regs.  */
3211
3212 void
3213 uninitialized_vars_warning (block)
3214      tree block;
3215 {
3216   register tree decl, sub;
3217   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3218     {
3219       if (TREE_CODE (decl) == VAR_DECL
3220           /* These warnings are unreliable for and aggregates
3221              because assigning the fields one by one can fail to convince
3222              flow.c that the entire aggregate was initialized.
3223              Unions are troublesome because members may be shorter.  */
3224           && TREE_CODE (TREE_TYPE (decl)) != RECORD_TYPE
3225           && TREE_CODE (TREE_TYPE (decl)) != UNION_TYPE
3226           && TREE_CODE (TREE_TYPE (decl)) != ARRAY_TYPE
3227           && DECL_RTL (decl) != 0
3228           && GET_CODE (DECL_RTL (decl)) == REG
3229           && regno_uninitialized (REGNO (DECL_RTL (decl))))
3230         warning_with_decl (decl,
3231                            "`%s' may be used uninitialized in this function");
3232       if (TREE_CODE (decl) == VAR_DECL
3233           && DECL_RTL (decl) != 0
3234           && GET_CODE (DECL_RTL (decl)) == REG
3235           && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3236         warning_with_decl (decl,
3237                            "variable `%s' may be clobbered by `longjmp'");
3238     }
3239   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
3240     uninitialized_vars_warning (sub);
3241 }
3242
3243 /* Do the appropriate part of uninitialized_vars_warning
3244    but for arguments instead of local variables.  */
3245
3246 void
3247 setjmp_args_warning (block)
3248      tree block;
3249 {
3250   register tree decl;
3251   for (decl = DECL_ARGUMENTS (current_function_decl);
3252        decl; decl = TREE_CHAIN (decl))
3253     if (DECL_RTL (decl) != 0
3254         && GET_CODE (DECL_RTL (decl)) == REG
3255         && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
3256       warning_with_decl (decl, "argument `%s' may be clobbered by `longjmp'");
3257 }
3258
3259 /* If this function call setjmp, put all vars into the stack
3260    unless they were declared `register'.  */
3261
3262 void
3263 setjmp_protect (block)
3264      tree block;
3265 {
3266   register tree decl, sub;
3267   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
3268     if ((TREE_CODE (decl) == VAR_DECL
3269          || TREE_CODE (decl) == PARM_DECL)
3270         && DECL_RTL (decl) != 0
3271         && GET_CODE (DECL_RTL (decl)) == REG
3272         /* If this variable came from an inline function, it must be
3273            that it's life doesn't overlap the setjmp.  If there was a
3274            setjmp in the function, it would already be in memory.  We
3275            must exclude such variable because their DECL_RTL might be
3276            set to strange things such as virtual_stack_vars_rtx.  */
3277         && ! DECL_FROM_INLINE (decl)
3278         && (
3279 #ifdef NON_SAVING_SETJMP
3280             /* If longjmp doesn't restore the registers,
3281                don't put anything in them.  */
3282             NON_SAVING_SETJMP
3283             ||
3284 #endif
3285             ! DECL_REGISTER (decl)))
3286       put_var_into_stack (decl);
3287   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
3288     setjmp_protect (sub);
3289 }
3290 \f
3291 /* Like the previous function, but for args instead of local variables.  */
3292
3293 void
3294 setjmp_protect_args ()
3295 {
3296   register tree decl, sub;
3297   for (decl = DECL_ARGUMENTS (current_function_decl);
3298        decl; decl = TREE_CHAIN (decl))
3299     if ((TREE_CODE (decl) == VAR_DECL
3300          || TREE_CODE (decl) == PARM_DECL)
3301         && DECL_RTL (decl) != 0
3302         && GET_CODE (DECL_RTL (decl)) == REG
3303         && (
3304             /* If longjmp doesn't restore the registers,
3305                don't put anything in them.  */
3306 #ifdef NON_SAVING_SETJMP
3307             NON_SAVING_SETJMP
3308             ||
3309 #endif
3310             ! DECL_REGISTER (decl)))
3311       put_var_into_stack (decl);
3312 }
3313 \f
3314 /* Return the context-pointer register corresponding to DECL,
3315    or 0 if it does not need one.  */
3316
3317 rtx
3318 lookup_static_chain (decl)
3319      tree decl;
3320 {
3321   tree context = decl_function_context (decl);
3322   tree link;
3323
3324   if (context == 0)
3325     return 0;
3326   
3327   /* We treat inline_function_decl as an alias for the current function
3328      because that is the inline function whose vars, types, etc.
3329      are being merged into the current function.
3330      See expand_inline_function.  */
3331   if (context == current_function_decl || context == inline_function_decl)
3332     return virtual_stack_vars_rtx;
3333
3334   for (link = context_display; link; link = TREE_CHAIN (link))
3335     if (TREE_PURPOSE (link) == context)
3336       return RTL_EXPR_RTL (TREE_VALUE (link));
3337
3338   abort ();
3339 }
3340 \f
3341 /* Convert a stack slot address ADDR for variable VAR
3342    (from a containing function)
3343    into an address valid in this function (using a static chain).  */
3344
3345 rtx
3346 fix_lexical_addr (addr, var)
3347      rtx addr;
3348      tree var;
3349 {
3350   rtx basereg;
3351   int displacement;
3352   tree context = decl_function_context (var);
3353   struct function *fp;
3354   rtx base = 0;
3355
3356   /* If this is the present function, we need not do anything.  */
3357   if (context == current_function_decl || context == inline_function_decl)
3358     return addr;
3359
3360   for (fp = outer_function_chain; fp; fp = fp->next)
3361     if (fp->decl == context)
3362       break;
3363
3364   if (fp == 0)
3365     abort ();
3366
3367   /* Decode given address as base reg plus displacement.  */
3368   if (GET_CODE (addr) == REG)
3369     basereg = addr, displacement = 0;
3370   else if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
3371     basereg = XEXP (addr, 0), displacement = INTVAL (XEXP (addr, 1));
3372   else
3373     abort ();
3374
3375   /* We accept vars reached via the containing function's
3376      incoming arg pointer and via its stack variables pointer.  */
3377   if (basereg == fp->internal_arg_pointer)
3378     {
3379       /* If reached via arg pointer, get the arg pointer value
3380          out of that function's stack frame.
3381
3382          There are two cases:  If a separate ap is needed, allocate a
3383          slot in the outer function for it and dereference it that way.
3384          This is correct even if the real ap is actually a pseudo.
3385          Otherwise, just adjust the offset from the frame pointer to
3386          compensate.  */
3387
3388 #ifdef NEED_SEPARATE_AP
3389       rtx addr;
3390
3391       if (fp->arg_pointer_save_area == 0)
3392         fp->arg_pointer_save_area
3393           = assign_outer_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0, fp);
3394
3395       addr = fix_lexical_addr (XEXP (fp->arg_pointer_save_area, 0), var);
3396       addr = memory_address (Pmode, addr);
3397
3398       base = copy_to_reg (gen_rtx (MEM, Pmode, addr));
3399 #else
3400       displacement += (FIRST_PARM_OFFSET (context) - STARTING_FRAME_OFFSET);
3401       base = lookup_static_chain (var);
3402 #endif
3403     }
3404
3405   else if (basereg == virtual_stack_vars_rtx)
3406     {
3407       /* This is the same code as lookup_static_chain, duplicated here to
3408          avoid an extra call to decl_function_context.  */
3409       tree link;
3410
3411       for (link = context_display; link; link = TREE_CHAIN (link))
3412         if (TREE_PURPOSE (link) == context)
3413           {
3414             base = RTL_EXPR_RTL (TREE_VALUE (link));
3415             break;
3416           }
3417     }
3418
3419   if (base == 0)
3420     abort ();
3421
3422   /* Use same offset, relative to appropriate static chain or argument
3423      pointer.  */
3424   return plus_constant (base, displacement);
3425 }
3426 \f
3427 /* Return the address of the trampoline for entering nested fn FUNCTION.
3428    If necessary, allocate a trampoline (in the stack frame)
3429    and emit rtl to initialize its contents (at entry to this function).  */
3430
3431 rtx
3432 trampoline_address (function)
3433      tree function;
3434 {
3435   tree link;
3436   tree rtlexp;
3437   rtx tramp;
3438   struct function *fp;
3439   tree fn_context;
3440
3441   /* Find an existing trampoline and return it.  */
3442   for (link = trampoline_list; link; link = TREE_CHAIN (link))
3443     if (TREE_PURPOSE (link) == function)
3444       return XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0);
3445   for (fp = outer_function_chain; fp; fp = fp->next)
3446     for (link = fp->trampoline_list; link; link = TREE_CHAIN (link))
3447       if (TREE_PURPOSE (link) == function)
3448         {
3449           tramp = fix_lexical_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0),
3450                                     function);
3451           return round_trampoline_addr (tramp);
3452         }
3453
3454   /* None exists; we must make one.  */
3455
3456   /* Find the `struct function' for the function containing FUNCTION.  */
3457   fp = 0;
3458   fn_context = decl_function_context (function);
3459   if (fn_context != current_function_decl)
3460     for (fp = outer_function_chain; fp; fp = fp->next)
3461       if (fp->decl == fn_context)
3462         break;
3463
3464   /* Allocate run-time space for this trampoline
3465      (usually in the defining function's stack frame).  */
3466 #ifdef ALLOCATE_TRAMPOLINE
3467   tramp = ALLOCATE_TRAMPOLINE (fp);
3468 #else
3469   /* If rounding needed, allocate extra space
3470      to ensure we have TRAMPOLINE_SIZE bytes left after rounding up.  */
3471 #ifdef TRAMPOLINE_ALIGNMENT
3472 #define TRAMPOLINE_REAL_SIZE (TRAMPOLINE_SIZE + TRAMPOLINE_ALIGNMENT - 1)
3473 #else
3474 #define TRAMPOLINE_REAL_SIZE (TRAMPOLINE_SIZE)
3475 #endif
3476   if (fp != 0)
3477     tramp = assign_outer_stack_local (BLKmode, TRAMPOLINE_REAL_SIZE, 0, fp);
3478   else
3479     tramp = assign_stack_local (BLKmode, TRAMPOLINE_REAL_SIZE, 0);
3480 #endif
3481
3482   /* Record the trampoline for reuse and note it for later initialization
3483      by expand_function_end.  */
3484   if (fp != 0)
3485     {
3486       push_obstacks (fp->current_obstack, fp->function_maybepermanent_obstack);
3487       rtlexp = make_node (RTL_EXPR);
3488       RTL_EXPR_RTL (rtlexp) = tramp;
3489       fp->trampoline_list = tree_cons (function, rtlexp, fp->trampoline_list);
3490       pop_obstacks ();
3491     }
3492   else
3493     {
3494       /* Make the RTL_EXPR node temporary, not momentary, so that the
3495          trampoline_list doesn't become garbage.  */
3496       int momentary = suspend_momentary ();
3497       rtlexp = make_node (RTL_EXPR);
3498       resume_momentary (momentary);
3499
3500       RTL_EXPR_RTL (rtlexp) = tramp;
3501       trampoline_list = tree_cons (function, rtlexp, trampoline_list);
3502     }
3503
3504   tramp = fix_lexical_addr (XEXP (tramp, 0), function);
3505   return round_trampoline_addr (tramp);
3506 }
3507
3508 /* Given a trampoline address,
3509    round it to multiple of TRAMPOLINE_ALIGNMENT.  */
3510
3511 static rtx
3512 round_trampoline_addr (tramp)
3513      rtx tramp;
3514 {
3515 #ifdef TRAMPOLINE_ALIGNMENT
3516   /* Round address up to desired boundary.  */
3517   rtx temp = gen_reg_rtx (Pmode);
3518   temp = expand_binop (Pmode, add_optab, tramp,
3519                        GEN_INT (TRAMPOLINE_ALIGNMENT - 1),
3520                        temp, 0, OPTAB_LIB_WIDEN);
3521   tramp = expand_binop (Pmode, and_optab, temp,
3522                         GEN_INT (- TRAMPOLINE_ALIGNMENT),
3523                         temp, 0, OPTAB_LIB_WIDEN);
3524 #endif
3525   return tramp;
3526 }
3527 \f
3528 /* The functions identify_blocks and reorder_blocks provide a way to
3529    reorder the tree of BLOCK nodes, for optimizers that reshuffle or
3530    duplicate portions of the RTL code.  Call identify_blocks before
3531    changing the RTL, and call reorder_blocks after.  */
3532
3533 static int all_blocks ();
3534 static tree blocks_nreverse ();
3535
3536 /* Put all this function's BLOCK nodes into a vector, and return it.
3537    Also store in each NOTE for the beginning or end of a block
3538    the index of that block in the vector.
3539    The arguments are TOP_BLOCK, the top-level block of the function,
3540    and INSNS, the insn chain of the function.  */
3541
3542 tree *
3543 identify_blocks (top_block, insns)
3544      tree top_block;
3545      rtx insns;
3546 {
3547   int n_blocks = all_blocks (top_block, 0);
3548   tree *block_vector = (tree *) alloca (n_blocks * sizeof (tree));
3549   int *block_stack = (int *) alloca (n_blocks * sizeof (int));
3550   int depth = 0;
3551   int next_block_number = 0;
3552   int current_block_number = 0;
3553   rtx insn;
3554
3555   all_blocks (top_block, block_vector);
3556
3557   for (insn = insns; insn; insn = NEXT_INSN (insn))
3558     if (GET_CODE (insn) == NOTE)
3559       {
3560         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
3561           {
3562             block_stack[depth++] = current_block_number;
3563             current_block_number = next_block_number;
3564             SET_NOTE_BLOCK_NUMBER (insn, next_block_number++);
3565           }
3566         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
3567           {
3568             current_block_number = block_stack[--depth];
3569             SET_NOTE_BLOCK_NUMBER (insn, current_block_number);
3570           }
3571       }
3572
3573   return block_vector;
3574 }
3575
3576 /* Given BLOCK_VECTOR which was returned by identify_blocks,
3577    and a revised instruction chain, rebuild the tree structure
3578    of BLOCK nodes to correspond to the new order of RTL.
3579    Returns the current top-level block.  */
3580
3581 tree
3582 reorder_blocks (block_vector, insns)
3583      tree *block_vector;
3584      rtx insns;
3585 {
3586   tree current_block = block_vector[0];
3587   rtx insn;
3588
3589   for (insn = insns; insn; insn = NEXT_INSN (insn))
3590     if (GET_CODE (insn) == NOTE)
3591       {
3592         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
3593           {
3594             tree block = block_vector[NOTE_BLOCK_NUMBER (insn)];
3595             /* If we have seen this block before, copy it.  */
3596             if (TREE_ASM_WRITTEN (block))
3597               block = copy_node (block);
3598             else
3599               BLOCK_SUBBLOCKS (block) = 0;
3600             TREE_ASM_WRITTEN (block) = 1;
3601             BLOCK_SUPERCONTEXT (block) = current_block; 
3602             BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
3603             BLOCK_SUBBLOCKS (current_block) = block;
3604             current_block = block;
3605             SET_NOTE_BLOCK_NUMBER (insn, 0);
3606           }
3607         if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
3608           {
3609             BLOCK_SUBBLOCKS (current_block)
3610               = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
3611             current_block = BLOCK_SUPERCONTEXT (current_block);
3612             SET_NOTE_BLOCK_NUMBER (insn, 0);
3613           }
3614       }
3615
3616   return current_block;
3617 }
3618
3619 /* Reverse the order of elements in the chain T of blocks,
3620    and return the new head of the chain (old last element).  */
3621
3622 static tree
3623 blocks_nreverse (t)
3624      tree t;
3625 {
3626   register tree prev = 0, decl, next;
3627   for (decl = t; decl; decl = next)
3628     {
3629       next = BLOCK_CHAIN (decl);
3630       BLOCK_CHAIN (decl) = prev;
3631       prev = decl;
3632     }
3633   return prev;
3634 }
3635
3636 /* Count the subblocks of BLOCK, and list them all into the vector VECTOR.
3637    Also clear TREE_ASM_WRITTEN in all blocks.  */
3638
3639 static int
3640 all_blocks (block, vector)
3641      tree block;
3642      tree *vector;
3643 {
3644   int n_blocks = 1;
3645   tree subblocks; 
3646
3647   TREE_ASM_WRITTEN (block) = 0;
3648   /* Record this block.  */
3649   vector[n_blocks++] = block;
3650
3651   /* Record the subblocks, and their subblocks.  */
3652   for (subblocks = BLOCK_SUBBLOCKS (block);
3653        subblocks; subblocks = BLOCK_CHAIN (subblocks))
3654     n_blocks += all_blocks (subblocks, vector + n_blocks);
3655
3656   return n_blocks;
3657 }
3658 \f
3659 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
3660    and initialize static variables for generating RTL for the statements
3661    of the function.  */
3662
3663 void
3664 init_function_start (subr, filename, line)
3665      tree subr;
3666      char *filename;
3667      int line;
3668 {
3669   char *junk;
3670
3671   init_stmt_for_function ();
3672
3673   cse_not_expected = ! optimize;
3674
3675   /* Caller save not needed yet.  */
3676   caller_save_needed = 0;
3677
3678   /* No stack slots have been made yet.  */
3679   stack_slot_list = 0;
3680
3681   /* There is no stack slot for handling nonlocal gotos.  */
3682   nonlocal_goto_handler_slot = 0;
3683   nonlocal_goto_stack_level = 0;
3684
3685   /* No labels have been declared for nonlocal use.  */
3686   nonlocal_labels = 0;
3687
3688   /* No function calls so far in this function.  */
3689   function_call_count = 0;
3690
3691   /* No parm regs have been allocated.
3692      (This is important for output_inline_function.)  */
3693   max_parm_reg = LAST_VIRTUAL_REGISTER + 1;
3694
3695   /* Initialize the RTL mechanism.  */
3696   init_emit ();
3697
3698   /* Initialize the queue of pending postincrement and postdecrements,
3699      and some other info in expr.c.  */
3700   init_expr ();
3701
3702   /* We haven't done register allocation yet.  */
3703   reg_renumber = 0;
3704
3705   init_const_rtx_hash_table ();
3706
3707   current_function_name = (*decl_printable_name) (subr, &junk);
3708
3709   /* Nonzero if this is a nested function that uses a static chain.  */
3710
3711   current_function_needs_context
3712     = (decl_function_context (current_function_decl) != 0);
3713
3714   /* Set if a call to setjmp is seen.  */
3715   current_function_calls_setjmp = 0;
3716
3717   /* Set if a call to longjmp is seen.  */
3718   current_function_calls_longjmp = 0;
3719
3720   current_function_calls_alloca = 0;
3721   current_function_has_nonlocal_label = 0;
3722   current_function_contains_functions = 0;
3723
3724   current_function_returns_pcc_struct = 0;
3725   current_function_returns_struct = 0;
3726   current_function_epilogue_delay_list = 0;
3727   current_function_uses_const_pool = 0;
3728   current_function_uses_pic_offset_table = 0;
3729
3730   /* We have not yet needed to make a label to jump to for tail-recursion.  */
3731   tail_recursion_label = 0;
3732
3733   /* We haven't had a need to make a save area for ap yet.  */
3734
3735   arg_pointer_save_area = 0;
3736
3737   /* No stack slots allocated yet.  */
3738   frame_offset = 0;
3739
3740   /* No SAVE_EXPRs in this function yet.  */
3741   save_expr_regs = 0;
3742
3743   /* No RTL_EXPRs in this function yet.  */
3744   rtl_expr_chain = 0;
3745
3746   /* We have not allocated any temporaries yet.  */
3747   temp_slots = 0;
3748   temp_slot_level = 0;
3749
3750   /* Within function body, compute a type's size as soon it is laid out.  */
3751   immediate_size_expand++;
3752
3753   init_pending_stack_adjust ();
3754   inhibit_defer_pop = 0;
3755
3756   current_function_outgoing_args_size = 0;
3757
3758   /* Initialize the insn lengths.  */
3759   init_insn_lengths ();
3760
3761   /* Prevent ever trying to delete the first instruction of a function.
3762      Also tell final how to output a linenum before the function prologue.  */
3763   emit_line_note (filename, line);
3764
3765   /* Make sure first insn is a note even if we don't want linenums.
3766      This makes sure the first insn will never be deleted.
3767      Also, final expects a note to appear there.  */
3768   emit_note (NULL_PTR, NOTE_INSN_DELETED);
3769
3770   /* Set flags used by final.c.  */
3771   if (aggregate_value_p (DECL_RESULT (subr)))
3772     {
3773 #ifdef PCC_STATIC_STRUCT_RETURN
3774       if (flag_pcc_struct_return)
3775         current_function_returns_pcc_struct = 1;
3776       else
3777 #endif
3778         current_function_returns_struct = 1;
3779     }
3780
3781   /* Warn if this value is an aggregate type,
3782      regardless of which calling convention we are using for it.  */
3783   if (warn_aggregate_return
3784       && (TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == RECORD_TYPE
3785           || TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == UNION_TYPE
3786           || TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == ARRAY_TYPE))
3787     warning ("function returns an aggregate");
3788
3789   current_function_returns_pointer
3790     = (TREE_CODE (TREE_TYPE (DECL_RESULT (subr))) == POINTER_TYPE);
3791
3792   /* Indicate that we need to distinguish between the return value of the
3793      present function and the return value of a function being called.  */
3794   rtx_equal_function_value_matters = 1;
3795
3796   /* Indicate that we have not instantiated virtual registers yet.  */
3797   virtuals_instantiated = 0;
3798
3799   /* Indicate we have no need of a frame pointer yet.  */
3800   frame_pointer_needed = 0;
3801
3802   /* By default assume not varargs.  */
3803   current_function_varargs = 0;
3804 }
3805
3806 /* Indicate that the current function uses extra args
3807    not explicitly mentioned in the argument list in any fashion.  */
3808
3809 void
3810 mark_varargs ()
3811 {
3812   current_function_varargs = 1;
3813 }
3814
3815 /* Expand a call to __main at the beginning of a possible main function.  */
3816
3817 void
3818 expand_main_function ()
3819 {
3820 #if !defined (INIT_SECTION_ASM_OP) || defined (INVOKE__main)
3821   emit_library_call (gen_rtx (SYMBOL_REF, Pmode, "__main"), 0,
3822                      VOIDmode, 0);
3823 #endif /* not INIT_SECTION_ASM_OP or INVOKE__main */
3824 }
3825 \f
3826 /* Start the RTL for a new function, and set variables used for
3827    emitting RTL.
3828    SUBR is the FUNCTION_DECL node.
3829    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
3830    the function's parameters, which must be run at any return statement.  */
3831
3832 void
3833 expand_function_start (subr, parms_have_cleanups)
3834      tree subr;
3835      int parms_have_cleanups;
3836 {
3837   register int i;
3838   tree tem;
3839   rtx last_ptr;
3840
3841   /* Make sure volatile mem refs aren't considered
3842      valid operands of arithmetic insns.  */
3843   init_recog_no_volatile ();
3844
3845   /* If function gets a static chain arg, store it in the stack frame.
3846      Do this first, so it gets the first stack slot offset.  */
3847   if (current_function_needs_context)
3848     {
3849       last_ptr = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
3850       emit_move_insn (last_ptr, static_chain_incoming_rtx);
3851     }
3852
3853   /* If the parameters of this function need cleaning up, get a label
3854      for the beginning of the code which executes those cleanups.  This must
3855      be done before doing anything with return_label.  */
3856   if (parms_have_cleanups)
3857     cleanup_label = gen_label_rtx ();
3858   else
3859     cleanup_label = 0;
3860
3861   /* Make the label for return statements to jump to, if this machine
3862      does not have a one-instruction return and uses an epilogue,
3863      or if it returns a structure, or if it has parm cleanups.  */
3864 #ifdef HAVE_return
3865   if (cleanup_label == 0 && HAVE_return
3866       && ! current_function_returns_pcc_struct
3867       && ! (current_function_returns_struct && ! optimize))
3868     return_label = 0;
3869   else
3870     return_label = gen_label_rtx ();
3871 #else
3872   return_label = gen_label_rtx ();
3873 #endif
3874
3875   /* Initialize rtx used to return the value.  */
3876   /* Do this before assign_parms so that we copy the struct value address
3877      before any library calls that assign parms might generate.  */
3878
3879   /* Decide whether to return the value in memory or in a register.  */
3880   if (aggregate_value_p (DECL_RESULT (subr)))
3881     {
3882       /* Returning something that won't go in a register.  */
3883       register rtx value_address;
3884
3885 #ifdef PCC_STATIC_STRUCT_RETURN
3886       if (current_function_returns_pcc_struct)
3887         {
3888           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
3889           value_address = assemble_static_space (size);
3890         }
3891       else
3892 #endif
3893         {
3894           /* Expect to be passed the address of a place to store the value.
3895              If it is passed as an argument, assign_parms will take care of
3896              it.  */
3897           if (struct_value_incoming_rtx)
3898             {
3899               value_address = gen_reg_rtx (Pmode);
3900               emit_move_insn (value_address, struct_value_incoming_rtx);
3901             }
3902         }
3903       if (value_address)
3904         DECL_RTL (DECL_RESULT (subr))
3905           = gen_rtx (MEM, DECL_MODE (DECL_RESULT (subr)),
3906                      value_address);
3907     }
3908   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
3909     /* If return mode is void, this decl rtl should not be used.  */
3910     DECL_RTL (DECL_RESULT (subr)) = 0;
3911   else if (parms_have_cleanups)
3912     /* If function will end with cleanup code for parms,
3913        compute the return values into a pseudo reg,
3914        which we will copy into the true return register
3915        after the cleanups are done.  */
3916     DECL_RTL (DECL_RESULT (subr))
3917       = gen_reg_rtx (DECL_MODE (DECL_RESULT (subr)));
3918   else
3919     /* Scalar, returned in a register.  */
3920     {
3921 #ifdef FUNCTION_OUTGOING_VALUE
3922       DECL_RTL (DECL_RESULT (subr))
3923         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (subr)), subr);
3924 #else
3925       DECL_RTL (DECL_RESULT (subr))
3926         = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (subr)), subr);
3927 #endif
3928
3929       /* Mark this reg as the function's return value.  */
3930       if (GET_CODE (DECL_RTL (DECL_RESULT (subr))) == REG)
3931         {
3932           REG_FUNCTION_VALUE_P (DECL_RTL (DECL_RESULT (subr))) = 1;
3933           /* Needed because we may need to move this to memory
3934              in case it's a named return value whose address is taken.  */
3935           DECL_REGISTER (DECL_RESULT (subr)) = 1;
3936         }
3937     }
3938
3939   /* Initialize rtx for parameters and local variables.
3940      In some cases this requires emitting insns.  */
3941
3942   assign_parms (subr, 0);
3943
3944   /* The following was moved from init_function_start.
3945      The move is supposed to make sdb output more accurate.  */
3946   /* Indicate the beginning of the function body,
3947      as opposed to parm setup.  */
3948   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_BEG);
3949
3950   /* If doing stupid allocation, mark parms as born here.  */
3951
3952   if (GET_CODE (get_last_insn ()) != NOTE)
3953     emit_note (NULL_PTR, NOTE_INSN_DELETED);
3954   parm_birth_insn = get_last_insn ();
3955
3956   if (obey_regdecls)
3957     {
3958       for (i = LAST_VIRTUAL_REGISTER + 1; i < max_parm_reg; i++)
3959         use_variable (regno_reg_rtx[i]);
3960
3961       if (current_function_internal_arg_pointer != virtual_incoming_args_rtx)
3962         use_variable (current_function_internal_arg_pointer);
3963     }
3964
3965   /* Fetch static chain values for containing functions.  */
3966   tem = decl_function_context (current_function_decl);
3967   /* If not doing stupid register allocation, then start off with the static
3968      chain pointer in a pseudo register.  Otherwise, we use the stack
3969      address that was generated above.  */
3970   if (tem && ! obey_regdecls)
3971     last_ptr = copy_to_reg (static_chain_incoming_rtx);
3972   context_display = 0;
3973   while (tem)
3974     {
3975       tree rtlexp = make_node (RTL_EXPR);
3976
3977       RTL_EXPR_RTL (rtlexp) = last_ptr;
3978       context_display = tree_cons (tem, rtlexp, context_display);
3979       tem = decl_function_context (tem);
3980       if (tem == 0)
3981         break;
3982       /* Chain thru stack frames, assuming pointer to next lexical frame
3983          is found at the place we always store it.  */
3984 #ifdef FRAME_GROWS_DOWNWARD
3985       last_ptr = plus_constant (last_ptr, - GET_MODE_SIZE (Pmode));
3986 #endif
3987       last_ptr = copy_to_reg (gen_rtx (MEM, Pmode,
3988                                        memory_address (Pmode, last_ptr)));
3989     }
3990
3991   /* After the display initializations is where the tail-recursion label
3992      should go, if we end up needing one.   Ensure we have a NOTE here
3993      since some things (like trampolines) get placed before this.  */
3994   tail_recursion_reentry = emit_note (NULL_PTR, NOTE_INSN_DELETED);
3995
3996   /* Evaluate now the sizes of any types declared among the arguments.  */
3997   for (tem = nreverse (get_pending_sizes ()); tem; tem = TREE_CHAIN (tem))
3998     expand_expr (TREE_VALUE (tem), NULL_RTX, VOIDmode, 0);
3999
4000   /* Make sure there is a line number after the function entry setup code.  */
4001   force_next_line_note ();
4002 }
4003 \f
4004 /* Generate RTL for the end of the current function.
4005    FILENAME and LINE are the current position in the source file.  */
4006
4007 /* It is up to language-specific callers to do cleanups for parameters.  */
4008
4009 void
4010 expand_function_end (filename, line)
4011      char *filename;
4012      int line;
4013 {
4014   register int i;
4015   tree link;
4016
4017   static rtx initial_trampoline;
4018
4019 #ifdef NON_SAVING_SETJMP
4020   /* Don't put any variables in registers if we call setjmp
4021      on a machine that fails to restore the registers.  */
4022   if (NON_SAVING_SETJMP && current_function_calls_setjmp)
4023     {
4024       setjmp_protect (DECL_INITIAL (current_function_decl));
4025       setjmp_protect_args ();
4026     }
4027 #endif
4028
4029   /* Save the argument pointer if a save area was made for it.  */
4030   if (arg_pointer_save_area)
4031     {
4032       rtx x = gen_move_insn (arg_pointer_save_area, virtual_incoming_args_rtx);
4033       emit_insn_before (x, tail_recursion_reentry);
4034     }
4035
4036   /* Initialize any trampolines required by this function.  */
4037   for (link = trampoline_list; link; link = TREE_CHAIN (link))
4038     {
4039       tree function = TREE_PURPOSE (link);
4040       rtx context = lookup_static_chain (function);
4041       rtx tramp = RTL_EXPR_RTL (TREE_VALUE (link));
4042       rtx seq;
4043
4044       /* First make sure this compilation has a template for
4045          initializing trampolines.  */
4046       if (initial_trampoline == 0)
4047         {
4048           end_temporary_allocation ();
4049           initial_trampoline
4050             = gen_rtx (MEM, BLKmode, assemble_trampoline_template ());
4051           resume_temporary_allocation ();
4052         }
4053
4054       /* Generate insns to initialize the trampoline.  */
4055       start_sequence ();
4056       tramp = change_address (initial_trampoline, BLKmode,
4057                               round_trampoline_addr (XEXP (tramp, 0)));
4058       emit_block_move (tramp, initial_trampoline, GEN_INT (TRAMPOLINE_SIZE),
4059                        FUNCTION_BOUNDARY / BITS_PER_UNIT);
4060       INITIALIZE_TRAMPOLINE (XEXP (tramp, 0),
4061                              XEXP (DECL_RTL (function), 0), context);
4062       seq = get_insns ();
4063       end_sequence ();
4064
4065       /* Put those insns at entry to the containing function (this one).  */
4066       emit_insns_before (seq, tail_recursion_reentry);
4067     }
4068   /* Clear the trampoline_list for the next function.  */
4069   trampoline_list = 0;
4070
4071 #if 0  /* I think unused parms are legitimate enough.  */
4072   /* Warn about unused parms.  */
4073   if (warn_unused)
4074     {
4075       rtx decl;
4076
4077       for (decl = DECL_ARGUMENTS (current_function_decl);
4078            decl; decl = TREE_CHAIN (decl))
4079         if (! TREE_USED (decl) && TREE_CODE (decl) == VAR_DECL)
4080           warning_with_decl (decl, "unused parameter `%s'");
4081     }
4082 #endif
4083
4084   /* Delete handlers for nonlocal gotos if nothing uses them.  */
4085   if (nonlocal_goto_handler_slot != 0 && !current_function_has_nonlocal_label)
4086     delete_handlers ();
4087
4088   /* End any sequences that failed to be closed due to syntax errors.  */
4089   while (in_sequence_p ())
4090     end_sequence ();
4091
4092   /* Outside function body, can't compute type's actual size
4093      until next function's body starts.  */
4094   immediate_size_expand--;
4095
4096   /* If doing stupid register allocation,
4097      mark register parms as dying here.  */
4098
4099   if (obey_regdecls)
4100     {
4101       rtx tem;
4102       for (i = LAST_VIRTUAL_REGISTER + 1; i < max_parm_reg; i++)
4103         use_variable (regno_reg_rtx[i]);
4104
4105       /* Likewise for the regs of all the SAVE_EXPRs in the function.  */
4106
4107       for (tem = save_expr_regs; tem; tem = XEXP (tem, 1))
4108         {
4109           use_variable (XEXP (tem, 0));
4110           use_variable_after (XEXP (tem, 0), parm_birth_insn);
4111         }
4112
4113       if (current_function_internal_arg_pointer != virtual_incoming_args_rtx)
4114         use_variable (current_function_internal_arg_pointer);
4115     }
4116
4117   clear_pending_stack_adjust ();
4118   do_pending_stack_adjust ();
4119
4120   /* Mark the end of the function body.
4121      If control reaches this insn, the function can drop through
4122      without returning a value.  */
4123   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_END);
4124
4125   /* Output a linenumber for the end of the function.
4126      SDB depends on this.  */
4127   emit_line_note_force (filename, line);
4128
4129   /* Output the label for the actual return from the function,
4130      if one is expected.  This happens either because a function epilogue
4131      is used instead of a return instruction, or because a return was done
4132      with a goto in order to run local cleanups, or because of pcc-style
4133      structure returning.  */
4134
4135   if (return_label)
4136     emit_label (return_label);
4137
4138   /* If we had calls to alloca, and this machine needs
4139      an accurate stack pointer to exit the function,
4140      insert some code to save and restore the stack pointer.  */
4141 #ifdef EXIT_IGNORE_STACK
4142   if (! EXIT_IGNORE_STACK)
4143 #endif
4144     if (current_function_calls_alloca)
4145       {
4146         rtx tem = 0;
4147
4148         emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
4149         emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
4150       }
4151
4152   /* If scalar return value was computed in a pseudo-reg,
4153      copy that to the hard return register.  */
4154   if (DECL_RTL (DECL_RESULT (current_function_decl)) != 0
4155       && GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) == REG
4156       && (REGNO (DECL_RTL (DECL_RESULT (current_function_decl)))
4157           >= FIRST_PSEUDO_REGISTER))
4158     {
4159       rtx real_decl_result;
4160
4161 #ifdef FUNCTION_OUTGOING_VALUE
4162       real_decl_result
4163         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
4164                                    current_function_decl);
4165 #else
4166       real_decl_result
4167         = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
4168                           current_function_decl);
4169 #endif
4170       REG_FUNCTION_VALUE_P (real_decl_result) = 1;
4171       emit_move_insn (real_decl_result,
4172                       DECL_RTL (DECL_RESULT (current_function_decl)));
4173       emit_insn (gen_rtx (USE, VOIDmode, real_decl_result));
4174     }
4175
4176   /* If returning a structure, arrange to return the address of the value
4177      in a place where debuggers expect to find it.
4178
4179      If returning a structure PCC style,
4180      the caller also depends on this value.
4181      And current_function_returns_pcc_struct is not necessarily set.  */
4182   if (current_function_returns_struct
4183       || current_function_returns_pcc_struct)
4184     {
4185       rtx value_address = XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
4186       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
4187 #ifdef FUNCTION_OUTGOING_VALUE
4188       rtx outgoing
4189         = FUNCTION_OUTGOING_VALUE (build_pointer_type (type),
4190                                    current_function_decl);
4191 #else
4192       rtx outgoing
4193         = FUNCTION_VALUE (build_pointer_type (type),
4194                           current_function_decl);
4195 #endif
4196
4197       /* Mark this as a function return value so integrate will delete the
4198          assignment and USE below when inlining this function.  */
4199       REG_FUNCTION_VALUE_P (outgoing) = 1;
4200
4201       emit_move_insn (outgoing, value_address);
4202       use_variable (outgoing);
4203     }
4204
4205   /* Output a return insn if we are using one.
4206      Otherwise, let the rtl chain end here, to drop through
4207      into the epilogue.  */
4208
4209 #ifdef HAVE_return
4210   if (HAVE_return)
4211     {
4212       emit_jump_insn (gen_return ());
4213       emit_barrier ();
4214     }
4215 #endif
4216
4217   /* Fix up any gotos that jumped out to the outermost
4218      binding level of the function.
4219      Must follow emitting RETURN_LABEL.  */
4220
4221   /* If you have any cleanups to do at this point,
4222      and they need to create temporary variables,
4223      then you will lose.  */
4224   fixup_gotos (NULL_PTR, NULL_RTX, NULL_TREE, get_insns (), 0);
4225 }
4226 \f
4227 /* These arrays record the INSN_UIDs of the prologue and epilogue insns.  */
4228
4229 static int *prologue;
4230 static int *epilogue;
4231
4232 /* Create an array that records the INSN_UIDs of INSNS (either a sequence
4233    or a single insn).  */
4234
4235 static int *
4236 record_insns (insns)
4237      rtx insns;
4238 {
4239   int *vec;
4240
4241   if (GET_CODE (insns) == SEQUENCE)
4242     {
4243       int len = XVECLEN (insns, 0);
4244       vec = (int *) oballoc ((len + 1) * sizeof (int));
4245       vec[len] = 0;
4246       while (--len >= 0)
4247         vec[len] = INSN_UID (XVECEXP (insns, 0, len));
4248     }
4249   else
4250     {
4251       vec = (int *) oballoc (2 * sizeof (int));
4252       vec[0] = INSN_UID (insns);
4253       vec[1] = 0;
4254     }
4255   return vec;
4256 }
4257
4258 /* Determine whether INSN is in the array of INSN_UIDs VEC.  */
4259
4260 static rtx
4261 contains (insn, vec)
4262      rtx insn;
4263      int *vec;
4264 {
4265   register int i, j;
4266
4267   if (GET_CODE (insn) == INSN
4268       && GET_CODE (PATTERN (insn)) == SEQUENCE)
4269     {
4270       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
4271         for (j = 0; vec[j]; j++)
4272           if (INSN_UID (XVECEXP (PATTERN (insn), 0, i)) == vec[j])
4273             return XVECEXP (PATTERN (insn), 0, i);
4274     }
4275   else
4276     {
4277       for (j = 0; vec[j]; j++)
4278         if (INSN_UID (insn) == vec[j])
4279           return insn;
4280     }
4281   return 0;
4282 }
4283
4284 /* Generate the prologe and epilogue RTL if the machine supports it.  Thread
4285    this into place with notes indicating where the prologue ends and where
4286    the epilogue begins.  Update the basic block information when possible.  */
4287
4288 void
4289 thread_prologue_and_epilogue_insns (f)
4290      rtx f;
4291 {
4292 #ifdef HAVE_prologue
4293   if (HAVE_prologue)
4294     {
4295       rtx head, seq, insn;
4296
4297       /* The first insn (a NOTE_INSN_DELETED) is followed by zero or more
4298          prologue insns and a NOTE_INSN_PROLOGUE_END.  */
4299       emit_note_after (NOTE_INSN_PROLOGUE_END, f);
4300       seq = gen_prologue ();
4301       head = emit_insn_after (seq, f);
4302
4303       /* Include the new prologue insns in the first block.  Ignore them
4304          if they form a basic block unto themselves.  */
4305       if (basic_block_head && n_basic_blocks
4306           && GET_CODE (basic_block_head[0]) != CODE_LABEL)
4307         basic_block_head[0] = NEXT_INSN (f);
4308
4309       /* Retain a map of the prologue insns.  */
4310       prologue = record_insns (GET_CODE (seq) == SEQUENCE ? seq : head);
4311     }
4312   else
4313 #endif
4314     prologue = 0;
4315
4316 #ifdef HAVE_epilogue
4317   if (HAVE_epilogue)
4318     {
4319       rtx insn = get_last_insn ();
4320       rtx prev = prev_nonnote_insn (insn);
4321
4322       /* If we end with a BARRIER, we don't need an epilogue.  */
4323       if (! (prev && GET_CODE (prev) == BARRIER))
4324         {
4325           rtx tail, seq;
4326
4327           /* The last basic block ends with a NOTE_INSN_EPILOGUE_BEG,
4328              the epilogue insns (this must include the jump insn that
4329              returns), USE insns ad the end of a function, and a BARRIER.  */
4330
4331           emit_barrier_after (insn);
4332
4333           /* Place the epilogue before the USE insns at the end of a
4334              function.  */
4335           while (prev
4336                  && GET_CODE (prev) == INSN
4337                  && GET_CODE (PATTERN (prev)) == USE)
4338             {
4339               insn = PREV_INSN (prev);
4340               prev = prev_nonnote_insn (prev);
4341             }
4342
4343           seq = gen_epilogue ();
4344           tail = emit_jump_insn_after (seq, insn);
4345           emit_note_after (NOTE_INSN_EPILOGUE_BEG, insn);
4346
4347           /* Include the new epilogue insns in the last block.  Ignore
4348              them if they form a basic block unto themselves.  */
4349           if (basic_block_end && n_basic_blocks
4350               && GET_CODE (basic_block_end[n_basic_blocks - 1]) != JUMP_INSN)
4351             basic_block_end[n_basic_blocks - 1] = tail;
4352
4353           /* Retain a map of the epilogue insns.  */
4354           epilogue = record_insns (GET_CODE (seq) == SEQUENCE ? seq : tail);
4355           return;
4356         }
4357     }
4358 #endif
4359   epilogue = 0;
4360 }
4361
4362 /* Reposition the prologue-end and epilogue-begin notes after instruction
4363    scheduling and delayed branch scheduling.  */
4364
4365 void
4366 reposition_prologue_and_epilogue_notes (f)
4367      rtx f;
4368 {
4369 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
4370   /* Reposition the prologue and epilogue notes.  */
4371   if (n_basic_blocks)
4372     {
4373       rtx next, prev;
4374
4375       if (prologue)
4376         {
4377           register rtx insn, end_prologue;
4378
4379           /* From the end of the first basic block, search backward for a
4380              prologue insn.  */
4381           for (insn = NEXT_INSN (PREV_INSN (basic_block_end[0]));
4382                insn; insn = prev_nonnote_insn (insn))
4383             if (contains (insn, prologue))
4384               {
4385                 end_prologue = insn;
4386                 /* Find the prologue-end note and move it to just after the
4387                    last prologue insn.  */
4388                 for (insn = f; insn; insn = NEXT_INSN (insn))
4389                   if (GET_CODE (insn) == NOTE
4390                       && NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
4391                     break;
4392                 next = NEXT_INSN (insn);
4393                 prev = PREV_INSN (insn);
4394                 if (prev)
4395                   NEXT_INSN (prev) = next;
4396                 if (next)
4397                   PREV_INSN (next) = prev;
4398                 add_insn_after (insn, end_prologue);
4399                 break;
4400               }
4401         }
4402
4403       if (epilogue)
4404         {
4405           register rtx insn, beg_epilogue;
4406
4407           /* From the start of the last basic block, search forward for an
4408              epilogue insn.  */
4409           for (insn = PREV_INSN (NEXT_INSN (basic_block_head[n_basic_blocks - 1]));
4410                insn; insn = next_nonnote_insn (insn))
4411             if (beg_epilogue = contains (insn, epilogue))
4412               {
4413                 /* Find the epilogue-begin note and move it to just before
4414                    the first epilogue insn.  */
4415                 for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
4416                   if (GET_CODE (insn) == NOTE
4417                       && NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
4418                     break;
4419                 next = NEXT_INSN (insn);
4420                 prev = PREV_INSN (insn);
4421                 if (prev)
4422                   NEXT_INSN (prev) = next;
4423                 if (next)
4424                   PREV_INSN (next) = prev;
4425                 add_insn_after (insn, PREV_INSN (beg_epilogue));
4426                 break;
4427               }
4428         }
4429     }
4430 #endif /* HAVE_prologue or HAVE_epilogue */
4431 }