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