OSDN Git Service

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