OSDN Git Service

ac8d03ac488099885d110e2a9418feff705caecd
[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, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000 Free Software Foundation, Inc.
4
5 This file is part of GNU CC.
6
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22
23 /* This file handles the generation of rtl code from tree structure
24    at the level of the function as a whole.
25    It creates the rtl expressions for parameters and auto variables
26    and has full responsibility for allocating stack slots.
27
28    `expand_function_start' is called at the beginning of a function,
29    before the function body is parsed, and `expand_function_end' is
30    called after parsing the body.
31
32    Call `assign_stack_local' to allocate a stack slot for a local variable.
33    This is usually done during the RTL generation for the function body,
34    but it can also be done in the reload pass when a pseudo-register does
35    not get a hard register.
36
37    Call `put_var_into_stack' when you learn, belatedly, that a variable
38    previously given a pseudo-register must in fact go in the stack.
39    This function changes the DECL_RTL to be a stack slot instead of a reg
40    then scans all the RTL instructions so far generated to correct them.  */
41
42 #include "config.h"
43 #include "system.h"
44 #include "rtl.h"
45 #include "tree.h"
46 #include "flags.h"
47 #include "except.h"
48 #include "function.h"
49 #include "insn-flags.h"
50 #include "expr.h"
51 #include "insn-codes.h"
52 #include "regs.h"
53 #include "hard-reg-set.h"
54 #include "insn-config.h"
55 #include "recog.h"
56 #include "output.h"
57 #include "basic-block.h"
58 #include "obstack.h"
59 #include "toplev.h"
60 #include "hash.h"
61 #include "ggc.h"
62 #include "tm_p.h"
63
64 #ifndef ACCUMULATE_OUTGOING_ARGS
65 #define ACCUMULATE_OUTGOING_ARGS 0
66 #endif
67
68 #ifndef TRAMPOLINE_ALIGNMENT
69 #define TRAMPOLINE_ALIGNMENT FUNCTION_BOUNDARY
70 #endif
71
72 #ifndef LOCAL_ALIGNMENT
73 #define LOCAL_ALIGNMENT(TYPE, ALIGNMENT) ALIGNMENT
74 #endif
75
76 #if !defined (PREFERRED_STACK_BOUNDARY) && defined (STACK_BOUNDARY)
77 #define PREFERRED_STACK_BOUNDARY STACK_BOUNDARY
78 #endif
79
80 /* Some systems use __main in a way incompatible with its use in gcc, in these
81    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
82    give the same symbol without quotes for an alternative entry point.  You
83    must define both, or neither.  */
84 #ifndef NAME__MAIN
85 #define NAME__MAIN "__main"
86 #define SYMBOL__MAIN __main
87 #endif
88
89 /* Round a value to the lowest integer less than it that is a multiple of
90    the required alignment.  Avoid using division in case the value is
91    negative.  Assume the alignment is a power of two.  */
92 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
93
94 /* Similar, but round to the next highest integer that meets the
95    alignment.  */
96 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
97
98 /* NEED_SEPARATE_AP means that we cannot derive ap from the value of fp
99    during rtl generation.  If they are different register numbers, this is
100    always true.  It may also be true if
101    FIRST_PARM_OFFSET - STARTING_FRAME_OFFSET is not a constant during rtl
102    generation.  See fix_lexical_addr for details.  */
103
104 #if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
105 #define NEED_SEPARATE_AP
106 #endif
107
108 /* Nonzero if function being compiled doesn't contain any calls
109    (ignoring the prologue and epilogue).  This is set prior to
110    local register allocation and is valid for the remaining
111    compiler passes. */
112 int current_function_is_leaf;
113
114 /* Nonzero if function being compiled doesn't contain any instructions
115    that can throw an exception.  This is set prior to final.  */
116
117 int current_function_nothrow;
118
119 /* Nonzero if function being compiled doesn't modify the stack pointer
120    (ignoring the prologue and epilogue).  This is only valid after
121    life_analysis has run. */
122 int current_function_sp_is_unchanging;
123
124 /* Nonzero if the function being compiled is a leaf function which only
125    uses leaf registers.  This is valid after reload (specifically after
126    sched2) and is useful only if the port defines LEAF_REGISTERS.  */
127 int current_function_uses_only_leaf_regs;
128
129 /* Nonzero once virtual register instantiation has been done.
130    assign_stack_local uses frame_pointer_rtx when this is nonzero.  */
131 static int virtuals_instantiated;
132
133 /* These variables hold pointers to functions to
134    save and restore machine-specific data,
135    in push_function_context and pop_function_context.  */
136 void (*init_machine_status) PARAMS ((struct function *));
137 void (*save_machine_status) PARAMS ((struct function *));
138 void (*restore_machine_status) PARAMS ((struct function *));
139 void (*mark_machine_status) PARAMS ((struct function *));
140 void (*free_machine_status) PARAMS ((struct function *));
141
142 /* Likewise, but for language-specific data.  */
143 void (*init_lang_status) PARAMS ((struct function *));
144 void (*save_lang_status) PARAMS ((struct function *));
145 void (*restore_lang_status) PARAMS ((struct function *));
146 void (*mark_lang_status) PARAMS ((struct function *));
147 void (*free_lang_status) PARAMS ((struct function *));
148
149 /* The FUNCTION_DECL for an inline function currently being expanded.  */
150 tree inline_function_decl;
151
152 /* The currently compiled function.  */
153 struct function *cfun = 0;
154
155 /* Global list of all compiled functions.  */
156 struct function *all_functions = 0;
157
158 /* These arrays record the INSN_UIDs of the prologue and epilogue insns.  */
159 static varray_type prologue;
160 static varray_type epilogue;
161
162 /* Array of INSN_UIDs to hold the INSN_UIDs for each sibcall epilogue
163    in this function.  */
164 static varray_type sibcall_epilogue;
165 \f
166 /* In order to evaluate some expressions, such as function calls returning
167    structures in memory, we need to temporarily allocate stack locations.
168    We record each allocated temporary in the following structure.
169
170    Associated with each temporary slot is a nesting level.  When we pop up
171    one level, all temporaries associated with the previous level are freed.
172    Normally, all temporaries are freed after the execution of the statement
173    in which they were created.  However, if we are inside a ({...}) grouping,
174    the result may be in a temporary and hence must be preserved.  If the
175    result could be in a temporary, we preserve it if we can determine which
176    one it is in.  If we cannot determine which temporary may contain the
177    result, all temporaries are preserved.  A temporary is preserved by
178    pretending it was allocated at the previous nesting level.
179
180    Automatic variables are also assigned temporary slots, at the nesting
181    level where they are defined.  They are marked a "kept" so that
182    free_temp_slots will not free them.  */
183
184 struct temp_slot
185 {
186   /* Points to next temporary slot.  */
187   struct temp_slot *next;
188   /* The rtx to used to reference the slot.  */
189   rtx slot;
190   /* The rtx used to represent the address if not the address of the
191      slot above.  May be an EXPR_LIST if multiple addresses exist.  */
192   rtx address;
193   /* The alignment (in bits) of the slot. */
194   int align;
195   /* The size, in units, of the slot.  */
196   HOST_WIDE_INT size;
197   /* The alias set for the slot.  If the alias set is zero, we don't
198      know anything about the alias set of the slot.  We must only
199      reuse a slot if it is assigned an object of the same alias set.
200      Otherwise, the rest of the compiler may assume that the new use
201      of the slot cannot alias the old use of the slot, which is
202      false.  If the slot has alias set zero, then we can't reuse the
203      slot at all, since we have no idea what alias set may have been
204      imposed on the memory.  For example, if the stack slot is the
205      call frame for an inline functioned, we have no idea what alias
206      sets will be assigned to various pieces of the call frame.  */
207   HOST_WIDE_INT alias_set;
208   /* The value of `sequence_rtl_expr' when this temporary is allocated.  */
209   tree rtl_expr;
210   /* Non-zero if this temporary is currently in use.  */
211   char in_use;
212   /* Non-zero if this temporary has its address taken.  */
213   char addr_taken;
214   /* Nesting level at which this slot is being used.  */
215   int level;
216   /* Non-zero if this should survive a call to free_temp_slots.  */
217   int keep;
218   /* The offset of the slot from the frame_pointer, including extra space
219      for alignment.  This info is for combine_temp_slots.  */
220   HOST_WIDE_INT base_offset;
221   /* The size of the slot, including extra space for alignment.  This
222      info is for combine_temp_slots.  */
223   HOST_WIDE_INT full_size;
224 };
225 \f
226 /* This structure is used to record MEMs or pseudos used to replace VAR, any
227    SUBREGs of VAR, and any MEMs containing VAR as an address.  We need to
228    maintain this list in case two operands of an insn were required to match;
229    in that case we must ensure we use the same replacement.  */
230
231 struct fixup_replacement
232 {
233   rtx old;
234   rtx new;
235   struct fixup_replacement *next;
236 };
237    
238 struct insns_for_mem_entry {
239   /* The KEY in HE will be a MEM.  */
240   struct hash_entry he;
241   /* These are the INSNS which reference the MEM.  */
242   rtx insns;
243 };
244
245 /* Forward declarations.  */
246
247 static rtx assign_stack_local_1 PARAMS ((enum machine_mode, HOST_WIDE_INT,
248                                          int, struct function *));
249 static rtx assign_stack_temp_for_type PARAMS ((enum machine_mode,
250                                                HOST_WIDE_INT, int, tree));
251 static struct temp_slot *find_temp_slot_from_address  PARAMS ((rtx));
252 static void put_reg_into_stack  PARAMS ((struct function *, rtx, tree,
253                                          enum machine_mode, enum machine_mode,
254                                          int, unsigned int, int,
255                                          struct hash_table *));
256 static void fixup_var_refs      PARAMS ((rtx, enum machine_mode, int, 
257                                          struct hash_table *));
258 static struct fixup_replacement
259   *find_fixup_replacement       PARAMS ((struct fixup_replacement **, rtx));
260 static void fixup_var_refs_insns PARAMS ((rtx, enum machine_mode, int,
261                                           rtx, int, struct hash_table *));
262 static void fixup_var_refs_1    PARAMS ((rtx, enum machine_mode, rtx *, rtx,
263                                          struct fixup_replacement **));
264 static rtx fixup_memory_subreg  PARAMS ((rtx, rtx, int));
265 static rtx walk_fixup_memory_subreg  PARAMS ((rtx, rtx, int));
266 static rtx fixup_stack_1        PARAMS ((rtx, rtx));
267 static void optimize_bit_field  PARAMS ((rtx, rtx, rtx *));
268 static void instantiate_decls   PARAMS ((tree, int));
269 static void instantiate_decls_1 PARAMS ((tree, int));
270 static void instantiate_decl    PARAMS ((rtx, HOST_WIDE_INT, int));
271 static int instantiate_virtual_regs_1 PARAMS ((rtx *, rtx, int));
272 static void delete_handlers     PARAMS ((void));
273 static void pad_to_arg_alignment PARAMS ((struct args_size *, int,
274                                           struct args_size *));
275 #ifndef ARGS_GROW_DOWNWARD
276 static void pad_below           PARAMS ((struct args_size *, enum machine_mode,
277                                          tree));
278 #endif
279 #ifdef ARGS_GROW_DOWNWARD
280 static tree round_down          PARAMS ((tree, int));
281 #endif
282 static rtx round_trampoline_addr PARAMS ((rtx));
283 static tree *identify_blocks_1  PARAMS ((rtx, tree *, tree *, tree *));
284 static void reorder_blocks_1    PARAMS ((rtx, tree, varray_type *));
285 static tree blocks_nreverse     PARAMS ((tree));
286 static int all_blocks           PARAMS ((tree, tree *));
287 static tree *get_block_vector   PARAMS ((tree, int *));
288 /* We always define `record_insns' even if its not used so that we
289    can always export `prologue_epilogue_contains'.  */
290 static void record_insns        PARAMS ((rtx, varray_type *)) ATTRIBUTE_UNUSED;
291 static int contains             PARAMS ((rtx, varray_type));
292 #ifdef HAVE_return
293 static void emit_return_into_block PARAMS ((basic_block, rtx));
294 #endif
295 static void put_addressof_into_stack PARAMS ((rtx, struct hash_table *));
296 static boolean purge_addressof_1 PARAMS ((rtx *, rtx, int, int, 
297                                           struct hash_table *));
298 static int is_addressof         PARAMS ((rtx *, void *));
299 static struct hash_entry *insns_for_mem_newfunc PARAMS ((struct hash_entry *,
300                                                          struct hash_table *,
301                                                          hash_table_key));
302 static unsigned long insns_for_mem_hash PARAMS ((hash_table_key));
303 static boolean insns_for_mem_comp PARAMS ((hash_table_key, hash_table_key));
304 static int insns_for_mem_walk   PARAMS ((rtx *, void *));
305 static void compute_insns_for_mem PARAMS ((rtx, rtx, struct hash_table *));
306 static void mark_temp_slot PARAMS ((struct temp_slot *));
307 static void mark_function_status PARAMS ((struct function *));
308 static void mark_function_chain PARAMS ((void *));
309 static void prepare_function_start PARAMS ((void));
310 static void do_clobber_return_reg PARAMS ((rtx, void *));
311 static void do_use_return_reg PARAMS ((rtx, void *));
312 \f
313 /* Pointer to chain of `struct function' for containing functions.  */
314 struct function *outer_function_chain;
315
316 /* Given a function decl for a containing function,
317    return the `struct function' for it.  */
318
319 struct function *
320 find_function_data (decl)
321      tree decl;
322 {
323   struct function *p;
324
325   for (p = outer_function_chain; p; p = p->next)
326     if (p->decl == decl)
327       return p;
328
329   abort ();
330 }
331
332 /* Save the current context for compilation of a nested function.
333    This is called from language-specific code.  The caller should use
334    the save_lang_status callback to save any language-specific state,
335    since this function knows only about language-independent
336    variables.  */
337
338 void
339 push_function_context_to (context)
340      tree context;
341 {
342   struct function *p, *context_data;
343
344   if (context)
345     {
346       context_data = (context == current_function_decl
347                       ? cfun
348                       : find_function_data (context));
349       context_data->contains_functions = 1;
350     }
351
352   if (cfun == 0)
353     init_dummy_function_start ();
354   p = cfun;
355
356   p->next = outer_function_chain;
357   outer_function_chain = p;
358   p->fixup_var_refs_queue = 0;
359
360   save_tree_status (p);
361   if (save_lang_status)
362     (*save_lang_status) (p);
363   if (save_machine_status)
364     (*save_machine_status) (p);
365
366   cfun = 0;
367 }
368
369 void
370 push_function_context ()
371 {
372   push_function_context_to (current_function_decl);
373 }
374
375 /* Restore the last saved context, at the end of a nested function.
376    This function is called from language-specific code.  */
377
378 void
379 pop_function_context_from (context)
380      tree context ATTRIBUTE_UNUSED;
381 {
382   struct function *p = outer_function_chain;
383   struct var_refs_queue *queue;
384   struct var_refs_queue *next;
385
386   cfun = p;
387   outer_function_chain = p->next;
388
389   current_function_decl = p->decl;
390   reg_renumber = 0;
391
392   restore_tree_status (p);
393   restore_emit_status (p);
394
395   if (restore_machine_status)
396     (*restore_machine_status) (p);
397   if (restore_lang_status)
398     (*restore_lang_status) (p);
399
400   /* Finish doing put_var_into_stack for any of our variables
401      which became addressable during the nested function.  */
402   for (queue = p->fixup_var_refs_queue; queue; queue = next)
403     {
404       next = queue->next;
405       fixup_var_refs (queue->modified, queue->promoted_mode,
406                       queue->unsignedp, 0);
407       free (queue);
408     }
409   p->fixup_var_refs_queue = 0;
410
411   /* Reset variables that have known state during rtx generation.  */
412   rtx_equal_function_value_matters = 1;
413   virtuals_instantiated = 0;
414 }
415
416 void
417 pop_function_context ()
418 {
419   pop_function_context_from (current_function_decl);
420 }
421
422 /* Clear out all parts of the state in F that can safely be discarded
423    after the function has been parsed, but not compiled, to let
424    garbage collection reclaim the memory.  */
425
426 void
427 free_after_parsing (f)
428      struct function *f;
429 {
430   /* f->expr->forced_labels is used by code generation.  */
431   /* f->emit->regno_reg_rtx is used by code generation.  */
432   /* f->varasm is used by code generation.  */
433   /* f->eh->eh_return_stub_label is used by code generation.  */
434
435   if (free_lang_status)
436     (*free_lang_status) (f);
437   free_stmt_status (f);
438 }
439
440 /* Clear out all parts of the state in F that can safely be discarded
441    after the function has been compiled, to let garbage collection
442    reclaim the memory.  */
443
444 void
445 free_after_compilation (f)
446      struct function *f;
447 {
448   struct temp_slot *ts;
449   struct temp_slot *next;
450
451   free_eh_status (f);
452   free_expr_status (f);
453   free_emit_status (f);
454   free_varasm_status (f);
455
456   if (free_machine_status)
457     (*free_machine_status) (f);
458
459   if (f->x_parm_reg_stack_loc)
460     free (f->x_parm_reg_stack_loc);
461
462   for (ts = f->x_temp_slots; ts; ts = next)
463     {
464       next = ts->next;
465       free (ts);
466     }
467   f->x_temp_slots = NULL;
468
469   f->arg_offset_rtx = NULL;
470   f->return_rtx = NULL;
471   f->internal_arg_pointer = NULL;
472   f->x_nonlocal_labels = NULL;
473   f->x_nonlocal_goto_handler_slots = NULL;
474   f->x_nonlocal_goto_handler_labels = NULL;
475   f->x_nonlocal_goto_stack_level = NULL;
476   f->x_cleanup_label = NULL;
477   f->x_return_label = NULL;
478   f->x_save_expr_regs = NULL;
479   f->x_stack_slot_list = NULL;
480   f->x_rtl_expr_chain = NULL;
481   f->x_tail_recursion_label = NULL;
482   f->x_tail_recursion_reentry = NULL;
483   f->x_arg_pointer_save_area = NULL;
484   f->x_context_display = NULL;
485   f->x_trampoline_list = NULL;
486   f->x_parm_birth_insn = NULL;
487   f->x_last_parm_insn = NULL;
488   f->x_parm_reg_stack_loc = NULL;
489   f->fixup_var_refs_queue = NULL;
490   f->original_arg_vector = NULL;
491   f->original_decl_initial = NULL;
492   f->inl_last_parm_insn = NULL;
493   f->epilogue_delay_list = NULL;
494 }
495
496 \f
497 /* Allocate fixed slots in the stack frame of the current function.  */
498
499 /* Return size needed for stack frame based on slots so far allocated in
500    function F.
501    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
502    the caller may have to do that.  */
503
504 HOST_WIDE_INT
505 get_func_frame_size (f)
506      struct function *f;
507 {
508 #ifdef FRAME_GROWS_DOWNWARD
509   return -f->x_frame_offset;
510 #else
511   return f->x_frame_offset;
512 #endif
513 }
514
515 /* Return size needed for stack frame based on slots so far allocated.
516    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
517    the caller may have to do that.  */
518 HOST_WIDE_INT
519 get_frame_size ()
520 {
521   return get_func_frame_size (cfun);
522 }
523
524 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
525    with machine mode MODE.
526    
527    ALIGN controls the amount of alignment for the address of the slot:
528    0 means according to MODE,
529    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
530    positive specifies alignment boundary in bits.
531
532    We do not round to stack_boundary here.
533
534    FUNCTION specifies the function to allocate in.  */
535
536 static rtx
537 assign_stack_local_1 (mode, size, align, function)
538      enum machine_mode mode;
539      HOST_WIDE_INT size;
540      int align;
541      struct function *function;
542 {
543   register rtx x, addr;
544   int bigend_correction = 0;
545   int alignment;
546
547   /* Allocate in the memory associated with the function in whose frame
548      we are assigning.  */
549   if (function != cfun)
550     push_obstacks (function->function_obstack,
551                    function->function_maybepermanent_obstack);
552
553   if (align == 0)
554     {
555       tree type;
556
557       alignment = GET_MODE_ALIGNMENT (mode);
558       if (mode == BLKmode)
559         alignment = BIGGEST_ALIGNMENT;
560
561       /* Allow the target to (possibly) increase the alignment of this
562          stack slot.  */
563       type = type_for_mode (mode, 0);
564       if (type)
565         alignment = LOCAL_ALIGNMENT (type, alignment);
566
567       alignment /= BITS_PER_UNIT;
568     }
569   else if (align == -1)
570     {
571       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
572       size = CEIL_ROUND (size, alignment);
573     }
574   else
575     alignment = align / BITS_PER_UNIT;
576
577 #ifdef FRAME_GROWS_DOWNWARD
578   function->x_frame_offset -= size;
579 #endif
580
581   /* Ignore alignment we can't do with expected alignment of the boundary.  */
582   if (alignment * BITS_PER_UNIT > PREFERRED_STACK_BOUNDARY)
583     alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
584
585   if (function->stack_alignment_needed < alignment * BITS_PER_UNIT)
586     function->stack_alignment_needed = alignment * BITS_PER_UNIT;
587
588   /* Round frame offset to that alignment.
589      We must be careful here, since FRAME_OFFSET might be negative and
590      division with a negative dividend isn't as well defined as we might
591      like.  So we instead assume that ALIGNMENT is a power of two and
592      use logical operations which are unambiguous.  */
593 #ifdef FRAME_GROWS_DOWNWARD
594   function->x_frame_offset = FLOOR_ROUND (function->x_frame_offset, alignment);
595 #else
596   function->x_frame_offset = CEIL_ROUND (function->x_frame_offset, alignment);
597 #endif
598
599   /* On a big-endian machine, if we are allocating more space than we will use,
600      use the least significant bytes of those that are allocated.  */
601   if (BYTES_BIG_ENDIAN && mode != BLKmode)
602     bigend_correction = size - GET_MODE_SIZE (mode);
603
604   /* If we have already instantiated virtual registers, return the actual
605      address relative to the frame pointer.  */
606   if (function == cfun && virtuals_instantiated)
607     addr = plus_constant (frame_pointer_rtx,
608                           (frame_offset + bigend_correction
609                            + STARTING_FRAME_OFFSET));
610   else
611     addr = plus_constant (virtual_stack_vars_rtx,
612                           function->x_frame_offset + bigend_correction);
613
614 #ifndef FRAME_GROWS_DOWNWARD
615   function->x_frame_offset += size;
616 #endif
617
618   x = gen_rtx_MEM (mode, addr);
619
620   function->x_stack_slot_list
621     = gen_rtx_EXPR_LIST (VOIDmode, x, function->x_stack_slot_list);
622
623   if (function != cfun)
624     pop_obstacks ();
625
626   return x;
627 }
628
629 /* Wrapper around assign_stack_local_1;  assign a local stack slot for the
630    current function.  */
631
632 rtx
633 assign_stack_local (mode, size, align)
634      enum machine_mode mode;
635      HOST_WIDE_INT size;
636      int align;
637 {
638   return assign_stack_local_1 (mode, size, align, cfun);
639 }
640 \f
641 /* Allocate a temporary stack slot and record it for possible later
642    reuse.
643
644    MODE is the machine mode to be given to the returned rtx.
645
646    SIZE is the size in units of the space required.  We do no rounding here
647    since assign_stack_local will do any required rounding.
648
649    KEEP is 1 if this slot is to be retained after a call to
650    free_temp_slots.  Automatic variables for a block are allocated
651    with this flag.  KEEP is 2 if we allocate a longer term temporary,
652    whose lifetime is controlled by CLEANUP_POINT_EXPRs.  KEEP is 3
653    if we are to allocate something at an inner level to be treated as
654    a variable in the block (e.g., a SAVE_EXPR).  
655
656    TYPE is the type that will be used for the stack slot.  */
657
658 static rtx
659 assign_stack_temp_for_type (mode, size, keep, type)
660      enum machine_mode mode;
661      HOST_WIDE_INT size;
662      int keep;
663      tree type;
664 {
665   int align;
666   HOST_WIDE_INT alias_set;
667   struct temp_slot *p, *best_p = 0;
668
669   /* If SIZE is -1 it means that somebody tried to allocate a temporary
670      of a variable size.  */
671   if (size == -1)
672     abort ();
673
674   /* If we know the alias set for the memory that will be used, use
675      it.  If there's no TYPE, then we don't know anything about the
676      alias set for the memory.  */
677   if (type)
678     alias_set = get_alias_set (type);
679   else 
680     alias_set = 0;
681
682   align = GET_MODE_ALIGNMENT (mode);
683   if (mode == BLKmode)
684     align = BIGGEST_ALIGNMENT;
685
686   if (! type)
687     type = type_for_mode (mode, 0);
688
689   if (type)
690     align = LOCAL_ALIGNMENT (type, align);
691
692   /* Try to find an available, already-allocated temporary of the proper
693      mode which meets the size and alignment requirements.  Choose the
694      smallest one with the closest alignment.  */
695   for (p = temp_slots; p; p = p->next)
696     if (p->align >= align && p->size >= size && GET_MODE (p->slot) == mode
697         && ! p->in_use
698         && (! flag_strict_aliasing
699             || (alias_set && p->alias_set == alias_set))
700         && (best_p == 0 || best_p->size > p->size
701             || (best_p->size == p->size && best_p->align > p->align)))
702       {
703         if (p->align == align && p->size == size)
704           {
705             best_p = 0;
706             break;
707           }
708         best_p = p;
709       }
710
711   /* Make our best, if any, the one to use.  */
712   if (best_p)
713     {
714       /* If there are enough aligned bytes left over, make them into a new
715          temp_slot so that the extra bytes don't get wasted.  Do this only
716          for BLKmode slots, so that we can be sure of the alignment.  */
717       if (GET_MODE (best_p->slot) == BLKmode)
718         {
719           int alignment = best_p->align / BITS_PER_UNIT;
720           HOST_WIDE_INT rounded_size = CEIL_ROUND (size, alignment);
721
722           if (best_p->size - rounded_size >= alignment)
723             {
724               p = (struct temp_slot *) xmalloc (sizeof (struct temp_slot));
725               p->in_use = p->addr_taken = 0;
726               p->size = best_p->size - rounded_size;
727               p->base_offset = best_p->base_offset + rounded_size;
728               p->full_size = best_p->full_size - rounded_size;
729               p->slot = gen_rtx_MEM (BLKmode,
730                                      plus_constant (XEXP (best_p->slot, 0),
731                                                     rounded_size));
732               p->align = best_p->align;
733               p->address = 0;
734               p->rtl_expr = 0;
735               p->alias_set = best_p->alias_set;
736               p->next = temp_slots;
737               temp_slots = p;
738
739               stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, p->slot,
740                                                    stack_slot_list);
741
742               best_p->size = rounded_size;
743               best_p->full_size = rounded_size;
744             }
745         }
746
747       p = best_p;
748     }
749               
750   /* If we still didn't find one, make a new temporary.  */
751   if (p == 0)
752     {
753       HOST_WIDE_INT frame_offset_old = frame_offset;
754
755       p = (struct temp_slot *) xmalloc (sizeof (struct temp_slot));
756
757       /* We are passing an explicit alignment request to assign_stack_local.
758          One side effect of that is assign_stack_local will not round SIZE
759          to ensure the frame offset remains suitably aligned.
760
761          So for requests which depended on the rounding of SIZE, we go ahead
762          and round it now.  We also make sure ALIGNMENT is at least
763          BIGGEST_ALIGNMENT.  */
764       if (mode == BLKmode && align < BIGGEST_ALIGNMENT)
765         abort();
766       p->slot = assign_stack_local (mode,
767                                     (mode == BLKmode
768                                      ? CEIL_ROUND (size, align / BITS_PER_UNIT)
769                                      : size),
770                                     align);
771
772       p->align = align;
773       p->alias_set = alias_set;
774
775       /* The following slot size computation is necessary because we don't
776          know the actual size of the temporary slot until assign_stack_local
777          has performed all the frame alignment and size rounding for the
778          requested temporary.  Note that extra space added for alignment
779          can be either above or below this stack slot depending on which
780          way the frame grows.  We include the extra space if and only if it
781          is above this slot.  */
782 #ifdef FRAME_GROWS_DOWNWARD
783       p->size = frame_offset_old - frame_offset;
784 #else
785       p->size = size;
786 #endif
787
788       /* Now define the fields used by combine_temp_slots.  */
789 #ifdef FRAME_GROWS_DOWNWARD
790       p->base_offset = frame_offset;
791       p->full_size = frame_offset_old - frame_offset;
792 #else
793       p->base_offset = frame_offset_old;
794       p->full_size = frame_offset - frame_offset_old;
795 #endif
796       p->address = 0;
797       p->next = temp_slots;
798       temp_slots = p;
799     }
800
801   p->in_use = 1;
802   p->addr_taken = 0;
803   p->rtl_expr = seq_rtl_expr;
804
805   if (keep == 2)
806     {
807       p->level = target_temp_slot_level;
808       p->keep = 0;
809     }
810   else if (keep == 3)
811     {
812       p->level = var_temp_slot_level;
813       p->keep = 0;
814     }
815   else
816     {
817       p->level = temp_slot_level;
818       p->keep = keep;
819     }
820
821   /* We may be reusing an old slot, so clear any MEM flags that may have been
822      set from before.  */
823   RTX_UNCHANGING_P (p->slot) = 0;
824   MEM_IN_STRUCT_P (p->slot) = 0;
825   MEM_SCALAR_P (p->slot) = 0;
826   MEM_ALIAS_SET (p->slot) = alias_set;
827
828   if (type != 0)
829     MEM_SET_IN_STRUCT_P (p->slot, AGGREGATE_TYPE_P (type));
830
831   return p->slot;
832 }
833
834 /* Allocate a temporary stack slot and record it for possible later
835    reuse.  First three arguments are same as in preceding function.  */
836
837 rtx
838 assign_stack_temp (mode, size, keep)
839      enum machine_mode mode;
840      HOST_WIDE_INT size;
841      int keep;
842 {
843   return assign_stack_temp_for_type (mode, size, keep, NULL_TREE);
844 }
845 \f
846 /* Assign a temporary of given TYPE.
847    KEEP is as for assign_stack_temp.
848    MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
849    it is 0 if a register is OK.
850    DONT_PROMOTE is 1 if we should not promote values in register
851    to wider modes.  */
852
853 rtx
854 assign_temp (type, keep, memory_required, dont_promote)
855      tree type;
856      int keep;
857      int memory_required;
858      int dont_promote ATTRIBUTE_UNUSED;
859 {
860   enum machine_mode mode = TYPE_MODE (type);
861 #ifndef PROMOTE_FOR_CALL_ONLY
862   int unsignedp = TREE_UNSIGNED (type);
863 #endif
864
865   if (mode == BLKmode || memory_required)
866     {
867       HOST_WIDE_INT size = int_size_in_bytes (type);
868       rtx tmp;
869
870       /* Zero sized arrays are GNU C extension.  Set size to 1 to avoid
871          problems with allocating the stack space.  */
872       if (size == 0)
873         size = 1;
874
875       /* Unfortunately, we don't yet know how to allocate variable-sized
876          temporaries.  However, sometimes we have a fixed upper limit on
877          the size (which is stored in TYPE_ARRAY_MAX_SIZE) and can use that
878          instead.  This is the case for Chill variable-sized strings.  */
879       if (size == -1 && TREE_CODE (type) == ARRAY_TYPE
880           && TYPE_ARRAY_MAX_SIZE (type) != NULL_TREE
881           && host_integerp (TYPE_ARRAY_MAX_SIZE (type), 1))
882         size = tree_low_cst (TYPE_ARRAY_MAX_SIZE (type), 1);
883
884       tmp = assign_stack_temp_for_type (mode, size, keep, type);
885       return tmp;
886     }
887
888 #ifndef PROMOTE_FOR_CALL_ONLY
889   if (! dont_promote)
890     mode = promote_mode (type, mode, &unsignedp, 0);
891 #endif
892
893   return gen_reg_rtx (mode);
894 }
895 \f
896 /* Combine temporary stack slots which are adjacent on the stack.
897
898    This allows for better use of already allocated stack space.  This is only
899    done for BLKmode slots because we can be sure that we won't have alignment
900    problems in this case.  */
901
902 void
903 combine_temp_slots ()
904 {
905   struct temp_slot *p, *q;
906   struct temp_slot *prev_p, *prev_q;
907   int num_slots;
908
909   /* We can't combine slots, because the information about which slot
910      is in which alias set will be lost.  */
911   if (flag_strict_aliasing)
912     return;
913
914   /* If there are a lot of temp slots, don't do anything unless 
915      high levels of optimizaton.  */
916   if (! flag_expensive_optimizations)
917     for (p = temp_slots, num_slots = 0; p; p = p->next, num_slots++)
918       if (num_slots > 100 || (num_slots > 10 && optimize == 0))
919         return;
920
921   for (p = temp_slots, prev_p = 0; p; p = prev_p ? prev_p->next : temp_slots)
922     {
923       int delete_p = 0;
924
925       if (! p->in_use && GET_MODE (p->slot) == BLKmode)
926         for (q = p->next, prev_q = p; q; q = prev_q->next)
927           {
928             int delete_q = 0;
929             if (! q->in_use && GET_MODE (q->slot) == BLKmode)
930               {
931                 if (p->base_offset + p->full_size == q->base_offset)
932                   {
933                     /* Q comes after P; combine Q into P.  */
934                     p->size += q->size;
935                     p->full_size += q->full_size;
936                     delete_q = 1;
937                   }
938                 else if (q->base_offset + q->full_size == p->base_offset)
939                   {
940                     /* P comes after Q; combine P into Q.  */
941                     q->size += p->size;
942                     q->full_size += p->full_size;
943                     delete_p = 1;
944                     break;
945                   }
946               }
947             /* Either delete Q or advance past it.  */
948             if (delete_q)
949               {
950                 prev_q->next = q->next;
951                 free (q);
952               }
953             else
954               prev_q = q;
955           }
956       /* Either delete P or advance past it.  */
957       if (delete_p)
958         {
959           if (prev_p)
960             prev_p->next = p->next;
961           else
962             temp_slots = p->next;
963         }
964       else
965         prev_p = p;
966     }
967 }
968 \f
969 /* Find the temp slot corresponding to the object at address X.  */
970
971 static struct temp_slot *
972 find_temp_slot_from_address (x)
973      rtx x;
974 {
975   struct temp_slot *p;
976   rtx next;
977
978   for (p = temp_slots; p; p = p->next)
979     {
980       if (! p->in_use)
981         continue;
982
983       else if (XEXP (p->slot, 0) == x
984                || p->address == x
985                || (GET_CODE (x) == PLUS
986                    && XEXP (x, 0) == virtual_stack_vars_rtx
987                    && GET_CODE (XEXP (x, 1)) == CONST_INT
988                    && INTVAL (XEXP (x, 1)) >= p->base_offset
989                    && INTVAL (XEXP (x, 1)) < p->base_offset + p->full_size))
990         return p;
991
992       else if (p->address != 0 && GET_CODE (p->address) == EXPR_LIST)
993         for (next = p->address; next; next = XEXP (next, 1))
994           if (XEXP (next, 0) == x)
995             return p;
996     }
997
998   /* If we have a sum involving a register, see if it points to a temp
999      slot.  */
1000   if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 0)) == REG
1001       && (p = find_temp_slot_from_address (XEXP (x, 0))) != 0)
1002     return p;
1003   else if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == REG
1004            && (p = find_temp_slot_from_address (XEXP (x, 1))) != 0)
1005     return p;
1006
1007   return 0;
1008 }
1009       
1010 /* Indicate that NEW is an alternate way of referring to the temp slot
1011    that previously was known by OLD.  */
1012
1013 void
1014 update_temp_slot_address (old, new)
1015      rtx old, new;
1016 {
1017   struct temp_slot *p;
1018
1019   if (rtx_equal_p (old, new))
1020     return;
1021
1022   p = find_temp_slot_from_address (old);
1023
1024   /* If we didn't find one, see if both OLD is a PLUS.  If so, and NEW
1025      is a register, see if one operand of the PLUS is a temporary
1026      location.  If so, NEW points into it.  Otherwise, if both OLD and
1027      NEW are a PLUS and if there is a register in common between them.
1028      If so, try a recursive call on those values.  */
1029   if (p == 0)
1030     {
1031       if (GET_CODE (old) != PLUS)
1032         return;
1033
1034       if (GET_CODE (new) == REG)
1035         {
1036           update_temp_slot_address (XEXP (old, 0), new);
1037           update_temp_slot_address (XEXP (old, 1), new);
1038           return;
1039         }
1040       else if (GET_CODE (new) != PLUS)
1041         return;
1042
1043       if (rtx_equal_p (XEXP (old, 0), XEXP (new, 0)))
1044         update_temp_slot_address (XEXP (old, 1), XEXP (new, 1));
1045       else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 0)))
1046         update_temp_slot_address (XEXP (old, 0), XEXP (new, 1));
1047       else if (rtx_equal_p (XEXP (old, 0), XEXP (new, 1)))
1048         update_temp_slot_address (XEXP (old, 1), XEXP (new, 0));
1049       else if (rtx_equal_p (XEXP (old, 1), XEXP (new, 1)))
1050         update_temp_slot_address (XEXP (old, 0), XEXP (new, 0));
1051
1052       return;
1053     }
1054
1055   /* Otherwise add an alias for the temp's address. */
1056   else if (p->address == 0)
1057     p->address = new;
1058   else
1059     {
1060       if (GET_CODE (p->address) != EXPR_LIST)
1061         p->address = gen_rtx_EXPR_LIST (VOIDmode, p->address, NULL_RTX);
1062
1063       p->address = gen_rtx_EXPR_LIST (VOIDmode, new, p->address);
1064     }
1065 }
1066
1067 /* If X could be a reference to a temporary slot, mark the fact that its
1068    address was taken.  */
1069
1070 void
1071 mark_temp_addr_taken (x)
1072      rtx x;
1073 {
1074   struct temp_slot *p;
1075
1076   if (x == 0)
1077     return;
1078
1079   /* If X is not in memory or is at a constant address, it cannot be in
1080      a temporary slot.  */
1081   if (GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0)))
1082     return;
1083
1084   p = find_temp_slot_from_address (XEXP (x, 0));
1085   if (p != 0)
1086     p->addr_taken = 1;
1087 }
1088
1089 /* If X could be a reference to a temporary slot, mark that slot as
1090    belonging to the to one level higher than the current level.  If X
1091    matched one of our slots, just mark that one.  Otherwise, we can't
1092    easily predict which it is, so upgrade all of them.  Kept slots
1093    need not be touched.
1094
1095    This is called when an ({...}) construct occurs and a statement
1096    returns a value in memory.  */
1097
1098 void
1099 preserve_temp_slots (x)
1100      rtx x;
1101 {
1102   struct temp_slot *p = 0;
1103
1104   /* If there is no result, we still might have some objects whose address
1105      were taken, so we need to make sure they stay around.  */
1106   if (x == 0)
1107     {
1108       for (p = temp_slots; p; p = p->next)
1109         if (p->in_use && p->level == temp_slot_level && p->addr_taken)
1110           p->level--;
1111
1112       return;
1113     }
1114
1115   /* If X is a register that is being used as a pointer, see if we have
1116      a temporary slot we know it points to.  To be consistent with
1117      the code below, we really should preserve all non-kept slots
1118      if we can't find a match, but that seems to be much too costly.  */
1119   if (GET_CODE (x) == REG && REGNO_POINTER_FLAG (REGNO (x)))
1120     p = find_temp_slot_from_address (x);
1121
1122   /* If X is not in memory or is at a constant address, it cannot be in
1123      a temporary slot, but it can contain something whose address was
1124      taken.  */
1125   if (p == 0 && (GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0))))
1126     {
1127       for (p = temp_slots; p; p = p->next)
1128         if (p->in_use && p->level == temp_slot_level && p->addr_taken)
1129           p->level--;
1130
1131       return;
1132     }
1133
1134   /* First see if we can find a match.  */
1135   if (p == 0)
1136     p = find_temp_slot_from_address (XEXP (x, 0));
1137
1138   if (p != 0)
1139     {
1140       /* Move everything at our level whose address was taken to our new
1141          level in case we used its address.  */
1142       struct temp_slot *q;
1143
1144       if (p->level == temp_slot_level)
1145         {
1146           for (q = temp_slots; q; q = q->next)
1147             if (q != p && q->addr_taken && q->level == p->level)
1148               q->level--;
1149
1150           p->level--;
1151           p->addr_taken = 0;
1152         }
1153       return;
1154     }
1155
1156   /* Otherwise, preserve all non-kept slots at this level.  */
1157   for (p = temp_slots; p; p = p->next)
1158     if (p->in_use && p->level == temp_slot_level && ! p->keep)
1159       p->level--;
1160 }
1161
1162 /* X is the result of an RTL_EXPR.  If it is a temporary slot associated
1163    with that RTL_EXPR, promote it into a temporary slot at the present
1164    level so it will not be freed when we free slots made in the
1165    RTL_EXPR.  */
1166
1167 void
1168 preserve_rtl_expr_result (x)
1169      rtx x;
1170 {
1171   struct temp_slot *p;
1172
1173   /* If X is not in memory or is at a constant address, it cannot be in
1174      a temporary slot.  */
1175   if (x == 0 || GET_CODE (x) != MEM || CONSTANT_P (XEXP (x, 0)))
1176     return;
1177
1178   /* If we can find a match, move it to our level unless it is already at
1179      an upper level.  */
1180   p = find_temp_slot_from_address (XEXP (x, 0));
1181   if (p != 0)
1182     {
1183       p->level = MIN (p->level, temp_slot_level);
1184       p->rtl_expr = 0;
1185     }
1186
1187   return;
1188 }
1189
1190 /* Free all temporaries used so far.  This is normally called at the end
1191    of generating code for a statement.  Don't free any temporaries
1192    currently in use for an RTL_EXPR that hasn't yet been emitted.
1193    We could eventually do better than this since it can be reused while
1194    generating the same RTL_EXPR, but this is complex and probably not
1195    worthwhile.  */
1196
1197 void
1198 free_temp_slots ()
1199 {
1200   struct temp_slot *p;
1201
1202   for (p = temp_slots; p; p = p->next)
1203     if (p->in_use && p->level == temp_slot_level && ! p->keep
1204         && p->rtl_expr == 0)
1205       p->in_use = 0;
1206
1207   combine_temp_slots ();
1208 }
1209
1210 /* Free all temporary slots used in T, an RTL_EXPR node.  */
1211
1212 void
1213 free_temps_for_rtl_expr (t)
1214      tree t;
1215 {
1216   struct temp_slot *p;
1217
1218   for (p = temp_slots; p; p = p->next)
1219     if (p->rtl_expr == t)
1220       {
1221         /* If this slot is below the current TEMP_SLOT_LEVEL, then it
1222            needs to be preserved.  This can happen if a temporary in
1223            the RTL_EXPR was addressed; preserve_temp_slots will move
1224            the temporary into a higher level.   */
1225         if (temp_slot_level <= p->level)
1226           p->in_use = 0;
1227         else
1228           p->rtl_expr = NULL_TREE;
1229       }
1230
1231   combine_temp_slots ();
1232 }
1233
1234 /* Mark all temporaries ever allocated in this function as not suitable
1235    for reuse until the current level is exited.  */
1236
1237 void
1238 mark_all_temps_used ()
1239 {
1240   struct temp_slot *p;
1241
1242   for (p = temp_slots; p; p = p->next)
1243     {
1244       p->in_use = p->keep = 1;
1245       p->level = MIN (p->level, temp_slot_level);
1246     }
1247 }
1248
1249 /* Push deeper into the nesting level for stack temporaries.  */
1250
1251 void
1252 push_temp_slots ()
1253 {
1254   temp_slot_level++;
1255 }
1256
1257 /* Likewise, but save the new level as the place to allocate variables
1258    for blocks.  */
1259
1260 #if 0
1261 void
1262 push_temp_slots_for_block ()
1263 {
1264   push_temp_slots ();
1265
1266   var_temp_slot_level = temp_slot_level;
1267 }
1268
1269 /* Likewise, but save the new level as the place to allocate temporaries
1270    for TARGET_EXPRs.  */
1271
1272 void
1273 push_temp_slots_for_target ()
1274 {
1275   push_temp_slots ();
1276
1277   target_temp_slot_level = temp_slot_level;
1278 }
1279
1280 /* Set and get the value of target_temp_slot_level.  The only
1281    permitted use of these functions is to save and restore this value.  */
1282
1283 int
1284 get_target_temp_slot_level ()
1285 {
1286   return target_temp_slot_level;
1287 }
1288
1289 void
1290 set_target_temp_slot_level (level)
1291      int level;
1292 {
1293   target_temp_slot_level = level;
1294 }
1295 #endif
1296
1297 /* Pop a temporary nesting level.  All slots in use in the current level
1298    are freed.  */
1299
1300 void
1301 pop_temp_slots ()
1302 {
1303   struct temp_slot *p;
1304
1305   for (p = temp_slots; p; p = p->next)
1306     if (p->in_use && p->level == temp_slot_level && p->rtl_expr == 0)
1307       p->in_use = 0;
1308
1309   combine_temp_slots ();
1310
1311   temp_slot_level--;
1312 }
1313
1314 /* Initialize temporary slots.  */
1315
1316 void
1317 init_temp_slots ()
1318 {
1319   /* We have not allocated any temporaries yet.  */
1320   temp_slots = 0;
1321   temp_slot_level = 0;
1322   var_temp_slot_level = 0;
1323   target_temp_slot_level = 0;
1324 }
1325 \f
1326 /* Retroactively move an auto variable from a register to a stack slot.
1327    This is done when an address-reference to the variable is seen.  */
1328
1329 void
1330 put_var_into_stack (decl)
1331      tree decl;
1332 {
1333   register rtx reg;
1334   enum machine_mode promoted_mode, decl_mode;
1335   struct function *function = 0;
1336   tree context;
1337   int can_use_addressof;
1338   int volatilep = TREE_CODE (decl) != SAVE_EXPR && TREE_THIS_VOLATILE (decl);
1339   int usedp = (TREE_USED (decl)
1340                || (TREE_CODE (decl) != SAVE_EXPR && DECL_INITIAL (decl) != 0));
1341
1342   context = decl_function_context (decl);
1343
1344   /* Get the current rtl used for this object and its original mode.  */
1345   reg = TREE_CODE (decl) == SAVE_EXPR ? SAVE_EXPR_RTL (decl) : DECL_RTL (decl);
1346
1347   /* No need to do anything if decl has no rtx yet
1348      since in that case caller is setting TREE_ADDRESSABLE
1349      and a stack slot will be assigned when the rtl is made.  */
1350   if (reg == 0)
1351     return;
1352
1353   /* Get the declared mode for this object.  */
1354   decl_mode = (TREE_CODE (decl) == SAVE_EXPR ? TYPE_MODE (TREE_TYPE (decl))
1355                : DECL_MODE (decl));
1356   /* Get the mode it's actually stored in.  */
1357   promoted_mode = GET_MODE (reg);
1358
1359   /* If this variable comes from an outer function,
1360      find that function's saved context.  */
1361   if (context != current_function_decl && context != inline_function_decl)
1362     for (function = outer_function_chain; function; function = function->next)
1363       if (function->decl == context)
1364         break;
1365
1366   /* If this is a variable-size object with a pseudo to address it,
1367      put that pseudo into the stack, if the var is nonlocal.  */
1368   if (TREE_CODE (decl) != SAVE_EXPR && DECL_NONLOCAL (decl)
1369       && GET_CODE (reg) == MEM
1370       && GET_CODE (XEXP (reg, 0)) == REG
1371       && REGNO (XEXP (reg, 0)) > LAST_VIRTUAL_REGISTER)
1372     {
1373       reg = XEXP (reg, 0);
1374       decl_mode = promoted_mode = GET_MODE (reg);
1375     }
1376
1377   can_use_addressof
1378     = (function == 0
1379        && optimize > 0
1380        /* FIXME make it work for promoted modes too */
1381        && decl_mode == promoted_mode
1382 #ifdef NON_SAVING_SETJMP
1383        && ! (NON_SAVING_SETJMP && current_function_calls_setjmp)
1384 #endif
1385        );
1386
1387   /* If we can't use ADDRESSOF, make sure we see through one we already
1388      generated.  */
1389   if (! can_use_addressof && GET_CODE (reg) == MEM
1390       && GET_CODE (XEXP (reg, 0)) == ADDRESSOF)
1391     reg = XEXP (XEXP (reg, 0), 0);
1392
1393   /* Now we should have a value that resides in one or more pseudo regs.  */
1394
1395   if (GET_CODE (reg) == REG)
1396     {
1397       /* If this variable lives in the current function and we don't need
1398          to put things in the stack for the sake of setjmp, try to keep it
1399          in a register until we know we actually need the address.  */
1400       if (can_use_addressof)
1401         gen_mem_addressof (reg, decl);
1402       else
1403         put_reg_into_stack (function, reg, TREE_TYPE (decl), promoted_mode,
1404                             decl_mode, volatilep, 0, usedp, 0);
1405     }
1406   else if (GET_CODE (reg) == CONCAT)
1407     {
1408       /* A CONCAT contains two pseudos; put them both in the stack.
1409          We do it so they end up consecutive.  */
1410       enum machine_mode part_mode = GET_MODE (XEXP (reg, 0));
1411       tree part_type = type_for_mode (part_mode, 0);
1412 #ifdef FRAME_GROWS_DOWNWARD
1413       /* Since part 0 should have a lower address, do it second.  */
1414       put_reg_into_stack (function, XEXP (reg, 1), part_type, part_mode,
1415                           part_mode, volatilep, 0, usedp, 0);
1416       put_reg_into_stack (function, XEXP (reg, 0), part_type, part_mode,
1417                           part_mode, volatilep, 0, usedp, 0);
1418 #else
1419       put_reg_into_stack (function, XEXP (reg, 0), part_type, part_mode,
1420                           part_mode, volatilep, 0, usedp, 0);
1421       put_reg_into_stack (function, XEXP (reg, 1), part_type, part_mode,
1422                           part_mode, volatilep, 0, usedp, 0);
1423 #endif
1424
1425       /* Change the CONCAT into a combined MEM for both parts.  */
1426       PUT_CODE (reg, MEM);
1427       set_mem_attributes (reg, decl, 1);
1428
1429       /* The two parts are in memory order already.
1430          Use the lower parts address as ours.  */
1431       XEXP (reg, 0) = XEXP (XEXP (reg, 0), 0);
1432       /* Prevent sharing of rtl that might lose.  */
1433       if (GET_CODE (XEXP (reg, 0)) == PLUS)
1434         XEXP (reg, 0) = copy_rtx (XEXP (reg, 0));
1435     }
1436   else
1437     return;
1438   
1439   if (current_function_check_memory_usage)
1440     emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
1441                        XEXP (reg, 0), Pmode,
1442                        GEN_INT (GET_MODE_SIZE (GET_MODE (reg))),
1443                        TYPE_MODE (sizetype),
1444                        GEN_INT (MEMORY_USE_RW),
1445                        TYPE_MODE (integer_type_node));
1446 }
1447
1448 /* Subroutine of put_var_into_stack.  This puts a single pseudo reg REG
1449    into the stack frame of FUNCTION (0 means the current function).
1450    DECL_MODE is the machine mode of the user-level data type.
1451    PROMOTED_MODE is the machine mode of the register.
1452    VOLATILE_P is nonzero if this is for a "volatile" decl.
1453    USED_P is nonzero if this reg might have already been used in an insn.  */
1454
1455 static void
1456 put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p,
1457                     original_regno, used_p, ht)
1458      struct function *function;
1459      rtx reg;
1460      tree type;
1461      enum machine_mode promoted_mode, decl_mode;
1462      int volatile_p;
1463      unsigned int original_regno;
1464      int used_p;
1465      struct hash_table *ht;
1466 {
1467   struct function *func = function ? function : cfun;
1468   rtx new = 0;
1469   unsigned int regno = original_regno;
1470
1471   if (regno == 0)
1472     regno = REGNO (reg);
1473
1474   if (regno < func->x_max_parm_reg)
1475     new = func->x_parm_reg_stack_loc[regno];
1476
1477   if (new == 0)
1478     new = assign_stack_local_1 (decl_mode, GET_MODE_SIZE (decl_mode), 0, func);
1479
1480   PUT_CODE (reg, MEM);
1481   PUT_MODE (reg, decl_mode);
1482   XEXP (reg, 0) = XEXP (new, 0);
1483   /* `volatil' bit means one thing for MEMs, another entirely for REGs.  */
1484   MEM_VOLATILE_P (reg) = volatile_p;
1485
1486   /* If this is a memory ref that contains aggregate components,
1487      mark it as such for cse and loop optimize.  If we are reusing a
1488      previously generated stack slot, then we need to copy the bit in
1489      case it was set for other reasons.  For instance, it is set for
1490      __builtin_va_alist.  */
1491   MEM_SET_IN_STRUCT_P (reg,
1492                        AGGREGATE_TYPE_P (type) || MEM_IN_STRUCT_P (new));
1493   MEM_ALIAS_SET (reg) = get_alias_set (type);
1494
1495   /* Now make sure that all refs to the variable, previously made
1496      when it was a register, are fixed up to be valid again.  */
1497
1498   if (used_p && function != 0)
1499     {
1500       struct var_refs_queue *temp;
1501
1502       temp
1503         = (struct var_refs_queue *) xmalloc (sizeof (struct var_refs_queue));
1504       temp->modified = reg;
1505       temp->promoted_mode = promoted_mode;
1506       temp->unsignedp = TREE_UNSIGNED (type);
1507       temp->next = function->fixup_var_refs_queue;
1508       function->fixup_var_refs_queue = temp;
1509     }
1510   else if (used_p)
1511     /* Variable is local; fix it up now.  */
1512     fixup_var_refs (reg, promoted_mode, TREE_UNSIGNED (type), ht);
1513 }
1514 \f
1515 static void
1516 fixup_var_refs (var, promoted_mode, unsignedp, ht)
1517      rtx var;
1518      enum machine_mode promoted_mode;
1519      int unsignedp;
1520      struct hash_table *ht;
1521 {
1522   tree pending;
1523   rtx first_insn = get_insns ();
1524   struct sequence_stack *stack = seq_stack;
1525   tree rtl_exps = rtl_expr_chain;
1526   rtx insn;
1527
1528   /* Must scan all insns for stack-refs that exceed the limit.  */
1529   fixup_var_refs_insns (var, promoted_mode, unsignedp, first_insn, 
1530                         stack == 0, ht);
1531   /* If there's a hash table, it must record all uses of VAR.  */
1532   if (ht)
1533     return;
1534
1535   /* Scan all pending sequences too.  */
1536   for (; stack; stack = stack->next)
1537     {
1538       push_to_sequence (stack->first);
1539       fixup_var_refs_insns (var, promoted_mode, unsignedp,
1540                             stack->first, stack->next != 0, 0);
1541       /* Update remembered end of sequence
1542          in case we added an insn at the end.  */
1543       stack->last = get_last_insn ();
1544       end_sequence ();
1545     }
1546
1547   /* Scan all waiting RTL_EXPRs too.  */
1548   for (pending = rtl_exps; pending; pending = TREE_CHAIN (pending))
1549     {
1550       rtx seq = RTL_EXPR_SEQUENCE (TREE_VALUE (pending));
1551       if (seq != const0_rtx && seq != 0)
1552         {
1553           push_to_sequence (seq);
1554           fixup_var_refs_insns (var, promoted_mode, unsignedp, seq, 0,
1555                                 0);
1556           end_sequence ();
1557         }
1558     }
1559
1560   /* Scan the catch clauses for exception handling too.  */
1561   push_to_full_sequence (catch_clauses, catch_clauses_last);
1562   fixup_var_refs_insns (var, promoted_mode, unsignedp, catch_clauses,
1563                         0, 0);
1564   end_full_sequence (&catch_clauses, &catch_clauses_last);
1565
1566   /* Scan sequences saved in CALL_PLACEHOLDERS too.  */
1567   for (insn = first_insn; insn; insn = NEXT_INSN (insn))
1568     {
1569       if (GET_CODE (insn) == CALL_INSN
1570           && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
1571         {
1572           int i;
1573
1574           /* Look at the Normal call, sibling call and tail recursion
1575              sequences attached to the CALL_PLACEHOLDER.  */
1576           for (i = 0; i < 3; i++)
1577             {
1578               rtx seq = XEXP (PATTERN (insn), i);
1579               if (seq)
1580                 {
1581                   push_to_sequence (seq);
1582                   fixup_var_refs_insns (var, promoted_mode, unsignedp,
1583                                         seq, 0, 0);
1584                   XEXP (PATTERN (insn), i) = get_insns ();
1585                   end_sequence ();
1586                 }
1587             }
1588         }
1589     }
1590 }
1591 \f
1592 /* REPLACEMENTS is a pointer to a list of the struct fixup_replacement and X is
1593    some part of an insn.  Return a struct fixup_replacement whose OLD
1594    value is equal to X.  Allocate a new structure if no such entry exists.  */
1595
1596 static struct fixup_replacement *
1597 find_fixup_replacement (replacements, x)
1598      struct fixup_replacement **replacements;
1599      rtx x;
1600 {
1601   struct fixup_replacement *p;
1602
1603   /* See if we have already replaced this.  */
1604   for (p = *replacements; p != 0 && ! rtx_equal_p (p->old, x); p = p->next)
1605     ;
1606
1607   if (p == 0)
1608     {
1609       p = (struct fixup_replacement *) oballoc (sizeof (struct fixup_replacement));
1610       p->old = x;
1611       p->new = 0;
1612       p->next = *replacements;
1613       *replacements = p;
1614     }
1615
1616   return p;
1617 }
1618
1619 /* Scan the insn-chain starting with INSN for refs to VAR
1620    and fix them up.  TOPLEVEL is nonzero if this chain is the
1621    main chain of insns for the current function.  */
1622
1623 static void
1624 fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel, ht)
1625      rtx var;
1626      enum machine_mode promoted_mode;
1627      int unsignedp;
1628      rtx insn;
1629      int toplevel;
1630      struct hash_table *ht;
1631 {
1632   rtx call_dest = 0;
1633   rtx insn_list = NULL_RTX;
1634
1635   /* If we already know which INSNs reference VAR there's no need
1636      to walk the entire instruction chain.  */
1637   if (ht)
1638     {
1639       insn_list = ((struct insns_for_mem_entry *) 
1640                    hash_lookup (ht, var, /*create=*/0, /*copy=*/0))->insns;
1641       insn = insn_list ? XEXP (insn_list, 0) : NULL_RTX;
1642       insn_list = XEXP (insn_list, 1);
1643     }
1644
1645   while (insn)
1646     {
1647       rtx next = NEXT_INSN (insn);
1648       rtx set, prev, prev_set;
1649       rtx note;
1650
1651       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
1652         {
1653           /* Remember the notes in case we delete the insn.  */
1654           note = REG_NOTES (insn);
1655
1656           /* If this is a CLOBBER of VAR, delete it.
1657
1658              If it has a REG_LIBCALL note, delete the REG_LIBCALL
1659              and REG_RETVAL notes too.  */
1660           if (GET_CODE (PATTERN (insn)) == CLOBBER
1661               && (XEXP (PATTERN (insn), 0) == var
1662                   || (GET_CODE (XEXP (PATTERN (insn), 0)) == CONCAT
1663                       && (XEXP (XEXP (PATTERN (insn), 0), 0) == var
1664                           || XEXP (XEXP (PATTERN (insn), 0), 1) == var))))
1665             {
1666               if ((note = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) != 0)
1667                 /* The REG_LIBCALL note will go away since we are going to
1668                    turn INSN into a NOTE, so just delete the
1669                    corresponding REG_RETVAL note.  */
1670                 remove_note (XEXP (note, 0),
1671                              find_reg_note (XEXP (note, 0), REG_RETVAL,
1672                                             NULL_RTX));
1673
1674               /* In unoptimized compilation, we shouldn't call delete_insn
1675                  except in jump.c doing warnings.  */
1676               PUT_CODE (insn, NOTE);
1677               NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1678               NOTE_SOURCE_FILE (insn) = 0;
1679             }
1680
1681           /* The insn to load VAR from a home in the arglist
1682              is now a no-op.  When we see it, just delete it.
1683              Similarly if this is storing VAR from a register from which
1684              it was loaded in the previous insn.  This will occur
1685              when an ADDRESSOF was made for an arglist slot.  */
1686           else if (toplevel
1687                    && (set = single_set (insn)) != 0
1688                    && SET_DEST (set) == var
1689                    /* If this represents the result of an insn group,
1690                       don't delete the insn.  */
1691                    && find_reg_note (insn, REG_RETVAL, NULL_RTX) == 0
1692                    && (rtx_equal_p (SET_SRC (set), var)
1693                        || (GET_CODE (SET_SRC (set)) == REG
1694                            && (prev = prev_nonnote_insn (insn)) != 0
1695                            && (prev_set = single_set (prev)) != 0
1696                            && SET_DEST (prev_set) == SET_SRC (set)
1697                            && rtx_equal_p (SET_SRC (prev_set), var))))
1698             {
1699               /* In unoptimized compilation, we shouldn't call delete_insn
1700                  except in jump.c doing warnings.  */
1701               PUT_CODE (insn, NOTE);
1702               NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
1703               NOTE_SOURCE_FILE (insn) = 0;
1704               if (insn == last_parm_insn)
1705                 last_parm_insn = PREV_INSN (next);
1706             }
1707           else
1708             {
1709               struct fixup_replacement *replacements = 0;
1710               rtx next_insn = NEXT_INSN (insn);
1711
1712               if (SMALL_REGISTER_CLASSES)
1713                 {
1714                   /* If the insn that copies the results of a CALL_INSN
1715                      into a pseudo now references VAR, we have to use an
1716                      intermediate pseudo since we want the life of the
1717                      return value register to be only a single insn.
1718
1719                      If we don't use an intermediate pseudo, such things as
1720                      address computations to make the address of VAR valid
1721                      if it is not can be placed between the CALL_INSN and INSN.
1722
1723                      To make sure this doesn't happen, we record the destination
1724                      of the CALL_INSN and see if the next insn uses both that
1725                      and VAR.  */
1726
1727                   if (call_dest != 0 && GET_CODE (insn) == INSN
1728                       && reg_mentioned_p (var, PATTERN (insn))
1729                       && reg_mentioned_p (call_dest, PATTERN (insn)))
1730                     {
1731                       rtx temp = gen_reg_rtx (GET_MODE (call_dest));
1732
1733                       emit_insn_before (gen_move_insn (temp, call_dest), insn);
1734
1735                       PATTERN (insn) = replace_rtx (PATTERN (insn),
1736                                                     call_dest, temp);
1737                     }
1738               
1739                   if (GET_CODE (insn) == CALL_INSN
1740                       && GET_CODE (PATTERN (insn)) == SET)
1741                     call_dest = SET_DEST (PATTERN (insn));
1742                   else if (GET_CODE (insn) == CALL_INSN
1743                            && GET_CODE (PATTERN (insn)) == PARALLEL
1744                            && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == SET)
1745                     call_dest = SET_DEST (XVECEXP (PATTERN (insn), 0, 0));
1746                   else
1747                     call_dest = 0;
1748                 }
1749
1750               /* See if we have to do anything to INSN now that VAR is in
1751                  memory.  If it needs to be loaded into a pseudo, use a single
1752                  pseudo for the entire insn in case there is a MATCH_DUP
1753                  between two operands.  We pass a pointer to the head of
1754                  a list of struct fixup_replacements.  If fixup_var_refs_1
1755                  needs to allocate pseudos or replacement MEMs (for SUBREGs),
1756                  it will record them in this list.
1757                  
1758                  If it allocated a pseudo for any replacement, we copy into
1759                  it here.  */
1760
1761               fixup_var_refs_1 (var, promoted_mode, &PATTERN (insn), insn,
1762                                 &replacements);
1763
1764               /* If this is last_parm_insn, and any instructions were output
1765                  after it to fix it up, then we must set last_parm_insn to
1766                  the last such instruction emitted.  */
1767               if (insn == last_parm_insn)
1768                 last_parm_insn = PREV_INSN (next_insn);
1769
1770               while (replacements)
1771                 {
1772                   if (GET_CODE (replacements->new) == REG)
1773                     {
1774                       rtx insert_before;
1775                       rtx seq;
1776
1777                       /* OLD might be a (subreg (mem)).  */
1778                       if (GET_CODE (replacements->old) == SUBREG)
1779                         replacements->old
1780                           = fixup_memory_subreg (replacements->old, insn, 0);
1781                       else
1782                         replacements->old
1783                           = fixup_stack_1 (replacements->old, insn);
1784
1785                       insert_before = insn;
1786
1787                       /* If we are changing the mode, do a conversion.
1788                          This might be wasteful, but combine.c will
1789                          eliminate much of the waste.  */
1790
1791                       if (GET_MODE (replacements->new)
1792                           != GET_MODE (replacements->old))
1793                         {
1794                           start_sequence ();
1795                           convert_move (replacements->new,
1796                                         replacements->old, unsignedp);
1797                           seq = gen_sequence ();
1798                           end_sequence ();
1799                         }
1800                       else
1801                         seq = gen_move_insn (replacements->new,
1802                                              replacements->old);
1803
1804                       emit_insn_before (seq, insert_before);
1805                     }
1806
1807                   replacements = replacements->next;
1808                 }
1809             }
1810
1811           /* Also fix up any invalid exprs in the REG_NOTES of this insn.
1812              But don't touch other insns referred to by reg-notes;
1813              we will get them elsewhere.  */
1814           while (note)
1815             {
1816               if (GET_CODE (note) != INSN_LIST)
1817                 XEXP (note, 0)
1818                   = walk_fixup_memory_subreg (XEXP (note, 0), insn, 1);
1819                note = XEXP (note, 1);
1820             }
1821         }
1822
1823       if (!ht)
1824         insn = next;
1825       else if (insn_list)
1826         {
1827           insn = XEXP (insn_list, 0);
1828           insn_list = XEXP (insn_list, 1);
1829         }
1830       else
1831         insn = NULL_RTX;
1832     }
1833 }
1834 \f
1835 /* VAR is a MEM that used to be a pseudo register with mode PROMOTED_MODE.
1836    See if the rtx expression at *LOC in INSN needs to be changed.  
1837
1838    REPLACEMENTS is a pointer to a list head that starts out zero, but may
1839    contain a list of original rtx's and replacements. If we find that we need
1840    to modify this insn by replacing a memory reference with a pseudo or by
1841    making a new MEM to implement a SUBREG, we consult that list to see if
1842    we have already chosen a replacement. If none has already been allocated,
1843    we allocate it and update the list.  fixup_var_refs_insns will copy VAR
1844    or the SUBREG, as appropriate, to the pseudo.  */
1845
1846 static void
1847 fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
1848      register rtx var;
1849      enum machine_mode promoted_mode;
1850      register rtx *loc;
1851      rtx insn;
1852      struct fixup_replacement **replacements;
1853 {
1854   register int i;
1855   register rtx x = *loc;
1856   RTX_CODE code = GET_CODE (x);
1857   register const char *fmt;
1858   register rtx tem, tem1;
1859   struct fixup_replacement *replacement;
1860
1861   switch (code)
1862     {
1863     case ADDRESSOF:
1864       if (XEXP (x, 0) == var)
1865         {
1866           /* Prevent sharing of rtl that might lose.  */
1867           rtx sub = copy_rtx (XEXP (var, 0));
1868
1869           if (! validate_change (insn, loc, sub, 0))
1870             {
1871               rtx y = gen_reg_rtx (GET_MODE (sub));
1872               rtx seq, new_insn;
1873
1874               /* We should be able to replace with a register or all is lost.
1875                  Note that we can't use validate_change to verify this, since
1876                  we're not caring for replacing all dups simultaneously.  */
1877               if (! validate_replace_rtx (*loc, y, insn))
1878                 abort ();
1879
1880               /* Careful!  First try to recognize a direct move of the
1881                  value, mimicking how things are done in gen_reload wrt
1882                  PLUS.  Consider what happens when insn is a conditional
1883                  move instruction and addsi3 clobbers flags.  */
1884
1885               start_sequence ();
1886               new_insn = emit_insn (gen_rtx_SET (VOIDmode, y, sub));
1887               seq = gen_sequence ();
1888               end_sequence ();
1889
1890               if (recog_memoized (new_insn) < 0)
1891                 {
1892                   /* That failed.  Fall back on force_operand and hope.  */
1893
1894                   start_sequence ();
1895                   force_operand (sub, y);
1896                   seq = gen_sequence ();
1897                   end_sequence ();
1898                 }
1899
1900 #ifdef HAVE_cc0
1901               /* Don't separate setter from user.  */
1902               if (PREV_INSN (insn) && sets_cc0_p (PREV_INSN (insn)))
1903                 insn = PREV_INSN (insn);
1904 #endif
1905
1906               emit_insn_before (seq, insn);
1907             }
1908         }
1909       return;
1910
1911     case MEM:
1912       if (var == x)
1913         {
1914           /* If we already have a replacement, use it.  Otherwise, 
1915              try to fix up this address in case it is invalid.  */
1916
1917           replacement = find_fixup_replacement (replacements, var);
1918           if (replacement->new)
1919             {
1920               *loc = replacement->new;
1921               return;
1922             }
1923
1924           *loc = replacement->new = x = fixup_stack_1 (x, insn);
1925
1926           /* Unless we are forcing memory to register or we changed the mode,
1927              we can leave things the way they are if the insn is valid.  */
1928              
1929           INSN_CODE (insn) = -1;
1930           if (! flag_force_mem && GET_MODE (x) == promoted_mode
1931               && recog_memoized (insn) >= 0)
1932             return;
1933
1934           *loc = replacement->new = gen_reg_rtx (promoted_mode);
1935           return;
1936         }
1937
1938       /* If X contains VAR, we need to unshare it here so that we update
1939          each occurrence separately.  But all identical MEMs in one insn
1940          must be replaced with the same rtx because of the possibility of
1941          MATCH_DUPs.  */
1942
1943       if (reg_mentioned_p (var, x))
1944         {
1945           replacement = find_fixup_replacement (replacements, x);
1946           if (replacement->new == 0)
1947             replacement->new = copy_most_rtx (x, var);
1948
1949           *loc = x = replacement->new;
1950         }
1951       break;
1952
1953     case REG:
1954     case CC0:
1955     case PC:
1956     case CONST_INT:
1957     case CONST:
1958     case SYMBOL_REF:
1959     case LABEL_REF:
1960     case CONST_DOUBLE:
1961       return;
1962
1963     case SIGN_EXTRACT:
1964     case ZERO_EXTRACT:
1965       /* Note that in some cases those types of expressions are altered
1966          by optimize_bit_field, and do not survive to get here.  */
1967       if (XEXP (x, 0) == var
1968           || (GET_CODE (XEXP (x, 0)) == SUBREG
1969               && SUBREG_REG (XEXP (x, 0)) == var))
1970         {
1971           /* Get TEM as a valid MEM in the mode presently in the insn.
1972
1973              We don't worry about the possibility of MATCH_DUP here; it
1974              is highly unlikely and would be tricky to handle.  */
1975
1976           tem = XEXP (x, 0);
1977           if (GET_CODE (tem) == SUBREG)
1978             {
1979               if (GET_MODE_BITSIZE (GET_MODE (tem))
1980                   > GET_MODE_BITSIZE (GET_MODE (var)))
1981                 {
1982                   replacement = find_fixup_replacement (replacements, var);
1983                   if (replacement->new == 0)
1984                     replacement->new = gen_reg_rtx (GET_MODE (var));
1985                   SUBREG_REG (tem) = replacement->new;
1986                 }
1987               else
1988                 tem = fixup_memory_subreg (tem, insn, 0);
1989             }
1990           else
1991             tem = fixup_stack_1 (tem, insn);
1992
1993           /* Unless we want to load from memory, get TEM into the proper mode
1994              for an extract from memory.  This can only be done if the
1995              extract is at a constant position and length.  */
1996
1997           if (! flag_force_mem && GET_CODE (XEXP (x, 1)) == CONST_INT
1998               && GET_CODE (XEXP (x, 2)) == CONST_INT
1999               && ! mode_dependent_address_p (XEXP (tem, 0))
2000               && ! MEM_VOLATILE_P (tem))
2001             {
2002               enum machine_mode wanted_mode = VOIDmode;
2003               enum machine_mode is_mode = GET_MODE (tem);
2004               HOST_WIDE_INT pos = INTVAL (XEXP (x, 2));
2005
2006 #ifdef HAVE_extzv
2007               if (GET_CODE (x) == ZERO_EXTRACT)
2008                 {
2009                   wanted_mode
2010                     = insn_data[(int) CODE_FOR_extzv].operand[1].mode;
2011                   if (wanted_mode == VOIDmode)
2012                     wanted_mode = word_mode;
2013                 }
2014 #endif
2015 #ifdef HAVE_extv
2016               if (GET_CODE (x) == SIGN_EXTRACT)
2017                 {
2018                   wanted_mode = insn_data[(int) CODE_FOR_extv].operand[1].mode;
2019                   if (wanted_mode == VOIDmode)
2020                     wanted_mode = word_mode;
2021                 }
2022 #endif
2023               /* If we have a narrower mode, we can do something.  */
2024               if (wanted_mode != VOIDmode
2025                   && GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
2026                 {
2027                   HOST_WIDE_INT offset = pos / BITS_PER_UNIT;
2028                   rtx old_pos = XEXP (x, 2);
2029                   rtx newmem;
2030
2031                   /* If the bytes and bits are counted differently, we
2032                      must adjust the offset.  */
2033                   if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
2034                     offset = (GET_MODE_SIZE (is_mode)
2035                               - GET_MODE_SIZE (wanted_mode) - offset);
2036
2037                   pos %= GET_MODE_BITSIZE (wanted_mode);
2038
2039                   newmem = gen_rtx_MEM (wanted_mode,
2040                                         plus_constant (XEXP (tem, 0), offset));
2041                   MEM_COPY_ATTRIBUTES (newmem, tem);
2042
2043                   /* Make the change and see if the insn remains valid.  */
2044                   INSN_CODE (insn) = -1;
2045                   XEXP (x, 0) = newmem;
2046                   XEXP (x, 2) = GEN_INT (pos);
2047
2048                   if (recog_memoized (insn) >= 0)
2049                     return;
2050
2051                   /* Otherwise, restore old position.  XEXP (x, 0) will be
2052                      restored later.  */
2053                   XEXP (x, 2) = old_pos;
2054                 }
2055             }
2056
2057           /* If we get here, the bitfield extract insn can't accept a memory
2058              reference.  Copy the input into a register.  */
2059
2060           tem1 = gen_reg_rtx (GET_MODE (tem));
2061           emit_insn_before (gen_move_insn (tem1, tem), insn);
2062           XEXP (x, 0) = tem1;
2063           return;
2064         }
2065       break;
2066               
2067     case SUBREG:
2068       if (SUBREG_REG (x) == var)
2069         {
2070           /* If this is a special SUBREG made because VAR was promoted
2071              from a wider mode, replace it with VAR and call ourself
2072              recursively, this time saying that the object previously
2073              had its current mode (by virtue of the SUBREG).  */
2074
2075           if (SUBREG_PROMOTED_VAR_P (x))
2076             {
2077               *loc = var;
2078               fixup_var_refs_1 (var, GET_MODE (var), loc, insn, replacements);
2079               return;
2080             }
2081
2082           /* If this SUBREG makes VAR wider, it has become a paradoxical
2083              SUBREG with VAR in memory, but these aren't allowed at this 
2084              stage of the compilation.  So load VAR into a pseudo and take
2085              a SUBREG of that pseudo.  */
2086           if (GET_MODE_SIZE (GET_MODE (x)) > GET_MODE_SIZE (GET_MODE (var)))
2087             {
2088               replacement = find_fixup_replacement (replacements, var);
2089               if (replacement->new == 0)
2090                 replacement->new = gen_reg_rtx (GET_MODE (var));
2091               SUBREG_REG (x) = replacement->new;
2092               return;
2093             }
2094
2095           /* See if we have already found a replacement for this SUBREG.
2096              If so, use it.  Otherwise, make a MEM and see if the insn
2097              is recognized.  If not, or if we should force MEM into a register,
2098              make a pseudo for this SUBREG.  */
2099           replacement = find_fixup_replacement (replacements, x);
2100           if (replacement->new)
2101             {
2102               *loc = replacement->new;
2103               return;
2104             }
2105           
2106           replacement->new = *loc = fixup_memory_subreg (x, insn, 0);
2107
2108           INSN_CODE (insn) = -1;
2109           if (! flag_force_mem && recog_memoized (insn) >= 0)
2110             return;
2111
2112           *loc = replacement->new = gen_reg_rtx (GET_MODE (x));
2113           return;
2114         }
2115       break;
2116
2117     case SET:
2118       /* First do special simplification of bit-field references.  */
2119       if (GET_CODE (SET_DEST (x)) == SIGN_EXTRACT
2120           || GET_CODE (SET_DEST (x)) == ZERO_EXTRACT)
2121         optimize_bit_field (x, insn, 0);
2122       if (GET_CODE (SET_SRC (x)) == SIGN_EXTRACT
2123           || GET_CODE (SET_SRC (x)) == ZERO_EXTRACT)
2124         optimize_bit_field (x, insn, NULL_PTR);
2125
2126       /* For a paradoxical SUBREG inside a ZERO_EXTRACT, load the object
2127          into a register and then store it back out.  */
2128       if (GET_CODE (SET_DEST (x)) == ZERO_EXTRACT
2129           && GET_CODE (XEXP (SET_DEST (x), 0)) == SUBREG
2130           && SUBREG_REG (XEXP (SET_DEST (x), 0)) == var
2131           && (GET_MODE_SIZE (GET_MODE (XEXP (SET_DEST (x), 0)))
2132               > GET_MODE_SIZE (GET_MODE (var))))
2133         {
2134           replacement = find_fixup_replacement (replacements, var);
2135           if (replacement->new == 0)
2136             replacement->new = gen_reg_rtx (GET_MODE (var));
2137
2138           SUBREG_REG (XEXP (SET_DEST (x), 0)) = replacement->new;
2139           emit_insn_after (gen_move_insn (var, replacement->new), insn);
2140         }
2141
2142       /* If SET_DEST is now a paradoxical SUBREG, put the result of this
2143          insn into a pseudo and store the low part of the pseudo into VAR.  */
2144       if (GET_CODE (SET_DEST (x)) == SUBREG
2145           && SUBREG_REG (SET_DEST (x)) == var
2146           && (GET_MODE_SIZE (GET_MODE (SET_DEST (x)))
2147               > GET_MODE_SIZE (GET_MODE (var))))
2148         {
2149           SET_DEST (x) = tem = gen_reg_rtx (GET_MODE (SET_DEST (x)));
2150           emit_insn_after (gen_move_insn (var, gen_lowpart (GET_MODE (var),
2151                                                             tem)),
2152                            insn);
2153           break;
2154         }
2155           
2156       {
2157         rtx dest = SET_DEST (x);
2158         rtx src = SET_SRC (x);
2159 #ifdef HAVE_insv
2160         rtx outerdest = dest;
2161 #endif
2162
2163         while (GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
2164                || GET_CODE (dest) == SIGN_EXTRACT
2165                || GET_CODE (dest) == ZERO_EXTRACT)
2166           dest = XEXP (dest, 0);
2167
2168         if (GET_CODE (src) == SUBREG)
2169           src = XEXP (src, 0);
2170
2171         /* If VAR does not appear at the top level of the SET
2172            just scan the lower levels of the tree.  */
2173
2174         if (src != var && dest != var)
2175           break;
2176
2177         /* We will need to rerecognize this insn.  */
2178         INSN_CODE (insn) = -1;
2179
2180 #ifdef HAVE_insv
2181         if (GET_CODE (outerdest) == ZERO_EXTRACT && dest == var)
2182           {
2183             /* Since this case will return, ensure we fixup all the
2184                operands here.  */
2185             fixup_var_refs_1 (var, promoted_mode, &XEXP (outerdest, 1),
2186                               insn, replacements);
2187             fixup_var_refs_1 (var, promoted_mode, &XEXP (outerdest, 2),
2188                               insn, replacements);
2189             fixup_var_refs_1 (var, promoted_mode, &SET_SRC (x),
2190                               insn, replacements);
2191
2192             tem = XEXP (outerdest, 0);
2193
2194             /* Clean up (SUBREG:SI (MEM:mode ...) 0)
2195                that may appear inside a ZERO_EXTRACT.
2196                This was legitimate when the MEM was a REG.  */
2197             if (GET_CODE (tem) == SUBREG
2198                 && SUBREG_REG (tem) == var)
2199               tem = fixup_memory_subreg (tem, insn, 0);
2200             else
2201               tem = fixup_stack_1 (tem, insn);
2202
2203             if (GET_CODE (XEXP (outerdest, 1)) == CONST_INT
2204                 && GET_CODE (XEXP (outerdest, 2)) == CONST_INT
2205                 && ! mode_dependent_address_p (XEXP (tem, 0))
2206                 && ! MEM_VOLATILE_P (tem))
2207               {
2208                 enum machine_mode wanted_mode;
2209                 enum machine_mode is_mode = GET_MODE (tem);
2210                 HOST_WIDE_INT pos = INTVAL (XEXP (outerdest, 2));
2211
2212                 wanted_mode = insn_data[(int) CODE_FOR_insv].operand[0].mode;
2213                 if (wanted_mode == VOIDmode)
2214                   wanted_mode = word_mode;
2215
2216                 /* If we have a narrower mode, we can do something.  */
2217                 if (GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
2218                   {
2219                     HOST_WIDE_INT offset = pos / BITS_PER_UNIT;
2220                     rtx old_pos = XEXP (outerdest, 2);
2221                     rtx newmem;
2222
2223                     if (BYTES_BIG_ENDIAN != BITS_BIG_ENDIAN)
2224                       offset = (GET_MODE_SIZE (is_mode)
2225                                 - GET_MODE_SIZE (wanted_mode) - offset);
2226
2227                     pos %= GET_MODE_BITSIZE (wanted_mode);
2228
2229                     newmem = gen_rtx_MEM (wanted_mode,
2230                                           plus_constant (XEXP (tem, 0),
2231                                                          offset));
2232                     MEM_COPY_ATTRIBUTES (newmem, tem);
2233
2234                     /* Make the change and see if the insn remains valid.  */
2235                     INSN_CODE (insn) = -1;
2236                     XEXP (outerdest, 0) = newmem;
2237                     XEXP (outerdest, 2) = GEN_INT (pos);
2238                     
2239                     if (recog_memoized (insn) >= 0)
2240                       return;
2241                     
2242                     /* Otherwise, restore old position.  XEXP (x, 0) will be
2243                        restored later.  */
2244                     XEXP (outerdest, 2) = old_pos;
2245                   }
2246               }
2247
2248             /* If we get here, the bit-field store doesn't allow memory
2249                or isn't located at a constant position.  Load the value into
2250                a register, do the store, and put it back into memory.  */
2251
2252             tem1 = gen_reg_rtx (GET_MODE (tem));
2253             emit_insn_before (gen_move_insn (tem1, tem), insn);
2254             emit_insn_after (gen_move_insn (tem, tem1), insn);
2255             XEXP (outerdest, 0) = tem1;
2256             return;
2257           }
2258 #endif
2259
2260         /* STRICT_LOW_PART is a no-op on memory references
2261            and it can cause combinations to be unrecognizable,
2262            so eliminate it.  */
2263
2264         if (dest == var && GET_CODE (SET_DEST (x)) == STRICT_LOW_PART)
2265           SET_DEST (x) = XEXP (SET_DEST (x), 0);
2266
2267         /* A valid insn to copy VAR into or out of a register
2268            must be left alone, to avoid an infinite loop here.
2269            If the reference to VAR is by a subreg, fix that up,
2270            since SUBREG is not valid for a memref.
2271            Also fix up the address of the stack slot.
2272
2273            Note that we must not try to recognize the insn until
2274            after we know that we have valid addresses and no
2275            (subreg (mem ...) ...) constructs, since these interfere
2276            with determining the validity of the insn.  */
2277
2278         if ((SET_SRC (x) == var
2279              || (GET_CODE (SET_SRC (x)) == SUBREG
2280                  && SUBREG_REG (SET_SRC (x)) == var))
2281             && (GET_CODE (SET_DEST (x)) == REG
2282                 || (GET_CODE (SET_DEST (x)) == SUBREG
2283                     && GET_CODE (SUBREG_REG (SET_DEST (x))) == REG))
2284             && GET_MODE (var) == promoted_mode
2285             && x == single_set (insn))
2286           {
2287             rtx pat;
2288
2289             replacement = find_fixup_replacement (replacements, SET_SRC (x));
2290             if (replacement->new)
2291               SET_SRC (x) = replacement->new;
2292             else if (GET_CODE (SET_SRC (x)) == SUBREG)
2293               SET_SRC (x) = replacement->new
2294                 = fixup_memory_subreg (SET_SRC (x), insn, 0);
2295             else
2296               SET_SRC (x) = replacement->new
2297                 = fixup_stack_1 (SET_SRC (x), insn);
2298
2299             if (recog_memoized (insn) >= 0)
2300               return;
2301
2302             /* INSN is not valid, but we know that we want to
2303                copy SET_SRC (x) to SET_DEST (x) in some way.  So
2304                we generate the move and see whether it requires more
2305                than one insn.  If it does, we emit those insns and
2306                delete INSN.  Otherwise, we an just replace the pattern 
2307                of INSN; we have already verified above that INSN has
2308                no other function that to do X.  */
2309
2310             pat = gen_move_insn (SET_DEST (x), SET_SRC (x));
2311             if (GET_CODE (pat) == SEQUENCE)
2312               {
2313                 emit_insn_after (pat, insn);
2314                 PUT_CODE (insn, NOTE);
2315                 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
2316                 NOTE_SOURCE_FILE (insn) = 0;
2317               }
2318             else
2319               PATTERN (insn) = pat;
2320
2321             return;
2322           }
2323
2324         if ((SET_DEST (x) == var
2325              || (GET_CODE (SET_DEST (x)) == SUBREG
2326                  && SUBREG_REG (SET_DEST (x)) == var))
2327             && (GET_CODE (SET_SRC (x)) == REG
2328                 || (GET_CODE (SET_SRC (x)) == SUBREG
2329                     && GET_CODE (SUBREG_REG (SET_SRC (x))) == REG))
2330             && GET_MODE (var) == promoted_mode
2331             && x == single_set (insn))
2332           {
2333             rtx pat;
2334
2335             if (GET_CODE (SET_DEST (x)) == SUBREG)
2336               SET_DEST (x) = fixup_memory_subreg (SET_DEST (x), insn, 0);
2337             else
2338               SET_DEST (x) = fixup_stack_1 (SET_DEST (x), insn);
2339
2340             if (recog_memoized (insn) >= 0)
2341               return;
2342
2343             pat = gen_move_insn (SET_DEST (x), SET_SRC (x));
2344             if (GET_CODE (pat) == SEQUENCE)
2345               {
2346                 emit_insn_after (pat, insn);
2347                 PUT_CODE (insn, NOTE);
2348                 NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED;
2349                 NOTE_SOURCE_FILE (insn) = 0;
2350               }
2351             else
2352               PATTERN (insn) = pat;
2353
2354             return;
2355           }
2356
2357         /* Otherwise, storing into VAR must be handled specially
2358            by storing into a temporary and copying that into VAR
2359            with a new insn after this one.  Note that this case
2360            will be used when storing into a promoted scalar since
2361            the insn will now have different modes on the input
2362            and output and hence will be invalid (except for the case
2363            of setting it to a constant, which does not need any
2364            change if it is valid).  We generate extra code in that case,
2365            but combine.c will eliminate it.  */
2366
2367         if (dest == var)
2368           {
2369             rtx temp;
2370             rtx fixeddest = SET_DEST (x);
2371
2372             /* STRICT_LOW_PART can be discarded, around a MEM.  */
2373             if (GET_CODE (fixeddest) == STRICT_LOW_PART)
2374               fixeddest = XEXP (fixeddest, 0);
2375             /* Convert (SUBREG (MEM)) to a MEM in a changed mode.  */
2376             if (GET_CODE (fixeddest) == SUBREG)
2377               {
2378                 fixeddest = fixup_memory_subreg (fixeddest, insn, 0);
2379                 promoted_mode = GET_MODE (fixeddest);
2380               }
2381             else
2382               fixeddest = fixup_stack_1 (fixeddest, insn);
2383
2384             temp = gen_reg_rtx (promoted_mode);
2385
2386             emit_insn_after (gen_move_insn (fixeddest,
2387                                             gen_lowpart (GET_MODE (fixeddest),
2388                                                          temp)),
2389                              insn);
2390
2391             SET_DEST (x) = temp;
2392           }
2393       }
2394
2395     default:
2396       break;
2397     }
2398
2399   /* Nothing special about this RTX; fix its operands.  */
2400
2401   fmt = GET_RTX_FORMAT (code);
2402   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2403     {
2404       if (fmt[i] == 'e')
2405         fixup_var_refs_1 (var, promoted_mode, &XEXP (x, i), insn, replacements);
2406       else if (fmt[i] == 'E')
2407         {
2408           register int j;
2409           for (j = 0; j < XVECLEN (x, i); j++)
2410             fixup_var_refs_1 (var, promoted_mode, &XVECEXP (x, i, j),
2411                               insn, replacements);
2412         }
2413     }
2414 }
2415 \f
2416 /* Given X, an rtx of the form (SUBREG:m1 (MEM:m2 addr)),
2417    return an rtx (MEM:m1 newaddr) which is equivalent.
2418    If any insns must be emitted to compute NEWADDR, put them before INSN.
2419
2420    UNCRITICAL nonzero means accept paradoxical subregs.
2421    This is used for subregs found inside REG_NOTES.  */
2422
2423 static rtx
2424 fixup_memory_subreg (x, insn, uncritical)
2425      rtx x;
2426      rtx insn;
2427      int uncritical;
2428 {
2429   int offset = SUBREG_WORD (x) * UNITS_PER_WORD;
2430   rtx addr = XEXP (SUBREG_REG (x), 0);
2431   enum machine_mode mode = GET_MODE (x);
2432   rtx result;
2433
2434   /* Paradoxical SUBREGs are usually invalid during RTL generation.  */
2435   if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
2436       && ! uncritical)
2437     abort ();
2438
2439   if (BYTES_BIG_ENDIAN)
2440     offset += (MIN (UNITS_PER_WORD, GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
2441                - MIN (UNITS_PER_WORD, GET_MODE_SIZE (mode)));
2442   addr = plus_constant (addr, offset);
2443   if (!flag_force_addr && memory_address_p (mode, addr))
2444     /* Shortcut if no insns need be emitted.  */
2445     return change_address (SUBREG_REG (x), mode, addr);
2446   start_sequence ();
2447   result = change_address (SUBREG_REG (x), mode, addr);
2448   emit_insn_before (gen_sequence (), insn);
2449   end_sequence ();
2450   return result;
2451 }
2452
2453 /* Do fixup_memory_subreg on all (SUBREG (MEM ...) ...) contained in X.
2454    Replace subexpressions of X in place.
2455    If X itself is a (SUBREG (MEM ...) ...), return the replacement expression.
2456    Otherwise return X, with its contents possibly altered.
2457
2458    If any insns must be emitted to compute NEWADDR, put them before INSN. 
2459
2460    UNCRITICAL is as in fixup_memory_subreg.  */
2461
2462 static rtx
2463 walk_fixup_memory_subreg (x, insn, uncritical)
2464      register rtx x;
2465      rtx insn;
2466      int uncritical;
2467 {
2468   register enum rtx_code code;
2469   register const char *fmt;
2470   register int i;
2471
2472   if (x == 0)
2473     return 0;
2474
2475   code = GET_CODE (x);
2476
2477   if (code == SUBREG && GET_CODE (SUBREG_REG (x)) == MEM)
2478     return fixup_memory_subreg (x, insn, uncritical);
2479
2480   /* Nothing special about this RTX; fix its operands.  */
2481
2482   fmt = GET_RTX_FORMAT (code);
2483   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2484     {
2485       if (fmt[i] == 'e')
2486         XEXP (x, i) = walk_fixup_memory_subreg (XEXP (x, i), insn, uncritical);
2487       else if (fmt[i] == 'E')
2488         {
2489           register int j;
2490           for (j = 0; j < XVECLEN (x, i); j++)
2491             XVECEXP (x, i, j)
2492               = walk_fixup_memory_subreg (XVECEXP (x, i, j), insn, uncritical);
2493         }
2494     }
2495   return x;
2496 }
2497 \f
2498 /* For each memory ref within X, if it refers to a stack slot
2499    with an out of range displacement, put the address in a temp register
2500    (emitting new insns before INSN to load these registers)
2501    and alter the memory ref to use that register.
2502    Replace each such MEM rtx with a copy, to avoid clobberage.  */
2503
2504 static rtx
2505 fixup_stack_1 (x, insn)
2506      rtx x;
2507      rtx insn;
2508 {
2509   register int i;
2510   register RTX_CODE code = GET_CODE (x);
2511   register const char *fmt;
2512
2513   if (code == MEM)
2514     {
2515       register rtx ad = XEXP (x, 0);
2516       /* If we have address of a stack slot but it's not valid
2517          (displacement is too large), compute the sum in a register.  */
2518       if (GET_CODE (ad) == PLUS
2519           && GET_CODE (XEXP (ad, 0)) == REG
2520           && ((REGNO (XEXP (ad, 0)) >= FIRST_VIRTUAL_REGISTER
2521                && REGNO (XEXP (ad, 0)) <= LAST_VIRTUAL_REGISTER)
2522               || REGNO (XEXP (ad, 0)) == FRAME_POINTER_REGNUM
2523 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
2524               || REGNO (XEXP (ad, 0)) == HARD_FRAME_POINTER_REGNUM
2525 #endif
2526               || REGNO (XEXP (ad, 0)) == STACK_POINTER_REGNUM
2527               || REGNO (XEXP (ad, 0)) == ARG_POINTER_REGNUM
2528               || XEXP (ad, 0) == current_function_internal_arg_pointer)
2529           && GET_CODE (XEXP (ad, 1)) == CONST_INT)
2530         {
2531           rtx temp, seq;
2532           if (memory_address_p (GET_MODE (x), ad))
2533             return x;
2534
2535           start_sequence ();
2536           temp = copy_to_reg (ad);
2537           seq = gen_sequence ();
2538           end_sequence ();
2539           emit_insn_before (seq, insn);
2540           return change_address (x, VOIDmode, temp);
2541         }
2542       return x;
2543     }
2544
2545   fmt = GET_RTX_FORMAT (code);
2546   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2547     {
2548       if (fmt[i] == 'e')
2549         XEXP (x, i) = fixup_stack_1 (XEXP (x, i), insn);
2550       else if (fmt[i] == 'E')
2551         {
2552           register int j;
2553           for (j = 0; j < XVECLEN (x, i); j++)
2554             XVECEXP (x, i, j) = fixup_stack_1 (XVECEXP (x, i, j), insn);
2555         }
2556     }
2557   return x;
2558 }
2559 \f
2560 /* Optimization: a bit-field instruction whose field
2561    happens to be a byte or halfword in memory
2562    can be changed to a move instruction.
2563
2564    We call here when INSN is an insn to examine or store into a bit-field.
2565    BODY is the SET-rtx to be altered.
2566
2567    EQUIV_MEM is the table `reg_equiv_mem' if that is available; else 0.
2568    (Currently this is called only from function.c, and EQUIV_MEM
2569    is always 0.)  */
2570
2571 static void
2572 optimize_bit_field (body, insn, equiv_mem)
2573      rtx body;
2574      rtx insn;
2575      rtx *equiv_mem;
2576 {
2577   register rtx bitfield;
2578   int destflag;
2579   rtx seq = 0;
2580   enum machine_mode mode;
2581
2582   if (GET_CODE (SET_DEST (body)) == SIGN_EXTRACT
2583       || GET_CODE (SET_DEST (body)) == ZERO_EXTRACT)
2584     bitfield = SET_DEST (body), destflag = 1;
2585   else
2586     bitfield = SET_SRC (body), destflag = 0;
2587
2588   /* First check that the field being stored has constant size and position
2589      and is in fact a byte or halfword suitably aligned.  */
2590
2591   if (GET_CODE (XEXP (bitfield, 1)) == CONST_INT
2592       && GET_CODE (XEXP (bitfield, 2)) == CONST_INT
2593       && ((mode = mode_for_size (INTVAL (XEXP (bitfield, 1)), MODE_INT, 1))
2594           != BLKmode)
2595       && INTVAL (XEXP (bitfield, 2)) % INTVAL (XEXP (bitfield, 1)) == 0)
2596     {
2597       register rtx memref = 0;
2598
2599       /* Now check that the containing word is memory, not a register,
2600          and that it is safe to change the machine mode.  */
2601
2602       if (GET_CODE (XEXP (bitfield, 0)) == MEM)
2603         memref = XEXP (bitfield, 0);
2604       else if (GET_CODE (XEXP (bitfield, 0)) == REG
2605                && equiv_mem != 0)
2606         memref = equiv_mem[REGNO (XEXP (bitfield, 0))];
2607       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
2608                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == MEM)
2609         memref = SUBREG_REG (XEXP (bitfield, 0));
2610       else if (GET_CODE (XEXP (bitfield, 0)) == SUBREG
2611                && equiv_mem != 0
2612                && GET_CODE (SUBREG_REG (XEXP (bitfield, 0))) == REG)
2613         memref = equiv_mem[REGNO (SUBREG_REG (XEXP (bitfield, 0)))];
2614
2615       if (memref
2616           && ! mode_dependent_address_p (XEXP (memref, 0))
2617           && ! MEM_VOLATILE_P (memref))
2618         {
2619           /* Now adjust the address, first for any subreg'ing
2620              that we are now getting rid of,
2621              and then for which byte of the word is wanted.  */
2622
2623           HOST_WIDE_INT offset = INTVAL (XEXP (bitfield, 2));
2624           rtx insns;
2625
2626           /* Adjust OFFSET to count bits from low-address byte.  */
2627           if (BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
2628             offset = (GET_MODE_BITSIZE (GET_MODE (XEXP (bitfield, 0)))
2629                       - offset - INTVAL (XEXP (bitfield, 1)));
2630
2631           /* Adjust OFFSET to count bytes from low-address byte.  */
2632           offset /= BITS_PER_UNIT;
2633           if (GET_CODE (XEXP (bitfield, 0)) == SUBREG)
2634             {
2635               offset += SUBREG_WORD (XEXP (bitfield, 0)) * UNITS_PER_WORD;
2636               if (BYTES_BIG_ENDIAN)
2637                 offset -= (MIN (UNITS_PER_WORD,
2638                                 GET_MODE_SIZE (GET_MODE (XEXP (bitfield, 0))))
2639                            - MIN (UNITS_PER_WORD,
2640                                   GET_MODE_SIZE (GET_MODE (memref))));
2641             }
2642
2643           start_sequence ();
2644           memref = change_address (memref, mode,
2645                                    plus_constant (XEXP (memref, 0), offset));
2646           insns = get_insns ();
2647           end_sequence ();
2648           emit_insns_before (insns, insn);
2649
2650           /* Store this memory reference where
2651              we found the bit field reference.  */
2652
2653           if (destflag)
2654             {
2655               validate_change (insn, &SET_DEST (body), memref, 1);
2656               if (! CONSTANT_ADDRESS_P (SET_SRC (body)))
2657                 {
2658                   rtx src = SET_SRC (body);
2659                   while (GET_CODE (src) == SUBREG
2660                          && SUBREG_WORD (src) == 0)
2661                     src = SUBREG_REG (src);
2662                   if (GET_MODE (src) != GET_MODE (memref))
2663                     src = gen_lowpart (GET_MODE (memref), SET_SRC (body));
2664                   validate_change (insn, &SET_SRC (body), src, 1);
2665                 }
2666               else if (GET_MODE (SET_SRC (body)) != VOIDmode
2667                        && GET_MODE (SET_SRC (body)) != GET_MODE (memref))
2668                 /* This shouldn't happen because anything that didn't have
2669                    one of these modes should have got converted explicitly
2670                    and then referenced through a subreg.
2671                    This is so because the original bit-field was
2672                    handled by agg_mode and so its tree structure had
2673                    the same mode that memref now has.  */
2674                 abort ();
2675             }
2676           else
2677             {
2678               rtx dest = SET_DEST (body);
2679
2680               while (GET_CODE (dest) == SUBREG
2681                      && SUBREG_WORD (dest) == 0
2682                      && (GET_MODE_CLASS (GET_MODE (dest))
2683                          == GET_MODE_CLASS (GET_MODE (SUBREG_REG (dest))))
2684                      && (GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest)))
2685                          <= UNITS_PER_WORD))
2686                 dest = SUBREG_REG (dest);
2687
2688               validate_change (insn, &SET_DEST (body), dest, 1);
2689
2690               if (GET_MODE (dest) == GET_MODE (memref))
2691                 validate_change (insn, &SET_SRC (body), memref, 1);
2692               else
2693                 {
2694                   /* Convert the mem ref to the destination mode.  */
2695                   rtx newreg = gen_reg_rtx (GET_MODE (dest));
2696
2697                   start_sequence ();
2698                   convert_move (newreg, memref,
2699                                 GET_CODE (SET_SRC (body)) == ZERO_EXTRACT);
2700                   seq = get_insns ();
2701                   end_sequence ();
2702
2703                   validate_change (insn, &SET_SRC (body), newreg, 1);
2704                 }
2705             }
2706
2707           /* See if we can convert this extraction or insertion into
2708              a simple move insn.  We might not be able to do so if this
2709              was, for example, part of a PARALLEL.
2710
2711              If we succeed, write out any needed conversions.  If we fail,
2712              it is hard to guess why we failed, so don't do anything
2713              special; just let the optimization be suppressed.  */
2714
2715           if (apply_change_group () && seq)
2716             emit_insns_before (seq, insn);
2717         }
2718     }
2719 }
2720 \f
2721 /* These routines are responsible for converting virtual register references
2722    to the actual hard register references once RTL generation is complete.
2723
2724    The following four variables are used for communication between the
2725    routines.  They contain the offsets of the virtual registers from their
2726    respective hard registers.  */
2727
2728 static int in_arg_offset;
2729 static int var_offset;
2730 static int dynamic_offset;
2731 static int out_arg_offset;
2732 static int cfa_offset;
2733
2734 /* In most machines, the stack pointer register is equivalent to the bottom
2735    of the stack.  */
2736
2737 #ifndef STACK_POINTER_OFFSET
2738 #define STACK_POINTER_OFFSET    0
2739 #endif
2740
2741 /* If not defined, pick an appropriate default for the offset of dynamically
2742    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
2743    REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
2744
2745 #ifndef STACK_DYNAMIC_OFFSET
2746
2747 /* The bottom of the stack points to the actual arguments.  If
2748    REG_PARM_STACK_SPACE is defined, this includes the space for the register
2749    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
2750    stack space for register parameters is not pushed by the caller, but 
2751    rather part of the fixed stack areas and hence not included in
2752    `current_function_outgoing_args_size'.  Nevertheless, we must allow
2753    for it when allocating stack dynamic objects.  */
2754
2755 #if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
2756 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
2757 ((ACCUMULATE_OUTGOING_ARGS                                                    \
2758   ? (current_function_outgoing_args_size + REG_PARM_STACK_SPACE (FNDECL)) : 0)\
2759  + (STACK_POINTER_OFFSET))                                                    \
2760
2761 #else
2762 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
2763 ((ACCUMULATE_OUTGOING_ARGS ? current_function_outgoing_args_size : 0)         \
2764  + (STACK_POINTER_OFFSET))
2765 #endif
2766 #endif
2767
2768 /* On most machines, the CFA coincides with the first incoming parm.  */
2769
2770 #ifndef ARG_POINTER_CFA_OFFSET
2771 #define ARG_POINTER_CFA_OFFSET(FNDECL) FIRST_PARM_OFFSET (FNDECL)
2772 #endif
2773
2774
2775 /* Build up a (MEM (ADDRESSOF (REG))) rtx for a register REG that just had
2776    its address taken.  DECL is the decl for the object stored in the
2777    register, for later use if we do need to force REG into the stack.
2778    REG is overwritten by the MEM like in put_reg_into_stack.  */
2779
2780 rtx
2781 gen_mem_addressof (reg, decl)
2782      rtx reg;
2783      tree decl;
2784 {
2785   tree type = TREE_TYPE (decl);
2786   rtx r = gen_rtx_ADDRESSOF (Pmode, gen_reg_rtx (GET_MODE (reg)),
2787                              REGNO (reg), decl);
2788
2789   /* If the original REG was a user-variable, then so is the REG whose
2790      address is being taken.  Likewise for unchanging.  */
2791   REG_USERVAR_P (XEXP (r, 0)) = REG_USERVAR_P (reg);
2792   RTX_UNCHANGING_P (XEXP (r, 0)) = RTX_UNCHANGING_P (reg);
2793
2794   PUT_CODE (reg, MEM);
2795   PUT_MODE (reg, DECL_MODE (decl));
2796   XEXP (reg, 0) = r;
2797   MEM_VOLATILE_P (reg) = TREE_SIDE_EFFECTS (decl);
2798   MEM_SET_IN_STRUCT_P (reg, AGGREGATE_TYPE_P (type));
2799   MEM_ALIAS_SET (reg) = get_alias_set (decl);
2800
2801   if (TREE_USED (decl) || DECL_INITIAL (decl) != 0)
2802     fixup_var_refs (reg, GET_MODE (reg), TREE_UNSIGNED (type), 0);
2803
2804   return reg;
2805 }
2806
2807 /* If DECL has an RTL that is an ADDRESSOF rtx, put it into the stack.  */
2808
2809 void
2810 flush_addressof (decl)
2811      tree decl;
2812 {
2813   if ((TREE_CODE (decl) == PARM_DECL || TREE_CODE (decl) == VAR_DECL)
2814       && DECL_RTL (decl) != 0
2815       && GET_CODE (DECL_RTL (decl)) == MEM
2816       && GET_CODE (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF
2817       && GET_CODE (XEXP (XEXP (DECL_RTL (decl), 0), 0)) == REG)
2818     put_addressof_into_stack (XEXP (DECL_RTL (decl), 0), 0);
2819 }
2820
2821 /* Force the register pointed to by R, an ADDRESSOF rtx, into the stack.  */
2822
2823 static void
2824 put_addressof_into_stack (r, ht)
2825      rtx r;
2826      struct hash_table *ht;
2827 {
2828   tree decl = ADDRESSOF_DECL (r);
2829   rtx reg = XEXP (r, 0);
2830
2831   if (GET_CODE (reg) != REG)
2832     abort ();
2833
2834   put_reg_into_stack (0, reg, TREE_TYPE (decl), GET_MODE (reg),
2835                       GET_MODE (reg),
2836                       (TREE_CODE (decl) != SAVE_EXPR
2837                        && TREE_THIS_VOLATILE (decl)),
2838                       ADDRESSOF_REGNO (r),
2839                       (TREE_USED (decl)
2840                        || (TREE_CODE (decl) != SAVE_EXPR
2841                            && DECL_INITIAL (decl) != 0)),
2842                       ht);
2843 }
2844
2845 /* List of replacements made below in purge_addressof_1 when creating
2846    bitfield insertions.  */
2847 static rtx purge_bitfield_addressof_replacements;
2848
2849 /* List of replacements made below in purge_addressof_1 for patterns
2850    (MEM (ADDRESSOF (REG ...))).  The key of the list entry is the
2851    corresponding (ADDRESSOF (REG ...)) and value is a substitution for
2852    the all pattern.  List PURGE_BITFIELD_ADDRESSOF_REPLACEMENTS is not
2853    enough in complex cases, e.g. when some field values can be
2854    extracted by usage MEM with narrower mode. */
2855 static rtx purge_addressof_replacements;
2856
2857 /* Helper function for purge_addressof.  See if the rtx expression at *LOC
2858    in INSN needs to be changed.  If FORCE, always put any ADDRESSOFs into
2859    the stack.  If the function returns FALSE then the replacement could not
2860    be made.  */
2861
2862 static boolean
2863 purge_addressof_1 (loc, insn, force, store, ht)
2864      rtx *loc;
2865      rtx insn;
2866      int force, store;
2867      struct hash_table *ht;
2868 {
2869   rtx x;
2870   RTX_CODE code;
2871   int i, j;
2872   const char *fmt;
2873   boolean result = true;
2874
2875   /* Re-start here to avoid recursion in common cases.  */
2876  restart:
2877
2878   x = *loc;
2879   if (x == 0)
2880     return true;
2881
2882   code = GET_CODE (x);
2883
2884   /* If we don't return in any of the cases below, we will recurse inside
2885      the RTX, which will normally result in any ADDRESSOF being forced into
2886      memory.  */
2887   if (code == SET)
2888     {
2889       result = purge_addressof_1 (&SET_DEST (x), insn, force, 1, ht);
2890       result &= purge_addressof_1 (&SET_SRC (x), insn, force, 0, ht);
2891       return result;
2892     }
2893
2894   else if (code == ADDRESSOF && GET_CODE (XEXP (x, 0)) == MEM)
2895     {
2896       /* We must create a copy of the rtx because it was created by
2897          overwriting a REG rtx which is always shared.  */
2898       rtx sub = copy_rtx (XEXP (XEXP (x, 0), 0));
2899       rtx insns;
2900
2901       if (validate_change (insn, loc, sub, 0)
2902           || validate_replace_rtx (x, sub, insn))
2903         return true;
2904   
2905       start_sequence ();
2906       sub = force_operand (sub, NULL_RTX);
2907       if (! validate_change (insn, loc, sub, 0)
2908           && ! validate_replace_rtx (x, sub, insn))
2909         abort ();
2910
2911       insns = gen_sequence ();
2912       end_sequence ();
2913       emit_insn_before (insns, insn);
2914       return true;
2915     }
2916
2917   else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force)
2918     {
2919       rtx sub = XEXP (XEXP (x, 0), 0);
2920       rtx sub2;
2921
2922       if (GET_CODE (sub) == MEM)
2923         {
2924           sub2 = gen_rtx_MEM (GET_MODE (x), copy_rtx (XEXP (sub, 0)));
2925           MEM_COPY_ATTRIBUTES (sub2, sub);
2926           sub = sub2;
2927         }
2928       else if (GET_CODE (sub) == REG
2929                && (MEM_VOLATILE_P (x) || GET_MODE (x) == BLKmode))
2930         ;
2931       else if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub))
2932         {
2933           int size_x, size_sub;
2934
2935           if (!insn)
2936             {
2937               /* When processing REG_NOTES look at the list of
2938                  replacements done on the insn to find the register that X
2939                  was replaced by.  */
2940               rtx tem;
2941
2942               for (tem = purge_bitfield_addressof_replacements;
2943                    tem != NULL_RTX;
2944                    tem = XEXP (XEXP (tem, 1), 1))
2945                 if (rtx_equal_p (x, XEXP (tem, 0)))
2946                   {
2947                     *loc = XEXP (XEXP (tem, 1), 0);
2948                     return true;
2949                   }
2950
2951               /* See comment for purge_addressof_replacements. */
2952               for (tem = purge_addressof_replacements;
2953                    tem != NULL_RTX;
2954                    tem = XEXP (XEXP (tem, 1), 1))
2955                 if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0)))
2956                   {
2957                     rtx z = XEXP (XEXP (tem, 1), 0);
2958
2959                     if (GET_MODE (x) == GET_MODE (z)
2960                         || (GET_CODE (XEXP (XEXP (tem, 1), 0)) != REG
2961                             && GET_CODE (XEXP (XEXP (tem, 1), 0)) != SUBREG))
2962                       abort ();
2963
2964                     /* It can happen that the note may speak of things
2965                        in a wider (or just different) mode than the
2966                        code did.  This is especially true of
2967                        REG_RETVAL. */
2968
2969                     if (GET_CODE (z) == SUBREG && SUBREG_WORD (z) == 0)
2970                       z = SUBREG_REG (z);
2971                     
2972                     if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD
2973                         && (GET_MODE_SIZE (GET_MODE (x))
2974                             > GET_MODE_SIZE (GET_MODE (z))))
2975                       {
2976                         /* This can occur as a result in invalid
2977                            pointer casts, e.g. float f; ... 
2978                            *(long long int *)&f.
2979                            ??? We could emit a warning here, but
2980                            without a line number that wouldn't be
2981                            very helpful.  */
2982                         z = gen_rtx_SUBREG (GET_MODE (x), z, 0);
2983                       }
2984                     else
2985                       z = gen_lowpart (GET_MODE (x), z);
2986
2987                     *loc = z;
2988                     return true;
2989                   }
2990
2991               /* Sometimes we may not be able to find the replacement.  For
2992                  example when the original insn was a MEM in a wider mode,
2993                  and the note is part of a sign extension of a narrowed
2994                  version of that MEM.  Gcc testcase compile/990829-1.c can
2995                  generate an example of this siutation.  Rather than complain
2996                  we return false, which will prompt our caller to remove the
2997                  offending note.  */
2998               return false;
2999             }
3000
3001           size_x = GET_MODE_BITSIZE (GET_MODE (x));
3002           size_sub = GET_MODE_BITSIZE (GET_MODE (sub));
3003
3004           /* Don't even consider working with paradoxical subregs,
3005              or the moral equivalent seen here.  */
3006           if (size_x <= size_sub
3007               && int_mode_for_mode (GET_MODE (sub)) != BLKmode)
3008             {
3009               /* Do a bitfield insertion to mirror what would happen
3010                  in memory.  */
3011
3012               rtx val, seq;
3013
3014               if (store)
3015                 {
3016                   rtx p = PREV_INSN (insn);
3017
3018                   start_sequence ();
3019                   val = gen_reg_rtx (GET_MODE (x));
3020                   if (! validate_change (insn, loc, val, 0))
3021                     {
3022                       /* Discard the current sequence and put the
3023                          ADDRESSOF on stack.  */
3024                       end_sequence ();
3025                       goto give_up;
3026                     }
3027                   seq = gen_sequence ();
3028                   end_sequence ();
3029                   emit_insn_before (seq, insn);
3030                   compute_insns_for_mem (p ? NEXT_INSN (p) : get_insns (), 
3031                                          insn, ht);
3032               
3033                   start_sequence ();
3034                   store_bit_field (sub, size_x, 0, GET_MODE (x),
3035                                    val, GET_MODE_SIZE (GET_MODE (sub)),
3036                                    GET_MODE_ALIGNMENT (GET_MODE (sub)));
3037
3038                   /* Make sure to unshare any shared rtl that store_bit_field
3039                      might have created.  */
3040                   unshare_all_rtl_again (get_insns ());
3041
3042                   seq = gen_sequence ();
3043                   end_sequence ();
3044                   p = emit_insn_after (seq, insn);
3045                   if (NEXT_INSN (insn))
3046                     compute_insns_for_mem (NEXT_INSN (insn), 
3047                                            p ? NEXT_INSN (p) : NULL_RTX,
3048                                            ht);
3049                 }
3050               else
3051                 {
3052                   rtx p = PREV_INSN (insn);
3053
3054                   start_sequence ();
3055                   val = extract_bit_field (sub, size_x, 0, 1, NULL_RTX,
3056                                            GET_MODE (x), GET_MODE (x),
3057                                            GET_MODE_SIZE (GET_MODE (sub)),
3058                                            GET_MODE_SIZE (GET_MODE (sub)));
3059
3060                   if (! validate_change (insn, loc, val, 0))
3061                     {
3062                       /* Discard the current sequence and put the
3063                          ADDRESSOF on stack.  */
3064                       end_sequence ();
3065                       goto give_up;
3066                     }
3067
3068                   seq = gen_sequence ();
3069                   end_sequence ();
3070                   emit_insn_before (seq, insn);
3071                   compute_insns_for_mem (p ? NEXT_INSN (p) : get_insns (),
3072                                          insn, ht);
3073                 }
3074
3075               /* Remember the replacement so that the same one can be done
3076                  on the REG_NOTES.  */
3077               purge_bitfield_addressof_replacements
3078                 = gen_rtx_EXPR_LIST (VOIDmode, x,
3079                                      gen_rtx_EXPR_LIST
3080                                      (VOIDmode, val,
3081                                       purge_bitfield_addressof_replacements));
3082
3083               /* We replaced with a reg -- all done.  */
3084               return true;
3085             }
3086         }
3087
3088       else if (validate_change (insn, loc, sub, 0))
3089         {
3090           /* Remember the replacement so that the same one can be done
3091              on the REG_NOTES.  */
3092           if (GET_CODE (sub) == REG || GET_CODE (sub) == SUBREG)
3093             {
3094               rtx tem;
3095
3096               for (tem = purge_addressof_replacements;
3097                    tem != NULL_RTX;
3098                    tem = XEXP (XEXP (tem, 1), 1))
3099                 if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0)))
3100                   {
3101                     XEXP (XEXP (tem, 1), 0) = sub;
3102                     return true;
3103                   }
3104               purge_addressof_replacements
3105                 = gen_rtx (EXPR_LIST, VOIDmode, XEXP (x, 0),
3106                            gen_rtx_EXPR_LIST (VOIDmode, sub,
3107                                               purge_addressof_replacements));
3108               return true;
3109             }
3110           goto restart;
3111         }
3112     give_up:;
3113       /* else give up and put it into the stack */
3114     }
3115
3116   else if (code == ADDRESSOF)
3117     {
3118       put_addressof_into_stack (x, ht);
3119       return true;
3120     }
3121   else if (code == SET)
3122     {
3123       result = purge_addressof_1 (&SET_DEST (x), insn, force, 1, ht);
3124       result &= purge_addressof_1 (&SET_SRC (x), insn, force, 0, ht);
3125       return result;
3126     }
3127
3128   /* Scan all subexpressions. */
3129   fmt = GET_RTX_FORMAT (code);
3130   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
3131     {
3132       if (*fmt == 'e')
3133         result &= purge_addressof_1 (&XEXP (x, i), insn, force, 0, ht);
3134       else if (*fmt == 'E')
3135         for (j = 0; j < XVECLEN (x, i); j++)
3136           result &= purge_addressof_1 (&XVECEXP (x, i, j), insn, force, 0, ht);
3137     }
3138
3139   return result;
3140 }
3141
3142 /* Return a new hash table entry in HT.  */
3143
3144 static struct hash_entry *
3145 insns_for_mem_newfunc (he, ht, k)
3146      struct hash_entry *he;
3147      struct hash_table *ht;
3148      hash_table_key k ATTRIBUTE_UNUSED;
3149 {
3150   struct insns_for_mem_entry *ifmhe;
3151   if (he)
3152     return he;
3153
3154   ifmhe = ((struct insns_for_mem_entry *)
3155            hash_allocate (ht, sizeof (struct insns_for_mem_entry)));
3156   ifmhe->insns = NULL_RTX;
3157
3158   return &ifmhe->he;
3159 }
3160
3161 /* Return a hash value for K, a REG.  */
3162
3163 static unsigned long
3164 insns_for_mem_hash (k)
3165      hash_table_key k;
3166 {
3167   /* K is really a RTX.  Just use the address as the hash value.  */
3168   return (unsigned long) k;
3169 }
3170
3171 /* Return non-zero if K1 and K2 (two REGs) are the same.  */
3172
3173 static boolean
3174 insns_for_mem_comp (k1, k2)
3175      hash_table_key k1;
3176      hash_table_key k2;
3177 {
3178   return k1 == k2;
3179 }
3180
3181 struct insns_for_mem_walk_info {
3182   /* The hash table that we are using to record which INSNs use which
3183      MEMs.  */
3184   struct hash_table *ht;
3185
3186   /* The INSN we are currently proessing.  */
3187   rtx insn;
3188
3189   /* Zero if we are walking to find ADDRESSOFs, one if we are walking
3190      to find the insns that use the REGs in the ADDRESSOFs.  */
3191   int pass;
3192 };
3193
3194 /* Called from compute_insns_for_mem via for_each_rtx.  If R is a REG
3195    that might be used in an ADDRESSOF expression, record this INSN in
3196    the hash table given by DATA (which is really a pointer to an
3197    insns_for_mem_walk_info structure).  */
3198
3199 static int
3200 insns_for_mem_walk (r, data)
3201      rtx *r;
3202      void *data;
3203 {
3204   struct insns_for_mem_walk_info *ifmwi 
3205     = (struct insns_for_mem_walk_info *) data;
3206
3207   if (ifmwi->pass == 0 && *r && GET_CODE (*r) == ADDRESSOF
3208       && GET_CODE (XEXP (*r, 0)) == REG)
3209     hash_lookup (ifmwi->ht, XEXP (*r, 0), /*create=*/1, /*copy=*/0);
3210   else if (ifmwi->pass == 1 && *r && GET_CODE (*r) == REG)
3211     {
3212       /* Lookup this MEM in the hashtable, creating it if necessary.  */
3213       struct insns_for_mem_entry *ifme 
3214         = (struct insns_for_mem_entry *) hash_lookup (ifmwi->ht,
3215                                                       *r,
3216                                                       /*create=*/0,
3217                                                       /*copy=*/0);
3218
3219       /* If we have not already recorded this INSN, do so now.  Since
3220          we process the INSNs in order, we know that if we have
3221          recorded it it must be at the front of the list.  */
3222       if (ifme && (!ifme->insns || XEXP (ifme->insns, 0) != ifmwi->insn))
3223         {
3224           /* We do the allocation on the same obstack as is used for
3225              the hash table since this memory will not be used once
3226              the hash table is deallocated.  */
3227           push_obstacks (&ifmwi->ht->memory, &ifmwi->ht->memory);
3228           ifme->insns = gen_rtx_EXPR_LIST (VOIDmode, ifmwi->insn, 
3229                                            ifme->insns);
3230           pop_obstacks ();
3231         }
3232     }
3233
3234   return 0;
3235 }
3236
3237 /* Walk the INSNS, until we reach LAST_INSN, recording which INSNs use
3238    which REGs in HT.  */
3239
3240 static void
3241 compute_insns_for_mem (insns, last_insn, ht)
3242      rtx insns;
3243      rtx last_insn;
3244      struct hash_table *ht;
3245 {
3246   rtx insn;
3247   struct insns_for_mem_walk_info ifmwi;
3248   ifmwi.ht = ht;
3249
3250   for (ifmwi.pass = 0; ifmwi.pass < 2; ++ifmwi.pass)
3251     for (insn = insns; insn != last_insn; insn = NEXT_INSN (insn))
3252       if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
3253         {
3254           ifmwi.insn = insn;
3255           for_each_rtx (&insn, insns_for_mem_walk, &ifmwi);
3256         }
3257 }
3258
3259 /* Helper function for purge_addressof called through for_each_rtx.
3260    Returns true iff the rtl is an ADDRESSOF.  */
3261 static int
3262 is_addressof (rtl, data)
3263      rtx * rtl;
3264      void * data ATTRIBUTE_UNUSED;
3265 {
3266   return GET_CODE (* rtl) == ADDRESSOF;
3267 }
3268
3269 /* Eliminate all occurrences of ADDRESSOF from INSNS.  Elide any remaining
3270    (MEM (ADDRESSOF)) patterns, and force any needed registers into the
3271    stack.  */
3272
3273 void
3274 purge_addressof (insns)
3275      rtx insns;
3276 {
3277   rtx insn;
3278   struct hash_table ht;
3279   
3280   /* When we actually purge ADDRESSOFs, we turn REGs into MEMs.  That
3281      requires a fixup pass over the instruction stream to correct
3282      INSNs that depended on the REG being a REG, and not a MEM.  But,
3283      these fixup passes are slow.  Furthermore, most MEMs are not
3284      mentioned in very many instructions.  So, we speed up the process
3285      by pre-calculating which REGs occur in which INSNs; that allows
3286      us to perform the fixup passes much more quickly.  */
3287   hash_table_init (&ht, 
3288                    insns_for_mem_newfunc,
3289                    insns_for_mem_hash,
3290                    insns_for_mem_comp);
3291   compute_insns_for_mem (insns, NULL_RTX, &ht);
3292
3293   for (insn = insns; insn; insn = NEXT_INSN (insn))
3294     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
3295         || GET_CODE (insn) == CALL_INSN)
3296       {
3297         if (! purge_addressof_1 (&PATTERN (insn), insn,
3298                                  asm_noperands (PATTERN (insn)) > 0, 0, &ht))
3299           /* If we could not replace the ADDRESSOFs in the insn,
3300              something is wrong.  */
3301           abort ();
3302         
3303         if (! purge_addressof_1 (&REG_NOTES (insn), NULL_RTX, 0, 0, &ht))
3304           {
3305             /* If we could not replace the ADDRESSOFs in the insn's notes,
3306                we can just remove the offending notes instead.  */
3307             rtx note;
3308
3309             for (note = REG_NOTES (insn); note; note = XEXP (note, 1))
3310               {
3311                 /* If we find a REG_RETVAL note then the insn is a libcall.
3312                    Such insns must have REG_EQUAL notes as well, in order
3313                    for later passes of the compiler to work.  So it is not
3314                    safe to delete the notes here, and instead we abort.  */
3315                 if (REG_NOTE_KIND (note) == REG_RETVAL)
3316                   abort ();
3317                 if (for_each_rtx (& note, is_addressof, NULL))
3318                   remove_note (insn, note);
3319               }
3320           }
3321       }
3322
3323   /* Clean up.  */
3324   hash_table_free (&ht);
3325   purge_bitfield_addressof_replacements = 0;
3326   purge_addressof_replacements = 0;
3327
3328   /* REGs are shared.  purge_addressof will destructively replace a REG
3329      with a MEM, which creates shared MEMs.
3330
3331      Unfortunately, the children of put_reg_into_stack assume that MEMs
3332      referring to the same stack slot are shared (fixup_var_refs and
3333      the associated hash table code).
3334
3335      So, we have to do another unsharing pass after we have flushed any
3336      REGs that had their address taken into the stack.
3337
3338      It may be worth tracking whether or not we converted any REGs into
3339      MEMs to avoid this overhead when it is not needed.  */
3340   unshare_all_rtl_again (get_insns ());
3341 }
3342 \f
3343 /* Pass through the INSNS of function FNDECL and convert virtual register
3344    references to hard register references.  */
3345
3346 void
3347 instantiate_virtual_regs (fndecl, insns)
3348      tree fndecl;
3349      rtx insns;
3350 {
3351   rtx insn;
3352   unsigned int i;
3353
3354   /* Compute the offsets to use for this function.  */
3355   in_arg_offset = FIRST_PARM_OFFSET (fndecl);
3356   var_offset = STARTING_FRAME_OFFSET;
3357   dynamic_offset = STACK_DYNAMIC_OFFSET (fndecl);
3358   out_arg_offset = STACK_POINTER_OFFSET;
3359   cfa_offset = ARG_POINTER_CFA_OFFSET (fndecl);
3360
3361   /* Scan all variables and parameters of this function.  For each that is
3362      in memory, instantiate all virtual registers if the result is a valid
3363      address.  If not, we do it later.  That will handle most uses of virtual
3364      regs on many machines.  */
3365   instantiate_decls (fndecl, 1);
3366
3367   /* Initialize recognition, indicating that volatile is OK.  */
3368   init_recog ();
3369
3370   /* Scan through all the insns, instantiating every virtual register still
3371      present.  */
3372   for (insn = insns; insn; insn = NEXT_INSN (insn))
3373     if (GET_CODE (insn) == INSN || GET_CODE (insn) == JUMP_INSN
3374         || GET_CODE (insn) == CALL_INSN)
3375       {
3376         instantiate_virtual_regs_1 (&PATTERN (insn), insn, 1);
3377         instantiate_virtual_regs_1 (&REG_NOTES (insn), NULL_RTX, 0);
3378       }
3379
3380   /* Instantiate the stack slots for the parm registers, for later use in
3381      addressof elimination.  */
3382   for (i = 0; i < max_parm_reg; ++i)
3383     if (parm_reg_stack_loc[i])
3384       instantiate_virtual_regs_1 (&parm_reg_stack_loc[i], NULL_RTX, 0);
3385
3386   /* Now instantiate the remaining register equivalences for debugging info.
3387      These will not be valid addresses.  */
3388   instantiate_decls (fndecl, 0);
3389
3390   /* Indicate that, from now on, assign_stack_local should use
3391      frame_pointer_rtx.  */
3392   virtuals_instantiated = 1;
3393 }
3394
3395 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
3396    all virtual registers in their DECL_RTL's.
3397
3398    If VALID_ONLY, do this only if the resulting address is still valid.
3399    Otherwise, always do it.  */
3400
3401 static void
3402 instantiate_decls (fndecl, valid_only)
3403      tree fndecl;
3404      int valid_only;
3405 {
3406   tree decl;
3407
3408   if (DECL_SAVED_INSNS (fndecl))
3409     /* When compiling an inline function, the obstack used for
3410        rtl allocation is the maybepermanent_obstack.  Calling
3411        `resume_temporary_allocation' switches us back to that
3412        obstack while we process this function's parameters.  */
3413     resume_temporary_allocation ();
3414
3415   /* Process all parameters of the function.  */
3416   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
3417     {
3418       HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
3419
3420       instantiate_decl (DECL_RTL (decl), size, valid_only);     
3421
3422       /* If the parameter was promoted, then the incoming RTL mode may be
3423          larger than the declared type size.  We must use the larger of
3424          the two sizes.  */
3425       size = MAX (GET_MODE_SIZE (GET_MODE (DECL_INCOMING_RTL (decl))), size);
3426       instantiate_decl (DECL_INCOMING_RTL (decl), size, valid_only);
3427     }
3428
3429   /* Now process all variables defined in the function or its subblocks.  */
3430   instantiate_decls_1 (DECL_INITIAL (fndecl), valid_only);
3431
3432   if (DECL_INLINE (fndecl) || DECL_DEFER_OUTPUT (fndecl))
3433     {
3434       /* Save all rtl allocated for this function by raising the
3435          high-water mark on the maybepermanent_obstack.  */
3436       preserve_data ();
3437       /* All further rtl allocation is now done in the current_obstack.  */
3438       rtl_in_current_obstack ();
3439     }
3440 }
3441
3442 /* Subroutine of instantiate_decls: Process all decls in the given
3443    BLOCK node and all its subblocks.  */
3444
3445 static void
3446 instantiate_decls_1 (let, valid_only)
3447      tree let;
3448      int valid_only;
3449 {
3450   tree t;
3451
3452   for (t = BLOCK_VARS (let); t; t = TREE_CHAIN (t))
3453     instantiate_decl (DECL_RTL (t), int_size_in_bytes (TREE_TYPE (t)),
3454                       valid_only);
3455
3456   /* Process all subblocks.  */
3457   for (t = BLOCK_SUBBLOCKS (let); t; t = TREE_CHAIN (t))
3458     instantiate_decls_1 (t, valid_only);
3459 }
3460
3461 /* Subroutine of the preceding procedures: Given RTL representing a
3462    decl and the size of the object, do any instantiation required.
3463
3464    If VALID_ONLY is non-zero, it means that the RTL should only be
3465    changed if the new address is valid.  */
3466
3467 static void
3468 instantiate_decl (x, size, valid_only)
3469      rtx x;
3470      HOST_WIDE_INT size;
3471      int valid_only;
3472 {
3473   enum machine_mode mode;
3474   rtx addr;
3475
3476   /* If this is not a MEM, no need to do anything.  Similarly if the
3477      address is a constant or a register that is not a virtual register.  */
3478
3479   if (x == 0 || GET_CODE (x) != MEM)
3480     return;
3481
3482   addr = XEXP (x, 0);
3483   if (CONSTANT_P (addr)
3484       || (GET_CODE (addr) == ADDRESSOF && GET_CODE (XEXP (addr, 0)) == REG)
3485       || (GET_CODE (addr) == REG
3486           && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
3487               || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
3488     return;
3489
3490   /* If we should only do this if the address is valid, copy the address.
3491      We need to do this so we can undo any changes that might make the
3492      address invalid.  This copy is unfortunate, but probably can't be
3493      avoided.  */
3494
3495   if (valid_only)
3496     addr = copy_rtx (addr);
3497
3498   instantiate_virtual_regs_1 (&addr, NULL_RTX, 0);
3499
3500   if (valid_only && size >= 0)
3501     {
3502       unsigned HOST_WIDE_INT decl_size = size;
3503
3504       /* Now verify that the resulting address is valid for every integer or
3505          floating-point mode up to and including SIZE bytes long.  We do this
3506          since the object might be accessed in any mode and frame addresses
3507          are shared.  */
3508
3509       for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
3510            mode != VOIDmode && GET_MODE_SIZE (mode) <= decl_size;
3511            mode = GET_MODE_WIDER_MODE (mode))
3512         if (! memory_address_p (mode, addr))
3513           return;
3514
3515       for (mode = GET_CLASS_NARROWEST_MODE (MODE_FLOAT);
3516            mode != VOIDmode && GET_MODE_SIZE (mode) <= decl_size;
3517            mode = GET_MODE_WIDER_MODE (mode))
3518         if (! memory_address_p (mode, addr))
3519           return;
3520     }
3521
3522   /* Put back the address now that we have updated it and we either know
3523      it is valid or we don't care whether it is valid.  */
3524
3525   XEXP (x, 0) = addr;
3526 }
3527 \f
3528 /* Given a pointer to a piece of rtx and an optional pointer to the
3529    containing object, instantiate any virtual registers present in it.
3530
3531    If EXTRA_INSNS, we always do the replacement and generate
3532    any extra insns before OBJECT.  If it zero, we do nothing if replacement
3533    is not valid.
3534
3535    Return 1 if we either had nothing to do or if we were able to do the
3536    needed replacement.  Return 0 otherwise; we only return zero if 
3537    EXTRA_INSNS is zero.
3538
3539    We first try some simple transformations to avoid the creation of extra
3540    pseudos.  */
3541
3542 static int
3543 instantiate_virtual_regs_1 (loc, object, extra_insns)
3544      rtx *loc;
3545      rtx object;
3546      int extra_insns;
3547 {
3548   rtx x;
3549   RTX_CODE code;
3550   rtx new = 0;
3551   HOST_WIDE_INT offset = 0;
3552   rtx temp;
3553   rtx seq;
3554   int i, j;
3555   const char *fmt;
3556
3557   /* Re-start here to avoid recursion in common cases.  */
3558  restart:
3559
3560   x = *loc;
3561   if (x == 0)
3562     return 1;
3563
3564   code = GET_CODE (x);
3565
3566   /* Check for some special cases.  */
3567   switch (code)
3568     {
3569     case CONST_INT:
3570     case CONST_DOUBLE:
3571     case CONST:
3572     case SYMBOL_REF:
3573     case CODE_LABEL:
3574     case PC:
3575     case CC0:
3576     case ASM_INPUT:
3577     case ADDR_VEC:
3578     case ADDR_DIFF_VEC:
3579     case RETURN:
3580       return 1;
3581
3582     case SET:
3583       /* We are allowed to set the virtual registers.  This means that
3584          the actual register should receive the source minus the
3585          appropriate offset.  This is used, for example, in the handling
3586          of non-local gotos.  */
3587       if (SET_DEST (x) == virtual_incoming_args_rtx)
3588         new = arg_pointer_rtx, offset = - in_arg_offset;
3589       else if (SET_DEST (x) == virtual_stack_vars_rtx)
3590         new = frame_pointer_rtx, offset = - var_offset;
3591       else if (SET_DEST (x) == virtual_stack_dynamic_rtx)
3592         new = stack_pointer_rtx, offset = - dynamic_offset;
3593       else if (SET_DEST (x) == virtual_outgoing_args_rtx)
3594         new = stack_pointer_rtx, offset = - out_arg_offset;
3595       else if (SET_DEST (x) == virtual_cfa_rtx)
3596         new = arg_pointer_rtx, offset = - cfa_offset;
3597
3598       if (new)
3599         {
3600           rtx src = SET_SRC (x);
3601
3602           instantiate_virtual_regs_1 (&src, NULL_RTX, 0);
3603
3604           /* The only valid sources here are PLUS or REG.  Just do
3605              the simplest possible thing to handle them.  */
3606           if (GET_CODE (src) != REG && GET_CODE (src) != PLUS)
3607             abort ();
3608
3609           start_sequence ();
3610           if (GET_CODE (src) != REG)
3611             temp = force_operand (src, NULL_RTX);
3612           else
3613             temp = src;
3614           temp = force_operand (plus_constant (temp, offset), NULL_RTX);
3615           seq = get_insns ();
3616           end_sequence ();
3617
3618           emit_insns_before (seq, object);
3619           SET_DEST (x) = new;
3620
3621           if (! validate_change (object, &SET_SRC (x), temp, 0)
3622               || ! extra_insns)
3623             abort ();
3624
3625           return 1;
3626         }
3627
3628       instantiate_virtual_regs_1 (&SET_DEST (x), object, extra_insns);
3629       loc = &SET_SRC (x);
3630       goto restart;
3631
3632     case PLUS:
3633       /* Handle special case of virtual register plus constant.  */
3634       if (CONSTANT_P (XEXP (x, 1)))
3635         {
3636           rtx old, new_offset;
3637
3638           /* Check for (plus (plus VIRT foo) (const_int)) first.  */
3639           if (GET_CODE (XEXP (x, 0)) == PLUS)
3640             {
3641               rtx inner = XEXP (XEXP (x, 0), 0);
3642
3643               if (inner == virtual_incoming_args_rtx)
3644                 new = arg_pointer_rtx, offset = in_arg_offset;
3645               else if (inner == virtual_stack_vars_rtx)
3646                 new = frame_pointer_rtx, offset = var_offset;
3647               else if (inner == virtual_stack_dynamic_rtx)
3648                 new = stack_pointer_rtx, offset = dynamic_offset;
3649               else if (inner == virtual_outgoing_args_rtx)
3650                 new = stack_pointer_rtx, offset = out_arg_offset;
3651               else if (inner == virtual_cfa_rtx)
3652                 new = arg_pointer_rtx, offset = cfa_offset;
3653               else
3654                 {
3655                   loc = &XEXP (x, 0);
3656                   goto restart;
3657                 }
3658
3659               instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 1), object,
3660                                           extra_insns);
3661               new = gen_rtx_PLUS (Pmode, new, XEXP (XEXP (x, 0), 1));
3662             }
3663
3664           else if (XEXP (x, 0) == virtual_incoming_args_rtx)
3665             new = arg_pointer_rtx, offset = in_arg_offset;
3666           else if (XEXP (x, 0) == virtual_stack_vars_rtx)
3667             new = frame_pointer_rtx, offset = var_offset;
3668           else if (XEXP (x, 0) == virtual_stack_dynamic_rtx)
3669             new = stack_pointer_rtx, offset = dynamic_offset;
3670           else if (XEXP (x, 0) == virtual_outgoing_args_rtx)
3671             new = stack_pointer_rtx, offset = out_arg_offset;
3672           else if (XEXP (x, 0) == virtual_cfa_rtx)
3673             new = arg_pointer_rtx, offset = cfa_offset;
3674           else
3675             {
3676               /* We know the second operand is a constant.  Unless the
3677                  first operand is a REG (which has been already checked),
3678                  it needs to be checked.  */
3679               if (GET_CODE (XEXP (x, 0)) != REG)
3680                 {
3681                   loc = &XEXP (x, 0);
3682                   goto restart;
3683                 }
3684               return 1;
3685             }
3686
3687           new_offset = plus_constant (XEXP (x, 1), offset);
3688
3689           /* If the new constant is zero, try to replace the sum with just
3690              the register.  */
3691           if (new_offset == const0_rtx
3692               && validate_change (object, loc, new, 0))
3693             return 1;
3694
3695           /* Next try to replace the register and new offset.
3696              There are two changes to validate here and we can't assume that
3697              in the case of old offset equals new just changing the register
3698              will yield a valid insn.  In the interests of a little efficiency,
3699              however, we only call validate change once (we don't queue up the
3700              changes and then call apply_change_group).  */
3701
3702           old = XEXP (x, 0);
3703           if (offset == 0
3704               ? ! validate_change (object, &XEXP (x, 0), new, 0)
3705               : (XEXP (x, 0) = new,
3706                  ! validate_change (object, &XEXP (x, 1), new_offset, 0)))
3707             {
3708               if (! extra_insns)
3709                 {
3710                   XEXP (x, 0) = old;
3711                   return 0;
3712                 }
3713
3714               /* Otherwise copy the new constant into a register and replace
3715                  constant with that register.  */
3716               temp = gen_reg_rtx (Pmode);
3717               XEXP (x, 0) = new;
3718               if (validate_change (object, &XEXP (x, 1), temp, 0))
3719                 emit_insn_before (gen_move_insn (temp, new_offset), object);
3720               else
3721                 {
3722                   /* If that didn't work, replace this expression with a
3723                      register containing the sum.  */
3724
3725                   XEXP (x, 0) = old;
3726                   new = gen_rtx_PLUS (Pmode, new, new_offset);
3727
3728                   start_sequence ();
3729                   temp = force_operand (new, NULL_RTX);
3730                   seq = get_insns ();
3731                   end_sequence ();
3732
3733                   emit_insns_before (seq, object);
3734                   if (! validate_change (object, loc, temp, 0)
3735                       && ! validate_replace_rtx (x, temp, object))
3736                     abort ();
3737                 }
3738             }
3739
3740           return 1;
3741         }
3742
3743       /* Fall through to generic two-operand expression case.  */
3744     case EXPR_LIST:
3745     case CALL:
3746     case COMPARE:
3747     case MINUS:
3748     case MULT:
3749     case DIV:      case UDIV:
3750     case MOD:      case UMOD:
3751     case AND:      case IOR:      case XOR:
3752     case ROTATERT: case ROTATE:
3753     case ASHIFTRT: case LSHIFTRT: case ASHIFT:
3754     case NE:       case EQ:
3755     case GE:       case GT:       case GEU:    case GTU:
3756     case LE:       case LT:       case LEU:    case LTU:
3757       if (XEXP (x, 1) && ! CONSTANT_P (XEXP (x, 1)))
3758         instantiate_virtual_regs_1 (&XEXP (x, 1), object, extra_insns);
3759       loc = &XEXP (x, 0);
3760       goto restart;
3761
3762     case MEM:
3763       /* Most cases of MEM that convert to valid addresses have already been
3764          handled by our scan of decls.  The only special handling we
3765          need here is to make a copy of the rtx to ensure it isn't being
3766          shared if we have to change it to a pseudo. 
3767
3768          If the rtx is a simple reference to an address via a virtual register,
3769          it can potentially be shared.  In such cases, first try to make it
3770          a valid address, which can also be shared.  Otherwise, copy it and
3771          proceed normally. 
3772
3773          First check for common cases that need no processing.  These are
3774          usually due to instantiation already being done on a previous instance
3775          of a shared rtx.  */
3776
3777       temp = XEXP (x, 0);
3778       if (CONSTANT_ADDRESS_P (temp)
3779 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3780           || temp == arg_pointer_rtx
3781 #endif
3782 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
3783           || temp == hard_frame_pointer_rtx
3784 #endif
3785           || temp == frame_pointer_rtx)
3786         return 1;
3787
3788       if (GET_CODE (temp) == PLUS
3789           && CONSTANT_ADDRESS_P (XEXP (temp, 1))
3790           && (XEXP (temp, 0) == frame_pointer_rtx
3791 #if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
3792               || XEXP (temp, 0) == hard_frame_pointer_rtx
3793 #endif
3794 #if FRAME_POINTER_REGNUM != ARG_POINTER_REGNUM
3795               || XEXP (temp, 0) == arg_pointer_rtx
3796 #endif
3797               ))
3798         return 1;
3799
3800       if (temp == virtual_stack_vars_rtx
3801           || temp == virtual_incoming_args_rtx
3802           || (GET_CODE (temp) == PLUS
3803               && CONSTANT_ADDRESS_P (XEXP (temp, 1))
3804               && (XEXP (temp, 0) == virtual_stack_vars_rtx
3805                   || XEXP (temp, 0) == virtual_incoming_args_rtx)))
3806         {
3807           /* This MEM may be shared.  If the substitution can be done without
3808              the need to generate new pseudos, we want to do it in place
3809              so all copies of the shared rtx benefit.  The call below will
3810              only make substitutions if the resulting address is still
3811              valid.
3812
3813              Note that we cannot pass X as the object in the recursive call
3814              since the insn being processed may not allow all valid
3815              addresses.  However, if we were not passed on object, we can
3816              only modify X without copying it if X will have a valid
3817              address.
3818
3819              ??? Also note that this can still lose if OBJECT is an insn that
3820              has less restrictions on an address that some other insn.
3821              In that case, we will modify the shared address.  This case
3822              doesn't seem very likely, though.  One case where this could
3823              happen is in the case of a USE or CLOBBER reference, but we
3824              take care of that below.  */
3825
3826           if (instantiate_virtual_regs_1 (&XEXP (x, 0),
3827                                           object ? object : x, 0))
3828             return 1;
3829
3830           /* Otherwise make a copy and process that copy.  We copy the entire
3831              RTL expression since it might be a PLUS which could also be
3832              shared.  */
3833           *loc = x = copy_rtx (x);
3834         }
3835
3836       /* Fall through to generic unary operation case.  */
3837     case SUBREG:
3838     case STRICT_LOW_PART:
3839     case NEG:          case NOT:
3840     case PRE_DEC:      case PRE_INC:      case POST_DEC:    case POST_INC:
3841     case SIGN_EXTEND:  case ZERO_EXTEND:
3842     case TRUNCATE:     case FLOAT_EXTEND: case FLOAT_TRUNCATE:
3843     case FLOAT:        case FIX:
3844     case UNSIGNED_FIX: case UNSIGNED_FLOAT:
3845     case ABS:
3846     case SQRT:
3847     case FFS:
3848       /* These case either have just one operand or we know that we need not
3849          check the rest of the operands.  */
3850       loc = &XEXP (x, 0);
3851       goto restart;
3852
3853     case USE:
3854     case CLOBBER:
3855       /* If the operand is a MEM, see if the change is a valid MEM.  If not,
3856          go ahead and make the invalid one, but do it to a copy.  For a REG,
3857          just make the recursive call, since there's no chance of a problem. */
3858
3859       if ((GET_CODE (XEXP (x, 0)) == MEM
3860            && instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 0), XEXP (x, 0),
3861                                           0))
3862           || (GET_CODE (XEXP (x, 0)) == REG
3863               && instantiate_virtual_regs_1 (&XEXP (x, 0), object, 0)))
3864         return 1;
3865
3866       XEXP (x, 0) = copy_rtx (XEXP (x, 0));
3867       loc = &XEXP (x, 0);
3868       goto restart;
3869
3870     case REG:
3871       /* Try to replace with a PLUS.  If that doesn't work, compute the sum
3872          in front of this insn and substitute the temporary.  */
3873       if (x == virtual_incoming_args_rtx)
3874         new = arg_pointer_rtx, offset = in_arg_offset;
3875       else if (x == virtual_stack_vars_rtx)
3876         new = frame_pointer_rtx, offset = var_offset;
3877       else if (x == virtual_stack_dynamic_rtx)
3878         new = stack_pointer_rtx, offset = dynamic_offset;
3879       else if (x == virtual_outgoing_args_rtx)
3880         new = stack_pointer_rtx, offset = out_arg_offset;
3881       else if (x == virtual_cfa_rtx)
3882         new = arg_pointer_rtx, offset = cfa_offset;
3883
3884       if (new)
3885         {
3886           temp = plus_constant (new, offset);
3887           if (!validate_change (object, loc, temp, 0))
3888             {
3889               if (! extra_insns)
3890                 return 0;
3891
3892               start_sequence ();
3893               temp = force_operand (temp, NULL_RTX);
3894               seq = get_insns ();
3895               end_sequence ();
3896
3897               emit_insns_before (seq, object);
3898               if (! validate_change (object, loc, temp, 0)
3899                   && ! validate_replace_rtx (x, temp, object))
3900                 abort ();
3901             }
3902         }
3903
3904       return 1;
3905
3906     case ADDRESSOF:
3907       if (GET_CODE (XEXP (x, 0)) == REG)
3908         return 1;
3909
3910       else if (GET_CODE (XEXP (x, 0)) == MEM)
3911         {
3912           /* If we have a (addressof (mem ..)), do any instantiation inside
3913              since we know we'll be making the inside valid when we finally
3914              remove the ADDRESSOF.  */
3915           instantiate_virtual_regs_1 (&XEXP (XEXP (x, 0), 0), NULL_RTX, 0);
3916           return 1;
3917         }
3918       break;
3919       
3920     default:
3921       break;
3922     }
3923
3924   /* Scan all subexpressions.  */
3925   fmt = GET_RTX_FORMAT (code);
3926   for (i = 0; i < GET_RTX_LENGTH (code); i++, fmt++)
3927     if (*fmt == 'e')
3928       {
3929         if (!instantiate_virtual_regs_1 (&XEXP (x, i), object, extra_insns))
3930           return 0;
3931       }
3932     else if (*fmt == 'E')
3933       for (j = 0; j < XVECLEN (x, i); j++)
3934         if (! instantiate_virtual_regs_1 (&XVECEXP (x, i, j), object,
3935                                           extra_insns))
3936           return 0;
3937
3938   return 1;
3939 }
3940 \f
3941 /* Optimization: assuming this function does not receive nonlocal gotos,
3942    delete the handlers for such, as well as the insns to establish
3943    and disestablish them.  */
3944
3945 static void
3946 delete_handlers ()
3947 {
3948   rtx insn;
3949   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3950     {
3951       /* Delete the handler by turning off the flag that would
3952          prevent jump_optimize from deleting it.
3953          Also permit deletion of the nonlocal labels themselves
3954          if nothing local refers to them.  */
3955       if (GET_CODE (insn) == CODE_LABEL)
3956         {
3957           tree t, last_t;
3958
3959           LABEL_PRESERVE_P (insn) = 0;
3960
3961           /* Remove it from the nonlocal_label list, to avoid confusing
3962              flow.  */
3963           for (t = nonlocal_labels, last_t = 0; t;
3964                last_t = t, t = TREE_CHAIN (t))
3965             if (DECL_RTL (TREE_VALUE (t)) == insn)
3966               break;
3967           if (t)
3968             {
3969               if (! last_t)
3970                 nonlocal_labels = TREE_CHAIN (nonlocal_labels);
3971               else
3972                 TREE_CHAIN (last_t) = TREE_CHAIN (t);
3973             }
3974         }
3975       if (GET_CODE (insn) == INSN)
3976         {
3977           int can_delete = 0;
3978           rtx t;
3979           for (t = nonlocal_goto_handler_slots; t != 0; t = XEXP (t, 1))
3980             if (reg_mentioned_p (t, PATTERN (insn)))
3981               {
3982                 can_delete = 1;
3983                 break;
3984               }
3985           if (can_delete
3986               || (nonlocal_goto_stack_level != 0
3987                   && reg_mentioned_p (nonlocal_goto_stack_level,
3988                                       PATTERN (insn))))
3989             delete_insn (insn);
3990         }
3991     }
3992 }
3993 \f
3994 int
3995 max_parm_reg_num ()
3996 {
3997   return max_parm_reg;
3998 }
3999
4000 /* Return the first insn following those generated by `assign_parms'.  */
4001
4002 rtx
4003 get_first_nonparm_insn ()
4004 {
4005   if (last_parm_insn)
4006     return NEXT_INSN (last_parm_insn);
4007   return get_insns ();
4008 }
4009
4010 /* Return the first NOTE_INSN_BLOCK_BEG note in the function.
4011    Crash if there is none.  */
4012
4013 rtx
4014 get_first_block_beg ()
4015 {
4016   register rtx searcher;
4017   register rtx insn = get_first_nonparm_insn ();
4018
4019   for (searcher = insn; searcher; searcher = NEXT_INSN (searcher))
4020     if (GET_CODE (searcher) == NOTE
4021         && NOTE_LINE_NUMBER (searcher) == NOTE_INSN_BLOCK_BEG)
4022       return searcher;
4023
4024   abort ();     /* Invalid call to this function.  (See comments above.)  */
4025   return NULL_RTX;
4026 }
4027
4028 /* Return 1 if EXP is an aggregate type (or a value with aggregate type).
4029    This means a type for which function calls must pass an address to the
4030    function or get an address back from the function.
4031    EXP may be a type node or an expression (whose type is tested).  */
4032
4033 int
4034 aggregate_value_p (exp)
4035      tree exp;
4036 {
4037   int i, regno, nregs;
4038   rtx reg;
4039
4040   tree type = (TYPE_P (exp)) ? exp : TREE_TYPE (exp);
4041
4042   if (TREE_CODE (type) == VOID_TYPE)
4043     return 0;
4044   if (RETURN_IN_MEMORY (type))
4045     return 1;
4046   /* Types that are TREE_ADDRESSABLE must be constructed in memory,
4047      and thus can't be returned in registers.  */
4048   if (TREE_ADDRESSABLE (type))
4049     return 1;
4050   if (flag_pcc_struct_return && AGGREGATE_TYPE_P (type))
4051     return 1;
4052   /* Make sure we have suitable call-clobbered regs to return
4053      the value in; if not, we must return it in memory.  */
4054   reg = hard_function_value (type, 0, 0);
4055
4056   /* If we have something other than a REG (e.g. a PARALLEL), then assume
4057      it is OK.  */
4058   if (GET_CODE (reg) != REG)
4059     return 0;
4060
4061   regno = REGNO (reg);
4062   nregs = HARD_REGNO_NREGS (regno, TYPE_MODE (type));
4063   for (i = 0; i < nregs; i++)
4064     if (! call_used_regs[regno + i])
4065       return 1;
4066   return 0;
4067 }
4068 \f
4069 /* Assign RTL expressions to the function's parameters.
4070    This may involve copying them into registers and using
4071    those registers as the RTL for them.  */
4072
4073 void
4074 assign_parms (fndecl)
4075      tree fndecl;
4076 {
4077   register tree parm;
4078   register rtx entry_parm = 0;
4079   register rtx stack_parm = 0;
4080   CUMULATIVE_ARGS args_so_far;
4081   enum machine_mode promoted_mode, passed_mode;
4082   enum machine_mode nominal_mode, promoted_nominal_mode;
4083   int unsignedp;
4084   /* Total space needed so far for args on the stack,
4085      given as a constant and a tree-expression.  */
4086   struct args_size stack_args_size;
4087   tree fntype = TREE_TYPE (fndecl);
4088   tree fnargs = DECL_ARGUMENTS (fndecl);
4089   /* This is used for the arg pointer when referring to stack args.  */
4090   rtx internal_arg_pointer;
4091   /* This is a dummy PARM_DECL that we used for the function result if 
4092      the function returns a structure.  */
4093   tree function_result_decl = 0;
4094 #ifdef SETUP_INCOMING_VARARGS
4095   int varargs_setup = 0;
4096 #endif
4097   rtx conversion_insns = 0;
4098   struct args_size alignment_pad;
4099
4100   /* Nonzero if the last arg is named `__builtin_va_alist',
4101      which is used on some machines for old-fashioned non-ANSI varargs.h;
4102      this should be stuck onto the stack as if it had arrived there.  */
4103   int hide_last_arg
4104     = (current_function_varargs
4105        && fnargs
4106        && (parm = tree_last (fnargs)) != 0
4107        && DECL_NAME (parm)
4108        && (! strcmp (IDENTIFIER_POINTER (DECL_NAME (parm)),
4109                      "__builtin_va_alist")));
4110
4111   /* Nonzero if function takes extra anonymous args.
4112      This means the last named arg must be on the stack
4113      right before the anonymous ones.  */
4114   int stdarg
4115     = (TYPE_ARG_TYPES (fntype) != 0
4116        && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
4117            != void_type_node));
4118
4119   current_function_stdarg = stdarg;
4120
4121   /* If the reg that the virtual arg pointer will be translated into is
4122      not a fixed reg or is the stack pointer, make a copy of the virtual
4123      arg pointer, and address parms via the copy.  The frame pointer is
4124      considered fixed even though it is not marked as such.
4125
4126      The second time through, simply use ap to avoid generating rtx.  */
4127
4128   if ((ARG_POINTER_REGNUM == STACK_POINTER_REGNUM
4129        || ! (fixed_regs[ARG_POINTER_REGNUM]
4130              || ARG_POINTER_REGNUM == FRAME_POINTER_REGNUM)))
4131     internal_arg_pointer = copy_to_reg (virtual_incoming_args_rtx);
4132   else
4133     internal_arg_pointer = virtual_incoming_args_rtx;
4134   current_function_internal_arg_pointer = internal_arg_pointer;
4135
4136   stack_args_size.constant = 0;
4137   stack_args_size.var = 0;
4138
4139   /* If struct value address is treated as the first argument, make it so.  */
4140   if (aggregate_value_p (DECL_RESULT (fndecl))
4141       && ! current_function_returns_pcc_struct
4142       && struct_value_incoming_rtx == 0)
4143     {
4144       tree type = build_pointer_type (TREE_TYPE (fntype));
4145
4146       function_result_decl = build_decl (PARM_DECL, NULL_TREE, type);
4147
4148       DECL_ARG_TYPE (function_result_decl) = type;
4149       TREE_CHAIN (function_result_decl) = fnargs;
4150       fnargs = function_result_decl;
4151     }
4152                                
4153   max_parm_reg = LAST_VIRTUAL_REGISTER + 1;
4154   parm_reg_stack_loc = (rtx *) xcalloc (max_parm_reg, sizeof (rtx));
4155
4156 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
4157   INIT_CUMULATIVE_INCOMING_ARGS (args_so_far, fntype, NULL_RTX);
4158 #else
4159   INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX, 0);
4160 #endif
4161
4162   /* We haven't yet found an argument that we must push and pretend the
4163      caller did.  */
4164   current_function_pretend_args_size = 0;
4165
4166   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
4167     {
4168       struct args_size stack_offset;
4169       struct args_size arg_size;
4170       int passed_pointer = 0;
4171       int did_conversion = 0;
4172       tree passed_type = DECL_ARG_TYPE (parm);
4173       tree nominal_type = TREE_TYPE (parm);
4174       int pretend_named;
4175
4176       /* Set LAST_NAMED if this is last named arg before some
4177          anonymous args.  */
4178       int last_named = ((TREE_CHAIN (parm) == 0
4179                          || DECL_NAME (TREE_CHAIN (parm)) == 0)
4180                         && (stdarg || current_function_varargs));
4181       /* Set NAMED_ARG if this arg should be treated as a named arg.  For
4182          most machines, if this is a varargs/stdarg function, then we treat
4183          the last named arg as if it were anonymous too.  */
4184       int named_arg = STRICT_ARGUMENT_NAMING ? 1 : ! last_named;
4185
4186       if (TREE_TYPE (parm) == error_mark_node
4187           /* This can happen after weird syntax errors
4188              or if an enum type is defined among the parms.  */
4189           || TREE_CODE (parm) != PARM_DECL
4190           || passed_type == NULL)
4191         {
4192           DECL_INCOMING_RTL (parm) = DECL_RTL (parm)
4193             = gen_rtx_MEM (BLKmode, const0_rtx);
4194           TREE_USED (parm) = 1;
4195           continue;
4196         }
4197
4198       /* For varargs.h function, save info about regs and stack space
4199          used by the individual args, not including the va_alist arg.  */
4200       if (hide_last_arg && last_named)
4201         current_function_args_info = args_so_far;
4202
4203       /* Find mode of arg as it is passed, and mode of arg
4204          as it should be during execution of this function.  */
4205       passed_mode = TYPE_MODE (passed_type);
4206       nominal_mode = TYPE_MODE (nominal_type);
4207
4208       /* If the parm's mode is VOID, its value doesn't matter,
4209          and avoid the usual things like emit_move_insn that could crash.  */
4210       if (nominal_mode == VOIDmode)
4211         {
4212           DECL_INCOMING_RTL (parm) = DECL_RTL (parm) = const0_rtx;
4213           continue;
4214         }
4215
4216       /* If the parm is to be passed as a transparent union, use the
4217          type of the first field for the tests below.  We have already
4218          verified that the modes are the same.  */
4219       if (DECL_TRANSPARENT_UNION (parm)
4220           || (TREE_CODE (passed_type) == UNION_TYPE
4221               && TYPE_TRANSPARENT_UNION (passed_type)))
4222         passed_type = TREE_TYPE (TYPE_FIELDS (passed_type));
4223
4224       /* See if this arg was passed by invisible reference.  It is if
4225          it is an object whose size depends on the contents of the
4226          object itself or if the machine requires these objects be passed
4227          that way.  */
4228
4229       if ((TREE_CODE (TYPE_SIZE (passed_type)) != INTEGER_CST
4230            && contains_placeholder_p (TYPE_SIZE (passed_type)))
4231           || TREE_ADDRESSABLE (passed_type)
4232 #ifdef FUNCTION_ARG_PASS_BY_REFERENCE
4233           || FUNCTION_ARG_PASS_BY_REFERENCE (args_so_far, passed_mode,
4234                                               passed_type, named_arg)
4235 #endif
4236           )
4237         {
4238           passed_type = nominal_type = build_pointer_type (passed_type);
4239           passed_pointer = 1;
4240           passed_mode = nominal_mode = Pmode;
4241         }
4242
4243       promoted_mode = passed_mode;
4244
4245 #ifdef PROMOTE_FUNCTION_ARGS
4246       /* Compute the mode in which the arg is actually extended to.  */
4247       unsignedp = TREE_UNSIGNED (passed_type);
4248       promoted_mode = promote_mode (passed_type, promoted_mode, &unsignedp, 1);
4249 #endif
4250
4251       /* Let machine desc say which reg (if any) the parm arrives in.
4252          0 means it arrives on the stack.  */
4253 #ifdef FUNCTION_INCOMING_ARG
4254       entry_parm = FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
4255                                           passed_type, named_arg);
4256 #else
4257       entry_parm = FUNCTION_ARG (args_so_far, promoted_mode,
4258                                  passed_type, named_arg);
4259 #endif
4260
4261       if (entry_parm == 0)
4262         promoted_mode = passed_mode;
4263
4264 #ifdef SETUP_INCOMING_VARARGS
4265       /* If this is the last named parameter, do any required setup for
4266          varargs or stdargs.  We need to know about the case of this being an
4267          addressable type, in which case we skip the registers it
4268          would have arrived in.
4269
4270          For stdargs, LAST_NAMED will be set for two parameters, the one that
4271          is actually the last named, and the dummy parameter.  We only
4272          want to do this action once.
4273
4274          Also, indicate when RTL generation is to be suppressed.  */
4275       if (last_named && !varargs_setup)
4276         {
4277           SETUP_INCOMING_VARARGS (args_so_far, promoted_mode, passed_type,
4278                                   current_function_pretend_args_size, 0);
4279           varargs_setup = 1;
4280         }
4281 #endif
4282
4283       /* Determine parm's home in the stack,
4284          in case it arrives in the stack or we should pretend it did.
4285
4286          Compute the stack position and rtx where the argument arrives
4287          and its size.
4288
4289          There is one complexity here:  If this was a parameter that would
4290          have been passed in registers, but wasn't only because it is
4291          __builtin_va_alist, we want locate_and_pad_parm to treat it as if
4292          it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
4293          In this case, we call FUNCTION_ARG with NAMED set to 1 instead of
4294          0 as it was the previous time.  */
4295
4296       pretend_named = named_arg || PRETEND_OUTGOING_VARARGS_NAMED;
4297       locate_and_pad_parm (promoted_mode, passed_type,
4298 #ifdef STACK_PARMS_IN_REG_PARM_AREA
4299                            1,
4300 #else
4301 #ifdef FUNCTION_INCOMING_ARG
4302                            FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
4303                                                   passed_type,
4304                                                   pretend_named) != 0,
4305 #else
4306                            FUNCTION_ARG (args_so_far, promoted_mode,
4307                                          passed_type,
4308                                          pretend_named) != 0,
4309 #endif
4310 #endif
4311                            fndecl, &stack_args_size, &stack_offset, &arg_size,
4312                            &alignment_pad);
4313
4314       {
4315         rtx offset_rtx = ARGS_SIZE_RTX (stack_offset);
4316
4317         if (offset_rtx == const0_rtx)
4318           stack_parm = gen_rtx_MEM (promoted_mode, internal_arg_pointer);
4319         else
4320           stack_parm = gen_rtx_MEM (promoted_mode,
4321                                     gen_rtx_PLUS (Pmode,
4322                                                   internal_arg_pointer,
4323                                                   offset_rtx));
4324
4325         set_mem_attributes (stack_parm, parm, 1);
4326       }
4327
4328       /* If this parameter was passed both in registers and in the stack,
4329          use the copy on the stack.  */
4330       if (MUST_PASS_IN_STACK (promoted_mode, passed_type))
4331         entry_parm = 0;
4332
4333 #ifdef FUNCTION_ARG_PARTIAL_NREGS
4334       /* If this parm was passed part in regs and part in memory,
4335          pretend it arrived entirely in memory
4336          by pushing the register-part onto the stack.
4337
4338          In the special case of a DImode or DFmode that is split,
4339          we could put it together in a pseudoreg directly,
4340          but for now that's not worth bothering with.  */
4341
4342       if (entry_parm)
4343         {
4344           int nregs = FUNCTION_ARG_PARTIAL_NREGS (args_so_far, promoted_mode,
4345                                                   passed_type, named_arg);
4346
4347           if (nregs > 0)
4348             {
4349               current_function_pretend_args_size
4350                 = (((nregs * UNITS_PER_WORD) + (PARM_BOUNDARY / BITS_PER_UNIT) - 1)
4351                    / (PARM_BOUNDARY / BITS_PER_UNIT)
4352                    * (PARM_BOUNDARY / BITS_PER_UNIT));
4353
4354               /* Handle calls that pass values in multiple non-contiguous
4355                  locations.  The Irix 6 ABI has examples of this.  */
4356               if (GET_CODE (entry_parm) == PARALLEL)
4357                 emit_group_store (validize_mem (stack_parm), entry_parm,
4358                                   int_size_in_bytes (TREE_TYPE (parm)),
4359                                   TYPE_ALIGN (TREE_TYPE (parm)));
4360                                   
4361               else
4362                 move_block_from_reg (REGNO (entry_parm),
4363                                      validize_mem (stack_parm), nregs,
4364                                      int_size_in_bytes (TREE_TYPE (parm)));
4365
4366               entry_parm = stack_parm;
4367             }
4368         }
4369 #endif
4370
4371       /* If we didn't decide this parm came in a register,
4372          by default it came on the stack.  */
4373       if (entry_parm == 0)
4374         entry_parm = stack_parm;
4375
4376       /* Record permanently how this parm was passed.  */
4377       DECL_INCOMING_RTL (parm) = entry_parm;
4378
4379       /* If there is actually space on the stack for this parm,
4380          count it in stack_args_size; otherwise set stack_parm to 0
4381          to indicate there is no preallocated stack slot for the parm.  */
4382
4383       if (entry_parm == stack_parm
4384           || (GET_CODE (entry_parm) == PARALLEL
4385               && XEXP (XVECEXP (entry_parm, 0, 0), 0) == NULL_RTX)
4386 #if defined (REG_PARM_STACK_SPACE) && ! defined (MAYBE_REG_PARM_STACK_SPACE)
4387           /* On some machines, even if a parm value arrives in a register
4388              there is still an (uninitialized) stack slot allocated for it.
4389
4390              ??? When MAYBE_REG_PARM_STACK_SPACE is defined, we can't tell
4391              whether this parameter already has a stack slot allocated,
4392              because an arg block exists only if current_function_args_size
4393              is larger than some threshold, and we haven't calculated that
4394              yet.  So, for now, we just assume that stack slots never exist
4395              in this case.  */
4396           || REG_PARM_STACK_SPACE (fndecl) > 0
4397 #endif
4398           )
4399         {
4400           stack_args_size.constant += arg_size.constant;
4401           if (arg_size.var)
4402             ADD_PARM_SIZE (stack_args_size, arg_size.var);
4403         }
4404       else
4405         /* No stack slot was pushed for this parm.  */
4406         stack_parm = 0;
4407
4408       /* Update info on where next arg arrives in registers.  */
4409
4410       FUNCTION_ARG_ADVANCE (args_so_far, promoted_mode,
4411                             passed_type, named_arg);
4412
4413       /* If we can't trust the parm stack slot to be aligned enough
4414          for its ultimate type, don't use that slot after entry.
4415          We'll make another stack slot, if we need one.  */
4416       {
4417         unsigned int thisparm_boundary
4418           = FUNCTION_ARG_BOUNDARY (promoted_mode, passed_type);
4419
4420         if (GET_MODE_ALIGNMENT (nominal_mode) > thisparm_boundary)
4421           stack_parm = 0;
4422       }
4423
4424       /* If parm was passed in memory, and we need to convert it on entry,
4425          don't store it back in that same slot.  */
4426       if (entry_parm != 0
4427           && nominal_mode != BLKmode && nominal_mode != passed_mode)
4428         stack_parm = 0;
4429
4430       /* ENTRY_PARM is an RTX for the parameter as it arrives,
4431          in the mode in which it arrives.
4432          STACK_PARM is an RTX for a stack slot where the parameter can live
4433          during the function (in case we want to put it there).
4434          STACK_PARM is 0 if no stack slot was pushed for it.
4435
4436          Now output code if necessary to convert ENTRY_PARM to
4437          the type in which this function declares it,
4438          and store that result in an appropriate place,
4439          which may be a pseudo reg, may be STACK_PARM,
4440          or may be a local stack slot if STACK_PARM is 0.
4441
4442          Set DECL_RTL to that place.  */
4443
4444       if (nominal_mode == BLKmode || GET_CODE (entry_parm) == PARALLEL)
4445         {
4446           /* If a BLKmode arrives in registers, copy it to a stack slot.
4447              Handle calls that pass values in multiple non-contiguous
4448              locations.  The Irix 6 ABI has examples of this.  */
4449           if (GET_CODE (entry_parm) == REG
4450               || GET_CODE (entry_parm) == PARALLEL)
4451             {
4452               int size_stored
4453                 = CEIL_ROUND (int_size_in_bytes (TREE_TYPE (parm)),
4454                               UNITS_PER_WORD);
4455
4456               /* Note that we will be storing an integral number of words.
4457                  So we have to be careful to ensure that we allocate an
4458                  integral number of words.  We do this below in the
4459                  assign_stack_local if space was not allocated in the argument
4460                  list.  If it was, this will not work if PARM_BOUNDARY is not
4461                  a multiple of BITS_PER_WORD.  It isn't clear how to fix this
4462                  if it becomes a problem.  */
4463
4464               if (stack_parm == 0)
4465                 {
4466                   stack_parm
4467                     = assign_stack_local (GET_MODE (entry_parm),
4468                                           size_stored, 0);
4469                   set_mem_attributes (stack_parm, parm, 1);
4470                 }
4471
4472               else if (PARM_BOUNDARY % BITS_PER_WORD != 0)
4473                 abort ();
4474
4475               /* Handle calls that pass values in multiple non-contiguous
4476                  locations.  The Irix 6 ABI has examples of this.  */
4477               if (GET_CODE (entry_parm) == PARALLEL)
4478                 emit_group_store (validize_mem (stack_parm), entry_parm,
4479                                   int_size_in_bytes (TREE_TYPE (parm)),
4480                                   TYPE_ALIGN (TREE_TYPE (parm)));
4481               else
4482                 move_block_from_reg (REGNO (entry_parm),
4483                                      validize_mem (stack_parm),
4484                                      size_stored / UNITS_PER_WORD,
4485                                      int_size_in_bytes (TREE_TYPE (parm)));
4486             }
4487           DECL_RTL (parm) = stack_parm;
4488         }
4489       else if (! ((! optimize
4490                    && ! DECL_REGISTER (parm)
4491                    && ! DECL_INLINE (fndecl))
4492                   /* layout_decl may set this.  */
4493                   || TREE_ADDRESSABLE (parm)
4494                   || TREE_SIDE_EFFECTS (parm)
4495                   /* If -ffloat-store specified, don't put explicit
4496                      float variables into registers.  */
4497                   || (flag_float_store
4498                       && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE))
4499                /* Always assign pseudo to structure return or item passed
4500                   by invisible reference.  */
4501                || passed_pointer || parm == function_result_decl)
4502         {
4503           /* Store the parm in a pseudoregister during the function, but we
4504              may need to do it in a wider mode.  */
4505
4506           register rtx parmreg;
4507           unsigned int regno, regnoi = 0, regnor = 0;
4508
4509           unsignedp = TREE_UNSIGNED (TREE_TYPE (parm));
4510
4511           promoted_nominal_mode
4512             = promote_mode (TREE_TYPE (parm), nominal_mode, &unsignedp, 0);
4513
4514           parmreg = gen_reg_rtx (promoted_nominal_mode);
4515           mark_user_reg (parmreg);
4516
4517           /* If this was an item that we received a pointer to, set DECL_RTL
4518              appropriately.  */
4519           if (passed_pointer)
4520             {
4521               DECL_RTL (parm)
4522                 = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (passed_type)), parmreg);
4523               set_mem_attributes (DECL_RTL (parm), parm, 1);
4524             }
4525           else
4526             DECL_RTL (parm) = parmreg;
4527
4528           /* Copy the value into the register.  */
4529           if (nominal_mode != passed_mode
4530               || promoted_nominal_mode != promoted_mode)
4531             {
4532               int save_tree_used;
4533               /* ENTRY_PARM has been converted to PROMOTED_MODE, its
4534                  mode, by the caller.  We now have to convert it to 
4535                  NOMINAL_MODE, if different.  However, PARMREG may be in
4536                  a different mode than NOMINAL_MODE if it is being stored
4537                  promoted.
4538
4539                  If ENTRY_PARM is a hard register, it might be in a register
4540                  not valid for operating in its mode (e.g., an odd-numbered
4541                  register for a DFmode).  In that case, moves are the only
4542                  thing valid, so we can't do a convert from there.  This
4543                  occurs when the calling sequence allow such misaligned
4544                  usages.
4545
4546                  In addition, the conversion may involve a call, which could
4547                  clobber parameters which haven't been copied to pseudo
4548                  registers yet.  Therefore, we must first copy the parm to
4549                  a pseudo reg here, and save the conversion until after all
4550                  parameters have been moved.  */
4551
4552               rtx tempreg = gen_reg_rtx (GET_MODE (entry_parm));
4553
4554               emit_move_insn (tempreg, validize_mem (entry_parm));
4555
4556               push_to_sequence (conversion_insns);
4557               tempreg = convert_to_mode (nominal_mode, tempreg, unsignedp);
4558
4559               /* TREE_USED gets set erroneously during expand_assignment.  */
4560               save_tree_used = TREE_USED (parm);
4561               expand_assignment (parm,
4562                                  make_tree (nominal_type, tempreg), 0, 0);
4563               TREE_USED (parm) = save_tree_used;
4564               conversion_insns = get_insns ();
4565               did_conversion = 1;
4566               end_sequence ();
4567             }
4568           else
4569             emit_move_insn (parmreg, validize_mem (entry_parm));
4570
4571           /* If we were passed a pointer but the actual value
4572              can safely live in a register, put it in one.  */
4573           if (passed_pointer && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
4574               && ! ((! optimize
4575                      && ! DECL_REGISTER (parm)
4576                      && ! DECL_INLINE (fndecl))
4577                     /* layout_decl may set this.  */
4578                     || TREE_ADDRESSABLE (parm)
4579                     || TREE_SIDE_EFFECTS (parm)
4580                     /* If -ffloat-store specified, don't put explicit
4581                        float variables into registers.  */
4582                     || (flag_float_store
4583                         && TREE_CODE (TREE_TYPE (parm)) == REAL_TYPE)))
4584             {
4585               /* We can't use nominal_mode, because it will have been set to
4586                  Pmode above.  We must use the actual mode of the parm.  */
4587               parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
4588               mark_user_reg (parmreg);
4589               emit_move_insn (parmreg, DECL_RTL (parm));
4590               DECL_RTL (parm) = parmreg;
4591               /* STACK_PARM is the pointer, not the parm, and PARMREG is
4592                  now the parm.  */
4593               stack_parm = 0;
4594             }
4595 #ifdef FUNCTION_ARG_CALLEE_COPIES
4596           /* If we are passed an arg by reference and it is our responsibility
4597              to make a copy, do it now.
4598              PASSED_TYPE and PASSED mode now refer to the pointer, not the
4599              original argument, so we must recreate them in the call to
4600              FUNCTION_ARG_CALLEE_COPIES.  */
4601           /* ??? Later add code to handle the case that if the argument isn't
4602              modified, don't do the copy.  */
4603
4604           else if (passed_pointer
4605                    && FUNCTION_ARG_CALLEE_COPIES (args_so_far,
4606                                                   TYPE_MODE (DECL_ARG_TYPE (parm)),
4607                                                   DECL_ARG_TYPE (parm),
4608                                                   named_arg)
4609                    && ! TREE_ADDRESSABLE (DECL_ARG_TYPE (parm)))
4610             {
4611               rtx copy;
4612               tree type = DECL_ARG_TYPE (parm);
4613
4614               /* This sequence may involve a library call perhaps clobbering
4615                  registers that haven't been copied to pseudos yet.  */
4616
4617               push_to_sequence (conversion_insns);
4618
4619               if (!COMPLETE_TYPE_P (type)
4620                   || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
4621                 /* This is a variable sized object.  */
4622                 copy = gen_rtx_MEM (BLKmode,
4623                                     allocate_dynamic_stack_space
4624                                     (expr_size (parm), NULL_RTX,
4625                                      TYPE_ALIGN (type)));
4626               else
4627                 copy = assign_stack_temp (TYPE_MODE (type),
4628                                           int_size_in_bytes (type), 1);
4629               set_mem_attributes (copy, parm, 1);
4630
4631               store_expr (parm, copy, 0);
4632               emit_move_insn (parmreg, XEXP (copy, 0));
4633               if (current_function_check_memory_usage)
4634                 emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
4635                                    XEXP (copy, 0), Pmode,
4636                                    GEN_INT (int_size_in_bytes (type)),
4637                                    TYPE_MODE (sizetype),
4638                                    GEN_INT (MEMORY_USE_RW),
4639                                    TYPE_MODE (integer_type_node));
4640               conversion_insns = get_insns ();
4641               did_conversion = 1;
4642               end_sequence ();
4643             }
4644 #endif /* FUNCTION_ARG_CALLEE_COPIES */
4645
4646           /* In any case, record the parm's desired stack location
4647              in case we later discover it must live in the stack. 
4648
4649              If it is a COMPLEX value, store the stack location for both
4650              halves.  */
4651
4652           if (GET_CODE (parmreg) == CONCAT)
4653             regno = MAX (REGNO (XEXP (parmreg, 0)), REGNO (XEXP (parmreg, 1)));
4654           else
4655             regno = REGNO (parmreg);
4656
4657           if (regno >= max_parm_reg)
4658             {
4659               rtx *new;
4660               int old_max_parm_reg = max_parm_reg;
4661
4662               /* It's slow to expand this one register at a time,
4663                  but it's also rare and we need max_parm_reg to be
4664                  precisely correct.  */
4665               max_parm_reg = regno + 1;
4666               new = (rtx *) xrealloc (parm_reg_stack_loc,
4667                                       max_parm_reg * sizeof (rtx));
4668               bzero ((char *) (new + old_max_parm_reg),
4669                      (max_parm_reg - old_max_parm_reg) * sizeof (rtx));
4670               parm_reg_stack_loc = new;
4671             }
4672
4673           if (GET_CODE (parmreg) == CONCAT)
4674             {
4675               enum machine_mode submode = GET_MODE (XEXP (parmreg, 0));
4676
4677               regnor = REGNO (gen_realpart (submode, parmreg));
4678               regnoi = REGNO (gen_imagpart (submode, parmreg));
4679
4680               if (stack_parm != 0)
4681                 {
4682                   parm_reg_stack_loc[regnor]
4683                     = gen_realpart (submode, stack_parm);
4684                   parm_reg_stack_loc[regnoi]
4685                     = gen_imagpart (submode, stack_parm);
4686                 }
4687               else
4688                 {
4689                   parm_reg_stack_loc[regnor] = 0;
4690                   parm_reg_stack_loc[regnoi] = 0;
4691                 }
4692             }
4693           else
4694             parm_reg_stack_loc[REGNO (parmreg)] = stack_parm;
4695
4696           /* Mark the register as eliminable if we did no conversion
4697              and it was copied from memory at a fixed offset,
4698              and the arg pointer was not copied to a pseudo-reg.
4699              If the arg pointer is a pseudo reg or the offset formed
4700              an invalid address, such memory-equivalences
4701              as we make here would screw up life analysis for it.  */
4702           if (nominal_mode == passed_mode
4703               && ! did_conversion
4704               && stack_parm != 0
4705               && GET_CODE (stack_parm) == MEM
4706               && stack_offset.var == 0
4707               && reg_mentioned_p (virtual_incoming_args_rtx,
4708                                   XEXP (stack_parm, 0)))
4709             {
4710               rtx linsn = get_last_insn ();
4711               rtx sinsn, set;
4712
4713               /* Mark complex types separately.  */
4714               if (GET_CODE (parmreg) == CONCAT)
4715                 /* Scan backwards for the set of the real and
4716                    imaginary parts.  */
4717                 for (sinsn = linsn; sinsn != 0;
4718                      sinsn = prev_nonnote_insn (sinsn))
4719                   {
4720                     set = single_set (sinsn);
4721                     if (set != 0
4722                         && SET_DEST (set) == regno_reg_rtx [regnoi])
4723                       REG_NOTES (sinsn)
4724                         = gen_rtx_EXPR_LIST (REG_EQUIV,
4725                                              parm_reg_stack_loc[regnoi],
4726                                              REG_NOTES (sinsn));
4727                     else if (set != 0
4728                              && SET_DEST (set) == regno_reg_rtx [regnor])
4729                       REG_NOTES (sinsn)
4730                         = gen_rtx_EXPR_LIST (REG_EQUIV,
4731                                              parm_reg_stack_loc[regnor],
4732                                              REG_NOTES (sinsn));
4733                   }
4734               else if ((set = single_set (linsn)) != 0
4735                        && SET_DEST (set) == parmreg)
4736                 REG_NOTES (linsn)
4737                   = gen_rtx_EXPR_LIST (REG_EQUIV,
4738                                        stack_parm, REG_NOTES (linsn));
4739             }
4740
4741           /* For pointer data type, suggest pointer register.  */
4742           if (POINTER_TYPE_P (TREE_TYPE (parm)))
4743             mark_reg_pointer (parmreg,
4744                               TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
4745
4746         }
4747       else
4748         {
4749           /* Value must be stored in the stack slot STACK_PARM
4750              during function execution.  */
4751
4752           if (promoted_mode != nominal_mode)
4753             {
4754               /* Conversion is required.   */
4755               rtx tempreg = gen_reg_rtx (GET_MODE (entry_parm));
4756
4757               emit_move_insn (tempreg, validize_mem (entry_parm));
4758
4759               push_to_sequence (conversion_insns);
4760               entry_parm = convert_to_mode (nominal_mode, tempreg,
4761                                             TREE_UNSIGNED (TREE_TYPE (parm)));
4762               if (stack_parm)
4763                 {
4764                   /* ??? This may need a big-endian conversion on sparc64.  */
4765                   stack_parm = change_address (stack_parm, nominal_mode,
4766                                                NULL_RTX);
4767                 }
4768               conversion_insns = get_insns ();
4769               did_conversion = 1;
4770               end_sequence ();
4771             }
4772
4773           if (entry_parm != stack_parm)
4774             {
4775               if (stack_parm == 0)
4776                 {
4777                   stack_parm
4778                     = assign_stack_local (GET_MODE (entry_parm),
4779                                           GET_MODE_SIZE (GET_MODE (entry_parm)), 0);
4780                   set_mem_attributes (stack_parm, parm, 1);
4781                 }
4782
4783               if (promoted_mode != nominal_mode)
4784                 {
4785                   push_to_sequence (conversion_insns);
4786                   emit_move_insn (validize_mem (stack_parm),
4787                                   validize_mem (entry_parm));
4788                   conversion_insns = get_insns ();
4789                   end_sequence ();
4790                 }
4791               else
4792                 emit_move_insn (validize_mem (stack_parm),
4793                                 validize_mem (entry_parm));
4794             }
4795           if (current_function_check_memory_usage)
4796             {
4797               push_to_sequence (conversion_insns);
4798               emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
4799                                  XEXP (stack_parm, 0), Pmode,
4800                                  GEN_INT (GET_MODE_SIZE (GET_MODE 
4801                                                          (entry_parm))),
4802                                  TYPE_MODE (sizetype),
4803                                  GEN_INT (MEMORY_USE_RW),
4804                                  TYPE_MODE (integer_type_node));
4805
4806               conversion_insns = get_insns ();
4807               end_sequence ();
4808             }
4809           DECL_RTL (parm) = stack_parm;
4810         }
4811       
4812       /* If this "parameter" was the place where we are receiving the
4813          function's incoming structure pointer, set up the result.  */
4814       if (parm == function_result_decl)
4815         {
4816           tree result = DECL_RESULT (fndecl);
4817
4818           DECL_RTL (result)
4819             = gen_rtx_MEM (DECL_MODE (result), DECL_RTL (parm));
4820
4821           set_mem_attributes (DECL_RTL (result), result, 1);
4822         }
4823     }
4824
4825   /* Output all parameter conversion instructions (possibly including calls)
4826      now that all parameters have been copied out of hard registers.  */
4827   emit_insns (conversion_insns);
4828
4829   last_parm_insn = get_last_insn ();
4830
4831   current_function_args_size = stack_args_size.constant;
4832
4833   /* Adjust function incoming argument size for alignment and
4834      minimum length.  */
4835
4836 #ifdef REG_PARM_STACK_SPACE
4837 #ifndef MAYBE_REG_PARM_STACK_SPACE
4838   current_function_args_size = MAX (current_function_args_size,
4839                                     REG_PARM_STACK_SPACE (fndecl));
4840 #endif
4841 #endif
4842
4843 #ifdef STACK_BOUNDARY
4844 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
4845
4846   current_function_args_size
4847     = ((current_function_args_size + STACK_BYTES - 1)
4848        / STACK_BYTES) * STACK_BYTES;
4849 #endif  
4850
4851 #ifdef ARGS_GROW_DOWNWARD
4852   current_function_arg_offset_rtx
4853     = (stack_args_size.var == 0 ? GEN_INT (-stack_args_size.constant)
4854        : expand_expr (size_diffop (stack_args_size.var, 
4855                                    size_int (-stack_args_size.constant)),   
4856                       NULL_RTX, VOIDmode, EXPAND_MEMORY_USE_BAD));
4857 #else
4858   current_function_arg_offset_rtx = ARGS_SIZE_RTX (stack_args_size);
4859 #endif
4860
4861   /* See how many bytes, if any, of its args a function should try to pop
4862      on return.  */
4863
4864   current_function_pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
4865                                                  current_function_args_size);
4866
4867   /* For stdarg.h function, save info about
4868      regs and stack space used by the named args.  */
4869
4870   if (!hide_last_arg)
4871     current_function_args_info = args_so_far;
4872
4873   /* Set the rtx used for the function return value.  Put this in its
4874      own variable so any optimizers that need this information don't have
4875      to include tree.h.  Do this here so it gets done when an inlined
4876      function gets output.  */
4877
4878   current_function_return_rtx = DECL_RTL (DECL_RESULT (fndecl));
4879 }
4880 \f
4881 /* Indicate whether REGNO is an incoming argument to the current function
4882    that was promoted to a wider mode.  If so, return the RTX for the
4883    register (to get its mode).  PMODE and PUNSIGNEDP are set to the mode
4884    that REGNO is promoted from and whether the promotion was signed or
4885    unsigned.  */
4886
4887 #ifdef PROMOTE_FUNCTION_ARGS
4888
4889 rtx
4890 promoted_input_arg (regno, pmode, punsignedp)
4891      unsigned int regno;
4892      enum machine_mode *pmode;
4893      int *punsignedp;
4894 {
4895   tree arg;
4896
4897   for (arg = DECL_ARGUMENTS (current_function_decl); arg;
4898        arg = TREE_CHAIN (arg))
4899     if (GET_CODE (DECL_INCOMING_RTL (arg)) == REG
4900         && REGNO (DECL_INCOMING_RTL (arg)) == regno
4901         && TYPE_MODE (DECL_ARG_TYPE (arg)) == TYPE_MODE (TREE_TYPE (arg)))
4902       {
4903         enum machine_mode mode = TYPE_MODE (TREE_TYPE (arg));
4904         int unsignedp = TREE_UNSIGNED (TREE_TYPE (arg));
4905
4906         mode = promote_mode (TREE_TYPE (arg), mode, &unsignedp, 1);
4907         if (mode == GET_MODE (DECL_INCOMING_RTL (arg))
4908             && mode != DECL_MODE (arg))
4909           {
4910             *pmode = DECL_MODE (arg);
4911             *punsignedp = unsignedp;
4912             return DECL_INCOMING_RTL (arg);
4913           }
4914       }
4915
4916   return 0;
4917 }
4918
4919 #endif
4920 \f
4921 /* Compute the size and offset from the start of the stacked arguments for a
4922    parm passed in mode PASSED_MODE and with type TYPE.
4923
4924    INITIAL_OFFSET_PTR points to the current offset into the stacked
4925    arguments.
4926
4927    The starting offset and size for this parm are returned in *OFFSET_PTR
4928    and *ARG_SIZE_PTR, respectively.
4929
4930    IN_REGS is non-zero if the argument will be passed in registers.  It will
4931    never be set if REG_PARM_STACK_SPACE is not defined.
4932
4933    FNDECL is the function in which the argument was defined.
4934
4935    There are two types of rounding that are done.  The first, controlled by
4936    FUNCTION_ARG_BOUNDARY, forces the offset from the start of the argument
4937    list to be aligned to the specific boundary (in bits).  This rounding
4938    affects the initial and starting offsets, but not the argument size.
4939
4940    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
4941    optionally rounds the size of the parm to PARM_BOUNDARY.  The
4942    initial offset is not affected by this rounding, while the size always
4943    is and the starting offset may be.  */
4944
4945 /*  offset_ptr will be negative for ARGS_GROW_DOWNWARD case; 
4946     initial_offset_ptr is positive because locate_and_pad_parm's
4947     callers pass in the total size of args so far as
4948     initial_offset_ptr. arg_size_ptr is always positive.*/
4949
4950 void
4951 locate_and_pad_parm (passed_mode, type, in_regs, fndecl,
4952                      initial_offset_ptr, offset_ptr, arg_size_ptr,
4953                      alignment_pad)
4954      enum machine_mode passed_mode;
4955      tree type;
4956      int in_regs ATTRIBUTE_UNUSED;
4957      tree fndecl ATTRIBUTE_UNUSED;
4958      struct args_size *initial_offset_ptr;
4959      struct args_size *offset_ptr;
4960      struct args_size *arg_size_ptr;
4961      struct args_size *alignment_pad;
4962
4963 {
4964   tree sizetree
4965     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
4966   enum direction where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
4967   int boundary = FUNCTION_ARG_BOUNDARY (passed_mode, type);
4968
4969 #ifdef REG_PARM_STACK_SPACE
4970   /* If we have found a stack parm before we reach the end of the
4971      area reserved for registers, skip that area.  */
4972   if (! in_regs)
4973     {
4974       int reg_parm_stack_space = 0;
4975
4976 #ifdef MAYBE_REG_PARM_STACK_SPACE
4977       reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
4978 #else
4979       reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
4980 #endif
4981       if (reg_parm_stack_space > 0)
4982         {
4983           if (initial_offset_ptr->var)
4984             {
4985               initial_offset_ptr->var
4986                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
4987                               ssize_int (reg_parm_stack_space));
4988               initial_offset_ptr->constant = 0;
4989             }
4990           else if (initial_offset_ptr->constant < reg_parm_stack_space)
4991             initial_offset_ptr->constant = reg_parm_stack_space;
4992         }
4993     }
4994 #endif /* REG_PARM_STACK_SPACE */
4995
4996   arg_size_ptr->var = 0;
4997   arg_size_ptr->constant = 0;
4998
4999 #ifdef ARGS_GROW_DOWNWARD
5000   if (initial_offset_ptr->var)
5001     {
5002       offset_ptr->constant = 0;
5003       offset_ptr->var = size_binop (MINUS_EXPR, ssize_int (0),
5004                                     initial_offset_ptr->var);
5005     }
5006   else
5007     {
5008       offset_ptr->constant = - initial_offset_ptr->constant;
5009       offset_ptr->var = 0;
5010     }
5011   if (where_pad != none
5012       && (TREE_CODE (sizetree) != INTEGER_CST
5013           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
5014     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
5015   SUB_PARM_SIZE (*offset_ptr, sizetree);
5016   if (where_pad != downward)
5017     pad_to_arg_alignment (offset_ptr, boundary, alignment_pad);
5018   if (initial_offset_ptr->var)
5019     arg_size_ptr->var = size_binop (MINUS_EXPR,
5020                                     size_binop (MINUS_EXPR,
5021                                                 ssize_int (0),
5022                                                 initial_offset_ptr->var),
5023                                     offset_ptr->var);
5024
5025   else
5026     arg_size_ptr->constant = (- initial_offset_ptr->constant
5027                               - offset_ptr->constant); 
5028
5029 #else /* !ARGS_GROW_DOWNWARD */
5030   pad_to_arg_alignment (initial_offset_ptr, boundary, alignment_pad);
5031   *offset_ptr = *initial_offset_ptr;
5032
5033 #ifdef PUSH_ROUNDING
5034   if (passed_mode != BLKmode)
5035     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
5036 #endif
5037
5038   /* Pad_below needs the pre-rounded size to know how much to pad below
5039      so this must be done before rounding up.  */
5040   if (where_pad == downward
5041     /* However, BLKmode args passed in regs have their padding done elsewhere.
5042        The stack slot must be able to hold the entire register.  */
5043       && !(in_regs && passed_mode == BLKmode))
5044     pad_below (offset_ptr, passed_mode, sizetree);
5045
5046   if (where_pad != none
5047       && (TREE_CODE (sizetree) != INTEGER_CST
5048           || ((TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)))
5049     sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
5050
5051   ADD_PARM_SIZE (*arg_size_ptr, sizetree);
5052 #endif /* ARGS_GROW_DOWNWARD */
5053 }
5054
5055 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
5056    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
5057
5058 static void
5059 pad_to_arg_alignment (offset_ptr, boundary, alignment_pad)
5060      struct args_size *offset_ptr;
5061      int boundary;
5062      struct args_size *alignment_pad;
5063 {
5064   tree save_var = NULL_TREE;
5065   HOST_WIDE_INT save_constant = 0;
5066
5067   int boundary_in_bytes = boundary / BITS_PER_UNIT;
5068   
5069   if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
5070     {
5071       save_var = offset_ptr->var;
5072       save_constant = offset_ptr->constant;
5073     }
5074
5075   alignment_pad->var = NULL_TREE;
5076   alignment_pad->constant = 0;
5077
5078   if (boundary > BITS_PER_UNIT)
5079     {
5080       if (offset_ptr->var)
5081         {
5082           offset_ptr->var  =
5083 #ifdef ARGS_GROW_DOWNWARD
5084             round_down 
5085 #else
5086             round_up
5087 #endif
5088               (ARGS_SIZE_TREE (*offset_ptr),
5089                boundary / BITS_PER_UNIT);
5090           offset_ptr->constant = 0; /*?*/
5091           if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
5092             alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
5093                                              save_var);
5094         }
5095       else
5096         {
5097           offset_ptr->constant =
5098 #ifdef ARGS_GROW_DOWNWARD
5099             FLOOR_ROUND (offset_ptr->constant, boundary_in_bytes);
5100 #else
5101             CEIL_ROUND (offset_ptr->constant, boundary_in_bytes);
5102 #endif
5103           if (boundary > PARM_BOUNDARY && boundary > STACK_BOUNDARY)
5104             alignment_pad->constant = offset_ptr->constant - save_constant;
5105         }
5106     }
5107 }
5108
5109 #ifndef ARGS_GROW_DOWNWARD
5110 static void
5111 pad_below (offset_ptr, passed_mode, sizetree)
5112      struct args_size *offset_ptr;
5113      enum machine_mode passed_mode;
5114      tree sizetree;
5115 {
5116   if (passed_mode != BLKmode)
5117     {
5118       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
5119         offset_ptr->constant
5120           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
5121                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
5122               - GET_MODE_SIZE (passed_mode));
5123     }
5124   else
5125     {
5126       if (TREE_CODE (sizetree) != INTEGER_CST
5127           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
5128         {
5129           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
5130           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
5131           /* Add it in.  */
5132           ADD_PARM_SIZE (*offset_ptr, s2);
5133           SUB_PARM_SIZE (*offset_ptr, sizetree);
5134         }
5135     }
5136 }
5137 #endif
5138 \f
5139 /* Walk the tree of blocks describing the binding levels within a function
5140    and warn about uninitialized variables.
5141    This is done after calling flow_analysis and before global_alloc
5142    clobbers the pseudo-regs to hard regs.  */
5143
5144 void
5145 uninitialized_vars_warning (block)
5146      tree block;
5147 {
5148   register tree decl, sub;
5149   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
5150     {
5151       if (warn_uninitialized
5152           && TREE_CODE (decl) == VAR_DECL
5153           /* These warnings are unreliable for and aggregates
5154              because assigning the fields one by one can fail to convince
5155              flow.c that the entire aggregate was initialized.
5156              Unions are troublesome because members may be shorter.  */
5157           && ! AGGREGATE_TYPE_P (TREE_TYPE (decl))
5158           && DECL_RTL (decl) != 0
5159           && GET_CODE (DECL_RTL (decl)) == REG
5160           /* Global optimizations can make it difficult to determine if a
5161              particular variable has been initialized.  However, a VAR_DECL
5162              with a nonzero DECL_INITIAL had an initializer, so do not
5163              claim it is potentially uninitialized.
5164
5165              We do not care about the actual value in DECL_INITIAL, so we do
5166              not worry that it may be a dangling pointer.  */
5167           && DECL_INITIAL (decl) == NULL_TREE
5168           && regno_uninitialized (REGNO (DECL_RTL (decl))))
5169         warning_with_decl (decl,
5170                            "`%s' might be used uninitialized in this function");
5171       if (extra_warnings
5172           && TREE_CODE (decl) == VAR_DECL
5173           && DECL_RTL (decl) != 0
5174           && GET_CODE (DECL_RTL (decl)) == REG
5175           && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
5176         warning_with_decl (decl,
5177                            "variable `%s' might be clobbered by `longjmp' or `vfork'");
5178     }
5179   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
5180     uninitialized_vars_warning (sub);
5181 }
5182
5183 /* Do the appropriate part of uninitialized_vars_warning
5184    but for arguments instead of local variables.  */
5185
5186 void
5187 setjmp_args_warning ()
5188 {
5189   register tree decl;
5190   for (decl = DECL_ARGUMENTS (current_function_decl);
5191        decl; decl = TREE_CHAIN (decl))
5192     if (DECL_RTL (decl) != 0
5193         && GET_CODE (DECL_RTL (decl)) == REG
5194         && regno_clobbered_at_setjmp (REGNO (DECL_RTL (decl))))
5195       warning_with_decl (decl, "argument `%s' might be clobbered by `longjmp' or `vfork'");
5196 }
5197
5198 /* If this function call setjmp, put all vars into the stack
5199    unless they were declared `register'.  */
5200
5201 void
5202 setjmp_protect (block)
5203      tree block;
5204 {
5205   register tree decl, sub;
5206   for (decl = BLOCK_VARS (block); decl; decl = TREE_CHAIN (decl))
5207     if ((TREE_CODE (decl) == VAR_DECL
5208          || TREE_CODE (decl) == PARM_DECL)
5209         && DECL_RTL (decl) != 0
5210         && (GET_CODE (DECL_RTL (decl)) == REG
5211             || (GET_CODE (DECL_RTL (decl)) == MEM
5212                 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF))
5213         /* If this variable came from an inline function, it must be
5214            that its life doesn't overlap the setjmp.  If there was a
5215            setjmp in the function, it would already be in memory.  We
5216            must exclude such variable because their DECL_RTL might be
5217            set to strange things such as virtual_stack_vars_rtx.  */
5218         && ! DECL_FROM_INLINE (decl)
5219         && (
5220 #ifdef NON_SAVING_SETJMP
5221             /* If longjmp doesn't restore the registers,
5222                don't put anything in them.  */
5223             NON_SAVING_SETJMP
5224             ||
5225 #endif
5226             ! DECL_REGISTER (decl)))
5227       put_var_into_stack (decl);
5228   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = TREE_CHAIN (sub))
5229     setjmp_protect (sub);
5230 }
5231 \f
5232 /* Like the previous function, but for args instead of local variables.  */
5233
5234 void
5235 setjmp_protect_args ()
5236 {
5237   register tree decl;
5238   for (decl = DECL_ARGUMENTS (current_function_decl);
5239        decl; decl = TREE_CHAIN (decl))
5240     if ((TREE_CODE (decl) == VAR_DECL
5241          || TREE_CODE (decl) == PARM_DECL)
5242         && DECL_RTL (decl) != 0
5243         && (GET_CODE (DECL_RTL (decl)) == REG
5244             || (GET_CODE (DECL_RTL (decl)) == MEM
5245                 && GET_CODE (XEXP (DECL_RTL (decl), 0)) == ADDRESSOF))
5246         && (
5247             /* If longjmp doesn't restore the registers,
5248                don't put anything in them.  */
5249 #ifdef NON_SAVING_SETJMP
5250             NON_SAVING_SETJMP
5251             ||
5252 #endif
5253             ! DECL_REGISTER (decl)))
5254       put_var_into_stack (decl);
5255 }
5256 \f
5257 /* Return the context-pointer register corresponding to DECL,
5258    or 0 if it does not need one.  */
5259
5260 rtx
5261 lookup_static_chain (decl)
5262      tree decl;
5263 {
5264   tree context = decl_function_context (decl);
5265   tree link;
5266
5267   if (context == 0
5268       || (TREE_CODE (decl) == FUNCTION_DECL && DECL_NO_STATIC_CHAIN (decl)))
5269     return 0;
5270
5271   /* We treat inline_function_decl as an alias for the current function
5272      because that is the inline function whose vars, types, etc.
5273      are being merged into the current function.
5274      See expand_inline_function.  */
5275   if (context == current_function_decl || context == inline_function_decl)
5276     return virtual_stack_vars_rtx;
5277
5278   for (link = context_display; link; link = TREE_CHAIN (link))
5279     if (TREE_PURPOSE (link) == context)
5280       return RTL_EXPR_RTL (TREE_VALUE (link));
5281
5282   abort ();
5283 }
5284 \f
5285 /* Convert a stack slot address ADDR for variable VAR
5286    (from a containing function)
5287    into an address valid in this function (using a static chain).  */
5288
5289 rtx
5290 fix_lexical_addr (addr, var)
5291      rtx addr;
5292      tree var;
5293 {
5294   rtx basereg;
5295   HOST_WIDE_INT displacement;
5296   tree context = decl_function_context (var);
5297   struct function *fp;
5298   rtx base = 0;
5299
5300   /* If this is the present function, we need not do anything.  */
5301   if (context == current_function_decl || context == inline_function_decl)
5302     return addr;
5303
5304   for (fp = outer_function_chain; fp; fp = fp->next)
5305     if (fp->decl == context)
5306       break;
5307
5308   if (fp == 0)
5309     abort ();
5310
5311   if (GET_CODE (addr) == ADDRESSOF && GET_CODE (XEXP (addr, 0)) == MEM)
5312     addr = XEXP (XEXP (addr, 0), 0);
5313
5314   /* Decode given address as base reg plus displacement.  */
5315   if (GET_CODE (addr) == REG)
5316     basereg = addr, displacement = 0;
5317   else if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST_INT)
5318     basereg = XEXP (addr, 0), displacement = INTVAL (XEXP (addr, 1));
5319   else
5320     abort ();
5321
5322   /* We accept vars reached via the containing function's
5323      incoming arg pointer and via its stack variables pointer.  */
5324   if (basereg == fp->internal_arg_pointer)
5325     {
5326       /* If reached via arg pointer, get the arg pointer value
5327          out of that function's stack frame.
5328
5329          There are two cases:  If a separate ap is needed, allocate a
5330          slot in the outer function for it and dereference it that way.
5331          This is correct even if the real ap is actually a pseudo.
5332          Otherwise, just adjust the offset from the frame pointer to
5333          compensate.  */
5334
5335 #ifdef NEED_SEPARATE_AP
5336       rtx addr;
5337
5338       if (fp->x_arg_pointer_save_area == 0)
5339         fp->x_arg_pointer_save_area
5340           = assign_stack_local_1 (Pmode, GET_MODE_SIZE (Pmode), 0, fp);
5341
5342       addr = fix_lexical_addr (XEXP (fp->x_arg_pointer_save_area, 0), var);
5343       addr = memory_address (Pmode, addr);
5344
5345       base = gen_rtx_MEM (Pmode, addr);
5346       MEM_ALIAS_SET (base) = get_frame_alias_set ();
5347       base = copy_to_reg (base);
5348 #else
5349       displacement += (FIRST_PARM_OFFSET (context) - STARTING_FRAME_OFFSET);
5350       base = lookup_static_chain (var);
5351 #endif
5352     }
5353
5354   else if (basereg == virtual_stack_vars_rtx)
5355     {
5356       /* This is the same code as lookup_static_chain, duplicated here to
5357          avoid an extra call to decl_function_context.  */
5358       tree link;
5359
5360       for (link = context_display; link; link = TREE_CHAIN (link))
5361         if (TREE_PURPOSE (link) == context)
5362           {
5363             base = RTL_EXPR_RTL (TREE_VALUE (link));
5364             break;
5365           }
5366     }
5367
5368   if (base == 0)
5369     abort ();
5370
5371   /* Use same offset, relative to appropriate static chain or argument
5372      pointer.  */
5373   return plus_constant (base, displacement);
5374 }
5375 \f
5376 /* Return the address of the trampoline for entering nested fn FUNCTION.
5377    If necessary, allocate a trampoline (in the stack frame)
5378    and emit rtl to initialize its contents (at entry to this function).  */
5379
5380 rtx
5381 trampoline_address (function)
5382      tree function;
5383 {
5384   tree link;
5385   tree rtlexp;
5386   rtx tramp;
5387   struct function *fp;
5388   tree fn_context;
5389
5390   /* Find an existing trampoline and return it.  */
5391   for (link = trampoline_list; link; link = TREE_CHAIN (link))
5392     if (TREE_PURPOSE (link) == function)
5393       return
5394         round_trampoline_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0));
5395
5396   for (fp = outer_function_chain; fp; fp = fp->next)
5397     for (link = fp->x_trampoline_list; link; link = TREE_CHAIN (link))
5398       if (TREE_PURPOSE (link) == function)
5399         {
5400           tramp = fix_lexical_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0),
5401                                     function);
5402           return round_trampoline_addr (tramp);
5403         }
5404
5405   /* None exists; we must make one.  */
5406
5407   /* Find the `struct function' for the function containing FUNCTION.  */
5408   fp = 0;
5409   fn_context = decl_function_context (function);
5410   if (fn_context != current_function_decl
5411       && fn_context != inline_function_decl)
5412     for (fp = outer_function_chain; fp; fp = fp->next)
5413       if (fp->decl == fn_context)
5414         break;
5415
5416   /* Allocate run-time space for this trampoline
5417      (usually in the defining function's stack frame).  */
5418 #ifdef ALLOCATE_TRAMPOLINE
5419   tramp = ALLOCATE_TRAMPOLINE (fp);
5420 #else
5421   /* If rounding needed, allocate extra space
5422      to ensure we have TRAMPOLINE_SIZE bytes left after rounding up.  */
5423 #ifdef TRAMPOLINE_ALIGNMENT
5424 #define TRAMPOLINE_REAL_SIZE \
5425   (TRAMPOLINE_SIZE + (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT) - 1)
5426 #else
5427 #define TRAMPOLINE_REAL_SIZE (TRAMPOLINE_SIZE)
5428 #endif
5429   tramp = assign_stack_local_1 (BLKmode, TRAMPOLINE_REAL_SIZE, 0,
5430                                 fp ? fp : cfun);
5431 #endif
5432
5433   /* Record the trampoline for reuse and note it for later initialization
5434      by expand_function_end.  */
5435   if (fp != 0)
5436     {
5437       push_obstacks (fp->function_maybepermanent_obstack,
5438                      fp->function_maybepermanent_obstack);
5439       rtlexp = make_node (RTL_EXPR);
5440       RTL_EXPR_RTL (rtlexp) = tramp;
5441       fp->x_trampoline_list = tree_cons (function, rtlexp,
5442                                          fp->x_trampoline_list);
5443       pop_obstacks ();
5444     }
5445   else
5446     {
5447       /* Make the RTL_EXPR node temporary, not momentary, so that the
5448          trampoline_list doesn't become garbage.  */
5449       int momentary = suspend_momentary ();
5450       rtlexp = make_node (RTL_EXPR);
5451       resume_momentary (momentary);
5452
5453       RTL_EXPR_RTL (rtlexp) = tramp;
5454       trampoline_list = tree_cons (function, rtlexp, trampoline_list);
5455     }
5456
5457   tramp = fix_lexical_addr (XEXP (tramp, 0), function);
5458   return round_trampoline_addr (tramp);
5459 }
5460
5461 /* Given a trampoline address,
5462    round it to multiple of TRAMPOLINE_ALIGNMENT.  */
5463
5464 static rtx
5465 round_trampoline_addr (tramp)
5466      rtx tramp;
5467 {
5468 #ifdef TRAMPOLINE_ALIGNMENT
5469   /* Round address up to desired boundary.  */
5470   rtx temp = gen_reg_rtx (Pmode);
5471   temp = expand_binop (Pmode, add_optab, tramp,
5472                        GEN_INT (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1),
5473                        temp, 0, OPTAB_LIB_WIDEN);
5474   tramp = expand_binop (Pmode, and_optab, temp,
5475                         GEN_INT (- TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT),
5476                         temp, 0, OPTAB_LIB_WIDEN);
5477 #endif
5478   return tramp;
5479 }
5480 \f
5481 /* Put all this function's BLOCK nodes including those that are chained
5482    onto the first block into a vector, and return it.
5483    Also store in each NOTE for the beginning or end of a block
5484    the index of that block in the vector.
5485    The arguments are BLOCK, the chain of top-level blocks of the function,
5486    and INSNS, the insn chain of the function.  */
5487
5488 void
5489 identify_blocks ()
5490 {
5491   int n_blocks;
5492   tree *block_vector, *last_block_vector;
5493   tree *block_stack;
5494   tree block = DECL_INITIAL (current_function_decl);
5495
5496   if (block == 0)
5497     return;
5498
5499   /* Fill the BLOCK_VECTOR with all of the BLOCKs in this function, in
5500      depth-first order.  */
5501   block_vector = get_block_vector (block, &n_blocks);
5502   block_stack = (tree *) xmalloc (n_blocks * sizeof (tree));
5503
5504   last_block_vector = identify_blocks_1 (get_insns (), 
5505                                          block_vector + 1,
5506                                          block_vector + n_blocks, 
5507                                          block_stack);
5508
5509   /* If we didn't use all of the subblocks, we've misplaced block notes.  */
5510   /* ??? This appears to happen all the time.  Latent bugs elsewhere?  */
5511   if (0 && last_block_vector != block_vector + n_blocks)
5512     abort ();
5513
5514   free (block_vector);
5515   free (block_stack);
5516 }
5517
5518 /* Subroutine of identify_blocks.  Do the block substitution on the
5519    insn chain beginning with INSNS.  Recurse for CALL_PLACEHOLDER chains.
5520
5521    BLOCK_STACK is pushed and popped for each BLOCK_BEGIN/BLOCK_END pair.
5522    BLOCK_VECTOR is incremented for each block seen.  */
5523
5524 static tree *
5525 identify_blocks_1 (insns, block_vector, end_block_vector, orig_block_stack)
5526      rtx insns;
5527      tree *block_vector;
5528      tree *end_block_vector;
5529      tree *orig_block_stack;
5530 {
5531   rtx insn;
5532   tree *block_stack = orig_block_stack;
5533
5534   for (insn = insns; insn; insn = NEXT_INSN (insn))
5535     {
5536       if (GET_CODE (insn) == NOTE)
5537         {
5538           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
5539             {
5540               tree b;
5541
5542               /* If there are more block notes than BLOCKs, something
5543                  is badly wrong.  */
5544               if (block_vector == end_block_vector)
5545                 abort ();
5546
5547               b = *block_vector++;
5548               NOTE_BLOCK (insn) = b;
5549               *block_stack++ = b;
5550             }
5551           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
5552             {
5553               /* If there are more NOTE_INSN_BLOCK_ENDs than
5554                  NOTE_INSN_BLOCK_BEGs, something is badly wrong.  */
5555               if (block_stack == orig_block_stack)
5556                 abort ();
5557
5558               NOTE_BLOCK (insn) = *--block_stack;
5559             }
5560         }
5561       else if (GET_CODE (insn) == CALL_INSN
5562                && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
5563         {
5564           rtx cp = PATTERN (insn);
5565
5566           block_vector = identify_blocks_1 (XEXP (cp, 0), block_vector, 
5567                                             end_block_vector, block_stack);
5568           if (XEXP (cp, 1))
5569             block_vector = identify_blocks_1 (XEXP (cp, 1), block_vector,
5570                                               end_block_vector, block_stack);
5571           if (XEXP (cp, 2))
5572             block_vector = identify_blocks_1 (XEXP (cp, 2), block_vector,
5573                                               end_block_vector, block_stack);
5574         }
5575     }
5576
5577   /* If there are more NOTE_INSN_BLOCK_BEGINs than NOTE_INSN_BLOCK_ENDs,
5578      something is badly wrong.  */
5579   if (block_stack != orig_block_stack)
5580     abort ();
5581
5582   return block_vector;
5583 }
5584
5585 /* Identify BLOCKs referenced by more than one
5586    NOTE_INSN_BLOCK_{BEG,END}, and create duplicate blocks. */
5587
5588 void
5589 reorder_blocks ()
5590 {
5591   tree block = DECL_INITIAL (current_function_decl);
5592   varray_type block_stack;
5593
5594   if (block == NULL_TREE)
5595     return;
5596
5597   VARRAY_TREE_INIT (block_stack, 10, "block_stack");
5598
5599   /* Prune the old trees away, so that they don't get in the way.  */
5600   BLOCK_SUBBLOCKS (block) = NULL_TREE;
5601   BLOCK_CHAIN (block) = NULL_TREE;
5602
5603   reorder_blocks_1 (get_insns (), block, &block_stack);
5604
5605   BLOCK_SUBBLOCKS (block)
5606     = blocks_nreverse (BLOCK_SUBBLOCKS (block));
5607
5608   VARRAY_FREE (block_stack);
5609 }
5610
5611 /* Helper function for reorder_blocks.  Process the insn chain beginning
5612    at INSNS.  Recurse for CALL_PLACEHOLDER insns.  */
5613
5614 static void
5615 reorder_blocks_1 (insns, current_block, p_block_stack)
5616      rtx insns;
5617      tree current_block;
5618      varray_type *p_block_stack;
5619 {
5620   rtx insn;
5621
5622   for (insn = insns; insn; insn = NEXT_INSN (insn))
5623     {
5624       if (GET_CODE (insn) == NOTE)
5625         {
5626           if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_BEG)
5627             {
5628               tree block = NOTE_BLOCK (insn);
5629               /* If we have seen this block before, copy it.  */
5630               if (TREE_ASM_WRITTEN (block))
5631                 {
5632                   block = copy_node (block);
5633                   NOTE_BLOCK (insn) = block;
5634                 }
5635               BLOCK_SUBBLOCKS (block) = 0;
5636               TREE_ASM_WRITTEN (block) = 1;
5637               BLOCK_SUPERCONTEXT (block) = current_block; 
5638               BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
5639               BLOCK_SUBBLOCKS (current_block) = block;
5640               current_block = block;
5641               VARRAY_PUSH_TREE (*p_block_stack, block);
5642             }
5643           else if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_BLOCK_END)
5644             {
5645               NOTE_BLOCK (insn) = VARRAY_TOP_TREE (*p_block_stack);
5646               VARRAY_POP (*p_block_stack);
5647               BLOCK_SUBBLOCKS (current_block)
5648                 = blocks_nreverse (BLOCK_SUBBLOCKS (current_block));
5649               current_block = BLOCK_SUPERCONTEXT (current_block);
5650             }
5651         }
5652       else if (GET_CODE (insn) == CALL_INSN
5653                && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER)
5654         {
5655           rtx cp = PATTERN (insn);
5656           reorder_blocks_1 (XEXP (cp, 0), current_block, p_block_stack);
5657           if (XEXP (cp, 1))
5658             reorder_blocks_1 (XEXP (cp, 1), current_block, p_block_stack);
5659           if (XEXP (cp, 2))
5660             reorder_blocks_1 (XEXP (cp, 2), current_block, p_block_stack);
5661         }
5662     }
5663 }
5664
5665 /* Reverse the order of elements in the chain T of blocks,
5666    and return the new head of the chain (old last element).  */
5667
5668 static tree
5669 blocks_nreverse (t)
5670      tree t;
5671 {
5672   register tree prev = 0, decl, next;
5673   for (decl = t; decl; decl = next)
5674     {
5675       next = BLOCK_CHAIN (decl);
5676       BLOCK_CHAIN (decl) = prev;
5677       prev = decl;
5678     }
5679   return prev;
5680 }
5681
5682 /* Count the subblocks of the list starting with BLOCK.  If VECTOR is
5683    non-NULL, list them all into VECTOR, in a depth-first preorder
5684    traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
5685    blocks.  */
5686
5687 static int
5688 all_blocks (block, vector)
5689      tree block;
5690      tree *vector;
5691 {
5692   int n_blocks = 0;
5693
5694   while (block)
5695     {
5696       TREE_ASM_WRITTEN (block) = 0;
5697
5698       /* Record this block.  */
5699       if (vector)
5700         vector[n_blocks] = block;
5701
5702       ++n_blocks;
5703       
5704       /* Record the subblocks, and their subblocks...  */
5705       n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
5706                               vector ? vector + n_blocks : 0);
5707       block = BLOCK_CHAIN (block);
5708     }
5709
5710   return n_blocks;
5711 }
5712
5713 /* Return a vector containing all the blocks rooted at BLOCK.  The
5714    number of elements in the vector is stored in N_BLOCKS_P.  The
5715    vector is dynamically allocated; it is the caller's responsibility
5716    to call `free' on the pointer returned.  */
5717   
5718 static tree *
5719 get_block_vector (block, n_blocks_p)
5720      tree block;
5721      int *n_blocks_p;
5722 {
5723   tree *block_vector;
5724
5725   *n_blocks_p = all_blocks (block, NULL);
5726   block_vector = (tree *) xmalloc (*n_blocks_p * sizeof (tree));
5727   all_blocks (block, block_vector);
5728
5729   return block_vector;
5730 }
5731
5732 static int next_block_index = 2;
5733
5734 /* Set BLOCK_NUMBER for all the blocks in FN.  */
5735
5736 void
5737 number_blocks (fn)
5738      tree fn;
5739 {
5740   int i;
5741   int n_blocks;
5742   tree *block_vector;
5743
5744   /* For SDB and XCOFF debugging output, we start numbering the blocks
5745      from 1 within each function, rather than keeping a running
5746      count.  */
5747 #if defined (SDB_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
5748   if (write_symbols == SDB_DEBUG || write_symbols == XCOFF_DEBUG)
5749     next_block_index = 1;
5750 #endif
5751
5752   block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
5753
5754   /* The top-level BLOCK isn't numbered at all.  */
5755   for (i = 1; i < n_blocks; ++i)
5756     /* We number the blocks from two.  */
5757     BLOCK_NUMBER (block_vector[i]) = next_block_index++;
5758
5759   free (block_vector);
5760
5761   return;
5762 }
5763
5764 \f
5765 /* Allocate a function structure and reset its contents to the defaults.  */
5766 static void
5767 prepare_function_start ()
5768 {
5769   cfun = (struct function *) xcalloc (1, sizeof (struct function));
5770
5771   init_stmt_for_function ();
5772   init_eh_for_function ();
5773
5774   cse_not_expected = ! optimize;
5775
5776   /* Caller save not needed yet.  */
5777   caller_save_needed = 0;
5778
5779   /* No stack slots have been made yet.  */
5780   stack_slot_list = 0;
5781
5782   current_function_has_nonlocal_label = 0;
5783   current_function_has_nonlocal_goto = 0;
5784
5785   /* There is no stack slot for handling nonlocal gotos.  */
5786   nonlocal_goto_handler_slots = 0;
5787   nonlocal_goto_stack_level = 0;
5788
5789   /* No labels have been declared for nonlocal use.  */
5790   nonlocal_labels = 0;
5791   nonlocal_goto_handler_labels = 0;
5792
5793   /* No function calls so far in this function.  */
5794   function_call_count = 0;
5795
5796   /* No parm regs have been allocated.
5797      (This is important for output_inline_function.)  */
5798   max_parm_reg = LAST_VIRTUAL_REGISTER + 1;
5799
5800   /* Initialize the RTL mechanism.  */
5801   init_emit ();
5802
5803   /* Initialize the queue of pending postincrement and postdecrements,
5804      and some other info in expr.c.  */
5805   init_expr ();
5806   
5807   /* We haven't done register allocation yet.  */
5808   reg_renumber = 0;
5809
5810   init_varasm_status (cfun);
5811
5812   /* Clear out data used for inlining.  */
5813   cfun->inlinable = 0;
5814   cfun->original_decl_initial = 0;
5815   cfun->original_arg_vector = 0;  
5816
5817 #ifdef STACK_BOUNDARY
5818   cfun->stack_alignment_needed = STACK_BOUNDARY;
5819   cfun->preferred_stack_boundary = STACK_BOUNDARY;
5820 #else
5821   cfun->stack_alignment_needed = 0;
5822   cfun->preferred_stack_boundary = 0;
5823 #endif
5824
5825   /* Set if a call to setjmp is seen.  */
5826   current_function_calls_setjmp = 0;
5827
5828   /* Set if a call to longjmp is seen.  */
5829   current_function_calls_longjmp = 0;
5830
5831   current_function_calls_alloca = 0;
5832   current_function_contains_functions = 0;
5833   current_function_is_leaf = 0;
5834   current_function_nothrow = 0;
5835   current_function_sp_is_unchanging = 0;
5836   current_function_uses_only_leaf_regs = 0;
5837   current_function_has_computed_jump = 0;
5838   current_function_is_thunk = 0;
5839
5840   current_function_returns_pcc_struct = 0;
5841   current_function_returns_struct = 0;
5842   current_function_epilogue_delay_list = 0;
5843   current_function_uses_const_pool = 0;
5844   current_function_uses_pic_offset_table = 0;
5845   current_function_cannot_inline = 0;
5846
5847   /* We have not yet needed to make a label to jump to for tail-recursion.  */
5848   tail_recursion_label = 0;
5849
5850   /* We haven't had a need to make a save area for ap yet.  */
5851   arg_pointer_save_area = 0;
5852
5853   /* No stack slots allocated yet.  */
5854   frame_offset = 0;
5855
5856   /* No SAVE_EXPRs in this function yet.  */
5857   save_expr_regs = 0;
5858
5859   /* No RTL_EXPRs in this function yet.  */
5860   rtl_expr_chain = 0;
5861
5862   /* Set up to allocate temporaries.  */
5863   init_temp_slots ();
5864
5865   /* Indicate that we need to distinguish between the return value of the
5866      present function and the return value of a function being called.  */
5867   rtx_equal_function_value_matters = 1;
5868
5869   /* Indicate that we have not instantiated virtual registers yet.  */
5870   virtuals_instantiated = 0;
5871
5872   /* Indicate we have no need of a frame pointer yet.  */
5873   frame_pointer_needed = 0;
5874
5875   /* By default assume not varargs or stdarg.  */
5876   current_function_varargs = 0;
5877   current_function_stdarg = 0;
5878
5879   /* We haven't made any trampolines for this function yet.  */
5880   trampoline_list = 0;
5881
5882   init_pending_stack_adjust ();
5883   inhibit_defer_pop = 0;
5884
5885   current_function_outgoing_args_size = 0;
5886
5887   if (init_lang_status)
5888     (*init_lang_status) (cfun);
5889   if (init_machine_status)
5890     (*init_machine_status) (cfun);
5891 }
5892
5893 /* Initialize the rtl expansion mechanism so that we can do simple things
5894    like generate sequences.  This is used to provide a context during global
5895    initialization of some passes.  */
5896 void
5897 init_dummy_function_start ()
5898 {
5899   prepare_function_start ();
5900 }
5901
5902 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
5903    and initialize static variables for generating RTL for the statements
5904    of the function.  */
5905
5906 void
5907 init_function_start (subr, filename, line)
5908      tree subr;
5909      const char *filename;
5910      int line;
5911 {
5912   prepare_function_start ();
5913
5914   /* Remember this function for later.  */
5915   cfun->next_global = all_functions;
5916   all_functions = cfun;
5917   
5918   current_function_name = (*decl_printable_name) (subr, 2);
5919   cfun->decl = subr;
5920
5921   /* Nonzero if this is a nested function that uses a static chain.  */
5922
5923   current_function_needs_context
5924     = (decl_function_context (current_function_decl) != 0
5925        && ! DECL_NO_STATIC_CHAIN (current_function_decl));
5926
5927   /* Within function body, compute a type's size as soon it is laid out.  */
5928   immediate_size_expand++;
5929
5930   /* Prevent ever trying to delete the first instruction of a function.
5931      Also tell final how to output a linenum before the function prologue.
5932      Note linenums could be missing, e.g. when compiling a Java .class file. */
5933   if (line > 0)
5934     emit_line_note (filename, line);
5935
5936   /* Make sure first insn is a note even if we don't want linenums.
5937      This makes sure the first insn will never be deleted.
5938      Also, final expects a note to appear there.  */
5939   emit_note (NULL_PTR, NOTE_INSN_DELETED);
5940
5941   /* Set flags used by final.c.  */
5942   if (aggregate_value_p (DECL_RESULT (subr)))
5943     {
5944 #ifdef PCC_STATIC_STRUCT_RETURN
5945       current_function_returns_pcc_struct = 1;
5946 #endif
5947       current_function_returns_struct = 1;
5948     }
5949
5950   /* Warn if this value is an aggregate type,
5951      regardless of which calling convention we are using for it.  */
5952   if (warn_aggregate_return
5953       && AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
5954     warning ("function returns an aggregate");
5955
5956   current_function_returns_pointer
5957     = POINTER_TYPE_P (TREE_TYPE (DECL_RESULT (subr)));
5958 }
5959
5960 /* Make sure all values used by the optimization passes have sane
5961    defaults.  */
5962 void
5963 init_function_for_compilation ()
5964 {
5965   reg_renumber = 0;
5966
5967   /* No prologue/epilogue insns yet.  */
5968   VARRAY_GROW (prologue, 0);
5969   VARRAY_GROW (epilogue, 0);
5970   VARRAY_GROW (sibcall_epilogue, 0);
5971 }
5972
5973 /* Indicate that the current function uses extra args
5974    not explicitly mentioned in the argument list in any fashion.  */
5975
5976 void
5977 mark_varargs ()
5978 {
5979   current_function_varargs = 1;
5980 }
5981
5982 /* Expand a call to __main at the beginning of a possible main function.  */
5983
5984 #if defined(INIT_SECTION_ASM_OP) && !defined(INVOKE__main)
5985 #undef HAS_INIT_SECTION
5986 #define HAS_INIT_SECTION
5987 #endif
5988
5989 void
5990 expand_main_function ()
5991 {
5992 #if !defined (HAS_INIT_SECTION)
5993   emit_library_call (gen_rtx_SYMBOL_REF (Pmode, NAME__MAIN), 0,
5994                      VOIDmode, 0);
5995 #endif /* not HAS_INIT_SECTION */
5996 }
5997 \f
5998 extern struct obstack permanent_obstack;
5999
6000 /* Start the RTL for a new function, and set variables used for
6001    emitting RTL.
6002    SUBR is the FUNCTION_DECL node.
6003    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
6004    the function's parameters, which must be run at any return statement.  */
6005
6006 void
6007 expand_function_start (subr, parms_have_cleanups)
6008      tree subr;
6009      int parms_have_cleanups;
6010 {
6011   tree tem;
6012   rtx last_ptr = NULL_RTX;
6013
6014   /* Make sure volatile mem refs aren't considered
6015      valid operands of arithmetic insns.  */
6016   init_recog_no_volatile ();
6017
6018   /* Set this before generating any memory accesses.  */
6019   current_function_check_memory_usage
6020     = (flag_check_memory_usage
6021        && ! DECL_NO_CHECK_MEMORY_USAGE (current_function_decl));
6022
6023   current_function_instrument_entry_exit
6024     = (flag_instrument_function_entry_exit
6025        && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
6026
6027   current_function_limit_stack
6028     = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
6029
6030   /* If function gets a static chain arg, store it in the stack frame.
6031      Do this first, so it gets the first stack slot offset.  */
6032   if (current_function_needs_context)
6033     {
6034       last_ptr = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
6035
6036       /* Delay copying static chain if it is not a register to avoid
6037          conflicts with regs used for parameters.  */
6038       if (! SMALL_REGISTER_CLASSES
6039           || GET_CODE (static_chain_incoming_rtx) == REG)
6040         emit_move_insn (last_ptr, static_chain_incoming_rtx);
6041     }
6042
6043   /* If the parameters of this function need cleaning up, get a label
6044      for the beginning of the code which executes those cleanups.  This must
6045      be done before doing anything with return_label.  */
6046   if (parms_have_cleanups)
6047     cleanup_label = gen_label_rtx ();
6048   else
6049     cleanup_label = 0;
6050
6051   /* Make the label for return statements to jump to, if this machine
6052      does not have a one-instruction return and uses an epilogue,
6053      or if it returns a structure, or if it has parm cleanups.  */
6054 #ifdef HAVE_return
6055   if (cleanup_label == 0 && HAVE_return
6056       && ! current_function_instrument_entry_exit
6057       && ! current_function_returns_pcc_struct
6058       && ! (current_function_returns_struct && ! optimize))
6059     return_label = 0;
6060   else
6061     return_label = gen_label_rtx ();
6062 #else
6063   return_label = gen_label_rtx ();
6064 #endif
6065
6066   /* Initialize rtx used to return the value.  */
6067   /* Do this before assign_parms so that we copy the struct value address
6068      before any library calls that assign parms might generate.  */
6069
6070   /* Decide whether to return the value in memory or in a register.  */
6071   if (aggregate_value_p (DECL_RESULT (subr)))
6072     {
6073       /* Returning something that won't go in a register.  */
6074       register rtx value_address = 0;
6075
6076 #ifdef PCC_STATIC_STRUCT_RETURN
6077       if (current_function_returns_pcc_struct)
6078         {
6079           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
6080           value_address = assemble_static_space (size);
6081         }
6082       else
6083 #endif
6084         {
6085           /* Expect to be passed the address of a place to store the value.
6086              If it is passed as an argument, assign_parms will take care of
6087              it.  */
6088           if (struct_value_incoming_rtx)
6089             {
6090               value_address = gen_reg_rtx (Pmode);
6091               emit_move_insn (value_address, struct_value_incoming_rtx);
6092             }
6093         }
6094       if (value_address)
6095         {
6096           DECL_RTL (DECL_RESULT (subr))
6097             = gen_rtx_MEM (DECL_MODE (DECL_RESULT (subr)), value_address);
6098           set_mem_attributes (DECL_RTL (DECL_RESULT (subr)),
6099                               DECL_RESULT (subr), 1);
6100         }
6101     }
6102   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
6103     /* If return mode is void, this decl rtl should not be used.  */
6104     DECL_RTL (DECL_RESULT (subr)) = 0;
6105   else if (parms_have_cleanups || current_function_instrument_entry_exit)
6106     {
6107       /* If function will end with cleanup code for parms,
6108          compute the return values into a pseudo reg,
6109          which we will copy into the true return register
6110          after the cleanups are done.  */
6111
6112       enum machine_mode mode = DECL_MODE (DECL_RESULT (subr));
6113
6114 #ifdef PROMOTE_FUNCTION_RETURN
6115       tree type = TREE_TYPE (DECL_RESULT (subr));
6116       int unsignedp = TREE_UNSIGNED (type);
6117
6118       mode = promote_mode (type, mode, &unsignedp, 1);
6119 #endif
6120
6121       DECL_RTL (DECL_RESULT (subr)) = gen_reg_rtx (mode);
6122     }
6123   else
6124     /* Scalar, returned in a register.  */
6125     {
6126       DECL_RTL (DECL_RESULT (subr))
6127         = hard_function_value (TREE_TYPE (DECL_RESULT (subr)), subr, 1);
6128
6129       /* Mark this reg as the function's return value.  */
6130       if (GET_CODE (DECL_RTL (DECL_RESULT (subr))) == REG)
6131         {
6132           REG_FUNCTION_VALUE_P (DECL_RTL (DECL_RESULT (subr))) = 1;
6133           /* Needed because we may need to move this to memory
6134              in case it's a named return value whose address is taken.  */
6135           DECL_REGISTER (DECL_RESULT (subr)) = 1;
6136         }
6137     }
6138
6139   /* Initialize rtx for parameters and local variables.
6140      In some cases this requires emitting insns.  */
6141
6142   assign_parms (subr);
6143
6144   /* Copy the static chain now if it wasn't a register.  The delay is to
6145      avoid conflicts with the parameter passing registers.  */
6146
6147   if (SMALL_REGISTER_CLASSES && current_function_needs_context)
6148       if (GET_CODE (static_chain_incoming_rtx) != REG)
6149         emit_move_insn (last_ptr, static_chain_incoming_rtx);
6150
6151   /* The following was moved from init_function_start.
6152      The move is supposed to make sdb output more accurate.  */
6153   /* Indicate the beginning of the function body,
6154      as opposed to parm setup.  */
6155   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_BEG);
6156
6157   if (GET_CODE (get_last_insn ()) != NOTE)
6158     emit_note (NULL_PTR, NOTE_INSN_DELETED);
6159   parm_birth_insn = get_last_insn ();
6160
6161   context_display = 0;
6162   if (current_function_needs_context)
6163     {
6164       /* Fetch static chain values for containing functions.  */
6165       tem = decl_function_context (current_function_decl);
6166       /* Copy the static chain pointer into a pseudo.  If we have
6167          small register classes, copy the value from memory if
6168          static_chain_incoming_rtx is a REG.  */
6169       if (tem)
6170         {
6171           /* If the static chain originally came in a register, put it back
6172              there, then move it out in the next insn.  The reason for
6173              this peculiar code is to satisfy function integration.  */
6174           if (SMALL_REGISTER_CLASSES
6175               && GET_CODE (static_chain_incoming_rtx) == REG)
6176             emit_move_insn (static_chain_incoming_rtx, last_ptr);
6177           last_ptr = copy_to_reg (static_chain_incoming_rtx);
6178         }
6179
6180       while (tem)
6181         {
6182           tree rtlexp = make_node (RTL_EXPR);
6183
6184           RTL_EXPR_RTL (rtlexp) = last_ptr;
6185           context_display = tree_cons (tem, rtlexp, context_display);
6186           tem = decl_function_context (tem);
6187           if (tem == 0)
6188             break;
6189           /* Chain thru stack frames, assuming pointer to next lexical frame
6190              is found at the place we always store it.  */
6191 #ifdef FRAME_GROWS_DOWNWARD
6192           last_ptr = plus_constant (last_ptr, - GET_MODE_SIZE (Pmode));
6193 #endif
6194           last_ptr = gen_rtx_MEM (Pmode, memory_address (Pmode, last_ptr));
6195           MEM_ALIAS_SET (last_ptr) = get_frame_alias_set ();
6196           last_ptr = copy_to_reg (last_ptr);
6197
6198           /* If we are not optimizing, ensure that we know that this
6199              piece of context is live over the entire function.  */
6200           if (! optimize)
6201             save_expr_regs = gen_rtx_EXPR_LIST (VOIDmode, last_ptr,
6202                                                 save_expr_regs);
6203         }
6204     }
6205
6206   if (current_function_instrument_entry_exit)
6207     {
6208       rtx fun = DECL_RTL (current_function_decl);
6209       if (GET_CODE (fun) == MEM)
6210         fun = XEXP (fun, 0);
6211       else
6212         abort ();
6213       emit_library_call (profile_function_entry_libfunc, 0, VOIDmode, 2,
6214                          fun, Pmode,
6215                          expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
6216                                                      0,
6217                                                      hard_frame_pointer_rtx),
6218                          Pmode);
6219     }
6220
6221   /* After the display initializations is where the tail-recursion label
6222      should go, if we end up needing one.   Ensure we have a NOTE here
6223      since some things (like trampolines) get placed before this.  */
6224   tail_recursion_reentry = emit_note (NULL_PTR, NOTE_INSN_DELETED);
6225
6226   /* Evaluate now the sizes of any types declared among the arguments.  */
6227   for (tem = nreverse (get_pending_sizes ()); tem; tem = TREE_CHAIN (tem))
6228     {
6229       expand_expr (TREE_VALUE (tem), const0_rtx, VOIDmode,
6230                    EXPAND_MEMORY_USE_BAD);
6231       /* Flush the queue in case this parameter declaration has
6232          side-effects.  */
6233       emit_queue ();
6234     }
6235
6236   /* Make sure there is a line number after the function entry setup code.  */
6237   force_next_line_note ();
6238 }
6239 \f
6240 /* Undo the effects of init_dummy_function_start.  */
6241 void
6242 expand_dummy_function_end ()
6243 {
6244   /* End any sequences that failed to be closed due to syntax errors.  */
6245   while (in_sequence_p ())
6246     end_sequence ();
6247
6248   /* Outside function body, can't compute type's actual size
6249      until next function's body starts.  */
6250
6251   free_after_parsing (cfun);
6252   free_after_compilation (cfun);
6253   free (cfun);
6254   cfun = 0;
6255 }
6256
6257 /* Call DOIT for each hard register used as a return value from
6258    the current function.  */
6259
6260 void
6261 diddle_return_value (doit, arg)
6262      void (*doit) PARAMS ((rtx, void *));
6263      void *arg;
6264 {
6265   rtx outgoing = current_function_return_rtx;
6266   int pcc;
6267
6268   if (! outgoing)
6269     return;
6270
6271   pcc = (current_function_returns_struct
6272          || current_function_returns_pcc_struct);
6273
6274   if ((GET_CODE (outgoing) == REG
6275        && REGNO (outgoing) >= FIRST_PSEUDO_REGISTER)
6276       || pcc)
6277     {
6278       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
6279
6280       /* A PCC-style return returns a pointer to the memory in which
6281          the structure is stored.  */
6282       if (pcc)
6283         type = build_pointer_type (type);
6284
6285 #ifdef FUNCTION_OUTGOING_VALUE
6286       outgoing = FUNCTION_OUTGOING_VALUE (type, current_function_decl);
6287 #else
6288       outgoing = FUNCTION_VALUE (type, current_function_decl);
6289 #endif
6290       /* If this is a BLKmode structure being returned in registers, then use
6291          the mode computed in expand_return.  */
6292       if (GET_MODE (outgoing) == BLKmode)
6293         PUT_MODE (outgoing,
6294                   GET_MODE (DECL_RTL (DECL_RESULT (current_function_decl))));
6295       REG_FUNCTION_VALUE_P (outgoing) = 1;
6296     }
6297
6298   if (GET_CODE (outgoing) == REG)
6299     (*doit) (outgoing, arg);
6300   else if (GET_CODE (outgoing) == PARALLEL)
6301     {
6302       int i;
6303
6304       for (i = 0; i < XVECLEN (outgoing, 0); i++)
6305         {
6306           rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
6307
6308           if (GET_CODE (x) == REG && REGNO (x) < FIRST_PSEUDO_REGISTER)
6309             (*doit) (x, arg);
6310         }
6311     }
6312 }
6313
6314 static void
6315 do_clobber_return_reg (reg, arg)
6316      rtx reg;
6317      void *arg ATTRIBUTE_UNUSED;
6318 {
6319   emit_insn (gen_rtx_CLOBBER (VOIDmode, reg));
6320 }
6321
6322 void
6323 clobber_return_register ()
6324 {
6325   diddle_return_value (do_clobber_return_reg, NULL);
6326 }
6327
6328 static void
6329 do_use_return_reg (reg, arg)
6330      rtx reg;
6331      void *arg ATTRIBUTE_UNUSED;
6332 {
6333   emit_insn (gen_rtx_USE (VOIDmode, reg));
6334 }
6335
6336 void
6337 use_return_register ()
6338 {
6339   diddle_return_value (do_use_return_reg, NULL);
6340 }
6341
6342 /* Generate RTL for the end of the current function.
6343    FILENAME and LINE are the current position in the source file. 
6344
6345    It is up to language-specific callers to do cleanups for parameters--
6346    or else, supply 1 for END_BINDINGS and we will call expand_end_bindings.  */
6347
6348 void
6349 expand_function_end (filename, line, end_bindings)
6350      const char *filename;
6351      int line;
6352      int end_bindings;
6353 {
6354   tree link;
6355
6356 #ifdef TRAMPOLINE_TEMPLATE
6357   static rtx initial_trampoline;
6358 #endif
6359
6360   finish_expr_for_function ();
6361
6362 #ifdef NON_SAVING_SETJMP
6363   /* Don't put any variables in registers if we call setjmp
6364      on a machine that fails to restore the registers.  */
6365   if (NON_SAVING_SETJMP && current_function_calls_setjmp)
6366     {
6367       if (DECL_INITIAL (current_function_decl) != error_mark_node)
6368         setjmp_protect (DECL_INITIAL (current_function_decl));
6369
6370       setjmp_protect_args ();
6371     }
6372 #endif
6373
6374   /* Save the argument pointer if a save area was made for it.  */
6375   if (arg_pointer_save_area)
6376     {
6377       /* arg_pointer_save_area may not be a valid memory address, so we
6378          have to check it and fix it if necessary.  */
6379       rtx seq;
6380       start_sequence ();
6381       emit_move_insn (validize_mem (arg_pointer_save_area),
6382                       virtual_incoming_args_rtx);
6383       seq = gen_sequence ();
6384       end_sequence ();
6385       emit_insn_before (seq, tail_recursion_reentry);
6386     }
6387
6388   /* Initialize any trampolines required by this function.  */
6389   for (link = trampoline_list; link; link = TREE_CHAIN (link))
6390     {
6391       tree function = TREE_PURPOSE (link);
6392       rtx context ATTRIBUTE_UNUSED = lookup_static_chain (function);
6393       rtx tramp = RTL_EXPR_RTL (TREE_VALUE (link));
6394 #ifdef TRAMPOLINE_TEMPLATE
6395       rtx blktramp;
6396 #endif
6397       rtx seq;
6398
6399 #ifdef TRAMPOLINE_TEMPLATE
6400       /* First make sure this compilation has a template for
6401          initializing trampolines.  */
6402       if (initial_trampoline == 0)
6403         {
6404           end_temporary_allocation ();
6405           initial_trampoline
6406             = gen_rtx_MEM (BLKmode, assemble_trampoline_template ());
6407           resume_temporary_allocation ();
6408
6409           ggc_add_rtx_root (&initial_trampoline, 1);
6410         }
6411 #endif
6412
6413       /* Generate insns to initialize the trampoline.  */
6414       start_sequence ();
6415       tramp = round_trampoline_addr (XEXP (tramp, 0));
6416 #ifdef TRAMPOLINE_TEMPLATE
6417       blktramp = change_address (initial_trampoline, BLKmode, tramp);
6418       emit_block_move (blktramp, initial_trampoline,
6419                        GEN_INT (TRAMPOLINE_SIZE),
6420                        TRAMPOLINE_ALIGNMENT);
6421 #endif
6422       INITIALIZE_TRAMPOLINE (tramp, XEXP (DECL_RTL (function), 0), context);
6423       seq = get_insns ();
6424       end_sequence ();
6425
6426       /* Put those insns at entry to the containing function (this one).  */
6427       emit_insns_before (seq, tail_recursion_reentry);
6428     }
6429
6430   /* If we are doing stack checking and this function makes calls,
6431      do a stack probe at the start of the function to ensure we have enough
6432      space for another stack frame.  */
6433   if (flag_stack_check && ! STACK_CHECK_BUILTIN)
6434     {
6435       rtx insn, seq;
6436
6437       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6438         if (GET_CODE (insn) == CALL_INSN)
6439           {
6440             start_sequence ();
6441             probe_stack_range (STACK_CHECK_PROTECT,
6442                                GEN_INT (STACK_CHECK_MAX_FRAME_SIZE));
6443             seq = get_insns ();
6444             end_sequence ();
6445             emit_insns_before (seq, tail_recursion_reentry);
6446             break;
6447           }
6448     }
6449
6450   /* Warn about unused parms if extra warnings were specified.  */
6451   /* Either ``-W -Wunused'' or ``-Wunused-parameter'' enables this
6452      warning.  WARN_UNUSED_PARAMETER is negative when set by
6453      -Wunused. */
6454   if (warn_unused_parameter > 0
6455       || (warn_unused_parameter < 0 && extra_warnings))
6456     {
6457       tree decl;
6458
6459       for (decl = DECL_ARGUMENTS (current_function_decl);
6460            decl; decl = TREE_CHAIN (decl))
6461         if (! TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
6462             && DECL_NAME (decl) && ! DECL_ARTIFICIAL (decl))
6463           warning_with_decl (decl, "unused parameter `%s'");
6464     }
6465
6466   /* Delete handlers for nonlocal gotos if nothing uses them.  */
6467   if (nonlocal_goto_handler_slots != 0
6468       && ! current_function_has_nonlocal_label)
6469     delete_handlers ();
6470
6471   /* End any sequences that failed to be closed due to syntax errors.  */
6472   while (in_sequence_p ())
6473     end_sequence ();
6474
6475   /* Outside function body, can't compute type's actual size
6476      until next function's body starts.  */
6477   immediate_size_expand--;
6478
6479   clear_pending_stack_adjust ();
6480   do_pending_stack_adjust ();
6481
6482   /* Mark the end of the function body.
6483      If control reaches this insn, the function can drop through
6484      without returning a value.  */
6485   emit_note (NULL_PTR, NOTE_INSN_FUNCTION_END);
6486
6487   /* Must mark the last line number note in the function, so that the test
6488      coverage code can avoid counting the last line twice.  This just tells
6489      the code to ignore the immediately following line note, since there
6490      already exists a copy of this note somewhere above.  This line number
6491      note is still needed for debugging though, so we can't delete it.  */
6492   if (flag_test_coverage)
6493     emit_note (NULL_PTR, NOTE_INSN_REPEATED_LINE_NUMBER);
6494
6495   /* Output a linenumber for the end of the function.
6496      SDB depends on this.  */
6497   emit_line_note_force (filename, line);
6498
6499   /* Output the label for the actual return from the function,
6500      if one is expected.  This happens either because a function epilogue
6501      is used instead of a return instruction, or because a return was done
6502      with a goto in order to run local cleanups, or because of pcc-style
6503      structure returning.  */
6504
6505   if (return_label)
6506     {
6507       /* Before the return label, clobber the return registers so that
6508          they are not propogated live to the rest of the function.  This
6509          can only happen with functions that drop through; if there had
6510          been a return statement, there would have either been a return
6511          rtx, or a jump to the return label.  */
6512       clobber_return_register ();
6513
6514       emit_label (return_label);
6515     }
6516
6517   /* C++ uses this.  */
6518   if (end_bindings)
6519     expand_end_bindings (0, 0, 0);
6520
6521   /* Now handle any leftover exception regions that may have been
6522      created for the parameters.  */
6523   {
6524     rtx last = get_last_insn ();
6525     rtx label;
6526
6527     expand_leftover_cleanups ();
6528
6529     /* If there are any catch_clauses remaining, output them now.  */
6530     emit_insns (catch_clauses);
6531     catch_clauses = catch_clauses_last = NULL_RTX;
6532     /* If the above emitted any code, may sure we jump around it.  */
6533     if (last != get_last_insn ())
6534       {
6535         label = gen_label_rtx ();
6536         last = emit_jump_insn_after (gen_jump (label), last);
6537         last = emit_barrier_after (last);
6538         emit_label (label);
6539       }
6540   }
6541
6542   if (current_function_instrument_entry_exit)
6543     {
6544       rtx fun = DECL_RTL (current_function_decl);
6545       if (GET_CODE (fun) == MEM)
6546         fun = XEXP (fun, 0);
6547       else
6548         abort ();
6549       emit_library_call (profile_function_exit_libfunc, 0, VOIDmode, 2,
6550                          fun, Pmode,
6551                          expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
6552                                                      0,
6553                                                      hard_frame_pointer_rtx),
6554                          Pmode);
6555     }
6556
6557   /* If we had calls to alloca, and this machine needs
6558      an accurate stack pointer to exit the function,
6559      insert some code to save and restore the stack pointer.  */
6560 #ifdef EXIT_IGNORE_STACK
6561   if (! EXIT_IGNORE_STACK)
6562 #endif
6563     if (current_function_calls_alloca)
6564       {
6565         rtx tem = 0;
6566
6567         emit_stack_save (SAVE_FUNCTION, &tem, parm_birth_insn);
6568         emit_stack_restore (SAVE_FUNCTION, tem, NULL_RTX);
6569       }
6570
6571   /* If scalar return value was computed in a pseudo-reg,
6572      copy that to the hard return register.  */
6573   if (DECL_RTL (DECL_RESULT (current_function_decl)) != 0
6574       && GET_CODE (DECL_RTL (DECL_RESULT (current_function_decl))) == REG
6575       && (REGNO (DECL_RTL (DECL_RESULT (current_function_decl)))
6576           >= FIRST_PSEUDO_REGISTER))
6577     {
6578       rtx real_decl_result;
6579
6580 #ifdef FUNCTION_OUTGOING_VALUE
6581       real_decl_result
6582         = FUNCTION_OUTGOING_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
6583                                    current_function_decl);
6584 #else
6585       real_decl_result
6586         = FUNCTION_VALUE (TREE_TYPE (DECL_RESULT (current_function_decl)),
6587                           current_function_decl);
6588 #endif
6589       REG_FUNCTION_VALUE_P (real_decl_result) = 1;
6590       /* If this is a BLKmode structure being returned in registers, then use
6591          the mode computed in expand_return.  */
6592       if (GET_MODE (real_decl_result) == BLKmode)
6593         PUT_MODE (real_decl_result,
6594                   GET_MODE (DECL_RTL (DECL_RESULT (current_function_decl))));
6595       emit_move_insn (real_decl_result,
6596                       DECL_RTL (DECL_RESULT (current_function_decl)));
6597
6598       /* The delay slot scheduler assumes that current_function_return_rtx
6599          holds the hard register containing the return value, not a temporary
6600          pseudo.  */
6601       current_function_return_rtx = real_decl_result;
6602     }
6603
6604   /* If returning a structure, arrange to return the address of the value
6605      in a place where debuggers expect to find it.
6606
6607      If returning a structure PCC style,
6608      the caller also depends on this value.
6609      And current_function_returns_pcc_struct is not necessarily set.  */
6610   if (current_function_returns_struct
6611       || current_function_returns_pcc_struct)
6612     {
6613       rtx value_address = XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
6614       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
6615 #ifdef FUNCTION_OUTGOING_VALUE
6616       rtx outgoing
6617         = FUNCTION_OUTGOING_VALUE (build_pointer_type (type),
6618                                    current_function_decl);
6619 #else
6620       rtx outgoing
6621         = FUNCTION_VALUE (build_pointer_type (type),
6622                           current_function_decl);
6623 #endif
6624
6625       /* Mark this as a function return value so integrate will delete the
6626          assignment and USE below when inlining this function.  */
6627       REG_FUNCTION_VALUE_P (outgoing) = 1;
6628
6629       emit_move_insn (outgoing, value_address);
6630     }
6631
6632   /* ??? This should no longer be necessary since stupid is no longer with
6633      us, but there are some parts of the compiler (eg reload_combine, and
6634      sh mach_dep_reorg) that still try and compute their own lifetime info
6635      instead of using the general framework.  */
6636   use_return_register ();
6637
6638   /* If this is an implementation of __throw, do what's necessary to 
6639      communicate between __builtin_eh_return and the epilogue.  */
6640   expand_eh_return ();
6641
6642   /* Output a return insn if we are using one.
6643      Otherwise, let the rtl chain end here, to drop through
6644      into the epilogue.  */
6645
6646 #ifdef HAVE_return
6647   if (HAVE_return)
6648     {
6649       emit_jump_insn (gen_return ());
6650       emit_barrier ();
6651     }
6652 #endif
6653
6654   /* Fix up any gotos that jumped out to the outermost
6655      binding level of the function.
6656      Must follow emitting RETURN_LABEL.  */
6657
6658   /* If you have any cleanups to do at this point,
6659      and they need to create temporary variables,
6660      then you will lose.  */
6661   expand_fixups (get_insns ());
6662 }
6663 \f
6664 /* Extend a vector that records the INSN_UIDs of INSNS (either a
6665    sequence or a single insn).  */
6666
6667 static void
6668 record_insns (insns, vecp)
6669      rtx insns;
6670      varray_type *vecp;
6671 {
6672   if (GET_CODE (insns) == SEQUENCE)
6673     {
6674       int len = XVECLEN (insns, 0);
6675       int i = VARRAY_SIZE (*vecp);
6676
6677       VARRAY_GROW (*vecp, i + len);
6678       while (--len >= 0)
6679         {
6680           VARRAY_INT (*vecp, i) = INSN_UID (XVECEXP (insns, 0, len));
6681           ++i;
6682         }
6683     }
6684   else
6685     {
6686       int i = VARRAY_SIZE (*vecp);
6687       VARRAY_GROW (*vecp, i + 1);
6688       VARRAY_INT (*vecp, i) = INSN_UID (insns);
6689     }
6690 }
6691
6692 /* Determine how many INSN_UIDs in VEC are part of INSN.  */
6693
6694 static int
6695 contains (insn, vec)
6696      rtx insn;
6697      varray_type vec;
6698 {
6699   register int i, j;
6700
6701   if (GET_CODE (insn) == INSN
6702       && GET_CODE (PATTERN (insn)) == SEQUENCE)
6703     {
6704       int count = 0;
6705       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
6706         for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
6707           if (INSN_UID (XVECEXP (PATTERN (insn), 0, i)) == VARRAY_INT (vec, j))
6708             count++;
6709       return count;
6710     }
6711   else
6712     {
6713       for (j = VARRAY_SIZE (vec) - 1; j >= 0; --j)
6714         if (INSN_UID (insn) == VARRAY_INT (vec, j))
6715           return 1;
6716     }
6717   return 0;
6718 }
6719
6720 int
6721 prologue_epilogue_contains (insn)
6722      rtx insn;
6723 {
6724   if (contains (insn, prologue))
6725     return 1;
6726   if (contains (insn, epilogue))
6727     return 1;
6728   return 0;
6729 }
6730
6731 int
6732 sibcall_epilogue_contains (insn)
6733       rtx insn;
6734 {
6735   if (sibcall_epilogue)
6736     return contains (insn, sibcall_epilogue);
6737   return 0;
6738 }
6739
6740 #ifdef HAVE_return
6741 /* Insert gen_return at the end of block BB.  This also means updating
6742    block_for_insn appropriately.  */
6743
6744 static void
6745 emit_return_into_block (bb, line_note)
6746      basic_block bb;
6747      rtx line_note;
6748 {
6749   rtx p, end;
6750
6751   p = NEXT_INSN (bb->end); 
6752   end = emit_jump_insn_after (gen_return (), bb->end);
6753   if (line_note)
6754     emit_line_note_after (NOTE_SOURCE_FILE (line_note),
6755                           NOTE_LINE_NUMBER (line_note), bb->end);
6756
6757   while (1)
6758     {
6759       set_block_for_insn (p, bb);
6760       if (p == bb->end)
6761         break;
6762       p = PREV_INSN (p);
6763     }
6764   bb->end = end;
6765 }
6766 #endif /* HAVE_return */
6767
6768 /* Generate the prologue and epilogue RTL if the machine supports it.  Thread
6769    this into place with notes indicating where the prologue ends and where
6770    the epilogue begins.  Update the basic block information when possible.  */
6771
6772 void
6773 thread_prologue_and_epilogue_insns (f)
6774      rtx f ATTRIBUTE_UNUSED;
6775 {
6776   int inserted = 0;
6777   edge e;
6778   rtx seq;
6779 #ifdef HAVE_prologue
6780   rtx prologue_end = NULL_RTX;
6781 #endif
6782 #if defined (HAVE_epilogue) || defined(HAVE_return)
6783   rtx epilogue_end = NULL_RTX;
6784 #endif
6785
6786 #ifdef HAVE_prologue
6787   if (HAVE_prologue)
6788     {
6789       start_sequence ();
6790       seq = gen_prologue();
6791       emit_insn (seq);
6792
6793       /* Retain a map of the prologue insns.  */
6794       if (GET_CODE (seq) != SEQUENCE)
6795         seq = get_insns ();
6796       record_insns (seq, &prologue);
6797       prologue_end = emit_note (NULL, NOTE_INSN_PROLOGUE_END);
6798
6799       seq = gen_sequence ();
6800       end_sequence ();
6801
6802       /* If optimization is off, and perhaps in an empty function,
6803          the entry block will have no successors.  */
6804       if (ENTRY_BLOCK_PTR->succ)
6805         {
6806           /* Can't deal with multiple successsors of the entry block.  */
6807           if (ENTRY_BLOCK_PTR->succ->succ_next)
6808             abort ();
6809
6810           insert_insn_on_edge (seq, ENTRY_BLOCK_PTR->succ);
6811           inserted = 1;
6812         }
6813       else
6814         emit_insn_after (seq, f);
6815     }
6816 #endif
6817
6818   /* If the exit block has no non-fake predecessors, we don't need
6819      an epilogue.  */
6820   for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
6821     if ((e->flags & EDGE_FAKE) == 0)
6822       break;
6823   if (e == NULL)
6824     goto epilogue_done;
6825
6826 #ifdef HAVE_return
6827   if (optimize && HAVE_return)
6828     {
6829       /* If we're allowed to generate a simple return instruction,
6830          then by definition we don't need a full epilogue.  Examine
6831          the block that falls through to EXIT.   If it does not 
6832          contain any code, examine its predecessors and try to 
6833          emit (conditional) return instructions.  */
6834
6835       basic_block last;
6836       edge e_next;
6837       rtx label;
6838
6839       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
6840         if (e->flags & EDGE_FALLTHRU)
6841           break;
6842       if (e == NULL)
6843         goto epilogue_done;
6844       last = e->src;
6845
6846       /* Verify that there are no active instructions in the last block.  */
6847       label = last->end;
6848       while (label && GET_CODE (label) != CODE_LABEL)
6849         {
6850           if (active_insn_p (label))
6851             break;
6852           label = PREV_INSN (label);
6853         }
6854
6855       if (last->head == label && GET_CODE (label) == CODE_LABEL)
6856         {
6857           rtx epilogue_line_note = NULL_RTX;
6858
6859           /* Locate the line number associated with the closing brace,
6860              if we can find one.  */
6861           for (seq = get_last_insn ();
6862                seq && ! active_insn_p (seq);
6863                seq = PREV_INSN (seq))
6864             if (GET_CODE (seq) == NOTE && NOTE_LINE_NUMBER (seq) > 0)
6865               {
6866                 epilogue_line_note = seq;
6867                 break;
6868               }
6869
6870           for (e = last->pred; e ; e = e_next)
6871             {
6872               basic_block bb = e->src;
6873               rtx jump;
6874
6875               e_next = e->pred_next;
6876               if (bb == ENTRY_BLOCK_PTR)
6877                 continue;
6878
6879               jump = bb->end;
6880               if ((GET_CODE (jump) != JUMP_INSN) || JUMP_LABEL (jump) != label)
6881                 continue;
6882
6883               /* If we have an unconditional jump, we can replace that
6884                  with a simple return instruction.  */
6885               if (simplejump_p (jump))
6886                 {
6887                   emit_return_into_block (bb, epilogue_line_note);
6888                   flow_delete_insn (jump);
6889                 }
6890
6891               /* If we have a conditional jump, we can try to replace
6892                  that with a conditional return instruction.  */
6893               else if (condjump_p (jump))
6894                 {
6895                   rtx ret, *loc;
6896
6897                   ret = SET_SRC (PATTERN (jump));
6898                   if (GET_CODE (XEXP (ret, 1)) == LABEL_REF)
6899                     loc = &XEXP (ret, 1);
6900                   else
6901                     loc = &XEXP (ret, 2);
6902                   ret = gen_rtx_RETURN (VOIDmode);
6903
6904                   if (! validate_change (jump, loc, ret, 0))
6905                     continue;
6906                   if (JUMP_LABEL (jump))
6907                     LABEL_NUSES (JUMP_LABEL (jump))--;
6908                                   
6909                   /* If this block has only one successor, it both jumps
6910                      and falls through to the fallthru block, so we can't
6911                      delete the edge.  */
6912                   if (bb->succ->succ_next == NULL)
6913                     continue;
6914                 }
6915               else
6916                 continue;
6917
6918               /* Fix up the CFG for the successful change we just made.  */
6919               redirect_edge_succ (e, EXIT_BLOCK_PTR);
6920             }
6921
6922           /* Emit a return insn for the exit fallthru block.  Whether
6923              this is still reachable will be determined later.  */
6924
6925           emit_barrier_after (last->end);
6926           emit_return_into_block (last, epilogue_line_note);
6927           epilogue_end = last->end;
6928           goto epilogue_done;
6929         }
6930     }
6931 #endif
6932 #ifdef HAVE_epilogue
6933   if (HAVE_epilogue)
6934     {
6935       /* Find the edge that falls through to EXIT.  Other edges may exist
6936          due to RETURN instructions, but those don't need epilogues.
6937          There really shouldn't be a mixture -- either all should have
6938          been converted or none, however...  */
6939
6940       for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
6941         if (e->flags & EDGE_FALLTHRU)
6942           break;
6943       if (e == NULL)
6944         goto epilogue_done;
6945
6946       start_sequence ();
6947       epilogue_end = emit_note (NULL, NOTE_INSN_EPILOGUE_BEG);
6948
6949       seq = gen_epilogue ();
6950       emit_jump_insn (seq);
6951
6952       /* Retain a map of the epilogue insns.  */
6953       if (GET_CODE (seq) != SEQUENCE)
6954         seq = get_insns ();
6955       record_insns (seq, &epilogue);
6956
6957       seq = gen_sequence ();
6958       end_sequence();
6959
6960       insert_insn_on_edge (seq, e);
6961       inserted = 1;
6962     }
6963 #endif
6964 epilogue_done:
6965
6966   if (inserted)
6967     commit_edge_insertions ();
6968
6969 #ifdef HAVE_sibcall_epilogue
6970   /* Emit sibling epilogues before any sibling call sites.  */
6971   for (e = EXIT_BLOCK_PTR->pred; e ; e = e->pred_next)
6972     {
6973       basic_block bb = e->src;
6974       rtx insn = bb->end;
6975       rtx i;
6976       rtx newinsn;
6977
6978       if (GET_CODE (insn) != CALL_INSN
6979           || ! SIBLING_CALL_P (insn))
6980         continue;
6981
6982       start_sequence ();
6983       seq = gen_sibcall_epilogue ();
6984       end_sequence ();
6985
6986       i = PREV_INSN (insn);
6987       newinsn = emit_insn_before (seq, insn);
6988
6989       /* Update the UID to basic block map.  */
6990       for (i = NEXT_INSN (i); i != insn; i = NEXT_INSN (i))
6991         set_block_for_insn (i, bb);
6992
6993       /* Retain a map of the epilogue insns.  Used in life analysis to
6994          avoid getting rid of sibcall epilogue insns.  */
6995       record_insns (GET_CODE (seq) == SEQUENCE
6996                     ? seq : newinsn, &sibcall_epilogue);
6997     }
6998 #endif
6999
7000 #ifdef HAVE_prologue
7001   if (prologue_end)
7002     {
7003       rtx insn, prev;
7004
7005       /* GDB handles `break f' by setting a breakpoint on the first
7006          line note after the prologue.  Which means (1) that if
7007          there are line number notes before where we inserted the
7008          prologue we should move them, and (2) we should generate a
7009          note before the end of the first basic block, if there isn't
7010          one already there.  */
7011
7012       for (insn = prologue_end; insn ; insn = prev)
7013         {
7014           prev = PREV_INSN (insn);
7015           if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
7016             {
7017               /* Note that we cannot reorder the first insn in the
7018                  chain, since rest_of_compilation relies on that
7019                  remaining constant.  */
7020               if (prev == NULL)
7021                 break;
7022               reorder_insns (insn, insn, prologue_end);
7023             }
7024         }
7025
7026       /* Find the last line number note in the first block.  */
7027       for (insn = BASIC_BLOCK (0)->end;
7028            insn != prologue_end;
7029            insn = PREV_INSN (insn))
7030         if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
7031           break;
7032
7033       /* If we didn't find one, make a copy of the first line number
7034          we run across.  */
7035       if (! insn)
7036         {
7037           for (insn = next_active_insn (prologue_end);
7038                insn;
7039                insn = PREV_INSN (insn))
7040             if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
7041               {
7042                 emit_line_note_after (NOTE_SOURCE_FILE (insn),
7043                                       NOTE_LINE_NUMBER (insn),
7044                                       prologue_end);
7045                 break;
7046               }
7047         }
7048     }
7049 #endif
7050 #ifdef HAVE_epilogue
7051   if (epilogue_end)
7052     {
7053       rtx insn, next;
7054
7055       /* Similarly, move any line notes that appear after the epilogue.
7056          There is no need, however, to be quite so anal about the existance
7057          of such a note.  */
7058       for (insn = epilogue_end; insn ; insn = next)
7059         {
7060           next = NEXT_INSN (insn);
7061           if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
7062             reorder_insns (insn, insn, PREV_INSN (epilogue_end));
7063         }
7064     }
7065 #endif
7066 }
7067
7068 /* Reposition the prologue-end and epilogue-begin notes after instruction
7069    scheduling and delayed branch scheduling.  */
7070
7071 void
7072 reposition_prologue_and_epilogue_notes (f)
7073      rtx f ATTRIBUTE_UNUSED;
7074 {
7075 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
7076   int len;
7077
7078   if ((len = VARRAY_SIZE (prologue)) > 0)
7079     {
7080       register rtx insn, note = 0;
7081
7082       /* Scan from the beginning until we reach the last prologue insn.
7083          We apparently can't depend on basic_block_{head,end} after
7084          reorg has run.  */
7085       for (insn = f; len && insn; insn = NEXT_INSN (insn))
7086         {
7087           if (GET_CODE (insn) == NOTE)
7088             {
7089               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
7090                 note = insn;
7091             }
7092           else if ((len -= contains (insn, prologue)) == 0)
7093             {
7094               rtx next;
7095               /* Find the prologue-end note if we haven't already, and
7096                  move it to just after the last prologue insn.  */
7097               if (note == 0)
7098                 {
7099                   for (note = insn; (note = NEXT_INSN (note));)
7100                     if (GET_CODE (note) == NOTE
7101                         && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END)
7102                       break;
7103                 }
7104
7105               next = NEXT_INSN (note);
7106
7107               /* Whether or not we can depend on BLOCK_HEAD, 
7108                  attempt to keep it up-to-date.  */
7109               if (BLOCK_HEAD (0) == note)
7110                 BLOCK_HEAD (0) = next;
7111
7112               remove_insn (note);
7113               add_insn_after (note, insn);
7114             }
7115         }
7116     }
7117
7118   if ((len = VARRAY_SIZE (epilogue)) > 0)
7119     {
7120       register rtx insn, note = 0;
7121
7122       /* Scan from the end until we reach the first epilogue insn.
7123          We apparently can't depend on basic_block_{head,end} after
7124          reorg has run.  */
7125       for (insn = get_last_insn (); len && insn; insn = PREV_INSN (insn))
7126         {
7127           if (GET_CODE (insn) == NOTE)
7128             {
7129               if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
7130                 note = insn;
7131             }
7132           else if ((len -= contains (insn, epilogue)) == 0)
7133             {
7134               /* Find the epilogue-begin note if we haven't already, and
7135                  move it to just before the first epilogue insn.  */
7136               if (note == 0)
7137                 {
7138                   for (note = insn; (note = PREV_INSN (note));)
7139                     if (GET_CODE (note) == NOTE
7140                         && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG)
7141                       break;
7142                 }
7143
7144               /* Whether or not we can depend on BLOCK_HEAD, 
7145                  attempt to keep it up-to-date.  */
7146               if (n_basic_blocks
7147                   && BLOCK_HEAD (n_basic_blocks-1) == insn)
7148                 BLOCK_HEAD (n_basic_blocks-1) = note;
7149
7150               remove_insn (note);
7151               add_insn_before (note, insn);
7152             }
7153         }
7154     }
7155 #endif /* HAVE_prologue or HAVE_epilogue */
7156 }
7157
7158 /* Mark T for GC.  */
7159
7160 static void
7161 mark_temp_slot (t)
7162   struct temp_slot *t;
7163 {
7164   while (t)
7165     {
7166       ggc_mark_rtx (t->slot);
7167       ggc_mark_rtx (t->address);
7168       ggc_mark_tree (t->rtl_expr);
7169
7170       t = t->next;
7171     }
7172 }
7173
7174 /* Mark P for GC.  */
7175
7176 static void
7177 mark_function_status (p)
7178      struct function *p;
7179 {
7180   int i;
7181   rtx *r;
7182
7183   if (p == 0)
7184     return;
7185
7186   ggc_mark_rtx (p->arg_offset_rtx);
7187
7188   if (p->x_parm_reg_stack_loc)
7189     for (i = p->x_max_parm_reg, r = p->x_parm_reg_stack_loc;
7190          i > 0; --i, ++r)
7191       ggc_mark_rtx (*r);
7192
7193   ggc_mark_rtx (p->return_rtx);
7194   ggc_mark_rtx (p->x_cleanup_label);
7195   ggc_mark_rtx (p->x_return_label);
7196   ggc_mark_rtx (p->x_save_expr_regs);
7197   ggc_mark_rtx (p->x_stack_slot_list);
7198   ggc_mark_rtx (p->x_parm_birth_insn);
7199   ggc_mark_rtx (p->x_tail_recursion_label);
7200   ggc_mark_rtx (p->x_tail_recursion_reentry);
7201   ggc_mark_rtx (p->internal_arg_pointer);
7202   ggc_mark_rtx (p->x_arg_pointer_save_area);
7203   ggc_mark_tree (p->x_rtl_expr_chain);
7204   ggc_mark_rtx (p->x_last_parm_insn);
7205   ggc_mark_tree (p->x_context_display);
7206   ggc_mark_tree (p->x_trampoline_list);
7207   ggc_mark_rtx (p->epilogue_delay_list);
7208
7209   mark_temp_slot (p->x_temp_slots);
7210
7211   {
7212     struct var_refs_queue *q = p->fixup_var_refs_queue;
7213     while (q)
7214       {
7215         ggc_mark_rtx (q->modified);
7216         q = q->next;
7217       }
7218   }
7219
7220   ggc_mark_rtx (p->x_nonlocal_goto_handler_slots);
7221   ggc_mark_rtx (p->x_nonlocal_goto_handler_labels);
7222   ggc_mark_rtx (p->x_nonlocal_goto_stack_level);
7223   ggc_mark_tree (p->x_nonlocal_labels);
7224 }
7225
7226 /* Mark the function chain ARG (which is really a struct function **)
7227    for GC.  */
7228
7229 static void
7230 mark_function_chain (arg)
7231      void *arg;
7232 {
7233   struct function *f = *(struct function **) arg;
7234
7235   for (; f; f = f->next_global)
7236     {
7237       ggc_mark_tree (f->decl);
7238
7239       mark_function_status (f);
7240       mark_eh_status (f->eh);
7241       mark_stmt_status (f->stmt);
7242       mark_expr_status (f->expr);
7243       mark_emit_status (f->emit);
7244       mark_varasm_status (f->varasm);
7245
7246       if (mark_machine_status)
7247         (*mark_machine_status) (f);
7248       if (mark_lang_status)
7249         (*mark_lang_status) (f);
7250
7251       if (f->original_arg_vector)
7252         ggc_mark_rtvec ((rtvec) f->original_arg_vector);
7253       if (f->original_decl_initial)
7254         ggc_mark_tree (f->original_decl_initial);
7255     }
7256 }
7257
7258 /* Called once, at initialization, to initialize function.c.  */
7259
7260 void
7261 init_function_once ()
7262 {
7263   ggc_add_root (&all_functions, 1, sizeof all_functions,
7264                 mark_function_chain);
7265
7266   VARRAY_INT_INIT (prologue, 0, "prologue");
7267   VARRAY_INT_INIT (epilogue, 0, "epilogue");
7268   VARRAY_INT_INIT (sibcall_epilogue, 0, "sibcall_epilogue");
7269 }