OSDN Git Service

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