OSDN Git Service

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