OSDN Git Service

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