OSDN Git Service

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