OSDN Git Service

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