OSDN Git Service

2012-10-08 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / function.c
1 /* Expands front end tree to back end RTL for GCC.
2    Copyright (C) 1987, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4    2010, 2011, 2012  Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
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 #include "config.h"
37 #include "system.h"
38 #include "coretypes.h"
39 #include "tm.h"
40 #include "rtl-error.h"
41 #include "tree.h"
42 #include "flags.h"
43 #include "except.h"
44 #include "function.h"
45 #include "expr.h"
46 #include "optabs.h"
47 #include "libfuncs.h"
48 #include "regs.h"
49 #include "hard-reg-set.h"
50 #include "insn-config.h"
51 #include "recog.h"
52 #include "output.h"
53 #include "basic-block.h"
54 #include "hashtab.h"
55 #include "ggc.h"
56 #include "tm_p.h"
57 #include "langhooks.h"
58 #include "target.h"
59 #include "common/common-target.h"
60 #include "gimple.h"
61 #include "tree-pass.h"
62 #include "predict.h"
63 #include "df.h"
64 #include "vecprim.h"
65 #include "params.h"
66 #include "bb-reorder.h"
67
68 /* So we can assign to cfun in this file.  */
69 #undef cfun
70
71 #ifndef STACK_ALIGNMENT_NEEDED
72 #define STACK_ALIGNMENT_NEEDED 1
73 #endif
74
75 #define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
76
77 /* Some systems use __main in a way incompatible with its use in gcc, in these
78    cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
79    give the same symbol without quotes for an alternative entry point.  You
80    must define both, or neither.  */
81 #ifndef NAME__MAIN
82 #define NAME__MAIN "__main"
83 #endif
84
85 /* Round a value to the lowest integer less than it that is a multiple of
86    the required alignment.  Avoid using division in case the value is
87    negative.  Assume the alignment is a power of two.  */
88 #define FLOOR_ROUND(VALUE,ALIGN) ((VALUE) & ~((ALIGN) - 1))
89
90 /* Similar, but round to the next highest integer that meets the
91    alignment.  */
92 #define CEIL_ROUND(VALUE,ALIGN) (((VALUE) + (ALIGN) - 1) & ~((ALIGN)- 1))
93
94 /* Nonzero once virtual register instantiation has been done.
95    assign_stack_local uses frame_pointer_rtx when this is nonzero.
96    calls.c:emit_library_call_value_1 uses it to set up
97    post-instantiation libcalls.  */
98 int virtuals_instantiated;
99
100 /* Assign unique numbers to labels generated for profiling, debugging, etc.  */
101 static GTY(()) int funcdef_no;
102
103 /* These variables hold pointers to functions to create and destroy
104    target specific, per-function data structures.  */
105 struct machine_function * (*init_machine_status) (void);
106
107 /* The currently compiled function.  */
108 struct function *cfun = 0;
109
110 /* These hashes record the prologue and epilogue insns.  */
111 static GTY((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
112   htab_t prologue_insn_hash;
113 static GTY((if_marked ("ggc_marked_p"), param_is (struct rtx_def)))
114   htab_t epilogue_insn_hash;
115 \f
116
117 htab_t types_used_by_vars_hash = NULL;
118 VEC(tree,gc) *types_used_by_cur_var_decl;
119
120 /* Forward declarations.  */
121
122 static struct temp_slot *find_temp_slot_from_address (rtx);
123 static void pad_to_arg_alignment (struct args_size *, int, struct args_size *);
124 static void pad_below (struct args_size *, enum machine_mode, tree);
125 static void reorder_blocks_1 (rtx, tree, VEC(tree,heap) **);
126 static int all_blocks (tree, tree *);
127 static tree *get_block_vector (tree, int *);
128 extern tree debug_find_var_in_block_tree (tree, tree);
129 /* We always define `record_insns' even if it's not used so that we
130    can always export `prologue_epilogue_contains'.  */
131 static void record_insns (rtx, rtx, htab_t *) ATTRIBUTE_UNUSED;
132 static bool contains (const_rtx, htab_t);
133 static void prepare_function_start (void);
134 static void do_clobber_return_reg (rtx, void *);
135 static void do_use_return_reg (rtx, void *);
136 static void set_insn_locations (rtx, int) ATTRIBUTE_UNUSED;
137 \f
138 /* Stack of nested functions.  */
139 /* Keep track of the cfun stack.  */
140
141 typedef struct function *function_p;
142
143 DEF_VEC_P(function_p);
144 DEF_VEC_ALLOC_P(function_p,heap);
145 static VEC(function_p,heap) *function_context_stack;
146
147 /* Save the current context for compilation of a nested function.
148    This is called from language-specific code.  */
149
150 void
151 push_function_context (void)
152 {
153   if (cfun == 0)
154     allocate_struct_function (NULL, false);
155
156   VEC_safe_push (function_p, heap, function_context_stack, cfun);
157   set_cfun (NULL);
158 }
159
160 /* Restore the last saved context, at the end of a nested function.
161    This function is called from language-specific code.  */
162
163 void
164 pop_function_context (void)
165 {
166   struct function *p = VEC_pop (function_p, function_context_stack);
167   set_cfun (p);
168   current_function_decl = p->decl;
169
170   /* Reset variables that have known state during rtx generation.  */
171   virtuals_instantiated = 0;
172   generating_concat_p = 1;
173 }
174
175 /* Clear out all parts of the state in F that can safely be discarded
176    after the function has been parsed, but not compiled, to let
177    garbage collection reclaim the memory.  */
178
179 void
180 free_after_parsing (struct function *f)
181 {
182   f->language = 0;
183 }
184
185 /* Clear out all parts of the state in F that can safely be discarded
186    after the function has been compiled, to let garbage collection
187    reclaim the memory.  */
188
189 void
190 free_after_compilation (struct function *f)
191 {
192   prologue_insn_hash = NULL;
193   epilogue_insn_hash = NULL;
194
195   free (crtl->emit.regno_pointer_align);
196
197   memset (crtl, 0, sizeof (struct rtl_data));
198   f->eh = NULL;
199   f->machine = NULL;
200   f->cfg = NULL;
201
202   regno_reg_rtx = NULL;
203 }
204 \f
205 /* Return size needed for stack frame based on slots so far allocated.
206    This size counts from zero.  It is not rounded to PREFERRED_STACK_BOUNDARY;
207    the caller may have to do that.  */
208
209 HOST_WIDE_INT
210 get_frame_size (void)
211 {
212   if (FRAME_GROWS_DOWNWARD)
213     return -frame_offset;
214   else
215     return frame_offset;
216 }
217
218 /* Issue an error message and return TRUE if frame OFFSET overflows in
219    the signed target pointer arithmetics for function FUNC.  Otherwise
220    return FALSE.  */
221
222 bool
223 frame_offset_overflow (HOST_WIDE_INT offset, tree func)
224 {
225   unsigned HOST_WIDE_INT size = FRAME_GROWS_DOWNWARD ? -offset : offset;
226
227   if (size > ((unsigned HOST_WIDE_INT) 1 << (GET_MODE_BITSIZE (Pmode) - 1))
228                /* Leave room for the fixed part of the frame.  */
229                - 64 * UNITS_PER_WORD)
230     {
231       error_at (DECL_SOURCE_LOCATION (func),
232                 "total size of local objects too large");
233       return TRUE;
234     }
235
236   return FALSE;
237 }
238
239 /* Return stack slot alignment in bits for TYPE and MODE.  */
240
241 static unsigned int
242 get_stack_local_alignment (tree type, enum machine_mode mode)
243 {
244   unsigned int alignment;
245
246   if (mode == BLKmode)
247     alignment = BIGGEST_ALIGNMENT;
248   else
249     alignment = GET_MODE_ALIGNMENT (mode);
250
251   /* Allow the frond-end to (possibly) increase the alignment of this
252      stack slot.  */
253   if (! type)
254     type = lang_hooks.types.type_for_mode (mode, 0);
255
256   return STACK_SLOT_ALIGNMENT (type, mode, alignment);
257 }
258
259 /* Determine whether it is possible to fit a stack slot of size SIZE and
260    alignment ALIGNMENT into an area in the stack frame that starts at
261    frame offset START and has a length of LENGTH.  If so, store the frame
262    offset to be used for the stack slot in *POFFSET and return true;
263    return false otherwise.  This function will extend the frame size when
264    given a start/length pair that lies at the end of the frame.  */
265
266 static bool
267 try_fit_stack_local (HOST_WIDE_INT start, HOST_WIDE_INT length,
268                      HOST_WIDE_INT size, unsigned int alignment,
269                      HOST_WIDE_INT *poffset)
270 {
271   HOST_WIDE_INT this_frame_offset;
272   int frame_off, frame_alignment, frame_phase;
273
274   /* Calculate how many bytes the start of local variables is off from
275      stack alignment.  */
276   frame_alignment = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
277   frame_off = STARTING_FRAME_OFFSET % frame_alignment;
278   frame_phase = frame_off ? frame_alignment - frame_off : 0;
279
280   /* Round the frame offset to the specified alignment.  */
281
282   /*  We must be careful here, since FRAME_OFFSET might be negative and
283       division with a negative dividend isn't as well defined as we might
284       like.  So we instead assume that ALIGNMENT is a power of two and
285       use logical operations which are unambiguous.  */
286   if (FRAME_GROWS_DOWNWARD)
287     this_frame_offset
288       = (FLOOR_ROUND (start + length - size - frame_phase,
289                       (unsigned HOST_WIDE_INT) alignment)
290          + frame_phase);
291   else
292     this_frame_offset
293       = (CEIL_ROUND (start - frame_phase,
294                      (unsigned HOST_WIDE_INT) alignment)
295          + frame_phase);
296
297   /* See if it fits.  If this space is at the edge of the frame,
298      consider extending the frame to make it fit.  Our caller relies on
299      this when allocating a new slot.  */
300   if (frame_offset == start && this_frame_offset < frame_offset)
301     frame_offset = this_frame_offset;
302   else if (this_frame_offset < start)
303     return false;
304   else if (start + length == frame_offset
305            && this_frame_offset + size > start + length)
306     frame_offset = this_frame_offset + size;
307   else if (this_frame_offset + size > start + length)
308     return false;
309
310   *poffset = this_frame_offset;
311   return true;
312 }
313
314 /* Create a new frame_space structure describing free space in the stack
315    frame beginning at START and ending at END, and chain it into the
316    function's frame_space_list.  */
317
318 static void
319 add_frame_space (HOST_WIDE_INT start, HOST_WIDE_INT end)
320 {
321   struct frame_space *space = ggc_alloc_frame_space ();
322   space->next = crtl->frame_space_list;
323   crtl->frame_space_list = space;
324   space->start = start;
325   space->length = end - start;
326 }
327
328 /* Allocate a stack slot of SIZE bytes and return a MEM rtx for it
329    with machine mode MODE.
330
331    ALIGN controls the amount of alignment for the address of the slot:
332    0 means according to MODE,
333    -1 means use BIGGEST_ALIGNMENT and round size to multiple of that,
334    -2 means use BITS_PER_UNIT,
335    positive specifies alignment boundary in bits.
336
337    KIND has ASLK_REDUCE_ALIGN bit set if it is OK to reduce
338    alignment and ASLK_RECORD_PAD bit set if we should remember
339    extra space we allocated for alignment purposes.  When we are
340    called from assign_stack_temp_for_type, it is not set so we don't
341    track the same stack slot in two independent lists.
342
343    We do not round to stack_boundary here.  */
344
345 rtx
346 assign_stack_local_1 (enum machine_mode mode, HOST_WIDE_INT size,
347                       int align, int kind)
348 {
349   rtx x, addr;
350   int bigend_correction = 0;
351   HOST_WIDE_INT slot_offset = 0, old_frame_offset;
352   unsigned int alignment, alignment_in_bits;
353
354   if (align == 0)
355     {
356       alignment = get_stack_local_alignment (NULL, mode);
357       alignment /= BITS_PER_UNIT;
358     }
359   else if (align == -1)
360     {
361       alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
362       size = CEIL_ROUND (size, alignment);
363     }
364   else if (align == -2)
365     alignment = 1; /* BITS_PER_UNIT / BITS_PER_UNIT */
366   else
367     alignment = align / BITS_PER_UNIT;
368
369   alignment_in_bits = alignment * BITS_PER_UNIT;
370
371   /* Ignore alignment if it exceeds MAX_SUPPORTED_STACK_ALIGNMENT.  */
372   if (alignment_in_bits > MAX_SUPPORTED_STACK_ALIGNMENT)
373     {
374       alignment_in_bits = MAX_SUPPORTED_STACK_ALIGNMENT;
375       alignment = alignment_in_bits / BITS_PER_UNIT;
376     }
377
378   if (SUPPORTS_STACK_ALIGNMENT)
379     {
380       if (crtl->stack_alignment_estimated < alignment_in_bits)
381         {
382           if (!crtl->stack_realign_processed)
383             crtl->stack_alignment_estimated = alignment_in_bits;
384           else
385             {
386               /* If stack is realigned and stack alignment value
387                  hasn't been finalized, it is OK not to increase
388                  stack_alignment_estimated.  The bigger alignment
389                  requirement is recorded in stack_alignment_needed
390                  below.  */
391               gcc_assert (!crtl->stack_realign_finalized);
392               if (!crtl->stack_realign_needed)
393                 {
394                   /* It is OK to reduce the alignment as long as the
395                      requested size is 0 or the estimated stack
396                      alignment >= mode alignment.  */
397                   gcc_assert ((kind & ASLK_REDUCE_ALIGN)
398                               || size == 0
399                               || (crtl->stack_alignment_estimated
400                                   >= GET_MODE_ALIGNMENT (mode)));
401                   alignment_in_bits = crtl->stack_alignment_estimated;
402                   alignment = alignment_in_bits / BITS_PER_UNIT;
403                 }
404             }
405         }
406     }
407
408   if (crtl->stack_alignment_needed < alignment_in_bits)
409     crtl->stack_alignment_needed = alignment_in_bits;
410   if (crtl->max_used_stack_slot_alignment < alignment_in_bits)
411     crtl->max_used_stack_slot_alignment = alignment_in_bits;
412
413   if (mode != BLKmode || size != 0)
414     {
415       if (kind & ASLK_RECORD_PAD)
416         {
417           struct frame_space **psp;
418
419           for (psp = &crtl->frame_space_list; *psp; psp = &(*psp)->next)
420             {
421               struct frame_space *space = *psp;
422               if (!try_fit_stack_local (space->start, space->length, size,
423                                         alignment, &slot_offset))
424                 continue;
425               *psp = space->next;
426               if (slot_offset > space->start)
427                 add_frame_space (space->start, slot_offset);
428               if (slot_offset + size < space->start + space->length)
429                 add_frame_space (slot_offset + size,
430                                  space->start + space->length);
431               goto found_space;
432             }
433         }
434     }
435   else if (!STACK_ALIGNMENT_NEEDED)
436     {
437       slot_offset = frame_offset;
438       goto found_space;
439     }
440
441   old_frame_offset = frame_offset;
442
443   if (FRAME_GROWS_DOWNWARD)
444     {
445       frame_offset -= size;
446       try_fit_stack_local (frame_offset, size, size, alignment, &slot_offset);
447
448       if (kind & ASLK_RECORD_PAD)
449         {
450           if (slot_offset > frame_offset)
451             add_frame_space (frame_offset, slot_offset);
452           if (slot_offset + size < old_frame_offset)
453             add_frame_space (slot_offset + size, old_frame_offset);
454         }
455     }
456   else
457     {
458       frame_offset += size;
459       try_fit_stack_local (old_frame_offset, size, size, alignment, &slot_offset);
460
461       if (kind & ASLK_RECORD_PAD)
462         {
463           if (slot_offset > old_frame_offset)
464             add_frame_space (old_frame_offset, slot_offset);
465           if (slot_offset + size < frame_offset)
466             add_frame_space (slot_offset + size, frame_offset);
467         }
468     }
469
470  found_space:
471   /* On a big-endian machine, if we are allocating more space than we will use,
472      use the least significant bytes of those that are allocated.  */
473   if (BYTES_BIG_ENDIAN && mode != BLKmode && GET_MODE_SIZE (mode) < size)
474     bigend_correction = size - GET_MODE_SIZE (mode);
475
476   /* If we have already instantiated virtual registers, return the actual
477      address relative to the frame pointer.  */
478   if (virtuals_instantiated)
479     addr = plus_constant (Pmode, frame_pointer_rtx,
480                           trunc_int_for_mode
481                           (slot_offset + bigend_correction
482                            + STARTING_FRAME_OFFSET, Pmode));
483   else
484     addr = plus_constant (Pmode, virtual_stack_vars_rtx,
485                           trunc_int_for_mode
486                           (slot_offset + bigend_correction,
487                            Pmode));
488
489   x = gen_rtx_MEM (mode, addr);
490   set_mem_align (x, alignment_in_bits);
491   MEM_NOTRAP_P (x) = 1;
492
493   stack_slot_list
494     = gen_rtx_EXPR_LIST (VOIDmode, x, stack_slot_list);
495
496   if (frame_offset_overflow (frame_offset, current_function_decl))
497     frame_offset = 0;
498
499   return x;
500 }
501
502 /* Wrap up assign_stack_local_1 with last parameter as false.  */
503
504 rtx
505 assign_stack_local (enum machine_mode mode, HOST_WIDE_INT size, int align)
506 {
507   return assign_stack_local_1 (mode, size, align, ASLK_RECORD_PAD);
508 }
509 \f
510 /* In order to evaluate some expressions, such as function calls returning
511    structures in memory, we need to temporarily allocate stack locations.
512    We record each allocated temporary in the following structure.
513
514    Associated with each temporary slot is a nesting level.  When we pop up
515    one level, all temporaries associated with the previous level are freed.
516    Normally, all temporaries are freed after the execution of the statement
517    in which they were created.  However, if we are inside a ({...}) grouping,
518    the result may be in a temporary and hence must be preserved.  If the
519    result could be in a temporary, we preserve it if we can determine which
520    one it is in.  If we cannot determine which temporary may contain the
521    result, all temporaries are preserved.  A temporary is preserved by
522    pretending it was allocated at the previous nesting level.  */
523
524 struct GTY(()) temp_slot {
525   /* Points to next temporary slot.  */
526   struct temp_slot *next;
527   /* Points to previous temporary slot.  */
528   struct temp_slot *prev;
529   /* The rtx to used to reference the slot.  */
530   rtx slot;
531   /* The size, in units, of the slot.  */
532   HOST_WIDE_INT size;
533   /* The type of the object in the slot, or zero if it doesn't correspond
534      to a type.  We use this to determine whether a slot can be reused.
535      It can be reused if objects of the type of the new slot will always
536      conflict with objects of the type of the old slot.  */
537   tree type;
538   /* The alignment (in bits) of the slot.  */
539   unsigned int align;
540   /* Nonzero if this temporary is currently in use.  */
541   char in_use;
542   /* Nesting level at which this slot is being used.  */
543   int level;
544   /* The offset of the slot from the frame_pointer, including extra space
545      for alignment.  This info is for combine_temp_slots.  */
546   HOST_WIDE_INT base_offset;
547   /* The size of the slot, including extra space for alignment.  This
548      info is for combine_temp_slots.  */
549   HOST_WIDE_INT full_size;
550 };
551
552 /* A table of addresses that represent a stack slot.  The table is a mapping
553    from address RTXen to a temp slot.  */
554 static GTY((param_is(struct temp_slot_address_entry))) htab_t temp_slot_address_table;
555 static size_t n_temp_slots_in_use;
556
557 /* Entry for the above hash table.  */
558 struct GTY(()) temp_slot_address_entry {
559   hashval_t hash;
560   rtx address;
561   struct temp_slot *temp_slot;
562 };
563
564 /* Removes temporary slot TEMP from LIST.  */
565
566 static void
567 cut_slot_from_list (struct temp_slot *temp, struct temp_slot **list)
568 {
569   if (temp->next)
570     temp->next->prev = temp->prev;
571   if (temp->prev)
572     temp->prev->next = temp->next;
573   else
574     *list = temp->next;
575
576   temp->prev = temp->next = NULL;
577 }
578
579 /* Inserts temporary slot TEMP to LIST.  */
580
581 static void
582 insert_slot_to_list (struct temp_slot *temp, struct temp_slot **list)
583 {
584   temp->next = *list;
585   if (*list)
586     (*list)->prev = temp;
587   temp->prev = NULL;
588   *list = temp;
589 }
590
591 /* Returns the list of used temp slots at LEVEL.  */
592
593 static struct temp_slot **
594 temp_slots_at_level (int level)
595 {
596   if (level >= (int) VEC_length (temp_slot_p, used_temp_slots))
597     VEC_safe_grow_cleared (temp_slot_p, gc, used_temp_slots, level + 1);
598
599   return &(VEC_address (temp_slot_p, used_temp_slots)[level]);
600 }
601
602 /* Returns the maximal temporary slot level.  */
603
604 static int
605 max_slot_level (void)
606 {
607   if (!used_temp_slots)
608     return -1;
609
610   return VEC_length (temp_slot_p, used_temp_slots) - 1;
611 }
612
613 /* Moves temporary slot TEMP to LEVEL.  */
614
615 static void
616 move_slot_to_level (struct temp_slot *temp, int level)
617 {
618   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
619   insert_slot_to_list (temp, temp_slots_at_level (level));
620   temp->level = level;
621 }
622
623 /* Make temporary slot TEMP available.  */
624
625 static void
626 make_slot_available (struct temp_slot *temp)
627 {
628   cut_slot_from_list (temp, temp_slots_at_level (temp->level));
629   insert_slot_to_list (temp, &avail_temp_slots);
630   temp->in_use = 0;
631   temp->level = -1;
632   n_temp_slots_in_use--;
633 }
634
635 /* Compute the hash value for an address -> temp slot mapping.
636    The value is cached on the mapping entry.  */
637 static hashval_t
638 temp_slot_address_compute_hash (struct temp_slot_address_entry *t)
639 {
640   int do_not_record = 0;
641   return hash_rtx (t->address, GET_MODE (t->address),
642                    &do_not_record, NULL, false);
643 }
644
645 /* Return the hash value for an address -> temp slot mapping.  */
646 static hashval_t
647 temp_slot_address_hash (const void *p)
648 {
649   const struct temp_slot_address_entry *t;
650   t = (const struct temp_slot_address_entry *) p;
651   return t->hash;
652 }
653
654 /* Compare two address -> temp slot mapping entries.  */
655 static int
656 temp_slot_address_eq (const void *p1, const void *p2)
657 {
658   const struct temp_slot_address_entry *t1, *t2;
659   t1 = (const struct temp_slot_address_entry *) p1;
660   t2 = (const struct temp_slot_address_entry *) p2;
661   return exp_equiv_p (t1->address, t2->address, 0, true);
662 }
663
664 /* Add ADDRESS as an alias of TEMP_SLOT to the addess -> temp slot mapping.  */
665 static void
666 insert_temp_slot_address (rtx address, struct temp_slot *temp_slot)
667 {
668   void **slot;
669   struct temp_slot_address_entry *t = ggc_alloc_temp_slot_address_entry ();
670   t->address = address;
671   t->temp_slot = temp_slot;
672   t->hash = temp_slot_address_compute_hash (t);
673   slot = htab_find_slot_with_hash (temp_slot_address_table, t, t->hash, INSERT);
674   *slot = t;
675 }
676
677 /* Remove an address -> temp slot mapping entry if the temp slot is
678    not in use anymore.  Callback for remove_unused_temp_slot_addresses.  */
679 static int
680 remove_unused_temp_slot_addresses_1 (void **slot, void *data ATTRIBUTE_UNUSED)
681 {
682   const struct temp_slot_address_entry *t;
683   t = (const struct temp_slot_address_entry *) *slot;
684   if (! t->temp_slot->in_use)
685     htab_clear_slot (temp_slot_address_table, slot);
686   return 1;
687 }
688
689 /* Remove all mappings of addresses to unused temp slots.  */
690 static void
691 remove_unused_temp_slot_addresses (void)
692 {
693   /* Use quicker clearing if there aren't any active temp slots.  */
694   if (n_temp_slots_in_use)
695     htab_traverse (temp_slot_address_table,
696                    remove_unused_temp_slot_addresses_1,
697                    NULL);
698   else
699     htab_empty (temp_slot_address_table);
700 }
701
702 /* Find the temp slot corresponding to the object at address X.  */
703
704 static struct temp_slot *
705 find_temp_slot_from_address (rtx x)
706 {
707   struct temp_slot *p;
708   struct temp_slot_address_entry tmp, *t;
709
710   /* First try the easy way:
711      See if X exists in the address -> temp slot mapping.  */
712   tmp.address = x;
713   tmp.temp_slot = NULL;
714   tmp.hash = temp_slot_address_compute_hash (&tmp);
715   t = (struct temp_slot_address_entry *)
716     htab_find_with_hash (temp_slot_address_table, &tmp, tmp.hash);
717   if (t)
718     return t->temp_slot;
719
720   /* If we have a sum involving a register, see if it points to a temp
721      slot.  */
722   if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 0))
723       && (p = find_temp_slot_from_address (XEXP (x, 0))) != 0)
724     return p;
725   else if (GET_CODE (x) == PLUS && REG_P (XEXP (x, 1))
726            && (p = find_temp_slot_from_address (XEXP (x, 1))) != 0)
727     return p;
728
729   /* Last resort: Address is a virtual stack var address.  */
730   if (GET_CODE (x) == PLUS
731       && XEXP (x, 0) == virtual_stack_vars_rtx
732       && CONST_INT_P (XEXP (x, 1)))
733     {
734       int i;
735       for (i = max_slot_level (); i >= 0; i--)
736         for (p = *temp_slots_at_level (i); p; p = p->next)
737           {
738             if (INTVAL (XEXP (x, 1)) >= p->base_offset
739                 && INTVAL (XEXP (x, 1)) < p->base_offset + p->full_size)
740               return p;
741           }
742     }
743
744   return NULL;
745 }
746 \f
747 /* Allocate a temporary stack slot and record it for possible later
748    reuse.
749
750    MODE is the machine mode to be given to the returned rtx.
751
752    SIZE is the size in units of the space required.  We do no rounding here
753    since assign_stack_local will do any required rounding.
754
755    TYPE is the type that will be used for the stack slot.  */
756
757 rtx
758 assign_stack_temp_for_type (enum machine_mode mode, HOST_WIDE_INT size,
759                             tree type)
760 {
761   unsigned int align;
762   struct temp_slot *p, *best_p = 0, *selected = NULL, **pp;
763   rtx slot;
764
765   /* If SIZE is -1 it means that somebody tried to allocate a temporary
766      of a variable size.  */
767   gcc_assert (size != -1);
768
769   align = get_stack_local_alignment (type, mode);
770
771   /* Try to find an available, already-allocated temporary of the proper
772      mode which meets the size and alignment requirements.  Choose the
773      smallest one with the closest alignment.
774
775      If assign_stack_temp is called outside of the tree->rtl expansion,
776      we cannot reuse the stack slots (that may still refer to
777      VIRTUAL_STACK_VARS_REGNUM).  */
778   if (!virtuals_instantiated)
779     {
780       for (p = avail_temp_slots; p; p = p->next)
781         {
782           if (p->align >= align && p->size >= size
783               && GET_MODE (p->slot) == mode
784               && objects_must_conflict_p (p->type, type)
785               && (best_p == 0 || best_p->size > p->size
786                   || (best_p->size == p->size && best_p->align > p->align)))
787             {
788               if (p->align == align && p->size == size)
789                 {
790                   selected = p;
791                   cut_slot_from_list (selected, &avail_temp_slots);
792                   best_p = 0;
793                   break;
794                 }
795               best_p = p;
796             }
797         }
798     }
799
800   /* Make our best, if any, the one to use.  */
801   if (best_p)
802     {
803       selected = best_p;
804       cut_slot_from_list (selected, &avail_temp_slots);
805
806       /* If there are enough aligned bytes left over, make them into a new
807          temp_slot so that the extra bytes don't get wasted.  Do this only
808          for BLKmode slots, so that we can be sure of the alignment.  */
809       if (GET_MODE (best_p->slot) == BLKmode)
810         {
811           int alignment = best_p->align / BITS_PER_UNIT;
812           HOST_WIDE_INT rounded_size = CEIL_ROUND (size, alignment);
813
814           if (best_p->size - rounded_size >= alignment)
815             {
816               p = ggc_alloc_temp_slot ();
817               p->in_use = 0;
818               p->size = best_p->size - rounded_size;
819               p->base_offset = best_p->base_offset + rounded_size;
820               p->full_size = best_p->full_size - rounded_size;
821               p->slot = adjust_address_nv (best_p->slot, BLKmode, rounded_size);
822               p->align = best_p->align;
823               p->type = best_p->type;
824               insert_slot_to_list (p, &avail_temp_slots);
825
826               stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, p->slot,
827                                                    stack_slot_list);
828
829               best_p->size = rounded_size;
830               best_p->full_size = rounded_size;
831             }
832         }
833     }
834
835   /* If we still didn't find one, make a new temporary.  */
836   if (selected == 0)
837     {
838       HOST_WIDE_INT frame_offset_old = frame_offset;
839
840       p = ggc_alloc_temp_slot ();
841
842       /* We are passing an explicit alignment request to assign_stack_local.
843          One side effect of that is assign_stack_local will not round SIZE
844          to ensure the frame offset remains suitably aligned.
845
846          So for requests which depended on the rounding of SIZE, we go ahead
847          and round it now.  We also make sure ALIGNMENT is at least
848          BIGGEST_ALIGNMENT.  */
849       gcc_assert (mode != BLKmode || align == BIGGEST_ALIGNMENT);
850       p->slot = assign_stack_local_1 (mode,
851                                       (mode == BLKmode
852                                        ? CEIL_ROUND (size,
853                                                      (int) align
854                                                      / BITS_PER_UNIT)
855                                        : size),
856                                       align, 0);
857
858       p->align = align;
859
860       /* The following slot size computation is necessary because we don't
861          know the actual size of the temporary slot until assign_stack_local
862          has performed all the frame alignment and size rounding for the
863          requested temporary.  Note that extra space added for alignment
864          can be either above or below this stack slot depending on which
865          way the frame grows.  We include the extra space if and only if it
866          is above this slot.  */
867       if (FRAME_GROWS_DOWNWARD)
868         p->size = frame_offset_old - frame_offset;
869       else
870         p->size = size;
871
872       /* Now define the fields used by combine_temp_slots.  */
873       if (FRAME_GROWS_DOWNWARD)
874         {
875           p->base_offset = frame_offset;
876           p->full_size = frame_offset_old - frame_offset;
877         }
878       else
879         {
880           p->base_offset = frame_offset_old;
881           p->full_size = frame_offset - frame_offset_old;
882         }
883
884       selected = p;
885     }
886
887   p = selected;
888   p->in_use = 1;
889   p->type = type;
890   p->level = temp_slot_level;
891   n_temp_slots_in_use++;
892
893   pp = temp_slots_at_level (p->level);
894   insert_slot_to_list (p, pp);
895   insert_temp_slot_address (XEXP (p->slot, 0), p);
896
897   /* Create a new MEM rtx to avoid clobbering MEM flags of old slots.  */
898   slot = gen_rtx_MEM (mode, XEXP (p->slot, 0));
899   stack_slot_list = gen_rtx_EXPR_LIST (VOIDmode, slot, stack_slot_list);
900
901   /* If we know the alias set for the memory that will be used, use
902      it.  If there's no TYPE, then we don't know anything about the
903      alias set for the memory.  */
904   set_mem_alias_set (slot, type ? get_alias_set (type) : 0);
905   set_mem_align (slot, align);
906
907   /* If a type is specified, set the relevant flags.  */
908   if (type != 0)
909     MEM_VOLATILE_P (slot) = TYPE_VOLATILE (type);
910   MEM_NOTRAP_P (slot) = 1;
911
912   return slot;
913 }
914
915 /* Allocate a temporary stack slot and record it for possible later
916    reuse.  First two arguments are same as in preceding function.  */
917
918 rtx
919 assign_stack_temp (enum machine_mode mode, HOST_WIDE_INT size)
920 {
921   return assign_stack_temp_for_type (mode, size, NULL_TREE);
922 }
923 \f
924 /* Assign a temporary.
925    If TYPE_OR_DECL is a decl, then we are doing it on behalf of the decl
926    and so that should be used in error messages.  In either case, we
927    allocate of the given type.
928    MEMORY_REQUIRED is 1 if the result must be addressable stack memory;
929    it is 0 if a register is OK.
930    DONT_PROMOTE is 1 if we should not promote values in register
931    to wider modes.  */
932
933 rtx
934 assign_temp (tree type_or_decl, int memory_required,
935              int dont_promote ATTRIBUTE_UNUSED)
936 {
937   tree type, decl;
938   enum machine_mode mode;
939 #ifdef PROMOTE_MODE
940   int unsignedp;
941 #endif
942
943   if (DECL_P (type_or_decl))
944     decl = type_or_decl, type = TREE_TYPE (decl);
945   else
946     decl = NULL, type = type_or_decl;
947
948   mode = TYPE_MODE (type);
949 #ifdef PROMOTE_MODE
950   unsignedp = TYPE_UNSIGNED (type);
951 #endif
952
953   if (mode == BLKmode || memory_required)
954     {
955       HOST_WIDE_INT size = int_size_in_bytes (type);
956       rtx tmp;
957
958       /* Zero sized arrays are GNU C extension.  Set size to 1 to avoid
959          problems with allocating the stack space.  */
960       if (size == 0)
961         size = 1;
962
963       /* Unfortunately, we don't yet know how to allocate variable-sized
964          temporaries.  However, sometimes we can find a fixed upper limit on
965          the size, so try that instead.  */
966       else if (size == -1)
967         size = max_int_size_in_bytes (type);
968
969       /* The size of the temporary may be too large to fit into an integer.  */
970       /* ??? Not sure this should happen except for user silliness, so limit
971          this to things that aren't compiler-generated temporaries.  The
972          rest of the time we'll die in assign_stack_temp_for_type.  */
973       if (decl && size == -1
974           && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST)
975         {
976           error ("size of variable %q+D is too large", decl);
977           size = 1;
978         }
979
980       tmp = assign_stack_temp_for_type (mode, size, type);
981       return tmp;
982     }
983
984 #ifdef PROMOTE_MODE
985   if (! dont_promote)
986     mode = promote_mode (type, mode, &unsignedp);
987 #endif
988
989   return gen_reg_rtx (mode);
990 }
991 \f
992 /* Combine temporary stack slots which are adjacent on the stack.
993
994    This allows for better use of already allocated stack space.  This is only
995    done for BLKmode slots because we can be sure that we won't have alignment
996    problems in this case.  */
997
998 static void
999 combine_temp_slots (void)
1000 {
1001   struct temp_slot *p, *q, *next, *next_q;
1002   int num_slots;
1003
1004   /* We can't combine slots, because the information about which slot
1005      is in which alias set will be lost.  */
1006   if (flag_strict_aliasing)
1007     return;
1008
1009   /* If there are a lot of temp slots, don't do anything unless
1010      high levels of optimization.  */
1011   if (! flag_expensive_optimizations)
1012     for (p = avail_temp_slots, num_slots = 0; p; p = p->next, num_slots++)
1013       if (num_slots > 100 || (num_slots > 10 && optimize == 0))
1014         return;
1015
1016   for (p = avail_temp_slots; p; p = next)
1017     {
1018       int delete_p = 0;
1019
1020       next = p->next;
1021
1022       if (GET_MODE (p->slot) != BLKmode)
1023         continue;
1024
1025       for (q = p->next; q; q = next_q)
1026         {
1027           int delete_q = 0;
1028
1029           next_q = q->next;
1030
1031           if (GET_MODE (q->slot) != BLKmode)
1032             continue;
1033
1034           if (p->base_offset + p->full_size == q->base_offset)
1035             {
1036               /* Q comes after P; combine Q into P.  */
1037               p->size += q->size;
1038               p->full_size += q->full_size;
1039               delete_q = 1;
1040             }
1041           else if (q->base_offset + q->full_size == p->base_offset)
1042             {
1043               /* P comes after Q; combine P into Q.  */
1044               q->size += p->size;
1045               q->full_size += p->full_size;
1046               delete_p = 1;
1047               break;
1048             }
1049           if (delete_q)
1050             cut_slot_from_list (q, &avail_temp_slots);
1051         }
1052
1053       /* Either delete P or advance past it.  */
1054       if (delete_p)
1055         cut_slot_from_list (p, &avail_temp_slots);
1056     }
1057 }
1058 \f
1059 /* Indicate that NEW_RTX is an alternate way of referring to the temp
1060    slot that previously was known by OLD_RTX.  */
1061
1062 void
1063 update_temp_slot_address (rtx old_rtx, rtx new_rtx)
1064 {
1065   struct temp_slot *p;
1066
1067   if (rtx_equal_p (old_rtx, new_rtx))
1068     return;
1069
1070   p = find_temp_slot_from_address (old_rtx);
1071
1072   /* If we didn't find one, see if both OLD_RTX is a PLUS.  If so, and
1073      NEW_RTX is a register, see if one operand of the PLUS is a
1074      temporary location.  If so, NEW_RTX points into it.  Otherwise,
1075      if both OLD_RTX and NEW_RTX are a PLUS and if there is a register
1076      in common between them.  If so, try a recursive call on those
1077      values.  */
1078   if (p == 0)
1079     {
1080       if (GET_CODE (old_rtx) != PLUS)
1081         return;
1082
1083       if (REG_P (new_rtx))
1084         {
1085           update_temp_slot_address (XEXP (old_rtx, 0), new_rtx);
1086           update_temp_slot_address (XEXP (old_rtx, 1), new_rtx);
1087           return;
1088         }
1089       else if (GET_CODE (new_rtx) != PLUS)
1090         return;
1091
1092       if (rtx_equal_p (XEXP (old_rtx, 0), XEXP (new_rtx, 0)))
1093         update_temp_slot_address (XEXP (old_rtx, 1), XEXP (new_rtx, 1));
1094       else if (rtx_equal_p (XEXP (old_rtx, 1), XEXP (new_rtx, 0)))
1095         update_temp_slot_address (XEXP (old_rtx, 0), XEXP (new_rtx, 1));
1096       else if (rtx_equal_p (XEXP (old_rtx, 0), XEXP (new_rtx, 1)))
1097         update_temp_slot_address (XEXP (old_rtx, 1), XEXP (new_rtx, 0));
1098       else if (rtx_equal_p (XEXP (old_rtx, 1), XEXP (new_rtx, 1)))
1099         update_temp_slot_address (XEXP (old_rtx, 0), XEXP (new_rtx, 0));
1100
1101       return;
1102     }
1103
1104   /* Otherwise add an alias for the temp's address.  */
1105   insert_temp_slot_address (new_rtx, p);
1106 }
1107
1108 /* If X could be a reference to a temporary slot, mark that slot as
1109    belonging to the to one level higher than the current level.  If X
1110    matched one of our slots, just mark that one.  Otherwise, we can't
1111    easily predict which it is, so upgrade all of them.
1112
1113    This is called when an ({...}) construct occurs and a statement
1114    returns a value in memory.  */
1115
1116 void
1117 preserve_temp_slots (rtx x)
1118 {
1119   struct temp_slot *p = 0, *next;
1120
1121   if (x == 0)
1122     return;
1123
1124   /* If X is a register that is being used as a pointer, see if we have
1125      a temporary slot we know it points to.  */
1126   if (REG_P (x) && REG_POINTER (x))
1127     p = find_temp_slot_from_address (x);
1128
1129   /* If X is not in memory or is at a constant address, it cannot be in
1130      a temporary slot.  */
1131   if (p == 0 && (!MEM_P (x) || CONSTANT_P (XEXP (x, 0))))
1132     return;
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       if (p->level == temp_slot_level)
1141         move_slot_to_level (p, temp_slot_level - 1);
1142       return;
1143     }
1144
1145   /* Otherwise, preserve all non-kept slots at this level.  */
1146   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1147     {
1148       next = p->next;
1149       move_slot_to_level (p, temp_slot_level - 1);
1150     }
1151 }
1152
1153 /* Free all temporaries used so far.  This is normally called at the
1154    end of generating code for a statement.  */
1155
1156 void
1157 free_temp_slots (void)
1158 {
1159   struct temp_slot *p, *next;
1160   bool some_available = false;
1161
1162   for (p = *temp_slots_at_level (temp_slot_level); p; p = next)
1163     {
1164       next = p->next;
1165       make_slot_available (p);
1166       some_available = true;
1167     }
1168
1169   if (some_available)
1170     {
1171       remove_unused_temp_slot_addresses ();
1172       combine_temp_slots ();
1173     }
1174 }
1175
1176 /* Push deeper into the nesting level for stack temporaries.  */
1177
1178 void
1179 push_temp_slots (void)
1180 {
1181   temp_slot_level++;
1182 }
1183
1184 /* Pop a temporary nesting level.  All slots in use in the current level
1185    are freed.  */
1186
1187 void
1188 pop_temp_slots (void)
1189 {
1190   free_temp_slots ();
1191   temp_slot_level--;
1192 }
1193
1194 /* Initialize temporary slots.  */
1195
1196 void
1197 init_temp_slots (void)
1198 {
1199   /* We have not allocated any temporaries yet.  */
1200   avail_temp_slots = 0;
1201   used_temp_slots = 0;
1202   temp_slot_level = 0;
1203   n_temp_slots_in_use = 0;
1204
1205   /* Set up the table to map addresses to temp slots.  */
1206   if (! temp_slot_address_table)
1207     temp_slot_address_table = htab_create_ggc (32,
1208                                                temp_slot_address_hash,
1209                                                temp_slot_address_eq,
1210                                                NULL);
1211   else
1212     htab_empty (temp_slot_address_table);
1213 }
1214 \f
1215 /* Functions and data structures to keep track of the values hard regs
1216    had at the start of the function.  */
1217
1218 /* Private type used by get_hard_reg_initial_reg, get_hard_reg_initial_val,
1219    and has_hard_reg_initial_val..  */
1220 typedef struct GTY(()) initial_value_pair {
1221   rtx hard_reg;
1222   rtx pseudo;
1223 } initial_value_pair;
1224 /* ???  This could be a VEC but there is currently no way to define an
1225    opaque VEC type.  This could be worked around by defining struct
1226    initial_value_pair in function.h.  */
1227 typedef struct GTY(()) initial_value_struct {
1228   int num_entries;
1229   int max_entries;
1230   initial_value_pair * GTY ((length ("%h.num_entries"))) entries;
1231 } initial_value_struct;
1232
1233 /* If a pseudo represents an initial hard reg (or expression), return
1234    it, else return NULL_RTX.  */
1235
1236 rtx
1237 get_hard_reg_initial_reg (rtx reg)
1238 {
1239   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1240   int i;
1241
1242   if (ivs == 0)
1243     return NULL_RTX;
1244
1245   for (i = 0; i < ivs->num_entries; i++)
1246     if (rtx_equal_p (ivs->entries[i].pseudo, reg))
1247       return ivs->entries[i].hard_reg;
1248
1249   return NULL_RTX;
1250 }
1251
1252 /* Make sure that there's a pseudo register of mode MODE that stores the
1253    initial value of hard register REGNO.  Return an rtx for such a pseudo.  */
1254
1255 rtx
1256 get_hard_reg_initial_val (enum machine_mode mode, unsigned int regno)
1257 {
1258   struct initial_value_struct *ivs;
1259   rtx rv;
1260
1261   rv = has_hard_reg_initial_val (mode, regno);
1262   if (rv)
1263     return rv;
1264
1265   ivs = crtl->hard_reg_initial_vals;
1266   if (ivs == 0)
1267     {
1268       ivs = ggc_alloc_initial_value_struct ();
1269       ivs->num_entries = 0;
1270       ivs->max_entries = 5;
1271       ivs->entries = ggc_alloc_vec_initial_value_pair (5);
1272       crtl->hard_reg_initial_vals = ivs;
1273     }
1274
1275   if (ivs->num_entries >= ivs->max_entries)
1276     {
1277       ivs->max_entries += 5;
1278       ivs->entries = GGC_RESIZEVEC (initial_value_pair, ivs->entries,
1279                                     ivs->max_entries);
1280     }
1281
1282   ivs->entries[ivs->num_entries].hard_reg = gen_rtx_REG (mode, regno);
1283   ivs->entries[ivs->num_entries].pseudo = gen_reg_rtx (mode);
1284
1285   return ivs->entries[ivs->num_entries++].pseudo;
1286 }
1287
1288 /* See if get_hard_reg_initial_val has been used to create a pseudo
1289    for the initial value of hard register REGNO in mode MODE.  Return
1290    the associated pseudo if so, otherwise return NULL.  */
1291
1292 rtx
1293 has_hard_reg_initial_val (enum machine_mode mode, unsigned int regno)
1294 {
1295   struct initial_value_struct *ivs;
1296   int i;
1297
1298   ivs = crtl->hard_reg_initial_vals;
1299   if (ivs != 0)
1300     for (i = 0; i < ivs->num_entries; i++)
1301       if (GET_MODE (ivs->entries[i].hard_reg) == mode
1302           && REGNO (ivs->entries[i].hard_reg) == regno)
1303         return ivs->entries[i].pseudo;
1304
1305   return NULL_RTX;
1306 }
1307
1308 unsigned int
1309 emit_initial_value_sets (void)
1310 {
1311   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1312   int i;
1313   rtx seq;
1314
1315   if (ivs == 0)
1316     return 0;
1317
1318   start_sequence ();
1319   for (i = 0; i < ivs->num_entries; i++)
1320     emit_move_insn (ivs->entries[i].pseudo, ivs->entries[i].hard_reg);
1321   seq = get_insns ();
1322   end_sequence ();
1323
1324   emit_insn_at_entry (seq);
1325   return 0;
1326 }
1327
1328 /* Return the hardreg-pseudoreg initial values pair entry I and
1329    TRUE if I is a valid entry, or FALSE if I is not a valid entry.  */
1330 bool
1331 initial_value_entry (int i, rtx *hreg, rtx *preg)
1332 {
1333   struct initial_value_struct *ivs = crtl->hard_reg_initial_vals;
1334   if (!ivs || i >= ivs->num_entries)
1335     return false;
1336
1337   *hreg = ivs->entries[i].hard_reg;
1338   *preg = ivs->entries[i].pseudo;
1339   return true;
1340 }
1341 \f
1342 /* These routines are responsible for converting virtual register references
1343    to the actual hard register references once RTL generation is complete.
1344
1345    The following four variables are used for communication between the
1346    routines.  They contain the offsets of the virtual registers from their
1347    respective hard registers.  */
1348
1349 static int in_arg_offset;
1350 static int var_offset;
1351 static int dynamic_offset;
1352 static int out_arg_offset;
1353 static int cfa_offset;
1354
1355 /* In most machines, the stack pointer register is equivalent to the bottom
1356    of the stack.  */
1357
1358 #ifndef STACK_POINTER_OFFSET
1359 #define STACK_POINTER_OFFSET    0
1360 #endif
1361
1362 /* If not defined, pick an appropriate default for the offset of dynamically
1363    allocated memory depending on the value of ACCUMULATE_OUTGOING_ARGS,
1364    REG_PARM_STACK_SPACE, and OUTGOING_REG_PARM_STACK_SPACE.  */
1365
1366 #ifndef STACK_DYNAMIC_OFFSET
1367
1368 /* The bottom of the stack points to the actual arguments.  If
1369    REG_PARM_STACK_SPACE is defined, this includes the space for the register
1370    parameters.  However, if OUTGOING_REG_PARM_STACK space is not defined,
1371    stack space for register parameters is not pushed by the caller, but
1372    rather part of the fixed stack areas and hence not included in
1373    `crtl->outgoing_args_size'.  Nevertheless, we must allow
1374    for it when allocating stack dynamic objects.  */
1375
1376 #if defined(REG_PARM_STACK_SPACE)
1377 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1378 ((ACCUMULATE_OUTGOING_ARGS                                                    \
1379   ? (crtl->outgoing_args_size                                 \
1380      + (OUTGOING_REG_PARM_STACK_SPACE ((!(FNDECL) ? NULL_TREE : TREE_TYPE (FNDECL))) ? 0 \
1381                                                : REG_PARM_STACK_SPACE (FNDECL))) \
1382   : 0) + (STACK_POINTER_OFFSET))
1383 #else
1384 #define STACK_DYNAMIC_OFFSET(FNDECL)    \
1385 ((ACCUMULATE_OUTGOING_ARGS ? crtl->outgoing_args_size : 0)            \
1386  + (STACK_POINTER_OFFSET))
1387 #endif
1388 #endif
1389
1390 \f
1391 /* Given a piece of RTX and a pointer to a HOST_WIDE_INT, if the RTX
1392    is a virtual register, return the equivalent hard register and set the
1393    offset indirectly through the pointer.  Otherwise, return 0.  */
1394
1395 static rtx
1396 instantiate_new_reg (rtx x, HOST_WIDE_INT *poffset)
1397 {
1398   rtx new_rtx;
1399   HOST_WIDE_INT offset;
1400
1401   if (x == virtual_incoming_args_rtx)
1402     {
1403       if (stack_realign_drap)
1404         {
1405           /* Replace virtual_incoming_args_rtx with internal arg
1406              pointer if DRAP is used to realign stack.  */
1407           new_rtx = crtl->args.internal_arg_pointer;
1408           offset = 0;
1409         }
1410       else
1411         new_rtx = arg_pointer_rtx, offset = in_arg_offset;
1412     }
1413   else if (x == virtual_stack_vars_rtx)
1414     new_rtx = frame_pointer_rtx, offset = var_offset;
1415   else if (x == virtual_stack_dynamic_rtx)
1416     new_rtx = stack_pointer_rtx, offset = dynamic_offset;
1417   else if (x == virtual_outgoing_args_rtx)
1418     new_rtx = stack_pointer_rtx, offset = out_arg_offset;
1419   else if (x == virtual_cfa_rtx)
1420     {
1421 #ifdef FRAME_POINTER_CFA_OFFSET
1422       new_rtx = frame_pointer_rtx;
1423 #else
1424       new_rtx = arg_pointer_rtx;
1425 #endif
1426       offset = cfa_offset;
1427     }
1428   else if (x == virtual_preferred_stack_boundary_rtx)
1429     {
1430       new_rtx = GEN_INT (crtl->preferred_stack_boundary / BITS_PER_UNIT);
1431       offset = 0;
1432     }
1433   else
1434     return NULL_RTX;
1435
1436   *poffset = offset;
1437   return new_rtx;
1438 }
1439
1440 /* A subroutine of instantiate_virtual_regs, called via for_each_rtx.
1441    Instantiate any virtual registers present inside of *LOC.  The expression
1442    is simplified, as much as possible, but is not to be considered "valid"
1443    in any sense implied by the target.  If any change is made, set CHANGED
1444    to true.  */
1445
1446 static int
1447 instantiate_virtual_regs_in_rtx (rtx *loc, void *data)
1448 {
1449   HOST_WIDE_INT offset;
1450   bool *changed = (bool *) data;
1451   rtx x, new_rtx;
1452
1453   x = *loc;
1454   if (x == 0)
1455     return 0;
1456
1457   switch (GET_CODE (x))
1458     {
1459     case REG:
1460       new_rtx = instantiate_new_reg (x, &offset);
1461       if (new_rtx)
1462         {
1463           *loc = plus_constant (GET_MODE (x), new_rtx, offset);
1464           if (changed)
1465             *changed = true;
1466         }
1467       return -1;
1468
1469     case PLUS:
1470       new_rtx = instantiate_new_reg (XEXP (x, 0), &offset);
1471       if (new_rtx)
1472         {
1473           new_rtx = plus_constant (GET_MODE (x), new_rtx, offset);
1474           *loc = simplify_gen_binary (PLUS, GET_MODE (x), new_rtx, XEXP (x, 1));
1475           if (changed)
1476             *changed = true;
1477           return -1;
1478         }
1479
1480       /* FIXME -- from old code */
1481           /* If we have (plus (subreg (virtual-reg)) (const_int)), we know
1482              we can commute the PLUS and SUBREG because pointers into the
1483              frame are well-behaved.  */
1484       break;
1485
1486     default:
1487       break;
1488     }
1489
1490   return 0;
1491 }
1492
1493 /* A subroutine of instantiate_virtual_regs_in_insn.  Return true if X
1494    matches the predicate for insn CODE operand OPERAND.  */
1495
1496 static int
1497 safe_insn_predicate (int code, int operand, rtx x)
1498 {
1499   return code < 0 || insn_operand_matches ((enum insn_code) code, operand, x);
1500 }
1501
1502 /* A subroutine of instantiate_virtual_regs.  Instantiate any virtual
1503    registers present inside of insn.  The result will be a valid insn.  */
1504
1505 static void
1506 instantiate_virtual_regs_in_insn (rtx insn)
1507 {
1508   HOST_WIDE_INT offset;
1509   int insn_code, i;
1510   bool any_change = false;
1511   rtx set, new_rtx, x, seq;
1512
1513   /* There are some special cases to be handled first.  */
1514   set = single_set (insn);
1515   if (set)
1516     {
1517       /* We're allowed to assign to a virtual register.  This is interpreted
1518          to mean that the underlying register gets assigned the inverse
1519          transformation.  This is used, for example, in the handling of
1520          non-local gotos.  */
1521       new_rtx = instantiate_new_reg (SET_DEST (set), &offset);
1522       if (new_rtx)
1523         {
1524           start_sequence ();
1525
1526           for_each_rtx (&SET_SRC (set), instantiate_virtual_regs_in_rtx, NULL);
1527           x = simplify_gen_binary (PLUS, GET_MODE (new_rtx), SET_SRC (set),
1528                                    GEN_INT (-offset));
1529           x = force_operand (x, new_rtx);
1530           if (x != new_rtx)
1531             emit_move_insn (new_rtx, x);
1532
1533           seq = get_insns ();
1534           end_sequence ();
1535
1536           emit_insn_before (seq, insn);
1537           delete_insn (insn);
1538           return;
1539         }
1540
1541       /* Handle a straight copy from a virtual register by generating a
1542          new add insn.  The difference between this and falling through
1543          to the generic case is avoiding a new pseudo and eliminating a
1544          move insn in the initial rtl stream.  */
1545       new_rtx = instantiate_new_reg (SET_SRC (set), &offset);
1546       if (new_rtx && offset != 0
1547           && REG_P (SET_DEST (set))
1548           && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1549         {
1550           start_sequence ();
1551
1552           x = expand_simple_binop (GET_MODE (SET_DEST (set)), PLUS,
1553                                    new_rtx, GEN_INT (offset), SET_DEST (set),
1554                                    1, OPTAB_LIB_WIDEN);
1555           if (x != SET_DEST (set))
1556             emit_move_insn (SET_DEST (set), x);
1557
1558           seq = get_insns ();
1559           end_sequence ();
1560
1561           emit_insn_before (seq, insn);
1562           delete_insn (insn);
1563           return;
1564         }
1565
1566       extract_insn (insn);
1567       insn_code = INSN_CODE (insn);
1568
1569       /* Handle a plus involving a virtual register by determining if the
1570          operands remain valid if they're modified in place.  */
1571       if (GET_CODE (SET_SRC (set)) == PLUS
1572           && recog_data.n_operands >= 3
1573           && recog_data.operand_loc[1] == &XEXP (SET_SRC (set), 0)
1574           && recog_data.operand_loc[2] == &XEXP (SET_SRC (set), 1)
1575           && CONST_INT_P (recog_data.operand[2])
1576           && (new_rtx = instantiate_new_reg (recog_data.operand[1], &offset)))
1577         {
1578           offset += INTVAL (recog_data.operand[2]);
1579
1580           /* If the sum is zero, then replace with a plain move.  */
1581           if (offset == 0
1582               && REG_P (SET_DEST (set))
1583               && REGNO (SET_DEST (set)) > LAST_VIRTUAL_REGISTER)
1584             {
1585               start_sequence ();
1586               emit_move_insn (SET_DEST (set), new_rtx);
1587               seq = get_insns ();
1588               end_sequence ();
1589
1590               emit_insn_before (seq, insn);
1591               delete_insn (insn);
1592               return;
1593             }
1594
1595           x = gen_int_mode (offset, recog_data.operand_mode[2]);
1596
1597           /* Using validate_change and apply_change_group here leaves
1598              recog_data in an invalid state.  Since we know exactly what
1599              we want to check, do those two by hand.  */
1600           if (safe_insn_predicate (insn_code, 1, new_rtx)
1601               && safe_insn_predicate (insn_code, 2, x))
1602             {
1603               *recog_data.operand_loc[1] = recog_data.operand[1] = new_rtx;
1604               *recog_data.operand_loc[2] = recog_data.operand[2] = x;
1605               any_change = true;
1606
1607               /* Fall through into the regular operand fixup loop in
1608                  order to take care of operands other than 1 and 2.  */
1609             }
1610         }
1611     }
1612   else
1613     {
1614       extract_insn (insn);
1615       insn_code = INSN_CODE (insn);
1616     }
1617
1618   /* In the general case, we expect virtual registers to appear only in
1619      operands, and then only as either bare registers or inside memories.  */
1620   for (i = 0; i < recog_data.n_operands; ++i)
1621     {
1622       x = recog_data.operand[i];
1623       switch (GET_CODE (x))
1624         {
1625         case MEM:
1626           {
1627             rtx addr = XEXP (x, 0);
1628             bool changed = false;
1629
1630             for_each_rtx (&addr, instantiate_virtual_regs_in_rtx, &changed);
1631             if (!changed)
1632               continue;
1633
1634             start_sequence ();
1635             x = replace_equiv_address (x, addr);
1636             /* It may happen that the address with the virtual reg
1637                was valid (e.g. based on the virtual stack reg, which might
1638                be acceptable to the predicates with all offsets), whereas
1639                the address now isn't anymore, for instance when the address
1640                is still offsetted, but the base reg isn't virtual-stack-reg
1641                anymore.  Below we would do a force_reg on the whole operand,
1642                but this insn might actually only accept memory.  Hence,
1643                before doing that last resort, try to reload the address into
1644                a register, so this operand stays a MEM.  */
1645             if (!safe_insn_predicate (insn_code, i, x))
1646               {
1647                 addr = force_reg (GET_MODE (addr), addr);
1648                 x = replace_equiv_address (x, addr);
1649               }
1650             seq = get_insns ();
1651             end_sequence ();
1652             if (seq)
1653               emit_insn_before (seq, insn);
1654           }
1655           break;
1656
1657         case REG:
1658           new_rtx = instantiate_new_reg (x, &offset);
1659           if (new_rtx == NULL)
1660             continue;
1661           if (offset == 0)
1662             x = new_rtx;
1663           else
1664             {
1665               start_sequence ();
1666
1667               /* Careful, special mode predicates may have stuff in
1668                  insn_data[insn_code].operand[i].mode that isn't useful
1669                  to us for computing a new value.  */
1670               /* ??? Recognize address_operand and/or "p" constraints
1671                  to see if (plus new offset) is a valid before we put
1672                  this through expand_simple_binop.  */
1673               x = expand_simple_binop (GET_MODE (x), PLUS, new_rtx,
1674                                        GEN_INT (offset), NULL_RTX,
1675                                        1, OPTAB_LIB_WIDEN);
1676               seq = get_insns ();
1677               end_sequence ();
1678               emit_insn_before (seq, insn);
1679             }
1680           break;
1681
1682         case SUBREG:
1683           new_rtx = instantiate_new_reg (SUBREG_REG (x), &offset);
1684           if (new_rtx == NULL)
1685             continue;
1686           if (offset != 0)
1687             {
1688               start_sequence ();
1689               new_rtx = expand_simple_binop (GET_MODE (new_rtx), PLUS, new_rtx,
1690                                          GEN_INT (offset), NULL_RTX,
1691                                          1, OPTAB_LIB_WIDEN);
1692               seq = get_insns ();
1693               end_sequence ();
1694               emit_insn_before (seq, insn);
1695             }
1696           x = simplify_gen_subreg (recog_data.operand_mode[i], new_rtx,
1697                                    GET_MODE (new_rtx), SUBREG_BYTE (x));
1698           gcc_assert (x);
1699           break;
1700
1701         default:
1702           continue;
1703         }
1704
1705       /* At this point, X contains the new value for the operand.
1706          Validate the new value vs the insn predicate.  Note that
1707          asm insns will have insn_code -1 here.  */
1708       if (!safe_insn_predicate (insn_code, i, x))
1709         {
1710           start_sequence ();
1711           if (REG_P (x))
1712             {
1713               gcc_assert (REGNO (x) <= LAST_VIRTUAL_REGISTER);
1714               x = copy_to_reg (x);
1715             }
1716           else
1717             x = force_reg (insn_data[insn_code].operand[i].mode, x);
1718           seq = get_insns ();
1719           end_sequence ();
1720           if (seq)
1721             emit_insn_before (seq, insn);
1722         }
1723
1724       *recog_data.operand_loc[i] = recog_data.operand[i] = x;
1725       any_change = true;
1726     }
1727
1728   if (any_change)
1729     {
1730       /* Propagate operand changes into the duplicates.  */
1731       for (i = 0; i < recog_data.n_dups; ++i)
1732         *recog_data.dup_loc[i]
1733           = copy_rtx (recog_data.operand[(unsigned)recog_data.dup_num[i]]);
1734
1735       /* Force re-recognition of the instruction for validation.  */
1736       INSN_CODE (insn) = -1;
1737     }
1738
1739   if (asm_noperands (PATTERN (insn)) >= 0)
1740     {
1741       if (!check_asm_operands (PATTERN (insn)))
1742         {
1743           error_for_asm (insn, "impossible constraint in %<asm%>");
1744           delete_insn_and_edges (insn);
1745         }
1746     }
1747   else
1748     {
1749       if (recog_memoized (insn) < 0)
1750         fatal_insn_not_found (insn);
1751     }
1752 }
1753
1754 /* Subroutine of instantiate_decls.  Given RTL representing a decl,
1755    do any instantiation required.  */
1756
1757 void
1758 instantiate_decl_rtl (rtx x)
1759 {
1760   rtx addr;
1761
1762   if (x == 0)
1763     return;
1764
1765   /* If this is a CONCAT, recurse for the pieces.  */
1766   if (GET_CODE (x) == CONCAT)
1767     {
1768       instantiate_decl_rtl (XEXP (x, 0));
1769       instantiate_decl_rtl (XEXP (x, 1));
1770       return;
1771     }
1772
1773   /* If this is not a MEM, no need to do anything.  Similarly if the
1774      address is a constant or a register that is not a virtual register.  */
1775   if (!MEM_P (x))
1776     return;
1777
1778   addr = XEXP (x, 0);
1779   if (CONSTANT_P (addr)
1780       || (REG_P (addr)
1781           && (REGNO (addr) < FIRST_VIRTUAL_REGISTER
1782               || REGNO (addr) > LAST_VIRTUAL_REGISTER)))
1783     return;
1784
1785   for_each_rtx (&XEXP (x, 0), instantiate_virtual_regs_in_rtx, NULL);
1786 }
1787
1788 /* Helper for instantiate_decls called via walk_tree: Process all decls
1789    in the given DECL_VALUE_EXPR.  */
1790
1791 static tree
1792 instantiate_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
1793 {
1794   tree t = *tp;
1795   if (! EXPR_P (t))
1796     {
1797       *walk_subtrees = 0;
1798       if (DECL_P (t))
1799         {
1800           if (DECL_RTL_SET_P (t))
1801             instantiate_decl_rtl (DECL_RTL (t));
1802           if (TREE_CODE (t) == PARM_DECL && DECL_NAMELESS (t)
1803               && DECL_INCOMING_RTL (t))
1804             instantiate_decl_rtl (DECL_INCOMING_RTL (t));
1805           if ((TREE_CODE (t) == VAR_DECL
1806                || TREE_CODE (t) == RESULT_DECL)
1807               && DECL_HAS_VALUE_EXPR_P (t))
1808             {
1809               tree v = DECL_VALUE_EXPR (t);
1810               walk_tree (&v, instantiate_expr, NULL, NULL);
1811             }
1812         }
1813     }
1814   return NULL;
1815 }
1816
1817 /* Subroutine of instantiate_decls: Process all decls in the given
1818    BLOCK node and all its subblocks.  */
1819
1820 static void
1821 instantiate_decls_1 (tree let)
1822 {
1823   tree t;
1824
1825   for (t = BLOCK_VARS (let); t; t = DECL_CHAIN (t))
1826     {
1827       if (DECL_RTL_SET_P (t))
1828         instantiate_decl_rtl (DECL_RTL (t));
1829       if (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
1830         {
1831           tree v = DECL_VALUE_EXPR (t);
1832           walk_tree (&v, instantiate_expr, NULL, NULL);
1833         }
1834     }
1835
1836   /* Process all subblocks.  */
1837   for (t = BLOCK_SUBBLOCKS (let); t; t = BLOCK_CHAIN (t))
1838     instantiate_decls_1 (t);
1839 }
1840
1841 /* Scan all decls in FNDECL (both variables and parameters) and instantiate
1842    all virtual registers in their DECL_RTL's.  */
1843
1844 static void
1845 instantiate_decls (tree fndecl)
1846 {
1847   tree decl;
1848   unsigned ix;
1849
1850   /* Process all parameters of the function.  */
1851   for (decl = DECL_ARGUMENTS (fndecl); decl; decl = DECL_CHAIN (decl))
1852     {
1853       instantiate_decl_rtl (DECL_RTL (decl));
1854       instantiate_decl_rtl (DECL_INCOMING_RTL (decl));
1855       if (DECL_HAS_VALUE_EXPR_P (decl))
1856         {
1857           tree v = DECL_VALUE_EXPR (decl);
1858           walk_tree (&v, instantiate_expr, NULL, NULL);
1859         }
1860     }
1861
1862   if ((decl = DECL_RESULT (fndecl))
1863       && TREE_CODE (decl) == RESULT_DECL)
1864     {
1865       if (DECL_RTL_SET_P (decl))
1866         instantiate_decl_rtl (DECL_RTL (decl));
1867       if (DECL_HAS_VALUE_EXPR_P (decl))
1868         {
1869           tree v = DECL_VALUE_EXPR (decl);
1870           walk_tree (&v, instantiate_expr, NULL, NULL);
1871         }
1872     }
1873
1874   /* Now process all variables defined in the function or its subblocks.  */
1875   instantiate_decls_1 (DECL_INITIAL (fndecl));
1876
1877   FOR_EACH_LOCAL_DECL (cfun, ix, decl)
1878     if (DECL_RTL_SET_P (decl))
1879       instantiate_decl_rtl (DECL_RTL (decl));
1880   VEC_free (tree, gc, cfun->local_decls);
1881 }
1882
1883 /* Pass through the INSNS of function FNDECL and convert virtual register
1884    references to hard register references.  */
1885
1886 static unsigned int
1887 instantiate_virtual_regs (void)
1888 {
1889   rtx insn;
1890
1891   /* Compute the offsets to use for this function.  */
1892   in_arg_offset = FIRST_PARM_OFFSET (current_function_decl);
1893   var_offset = STARTING_FRAME_OFFSET;
1894   dynamic_offset = STACK_DYNAMIC_OFFSET (current_function_decl);
1895   out_arg_offset = STACK_POINTER_OFFSET;
1896 #ifdef FRAME_POINTER_CFA_OFFSET
1897   cfa_offset = FRAME_POINTER_CFA_OFFSET (current_function_decl);
1898 #else
1899   cfa_offset = ARG_POINTER_CFA_OFFSET (current_function_decl);
1900 #endif
1901
1902   /* Initialize recognition, indicating that volatile is OK.  */
1903   init_recog ();
1904
1905   /* Scan through all the insns, instantiating every virtual register still
1906      present.  */
1907   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
1908     if (INSN_P (insn))
1909       {
1910         /* These patterns in the instruction stream can never be recognized.
1911            Fortunately, they shouldn't contain virtual registers either.  */
1912         if (GET_CODE (PATTERN (insn)) == USE
1913             || GET_CODE (PATTERN (insn)) == CLOBBER
1914             || GET_CODE (PATTERN (insn)) == ADDR_VEC
1915             || GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
1916             || GET_CODE (PATTERN (insn)) == ASM_INPUT)
1917           continue;
1918         else if (DEBUG_INSN_P (insn))
1919           for_each_rtx (&INSN_VAR_LOCATION (insn),
1920                         instantiate_virtual_regs_in_rtx, NULL);
1921         else
1922           instantiate_virtual_regs_in_insn (insn);
1923
1924         if (INSN_DELETED_P (insn))
1925           continue;
1926
1927         for_each_rtx (&REG_NOTES (insn), instantiate_virtual_regs_in_rtx, NULL);
1928
1929         /* Instantiate any virtual registers in CALL_INSN_FUNCTION_USAGE.  */
1930         if (CALL_P (insn))
1931           for_each_rtx (&CALL_INSN_FUNCTION_USAGE (insn),
1932                         instantiate_virtual_regs_in_rtx, NULL);
1933       }
1934
1935   /* Instantiate the virtual registers in the DECLs for debugging purposes.  */
1936   instantiate_decls (current_function_decl);
1937
1938   targetm.instantiate_decls ();
1939
1940   /* Indicate that, from now on, assign_stack_local should use
1941      frame_pointer_rtx.  */
1942   virtuals_instantiated = 1;
1943
1944   return 0;
1945 }
1946
1947 struct rtl_opt_pass pass_instantiate_virtual_regs =
1948 {
1949  {
1950   RTL_PASS,
1951   "vregs",                              /* name */
1952   NULL,                                 /* gate */
1953   instantiate_virtual_regs,             /* execute */
1954   NULL,                                 /* sub */
1955   NULL,                                 /* next */
1956   0,                                    /* static_pass_number */
1957   TV_NONE,                              /* tv_id */
1958   0,                                    /* properties_required */
1959   0,                                    /* properties_provided */
1960   0,                                    /* properties_destroyed */
1961   0,                                    /* todo_flags_start */
1962   0                                     /* todo_flags_finish */
1963  }
1964 };
1965
1966 \f
1967 /* Return 1 if EXP is an aggregate type (or a value with aggregate type).
1968    This means a type for which function calls must pass an address to the
1969    function or get an address back from the function.
1970    EXP may be a type node or an expression (whose type is tested).  */
1971
1972 int
1973 aggregate_value_p (const_tree exp, const_tree fntype)
1974 {
1975   const_tree type = (TYPE_P (exp)) ? exp : TREE_TYPE (exp);
1976   int i, regno, nregs;
1977   rtx reg;
1978
1979   if (fntype)
1980     switch (TREE_CODE (fntype))
1981       {
1982       case CALL_EXPR:
1983         {
1984           tree fndecl = get_callee_fndecl (fntype);
1985           fntype = (fndecl
1986                     ? TREE_TYPE (fndecl)
1987                     : TREE_TYPE (TREE_TYPE (CALL_EXPR_FN (fntype))));
1988         }
1989         break;
1990       case FUNCTION_DECL:
1991         fntype = TREE_TYPE (fntype);
1992         break;
1993       case FUNCTION_TYPE:
1994       case METHOD_TYPE:
1995         break;
1996       case IDENTIFIER_NODE:
1997         fntype = NULL_TREE;
1998         break;
1999       default:
2000         /* We don't expect other tree types here.  */
2001         gcc_unreachable ();
2002       }
2003
2004   if (VOID_TYPE_P (type))
2005     return 0;
2006
2007   /* If a record should be passed the same as its first (and only) member
2008      don't pass it as an aggregate.  */
2009   if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
2010     return aggregate_value_p (first_field (type), fntype);
2011
2012   /* If the front end has decided that this needs to be passed by
2013      reference, do so.  */
2014   if ((TREE_CODE (exp) == PARM_DECL || TREE_CODE (exp) == RESULT_DECL)
2015       && DECL_BY_REFERENCE (exp))
2016     return 1;
2017
2018   /* Function types that are TREE_ADDRESSABLE force return in memory.  */
2019   if (fntype && TREE_ADDRESSABLE (fntype))
2020     return 1;
2021
2022   /* Types that are TREE_ADDRESSABLE must be constructed in memory,
2023      and thus can't be returned in registers.  */
2024   if (TREE_ADDRESSABLE (type))
2025     return 1;
2026
2027   if (flag_pcc_struct_return && AGGREGATE_TYPE_P (type))
2028     return 1;
2029
2030   if (targetm.calls.return_in_memory (type, fntype))
2031     return 1;
2032
2033   /* Make sure we have suitable call-clobbered regs to return
2034      the value in; if not, we must return it in memory.  */
2035   reg = hard_function_value (type, 0, fntype, 0);
2036
2037   /* If we have something other than a REG (e.g. a PARALLEL), then assume
2038      it is OK.  */
2039   if (!REG_P (reg))
2040     return 0;
2041
2042   regno = REGNO (reg);
2043   nregs = hard_regno_nregs[regno][TYPE_MODE (type)];
2044   for (i = 0; i < nregs; i++)
2045     if (! call_used_regs[regno + i])
2046       return 1;
2047
2048   return 0;
2049 }
2050 \f
2051 /* Return true if we should assign DECL a pseudo register; false if it
2052    should live on the local stack.  */
2053
2054 bool
2055 use_register_for_decl (const_tree decl)
2056 {
2057   if (!targetm.calls.allocate_stack_slots_for_args())
2058     return true;
2059
2060   /* Honor volatile.  */
2061   if (TREE_SIDE_EFFECTS (decl))
2062     return false;
2063
2064   /* Honor addressability.  */
2065   if (TREE_ADDRESSABLE (decl))
2066     return false;
2067
2068   /* Only register-like things go in registers.  */
2069   if (DECL_MODE (decl) == BLKmode)
2070     return false;
2071
2072   /* If -ffloat-store specified, don't put explicit float variables
2073      into registers.  */
2074   /* ??? This should be checked after DECL_ARTIFICIAL, but tree-ssa
2075      propagates values across these stores, and it probably shouldn't.  */
2076   if (flag_float_store && FLOAT_TYPE_P (TREE_TYPE (decl)))
2077     return false;
2078
2079   /* If we're not interested in tracking debugging information for
2080      this decl, then we can certainly put it in a register.  */
2081   if (DECL_IGNORED_P (decl))
2082     return true;
2083
2084   if (optimize)
2085     return true;
2086
2087   if (!DECL_REGISTER (decl))
2088     return false;
2089
2090   switch (TREE_CODE (TREE_TYPE (decl)))
2091     {
2092     case RECORD_TYPE:
2093     case UNION_TYPE:
2094     case QUAL_UNION_TYPE:
2095       /* When not optimizing, disregard register keyword for variables with
2096          types containing methods, otherwise the methods won't be callable
2097          from the debugger.  */
2098       if (TYPE_METHODS (TREE_TYPE (decl)))
2099         return false;
2100       break;
2101     default:
2102       break;
2103     }
2104
2105   return true;
2106 }
2107
2108 /* Return true if TYPE should be passed by invisible reference.  */
2109
2110 bool
2111 pass_by_reference (CUMULATIVE_ARGS *ca, enum machine_mode mode,
2112                    tree type, bool named_arg)
2113 {
2114   if (type)
2115     {
2116       /* If this type contains non-trivial constructors, then it is
2117          forbidden for the middle-end to create any new copies.  */
2118       if (TREE_ADDRESSABLE (type))
2119         return true;
2120
2121       /* GCC post 3.4 passes *all* variable sized types by reference.  */
2122       if (!TYPE_SIZE (type) || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
2123         return true;
2124
2125       /* If a record type should be passed the same as its first (and only)
2126          member, use the type and mode of that member.  */
2127       if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
2128         {
2129           type = TREE_TYPE (first_field (type));
2130           mode = TYPE_MODE (type);
2131         }
2132     }
2133
2134   return targetm.calls.pass_by_reference (pack_cumulative_args (ca), mode,
2135                                           type, named_arg);
2136 }
2137
2138 /* Return true if TYPE, which is passed by reference, should be callee
2139    copied instead of caller copied.  */
2140
2141 bool
2142 reference_callee_copied (CUMULATIVE_ARGS *ca, enum machine_mode mode,
2143                          tree type, bool named_arg)
2144 {
2145   if (type && TREE_ADDRESSABLE (type))
2146     return false;
2147   return targetm.calls.callee_copies (pack_cumulative_args (ca), mode, type,
2148                                       named_arg);
2149 }
2150
2151 /* Structures to communicate between the subroutines of assign_parms.
2152    The first holds data persistent across all parameters, the second
2153    is cleared out for each parameter.  */
2154
2155 struct assign_parm_data_all
2156 {
2157   /* When INIT_CUMULATIVE_ARGS gets revamped, allocating CUMULATIVE_ARGS
2158      should become a job of the target or otherwise encapsulated.  */
2159   CUMULATIVE_ARGS args_so_far_v;
2160   cumulative_args_t args_so_far;
2161   struct args_size stack_args_size;
2162   tree function_result_decl;
2163   tree orig_fnargs;
2164   rtx first_conversion_insn;
2165   rtx last_conversion_insn;
2166   HOST_WIDE_INT pretend_args_size;
2167   HOST_WIDE_INT extra_pretend_bytes;
2168   int reg_parm_stack_space;
2169 };
2170
2171 struct assign_parm_data_one
2172 {
2173   tree nominal_type;
2174   tree passed_type;
2175   rtx entry_parm;
2176   rtx stack_parm;
2177   enum machine_mode nominal_mode;
2178   enum machine_mode passed_mode;
2179   enum machine_mode promoted_mode;
2180   struct locate_and_pad_arg_data locate;
2181   int partial;
2182   BOOL_BITFIELD named_arg : 1;
2183   BOOL_BITFIELD passed_pointer : 1;
2184   BOOL_BITFIELD on_stack : 1;
2185   BOOL_BITFIELD loaded_in_reg : 1;
2186 };
2187
2188 /* A subroutine of assign_parms.  Initialize ALL.  */
2189
2190 static void
2191 assign_parms_initialize_all (struct assign_parm_data_all *all)
2192 {
2193   tree fntype ATTRIBUTE_UNUSED;
2194
2195   memset (all, 0, sizeof (*all));
2196
2197   fntype = TREE_TYPE (current_function_decl);
2198
2199 #ifdef INIT_CUMULATIVE_INCOMING_ARGS
2200   INIT_CUMULATIVE_INCOMING_ARGS (all->args_so_far_v, fntype, NULL_RTX);
2201 #else
2202   INIT_CUMULATIVE_ARGS (all->args_so_far_v, fntype, NULL_RTX,
2203                         current_function_decl, -1);
2204 #endif
2205   all->args_so_far = pack_cumulative_args (&all->args_so_far_v);
2206
2207 #ifdef REG_PARM_STACK_SPACE
2208   all->reg_parm_stack_space = REG_PARM_STACK_SPACE (current_function_decl);
2209 #endif
2210 }
2211
2212 /* If ARGS contains entries with complex types, split the entry into two
2213    entries of the component type.  Return a new list of substitutions are
2214    needed, else the old list.  */
2215
2216 static void
2217 split_complex_args (VEC(tree, heap) **args)
2218 {
2219   unsigned i;
2220   tree p;
2221
2222   FOR_EACH_VEC_ELT (tree, *args, i, p)
2223     {
2224       tree type = TREE_TYPE (p);
2225       if (TREE_CODE (type) == COMPLEX_TYPE
2226           && targetm.calls.split_complex_arg (type))
2227         {
2228           tree decl;
2229           tree subtype = TREE_TYPE (type);
2230           bool addressable = TREE_ADDRESSABLE (p);
2231
2232           /* Rewrite the PARM_DECL's type with its component.  */
2233           p = copy_node (p);
2234           TREE_TYPE (p) = subtype;
2235           DECL_ARG_TYPE (p) = TREE_TYPE (DECL_ARG_TYPE (p));
2236           DECL_MODE (p) = VOIDmode;
2237           DECL_SIZE (p) = NULL;
2238           DECL_SIZE_UNIT (p) = NULL;
2239           /* If this arg must go in memory, put it in a pseudo here.
2240              We can't allow it to go in memory as per normal parms,
2241              because the usual place might not have the imag part
2242              adjacent to the real part.  */
2243           DECL_ARTIFICIAL (p) = addressable;
2244           DECL_IGNORED_P (p) = addressable;
2245           TREE_ADDRESSABLE (p) = 0;
2246           layout_decl (p, 0);
2247           VEC_replace (tree, *args, i, p);
2248
2249           /* Build a second synthetic decl.  */
2250           decl = build_decl (EXPR_LOCATION (p),
2251                              PARM_DECL, NULL_TREE, subtype);
2252           DECL_ARG_TYPE (decl) = DECL_ARG_TYPE (p);
2253           DECL_ARTIFICIAL (decl) = addressable;
2254           DECL_IGNORED_P (decl) = addressable;
2255           layout_decl (decl, 0);
2256           VEC_safe_insert (tree, heap, *args, ++i, decl);
2257         }
2258     }
2259 }
2260
2261 /* A subroutine of assign_parms.  Adjust the parameter list to incorporate
2262    the hidden struct return argument, and (abi willing) complex args.
2263    Return the new parameter list.  */
2264
2265 static VEC(tree, heap) *
2266 assign_parms_augmented_arg_list (struct assign_parm_data_all *all)
2267 {
2268   tree fndecl = current_function_decl;
2269   tree fntype = TREE_TYPE (fndecl);
2270   VEC(tree, heap) *fnargs = NULL;
2271   tree arg;
2272
2273   for (arg = DECL_ARGUMENTS (fndecl); arg; arg = DECL_CHAIN (arg))
2274     VEC_safe_push (tree, heap, fnargs, arg);
2275
2276   all->orig_fnargs = DECL_ARGUMENTS (fndecl);
2277
2278   /* If struct value address is treated as the first argument, make it so.  */
2279   if (aggregate_value_p (DECL_RESULT (fndecl), fndecl)
2280       && ! cfun->returns_pcc_struct
2281       && targetm.calls.struct_value_rtx (TREE_TYPE (fndecl), 1) == 0)
2282     {
2283       tree type = build_pointer_type (TREE_TYPE (fntype));
2284       tree decl;
2285
2286       decl = build_decl (DECL_SOURCE_LOCATION (fndecl),
2287                          PARM_DECL, get_identifier (".result_ptr"), type);
2288       DECL_ARG_TYPE (decl) = type;
2289       DECL_ARTIFICIAL (decl) = 1;
2290       DECL_NAMELESS (decl) = 1;
2291       TREE_CONSTANT (decl) = 1;
2292
2293       DECL_CHAIN (decl) = all->orig_fnargs;
2294       all->orig_fnargs = decl;
2295       VEC_safe_insert (tree, heap, fnargs, 0, decl);
2296
2297       all->function_result_decl = decl;
2298     }
2299
2300   /* If the target wants to split complex arguments into scalars, do so.  */
2301   if (targetm.calls.split_complex_arg)
2302     split_complex_args (&fnargs);
2303
2304   return fnargs;
2305 }
2306
2307 /* A subroutine of assign_parms.  Examine PARM and pull out type and mode
2308    data for the parameter.  Incorporate ABI specifics such as pass-by-
2309    reference and type promotion.  */
2310
2311 static void
2312 assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
2313                              struct assign_parm_data_one *data)
2314 {
2315   tree nominal_type, passed_type;
2316   enum machine_mode nominal_mode, passed_mode, promoted_mode;
2317   int unsignedp;
2318
2319   memset (data, 0, sizeof (*data));
2320
2321   /* NAMED_ARG is a misnomer.  We really mean 'non-variadic'. */
2322   if (!cfun->stdarg)
2323     data->named_arg = 1;  /* No variadic parms.  */
2324   else if (DECL_CHAIN (parm))
2325     data->named_arg = 1;  /* Not the last non-variadic parm. */
2326   else if (targetm.calls.strict_argument_naming (all->args_so_far))
2327     data->named_arg = 1;  /* Only variadic ones are unnamed.  */
2328   else
2329     data->named_arg = 0;  /* Treat as variadic.  */
2330
2331   nominal_type = TREE_TYPE (parm);
2332   passed_type = DECL_ARG_TYPE (parm);
2333
2334   /* Look out for errors propagating this far.  Also, if the parameter's
2335      type is void then its value doesn't matter.  */
2336   if (TREE_TYPE (parm) == error_mark_node
2337       /* This can happen after weird syntax errors
2338          or if an enum type is defined among the parms.  */
2339       || TREE_CODE (parm) != PARM_DECL
2340       || passed_type == NULL
2341       || VOID_TYPE_P (nominal_type))
2342     {
2343       nominal_type = passed_type = void_type_node;
2344       nominal_mode = passed_mode = promoted_mode = VOIDmode;
2345       goto egress;
2346     }
2347
2348   /* Find mode of arg as it is passed, and mode of arg as it should be
2349      during execution of this function.  */
2350   passed_mode = TYPE_MODE (passed_type);
2351   nominal_mode = TYPE_MODE (nominal_type);
2352
2353   /* If the parm is to be passed as a transparent union or record, use the
2354      type of the first field for the tests below.  We have already verified
2355      that the modes are the same.  */
2356   if ((TREE_CODE (passed_type) == UNION_TYPE
2357        || TREE_CODE (passed_type) == RECORD_TYPE)
2358       && TYPE_TRANSPARENT_AGGR (passed_type))
2359     passed_type = TREE_TYPE (first_field (passed_type));
2360
2361   /* See if this arg was passed by invisible reference.  */
2362   if (pass_by_reference (&all->args_so_far_v, passed_mode,
2363                          passed_type, data->named_arg))
2364     {
2365       passed_type = nominal_type = build_pointer_type (passed_type);
2366       data->passed_pointer = true;
2367       passed_mode = nominal_mode = Pmode;
2368     }
2369
2370   /* Find mode as it is passed by the ABI.  */
2371   unsignedp = TYPE_UNSIGNED (passed_type);
2372   promoted_mode = promote_function_mode (passed_type, passed_mode, &unsignedp,
2373                                          TREE_TYPE (current_function_decl), 0);
2374
2375  egress:
2376   data->nominal_type = nominal_type;
2377   data->passed_type = passed_type;
2378   data->nominal_mode = nominal_mode;
2379   data->passed_mode = passed_mode;
2380   data->promoted_mode = promoted_mode;
2381 }
2382
2383 /* A subroutine of assign_parms.  Invoke setup_incoming_varargs.  */
2384
2385 static void
2386 assign_parms_setup_varargs (struct assign_parm_data_all *all,
2387                             struct assign_parm_data_one *data, bool no_rtl)
2388 {
2389   int varargs_pretend_bytes = 0;
2390
2391   targetm.calls.setup_incoming_varargs (all->args_so_far,
2392                                         data->promoted_mode,
2393                                         data->passed_type,
2394                                         &varargs_pretend_bytes, no_rtl);
2395
2396   /* If the back-end has requested extra stack space, record how much is
2397      needed.  Do not change pretend_args_size otherwise since it may be
2398      nonzero from an earlier partial argument.  */
2399   if (varargs_pretend_bytes > 0)
2400     all->pretend_args_size = varargs_pretend_bytes;
2401 }
2402
2403 /* A subroutine of assign_parms.  Set DATA->ENTRY_PARM corresponding to
2404    the incoming location of the current parameter.  */
2405
2406 static void
2407 assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
2408                             struct assign_parm_data_one *data)
2409 {
2410   HOST_WIDE_INT pretend_bytes = 0;
2411   rtx entry_parm;
2412   bool in_regs;
2413
2414   if (data->promoted_mode == VOIDmode)
2415     {
2416       data->entry_parm = data->stack_parm = const0_rtx;
2417       return;
2418     }
2419
2420   entry_parm = targetm.calls.function_incoming_arg (all->args_so_far,
2421                                                     data->promoted_mode,
2422                                                     data->passed_type,
2423                                                     data->named_arg);
2424
2425   if (entry_parm == 0)
2426     data->promoted_mode = data->passed_mode;
2427
2428   /* Determine parm's home in the stack, in case it arrives in the stack
2429      or we should pretend it did.  Compute the stack position and rtx where
2430      the argument arrives and its size.
2431
2432      There is one complexity here:  If this was a parameter that would
2433      have been passed in registers, but wasn't only because it is
2434      __builtin_va_alist, we want locate_and_pad_parm to treat it as if
2435      it came in a register so that REG_PARM_STACK_SPACE isn't skipped.
2436      In this case, we call FUNCTION_ARG with NAMED set to 1 instead of 0
2437      as it was the previous time.  */
2438   in_regs = entry_parm != 0;
2439 #ifdef STACK_PARMS_IN_REG_PARM_AREA
2440   in_regs = true;
2441 #endif
2442   if (!in_regs && !data->named_arg)
2443     {
2444       if (targetm.calls.pretend_outgoing_varargs_named (all->args_so_far))
2445         {
2446           rtx tem;
2447           tem = targetm.calls.function_incoming_arg (all->args_so_far,
2448                                                      data->promoted_mode,
2449                                                      data->passed_type, true);
2450           in_regs = tem != NULL;
2451         }
2452     }
2453
2454   /* If this parameter was passed both in registers and in the stack, use
2455      the copy on the stack.  */
2456   if (targetm.calls.must_pass_in_stack (data->promoted_mode,
2457                                         data->passed_type))
2458     entry_parm = 0;
2459
2460   if (entry_parm)
2461     {
2462       int partial;
2463
2464       partial = targetm.calls.arg_partial_bytes (all->args_so_far,
2465                                                  data->promoted_mode,
2466                                                  data->passed_type,
2467                                                  data->named_arg);
2468       data->partial = partial;
2469
2470       /* The caller might already have allocated stack space for the
2471          register parameters.  */
2472       if (partial != 0 && all->reg_parm_stack_space == 0)
2473         {
2474           /* Part of this argument is passed in registers and part
2475              is passed on the stack.  Ask the prologue code to extend
2476              the stack part so that we can recreate the full value.
2477
2478              PRETEND_BYTES is the size of the registers we need to store.
2479              CURRENT_FUNCTION_PRETEND_ARGS_SIZE is the amount of extra
2480              stack space that the prologue should allocate.
2481
2482              Internally, gcc assumes that the argument pointer is aligned
2483              to STACK_BOUNDARY bits.  This is used both for alignment
2484              optimizations (see init_emit) and to locate arguments that are
2485              aligned to more than PARM_BOUNDARY bits.  We must preserve this
2486              invariant by rounding CURRENT_FUNCTION_PRETEND_ARGS_SIZE up to
2487              a stack boundary.  */
2488
2489           /* We assume at most one partial arg, and it must be the first
2490              argument on the stack.  */
2491           gcc_assert (!all->extra_pretend_bytes && !all->pretend_args_size);
2492
2493           pretend_bytes = partial;
2494           all->pretend_args_size = CEIL_ROUND (pretend_bytes, STACK_BYTES);
2495
2496           /* We want to align relative to the actual stack pointer, so
2497              don't include this in the stack size until later.  */
2498           all->extra_pretend_bytes = all->pretend_args_size;
2499         }
2500     }
2501
2502   locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs,
2503                        entry_parm ? data->partial : 0, current_function_decl,
2504                        &all->stack_args_size, &data->locate);
2505
2506   /* Update parm_stack_boundary if this parameter is passed in the
2507      stack.  */
2508   if (!in_regs && crtl->parm_stack_boundary < data->locate.boundary)
2509     crtl->parm_stack_boundary = data->locate.boundary;
2510
2511   /* Adjust offsets to include the pretend args.  */
2512   pretend_bytes = all->extra_pretend_bytes - pretend_bytes;
2513   data->locate.slot_offset.constant += pretend_bytes;
2514   data->locate.offset.constant += pretend_bytes;
2515
2516   data->entry_parm = entry_parm;
2517 }
2518
2519 /* A subroutine of assign_parms.  If there is actually space on the stack
2520    for this parm, count it in stack_args_size and return true.  */
2521
2522 static bool
2523 assign_parm_is_stack_parm (struct assign_parm_data_all *all,
2524                            struct assign_parm_data_one *data)
2525 {
2526   /* Trivially true if we've no incoming register.  */
2527   if (data->entry_parm == NULL)
2528     ;
2529   /* Also true if we're partially in registers and partially not,
2530      since we've arranged to drop the entire argument on the stack.  */
2531   else if (data->partial != 0)
2532     ;
2533   /* Also true if the target says that it's passed in both registers
2534      and on the stack.  */
2535   else if (GET_CODE (data->entry_parm) == PARALLEL
2536            && XEXP (XVECEXP (data->entry_parm, 0, 0), 0) == NULL_RTX)
2537     ;
2538   /* Also true if the target says that there's stack allocated for
2539      all register parameters.  */
2540   else if (all->reg_parm_stack_space > 0)
2541     ;
2542   /* Otherwise, no, this parameter has no ABI defined stack slot.  */
2543   else
2544     return false;
2545
2546   all->stack_args_size.constant += data->locate.size.constant;
2547   if (data->locate.size.var)
2548     ADD_PARM_SIZE (all->stack_args_size, data->locate.size.var);
2549
2550   return true;
2551 }
2552
2553 /* A subroutine of assign_parms.  Given that this parameter is allocated
2554    stack space by the ABI, find it.  */
2555
2556 static void
2557 assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
2558 {
2559   rtx offset_rtx, stack_parm;
2560   unsigned int align, boundary;
2561
2562   /* If we're passing this arg using a reg, make its stack home the
2563      aligned stack slot.  */
2564   if (data->entry_parm)
2565     offset_rtx = ARGS_SIZE_RTX (data->locate.slot_offset);
2566   else
2567     offset_rtx = ARGS_SIZE_RTX (data->locate.offset);
2568
2569   stack_parm = crtl->args.internal_arg_pointer;
2570   if (offset_rtx != const0_rtx)
2571     stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
2572   stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
2573
2574   if (!data->passed_pointer)
2575     {
2576       set_mem_attributes (stack_parm, parm, 1);
2577       /* set_mem_attributes could set MEM_SIZE to the passed mode's size,
2578          while promoted mode's size is needed.  */
2579       if (data->promoted_mode != BLKmode
2580           && data->promoted_mode != DECL_MODE (parm))
2581         {
2582           set_mem_size (stack_parm, GET_MODE_SIZE (data->promoted_mode));
2583           if (MEM_EXPR (stack_parm) && MEM_OFFSET_KNOWN_P (stack_parm))
2584             {
2585               int offset = subreg_lowpart_offset (DECL_MODE (parm),
2586                                                   data->promoted_mode);
2587               if (offset)
2588                 set_mem_offset (stack_parm, MEM_OFFSET (stack_parm) - offset);
2589             }
2590         }
2591     }
2592
2593   boundary = data->locate.boundary;
2594   align = BITS_PER_UNIT;
2595
2596   /* If we're padding upward, we know that the alignment of the slot
2597      is TARGET_FUNCTION_ARG_BOUNDARY.  If we're using slot_offset, we're
2598      intentionally forcing upward padding.  Otherwise we have to come
2599      up with a guess at the alignment based on OFFSET_RTX.  */
2600   if (data->locate.where_pad != downward || data->entry_parm)
2601     align = boundary;
2602   else if (CONST_INT_P (offset_rtx))
2603     {
2604       align = INTVAL (offset_rtx) * BITS_PER_UNIT | boundary;
2605       align = align & -align;
2606     }
2607   set_mem_align (stack_parm, align);
2608
2609   if (data->entry_parm)
2610     set_reg_attrs_for_parm (data->entry_parm, stack_parm);
2611
2612   data->stack_parm = stack_parm;
2613 }
2614
2615 /* A subroutine of assign_parms.  Adjust DATA->ENTRY_RTL such that it's
2616    always valid and contiguous.  */
2617
2618 static void
2619 assign_parm_adjust_entry_rtl (struct assign_parm_data_one *data)
2620 {
2621   rtx entry_parm = data->entry_parm;
2622   rtx stack_parm = data->stack_parm;
2623
2624   /* If this parm was passed part in regs and part in memory, pretend it
2625      arrived entirely in memory by pushing the register-part onto the stack.
2626      In the special case of a DImode or DFmode that is split, we could put
2627      it together in a pseudoreg directly, but for now that's not worth
2628      bothering with.  */
2629   if (data->partial != 0)
2630     {
2631       /* Handle calls that pass values in multiple non-contiguous
2632          locations.  The Irix 6 ABI has examples of this.  */
2633       if (GET_CODE (entry_parm) == PARALLEL)
2634         emit_group_store (validize_mem (stack_parm), entry_parm,
2635                           data->passed_type,
2636                           int_size_in_bytes (data->passed_type));
2637       else
2638         {
2639           gcc_assert (data->partial % UNITS_PER_WORD == 0);
2640           move_block_from_reg (REGNO (entry_parm), validize_mem (stack_parm),
2641                                data->partial / UNITS_PER_WORD);
2642         }
2643
2644       entry_parm = stack_parm;
2645     }
2646
2647   /* If we didn't decide this parm came in a register, by default it came
2648      on the stack.  */
2649   else if (entry_parm == NULL)
2650     entry_parm = stack_parm;
2651
2652   /* When an argument is passed in multiple locations, we can't make use
2653      of this information, but we can save some copying if the whole argument
2654      is passed in a single register.  */
2655   else if (GET_CODE (entry_parm) == PARALLEL
2656            && data->nominal_mode != BLKmode
2657            && data->passed_mode != BLKmode)
2658     {
2659       size_t i, len = XVECLEN (entry_parm, 0);
2660
2661       for (i = 0; i < len; i++)
2662         if (XEXP (XVECEXP (entry_parm, 0, i), 0) != NULL_RTX
2663             && REG_P (XEXP (XVECEXP (entry_parm, 0, i), 0))
2664             && (GET_MODE (XEXP (XVECEXP (entry_parm, 0, i), 0))
2665                 == data->passed_mode)
2666             && INTVAL (XEXP (XVECEXP (entry_parm, 0, i), 1)) == 0)
2667           {
2668             entry_parm = XEXP (XVECEXP (entry_parm, 0, i), 0);
2669             break;
2670           }
2671     }
2672
2673   data->entry_parm = entry_parm;
2674 }
2675
2676 /* A subroutine of assign_parms.  Reconstitute any values which were
2677    passed in multiple registers and would fit in a single register.  */
2678
2679 static void
2680 assign_parm_remove_parallels (struct assign_parm_data_one *data)
2681 {
2682   rtx entry_parm = data->entry_parm;
2683
2684   /* Convert the PARALLEL to a REG of the same mode as the parallel.
2685      This can be done with register operations rather than on the
2686      stack, even if we will store the reconstituted parameter on the
2687      stack later.  */
2688   if (GET_CODE (entry_parm) == PARALLEL && GET_MODE (entry_parm) != BLKmode)
2689     {
2690       rtx parmreg = gen_reg_rtx (GET_MODE (entry_parm));
2691       emit_group_store (parmreg, entry_parm, data->passed_type,
2692                         GET_MODE_SIZE (GET_MODE (entry_parm)));
2693       entry_parm = parmreg;
2694     }
2695
2696   data->entry_parm = entry_parm;
2697 }
2698
2699 /* A subroutine of assign_parms.  Adjust DATA->STACK_RTL such that it's
2700    always valid and properly aligned.  */
2701
2702 static void
2703 assign_parm_adjust_stack_rtl (struct assign_parm_data_one *data)
2704 {
2705   rtx stack_parm = data->stack_parm;
2706
2707   /* If we can't trust the parm stack slot to be aligned enough for its
2708      ultimate type, don't use that slot after entry.  We'll make another
2709      stack slot, if we need one.  */
2710   if (stack_parm
2711       && ((STRICT_ALIGNMENT
2712            && GET_MODE_ALIGNMENT (data->nominal_mode) > MEM_ALIGN (stack_parm))
2713           || (data->nominal_type
2714               && TYPE_ALIGN (data->nominal_type) > MEM_ALIGN (stack_parm)
2715               && MEM_ALIGN (stack_parm) < PREFERRED_STACK_BOUNDARY)))
2716     stack_parm = NULL;
2717
2718   /* If parm was passed in memory, and we need to convert it on entry,
2719      don't store it back in that same slot.  */
2720   else if (data->entry_parm == stack_parm
2721            && data->nominal_mode != BLKmode
2722            && data->nominal_mode != data->passed_mode)
2723     stack_parm = NULL;
2724
2725   /* If stack protection is in effect for this function, don't leave any
2726      pointers in their passed stack slots.  */
2727   else if (crtl->stack_protect_guard
2728            && (flag_stack_protect == 2
2729                || data->passed_pointer
2730                || POINTER_TYPE_P (data->nominal_type)))
2731     stack_parm = NULL;
2732
2733   data->stack_parm = stack_parm;
2734 }
2735
2736 /* A subroutine of assign_parms.  Return true if the current parameter
2737    should be stored as a BLKmode in the current frame.  */
2738
2739 static bool
2740 assign_parm_setup_block_p (struct assign_parm_data_one *data)
2741 {
2742   if (data->nominal_mode == BLKmode)
2743     return true;
2744   if (GET_MODE (data->entry_parm) == BLKmode)
2745     return true;
2746
2747 #ifdef BLOCK_REG_PADDING
2748   /* Only assign_parm_setup_block knows how to deal with register arguments
2749      that are padded at the least significant end.  */
2750   if (REG_P (data->entry_parm)
2751       && GET_MODE_SIZE (data->promoted_mode) < UNITS_PER_WORD
2752       && (BLOCK_REG_PADDING (data->passed_mode, data->passed_type, 1)
2753           == (BYTES_BIG_ENDIAN ? upward : downward)))
2754     return true;
2755 #endif
2756
2757   return false;
2758 }
2759
2760 /* A subroutine of assign_parms.  Arrange for the parameter to be
2761    present and valid in DATA->STACK_RTL.  */
2762
2763 static void
2764 assign_parm_setup_block (struct assign_parm_data_all *all,
2765                          tree parm, struct assign_parm_data_one *data)
2766 {
2767   rtx entry_parm = data->entry_parm;
2768   rtx stack_parm = data->stack_parm;
2769   HOST_WIDE_INT size;
2770   HOST_WIDE_INT size_stored;
2771
2772   if (GET_CODE (entry_parm) == PARALLEL)
2773     entry_parm = emit_group_move_into_temps (entry_parm);
2774
2775   size = int_size_in_bytes (data->passed_type);
2776   size_stored = CEIL_ROUND (size, UNITS_PER_WORD);
2777   if (stack_parm == 0)
2778     {
2779       DECL_ALIGN (parm) = MAX (DECL_ALIGN (parm), BITS_PER_WORD);
2780       stack_parm = assign_stack_local (BLKmode, size_stored,
2781                                        DECL_ALIGN (parm));
2782       if (GET_MODE_SIZE (GET_MODE (entry_parm)) == size)
2783         PUT_MODE (stack_parm, GET_MODE (entry_parm));
2784       set_mem_attributes (stack_parm, parm, 1);
2785     }
2786
2787   /* If a BLKmode arrives in registers, copy it to a stack slot.  Handle
2788      calls that pass values in multiple non-contiguous locations.  */
2789   if (REG_P (entry_parm) || GET_CODE (entry_parm) == PARALLEL)
2790     {
2791       rtx mem;
2792
2793       /* Note that we will be storing an integral number of words.
2794          So we have to be careful to ensure that we allocate an
2795          integral number of words.  We do this above when we call
2796          assign_stack_local if space was not allocated in the argument
2797          list.  If it was, this will not work if PARM_BOUNDARY is not
2798          a multiple of BITS_PER_WORD.  It isn't clear how to fix this
2799          if it becomes a problem.  Exception is when BLKmode arrives
2800          with arguments not conforming to word_mode.  */
2801
2802       if (data->stack_parm == 0)
2803         ;
2804       else if (GET_CODE (entry_parm) == PARALLEL)
2805         ;
2806       else
2807         gcc_assert (!size || !(PARM_BOUNDARY % BITS_PER_WORD));
2808
2809       mem = validize_mem (stack_parm);
2810
2811       /* Handle values in multiple non-contiguous locations.  */
2812       if (GET_CODE (entry_parm) == PARALLEL)
2813         {
2814           push_to_sequence2 (all->first_conversion_insn,
2815                              all->last_conversion_insn);
2816           emit_group_store (mem, entry_parm, data->passed_type, size);
2817           all->first_conversion_insn = get_insns ();
2818           all->last_conversion_insn = get_last_insn ();
2819           end_sequence ();
2820         }
2821
2822       else if (size == 0)
2823         ;
2824
2825       /* If SIZE is that of a mode no bigger than a word, just use
2826          that mode's store operation.  */
2827       else if (size <= UNITS_PER_WORD)
2828         {
2829           enum machine_mode mode
2830             = mode_for_size (size * BITS_PER_UNIT, MODE_INT, 0);
2831
2832           if (mode != BLKmode
2833 #ifdef BLOCK_REG_PADDING
2834               && (size == UNITS_PER_WORD
2835                   || (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2836                       != (BYTES_BIG_ENDIAN ? upward : downward)))
2837 #endif
2838               )
2839             {
2840               rtx reg;
2841
2842               /* We are really truncating a word_mode value containing
2843                  SIZE bytes into a value of mode MODE.  If such an
2844                  operation requires no actual instructions, we can refer
2845                  to the value directly in mode MODE, otherwise we must
2846                  start with the register in word_mode and explicitly
2847                  convert it.  */
2848               if (TRULY_NOOP_TRUNCATION (size * BITS_PER_UNIT, BITS_PER_WORD))
2849                 reg = gen_rtx_REG (mode, REGNO (entry_parm));
2850               else
2851                 {
2852                   reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2853                   reg = convert_to_mode (mode, copy_to_reg (reg), 1);
2854                 }
2855               emit_move_insn (change_address (mem, mode, 0), reg);
2856             }
2857
2858           /* Blocks smaller than a word on a BYTES_BIG_ENDIAN
2859              machine must be aligned to the left before storing
2860              to memory.  Note that the previous test doesn't
2861              handle all cases (e.g. SIZE == 3).  */
2862           else if (size != UNITS_PER_WORD
2863 #ifdef BLOCK_REG_PADDING
2864                    && (BLOCK_REG_PADDING (mode, data->passed_type, 1)
2865                        == downward)
2866 #else
2867                    && BYTES_BIG_ENDIAN
2868 #endif
2869                    )
2870             {
2871               rtx tem, x;
2872               int by = (UNITS_PER_WORD - size) * BITS_PER_UNIT;
2873               rtx reg = gen_rtx_REG (word_mode, REGNO (entry_parm));
2874
2875               x = expand_shift (LSHIFT_EXPR, word_mode, reg, by, NULL_RTX, 1);
2876               tem = change_address (mem, word_mode, 0);
2877               emit_move_insn (tem, x);
2878             }
2879           else
2880             move_block_from_reg (REGNO (entry_parm), mem,
2881                                  size_stored / UNITS_PER_WORD);
2882         }
2883       else
2884         move_block_from_reg (REGNO (entry_parm), mem,
2885                              size_stored / UNITS_PER_WORD);
2886     }
2887   else if (data->stack_parm == 0)
2888     {
2889       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
2890       emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
2891                        BLOCK_OP_NORMAL);
2892       all->first_conversion_insn = get_insns ();
2893       all->last_conversion_insn = get_last_insn ();
2894       end_sequence ();
2895     }
2896
2897   data->stack_parm = stack_parm;
2898   SET_DECL_RTL (parm, stack_parm);
2899 }
2900
2901 /* A subroutine of assign_parms.  Allocate a pseudo to hold the current
2902    parameter.  Get it there.  Perform all ABI specified conversions.  */
2903
2904 static void
2905 assign_parm_setup_reg (struct assign_parm_data_all *all, tree parm,
2906                        struct assign_parm_data_one *data)
2907 {
2908   rtx parmreg, validated_mem;
2909   rtx equiv_stack_parm;
2910   enum machine_mode promoted_nominal_mode;
2911   int unsignedp = TYPE_UNSIGNED (TREE_TYPE (parm));
2912   bool did_conversion = false;
2913   bool need_conversion, moved;
2914
2915   /* Store the parm in a pseudoregister during the function, but we may
2916      need to do it in a wider mode.  Using 2 here makes the result
2917      consistent with promote_decl_mode and thus expand_expr_real_1.  */
2918   promoted_nominal_mode
2919     = promote_function_mode (data->nominal_type, data->nominal_mode, &unsignedp,
2920                              TREE_TYPE (current_function_decl), 2);
2921
2922   parmreg = gen_reg_rtx (promoted_nominal_mode);
2923
2924   if (!DECL_ARTIFICIAL (parm))
2925     mark_user_reg (parmreg);
2926
2927   /* If this was an item that we received a pointer to,
2928      set DECL_RTL appropriately.  */
2929   if (data->passed_pointer)
2930     {
2931       rtx x = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data->passed_type)), parmreg);
2932       set_mem_attributes (x, parm, 1);
2933       SET_DECL_RTL (parm, x);
2934     }
2935   else
2936     SET_DECL_RTL (parm, parmreg);
2937
2938   assign_parm_remove_parallels (data);
2939
2940   /* Copy the value into the register, thus bridging between
2941      assign_parm_find_data_types and expand_expr_real_1.  */
2942
2943   equiv_stack_parm = data->stack_parm;
2944   validated_mem = validize_mem (data->entry_parm);
2945
2946   need_conversion = (data->nominal_mode != data->passed_mode
2947                      || promoted_nominal_mode != data->promoted_mode);
2948   moved = false;
2949
2950   if (need_conversion
2951       && GET_MODE_CLASS (data->nominal_mode) == MODE_INT
2952       && data->nominal_mode == data->passed_mode
2953       && data->nominal_mode == GET_MODE (data->entry_parm))
2954     {
2955       /* ENTRY_PARM has been converted to PROMOTED_MODE, its
2956          mode, by the caller.  We now have to convert it to
2957          NOMINAL_MODE, if different.  However, PARMREG may be in
2958          a different mode than NOMINAL_MODE if it is being stored
2959          promoted.
2960
2961          If ENTRY_PARM is a hard register, it might be in a register
2962          not valid for operating in its mode (e.g., an odd-numbered
2963          register for a DFmode).  In that case, moves are the only
2964          thing valid, so we can't do a convert from there.  This
2965          occurs when the calling sequence allow such misaligned
2966          usages.
2967
2968          In addition, the conversion may involve a call, which could
2969          clobber parameters which haven't been copied to pseudo
2970          registers yet.
2971
2972          First, we try to emit an insn which performs the necessary
2973          conversion.  We verify that this insn does not clobber any
2974          hard registers.  */
2975
2976       enum insn_code icode;
2977       rtx op0, op1;
2978
2979       icode = can_extend_p (promoted_nominal_mode, data->passed_mode,
2980                             unsignedp);
2981
2982       op0 = parmreg;
2983       op1 = validated_mem;
2984       if (icode != CODE_FOR_nothing
2985           && insn_operand_matches (icode, 0, op0)
2986           && insn_operand_matches (icode, 1, op1))
2987         {
2988           enum rtx_code code = unsignedp ? ZERO_EXTEND : SIGN_EXTEND;
2989           rtx insn, insns, t = op1;
2990           HARD_REG_SET hardregs;
2991
2992           start_sequence ();
2993           /* If op1 is a hard register that is likely spilled, first
2994              force it into a pseudo, otherwise combiner might extend
2995              its lifetime too much.  */
2996           if (GET_CODE (t) == SUBREG)
2997             t = SUBREG_REG (t);
2998           if (REG_P (t)
2999               && HARD_REGISTER_P (t)
3000               && ! TEST_HARD_REG_BIT (fixed_reg_set, REGNO (t))
3001               && targetm.class_likely_spilled_p (REGNO_REG_CLASS (REGNO (t))))
3002             {
3003               t = gen_reg_rtx (GET_MODE (op1));
3004               emit_move_insn (t, op1);
3005             }
3006           else
3007             t = op1;
3008           insn = gen_extend_insn (op0, t, promoted_nominal_mode,
3009                                   data->passed_mode, unsignedp);
3010           emit_insn (insn);
3011           insns = get_insns ();
3012
3013           moved = true;
3014           CLEAR_HARD_REG_SET (hardregs);
3015           for (insn = insns; insn && moved; insn = NEXT_INSN (insn))
3016             {
3017               if (INSN_P (insn))
3018                 note_stores (PATTERN (insn), record_hard_reg_sets,
3019                              &hardregs);
3020               if (!hard_reg_set_empty_p (hardregs))
3021                 moved = false;
3022             }
3023
3024           end_sequence ();
3025
3026           if (moved)
3027             {
3028               emit_insn (insns);
3029               if (equiv_stack_parm != NULL_RTX)
3030                 equiv_stack_parm = gen_rtx_fmt_e (code, GET_MODE (parmreg),
3031                                                   equiv_stack_parm);
3032             }
3033         }
3034     }
3035
3036   if (moved)
3037     /* Nothing to do.  */
3038     ;
3039   else if (need_conversion)
3040     {
3041       /* We did not have an insn to convert directly, or the sequence
3042          generated appeared unsafe.  We must first copy the parm to a
3043          pseudo reg, and save the conversion until after all
3044          parameters have been moved.  */
3045
3046       int save_tree_used;
3047       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
3048
3049       emit_move_insn (tempreg, validated_mem);
3050
3051       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
3052       tempreg = convert_to_mode (data->nominal_mode, tempreg, unsignedp);
3053
3054       if (GET_CODE (tempreg) == SUBREG
3055           && GET_MODE (tempreg) == data->nominal_mode
3056           && REG_P (SUBREG_REG (tempreg))
3057           && data->nominal_mode == data->passed_mode
3058           && GET_MODE (SUBREG_REG (tempreg)) == GET_MODE (data->entry_parm)
3059           && GET_MODE_SIZE (GET_MODE (tempreg))
3060              < GET_MODE_SIZE (GET_MODE (data->entry_parm)))
3061         {
3062           /* The argument is already sign/zero extended, so note it
3063              into the subreg.  */
3064           SUBREG_PROMOTED_VAR_P (tempreg) = 1;
3065           SUBREG_PROMOTED_UNSIGNED_SET (tempreg, unsignedp);
3066         }
3067
3068       /* TREE_USED gets set erroneously during expand_assignment.  */
3069       save_tree_used = TREE_USED (parm);
3070       expand_assignment (parm, make_tree (data->nominal_type, tempreg), false);
3071       TREE_USED (parm) = save_tree_used;
3072       all->first_conversion_insn = get_insns ();
3073       all->last_conversion_insn = get_last_insn ();
3074       end_sequence ();
3075
3076       did_conversion = true;
3077     }
3078   else
3079     emit_move_insn (parmreg, validated_mem);
3080
3081   /* If we were passed a pointer but the actual value can safely live
3082      in a register, put it in one.  */
3083   if (data->passed_pointer
3084       && TYPE_MODE (TREE_TYPE (parm)) != BLKmode
3085       /* If by-reference argument was promoted, demote it.  */
3086       && (TYPE_MODE (TREE_TYPE (parm)) != GET_MODE (DECL_RTL (parm))
3087           || use_register_for_decl (parm)))
3088     {
3089       /* We can't use nominal_mode, because it will have been set to
3090          Pmode above.  We must use the actual mode of the parm.  */
3091       parmreg = gen_reg_rtx (TYPE_MODE (TREE_TYPE (parm)));
3092       mark_user_reg (parmreg);
3093
3094       if (GET_MODE (parmreg) != GET_MODE (DECL_RTL (parm)))
3095         {
3096           rtx tempreg = gen_reg_rtx (GET_MODE (DECL_RTL (parm)));
3097           int unsigned_p = TYPE_UNSIGNED (TREE_TYPE (parm));
3098
3099           push_to_sequence2 (all->first_conversion_insn,
3100                              all->last_conversion_insn);
3101           emit_move_insn (tempreg, DECL_RTL (parm));
3102           tempreg = convert_to_mode (GET_MODE (parmreg), tempreg, unsigned_p);
3103           emit_move_insn (parmreg, tempreg);
3104           all->first_conversion_insn = get_insns ();
3105           all->last_conversion_insn = get_last_insn ();
3106           end_sequence ();
3107
3108           did_conversion = true;
3109         }
3110       else
3111         emit_move_insn (parmreg, DECL_RTL (parm));
3112
3113       SET_DECL_RTL (parm, parmreg);
3114
3115       /* STACK_PARM is the pointer, not the parm, and PARMREG is
3116          now the parm.  */
3117       data->stack_parm = NULL;
3118     }
3119
3120   /* Mark the register as eliminable if we did no conversion and it was
3121      copied from memory at a fixed offset, and the arg pointer was not
3122      copied to a pseudo-reg.  If the arg pointer is a pseudo reg or the
3123      offset formed an invalid address, such memory-equivalences as we
3124      make here would screw up life analysis for it.  */
3125   if (data->nominal_mode == data->passed_mode
3126       && !did_conversion
3127       && data->stack_parm != 0
3128       && MEM_P (data->stack_parm)
3129       && data->locate.offset.var == 0
3130       && reg_mentioned_p (virtual_incoming_args_rtx,
3131                           XEXP (data->stack_parm, 0)))
3132     {
3133       rtx linsn = get_last_insn ();
3134       rtx sinsn, set;
3135
3136       /* Mark complex types separately.  */
3137       if (GET_CODE (parmreg) == CONCAT)
3138         {
3139           enum machine_mode submode
3140             = GET_MODE_INNER (GET_MODE (parmreg));
3141           int regnor = REGNO (XEXP (parmreg, 0));
3142           int regnoi = REGNO (XEXP (parmreg, 1));
3143           rtx stackr = adjust_address_nv (data->stack_parm, submode, 0);
3144           rtx stacki = adjust_address_nv (data->stack_parm, submode,
3145                                           GET_MODE_SIZE (submode));
3146
3147           /* Scan backwards for the set of the real and
3148              imaginary parts.  */
3149           for (sinsn = linsn; sinsn != 0;
3150                sinsn = prev_nonnote_insn (sinsn))
3151             {
3152               set = single_set (sinsn);
3153               if (set == 0)
3154                 continue;
3155
3156               if (SET_DEST (set) == regno_reg_rtx [regnoi])
3157                 set_unique_reg_note (sinsn, REG_EQUIV, stacki);
3158               else if (SET_DEST (set) == regno_reg_rtx [regnor])
3159                 set_unique_reg_note (sinsn, REG_EQUIV, stackr);
3160             }
3161         }
3162       else 
3163         set_dst_reg_note (linsn, REG_EQUIV, equiv_stack_parm, parmreg);
3164     }
3165
3166   /* For pointer data type, suggest pointer register.  */
3167   if (POINTER_TYPE_P (TREE_TYPE (parm)))
3168     mark_reg_pointer (parmreg,
3169                       TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
3170 }
3171
3172 /* A subroutine of assign_parms.  Allocate stack space to hold the current
3173    parameter.  Get it there.  Perform all ABI specified conversions.  */
3174
3175 static void
3176 assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
3177                          struct assign_parm_data_one *data)
3178 {
3179   /* Value must be stored in the stack slot STACK_PARM during function
3180      execution.  */
3181   bool to_conversion = false;
3182
3183   assign_parm_remove_parallels (data);
3184
3185   if (data->promoted_mode != data->nominal_mode)
3186     {
3187       /* Conversion is required.  */
3188       rtx tempreg = gen_reg_rtx (GET_MODE (data->entry_parm));
3189
3190       emit_move_insn (tempreg, validize_mem (data->entry_parm));
3191
3192       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
3193       to_conversion = true;
3194
3195       data->entry_parm = convert_to_mode (data->nominal_mode, tempreg,
3196                                           TYPE_UNSIGNED (TREE_TYPE (parm)));
3197
3198       if (data->stack_parm)
3199         {
3200           int offset = subreg_lowpart_offset (data->nominal_mode,
3201                                               GET_MODE (data->stack_parm));
3202           /* ??? This may need a big-endian conversion on sparc64.  */
3203           data->stack_parm
3204             = adjust_address (data->stack_parm, data->nominal_mode, 0);
3205           if (offset && MEM_OFFSET_KNOWN_P (data->stack_parm))
3206             set_mem_offset (data->stack_parm,
3207                             MEM_OFFSET (data->stack_parm) + offset);
3208         }
3209     }
3210
3211   if (data->entry_parm != data->stack_parm)
3212     {
3213       rtx src, dest;
3214
3215       if (data->stack_parm == 0)
3216         {
3217           int align = STACK_SLOT_ALIGNMENT (data->passed_type,
3218                                             GET_MODE (data->entry_parm),
3219                                             TYPE_ALIGN (data->passed_type));
3220           data->stack_parm
3221             = assign_stack_local (GET_MODE (data->entry_parm),
3222                                   GET_MODE_SIZE (GET_MODE (data->entry_parm)),
3223                                   align);
3224           set_mem_attributes (data->stack_parm, parm, 1);
3225         }
3226
3227       dest = validize_mem (data->stack_parm);
3228       src = validize_mem (data->entry_parm);
3229
3230       if (MEM_P (src))
3231         {
3232           /* Use a block move to handle potentially misaligned entry_parm.  */
3233           if (!to_conversion)
3234             push_to_sequence2 (all->first_conversion_insn,
3235                                all->last_conversion_insn);
3236           to_conversion = true;
3237
3238           emit_block_move (dest, src,
3239                            GEN_INT (int_size_in_bytes (data->passed_type)),
3240                            BLOCK_OP_NORMAL);
3241         }
3242       else
3243         emit_move_insn (dest, src);
3244     }
3245
3246   if (to_conversion)
3247     {
3248       all->first_conversion_insn = get_insns ();
3249       all->last_conversion_insn = get_last_insn ();
3250       end_sequence ();
3251     }
3252
3253   SET_DECL_RTL (parm, data->stack_parm);
3254 }
3255
3256 /* A subroutine of assign_parms.  If the ABI splits complex arguments, then
3257    undo the frobbing that we did in assign_parms_augmented_arg_list.  */
3258
3259 static void
3260 assign_parms_unsplit_complex (struct assign_parm_data_all *all,
3261                               VEC(tree, heap) *fnargs)
3262 {
3263   tree parm;
3264   tree orig_fnargs = all->orig_fnargs;
3265   unsigned i = 0;
3266
3267   for (parm = orig_fnargs; parm; parm = TREE_CHAIN (parm), ++i)
3268     {
3269       if (TREE_CODE (TREE_TYPE (parm)) == COMPLEX_TYPE
3270           && targetm.calls.split_complex_arg (TREE_TYPE (parm)))
3271         {
3272           rtx tmp, real, imag;
3273           enum machine_mode inner = GET_MODE_INNER (DECL_MODE (parm));
3274
3275           real = DECL_RTL (VEC_index (tree, fnargs, i));
3276           imag = DECL_RTL (VEC_index (tree, fnargs, i + 1));
3277           if (inner != GET_MODE (real))
3278             {
3279               real = gen_lowpart_SUBREG (inner, real);
3280               imag = gen_lowpart_SUBREG (inner, imag);
3281             }
3282
3283           if (TREE_ADDRESSABLE (parm))
3284             {
3285               rtx rmem, imem;
3286               HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (parm));
3287               int align = STACK_SLOT_ALIGNMENT (TREE_TYPE (parm),
3288                                                 DECL_MODE (parm),
3289                                                 TYPE_ALIGN (TREE_TYPE (parm)));
3290
3291               /* split_complex_arg put the real and imag parts in
3292                  pseudos.  Move them to memory.  */
3293               tmp = assign_stack_local (DECL_MODE (parm), size, align);
3294               set_mem_attributes (tmp, parm, 1);
3295               rmem = adjust_address_nv (tmp, inner, 0);
3296               imem = adjust_address_nv (tmp, inner, GET_MODE_SIZE (inner));
3297               push_to_sequence2 (all->first_conversion_insn,
3298                                  all->last_conversion_insn);
3299               emit_move_insn (rmem, real);
3300               emit_move_insn (imem, imag);
3301               all->first_conversion_insn = get_insns ();
3302               all->last_conversion_insn = get_last_insn ();
3303               end_sequence ();
3304             }
3305           else
3306             tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
3307           SET_DECL_RTL (parm, tmp);
3308
3309           real = DECL_INCOMING_RTL (VEC_index (tree, fnargs, i));
3310           imag = DECL_INCOMING_RTL (VEC_index (tree, fnargs, i + 1));
3311           if (inner != GET_MODE (real))
3312             {
3313               real = gen_lowpart_SUBREG (inner, real);
3314               imag = gen_lowpart_SUBREG (inner, imag);
3315             }
3316           tmp = gen_rtx_CONCAT (DECL_MODE (parm), real, imag);
3317           set_decl_incoming_rtl (parm, tmp, false);
3318           i++;
3319         }
3320     }
3321 }
3322
3323 /* Assign RTL expressions to the function's parameters.  This may involve
3324    copying them into registers and using those registers as the DECL_RTL.  */
3325
3326 static void
3327 assign_parms (tree fndecl)
3328 {
3329   struct assign_parm_data_all all;
3330   tree parm;
3331   VEC(tree, heap) *fnargs;
3332   unsigned i;
3333
3334   crtl->args.internal_arg_pointer
3335     = targetm.calls.internal_arg_pointer ();
3336
3337   assign_parms_initialize_all (&all);
3338   fnargs = assign_parms_augmented_arg_list (&all);
3339
3340   FOR_EACH_VEC_ELT (tree, fnargs, i, parm)
3341     {
3342       struct assign_parm_data_one data;
3343
3344       /* Extract the type of PARM; adjust it according to ABI.  */
3345       assign_parm_find_data_types (&all, parm, &data);
3346
3347       /* Early out for errors and void parameters.  */
3348       if (data.passed_mode == VOIDmode)
3349         {
3350           SET_DECL_RTL (parm, const0_rtx);
3351           DECL_INCOMING_RTL (parm) = DECL_RTL (parm);
3352           continue;
3353         }
3354
3355       /* Estimate stack alignment from parameter alignment.  */
3356       if (SUPPORTS_STACK_ALIGNMENT)
3357         {
3358           unsigned int align
3359             = targetm.calls.function_arg_boundary (data.promoted_mode,
3360                                                    data.passed_type);
3361           align = MINIMUM_ALIGNMENT (data.passed_type, data.promoted_mode,
3362                                      align);
3363           if (TYPE_ALIGN (data.nominal_type) > align)
3364             align = MINIMUM_ALIGNMENT (data.nominal_type,
3365                                        TYPE_MODE (data.nominal_type),
3366                                        TYPE_ALIGN (data.nominal_type));
3367           if (crtl->stack_alignment_estimated < align)
3368             {
3369               gcc_assert (!crtl->stack_realign_processed);
3370               crtl->stack_alignment_estimated = align;
3371             }
3372         }
3373
3374       if (cfun->stdarg && !DECL_CHAIN (parm))
3375         assign_parms_setup_varargs (&all, &data, false);
3376
3377       /* Find out where the parameter arrives in this function.  */
3378       assign_parm_find_entry_rtl (&all, &data);
3379
3380       /* Find out where stack space for this parameter might be.  */
3381       if (assign_parm_is_stack_parm (&all, &data))
3382         {
3383           assign_parm_find_stack_rtl (parm, &data);
3384           assign_parm_adjust_entry_rtl (&data);
3385         }
3386
3387       /* Record permanently how this parm was passed.  */
3388       if (data.passed_pointer)
3389         {
3390           rtx incoming_rtl
3391             = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (data.passed_type)),
3392                            data.entry_parm);
3393           set_decl_incoming_rtl (parm, incoming_rtl, true);
3394         }
3395       else
3396         set_decl_incoming_rtl (parm, data.entry_parm, false);
3397
3398       /* Update info on where next arg arrives in registers.  */
3399       targetm.calls.function_arg_advance (all.args_so_far, data.promoted_mode,
3400                                           data.passed_type, data.named_arg);
3401
3402       assign_parm_adjust_stack_rtl (&data);
3403
3404       if (assign_parm_setup_block_p (&data))
3405         assign_parm_setup_block (&all, parm, &data);
3406       else if (data.passed_pointer || use_register_for_decl (parm))
3407         assign_parm_setup_reg (&all, parm, &data);
3408       else
3409         assign_parm_setup_stack (&all, parm, &data);
3410     }
3411
3412   if (targetm.calls.split_complex_arg)
3413     assign_parms_unsplit_complex (&all, fnargs);
3414
3415   VEC_free (tree, heap, fnargs);
3416
3417   /* Output all parameter conversion instructions (possibly including calls)
3418      now that all parameters have been copied out of hard registers.  */
3419   emit_insn (all.first_conversion_insn);
3420
3421   /* Estimate reload stack alignment from scalar return mode.  */
3422   if (SUPPORTS_STACK_ALIGNMENT)
3423     {
3424       if (DECL_RESULT (fndecl))
3425         {
3426           tree type = TREE_TYPE (DECL_RESULT (fndecl));
3427           enum machine_mode mode = TYPE_MODE (type);
3428
3429           if (mode != BLKmode
3430               && mode != VOIDmode
3431               && !AGGREGATE_TYPE_P (type))
3432             {
3433               unsigned int align = GET_MODE_ALIGNMENT (mode);
3434               if (crtl->stack_alignment_estimated < align)
3435                 {
3436                   gcc_assert (!crtl->stack_realign_processed);
3437                   crtl->stack_alignment_estimated = align;
3438                 }
3439             }
3440         }
3441     }
3442
3443   /* If we are receiving a struct value address as the first argument, set up
3444      the RTL for the function result. As this might require code to convert
3445      the transmitted address to Pmode, we do this here to ensure that possible
3446      preliminary conversions of the address have been emitted already.  */
3447   if (all.function_result_decl)
3448     {
3449       tree result = DECL_RESULT (current_function_decl);
3450       rtx addr = DECL_RTL (all.function_result_decl);
3451       rtx x;
3452
3453       if (DECL_BY_REFERENCE (result))
3454         {
3455           SET_DECL_VALUE_EXPR (result, all.function_result_decl);
3456           x = addr;
3457         }
3458       else
3459         {
3460           SET_DECL_VALUE_EXPR (result,
3461                                build1 (INDIRECT_REF, TREE_TYPE (result),
3462                                        all.function_result_decl));
3463           addr = convert_memory_address (Pmode, addr);
3464           x = gen_rtx_MEM (DECL_MODE (result), addr);
3465           set_mem_attributes (x, result, 1);
3466         }
3467
3468       DECL_HAS_VALUE_EXPR_P (result) = 1;
3469
3470       SET_DECL_RTL (result, x);
3471     }
3472
3473   /* We have aligned all the args, so add space for the pretend args.  */
3474   crtl->args.pretend_args_size = all.pretend_args_size;
3475   all.stack_args_size.constant += all.extra_pretend_bytes;
3476   crtl->args.size = all.stack_args_size.constant;
3477
3478   /* Adjust function incoming argument size for alignment and
3479      minimum length.  */
3480
3481 #ifdef REG_PARM_STACK_SPACE
3482   crtl->args.size = MAX (crtl->args.size,
3483                                     REG_PARM_STACK_SPACE (fndecl));
3484 #endif
3485
3486   crtl->args.size = CEIL_ROUND (crtl->args.size,
3487                                            PARM_BOUNDARY / BITS_PER_UNIT);
3488
3489 #ifdef ARGS_GROW_DOWNWARD
3490   crtl->args.arg_offset_rtx
3491     = (all.stack_args_size.var == 0 ? GEN_INT (-all.stack_args_size.constant)
3492        : expand_expr (size_diffop (all.stack_args_size.var,
3493                                    size_int (-all.stack_args_size.constant)),
3494                       NULL_RTX, VOIDmode, EXPAND_NORMAL));
3495 #else
3496   crtl->args.arg_offset_rtx = ARGS_SIZE_RTX (all.stack_args_size);
3497 #endif
3498
3499   /* See how many bytes, if any, of its args a function should try to pop
3500      on return.  */
3501
3502   crtl->args.pops_args = targetm.calls.return_pops_args (fndecl,
3503                                                          TREE_TYPE (fndecl),
3504                                                          crtl->args.size);
3505
3506   /* For stdarg.h function, save info about
3507      regs and stack space used by the named args.  */
3508
3509   crtl->args.info = all.args_so_far_v;
3510
3511   /* Set the rtx used for the function return value.  Put this in its
3512      own variable so any optimizers that need this information don't have
3513      to include tree.h.  Do this here so it gets done when an inlined
3514      function gets output.  */
3515
3516   crtl->return_rtx
3517     = (DECL_RTL_SET_P (DECL_RESULT (fndecl))
3518        ? DECL_RTL (DECL_RESULT (fndecl)) : NULL_RTX);
3519
3520   /* If scalar return value was computed in a pseudo-reg, or was a named
3521      return value that got dumped to the stack, copy that to the hard
3522      return register.  */
3523   if (DECL_RTL_SET_P (DECL_RESULT (fndecl)))
3524     {
3525       tree decl_result = DECL_RESULT (fndecl);
3526       rtx decl_rtl = DECL_RTL (decl_result);
3527
3528       if (REG_P (decl_rtl)
3529           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
3530           : DECL_REGISTER (decl_result))
3531         {
3532           rtx real_decl_rtl;
3533
3534           real_decl_rtl = targetm.calls.function_value (TREE_TYPE (decl_result),
3535                                                         fndecl, true);
3536           REG_FUNCTION_VALUE_P (real_decl_rtl) = 1;
3537           /* The delay slot scheduler assumes that crtl->return_rtx
3538              holds the hard register containing the return value, not a
3539              temporary pseudo.  */
3540           crtl->return_rtx = real_decl_rtl;
3541         }
3542     }
3543 }
3544
3545 /* A subroutine of gimplify_parameters, invoked via walk_tree.
3546    For all seen types, gimplify their sizes.  */
3547
3548 static tree
3549 gimplify_parm_type (tree *tp, int *walk_subtrees, void *data)
3550 {
3551   tree t = *tp;
3552
3553   *walk_subtrees = 0;
3554   if (TYPE_P (t))
3555     {
3556       if (POINTER_TYPE_P (t))
3557         *walk_subtrees = 1;
3558       else if (TYPE_SIZE (t) && !TREE_CONSTANT (TYPE_SIZE (t))
3559                && !TYPE_SIZES_GIMPLIFIED (t))
3560         {
3561           gimplify_type_sizes (t, (gimple_seq *) data);
3562           *walk_subtrees = 1;
3563         }
3564     }
3565
3566   return NULL;
3567 }
3568
3569 /* Gimplify the parameter list for current_function_decl.  This involves
3570    evaluating SAVE_EXPRs of variable sized parameters and generating code
3571    to implement callee-copies reference parameters.  Returns a sequence of
3572    statements to add to the beginning of the function.  */
3573
3574 gimple_seq
3575 gimplify_parameters (void)
3576 {
3577   struct assign_parm_data_all all;
3578   tree parm;
3579   gimple_seq stmts = NULL;
3580   VEC(tree, heap) *fnargs;
3581   unsigned i;
3582
3583   assign_parms_initialize_all (&all);
3584   fnargs = assign_parms_augmented_arg_list (&all);
3585
3586   FOR_EACH_VEC_ELT (tree, fnargs, i, parm)
3587     {
3588       struct assign_parm_data_one data;
3589
3590       /* Extract the type of PARM; adjust it according to ABI.  */
3591       assign_parm_find_data_types (&all, parm, &data);
3592
3593       /* Early out for errors and void parameters.  */
3594       if (data.passed_mode == VOIDmode || DECL_SIZE (parm) == NULL)
3595         continue;
3596
3597       /* Update info on where next arg arrives in registers.  */
3598       targetm.calls.function_arg_advance (all.args_so_far, data.promoted_mode,
3599                                           data.passed_type, data.named_arg);
3600
3601       /* ??? Once upon a time variable_size stuffed parameter list
3602          SAVE_EXPRs (amongst others) onto a pending sizes list.  This
3603          turned out to be less than manageable in the gimple world.
3604          Now we have to hunt them down ourselves.  */
3605       walk_tree_without_duplicates (&data.passed_type,
3606                                     gimplify_parm_type, &stmts);
3607
3608       if (TREE_CODE (DECL_SIZE_UNIT (parm)) != INTEGER_CST)
3609         {
3610           gimplify_one_sizepos (&DECL_SIZE (parm), &stmts);
3611           gimplify_one_sizepos (&DECL_SIZE_UNIT (parm), &stmts);
3612         }
3613
3614       if (data.passed_pointer)
3615         {
3616           tree type = TREE_TYPE (data.passed_type);
3617           if (reference_callee_copied (&all.args_so_far_v, TYPE_MODE (type),
3618                                        type, data.named_arg))
3619             {
3620               tree local, t;
3621
3622               /* For constant-sized objects, this is trivial; for
3623                  variable-sized objects, we have to play games.  */
3624               if (TREE_CODE (DECL_SIZE_UNIT (parm)) == INTEGER_CST
3625                   && !(flag_stack_check == GENERIC_STACK_CHECK
3626                        && compare_tree_int (DECL_SIZE_UNIT (parm),
3627                                             STACK_CHECK_MAX_VAR_SIZE) > 0))
3628                 {
3629                   local = create_tmp_var (type, get_name (parm));
3630                   DECL_IGNORED_P (local) = 0;
3631                   /* If PARM was addressable, move that flag over
3632                      to the local copy, as its address will be taken,
3633                      not the PARMs.  Keep the parms address taken
3634                      as we'll query that flag during gimplification.  */
3635                   if (TREE_ADDRESSABLE (parm))
3636                     TREE_ADDRESSABLE (local) = 1;
3637                   else if (TREE_CODE (type) == COMPLEX_TYPE
3638                            || TREE_CODE (type) == VECTOR_TYPE)
3639                     DECL_GIMPLE_REG_P (local) = 1;
3640                 }
3641               else
3642                 {
3643                   tree ptr_type, addr;
3644
3645                   ptr_type = build_pointer_type (type);
3646                   addr = create_tmp_reg (ptr_type, get_name (parm));
3647                   DECL_IGNORED_P (addr) = 0;
3648                   local = build_fold_indirect_ref (addr);
3649
3650                   t = builtin_decl_explicit (BUILT_IN_ALLOCA_WITH_ALIGN);
3651                   t = build_call_expr (t, 2, DECL_SIZE_UNIT (parm),
3652                                        size_int (DECL_ALIGN (parm)));
3653
3654                   /* The call has been built for a variable-sized object.  */
3655                   CALL_ALLOCA_FOR_VAR_P (t) = 1;
3656                   t = fold_convert (ptr_type, t);
3657                   t = build2 (MODIFY_EXPR, TREE_TYPE (addr), addr, t);
3658                   gimplify_and_add (t, &stmts);
3659                 }
3660
3661               gimplify_assign (local, parm, &stmts);
3662
3663               SET_DECL_VALUE_EXPR (parm, local);
3664               DECL_HAS_VALUE_EXPR_P (parm) = 1;
3665             }
3666         }
3667     }
3668
3669   VEC_free (tree, heap, fnargs);
3670
3671   return stmts;
3672 }
3673 \f
3674 /* Compute the size and offset from the start of the stacked arguments for a
3675    parm passed in mode PASSED_MODE and with type TYPE.
3676
3677    INITIAL_OFFSET_PTR points to the current offset into the stacked
3678    arguments.
3679
3680    The starting offset and size for this parm are returned in
3681    LOCATE->OFFSET and LOCATE->SIZE, respectively.  When IN_REGS is
3682    nonzero, the offset is that of stack slot, which is returned in
3683    LOCATE->SLOT_OFFSET.  LOCATE->ALIGNMENT_PAD is the amount of
3684    padding required from the initial offset ptr to the stack slot.
3685
3686    IN_REGS is nonzero if the argument will be passed in registers.  It will
3687    never be set if REG_PARM_STACK_SPACE is not defined.
3688
3689    FNDECL is the function in which the argument was defined.
3690
3691    There are two types of rounding that are done.  The first, controlled by
3692    TARGET_FUNCTION_ARG_BOUNDARY, forces the offset from the start of the
3693    argument list to be aligned to the specific boundary (in bits).  This
3694    rounding affects the initial and starting offsets, but not the argument
3695    size.
3696
3697    The second, controlled by FUNCTION_ARG_PADDING and PARM_BOUNDARY,
3698    optionally rounds the size of the parm to PARM_BOUNDARY.  The
3699    initial offset is not affected by this rounding, while the size always
3700    is and the starting offset may be.  */
3701
3702 /*  LOCATE->OFFSET will be negative for ARGS_GROW_DOWNWARD case;
3703     INITIAL_OFFSET_PTR is positive because locate_and_pad_parm's
3704     callers pass in the total size of args so far as
3705     INITIAL_OFFSET_PTR.  LOCATE->SIZE is always positive.  */
3706
3707 void
3708 locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
3709                      int partial, tree fndecl ATTRIBUTE_UNUSED,
3710                      struct args_size *initial_offset_ptr,
3711                      struct locate_and_pad_arg_data *locate)
3712 {
3713   tree sizetree;
3714   enum direction where_pad;
3715   unsigned int boundary, round_boundary;
3716   int reg_parm_stack_space = 0;
3717   int part_size_in_regs;
3718
3719 #ifdef REG_PARM_STACK_SPACE
3720   reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
3721
3722   /* If we have found a stack parm before we reach the end of the
3723      area reserved for registers, skip that area.  */
3724   if (! in_regs)
3725     {
3726       if (reg_parm_stack_space > 0)
3727         {
3728           if (initial_offset_ptr->var)
3729             {
3730               initial_offset_ptr->var
3731                 = size_binop (MAX_EXPR, ARGS_SIZE_TREE (*initial_offset_ptr),
3732                               ssize_int (reg_parm_stack_space));
3733               initial_offset_ptr->constant = 0;
3734             }
3735           else if (initial_offset_ptr->constant < reg_parm_stack_space)
3736             initial_offset_ptr->constant = reg_parm_stack_space;
3737         }
3738     }
3739 #endif /* REG_PARM_STACK_SPACE */
3740
3741   part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
3742
3743   sizetree
3744     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
3745   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
3746   boundary = targetm.calls.function_arg_boundary (passed_mode, type);
3747   round_boundary = targetm.calls.function_arg_round_boundary (passed_mode,
3748                                                               type);
3749   locate->where_pad = where_pad;
3750
3751   /* Alignment can't exceed MAX_SUPPORTED_STACK_ALIGNMENT.  */
3752   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
3753     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
3754
3755   locate->boundary = boundary;
3756
3757   if (SUPPORTS_STACK_ALIGNMENT)
3758     {
3759       /* stack_alignment_estimated can't change after stack has been
3760          realigned.  */
3761       if (crtl->stack_alignment_estimated < boundary)
3762         {
3763           if (!crtl->stack_realign_processed)
3764             crtl->stack_alignment_estimated = boundary;
3765           else
3766             {
3767               /* If stack is realigned and stack alignment value
3768                  hasn't been finalized, it is OK not to increase
3769                  stack_alignment_estimated.  The bigger alignment
3770                  requirement is recorded in stack_alignment_needed
3771                  below.  */
3772               gcc_assert (!crtl->stack_realign_finalized
3773                           && crtl->stack_realign_needed);
3774             }
3775         }
3776     }
3777
3778   /* Remember if the outgoing parameter requires extra alignment on the
3779      calling function side.  */
3780   if (crtl->stack_alignment_needed < boundary)
3781     crtl->stack_alignment_needed = boundary;
3782   if (crtl->preferred_stack_boundary < boundary)
3783     crtl->preferred_stack_boundary = boundary;
3784
3785 #ifdef ARGS_GROW_DOWNWARD
3786   locate->slot_offset.constant = -initial_offset_ptr->constant;
3787   if (initial_offset_ptr->var)
3788     locate->slot_offset.var = size_binop (MINUS_EXPR, ssize_int (0),
3789                                           initial_offset_ptr->var);
3790
3791   {
3792     tree s2 = sizetree;
3793     if (where_pad != none
3794         && (!host_integerp (sizetree, 1)
3795             || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
3796       s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
3797     SUB_PARM_SIZE (locate->slot_offset, s2);
3798   }
3799
3800   locate->slot_offset.constant += part_size_in_regs;
3801
3802   if (!in_regs
3803 #ifdef REG_PARM_STACK_SPACE
3804       || REG_PARM_STACK_SPACE (fndecl) > 0
3805 #endif
3806      )
3807     pad_to_arg_alignment (&locate->slot_offset, boundary,
3808                           &locate->alignment_pad);
3809
3810   locate->size.constant = (-initial_offset_ptr->constant
3811                            - locate->slot_offset.constant);
3812   if (initial_offset_ptr->var)
3813     locate->size.var = size_binop (MINUS_EXPR,
3814                                    size_binop (MINUS_EXPR,
3815                                                ssize_int (0),
3816                                                initial_offset_ptr->var),
3817                                    locate->slot_offset.var);
3818
3819   /* Pad_below needs the pre-rounded size to know how much to pad
3820      below.  */
3821   locate->offset = locate->slot_offset;
3822   if (where_pad == downward)
3823     pad_below (&locate->offset, passed_mode, sizetree);
3824
3825 #else /* !ARGS_GROW_DOWNWARD */
3826   if (!in_regs
3827 #ifdef REG_PARM_STACK_SPACE
3828       || REG_PARM_STACK_SPACE (fndecl) > 0
3829 #endif
3830       )
3831     pad_to_arg_alignment (initial_offset_ptr, boundary,
3832                           &locate->alignment_pad);
3833   locate->slot_offset = *initial_offset_ptr;
3834
3835 #ifdef PUSH_ROUNDING
3836   if (passed_mode != BLKmode)
3837     sizetree = size_int (PUSH_ROUNDING (TREE_INT_CST_LOW (sizetree)));
3838 #endif
3839
3840   /* Pad_below needs the pre-rounded size to know how much to pad below
3841      so this must be done before rounding up.  */
3842   locate->offset = locate->slot_offset;
3843   if (where_pad == downward)
3844     pad_below (&locate->offset, passed_mode, sizetree);
3845
3846   if (where_pad != none
3847       && (!host_integerp (sizetree, 1)
3848           || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
3849     sizetree = round_up (sizetree, round_boundary / BITS_PER_UNIT);
3850
3851   ADD_PARM_SIZE (locate->size, sizetree);
3852
3853   locate->size.constant -= part_size_in_regs;
3854 #endif /* ARGS_GROW_DOWNWARD */
3855
3856 #ifdef FUNCTION_ARG_OFFSET
3857   locate->offset.constant += FUNCTION_ARG_OFFSET (passed_mode, type);
3858 #endif
3859 }
3860
3861 /* Round the stack offset in *OFFSET_PTR up to a multiple of BOUNDARY.
3862    BOUNDARY is measured in bits, but must be a multiple of a storage unit.  */
3863
3864 static void
3865 pad_to_arg_alignment (struct args_size *offset_ptr, int boundary,
3866                       struct args_size *alignment_pad)
3867 {
3868   tree save_var = NULL_TREE;
3869   HOST_WIDE_INT save_constant = 0;
3870   int boundary_in_bytes = boundary / BITS_PER_UNIT;
3871   HOST_WIDE_INT sp_offset = STACK_POINTER_OFFSET;
3872
3873 #ifdef SPARC_STACK_BOUNDARY_HACK
3874   /* ??? The SPARC port may claim a STACK_BOUNDARY higher than
3875      the real alignment of %sp.  However, when it does this, the
3876      alignment of %sp+STACK_POINTER_OFFSET is STACK_BOUNDARY.  */
3877   if (SPARC_STACK_BOUNDARY_HACK)
3878     sp_offset = 0;
3879 #endif
3880
3881   if (boundary > PARM_BOUNDARY)
3882     {
3883       save_var = offset_ptr->var;
3884       save_constant = offset_ptr->constant;
3885     }
3886
3887   alignment_pad->var = NULL_TREE;
3888   alignment_pad->constant = 0;
3889
3890   if (boundary > BITS_PER_UNIT)
3891     {
3892       if (offset_ptr->var)
3893         {
3894           tree sp_offset_tree = ssize_int (sp_offset);
3895           tree offset = size_binop (PLUS_EXPR,
3896                                     ARGS_SIZE_TREE (*offset_ptr),
3897                                     sp_offset_tree);
3898 #ifdef ARGS_GROW_DOWNWARD
3899           tree rounded = round_down (offset, boundary / BITS_PER_UNIT);
3900 #else
3901           tree rounded = round_up   (offset, boundary / BITS_PER_UNIT);
3902 #endif
3903
3904           offset_ptr->var = size_binop (MINUS_EXPR, rounded, sp_offset_tree);
3905           /* ARGS_SIZE_TREE includes constant term.  */
3906           offset_ptr->constant = 0;
3907           if (boundary > PARM_BOUNDARY)
3908             alignment_pad->var = size_binop (MINUS_EXPR, offset_ptr->var,
3909                                              save_var);
3910         }
3911       else
3912         {
3913           offset_ptr->constant = -sp_offset +
3914 #ifdef ARGS_GROW_DOWNWARD
3915             FLOOR_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3916 #else
3917             CEIL_ROUND (offset_ptr->constant + sp_offset, boundary_in_bytes);
3918 #endif
3919             if (boundary > PARM_BOUNDARY)
3920               alignment_pad->constant = offset_ptr->constant - save_constant;
3921         }
3922     }
3923 }
3924
3925 static void
3926 pad_below (struct args_size *offset_ptr, enum machine_mode passed_mode, tree sizetree)
3927 {
3928   if (passed_mode != BLKmode)
3929     {
3930       if (GET_MODE_BITSIZE (passed_mode) % PARM_BOUNDARY)
3931         offset_ptr->constant
3932           += (((GET_MODE_BITSIZE (passed_mode) + PARM_BOUNDARY - 1)
3933                / PARM_BOUNDARY * PARM_BOUNDARY / BITS_PER_UNIT)
3934               - GET_MODE_SIZE (passed_mode));
3935     }
3936   else
3937     {
3938       if (TREE_CODE (sizetree) != INTEGER_CST
3939           || (TREE_INT_CST_LOW (sizetree) * BITS_PER_UNIT) % PARM_BOUNDARY)
3940         {
3941           /* Round the size up to multiple of PARM_BOUNDARY bits.  */
3942           tree s2 = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
3943           /* Add it in.  */
3944           ADD_PARM_SIZE (*offset_ptr, s2);
3945           SUB_PARM_SIZE (*offset_ptr, sizetree);
3946         }
3947     }
3948 }
3949 \f
3950
3951 /* True if register REGNO was alive at a place where `setjmp' was
3952    called and was set more than once or is an argument.  Such regs may
3953    be clobbered by `longjmp'.  */
3954
3955 static bool
3956 regno_clobbered_at_setjmp (bitmap setjmp_crosses, int regno)
3957 {
3958   /* There appear to be cases where some local vars never reach the
3959      backend but have bogus regnos.  */
3960   if (regno >= max_reg_num ())
3961     return false;
3962
3963   return ((REG_N_SETS (regno) > 1
3964            || REGNO_REG_SET_P (df_get_live_out (ENTRY_BLOCK_PTR), regno))
3965           && REGNO_REG_SET_P (setjmp_crosses, regno));
3966 }
3967
3968 /* Walk the tree of blocks describing the binding levels within a
3969    function and warn about variables the might be killed by setjmp or
3970    vfork.  This is done after calling flow_analysis before register
3971    allocation since that will clobber the pseudo-regs to hard
3972    regs.  */
3973
3974 static void
3975 setjmp_vars_warning (bitmap setjmp_crosses, tree block)
3976 {
3977   tree decl, sub;
3978
3979   for (decl = BLOCK_VARS (block); decl; decl = DECL_CHAIN (decl))
3980     {
3981       if (TREE_CODE (decl) == VAR_DECL
3982           && DECL_RTL_SET_P (decl)
3983           && REG_P (DECL_RTL (decl))
3984           && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
3985         warning (OPT_Wclobbered, "variable %q+D might be clobbered by"
3986                  " %<longjmp%> or %<vfork%>", decl);
3987     }
3988
3989   for (sub = BLOCK_SUBBLOCKS (block); sub; sub = BLOCK_CHAIN (sub))
3990     setjmp_vars_warning (setjmp_crosses, sub);
3991 }
3992
3993 /* Do the appropriate part of setjmp_vars_warning
3994    but for arguments instead of local variables.  */
3995
3996 static void
3997 setjmp_args_warning (bitmap setjmp_crosses)
3998 {
3999   tree decl;
4000   for (decl = DECL_ARGUMENTS (current_function_decl);
4001        decl; decl = DECL_CHAIN (decl))
4002     if (DECL_RTL (decl) != 0
4003         && REG_P (DECL_RTL (decl))
4004         && regno_clobbered_at_setjmp (setjmp_crosses, REGNO (DECL_RTL (decl))))
4005       warning (OPT_Wclobbered,
4006                "argument %q+D might be clobbered by %<longjmp%> or %<vfork%>",
4007                decl);
4008 }
4009
4010 /* Generate warning messages for variables live across setjmp.  */
4011
4012 void
4013 generate_setjmp_warnings (void)
4014 {
4015   bitmap setjmp_crosses = regstat_get_setjmp_crosses ();
4016
4017   if (n_basic_blocks == NUM_FIXED_BLOCKS
4018       || bitmap_empty_p (setjmp_crosses))
4019     return;
4020
4021   setjmp_vars_warning (setjmp_crosses, DECL_INITIAL (current_function_decl));
4022   setjmp_args_warning (setjmp_crosses);
4023 }
4024
4025 \f
4026 /* Reverse the order of elements in the fragment chain T of blocks,
4027    and return the new head of the chain (old last element).
4028    In addition to that clear BLOCK_SAME_RANGE flags when needed
4029    and adjust BLOCK_SUPERCONTEXT from the super fragment to
4030    its super fragment origin.  */
4031
4032 static tree
4033 block_fragments_nreverse (tree t)
4034 {
4035   tree prev = 0, block, next, prev_super = 0;
4036   tree super = BLOCK_SUPERCONTEXT (t);
4037   if (BLOCK_FRAGMENT_ORIGIN (super))
4038     super = BLOCK_FRAGMENT_ORIGIN (super);
4039   for (block = t; block; block = next)
4040     {
4041       next = BLOCK_FRAGMENT_CHAIN (block);
4042       BLOCK_FRAGMENT_CHAIN (block) = prev;
4043       if ((prev && !BLOCK_SAME_RANGE (prev))
4044           || (BLOCK_FRAGMENT_CHAIN (BLOCK_SUPERCONTEXT (block))
4045               != prev_super))
4046         BLOCK_SAME_RANGE (block) = 0;
4047       prev_super = BLOCK_SUPERCONTEXT (block);
4048       BLOCK_SUPERCONTEXT (block) = super;
4049       prev = block;
4050     }
4051   t = BLOCK_FRAGMENT_ORIGIN (t);
4052   if (BLOCK_FRAGMENT_CHAIN (BLOCK_SUPERCONTEXT (t))
4053       != prev_super)
4054     BLOCK_SAME_RANGE (t) = 0;
4055   BLOCK_SUPERCONTEXT (t) = super;
4056   return prev;
4057 }
4058
4059 /* Reverse the order of elements in the chain T of blocks,
4060    and return the new head of the chain (old last element).
4061    Also do the same on subblocks and reverse the order of elements
4062    in BLOCK_FRAGMENT_CHAIN as well.  */
4063
4064 static tree
4065 blocks_nreverse_all (tree t)
4066 {
4067   tree prev = 0, block, next;
4068   for (block = t; block; block = next)
4069     {
4070       next = BLOCK_CHAIN (block);
4071       BLOCK_CHAIN (block) = prev;
4072       if (BLOCK_FRAGMENT_CHAIN (block)
4073           && BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE)
4074         {
4075           BLOCK_FRAGMENT_CHAIN (block)
4076             = block_fragments_nreverse (BLOCK_FRAGMENT_CHAIN (block));
4077           if (!BLOCK_SAME_RANGE (BLOCK_FRAGMENT_CHAIN (block)))
4078             BLOCK_SAME_RANGE (block) = 0;
4079         }
4080       BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
4081       prev = block;
4082     }
4083   return prev;
4084 }
4085
4086
4087 /* Identify BLOCKs referenced by more than one NOTE_INSN_BLOCK_{BEG,END},
4088    and create duplicate blocks.  */
4089 /* ??? Need an option to either create block fragments or to create
4090    abstract origin duplicates of a source block.  It really depends
4091    on what optimization has been performed.  */
4092
4093 void
4094 reorder_blocks (void)
4095 {
4096   tree block = DECL_INITIAL (current_function_decl);
4097   VEC(tree,heap) *block_stack;
4098
4099   if (block == NULL_TREE)
4100     return;
4101
4102   block_stack = VEC_alloc (tree, heap, 10);
4103
4104   /* Reset the TREE_ASM_WRITTEN bit for all blocks.  */
4105   clear_block_marks (block);
4106
4107   /* Prune the old trees away, so that they don't get in the way.  */
4108   BLOCK_SUBBLOCKS (block) = NULL_TREE;
4109   BLOCK_CHAIN (block) = NULL_TREE;
4110
4111   /* Recreate the block tree from the note nesting.  */
4112   reorder_blocks_1 (get_insns (), block, &block_stack);
4113   BLOCK_SUBBLOCKS (block) = blocks_nreverse_all (BLOCK_SUBBLOCKS (block));
4114
4115   VEC_free (tree, heap, block_stack);
4116 }
4117
4118 /* Helper function for reorder_blocks.  Reset TREE_ASM_WRITTEN.  */
4119
4120 void
4121 clear_block_marks (tree block)
4122 {
4123   while (block)
4124     {
4125       TREE_ASM_WRITTEN (block) = 0;
4126       clear_block_marks (BLOCK_SUBBLOCKS (block));
4127       block = BLOCK_CHAIN (block);
4128     }
4129 }
4130
4131 static void
4132 reorder_blocks_1 (rtx insns, tree current_block, VEC(tree,heap) **p_block_stack)
4133 {
4134   rtx insn;
4135   tree prev_beg = NULL_TREE, prev_end = NULL_TREE;
4136
4137   for (insn = insns; insn; insn = NEXT_INSN (insn))
4138     {
4139       if (NOTE_P (insn))
4140         {
4141           if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_BEG)
4142             {
4143               tree block = NOTE_BLOCK (insn);
4144               tree origin;
4145
4146               gcc_assert (BLOCK_FRAGMENT_ORIGIN (block) == NULL_TREE);
4147               origin = block;
4148
4149               if (prev_end)
4150                 BLOCK_SAME_RANGE (prev_end) = 0;
4151               prev_end = NULL_TREE;
4152
4153               /* If we have seen this block before, that means it now
4154                  spans multiple address regions.  Create a new fragment.  */
4155               if (TREE_ASM_WRITTEN (block))
4156                 {
4157                   tree new_block = copy_node (block);
4158
4159                   BLOCK_SAME_RANGE (new_block) = 0;
4160                   BLOCK_FRAGMENT_ORIGIN (new_block) = origin;
4161                   BLOCK_FRAGMENT_CHAIN (new_block)
4162                     = BLOCK_FRAGMENT_CHAIN (origin);
4163                   BLOCK_FRAGMENT_CHAIN (origin) = new_block;
4164
4165                   NOTE_BLOCK (insn) = new_block;
4166                   block = new_block;
4167                 }
4168
4169               if (prev_beg == current_block && prev_beg)
4170                 BLOCK_SAME_RANGE (block) = 1;
4171
4172               prev_beg = origin;
4173
4174               BLOCK_SUBBLOCKS (block) = 0;
4175               TREE_ASM_WRITTEN (block) = 1;
4176               /* When there's only one block for the entire function,
4177                  current_block == block and we mustn't do this, it
4178                  will cause infinite recursion.  */
4179               if (block != current_block)
4180                 {
4181                   tree super;
4182                   if (block != origin)
4183                     gcc_assert (BLOCK_SUPERCONTEXT (origin) == current_block
4184                                 || BLOCK_FRAGMENT_ORIGIN (BLOCK_SUPERCONTEXT
4185                                                                       (origin))
4186                                    == current_block);
4187                   if (VEC_empty (tree, *p_block_stack))
4188                     super = current_block;
4189                   else
4190                     {
4191                       super = VEC_last (tree, *p_block_stack);
4192                       gcc_assert (super == current_block
4193                                   || BLOCK_FRAGMENT_ORIGIN (super)
4194                                      == current_block);
4195                     }
4196                   BLOCK_SUPERCONTEXT (block) = super;
4197                   BLOCK_CHAIN (block) = BLOCK_SUBBLOCKS (current_block);
4198                   BLOCK_SUBBLOCKS (current_block) = block;
4199                   current_block = origin;
4200                 }
4201               VEC_safe_push (tree, heap, *p_block_stack, block);
4202             }
4203           else if (NOTE_KIND (insn) == NOTE_INSN_BLOCK_END)
4204             {
4205               NOTE_BLOCK (insn) = VEC_pop (tree, *p_block_stack);
4206               current_block = BLOCK_SUPERCONTEXT (current_block);
4207               if (BLOCK_FRAGMENT_ORIGIN (current_block))
4208                 current_block = BLOCK_FRAGMENT_ORIGIN (current_block);
4209               prev_beg = NULL_TREE;
4210               prev_end = BLOCK_SAME_RANGE (NOTE_BLOCK (insn))
4211                          ? NOTE_BLOCK (insn) : NULL_TREE;
4212             }
4213         }
4214       else
4215         {
4216           prev_beg = NULL_TREE;
4217           if (prev_end)
4218             BLOCK_SAME_RANGE (prev_end) = 0;
4219           prev_end = NULL_TREE;
4220         }
4221     }
4222 }
4223
4224 /* Reverse the order of elements in the chain T of blocks,
4225    and return the new head of the chain (old last element).  */
4226
4227 tree
4228 blocks_nreverse (tree t)
4229 {
4230   tree prev = 0, block, next;
4231   for (block = t; block; block = next)
4232     {
4233       next = BLOCK_CHAIN (block);
4234       BLOCK_CHAIN (block) = prev;
4235       prev = block;
4236     }
4237   return prev;
4238 }
4239
4240 /* Concatenate two chains of blocks (chained through BLOCK_CHAIN)
4241    by modifying the last node in chain 1 to point to chain 2.  */
4242
4243 tree
4244 block_chainon (tree op1, tree op2)
4245 {
4246   tree t1;
4247
4248   if (!op1)
4249     return op2;
4250   if (!op2)
4251     return op1;
4252
4253   for (t1 = op1; BLOCK_CHAIN (t1); t1 = BLOCK_CHAIN (t1))
4254     continue;
4255   BLOCK_CHAIN (t1) = op2;
4256
4257 #ifdef ENABLE_TREE_CHECKING
4258   {
4259     tree t2;
4260     for (t2 = op2; t2; t2 = BLOCK_CHAIN (t2))
4261       gcc_assert (t2 != t1);
4262   }
4263 #endif
4264
4265   return op1;
4266 }
4267
4268 /* Count the subblocks of the list starting with BLOCK.  If VECTOR is
4269    non-NULL, list them all into VECTOR, in a depth-first preorder
4270    traversal of the block tree.  Also clear TREE_ASM_WRITTEN in all
4271    blocks.  */
4272
4273 static int
4274 all_blocks (tree block, tree *vector)
4275 {
4276   int n_blocks = 0;
4277
4278   while (block)
4279     {
4280       TREE_ASM_WRITTEN (block) = 0;
4281
4282       /* Record this block.  */
4283       if (vector)
4284         vector[n_blocks] = block;
4285
4286       ++n_blocks;
4287
4288       /* Record the subblocks, and their subblocks...  */
4289       n_blocks += all_blocks (BLOCK_SUBBLOCKS (block),
4290                               vector ? vector + n_blocks : 0);
4291       block = BLOCK_CHAIN (block);
4292     }
4293
4294   return n_blocks;
4295 }
4296
4297 /* Return a vector containing all the blocks rooted at BLOCK.  The
4298    number of elements in the vector is stored in N_BLOCKS_P.  The
4299    vector is dynamically allocated; it is the caller's responsibility
4300    to call `free' on the pointer returned.  */
4301
4302 static tree *
4303 get_block_vector (tree block, int *n_blocks_p)
4304 {
4305   tree *block_vector;
4306
4307   *n_blocks_p = all_blocks (block, NULL);
4308   block_vector = XNEWVEC (tree, *n_blocks_p);
4309   all_blocks (block, block_vector);
4310
4311   return block_vector;
4312 }
4313
4314 static GTY(()) int next_block_index = 2;
4315
4316 /* Set BLOCK_NUMBER for all the blocks in FN.  */
4317
4318 void
4319 number_blocks (tree fn)
4320 {
4321   int i;
4322   int n_blocks;
4323   tree *block_vector;
4324
4325   /* For SDB and XCOFF debugging output, we start numbering the blocks
4326      from 1 within each function, rather than keeping a running
4327      count.  */
4328 #if defined (SDB_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
4329   if (write_symbols == SDB_DEBUG || write_symbols == XCOFF_DEBUG)
4330     next_block_index = 1;
4331 #endif
4332
4333   block_vector = get_block_vector (DECL_INITIAL (fn), &n_blocks);
4334
4335   /* The top-level BLOCK isn't numbered at all.  */
4336   for (i = 1; i < n_blocks; ++i)
4337     /* We number the blocks from two.  */
4338     BLOCK_NUMBER (block_vector[i]) = next_block_index++;
4339
4340   free (block_vector);
4341
4342   return;
4343 }
4344
4345 /* If VAR is present in a subblock of BLOCK, return the subblock.  */
4346
4347 DEBUG_FUNCTION tree
4348 debug_find_var_in_block_tree (tree var, tree block)
4349 {
4350   tree t;
4351
4352   for (t = BLOCK_VARS (block); t; t = TREE_CHAIN (t))
4353     if (t == var)
4354       return block;
4355
4356   for (t = BLOCK_SUBBLOCKS (block); t; t = TREE_CHAIN (t))
4357     {
4358       tree ret = debug_find_var_in_block_tree (var, t);
4359       if (ret)
4360         return ret;
4361     }
4362
4363   return NULL_TREE;
4364 }
4365 \f
4366 /* Keep track of whether we're in a dummy function context.  If we are,
4367    we don't want to invoke the set_current_function hook, because we'll
4368    get into trouble if the hook calls target_reinit () recursively or
4369    when the initial initialization is not yet complete.  */
4370
4371 static bool in_dummy_function;
4372
4373 /* Invoke the target hook when setting cfun.  Update the optimization options
4374    if the function uses different options than the default.  */
4375
4376 static void
4377 invoke_set_current_function_hook (tree fndecl)
4378 {
4379   if (!in_dummy_function)
4380     {
4381       tree opts = ((fndecl)
4382                    ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fndecl)
4383                    : optimization_default_node);
4384
4385       if (!opts)
4386         opts = optimization_default_node;
4387
4388       /* Change optimization options if needed.  */
4389       if (optimization_current_node != opts)
4390         {
4391           optimization_current_node = opts;
4392           cl_optimization_restore (&global_options, TREE_OPTIMIZATION (opts));
4393         }
4394
4395       targetm.set_current_function (fndecl);
4396     }
4397 }
4398
4399 /* cfun should never be set directly; use this function.  */
4400
4401 void
4402 set_cfun (struct function *new_cfun)
4403 {
4404   if (cfun != new_cfun)
4405     {
4406       cfun = new_cfun;
4407       invoke_set_current_function_hook (new_cfun ? new_cfun->decl : NULL_TREE);
4408     }
4409 }
4410
4411 /* Initialized with NOGC, making this poisonous to the garbage collector.  */
4412
4413 static VEC(function_p,heap) *cfun_stack;
4414
4415 /* Push the current cfun onto the stack, and set cfun to new_cfun.  Also set
4416    current_function_decl accordingly.  */
4417
4418 void
4419 push_cfun (struct function *new_cfun)
4420 {
4421   gcc_assert ((!cfun && !current_function_decl)
4422               || (cfun && current_function_decl == cfun->decl));
4423   VEC_safe_push (function_p, heap, cfun_stack, cfun);
4424   current_function_decl = new_cfun ? new_cfun->decl : NULL_TREE;
4425   set_cfun (new_cfun);
4426 }
4427
4428 /* Pop cfun from the stack.  Also set current_function_decl accordingly.  */
4429
4430 void
4431 pop_cfun (void)
4432 {
4433   struct function *new_cfun = VEC_pop (function_p, cfun_stack);
4434   /* When in_dummy_function, we do have a cfun but current_function_decl is
4435      NULL.  We also allow pushing NULL cfun and subsequently changing
4436      current_function_decl to something else and have both restored by
4437      pop_cfun.  */
4438   gcc_checking_assert (in_dummy_function
4439                        || !cfun
4440                        || current_function_decl == cfun->decl);
4441   set_cfun (new_cfun);
4442   current_function_decl = new_cfun ? new_cfun->decl : NULL_TREE;
4443 }
4444
4445 /* Return value of funcdef and increase it.  */
4446 int
4447 get_next_funcdef_no (void)
4448 {
4449   return funcdef_no++;
4450 }
4451
4452 /* Return value of funcdef.  */
4453 int
4454 get_last_funcdef_no (void)
4455 {
4456   return funcdef_no;
4457 }
4458
4459 /* Allocate a function structure for FNDECL and set its contents
4460    to the defaults.  Set cfun to the newly-allocated object.
4461    Some of the helper functions invoked during initialization assume
4462    that cfun has already been set.  Therefore, assign the new object
4463    directly into cfun and invoke the back end hook explicitly at the
4464    very end, rather than initializing a temporary and calling set_cfun
4465    on it.
4466
4467    ABSTRACT_P is true if this is a function that will never be seen by
4468    the middle-end.  Such functions are front-end concepts (like C++
4469    function templates) that do not correspond directly to functions
4470    placed in object files.  */
4471
4472 void
4473 allocate_struct_function (tree fndecl, bool abstract_p)
4474 {
4475   tree result;
4476   tree fntype = fndecl ? TREE_TYPE (fndecl) : NULL_TREE;
4477
4478   cfun = ggc_alloc_cleared_function ();
4479
4480   init_eh_for_function ();
4481
4482   if (init_machine_status)
4483     cfun->machine = (*init_machine_status) ();
4484
4485 #ifdef OVERRIDE_ABI_FORMAT
4486   OVERRIDE_ABI_FORMAT (fndecl);
4487 #endif
4488
4489   if (fndecl != NULL_TREE)
4490     {
4491       DECL_STRUCT_FUNCTION (fndecl) = cfun;
4492       cfun->decl = fndecl;
4493       current_function_funcdef_no = get_next_funcdef_no ();
4494
4495       result = DECL_RESULT (fndecl);
4496       if (!abstract_p && aggregate_value_p (result, fndecl))
4497         {
4498 #ifdef PCC_STATIC_STRUCT_RETURN
4499           cfun->returns_pcc_struct = 1;
4500 #endif
4501           cfun->returns_struct = 1;
4502         }
4503
4504       cfun->stdarg = stdarg_p (fntype);
4505
4506       /* Assume all registers in stdarg functions need to be saved.  */
4507       cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
4508       cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
4509
4510       /* ??? This could be set on a per-function basis by the front-end
4511          but is this worth the hassle?  */
4512       cfun->can_throw_non_call_exceptions = flag_non_call_exceptions;
4513     }
4514
4515   invoke_set_current_function_hook (fndecl);
4516 }
4517
4518 /* This is like allocate_struct_function, but pushes a new cfun for FNDECL
4519    instead of just setting it.  */
4520
4521 void
4522 push_struct_function (tree fndecl)
4523 {
4524   /* When in_dummy_function we might be in the middle of a pop_cfun and
4525      current_function_decl and cfun may not match.  */
4526   gcc_assert (in_dummy_function
4527               || (!cfun && !current_function_decl)
4528               || (cfun && current_function_decl == cfun->decl));
4529   VEC_safe_push (function_p, heap, cfun_stack, cfun);
4530   current_function_decl = fndecl;
4531   allocate_struct_function (fndecl, false);
4532 }
4533
4534 /* Reset crtl and other non-struct-function variables to defaults as
4535    appropriate for emitting rtl at the start of a function.  */
4536
4537 static void
4538 prepare_function_start (void)
4539 {
4540   gcc_assert (!crtl->emit.x_last_insn);
4541   init_temp_slots ();
4542   init_emit ();
4543   init_varasm_status ();
4544   init_expr ();
4545   default_rtl_profile ();
4546
4547   if (flag_stack_usage_info)
4548     {
4549       cfun->su = ggc_alloc_cleared_stack_usage ();
4550       cfun->su->static_stack_size = -1;
4551     }
4552
4553   cse_not_expected = ! optimize;
4554
4555   /* Caller save not needed yet.  */
4556   caller_save_needed = 0;
4557
4558   /* We haven't done register allocation yet.  */
4559   reg_renumber = 0;
4560
4561   /* Indicate that we have not instantiated virtual registers yet.  */
4562   virtuals_instantiated = 0;
4563
4564   /* Indicate that we want CONCATs now.  */
4565   generating_concat_p = 1;
4566
4567   /* Indicate we have no need of a frame pointer yet.  */
4568   frame_pointer_needed = 0;
4569 }
4570
4571 /* Initialize the rtl expansion mechanism so that we can do simple things
4572    like generate sequences.  This is used to provide a context during global
4573    initialization of some passes.  You must call expand_dummy_function_end
4574    to exit this context.  */
4575
4576 void
4577 init_dummy_function_start (void)
4578 {
4579   gcc_assert (!in_dummy_function);
4580   in_dummy_function = true;
4581   push_struct_function (NULL_TREE);
4582   prepare_function_start ();
4583 }
4584
4585 /* Generate RTL for the start of the function SUBR (a FUNCTION_DECL tree node)
4586    and initialize static variables for generating RTL for the statements
4587    of the function.  */
4588
4589 void
4590 init_function_start (tree subr)
4591 {
4592   if (subr && DECL_STRUCT_FUNCTION (subr))
4593     set_cfun (DECL_STRUCT_FUNCTION (subr));
4594   else
4595     allocate_struct_function (subr, false);
4596   prepare_function_start ();
4597   decide_function_section (subr);
4598
4599   /* Warn if this value is an aggregate type,
4600      regardless of which calling convention we are using for it.  */
4601   if (AGGREGATE_TYPE_P (TREE_TYPE (DECL_RESULT (subr))))
4602     warning (OPT_Waggregate_return, "function returns an aggregate");
4603 }
4604
4605
4606 void
4607 expand_main_function (void)
4608 {
4609 #if (defined(INVOKE__main)                              \
4610      || (!defined(HAS_INIT_SECTION)                     \
4611          && !defined(INIT_SECTION_ASM_OP)               \
4612          && !defined(INIT_ARRAY_SECTION_ASM_OP)))
4613   emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode, 0);
4614 #endif
4615 }
4616 \f
4617 /* Expand code to initialize the stack_protect_guard.  This is invoked at
4618    the beginning of a function to be protected.  */
4619
4620 #ifndef HAVE_stack_protect_set
4621 # define HAVE_stack_protect_set         0
4622 # define gen_stack_protect_set(x,y)     (gcc_unreachable (), NULL_RTX)
4623 #endif
4624
4625 void
4626 stack_protect_prologue (void)
4627 {
4628   tree guard_decl = targetm.stack_protect_guard ();
4629   rtx x, y;
4630
4631   x = expand_normal (crtl->stack_protect_guard);
4632   y = expand_normal (guard_decl);
4633
4634   /* Allow the target to copy from Y to X without leaking Y into a
4635      register.  */
4636   if (HAVE_stack_protect_set)
4637     {
4638       rtx insn = gen_stack_protect_set (x, y);
4639       if (insn)
4640         {
4641           emit_insn (insn);
4642           return;
4643         }
4644     }
4645
4646   /* Otherwise do a straight move.  */
4647   emit_move_insn (x, y);
4648 }
4649
4650 /* Expand code to verify the stack_protect_guard.  This is invoked at
4651    the end of a function to be protected.  */
4652
4653 #ifndef HAVE_stack_protect_test
4654 # define HAVE_stack_protect_test                0
4655 # define gen_stack_protect_test(x, y, z)        (gcc_unreachable (), NULL_RTX)
4656 #endif
4657
4658 void
4659 stack_protect_epilogue (void)
4660 {
4661   tree guard_decl = targetm.stack_protect_guard ();
4662   rtx label = gen_label_rtx ();
4663   rtx x, y, tmp;
4664
4665   x = expand_normal (crtl->stack_protect_guard);
4666   y = expand_normal (guard_decl);
4667
4668   /* Allow the target to compare Y with X without leaking either into
4669      a register.  */
4670   switch (HAVE_stack_protect_test != 0)
4671     {
4672     case 1:
4673       tmp = gen_stack_protect_test (x, y, label);
4674       if (tmp)
4675         {
4676           emit_insn (tmp);
4677           break;
4678         }
4679       /* FALLTHRU */
4680
4681     default:
4682       emit_cmp_and_jump_insns (x, y, EQ, NULL_RTX, ptr_mode, 1, label);
4683       break;
4684     }
4685
4686   /* The noreturn predictor has been moved to the tree level.  The rtl-level
4687      predictors estimate this branch about 20%, which isn't enough to get
4688      things moved out of line.  Since this is the only extant case of adding
4689      a noreturn function at the rtl level, it doesn't seem worth doing ought
4690      except adding the prediction by hand.  */
4691   tmp = get_last_insn ();
4692   if (JUMP_P (tmp))
4693     predict_insn_def (tmp, PRED_NORETURN, TAKEN);
4694
4695   expand_call (targetm.stack_protect_fail (), NULL_RTX, /*ignore=*/true);
4696   free_temp_slots ();
4697   emit_label (label);
4698 }
4699 \f
4700 /* Start the RTL for a new function, and set variables used for
4701    emitting RTL.
4702    SUBR is the FUNCTION_DECL node.
4703    PARMS_HAVE_CLEANUPS is nonzero if there are cleanups associated with
4704    the function's parameters, which must be run at any return statement.  */
4705
4706 void
4707 expand_function_start (tree subr)
4708 {
4709   /* Make sure volatile mem refs aren't considered
4710      valid operands of arithmetic insns.  */
4711   init_recog_no_volatile ();
4712
4713   crtl->profile
4714     = (profile_flag
4715        && ! DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (subr));
4716
4717   crtl->limit_stack
4718     = (stack_limit_rtx != NULL_RTX && ! DECL_NO_LIMIT_STACK (subr));
4719
4720   /* Make the label for return statements to jump to.  Do not special
4721      case machines with special return instructions -- they will be
4722      handled later during jump, ifcvt, or epilogue creation.  */
4723   return_label = gen_label_rtx ();
4724
4725   /* Initialize rtx used to return the value.  */
4726   /* Do this before assign_parms so that we copy the struct value address
4727      before any library calls that assign parms might generate.  */
4728
4729   /* Decide whether to return the value in memory or in a register.  */
4730   if (aggregate_value_p (DECL_RESULT (subr), subr))
4731     {
4732       /* Returning something that won't go in a register.  */
4733       rtx value_address = 0;
4734
4735 #ifdef PCC_STATIC_STRUCT_RETURN
4736       if (cfun->returns_pcc_struct)
4737         {
4738           int size = int_size_in_bytes (TREE_TYPE (DECL_RESULT (subr)));
4739           value_address = assemble_static_space (size);
4740         }
4741       else
4742 #endif
4743         {
4744           rtx sv = targetm.calls.struct_value_rtx (TREE_TYPE (subr), 2);
4745           /* Expect to be passed the address of a place to store the value.
4746              If it is passed as an argument, assign_parms will take care of
4747              it.  */
4748           if (sv)
4749             {
4750               value_address = gen_reg_rtx (Pmode);
4751               emit_move_insn (value_address, sv);
4752             }
4753         }
4754       if (value_address)
4755         {
4756           rtx x = value_address;
4757           if (!DECL_BY_REFERENCE (DECL_RESULT (subr)))
4758             {
4759               x = gen_rtx_MEM (DECL_MODE (DECL_RESULT (subr)), x);
4760               set_mem_attributes (x, DECL_RESULT (subr), 1);
4761             }
4762           SET_DECL_RTL (DECL_RESULT (subr), x);
4763         }
4764     }
4765   else if (DECL_MODE (DECL_RESULT (subr)) == VOIDmode)
4766     /* If return mode is void, this decl rtl should not be used.  */
4767     SET_DECL_RTL (DECL_RESULT (subr), NULL_RTX);
4768   else
4769     {
4770       /* Compute the return values into a pseudo reg, which we will copy
4771          into the true return register after the cleanups are done.  */
4772       tree return_type = TREE_TYPE (DECL_RESULT (subr));
4773       if (TYPE_MODE (return_type) != BLKmode
4774           && targetm.calls.return_in_msb (return_type))
4775         /* expand_function_end will insert the appropriate padding in
4776            this case.  Use the return value's natural (unpadded) mode
4777            within the function proper.  */
4778         SET_DECL_RTL (DECL_RESULT (subr),
4779                       gen_reg_rtx (TYPE_MODE (return_type)));
4780       else
4781         {
4782           /* In order to figure out what mode to use for the pseudo, we
4783              figure out what the mode of the eventual return register will
4784              actually be, and use that.  */
4785           rtx hard_reg = hard_function_value (return_type, subr, 0, 1);
4786
4787           /* Structures that are returned in registers are not
4788              aggregate_value_p, so we may see a PARALLEL or a REG.  */
4789           if (REG_P (hard_reg))
4790             SET_DECL_RTL (DECL_RESULT (subr),
4791                           gen_reg_rtx (GET_MODE (hard_reg)));
4792           else
4793             {
4794               gcc_assert (GET_CODE (hard_reg) == PARALLEL);
4795               SET_DECL_RTL (DECL_RESULT (subr), gen_group_rtx (hard_reg));
4796             }
4797         }
4798
4799       /* Set DECL_REGISTER flag so that expand_function_end will copy the
4800          result to the real return register(s).  */
4801       DECL_REGISTER (DECL_RESULT (subr)) = 1;
4802     }
4803
4804   /* Initialize rtx for parameters and local variables.
4805      In some cases this requires emitting insns.  */
4806   assign_parms (subr);
4807
4808   /* If function gets a static chain arg, store it.  */
4809   if (cfun->static_chain_decl)
4810     {
4811       tree parm = cfun->static_chain_decl;
4812       rtx local, chain, insn;
4813
4814       local = gen_reg_rtx (Pmode);
4815       chain = targetm.calls.static_chain (current_function_decl, true);
4816
4817       set_decl_incoming_rtl (parm, chain, false);
4818       SET_DECL_RTL (parm, local);
4819       mark_reg_pointer (local, TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm))));
4820
4821       insn = emit_move_insn (local, chain);
4822
4823       /* Mark the register as eliminable, similar to parameters.  */
4824       if (MEM_P (chain)
4825           && reg_mentioned_p (arg_pointer_rtx, XEXP (chain, 0)))
4826         set_dst_reg_note (insn, REG_EQUIV, chain, local);
4827     }
4828
4829   /* If the function receives a non-local goto, then store the
4830      bits we need to restore the frame pointer.  */
4831   if (cfun->nonlocal_goto_save_area)
4832     {
4833       tree t_save;
4834       rtx r_save;
4835
4836       tree var = TREE_OPERAND (cfun->nonlocal_goto_save_area, 0);
4837       gcc_assert (DECL_RTL_SET_P (var));
4838
4839       t_save = build4 (ARRAY_REF,
4840                        TREE_TYPE (TREE_TYPE (cfun->nonlocal_goto_save_area)),
4841                        cfun->nonlocal_goto_save_area,
4842                        integer_zero_node, NULL_TREE, NULL_TREE);
4843       r_save = expand_expr (t_save, NULL_RTX, VOIDmode, EXPAND_WRITE);
4844       gcc_assert (GET_MODE (r_save) == Pmode);
4845
4846       emit_move_insn (r_save, targetm.builtin_setjmp_frame_value ());
4847       update_nonlocal_goto_save_area ();
4848     }
4849
4850   /* The following was moved from init_function_start.
4851      The move is supposed to make sdb output more accurate.  */
4852   /* Indicate the beginning of the function body,
4853      as opposed to parm setup.  */
4854   emit_note (NOTE_INSN_FUNCTION_BEG);
4855
4856   gcc_assert (NOTE_P (get_last_insn ()));
4857
4858   parm_birth_insn = get_last_insn ();
4859
4860   if (crtl->profile)
4861     {
4862 #ifdef PROFILE_HOOK
4863       PROFILE_HOOK (current_function_funcdef_no);
4864 #endif
4865     }
4866
4867   /* If we are doing generic stack checking, the probe should go here.  */
4868   if (flag_stack_check == GENERIC_STACK_CHECK)
4869     stack_check_probe_note = emit_note (NOTE_INSN_DELETED);
4870 }
4871 \f
4872 /* Undo the effects of init_dummy_function_start.  */
4873 void
4874 expand_dummy_function_end (void)
4875 {
4876   gcc_assert (in_dummy_function);
4877
4878   /* End any sequences that failed to be closed due to syntax errors.  */
4879   while (in_sequence_p ())
4880     end_sequence ();
4881
4882   /* Outside function body, can't compute type's actual size
4883      until next function's body starts.  */
4884
4885   free_after_parsing (cfun);
4886   free_after_compilation (cfun);
4887   pop_cfun ();
4888   in_dummy_function = false;
4889 }
4890
4891 /* Call DOIT for each hard register used as a return value from
4892    the current function.  */
4893
4894 void
4895 diddle_return_value (void (*doit) (rtx, void *), void *arg)
4896 {
4897   rtx outgoing = crtl->return_rtx;
4898
4899   if (! outgoing)
4900     return;
4901
4902   if (REG_P (outgoing))
4903     (*doit) (outgoing, arg);
4904   else if (GET_CODE (outgoing) == PARALLEL)
4905     {
4906       int i;
4907
4908       for (i = 0; i < XVECLEN (outgoing, 0); i++)
4909         {
4910           rtx x = XEXP (XVECEXP (outgoing, 0, i), 0);
4911
4912           if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
4913             (*doit) (x, arg);
4914         }
4915     }
4916 }
4917
4918 static void
4919 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4920 {
4921   emit_clobber (reg);
4922 }
4923
4924 void
4925 clobber_return_register (void)
4926 {
4927   diddle_return_value (do_clobber_return_reg, NULL);
4928
4929   /* In case we do use pseudo to return value, clobber it too.  */
4930   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
4931     {
4932       tree decl_result = DECL_RESULT (current_function_decl);
4933       rtx decl_rtl = DECL_RTL (decl_result);
4934       if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
4935         {
4936           do_clobber_return_reg (decl_rtl, NULL);
4937         }
4938     }
4939 }
4940
4941 static void
4942 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
4943 {
4944   emit_use (reg);
4945 }
4946
4947 static void
4948 use_return_register (void)
4949 {
4950   diddle_return_value (do_use_return_reg, NULL);
4951 }
4952
4953 /* Possibly warn about unused parameters.  */
4954 void
4955 do_warn_unused_parameter (tree fn)
4956 {
4957   tree decl;
4958
4959   for (decl = DECL_ARGUMENTS (fn);
4960        decl; decl = DECL_CHAIN (decl))
4961     if (!TREE_USED (decl) && TREE_CODE (decl) == PARM_DECL
4962         && DECL_NAME (decl) && !DECL_ARTIFICIAL (decl)
4963         && !TREE_NO_WARNING (decl))
4964       warning (OPT_Wunused_parameter, "unused parameter %q+D", decl);
4965 }
4966
4967 static GTY(()) rtx initial_trampoline;
4968
4969 /* Generate RTL for the end of the current function.  */
4970
4971 void
4972 expand_function_end (void)
4973 {
4974   rtx clobber_after;
4975
4976   /* If arg_pointer_save_area was referenced only from a nested
4977      function, we will not have initialized it yet.  Do that now.  */
4978   if (arg_pointer_save_area && ! crtl->arg_pointer_save_area_init)
4979     get_arg_pointer_save_area ();
4980
4981   /* If we are doing generic stack checking and this function makes calls,
4982      do a stack probe at the start of the function to ensure we have enough
4983      space for another stack frame.  */
4984   if (flag_stack_check == GENERIC_STACK_CHECK)
4985     {
4986       rtx insn, seq;
4987
4988       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
4989         if (CALL_P (insn))
4990           {
4991             rtx max_frame_size = GEN_INT (STACK_CHECK_MAX_FRAME_SIZE);
4992             start_sequence ();
4993             if (STACK_CHECK_MOVING_SP)
4994               anti_adjust_stack_and_probe (max_frame_size, true);
4995             else
4996               probe_stack_range (STACK_OLD_CHECK_PROTECT, max_frame_size);
4997             seq = get_insns ();
4998             end_sequence ();
4999             set_insn_locations (seq, prologue_location);
5000             emit_insn_before (seq, stack_check_probe_note);
5001             break;
5002           }
5003     }
5004
5005   /* End any sequences that failed to be closed due to syntax errors.  */
5006   while (in_sequence_p ())
5007     end_sequence ();
5008
5009   clear_pending_stack_adjust ();
5010   do_pending_stack_adjust ();
5011
5012   /* Output a linenumber for the end of the function.
5013      SDB depends on this.  */
5014   set_curr_insn_location (input_location);
5015
5016   /* Before the return label (if any), clobber the return
5017      registers so that they are not propagated live to the rest of
5018      the function.  This can only happen with functions that drop
5019      through; if there had been a return statement, there would
5020      have either been a return rtx, or a jump to the return label.
5021
5022      We delay actual code generation after the current_function_value_rtx
5023      is computed.  */
5024   clobber_after = get_last_insn ();
5025
5026   /* Output the label for the actual return from the function.  */
5027   emit_label (return_label);
5028
5029   if (targetm_common.except_unwind_info (&global_options) == UI_SJLJ)
5030     {
5031       /* Let except.c know where it should emit the call to unregister
5032          the function context for sjlj exceptions.  */
5033       if (flag_exceptions)
5034         sjlj_emit_function_exit_after (get_last_insn ());
5035     }
5036   else
5037     {
5038       /* We want to ensure that instructions that may trap are not
5039          moved into the epilogue by scheduling, because we don't
5040          always emit unwind information for the epilogue.  */
5041       if (cfun->can_throw_non_call_exceptions)
5042         emit_insn (gen_blockage ());
5043     }
5044
5045   /* If this is an implementation of throw, do what's necessary to
5046      communicate between __builtin_eh_return and the epilogue.  */
5047   expand_eh_return ();
5048
5049   /* If scalar return value was computed in a pseudo-reg, or was a named
5050      return value that got dumped to the stack, copy that to the hard
5051      return register.  */
5052   if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
5053     {
5054       tree decl_result = DECL_RESULT (current_function_decl);
5055       rtx decl_rtl = DECL_RTL (decl_result);
5056
5057       if (REG_P (decl_rtl)
5058           ? REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER
5059           : DECL_REGISTER (decl_result))
5060         {
5061           rtx real_decl_rtl = crtl->return_rtx;
5062
5063           /* This should be set in assign_parms.  */
5064           gcc_assert (REG_FUNCTION_VALUE_P (real_decl_rtl));
5065
5066           /* If this is a BLKmode structure being returned in registers,
5067              then use the mode computed in expand_return.  Note that if
5068              decl_rtl is memory, then its mode may have been changed,
5069              but that crtl->return_rtx has not.  */
5070           if (GET_MODE (real_decl_rtl) == BLKmode)
5071             PUT_MODE (real_decl_rtl, GET_MODE (decl_rtl));
5072
5073           /* If a non-BLKmode return value should be padded at the least
5074              significant end of the register, shift it left by the appropriate
5075              amount.  BLKmode results are handled using the group load/store
5076              machinery.  */
5077           if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
5078               && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
5079             {
5080               emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),
5081                                            REGNO (real_decl_rtl)),
5082                               decl_rtl);
5083               shift_return_value (GET_MODE (decl_rtl), true, real_decl_rtl);
5084             }
5085           /* If a named return value dumped decl_return to memory, then
5086              we may need to re-do the PROMOTE_MODE signed/unsigned
5087              extension.  */
5088           else if (GET_MODE (real_decl_rtl) != GET_MODE (decl_rtl))
5089             {
5090               int unsignedp = TYPE_UNSIGNED (TREE_TYPE (decl_result));
5091               promote_function_mode (TREE_TYPE (decl_result),
5092                                      GET_MODE (decl_rtl), &unsignedp,
5093                                      TREE_TYPE (current_function_decl), 1);
5094
5095               convert_move (real_decl_rtl, decl_rtl, unsignedp);
5096             }
5097           else if (GET_CODE (real_decl_rtl) == PARALLEL)
5098             {
5099               /* If expand_function_start has created a PARALLEL for decl_rtl,
5100                  move the result to the real return registers.  Otherwise, do
5101                  a group load from decl_rtl for a named return.  */
5102               if (GET_CODE (decl_rtl) == PARALLEL)
5103                 emit_group_move (real_decl_rtl, decl_rtl);
5104               else
5105                 emit_group_load (real_decl_rtl, decl_rtl,
5106                                  TREE_TYPE (decl_result),
5107                                  int_size_in_bytes (TREE_TYPE (decl_result)));
5108             }
5109           /* In the case of complex integer modes smaller than a word, we'll
5110              need to generate some non-trivial bitfield insertions.  Do that
5111              on a pseudo and not the hard register.  */
5112           else if (GET_CODE (decl_rtl) == CONCAT
5113                    && GET_MODE_CLASS (GET_MODE (decl_rtl)) == MODE_COMPLEX_INT
5114                    && GET_MODE_BITSIZE (GET_MODE (decl_rtl)) <= BITS_PER_WORD)
5115             {
5116               int old_generating_concat_p;
5117               rtx tmp;
5118
5119               old_generating_concat_p = generating_concat_p;
5120               generating_concat_p = 0;
5121               tmp = gen_reg_rtx (GET_MODE (decl_rtl));
5122               generating_concat_p = old_generating_concat_p;
5123
5124               emit_move_insn (tmp, decl_rtl);
5125               emit_move_insn (real_decl_rtl, tmp);
5126             }
5127           else
5128             emit_move_insn (real_decl_rtl, decl_rtl);
5129         }
5130     }
5131
5132   /* If returning a structure, arrange to return the address of the value
5133      in a place where debuggers expect to find it.
5134
5135      If returning a structure PCC style,
5136      the caller also depends on this value.
5137      And cfun->returns_pcc_struct is not necessarily set.  */
5138   if (cfun->returns_struct
5139       || cfun->returns_pcc_struct)
5140     {
5141       rtx value_address = DECL_RTL (DECL_RESULT (current_function_decl));
5142       tree type = TREE_TYPE (DECL_RESULT (current_function_decl));
5143       rtx outgoing;
5144
5145       if (DECL_BY_REFERENCE (DECL_RESULT (current_function_decl)))
5146         type = TREE_TYPE (type);
5147       else
5148         value_address = XEXP (value_address, 0);
5149
5150       outgoing = targetm.calls.function_value (build_pointer_type (type),
5151                                                current_function_decl, true);
5152
5153       /* Mark this as a function return value so integrate will delete the
5154          assignment and USE below when inlining this function.  */
5155       REG_FUNCTION_VALUE_P (outgoing) = 1;
5156
5157       /* The address may be ptr_mode and OUTGOING may be Pmode.  */
5158       value_address = convert_memory_address (GET_MODE (outgoing),
5159                                               value_address);
5160
5161       emit_move_insn (outgoing, value_address);
5162
5163       /* Show return register used to hold result (in this case the address
5164          of the result.  */
5165       crtl->return_rtx = outgoing;
5166     }
5167
5168   /* Emit the actual code to clobber return register.  */
5169   {
5170     rtx seq;
5171
5172     start_sequence ();
5173     clobber_return_register ();
5174     seq = get_insns ();
5175     end_sequence ();
5176
5177     emit_insn_after (seq, clobber_after);
5178   }
5179
5180   /* Output the label for the naked return from the function.  */
5181   if (naked_return_label)
5182     emit_label (naked_return_label);
5183
5184   /* @@@ This is a kludge.  We want to ensure that instructions that
5185      may trap are not moved into the epilogue by scheduling, because
5186      we don't always emit unwind information for the epilogue.  */
5187   if (cfun->can_throw_non_call_exceptions
5188       && targetm_common.except_unwind_info (&global_options) != UI_SJLJ)
5189     emit_insn (gen_blockage ());
5190
5191   /* If stack protection is enabled for this function, check the guard.  */
5192   if (crtl->stack_protect_guard)
5193     stack_protect_epilogue ();
5194
5195   /* If we had calls to alloca, and this machine needs
5196      an accurate stack pointer to exit the function,
5197      insert some code to save and restore the stack pointer.  */
5198   if (! EXIT_IGNORE_STACK
5199       && cfun->calls_alloca)
5200     {
5201       rtx tem = 0, seq;
5202
5203       start_sequence ();
5204       emit_stack_save (SAVE_FUNCTION, &tem);
5205       seq = get_insns ();
5206       end_sequence ();
5207       emit_insn_before (seq, parm_birth_insn);
5208
5209       emit_stack_restore (SAVE_FUNCTION, tem);
5210     }
5211
5212   /* ??? This should no longer be necessary since stupid is no longer with
5213      us, but there are some parts of the compiler (eg reload_combine, and
5214      sh mach_dep_reorg) that still try and compute their own lifetime info
5215      instead of using the general framework.  */
5216   use_return_register ();
5217 }
5218
5219 rtx
5220 get_arg_pointer_save_area (void)
5221 {
5222   rtx ret = arg_pointer_save_area;
5223
5224   if (! ret)
5225     {
5226       ret = assign_stack_local (Pmode, GET_MODE_SIZE (Pmode), 0);
5227       arg_pointer_save_area = ret;
5228     }
5229
5230   if (! crtl->arg_pointer_save_area_init)
5231     {
5232       rtx seq;
5233
5234       /* Save the arg pointer at the beginning of the function.  The
5235          generated stack slot may not be a valid memory address, so we
5236          have to check it and fix it if necessary.  */
5237       start_sequence ();
5238       emit_move_insn (validize_mem (ret),
5239                       crtl->args.internal_arg_pointer);
5240       seq = get_insns ();
5241       end_sequence ();
5242
5243       push_topmost_sequence ();
5244       emit_insn_after (seq, entry_of_function ());
5245       pop_topmost_sequence ();
5246
5247       crtl->arg_pointer_save_area_init = true;
5248     }
5249
5250   return ret;
5251 }
5252 \f
5253 /* Add a list of INSNS to the hash HASHP, possibly allocating HASHP
5254    for the first time.  */
5255
5256 static void
5257 record_insns (rtx insns, rtx end, htab_t *hashp)
5258 {
5259   rtx tmp;
5260   htab_t hash = *hashp;
5261
5262   if (hash == NULL)
5263     *hashp = hash
5264       = htab_create_ggc (17, htab_hash_pointer, htab_eq_pointer, NULL);
5265
5266   for (tmp = insns; tmp != end; tmp = NEXT_INSN (tmp))
5267     {
5268       void **slot = htab_find_slot (hash, tmp, INSERT);
5269       gcc_assert (*slot == NULL);
5270       *slot = tmp;
5271     }
5272 }
5273
5274 /* INSN has been duplicated or replaced by as COPY, perhaps by duplicating a
5275    basic block, splitting or peepholes.  If INSN is a prologue or epilogue
5276    insn, then record COPY as well.  */
5277
5278 void
5279 maybe_copy_prologue_epilogue_insn (rtx insn, rtx copy)
5280 {
5281   htab_t hash;
5282   void **slot;
5283
5284   hash = epilogue_insn_hash;
5285   if (!hash || !htab_find (hash, insn))
5286     {
5287       hash = prologue_insn_hash;
5288       if (!hash || !htab_find (hash, insn))
5289         return;
5290     }
5291
5292   slot = htab_find_slot (hash, copy, INSERT);
5293   gcc_assert (*slot == NULL);
5294   *slot = copy;
5295 }
5296
5297 /* Set the location of the insn chain starting at INSN to LOC.  */
5298 static void
5299 set_insn_locations (rtx insn, int loc)
5300 {
5301   while (insn != NULL_RTX)
5302     {
5303       if (INSN_P (insn))
5304         INSN_LOCATION (insn) = loc;
5305       insn = NEXT_INSN (insn);
5306     }
5307 }
5308
5309 /* Determine if any INSNs in HASH are, or are part of, INSN.  Because
5310    we can be running after reorg, SEQUENCE rtl is possible.  */
5311
5312 static bool
5313 contains (const_rtx insn, htab_t hash)
5314 {
5315   if (hash == NULL)
5316     return false;
5317
5318   if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == SEQUENCE)
5319     {
5320       int i;
5321       for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
5322         if (htab_find (hash, XVECEXP (PATTERN (insn), 0, i)))
5323           return true;
5324       return false;
5325     }
5326
5327   return htab_find (hash, insn) != NULL;
5328 }
5329
5330 int
5331 prologue_epilogue_contains (const_rtx insn)
5332 {
5333   if (contains (insn, prologue_insn_hash))
5334     return 1;
5335   if (contains (insn, epilogue_insn_hash))
5336     return 1;
5337   return 0;
5338 }
5339
5340 #ifdef HAVE_simple_return
5341
5342 /* Return true if INSN requires the stack frame to be set up.
5343    PROLOGUE_USED contains the hard registers used in the function
5344    prologue.  SET_UP_BY_PROLOGUE is the set of registers we expect the
5345    prologue to set up for the function.  */
5346 bool
5347 requires_stack_frame_p (rtx insn, HARD_REG_SET prologue_used,
5348                         HARD_REG_SET set_up_by_prologue)
5349 {
5350   df_ref *df_rec;
5351   HARD_REG_SET hardregs;
5352   unsigned regno;
5353
5354   if (CALL_P (insn))
5355     return !SIBLING_CALL_P (insn);
5356
5357   /* We need a frame to get the unique CFA expected by the unwinder.  */
5358   if (cfun->can_throw_non_call_exceptions && can_throw_internal (insn))
5359     return true;
5360
5361   CLEAR_HARD_REG_SET (hardregs);
5362   for (df_rec = DF_INSN_DEFS (insn); *df_rec; df_rec++)
5363     {
5364       rtx dreg = DF_REF_REG (*df_rec);
5365
5366       if (!REG_P (dreg))
5367         continue;
5368
5369       add_to_hard_reg_set (&hardregs, GET_MODE (dreg),
5370                            REGNO (dreg));
5371     }
5372   if (hard_reg_set_intersect_p (hardregs, prologue_used))
5373     return true;
5374   AND_COMPL_HARD_REG_SET (hardregs, call_used_reg_set);
5375   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
5376     if (TEST_HARD_REG_BIT (hardregs, regno)
5377         && df_regs_ever_live_p (regno))
5378       return true;
5379
5380   for (df_rec = DF_INSN_USES (insn); *df_rec; df_rec++)
5381     {
5382       rtx reg = DF_REF_REG (*df_rec);
5383
5384       if (!REG_P (reg))
5385         continue;
5386
5387       add_to_hard_reg_set (&hardregs, GET_MODE (reg),
5388                            REGNO (reg));
5389     }
5390   if (hard_reg_set_intersect_p (hardregs, set_up_by_prologue))
5391     return true;
5392
5393   return false;
5394 }
5395
5396 /* See whether BB has a single successor that uses [REGNO, END_REGNO),
5397    and if BB is its only predecessor.  Return that block if so,
5398    otherwise return null.  */
5399
5400 static basic_block
5401 next_block_for_reg (basic_block bb, int regno, int end_regno)
5402 {
5403   edge e, live_edge;
5404   edge_iterator ei;
5405   bitmap live;
5406   int i;
5407
5408   live_edge = NULL;
5409   FOR_EACH_EDGE (e, ei, bb->succs)
5410     {
5411       live = df_get_live_in (e->dest);
5412       for (i = regno; i < end_regno; i++)
5413         if (REGNO_REG_SET_P (live, i))
5414           {
5415             if (live_edge && live_edge != e)
5416               return NULL;
5417             live_edge = e;
5418           }
5419     }
5420
5421   /* We can sometimes encounter dead code.  Don't try to move it
5422      into the exit block.  */
5423   if (!live_edge || live_edge->dest == EXIT_BLOCK_PTR)
5424     return NULL;
5425
5426   /* Reject targets of abnormal edges.  This is needed for correctness
5427      on ports like Alpha and MIPS, whose pic_offset_table_rtx can die on
5428      exception edges even though it is generally treated as call-saved
5429      for the majority of the compilation.  Moving across abnormal edges
5430      isn't going to be interesting for shrink-wrap usage anyway.  */
5431   if (live_edge->flags & EDGE_ABNORMAL)
5432     return NULL;
5433
5434   if (EDGE_COUNT (live_edge->dest->preds) > 1)
5435     return NULL;
5436
5437   return live_edge->dest;
5438 }
5439
5440 /* Try to move INSN from BB to a successor.  Return true on success.
5441    USES and DEFS are the set of registers that are used and defined
5442    after INSN in BB.  */
5443
5444 static bool
5445 move_insn_for_shrink_wrap (basic_block bb, rtx insn,
5446                            const HARD_REG_SET uses,
5447                            const HARD_REG_SET defs)
5448 {
5449   rtx set, src, dest;
5450   bitmap live_out, live_in, bb_uses, bb_defs;
5451   unsigned int i, dregno, end_dregno, sregno, end_sregno;
5452   basic_block next_block;
5453
5454   /* Look for a simple register copy.  */
5455   set = single_set (insn);
5456   if (!set)
5457     return false;
5458   src = SET_SRC (set);
5459   dest = SET_DEST (set);
5460   if (!REG_P (dest) || !REG_P (src))
5461     return false;
5462
5463   /* Make sure that the source register isn't defined later in BB.  */
5464   sregno = REGNO (src);
5465   end_sregno = END_REGNO (src);
5466   if (overlaps_hard_reg_set_p (defs, GET_MODE (src), sregno))
5467     return false;
5468
5469   /* Make sure that the destination register isn't referenced later in BB.  */
5470   dregno = REGNO (dest);
5471   end_dregno = END_REGNO (dest);
5472   if (overlaps_hard_reg_set_p (uses, GET_MODE (dest), dregno)
5473       || overlaps_hard_reg_set_p (defs, GET_MODE (dest), dregno))
5474     return false;
5475
5476   /* See whether there is a successor block to which we could move INSN.  */
5477   next_block = next_block_for_reg (bb, dregno, end_dregno);
5478   if (!next_block)
5479     return false;
5480
5481   /* At this point we are committed to moving INSN, but let's try to
5482      move it as far as we can.  */
5483   do
5484     {
5485       live_out = df_get_live_out (bb);
5486       live_in = df_get_live_in (next_block);
5487       bb = next_block;
5488
5489       /* Check whether BB uses DEST or clobbers DEST.  We need to add
5490          INSN to BB if so.  Either way, DEST is no longer live on entry,
5491          except for any part that overlaps SRC (next loop).  */
5492       bb_uses = &DF_LR_BB_INFO (bb)->use;
5493       bb_defs = &DF_LR_BB_INFO (bb)->def;
5494       for (i = dregno; i < end_dregno; i++)
5495         {
5496           if (REGNO_REG_SET_P (bb_uses, i) || REGNO_REG_SET_P (bb_defs, i))
5497             next_block = NULL;
5498           CLEAR_REGNO_REG_SET (live_out, i);
5499           CLEAR_REGNO_REG_SET (live_in, i);
5500         }
5501
5502       /* Check whether BB clobbers SRC.  We need to add INSN to BB if so.
5503          Either way, SRC is now live on entry.  */
5504       for (i = sregno; i < end_sregno; i++)
5505         {
5506           if (REGNO_REG_SET_P (bb_defs, i))
5507             next_block = NULL;
5508           SET_REGNO_REG_SET (live_out, i);
5509           SET_REGNO_REG_SET (live_in, i);
5510         }
5511
5512       /* If we don't need to add the move to BB, look for a single
5513          successor block.  */
5514       if (next_block)
5515         next_block = next_block_for_reg (next_block, dregno, end_dregno);
5516     }
5517   while (next_block);
5518
5519   /* BB now defines DEST.  It only uses the parts of DEST that overlap SRC
5520      (next loop).  */
5521   for (i = dregno; i < end_dregno; i++)
5522     {
5523       CLEAR_REGNO_REG_SET (bb_uses, i);
5524       SET_REGNO_REG_SET (bb_defs, i);
5525     }
5526
5527   /* BB now uses SRC.  */
5528   for (i = sregno; i < end_sregno; i++)
5529     SET_REGNO_REG_SET (bb_uses, i);
5530
5531   emit_insn_after (PATTERN (insn), bb_note (bb));
5532   delete_insn (insn);
5533   return true;
5534 }
5535
5536 /* Look for register copies in the first block of the function, and move
5537    them down into successor blocks if the register is used only on one
5538    path.  This exposes more opportunities for shrink-wrapping.  These
5539    kinds of sets often occur when incoming argument registers are moved
5540    to call-saved registers because their values are live across one or
5541    more calls during the function.  */
5542
5543 static void
5544 prepare_shrink_wrap (basic_block entry_block)
5545 {
5546   rtx insn, curr, x;
5547   HARD_REG_SET uses, defs;
5548   df_ref *ref;
5549
5550   CLEAR_HARD_REG_SET (uses);
5551   CLEAR_HARD_REG_SET (defs);
5552   FOR_BB_INSNS_REVERSE_SAFE (entry_block, insn, curr)
5553     if (NONDEBUG_INSN_P (insn)
5554         && !move_insn_for_shrink_wrap (entry_block, insn, uses, defs))
5555       {
5556         /* Add all defined registers to DEFs.  */
5557         for (ref = DF_INSN_DEFS (insn); *ref; ref++)
5558           {
5559             x = DF_REF_REG (*ref);
5560             if (REG_P (x) && HARD_REGISTER_P (x))
5561               SET_HARD_REG_BIT (defs, REGNO (x));
5562           }
5563
5564         /* Add all used registers to USESs.  */
5565         for (ref = DF_INSN_USES (insn); *ref; ref++)
5566           {
5567             x = DF_REF_REG (*ref);
5568             if (REG_P (x) && HARD_REGISTER_P (x))
5569               SET_HARD_REG_BIT (uses, REGNO (x));
5570           }
5571       }
5572 }
5573
5574 #endif
5575
5576 #ifdef HAVE_return
5577 /* Insert use of return register before the end of BB.  */
5578
5579 static void
5580 emit_use_return_register_into_block (basic_block bb)
5581 {
5582   rtx seq;
5583   start_sequence ();
5584   use_return_register ();
5585   seq = get_insns ();
5586   end_sequence ();
5587   emit_insn_before (seq, BB_END (bb));
5588 }
5589
5590
5591 /* Create a return pattern, either simple_return or return, depending on
5592    simple_p.  */
5593
5594 static rtx
5595 gen_return_pattern (bool simple_p)
5596 {
5597 #ifdef HAVE_simple_return
5598   return simple_p ? gen_simple_return () : gen_return ();
5599 #else
5600   gcc_assert (!simple_p);
5601   return gen_return ();
5602 #endif
5603 }
5604
5605 /* Insert an appropriate return pattern at the end of block BB.  This
5606    also means updating block_for_insn appropriately.  SIMPLE_P is
5607    the same as in gen_return_pattern and passed to it.  */
5608
5609 static void
5610 emit_return_into_block (bool simple_p, basic_block bb)
5611 {
5612   rtx jump, pat;
5613   jump = emit_jump_insn_after (gen_return_pattern (simple_p), BB_END (bb));
5614   pat = PATTERN (jump);
5615   if (GET_CODE (pat) == PARALLEL)
5616     pat = XVECEXP (pat, 0, 0);
5617   gcc_assert (ANY_RETURN_P (pat));
5618   JUMP_LABEL (jump) = pat;
5619 }
5620 #endif
5621
5622 /* Set JUMP_LABEL for a return insn.  */
5623
5624 void
5625 set_return_jump_label (rtx returnjump)
5626 {
5627   rtx pat = PATTERN (returnjump);
5628   if (GET_CODE (pat) == PARALLEL)
5629     pat = XVECEXP (pat, 0, 0);
5630   if (ANY_RETURN_P (pat))
5631     JUMP_LABEL (returnjump) = pat;
5632   else
5633     JUMP_LABEL (returnjump) = ret_rtx;
5634 }
5635
5636 #ifdef HAVE_simple_return
5637 /* Create a copy of BB instructions and insert at BEFORE.  Redirect
5638    preds of BB to COPY_BB if they don't appear in NEED_PROLOGUE.  */
5639 static void
5640 dup_block_and_redirect (basic_block bb, basic_block copy_bb, rtx before,
5641                         bitmap_head *need_prologue)
5642 {
5643   edge_iterator ei;
5644   edge e;
5645   rtx insn = BB_END (bb);
5646
5647   /* We know BB has a single successor, so there is no need to copy a
5648      simple jump at the end of BB.  */
5649   if (simplejump_p (insn))
5650     insn = PREV_INSN (insn);
5651
5652   start_sequence ();
5653   duplicate_insn_chain (BB_HEAD (bb), insn);
5654   if (dump_file)
5655     {
5656       unsigned count = 0;
5657       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5658         if (active_insn_p (insn))
5659           ++count;
5660       fprintf (dump_file, "Duplicating bb %d to bb %d, %u active insns.\n",
5661                bb->index, copy_bb->index, count);
5662     }
5663   insn = get_insns ();
5664   end_sequence ();
5665   emit_insn_before (insn, before);
5666
5667   /* Redirect all the paths that need no prologue into copy_bb.  */
5668   for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); )
5669     if (!bitmap_bit_p (need_prologue, e->src->index))
5670       {
5671         int freq = EDGE_FREQUENCY (e);
5672         copy_bb->count += e->count;
5673         copy_bb->frequency += EDGE_FREQUENCY (e);
5674         e->dest->count -= e->count;
5675         if (e->dest->count < 0)
5676           e->dest->count = 0;
5677         e->dest->frequency -= freq;
5678         if (e->dest->frequency < 0)
5679           e->dest->frequency = 0;
5680         redirect_edge_and_branch_force (e, copy_bb);
5681         continue;
5682       }
5683     else
5684       ei_next (&ei);
5685 }
5686 #endif
5687
5688 #if defined (HAVE_return) || defined (HAVE_simple_return)
5689 /* Return true if there are any active insns between HEAD and TAIL.  */
5690 static bool
5691 active_insn_between (rtx head, rtx tail)
5692 {
5693   while (tail)
5694     {
5695       if (active_insn_p (tail))
5696         return true;
5697       if (tail == head)
5698         return false;
5699       tail = PREV_INSN (tail);
5700     }
5701   return false;
5702 }
5703
5704 /* LAST_BB is a block that exits, and empty of active instructions.
5705    Examine its predecessors for jumps that can be converted to
5706    (conditional) returns.  */
5707 static VEC (edge, heap) *
5708 convert_jumps_to_returns (basic_block last_bb, bool simple_p,
5709                           VEC (edge, heap) *unconverted ATTRIBUTE_UNUSED)
5710 {
5711   int i;
5712   basic_block bb;
5713   rtx label;
5714   edge_iterator ei;
5715   edge e;
5716   VEC(basic_block,heap) *src_bbs;
5717
5718   src_bbs = VEC_alloc (basic_block, heap, EDGE_COUNT (last_bb->preds));
5719   FOR_EACH_EDGE (e, ei, last_bb->preds)
5720     if (e->src != ENTRY_BLOCK_PTR)
5721       VEC_quick_push (basic_block, src_bbs, e->src);
5722
5723   label = BB_HEAD (last_bb);
5724
5725   FOR_EACH_VEC_ELT (basic_block, src_bbs, i, bb)
5726     {
5727       rtx jump = BB_END (bb);
5728
5729       if (!JUMP_P (jump) || JUMP_LABEL (jump) != label)
5730         continue;
5731
5732       e = find_edge (bb, last_bb);
5733
5734       /* If we have an unconditional jump, we can replace that
5735          with a simple return instruction.  */
5736       if (simplejump_p (jump))
5737         {
5738           /* The use of the return register might be present in the exit
5739              fallthru block.  Either:
5740              - removing the use is safe, and we should remove the use in
5741              the exit fallthru block, or
5742              - removing the use is not safe, and we should add it here.
5743              For now, we conservatively choose the latter.  Either of the
5744              2 helps in crossjumping.  */
5745           emit_use_return_register_into_block (bb);
5746
5747           emit_return_into_block (simple_p, bb);
5748           delete_insn (jump);
5749         }
5750
5751       /* If we have a conditional jump branching to the last
5752          block, we can try to replace that with a conditional
5753          return instruction.  */
5754       else if (condjump_p (jump))
5755         {
5756           rtx dest;
5757
5758           if (simple_p)
5759             dest = simple_return_rtx;
5760           else
5761             dest = ret_rtx;
5762           if (!redirect_jump (jump, dest, 0))
5763             {
5764 #ifdef HAVE_simple_return
5765               if (simple_p)
5766                 {
5767                   if (dump_file)
5768                     fprintf (dump_file,
5769                              "Failed to redirect bb %d branch.\n", bb->index);
5770                   VEC_safe_push (edge, heap, unconverted, e);
5771                 }
5772 #endif
5773               continue;
5774             }
5775
5776           /* See comment in simplejump_p case above.  */
5777           emit_use_return_register_into_block (bb);
5778
5779           /* If this block has only one successor, it both jumps
5780              and falls through to the fallthru block, so we can't
5781              delete the edge.  */
5782           if (single_succ_p (bb))
5783             continue;
5784         }
5785       else
5786         {
5787 #ifdef HAVE_simple_return
5788           if (simple_p)
5789             {
5790               if (dump_file)
5791                 fprintf (dump_file,
5792                          "Failed to redirect bb %d branch.\n", bb->index);
5793               VEC_safe_push (edge, heap, unconverted, e);
5794             }
5795 #endif
5796           continue;
5797         }
5798
5799       /* Fix up the CFG for the successful change we just made.  */
5800       redirect_edge_succ (e, EXIT_BLOCK_PTR);
5801       e->flags &= ~EDGE_CROSSING;
5802     }
5803   VEC_free (basic_block, heap, src_bbs);
5804   return unconverted;
5805 }
5806
5807 /* Emit a return insn for the exit fallthru block.  */
5808 static basic_block
5809 emit_return_for_exit (edge exit_fallthru_edge, bool simple_p)
5810 {
5811   basic_block last_bb = exit_fallthru_edge->src;
5812
5813   if (JUMP_P (BB_END (last_bb)))
5814     {
5815       last_bb = split_edge (exit_fallthru_edge);
5816       exit_fallthru_edge = single_succ_edge (last_bb);
5817     }
5818   emit_barrier_after (BB_END (last_bb));
5819   emit_return_into_block (simple_p, last_bb);
5820   exit_fallthru_edge->flags &= ~EDGE_FALLTHRU;
5821   return last_bb;
5822 }
5823 #endif
5824
5825
5826 /* Generate the prologue and epilogue RTL if the machine supports it.  Thread
5827    this into place with notes indicating where the prologue ends and where
5828    the epilogue begins.  Update the basic block information when possible.
5829
5830    Notes on epilogue placement:
5831    There are several kinds of edges to the exit block:
5832    * a single fallthru edge from LAST_BB
5833    * possibly, edges from blocks containing sibcalls
5834    * possibly, fake edges from infinite loops
5835
5836    The epilogue is always emitted on the fallthru edge from the last basic
5837    block in the function, LAST_BB, into the exit block.
5838
5839    If LAST_BB is empty except for a label, it is the target of every
5840    other basic block in the function that ends in a return.  If a
5841    target has a return or simple_return pattern (possibly with
5842    conditional variants), these basic blocks can be changed so that a
5843    return insn is emitted into them, and their target is adjusted to
5844    the real exit block.
5845
5846    Notes on shrink wrapping: We implement a fairly conservative
5847    version of shrink-wrapping rather than the textbook one.  We only
5848    generate a single prologue and a single epilogue.  This is
5849    sufficient to catch a number of interesting cases involving early
5850    exits.
5851
5852    First, we identify the blocks that require the prologue to occur before
5853    them.  These are the ones that modify a call-saved register, or reference
5854    any of the stack or frame pointer registers.  To simplify things, we then
5855    mark everything reachable from these blocks as also requiring a prologue.
5856    This takes care of loops automatically, and avoids the need to examine
5857    whether MEMs reference the frame, since it is sufficient to check for
5858    occurrences of the stack or frame pointer.
5859
5860    We then compute the set of blocks for which the need for a prologue
5861    is anticipatable (borrowing terminology from the shrink-wrapping
5862    description in Muchnick's book).  These are the blocks which either
5863    require a prologue themselves, or those that have only successors
5864    where the prologue is anticipatable.  The prologue needs to be
5865    inserted on all edges from BB1->BB2 where BB2 is in ANTIC and BB1
5866    is not.  For the moment, we ensure that only one such edge exists.
5867
5868    The epilogue is placed as described above, but we make a
5869    distinction between inserting return and simple_return patterns
5870    when modifying other blocks that end in a return.  Blocks that end
5871    in a sibcall omit the sibcall_epilogue if the block is not in
5872    ANTIC.  */
5873
5874 static void
5875 thread_prologue_and_epilogue_insns (void)
5876 {
5877   bool inserted;
5878 #ifdef HAVE_simple_return
5879   VEC (edge, heap) *unconverted_simple_returns = NULL;
5880   bool nonempty_prologue;
5881   bitmap_head bb_flags;
5882   unsigned max_grow_size;
5883 #endif
5884   rtx returnjump;
5885   rtx seq ATTRIBUTE_UNUSED, epilogue_end ATTRIBUTE_UNUSED;
5886   rtx prologue_seq ATTRIBUTE_UNUSED, split_prologue_seq ATTRIBUTE_UNUSED;
5887   edge e, entry_edge, orig_entry_edge, exit_fallthru_edge;
5888   edge_iterator ei;
5889
5890   df_analyze ();
5891
5892   rtl_profile_for_bb (ENTRY_BLOCK_PTR);
5893
5894   inserted = false;
5895   seq = NULL_RTX;
5896   epilogue_end = NULL_RTX;
5897   returnjump = NULL_RTX;
5898
5899   /* Can't deal with multiple successors of the entry block at the
5900      moment.  Function should always have at least one entry
5901      point.  */
5902   gcc_assert (single_succ_p (ENTRY_BLOCK_PTR));
5903   entry_edge = single_succ_edge (ENTRY_BLOCK_PTR);
5904   orig_entry_edge = entry_edge;
5905
5906   split_prologue_seq = NULL_RTX;
5907   if (flag_split_stack
5908       && (lookup_attribute ("no_split_stack", DECL_ATTRIBUTES (cfun->decl))
5909           == NULL))
5910     {
5911 #ifndef HAVE_split_stack_prologue
5912       gcc_unreachable ();
5913 #else
5914       gcc_assert (HAVE_split_stack_prologue);
5915
5916       start_sequence ();
5917       emit_insn (gen_split_stack_prologue ());
5918       split_prologue_seq = get_insns ();
5919       end_sequence ();
5920
5921       record_insns (split_prologue_seq, NULL, &prologue_insn_hash);
5922       set_insn_locations (split_prologue_seq, prologue_location);
5923 #endif
5924     }
5925
5926   prologue_seq = NULL_RTX;
5927 #ifdef HAVE_prologue
5928   if (HAVE_prologue)
5929     {
5930       start_sequence ();
5931       seq = gen_prologue ();
5932       emit_insn (seq);
5933
5934       /* Insert an explicit USE for the frame pointer
5935          if the profiling is on and the frame pointer is required.  */
5936       if (crtl->profile && frame_pointer_needed)
5937         emit_use (hard_frame_pointer_rtx);
5938
5939       /* Retain a map of the prologue insns.  */
5940       record_insns (seq, NULL, &prologue_insn_hash);
5941       emit_note (NOTE_INSN_PROLOGUE_END);
5942
5943       /* Ensure that instructions are not moved into the prologue when
5944          profiling is on.  The call to the profiling routine can be
5945          emitted within the live range of a call-clobbered register.  */
5946       if (!targetm.profile_before_prologue () && crtl->profile)
5947         emit_insn (gen_blockage ());
5948
5949       prologue_seq = get_insns ();
5950       end_sequence ();
5951       set_insn_locations (prologue_seq, prologue_location);
5952     }
5953 #endif
5954
5955 #ifdef HAVE_simple_return
5956   bitmap_initialize (&bb_flags, &bitmap_default_obstack);
5957
5958   /* Try to perform a kind of shrink-wrapping, making sure the
5959      prologue/epilogue is emitted only around those parts of the
5960      function that require it.  */
5961
5962   nonempty_prologue = false;
5963   for (seq = prologue_seq; seq; seq = NEXT_INSN (seq))
5964     if (!NOTE_P (seq) || NOTE_KIND (seq) != NOTE_INSN_PROLOGUE_END)
5965       {
5966         nonempty_prologue = true;
5967         break;
5968       }
5969       
5970   if (flag_shrink_wrap && HAVE_simple_return
5971       && (targetm.profile_before_prologue () || !crtl->profile)
5972       && nonempty_prologue && !crtl->calls_eh_return)
5973     {
5974       HARD_REG_SET prologue_clobbered, prologue_used, live_on_edge;
5975       struct hard_reg_set_container set_up_by_prologue;
5976       rtx p_insn;
5977       VEC(basic_block, heap) *vec;
5978       basic_block bb;
5979       bitmap_head bb_antic_flags;
5980       bitmap_head bb_on_list;
5981       bitmap_head bb_tail;
5982
5983       if (dump_file)
5984         fprintf (dump_file, "Attempting shrink-wrapping optimization.\n");
5985
5986       /* Compute the registers set and used in the prologue.  */
5987       CLEAR_HARD_REG_SET (prologue_clobbered);
5988       CLEAR_HARD_REG_SET (prologue_used);
5989       for (p_insn = prologue_seq; p_insn; p_insn = NEXT_INSN (p_insn))
5990         {
5991           HARD_REG_SET this_used;
5992           if (!NONDEBUG_INSN_P (p_insn))
5993             continue;
5994
5995           CLEAR_HARD_REG_SET (this_used);
5996           note_uses (&PATTERN (p_insn), record_hard_reg_uses,
5997                      &this_used);
5998           AND_COMPL_HARD_REG_SET (this_used, prologue_clobbered);
5999           IOR_HARD_REG_SET (prologue_used, this_used);
6000           note_stores (PATTERN (p_insn), record_hard_reg_sets,
6001                        &prologue_clobbered);
6002         }
6003
6004       prepare_shrink_wrap (entry_edge->dest);
6005
6006       bitmap_initialize (&bb_antic_flags, &bitmap_default_obstack);
6007       bitmap_initialize (&bb_on_list, &bitmap_default_obstack);
6008       bitmap_initialize (&bb_tail, &bitmap_default_obstack);
6009
6010       /* Find the set of basic blocks that require a stack frame,
6011          and blocks that are too big to be duplicated.  */
6012
6013       vec = VEC_alloc (basic_block, heap, n_basic_blocks);
6014
6015       CLEAR_HARD_REG_SET (set_up_by_prologue.set);
6016       add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
6017                            STACK_POINTER_REGNUM);
6018       add_to_hard_reg_set (&set_up_by_prologue.set, Pmode, ARG_POINTER_REGNUM);
6019       if (frame_pointer_needed)
6020         add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
6021                              HARD_FRAME_POINTER_REGNUM);
6022       if (pic_offset_table_rtx)
6023         add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
6024                              PIC_OFFSET_TABLE_REGNUM);
6025       if (stack_realign_drap && crtl->drap_reg)
6026         add_to_hard_reg_set (&set_up_by_prologue.set,
6027                              GET_MODE (crtl->drap_reg),
6028                              REGNO (crtl->drap_reg));
6029       if (targetm.set_up_by_prologue)
6030         targetm.set_up_by_prologue (&set_up_by_prologue);
6031
6032       /* We don't use a different max size depending on
6033          optimize_bb_for_speed_p because increasing shrink-wrapping
6034          opportunities by duplicating tail blocks can actually result
6035          in an overall decrease in code size.  */
6036       max_grow_size = get_uncond_jump_length ();
6037       max_grow_size *= PARAM_VALUE (PARAM_MAX_GROW_COPY_BB_INSNS);
6038
6039       FOR_EACH_BB (bb)
6040         {
6041           rtx insn;
6042           unsigned size = 0;
6043
6044           FOR_BB_INSNS (bb, insn)
6045             if (NONDEBUG_INSN_P (insn))
6046               {
6047                 if (requires_stack_frame_p (insn, prologue_used,
6048                                             set_up_by_prologue.set))
6049                   {
6050                     if (bb == entry_edge->dest)
6051                       goto fail_shrinkwrap;
6052                     bitmap_set_bit (&bb_flags, bb->index);
6053                     VEC_quick_push (basic_block, vec, bb);
6054                     break;
6055                   }
6056                 else if (size <= max_grow_size)
6057                   {
6058                     size += get_attr_min_length (insn);
6059                     if (size > max_grow_size)
6060                       bitmap_set_bit (&bb_on_list, bb->index);
6061                   }
6062               }
6063         }
6064
6065       /* Blocks that really need a prologue, or are too big for tails.  */
6066       bitmap_ior_into (&bb_on_list, &bb_flags);
6067
6068       /* For every basic block that needs a prologue, mark all blocks
6069          reachable from it, so as to ensure they are also seen as
6070          requiring a prologue.  */
6071       while (!VEC_empty (basic_block, vec))
6072         {
6073           basic_block tmp_bb = VEC_pop (basic_block, vec);
6074
6075           FOR_EACH_EDGE (e, ei, tmp_bb->succs)
6076             if (e->dest != EXIT_BLOCK_PTR
6077                 && bitmap_set_bit (&bb_flags, e->dest->index))
6078               VEC_quick_push (basic_block, vec, e->dest);
6079         }
6080
6081       /* Find the set of basic blocks that need no prologue, have a
6082          single successor, can be duplicated, meet a max size
6083          requirement, and go to the exit via like blocks.  */
6084       VEC_quick_push (basic_block, vec, EXIT_BLOCK_PTR);
6085       while (!VEC_empty (basic_block, vec))
6086         {
6087           basic_block tmp_bb = VEC_pop (basic_block, vec);
6088
6089           FOR_EACH_EDGE (e, ei, tmp_bb->preds)
6090             if (single_succ_p (e->src)
6091                 && !bitmap_bit_p (&bb_on_list, e->src->index)
6092                 && can_duplicate_block_p (e->src))
6093               {
6094                 edge pe;
6095                 edge_iterator pei;
6096
6097                 /* If there is predecessor of e->src which doesn't
6098                    need prologue and the edge is complex,
6099                    we might not be able to redirect the branch
6100                    to a copy of e->src.  */
6101                 FOR_EACH_EDGE (pe, pei, e->src->preds)
6102                   if ((pe->flags & EDGE_COMPLEX) != 0
6103                       && !bitmap_bit_p (&bb_flags, pe->src->index))
6104                     break;
6105                 if (pe == NULL && bitmap_set_bit (&bb_tail, e->src->index))
6106                   VEC_quick_push (basic_block, vec, e->src);
6107               }
6108         }
6109
6110       /* Now walk backwards from every block that is marked as needing
6111          a prologue to compute the bb_antic_flags bitmap.  Exclude
6112          tail blocks; They can be duplicated to be used on paths not
6113          needing a prologue.  */
6114       bitmap_clear (&bb_on_list);
6115       bitmap_and_compl (&bb_antic_flags, &bb_flags, &bb_tail);
6116       FOR_EACH_BB (bb)
6117         {
6118           if (!bitmap_bit_p (&bb_antic_flags, bb->index))
6119             continue;
6120           FOR_EACH_EDGE (e, ei, bb->preds)
6121             if (!bitmap_bit_p (&bb_antic_flags, e->src->index)
6122                 && bitmap_set_bit (&bb_on_list, e->src->index))
6123               VEC_quick_push (basic_block, vec, e->src);
6124         }
6125       while (!VEC_empty (basic_block, vec))
6126         {
6127           basic_block tmp_bb = VEC_pop (basic_block, vec);
6128           bool all_set = true;
6129
6130           bitmap_clear_bit (&bb_on_list, tmp_bb->index);
6131           FOR_EACH_EDGE (e, ei, tmp_bb->succs)
6132             if (!bitmap_bit_p (&bb_antic_flags, e->dest->index))
6133               {
6134                 all_set = false;
6135                 break;
6136               }
6137
6138           if (all_set)
6139             {
6140               bitmap_set_bit (&bb_antic_flags, tmp_bb->index);
6141               FOR_EACH_EDGE (e, ei, tmp_bb->preds)
6142                 if (!bitmap_bit_p (&bb_antic_flags, e->src->index)
6143                     && bitmap_set_bit (&bb_on_list, e->src->index))
6144                   VEC_quick_push (basic_block, vec, e->src);
6145             }
6146         }
6147       /* Find exactly one edge that leads to a block in ANTIC from
6148          a block that isn't.  */
6149       if (!bitmap_bit_p (&bb_antic_flags, entry_edge->dest->index))
6150         FOR_EACH_BB (bb)
6151           {
6152             if (!bitmap_bit_p (&bb_antic_flags, bb->index))
6153               continue;
6154             FOR_EACH_EDGE (e, ei, bb->preds)
6155               if (!bitmap_bit_p (&bb_antic_flags, e->src->index))
6156                 {
6157                   if (entry_edge != orig_entry_edge)
6158                     {
6159                       entry_edge = orig_entry_edge;
6160                       if (dump_file)
6161                         fprintf (dump_file, "More than one candidate edge.\n");
6162                       goto fail_shrinkwrap;
6163                     }
6164                   if (dump_file)
6165                     fprintf (dump_file, "Found candidate edge for "
6166                              "shrink-wrapping, %d->%d.\n", e->src->index,
6167                              e->dest->index);
6168                   entry_edge = e;
6169                 }
6170           }
6171
6172       if (entry_edge != orig_entry_edge)
6173         {
6174           /* Test whether the prologue is known to clobber any register
6175              (other than FP or SP) which are live on the edge.  */
6176           CLEAR_HARD_REG_BIT (prologue_clobbered, STACK_POINTER_REGNUM);
6177           if (frame_pointer_needed)
6178             CLEAR_HARD_REG_BIT (prologue_clobbered, HARD_FRAME_POINTER_REGNUM);
6179           CLEAR_HARD_REG_SET (live_on_edge);
6180           reg_set_to_hard_reg_set (&live_on_edge,
6181                                    df_get_live_in (entry_edge->dest));
6182           if (hard_reg_set_intersect_p (live_on_edge, prologue_clobbered))
6183             {
6184               entry_edge = orig_entry_edge;
6185               if (dump_file)
6186                 fprintf (dump_file,
6187                          "Shrink-wrapping aborted due to clobber.\n");
6188             }
6189         }
6190       if (entry_edge != orig_entry_edge)
6191         {
6192           crtl->shrink_wrapped = true;
6193           if (dump_file)
6194             fprintf (dump_file, "Performing shrink-wrapping.\n");
6195
6196           /* Find tail blocks reachable from both blocks needing a
6197              prologue and blocks not needing a prologue.  */
6198           if (!bitmap_empty_p (&bb_tail))
6199             FOR_EACH_BB (bb)
6200               {
6201                 bool some_pro, some_no_pro;
6202                 if (!bitmap_bit_p (&bb_tail, bb->index))
6203                   continue;
6204                 some_pro = some_no_pro = false;
6205                 FOR_EACH_EDGE (e, ei, bb->preds)
6206                   {
6207                     if (bitmap_bit_p (&bb_flags, e->src->index))
6208                       some_pro = true;
6209                     else
6210                       some_no_pro = true;
6211                   }
6212                 if (some_pro && some_no_pro)
6213                   VEC_quick_push (basic_block, vec, bb);
6214                 else
6215                   bitmap_clear_bit (&bb_tail, bb->index);
6216               }
6217           /* Find the head of each tail.  */
6218           while (!VEC_empty (basic_block, vec))
6219             {
6220               basic_block tbb = VEC_pop (basic_block, vec);
6221
6222               if (!bitmap_bit_p (&bb_tail, tbb->index))
6223                 continue;
6224
6225               while (single_succ_p (tbb))
6226                 {
6227                   tbb = single_succ (tbb);
6228                   bitmap_clear_bit (&bb_tail, tbb->index);
6229                 }
6230             }
6231           /* Now duplicate the tails.  */
6232           if (!bitmap_empty_p (&bb_tail))
6233             FOR_EACH_BB_REVERSE (bb)
6234               {
6235                 basic_block copy_bb, tbb;
6236                 rtx insert_point;
6237                 int eflags;
6238
6239                 if (!bitmap_clear_bit (&bb_tail, bb->index))
6240                   continue;
6241
6242                 /* Create a copy of BB, instructions and all, for
6243                    use on paths that don't need a prologue.
6244                    Ideal placement of the copy is on a fall-thru edge
6245                    or after a block that would jump to the copy.  */ 
6246                 FOR_EACH_EDGE (e, ei, bb->preds)
6247                   if (!bitmap_bit_p (&bb_flags, e->src->index)
6248                       && single_succ_p (e->src))
6249                     break;
6250                 if (e)
6251                   {
6252                     copy_bb = create_basic_block (NEXT_INSN (BB_END (e->src)),
6253                                                   NULL_RTX, e->src);
6254                     BB_COPY_PARTITION (copy_bb, e->src);
6255                   }
6256                 else
6257                   {
6258                     /* Otherwise put the copy at the end of the function.  */
6259                     copy_bb = create_basic_block (NULL_RTX, NULL_RTX,
6260                                                   EXIT_BLOCK_PTR->prev_bb);
6261                     BB_COPY_PARTITION (copy_bb, bb);
6262                   }
6263
6264                 insert_point = emit_note_after (NOTE_INSN_DELETED,
6265                                                 BB_END (copy_bb));
6266                 emit_barrier_after (BB_END (copy_bb));
6267
6268                 tbb = bb;
6269                 while (1)
6270                   {
6271                     dup_block_and_redirect (tbb, copy_bb, insert_point,
6272                                             &bb_flags);
6273                     tbb = single_succ (tbb);
6274                     if (tbb == EXIT_BLOCK_PTR)
6275                       break;
6276                     e = split_block (copy_bb, PREV_INSN (insert_point));
6277                     copy_bb = e->dest;
6278                   }
6279
6280                 /* Quiet verify_flow_info by (ab)using EDGE_FAKE.
6281                    We have yet to add a simple_return to the tails,
6282                    as we'd like to first convert_jumps_to_returns in
6283                    case the block is no longer used after that.  */
6284                 eflags = EDGE_FAKE;
6285                 if (CALL_P (PREV_INSN (insert_point))
6286                     && SIBLING_CALL_P (PREV_INSN (insert_point)))
6287                   eflags = EDGE_SIBCALL | EDGE_ABNORMAL;
6288                 make_single_succ_edge (copy_bb, EXIT_BLOCK_PTR, eflags);
6289
6290                 /* verify_flow_info doesn't like a note after a
6291                    sibling call.  */
6292                 delete_insn (insert_point);
6293                 if (bitmap_empty_p (&bb_tail))
6294                   break;
6295               }
6296         }
6297
6298     fail_shrinkwrap:
6299       bitmap_clear (&bb_tail);
6300       bitmap_clear (&bb_antic_flags);
6301       bitmap_clear (&bb_on_list);
6302       VEC_free (basic_block, heap, vec);
6303     }
6304 #endif
6305
6306   if (split_prologue_seq != NULL_RTX)
6307     {
6308       insert_insn_on_edge (split_prologue_seq, orig_entry_edge);
6309       inserted = true;
6310     }
6311   if (prologue_seq != NULL_RTX)
6312     {
6313       insert_insn_on_edge (prologue_seq, entry_edge);
6314       inserted = true;
6315     }
6316
6317   /* If the exit block has no non-fake predecessors, we don't need
6318      an epilogue.  */
6319   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6320     if ((e->flags & EDGE_FAKE) == 0)
6321       break;
6322   if (e == NULL)
6323     goto epilogue_done;
6324
6325   rtl_profile_for_bb (EXIT_BLOCK_PTR);
6326
6327   exit_fallthru_edge = find_fallthru_edge (EXIT_BLOCK_PTR->preds);
6328
6329   /* If we're allowed to generate a simple return instruction, then by
6330      definition we don't need a full epilogue.  If the last basic
6331      block before the exit block does not contain active instructions,
6332      examine its predecessors and try to emit (conditional) return
6333      instructions.  */
6334 #ifdef HAVE_simple_return
6335   if (entry_edge != orig_entry_edge)
6336     {
6337       if (optimize)
6338         {
6339           unsigned i, last;
6340
6341           /* convert_jumps_to_returns may add to EXIT_BLOCK_PTR->preds
6342              (but won't remove).  Stop at end of current preds.  */
6343           last = EDGE_COUNT (EXIT_BLOCK_PTR->preds);
6344           for (i = 0; i < last; i++)
6345             {
6346               e = EDGE_I (EXIT_BLOCK_PTR->preds, i);
6347               if (LABEL_P (BB_HEAD (e->src))
6348                   && !bitmap_bit_p (&bb_flags, e->src->index)
6349                   && !active_insn_between (BB_HEAD (e->src), BB_END (e->src)))
6350                 unconverted_simple_returns
6351                   = convert_jumps_to_returns (e->src, true,
6352                                               unconverted_simple_returns);
6353             }
6354         }
6355
6356       if (exit_fallthru_edge != NULL
6357           && EDGE_COUNT (exit_fallthru_edge->src->preds) != 0
6358           && !bitmap_bit_p (&bb_flags, exit_fallthru_edge->src->index))
6359         {
6360           basic_block last_bb;
6361
6362           last_bb = emit_return_for_exit (exit_fallthru_edge, true);
6363           returnjump = BB_END (last_bb);
6364           exit_fallthru_edge = NULL;
6365         }
6366     }
6367 #endif
6368 #ifdef HAVE_return
6369   if (HAVE_return)
6370     {
6371       if (exit_fallthru_edge == NULL)
6372         goto epilogue_done;
6373
6374       if (optimize)
6375         {
6376           basic_block last_bb = exit_fallthru_edge->src;
6377
6378           if (LABEL_P (BB_HEAD (last_bb))
6379               && !active_insn_between (BB_HEAD (last_bb), BB_END (last_bb)))
6380             convert_jumps_to_returns (last_bb, false, NULL);
6381
6382           if (EDGE_COUNT (last_bb->preds) != 0
6383               && single_succ_p (last_bb))
6384             {
6385               last_bb = emit_return_for_exit (exit_fallthru_edge, false);
6386               epilogue_end = returnjump = BB_END (last_bb);
6387 #ifdef HAVE_simple_return
6388               /* Emitting the return may add a basic block.
6389                  Fix bb_flags for the added block.  */
6390               if (last_bb != exit_fallthru_edge->src)
6391                 bitmap_set_bit (&bb_flags, last_bb->index);
6392 #endif
6393               goto epilogue_done;
6394             }
6395         }
6396     }
6397 #endif
6398
6399   /* A small fib -- epilogue is not yet completed, but we wish to re-use
6400      this marker for the splits of EH_RETURN patterns, and nothing else
6401      uses the flag in the meantime.  */
6402   epilogue_completed = 1;
6403
6404 #ifdef HAVE_eh_return
6405   /* Find non-fallthru edges that end with EH_RETURN instructions.  On
6406      some targets, these get split to a special version of the epilogue
6407      code.  In order to be able to properly annotate these with unwind
6408      info, try to split them now.  If we get a valid split, drop an
6409      EPILOGUE_BEG note and mark the insns as epilogue insns.  */
6410   FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6411     {
6412       rtx prev, last, trial;
6413
6414       if (e->flags & EDGE_FALLTHRU)
6415         continue;
6416       last = BB_END (e->src);
6417       if (!eh_returnjump_p (last))
6418         continue;
6419
6420       prev = PREV_INSN (last);
6421       trial = try_split (PATTERN (last), last, 1);
6422       if (trial == last)
6423         continue;
6424
6425       record_insns (NEXT_INSN (prev), NEXT_INSN (trial), &epilogue_insn_hash);
6426       emit_note_after (NOTE_INSN_EPILOGUE_BEG, prev);
6427     }
6428 #endif
6429
6430   /* If nothing falls through into the exit block, we don't need an
6431      epilogue.  */
6432
6433   if (exit_fallthru_edge == NULL)
6434     goto epilogue_done;
6435
6436 #ifdef HAVE_epilogue
6437   if (HAVE_epilogue)
6438     {
6439       start_sequence ();
6440       epilogue_end = emit_note (NOTE_INSN_EPILOGUE_BEG);
6441       seq = gen_epilogue ();
6442       if (seq)
6443         emit_jump_insn (seq);
6444
6445       /* Retain a map of the epilogue insns.  */
6446       record_insns (seq, NULL, &epilogue_insn_hash);
6447       set_insn_locations (seq, epilogue_location);
6448
6449       seq = get_insns ();
6450       returnjump = get_last_insn ();
6451       end_sequence ();
6452
6453       insert_insn_on_edge (seq, exit_fallthru_edge);
6454       inserted = true;
6455
6456       if (JUMP_P (returnjump))
6457         set_return_jump_label (returnjump);
6458     }
6459   else
6460 #endif
6461     {
6462       basic_block cur_bb;
6463
6464       if (! next_active_insn (BB_END (exit_fallthru_edge->src)))
6465         goto epilogue_done;
6466       /* We have a fall-through edge to the exit block, the source is not
6467          at the end of the function, and there will be an assembler epilogue
6468          at the end of the function.
6469          We can't use force_nonfallthru here, because that would try to
6470          use return.  Inserting a jump 'by hand' is extremely messy, so
6471          we take advantage of cfg_layout_finalize using
6472          fixup_fallthru_exit_predecessor.  */
6473       cfg_layout_initialize (0);
6474       FOR_EACH_BB (cur_bb)
6475         if (cur_bb->index >= NUM_FIXED_BLOCKS
6476             && cur_bb->next_bb->index >= NUM_FIXED_BLOCKS)
6477           cur_bb->aux = cur_bb->next_bb;
6478       cfg_layout_finalize ();
6479     }
6480
6481 epilogue_done:
6482
6483   default_rtl_profile ();
6484
6485   if (inserted)
6486     {
6487       sbitmap blocks;
6488
6489       commit_edge_insertions ();
6490
6491       /* Look for basic blocks within the prologue insns.  */
6492       blocks = sbitmap_alloc (last_basic_block);
6493       sbitmap_zero (blocks);
6494       SET_BIT (blocks, entry_edge->dest->index);
6495       SET_BIT (blocks, orig_entry_edge->dest->index);
6496       find_many_sub_basic_blocks (blocks);
6497       sbitmap_free (blocks);
6498
6499       /* The epilogue insns we inserted may cause the exit edge to no longer
6500          be fallthru.  */
6501       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6502         {
6503           if (((e->flags & EDGE_FALLTHRU) != 0)
6504               && returnjump_p (BB_END (e->src)))
6505             e->flags &= ~EDGE_FALLTHRU;
6506         }
6507     }
6508
6509 #ifdef HAVE_simple_return
6510   /* If there were branches to an empty LAST_BB which we tried to
6511      convert to conditional simple_returns, but couldn't for some
6512      reason, create a block to hold a simple_return insn and redirect
6513      those remaining edges.  */
6514   if (!VEC_empty (edge, unconverted_simple_returns))
6515     {
6516       basic_block simple_return_block_hot = NULL;
6517       basic_block simple_return_block_cold = NULL;
6518       edge pending_edge_hot = NULL;
6519       edge pending_edge_cold = NULL;
6520       basic_block exit_pred = EXIT_BLOCK_PTR->prev_bb;
6521       int i;
6522
6523       gcc_assert (entry_edge != orig_entry_edge);
6524
6525       /* See if we can reuse the last insn that was emitted for the
6526          epilogue.  */
6527       if (returnjump != NULL_RTX
6528           && JUMP_LABEL (returnjump) == simple_return_rtx)
6529         {
6530           e = split_block (BLOCK_FOR_INSN (returnjump), PREV_INSN (returnjump));
6531           if (BB_PARTITION (e->src) == BB_HOT_PARTITION)
6532             simple_return_block_hot = e->dest;
6533           else
6534             simple_return_block_cold = e->dest;
6535         }
6536
6537       /* Also check returns we might need to add to tail blocks.  */
6538       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6539         if (EDGE_COUNT (e->src->preds) != 0
6540             && (e->flags & EDGE_FAKE) != 0
6541             && !bitmap_bit_p (&bb_flags, e->src->index))
6542           {
6543             if (BB_PARTITION (e->src) == BB_HOT_PARTITION)
6544               pending_edge_hot = e;
6545             else
6546               pending_edge_cold = e;
6547           }
6548
6549       FOR_EACH_VEC_ELT (edge, unconverted_simple_returns, i, e)
6550         {
6551           basic_block *pdest_bb;
6552           edge pending;
6553
6554           if (BB_PARTITION (e->src) == BB_HOT_PARTITION)
6555             {
6556               pdest_bb = &simple_return_block_hot;
6557               pending = pending_edge_hot;
6558             }
6559           else
6560             {
6561               pdest_bb = &simple_return_block_cold;
6562               pending = pending_edge_cold;
6563             }
6564
6565           if (*pdest_bb == NULL && pending != NULL)
6566             {
6567               emit_return_into_block (true, pending->src);
6568               pending->flags &= ~(EDGE_FALLTHRU | EDGE_FAKE);
6569               *pdest_bb = pending->src;
6570             }
6571           else if (*pdest_bb == NULL)
6572             {
6573               basic_block bb;
6574               rtx start;
6575
6576               bb = create_basic_block (NULL, NULL, exit_pred);
6577               BB_COPY_PARTITION (bb, e->src);
6578               start = emit_jump_insn_after (gen_simple_return (),
6579                                             BB_END (bb));
6580               JUMP_LABEL (start) = simple_return_rtx;
6581               emit_barrier_after (start);
6582
6583               *pdest_bb = bb;
6584               make_edge (bb, EXIT_BLOCK_PTR, 0);
6585             }
6586           redirect_edge_and_branch_force (e, *pdest_bb);
6587         }
6588       VEC_free (edge, heap, unconverted_simple_returns);
6589     }
6590
6591   if (entry_edge != orig_entry_edge)
6592     {
6593       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6594         if (EDGE_COUNT (e->src->preds) != 0
6595             && (e->flags & EDGE_FAKE) != 0
6596             && !bitmap_bit_p (&bb_flags, e->src->index))
6597           {
6598             emit_return_into_block (true, e->src);
6599             e->flags &= ~(EDGE_FALLTHRU | EDGE_FAKE);
6600           }
6601     }
6602 #endif
6603
6604 #ifdef HAVE_sibcall_epilogue
6605   /* Emit sibling epilogues before any sibling call sites.  */
6606   for (ei = ei_start (EXIT_BLOCK_PTR->preds); (e = ei_safe_edge (ei)); )
6607     {
6608       basic_block bb = e->src;
6609       rtx insn = BB_END (bb);
6610       rtx ep_seq;
6611
6612       if (!CALL_P (insn)
6613           || ! SIBLING_CALL_P (insn)
6614 #ifdef HAVE_simple_return
6615           || (entry_edge != orig_entry_edge
6616               && !bitmap_bit_p (&bb_flags, bb->index))
6617 #endif
6618           )
6619         {
6620           ei_next (&ei);
6621           continue;
6622         }
6623
6624       ep_seq = gen_sibcall_epilogue ();
6625       if (ep_seq)
6626         {
6627           start_sequence ();
6628           emit_note (NOTE_INSN_EPILOGUE_BEG);
6629           emit_insn (ep_seq);
6630           seq = get_insns ();
6631           end_sequence ();
6632
6633           /* Retain a map of the epilogue insns.  Used in life analysis to
6634              avoid getting rid of sibcall epilogue insns.  Do this before we
6635              actually emit the sequence.  */
6636           record_insns (seq, NULL, &epilogue_insn_hash);
6637           set_insn_locations (seq, epilogue_location);
6638
6639           emit_insn_before (seq, insn);
6640         }
6641       ei_next (&ei);
6642     }
6643 #endif
6644
6645 #ifdef HAVE_epilogue
6646   if (epilogue_end)
6647     {
6648       rtx insn, next;
6649
6650       /* Similarly, move any line notes that appear after the epilogue.
6651          There is no need, however, to be quite so anal about the existence
6652          of such a note.  Also possibly move
6653          NOTE_INSN_FUNCTION_BEG notes, as those can be relevant for debug
6654          info generation.  */
6655       for (insn = epilogue_end; insn; insn = next)
6656         {
6657           next = NEXT_INSN (insn);
6658           if (NOTE_P (insn)
6659               && (NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG))
6660             reorder_insns (insn, insn, PREV_INSN (epilogue_end));
6661         }
6662     }
6663 #endif
6664
6665 #ifdef HAVE_simple_return
6666   bitmap_clear (&bb_flags);
6667 #endif
6668
6669   /* Threading the prologue and epilogue changes the artificial refs
6670      in the entry and exit blocks.  */
6671   epilogue_completed = 1;
6672   df_update_entry_exit_and_calls ();
6673 }
6674
6675 /* Reposition the prologue-end and epilogue-begin notes after
6676    instruction scheduling.  */
6677
6678 void
6679 reposition_prologue_and_epilogue_notes (void)
6680 {
6681 #if defined (HAVE_prologue) || defined (HAVE_epilogue) \
6682     || defined (HAVE_sibcall_epilogue)
6683   /* Since the hash table is created on demand, the fact that it is
6684      non-null is a signal that it is non-empty.  */
6685   if (prologue_insn_hash != NULL)
6686     {
6687       size_t len = htab_elements (prologue_insn_hash);
6688       rtx insn, last = NULL, note = NULL;
6689
6690       /* Scan from the beginning until we reach the last prologue insn.  */
6691       /* ??? While we do have the CFG intact, there are two problems:
6692          (1) The prologue can contain loops (typically probing the stack),
6693              which means that the end of the prologue isn't in the first bb.
6694          (2) Sometimes the PROLOGUE_END note gets pushed into the next bb.  */
6695       for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
6696         {
6697           if (NOTE_P (insn))
6698             {
6699               if (NOTE_KIND (insn) == NOTE_INSN_PROLOGUE_END)
6700                 note = insn;
6701             }
6702           else if (contains (insn, prologue_insn_hash))
6703             {
6704               last = insn;
6705               if (--len == 0)
6706                 break;
6707             }
6708         }
6709
6710       if (last)
6711         {
6712           if (note == NULL)
6713             {
6714               /* Scan forward looking for the PROLOGUE_END note.  It should
6715                  be right at the beginning of the block, possibly with other
6716                  insn notes that got moved there.  */
6717               for (note = NEXT_INSN (last); ; note = NEXT_INSN (note))
6718                 {
6719                   if (NOTE_P (note)
6720                       && NOTE_KIND (note) == NOTE_INSN_PROLOGUE_END)
6721                     break;
6722                 }
6723             }
6724
6725           /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
6726           if (LABEL_P (last))
6727             last = NEXT_INSN (last);
6728           reorder_insns (note, note, last);
6729         }
6730     }
6731
6732   if (epilogue_insn_hash != NULL)
6733     {
6734       edge_iterator ei;
6735       edge e;
6736
6737       FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR->preds)
6738         {
6739           rtx insn, first = NULL, note = NULL;
6740           basic_block bb = e->src;
6741
6742           /* Scan from the beginning until we reach the first epilogue insn. */
6743           FOR_BB_INSNS (bb, insn)
6744             {
6745               if (NOTE_P (insn))
6746                 {
6747                   if (NOTE_KIND (insn) == NOTE_INSN_EPILOGUE_BEG)
6748                     {
6749                       note = insn;
6750                       if (first != NULL)
6751                         break;
6752                     }
6753                 }
6754               else if (first == NULL && contains (insn, epilogue_insn_hash))
6755                 {
6756                   first = insn;
6757                   if (note != NULL)
6758                     break;
6759                 }
6760             }
6761
6762           if (note)
6763             {
6764               /* If the function has a single basic block, and no real
6765                  epilogue insns (e.g. sibcall with no cleanup), the
6766                  epilogue note can get scheduled before the prologue
6767                  note.  If we have frame related prologue insns, having
6768                  them scanned during the epilogue will result in a crash.
6769                  In this case re-order the epilogue note to just before
6770                  the last insn in the block.  */
6771               if (first == NULL)
6772                 first = BB_END (bb);
6773
6774               if (PREV_INSN (first) != note)
6775                 reorder_insns (note, note, PREV_INSN (first));
6776             }
6777         }
6778     }
6779 #endif /* HAVE_prologue or HAVE_epilogue */
6780 }
6781
6782 /* Returns the name of function declared by FNDECL.  */
6783 const char *
6784 fndecl_name (tree fndecl)
6785 {
6786   if (fndecl == NULL)
6787     return "(nofn)";
6788   return lang_hooks.decl_printable_name (fndecl, 2);
6789 }
6790
6791 /* Returns the name of function FN.  */
6792 const char *
6793 function_name (struct function *fn)
6794 {
6795   tree fndecl = (fn == NULL) ? NULL : fn->decl;
6796   return fndecl_name (fndecl);
6797 }
6798
6799 /* Returns the name of the current function.  */
6800 const char *
6801 current_function_name (void)
6802 {
6803   return function_name (cfun);
6804 }
6805 \f
6806
6807 static unsigned int
6808 rest_of_handle_check_leaf_regs (void)
6809 {
6810 #ifdef LEAF_REGISTERS
6811   crtl->uses_only_leaf_regs
6812     = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
6813 #endif
6814   return 0;
6815 }
6816
6817 /* Insert a TYPE into the used types hash table of CFUN.  */
6818
6819 static void
6820 used_types_insert_helper (tree type, struct function *func)
6821 {
6822   if (type != NULL && func != NULL)
6823     {
6824       void **slot;
6825
6826       if (func->used_types_hash == NULL)
6827         func->used_types_hash = htab_create_ggc (37, htab_hash_pointer,
6828                                                  htab_eq_pointer, NULL);
6829       slot = htab_find_slot (func->used_types_hash, type, INSERT);
6830       if (*slot == NULL)
6831         *slot = type;
6832     }
6833 }
6834
6835 /* Given a type, insert it into the used hash table in cfun.  */
6836 void
6837 used_types_insert (tree t)
6838 {
6839   while (POINTER_TYPE_P (t) || TREE_CODE (t) == ARRAY_TYPE)
6840     if (TYPE_NAME (t))
6841       break;
6842     else
6843       t = TREE_TYPE (t);
6844   if (TREE_CODE (t) == ERROR_MARK)
6845     return;
6846   if (TYPE_NAME (t) == NULL_TREE
6847       || TYPE_NAME (t) == TYPE_NAME (TYPE_MAIN_VARIANT (t)))
6848     t = TYPE_MAIN_VARIANT (t);
6849   if (debug_info_level > DINFO_LEVEL_NONE)
6850     {
6851       if (cfun)
6852         used_types_insert_helper (t, cfun);
6853       else
6854         /* So this might be a type referenced by a global variable.
6855            Record that type so that we can later decide to emit its debug
6856            information.  */
6857         VEC_safe_push (tree, gc, types_used_by_cur_var_decl, t);
6858     }
6859 }
6860
6861 /* Helper to Hash a struct types_used_by_vars_entry.  */
6862
6863 static hashval_t
6864 hash_types_used_by_vars_entry (const struct types_used_by_vars_entry *entry)
6865 {
6866   gcc_assert (entry && entry->var_decl && entry->type);
6867
6868   return iterative_hash_object (entry->type,
6869                                 iterative_hash_object (entry->var_decl, 0));
6870 }
6871
6872 /* Hash function of the types_used_by_vars_entry hash table.  */
6873
6874 hashval_t
6875 types_used_by_vars_do_hash (const void *x)
6876 {
6877   const struct types_used_by_vars_entry *entry =
6878     (const struct types_used_by_vars_entry *) x;
6879
6880   return hash_types_used_by_vars_entry (entry);
6881 }
6882
6883 /*Equality function of the types_used_by_vars_entry hash table.  */
6884
6885 int
6886 types_used_by_vars_eq (const void *x1, const void *x2)
6887 {
6888   const struct types_used_by_vars_entry *e1 =
6889     (const struct types_used_by_vars_entry *) x1;
6890   const struct types_used_by_vars_entry *e2 =
6891     (const struct types_used_by_vars_entry *)x2;
6892
6893   return (e1->var_decl == e2->var_decl && e1->type == e2->type);
6894 }
6895
6896 /* Inserts an entry into the types_used_by_vars_hash hash table. */
6897
6898 void
6899 types_used_by_var_decl_insert (tree type, tree var_decl)
6900 {
6901   if (type != NULL && var_decl != NULL)
6902     {
6903       void **slot;
6904       struct types_used_by_vars_entry e;
6905       e.var_decl = var_decl;
6906       e.type = type;
6907       if (types_used_by_vars_hash == NULL)
6908         types_used_by_vars_hash =
6909           htab_create_ggc (37, types_used_by_vars_do_hash,
6910                            types_used_by_vars_eq, NULL);
6911       slot = htab_find_slot_with_hash (types_used_by_vars_hash, &e,
6912                                        hash_types_used_by_vars_entry (&e), INSERT);
6913       if (*slot == NULL)
6914         {
6915           struct types_used_by_vars_entry *entry;
6916           entry = ggc_alloc_types_used_by_vars_entry ();
6917           entry->type = type;
6918           entry->var_decl = var_decl;
6919           *slot = entry;
6920         }
6921     }
6922 }
6923
6924 struct rtl_opt_pass pass_leaf_regs =
6925 {
6926  {
6927   RTL_PASS,
6928   "*leaf_regs",                         /* name */
6929   NULL,                                 /* gate */
6930   rest_of_handle_check_leaf_regs,       /* execute */
6931   NULL,                                 /* sub */
6932   NULL,                                 /* next */
6933   0,                                    /* static_pass_number */
6934   TV_NONE,                              /* tv_id */
6935   0,                                    /* properties_required */
6936   0,                                    /* properties_provided */
6937   0,                                    /* properties_destroyed */
6938   0,                                    /* todo_flags_start */
6939   0                                     /* todo_flags_finish */
6940  }
6941 };
6942
6943 static unsigned int
6944 rest_of_handle_thread_prologue_and_epilogue (void)
6945 {
6946   if (optimize)
6947     cleanup_cfg (CLEANUP_EXPENSIVE);
6948
6949   /* On some machines, the prologue and epilogue code, or parts thereof,
6950      can be represented as RTL.  Doing so lets us schedule insns between
6951      it and the rest of the code and also allows delayed branch
6952      scheduling to operate in the epilogue.  */
6953   thread_prologue_and_epilogue_insns ();
6954
6955   /* The stack usage info is finalized during prologue expansion.  */
6956   if (flag_stack_usage_info)
6957     output_stack_usage ();
6958
6959   return 0;
6960 }
6961
6962 struct rtl_opt_pass pass_thread_prologue_and_epilogue =
6963 {
6964  {
6965   RTL_PASS,
6966   "pro_and_epilogue",                   /* name */
6967   NULL,                                 /* gate */
6968   rest_of_handle_thread_prologue_and_epilogue, /* execute */
6969   NULL,                                 /* sub */
6970   NULL,                                 /* next */
6971   0,                                    /* static_pass_number */
6972   TV_THREAD_PROLOGUE_AND_EPILOGUE,      /* tv_id */
6973   0,                                    /* properties_required */
6974   0,                                    /* properties_provided */
6975   0,                                    /* properties_destroyed */
6976   TODO_verify_flow,                     /* todo_flags_start */
6977   TODO_df_verify |
6978   TODO_df_finish | TODO_verify_rtl_sharing |
6979   TODO_ggc_collect                      /* todo_flags_finish */
6980  }
6981 };
6982 \f
6983
6984 /* This mini-pass fixes fall-out from SSA in asm statements that have
6985    in-out constraints.  Say you start with
6986
6987      orig = inout;
6988      asm ("": "+mr" (inout));
6989      use (orig);
6990
6991    which is transformed very early to use explicit output and match operands:
6992
6993      orig = inout;
6994      asm ("": "=mr" (inout) : "0" (inout));
6995      use (orig);
6996
6997    Or, after SSA and copyprop,
6998
6999      asm ("": "=mr" (inout_2) : "0" (inout_1));
7000      use (inout_1);
7001
7002    Clearly inout_2 and inout_1 can't be coalesced easily anymore, as
7003    they represent two separate values, so they will get different pseudo
7004    registers during expansion.  Then, since the two operands need to match
7005    per the constraints, but use different pseudo registers, reload can
7006    only register a reload for these operands.  But reloads can only be
7007    satisfied by hardregs, not by memory, so we need a register for this
7008    reload, just because we are presented with non-matching operands.
7009    So, even though we allow memory for this operand, no memory can be
7010    used for it, just because the two operands don't match.  This can
7011    cause reload failures on register-starved targets.
7012
7013    So it's a symptom of reload not being able to use memory for reloads
7014    or, alternatively it's also a symptom of both operands not coming into
7015    reload as matching (in which case the pseudo could go to memory just
7016    fine, as the alternative allows it, and no reload would be necessary).
7017    We fix the latter problem here, by transforming
7018
7019      asm ("": "=mr" (inout_2) : "0" (inout_1));
7020
7021    back to
7022
7023      inout_2 = inout_1;
7024      asm ("": "=mr" (inout_2) : "0" (inout_2));  */
7025
7026 static void
7027 match_asm_constraints_1 (rtx insn, rtx *p_sets, int noutputs)
7028 {
7029   int i;
7030   bool changed = false;
7031   rtx op = SET_SRC (p_sets[0]);
7032   int ninputs = ASM_OPERANDS_INPUT_LENGTH (op);
7033   rtvec inputs = ASM_OPERANDS_INPUT_VEC (op);
7034   bool *output_matched = XALLOCAVEC (bool, noutputs);
7035
7036   memset (output_matched, 0, noutputs * sizeof (bool));
7037   for (i = 0; i < ninputs; i++)
7038     {
7039       rtx input, output, insns;
7040       const char *constraint = ASM_OPERANDS_INPUT_CONSTRAINT (op, i);
7041       char *end;
7042       int match, j;
7043
7044       if (*constraint == '%')
7045         constraint++;
7046
7047       match = strtoul (constraint, &end, 10);
7048       if (end == constraint)
7049         continue;
7050
7051       gcc_assert (match < noutputs);
7052       output = SET_DEST (p_sets[match]);
7053       input = RTVEC_ELT (inputs, i);
7054       /* Only do the transformation for pseudos.  */
7055       if (! REG_P (output)
7056           || rtx_equal_p (output, input)
7057           || (GET_MODE (input) != VOIDmode
7058               && GET_MODE (input) != GET_MODE (output)))
7059         continue;
7060
7061       /* We can't do anything if the output is also used as input,
7062          as we're going to overwrite it.  */
7063       for (j = 0; j < ninputs; j++)
7064         if (reg_overlap_mentioned_p (output, RTVEC_ELT (inputs, j)))
7065           break;
7066       if (j != ninputs)
7067         continue;
7068
7069       /* Avoid changing the same input several times.  For
7070          asm ("" : "=mr" (out1), "=mr" (out2) : "0" (in), "1" (in));
7071          only change in once (to out1), rather than changing it
7072          first to out1 and afterwards to out2.  */
7073       if (i > 0)
7074         {
7075           for (j = 0; j < noutputs; j++)
7076             if (output_matched[j] && input == SET_DEST (p_sets[j]))
7077               break;
7078           if (j != noutputs)
7079             continue;
7080         }
7081       output_matched[match] = true;
7082
7083       start_sequence ();
7084       emit_move_insn (output, input);
7085       insns = get_insns ();
7086       end_sequence ();
7087       emit_insn_before (insns, insn);
7088
7089       /* Now replace all mentions of the input with output.  We can't
7090          just replace the occurrence in inputs[i], as the register might
7091          also be used in some other input (or even in an address of an
7092          output), which would mean possibly increasing the number of
7093          inputs by one (namely 'output' in addition), which might pose
7094          a too complicated problem for reload to solve.  E.g. this situation:
7095
7096            asm ("" : "=r" (output), "=m" (input) : "0" (input))
7097
7098          Here 'input' is used in two occurrences as input (once for the
7099          input operand, once for the address in the second output operand).
7100          If we would replace only the occurrence of the input operand (to
7101          make the matching) we would be left with this:
7102
7103            output = input
7104            asm ("" : "=r" (output), "=m" (input) : "0" (output))
7105
7106          Now we suddenly have two different input values (containing the same
7107          value, but different pseudos) where we formerly had only one.
7108          With more complicated asms this might lead to reload failures
7109          which wouldn't have happen without this pass.  So, iterate over
7110          all operands and replace all occurrences of the register used.  */
7111       for (j = 0; j < noutputs; j++)
7112         if (!rtx_equal_p (SET_DEST (p_sets[j]), input)
7113             && reg_overlap_mentioned_p (input, SET_DEST (p_sets[j])))
7114           SET_DEST (p_sets[j]) = replace_rtx (SET_DEST (p_sets[j]),
7115                                               input, output);
7116       for (j = 0; j < ninputs; j++)
7117         if (reg_overlap_mentioned_p (input, RTVEC_ELT (inputs, j)))
7118           RTVEC_ELT (inputs, j) = replace_rtx (RTVEC_ELT (inputs, j),
7119                                                input, output);
7120
7121       changed = true;
7122     }
7123
7124   if (changed)
7125     df_insn_rescan (insn);
7126 }
7127
7128 static unsigned
7129 rest_of_match_asm_constraints (void)
7130 {
7131   basic_block bb;
7132   rtx insn, pat, *p_sets;
7133   int noutputs;
7134
7135   if (!crtl->has_asm_statement)
7136     return 0;
7137
7138   df_set_flags (DF_DEFER_INSN_RESCAN);
7139   FOR_EACH_BB (bb)
7140     {
7141       FOR_BB_INSNS (bb, insn)
7142         {
7143           if (!INSN_P (insn))
7144             continue;
7145
7146           pat = PATTERN (insn);
7147           if (GET_CODE (pat) == PARALLEL)
7148             p_sets = &XVECEXP (pat, 0, 0), noutputs = XVECLEN (pat, 0);
7149           else if (GET_CODE (pat) == SET)
7150             p_sets = &PATTERN (insn), noutputs = 1;
7151           else
7152             continue;
7153
7154           if (GET_CODE (*p_sets) == SET
7155               && GET_CODE (SET_SRC (*p_sets)) == ASM_OPERANDS)
7156             match_asm_constraints_1 (insn, p_sets, noutputs);
7157          }
7158     }
7159
7160   return TODO_df_finish;
7161 }
7162
7163 struct rtl_opt_pass pass_match_asm_constraints =
7164 {
7165  {
7166   RTL_PASS,
7167   "asmcons",                            /* name */
7168   NULL,                                 /* gate */
7169   rest_of_match_asm_constraints,        /* execute */
7170   NULL,                                 /* sub */
7171   NULL,                                 /* next */
7172   0,                                    /* static_pass_number */
7173   TV_NONE,                              /* tv_id */
7174   0,                                    /* properties_required */
7175   0,                                    /* properties_provided */
7176   0,                                    /* properties_destroyed */
7177   0,                                    /* todo_flags_start */
7178   0                                     /* todo_flags_finish */
7179  }
7180 };
7181
7182
7183 #include "gt-function.h"