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