xref: /dragonfly/contrib/gcc-4.7/gcc/cfgexpand.c (revision 25a2db75)
1 /* A pass for lowering trees to RTL.
2    Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11 
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h"
25 #include "tree.h"
26 #include "rtl.h"
27 #include "tm_p.h"
28 #include "basic-block.h"
29 #include "function.h"
30 #include "expr.h"
31 #include "langhooks.h"
32 #include "tree-flow.h"
33 #include "timevar.h"
34 #include "tree-dump.h"
35 #include "tree-pass.h"
36 #include "except.h"
37 #include "flags.h"
38 #include "diagnostic.h"
39 #include "tree-pretty-print.h"
40 #include "gimple-pretty-print.h"
41 #include "toplev.h"
42 #include "debug.h"
43 #include "params.h"
44 #include "tree-inline.h"
45 #include "value-prof.h"
46 #include "target.h"
47 #include "ssaexpand.h"
48 #include "bitmap.h"
49 #include "sbitmap.h"
50 #include "insn-attr.h" /* For INSN_SCHEDULING.  */
51 
52 /* This variable holds information helping the rewriting of SSA trees
53    into RTL.  */
54 struct ssaexpand SA;
55 
56 /* This variable holds the currently expanded gimple statement for purposes
57    of comminucating the profile info to the builtin expanders.  */
58 gimple currently_expanding_gimple_stmt;
59 
60 static rtx expand_debug_expr (tree);
61 
62 /* Return an expression tree corresponding to the RHS of GIMPLE
63    statement STMT.  */
64 
65 tree
66 gimple_assign_rhs_to_tree (gimple stmt)
67 {
68   tree t;
69   enum gimple_rhs_class grhs_class;
70 
71   grhs_class = get_gimple_rhs_class (gimple_expr_code (stmt));
72 
73   if (grhs_class == GIMPLE_TERNARY_RHS)
74     t = build3 (gimple_assign_rhs_code (stmt),
75 		TREE_TYPE (gimple_assign_lhs (stmt)),
76 		gimple_assign_rhs1 (stmt),
77 		gimple_assign_rhs2 (stmt),
78 		gimple_assign_rhs3 (stmt));
79   else if (grhs_class == GIMPLE_BINARY_RHS)
80     t = build2 (gimple_assign_rhs_code (stmt),
81 		TREE_TYPE (gimple_assign_lhs (stmt)),
82 		gimple_assign_rhs1 (stmt),
83 		gimple_assign_rhs2 (stmt));
84   else if (grhs_class == GIMPLE_UNARY_RHS)
85     t = build1 (gimple_assign_rhs_code (stmt),
86 		TREE_TYPE (gimple_assign_lhs (stmt)),
87 		gimple_assign_rhs1 (stmt));
88   else if (grhs_class == GIMPLE_SINGLE_RHS)
89     {
90       t = gimple_assign_rhs1 (stmt);
91       /* Avoid modifying this tree in place below.  */
92       if ((gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t)
93 	   && gimple_location (stmt) != EXPR_LOCATION (t))
94 	  || (gimple_block (stmt)
95 	      && currently_expanding_to_rtl
96 	      && EXPR_P (t)
97 	      && gimple_block (stmt) != TREE_BLOCK (t)))
98 	t = copy_node (t);
99     }
100   else
101     gcc_unreachable ();
102 
103   if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t))
104     SET_EXPR_LOCATION (t, gimple_location (stmt));
105   if (gimple_block (stmt) && currently_expanding_to_rtl && EXPR_P (t))
106     TREE_BLOCK (t) = gimple_block (stmt);
107 
108   return t;
109 }
110 
111 
112 #ifndef STACK_ALIGNMENT_NEEDED
113 #define STACK_ALIGNMENT_NEEDED 1
114 #endif
115 
116 #define SSAVAR(x) (TREE_CODE (x) == SSA_NAME ? SSA_NAME_VAR (x) : x)
117 
118 /* Associate declaration T with storage space X.  If T is no
119    SSA name this is exactly SET_DECL_RTL, otherwise make the
120    partition of T associated with X.  */
121 static inline void
122 set_rtl (tree t, rtx x)
123 {
124   if (TREE_CODE (t) == SSA_NAME)
125     {
126       SA.partition_to_pseudo[var_to_partition (SA.map, t)] = x;
127       if (x && !MEM_P (x))
128 	set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (t), x);
129       /* For the benefit of debug information at -O0 (where vartracking
130          doesn't run) record the place also in the base DECL if it's
131 	 a normal variable (not a parameter).  */
132       if (x && x != pc_rtx && TREE_CODE (SSA_NAME_VAR (t)) == VAR_DECL)
133 	{
134 	  tree var = SSA_NAME_VAR (t);
135 	  /* If we don't yet have something recorded, just record it now.  */
136 	  if (!DECL_RTL_SET_P (var))
137 	    SET_DECL_RTL (var, x);
138 	  /* If we have it set already to "multiple places" don't
139 	     change this.  */
140 	  else if (DECL_RTL (var) == pc_rtx)
141 	    ;
142 	  /* If we have something recorded and it's not the same place
143 	     as we want to record now, we have multiple partitions for the
144 	     same base variable, with different places.  We can't just
145 	     randomly chose one, hence we have to say that we don't know.
146 	     This only happens with optimization, and there var-tracking
147 	     will figure out the right thing.  */
148 	  else if (DECL_RTL (var) != x)
149 	    SET_DECL_RTL (var, pc_rtx);
150 	}
151     }
152   else
153     SET_DECL_RTL (t, x);
154 }
155 
156 /* This structure holds data relevant to one variable that will be
157    placed in a stack slot.  */
158 struct stack_var
159 {
160   /* The Variable.  */
161   tree decl;
162 
163   /* Initially, the size of the variable.  Later, the size of the partition,
164      if this variable becomes it's partition's representative.  */
165   HOST_WIDE_INT size;
166 
167   /* The *byte* alignment required for this variable.  Or as, with the
168      size, the alignment for this partition.  */
169   unsigned int alignb;
170 
171   /* The partition representative.  */
172   size_t representative;
173 
174   /* The next stack variable in the partition, or EOC.  */
175   size_t next;
176 
177   /* The numbers of conflicting stack variables.  */
178   bitmap conflicts;
179 };
180 
181 #define EOC  ((size_t)-1)
182 
183 /* We have an array of such objects while deciding allocation.  */
184 static struct stack_var *stack_vars;
185 static size_t stack_vars_alloc;
186 static size_t stack_vars_num;
187 static struct pointer_map_t *decl_to_stack_part;
188 
189 /* An array of indices such that stack_vars[stack_vars_sorted[i]].size
190    is non-decreasing.  */
191 static size_t *stack_vars_sorted;
192 
193 /* The phase of the stack frame.  This is the known misalignment of
194    virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY.  That is,
195    (frame_offset+frame_phase) % PREFERRED_STACK_BOUNDARY == 0.  */
196 static int frame_phase;
197 
198 /* Used during expand_used_vars to remember if we saw any decls for
199    which we'd like to enable stack smashing protection.  */
200 static bool has_protected_decls;
201 
202 /* Used during expand_used_vars.  Remember if we say a character buffer
203    smaller than our cutoff threshold.  Used for -Wstack-protector.  */
204 static bool has_short_buffer;
205 
206 /* Compute the byte alignment to use for DECL.  Ignore alignment
207    we can't do with expected alignment of the stack boundary.  */
208 
209 static unsigned int
210 align_local_variable (tree decl)
211 {
212   unsigned int align = LOCAL_DECL_ALIGNMENT (decl);
213   DECL_ALIGN (decl) = align;
214   return align / BITS_PER_UNIT;
215 }
216 
217 /* Allocate SIZE bytes at byte alignment ALIGN from the stack frame.
218    Return the frame offset.  */
219 
220 static HOST_WIDE_INT
221 alloc_stack_frame_space (HOST_WIDE_INT size, unsigned HOST_WIDE_INT align)
222 {
223   HOST_WIDE_INT offset, new_frame_offset;
224 
225   new_frame_offset = frame_offset;
226   if (FRAME_GROWS_DOWNWARD)
227     {
228       new_frame_offset -= size + frame_phase;
229       new_frame_offset &= -align;
230       new_frame_offset += frame_phase;
231       offset = new_frame_offset;
232     }
233   else
234     {
235       new_frame_offset -= frame_phase;
236       new_frame_offset += align - 1;
237       new_frame_offset &= -align;
238       new_frame_offset += frame_phase;
239       offset = new_frame_offset;
240       new_frame_offset += size;
241     }
242   frame_offset = new_frame_offset;
243 
244   if (frame_offset_overflow (frame_offset, cfun->decl))
245     frame_offset = offset = 0;
246 
247   return offset;
248 }
249 
250 /* Accumulate DECL into STACK_VARS.  */
251 
252 static void
253 add_stack_var (tree decl)
254 {
255   struct stack_var *v;
256 
257   if (stack_vars_num >= stack_vars_alloc)
258     {
259       if (stack_vars_alloc)
260 	stack_vars_alloc = stack_vars_alloc * 3 / 2;
261       else
262 	stack_vars_alloc = 32;
263       stack_vars
264 	= XRESIZEVEC (struct stack_var, stack_vars, stack_vars_alloc);
265     }
266   if (!decl_to_stack_part)
267     decl_to_stack_part = pointer_map_create ();
268 
269   v = &stack_vars[stack_vars_num];
270   * (size_t *)pointer_map_insert (decl_to_stack_part, decl) = stack_vars_num;
271 
272   v->decl = decl;
273   v->size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (decl)), 1);
274   /* Ensure that all variables have size, so that &a != &b for any two
275      variables that are simultaneously live.  */
276   if (v->size == 0)
277     v->size = 1;
278   v->alignb = align_local_variable (SSAVAR (decl));
279   /* An alignment of zero can mightily confuse us later.  */
280   gcc_assert (v->alignb != 0);
281 
282   /* All variables are initially in their own partition.  */
283   v->representative = stack_vars_num;
284   v->next = EOC;
285 
286   /* All variables initially conflict with no other.  */
287   v->conflicts = NULL;
288 
289   /* Ensure that this decl doesn't get put onto the list twice.  */
290   set_rtl (decl, pc_rtx);
291 
292   stack_vars_num++;
293 }
294 
295 /* Make the decls associated with luid's X and Y conflict.  */
296 
297 static void
298 add_stack_var_conflict (size_t x, size_t y)
299 {
300   struct stack_var *a = &stack_vars[x];
301   struct stack_var *b = &stack_vars[y];
302   if (!a->conflicts)
303     a->conflicts = BITMAP_ALLOC (NULL);
304   if (!b->conflicts)
305     b->conflicts = BITMAP_ALLOC (NULL);
306   bitmap_set_bit (a->conflicts, y);
307   bitmap_set_bit (b->conflicts, x);
308 }
309 
310 /* Check whether the decls associated with luid's X and Y conflict.  */
311 
312 static bool
313 stack_var_conflict_p (size_t x, size_t y)
314 {
315   struct stack_var *a = &stack_vars[x];
316   struct stack_var *b = &stack_vars[y];
317   if (x == y)
318     return false;
319   /* Partitions containing an SSA name result from gimple registers
320      with things like unsupported modes.  They are top-level and
321      hence conflict with everything else.  */
322   if (TREE_CODE (a->decl) == SSA_NAME || TREE_CODE (b->decl) == SSA_NAME)
323     return true;
324 
325   if (!a->conflicts || !b->conflicts)
326     return false;
327   return bitmap_bit_p (a->conflicts, y);
328 }
329 
330 /* Returns true if TYPE is or contains a union type.  */
331 
332 static bool
333 aggregate_contains_union_type (tree type)
334 {
335   tree field;
336 
337   if (TREE_CODE (type) == UNION_TYPE
338       || TREE_CODE (type) == QUAL_UNION_TYPE)
339     return true;
340   if (TREE_CODE (type) == ARRAY_TYPE)
341     return aggregate_contains_union_type (TREE_TYPE (type));
342   if (TREE_CODE (type) != RECORD_TYPE)
343     return false;
344 
345   for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
346     if (TREE_CODE (field) == FIELD_DECL)
347       if (aggregate_contains_union_type (TREE_TYPE (field)))
348 	return true;
349 
350   return false;
351 }
352 
353 /* A subroutine of expand_used_vars.  If two variables X and Y have alias
354    sets that do not conflict, then do add a conflict for these variables
355    in the interference graph.  We also need to make sure to add conflicts
356    for union containing structures.  Else RTL alias analysis comes along
357    and due to type based aliasing rules decides that for two overlapping
358    union temporaries { short s; int i; } accesses to the same mem through
359    different types may not alias and happily reorders stores across
360    life-time boundaries of the temporaries (See PR25654).  */
361 
362 static void
363 add_alias_set_conflicts (void)
364 {
365   size_t i, j, n = stack_vars_num;
366 
367   for (i = 0; i < n; ++i)
368     {
369       tree type_i = TREE_TYPE (stack_vars[i].decl);
370       bool aggr_i = AGGREGATE_TYPE_P (type_i);
371       bool contains_union;
372 
373       contains_union = aggregate_contains_union_type (type_i);
374       for (j = 0; j < i; ++j)
375 	{
376 	  tree type_j = TREE_TYPE (stack_vars[j].decl);
377 	  bool aggr_j = AGGREGATE_TYPE_P (type_j);
378 	  if (aggr_i != aggr_j
379 	      /* Either the objects conflict by means of type based
380 		 aliasing rules, or we need to add a conflict.  */
381 	      || !objects_must_conflict_p (type_i, type_j)
382 	      /* In case the types do not conflict ensure that access
383 		 to elements will conflict.  In case of unions we have
384 		 to be careful as type based aliasing rules may say
385 		 access to the same memory does not conflict.  So play
386 		 safe and add a conflict in this case when
387                  -fstrict-aliasing is used.  */
388               || (contains_union && flag_strict_aliasing))
389 	    add_stack_var_conflict (i, j);
390 	}
391     }
392 }
393 
394 /* Callback for walk_stmt_ops.  If OP is a decl touched by add_stack_var
395    enter its partition number into bitmap DATA.  */
396 
397 static bool
398 visit_op (gimple stmt ATTRIBUTE_UNUSED, tree op, void *data)
399 {
400   bitmap active = (bitmap)data;
401   op = get_base_address (op);
402   if (op
403       && DECL_P (op)
404       && DECL_RTL_IF_SET (op) == pc_rtx)
405     {
406       size_t *v = (size_t *) pointer_map_contains (decl_to_stack_part, op);
407       if (v)
408 	bitmap_set_bit (active, *v);
409     }
410   return false;
411 }
412 
413 /* Callback for walk_stmt_ops.  If OP is a decl touched by add_stack_var
414    record conflicts between it and all currently active other partitions
415    from bitmap DATA.  */
416 
417 static bool
418 visit_conflict (gimple stmt ATTRIBUTE_UNUSED, tree op, void *data)
419 {
420   bitmap active = (bitmap)data;
421   op = get_base_address (op);
422   if (op
423       && DECL_P (op)
424       && DECL_RTL_IF_SET (op) == pc_rtx)
425     {
426       size_t *v =
427 	(size_t *) pointer_map_contains (decl_to_stack_part, op);
428       if (v && bitmap_set_bit (active, *v))
429 	{
430 	  size_t num = *v;
431 	  bitmap_iterator bi;
432 	  unsigned i;
433 	  gcc_assert (num < stack_vars_num);
434 	  EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
435 	    add_stack_var_conflict (num, i);
436 	}
437     }
438   return false;
439 }
440 
441 /* Helper routine for add_scope_conflicts, calculating the active partitions
442    at the end of BB, leaving the result in WORK.  We're called to generate
443    conflicts when FOR_CONFLICT is true, otherwise we're just tracking
444    liveness.  */
445 
446 static void
447 add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict)
448 {
449   edge e;
450   edge_iterator ei;
451   gimple_stmt_iterator gsi;
452   bool (*visit)(gimple, tree, void *);
453 
454   bitmap_clear (work);
455   FOR_EACH_EDGE (e, ei, bb->preds)
456     bitmap_ior_into (work, (bitmap)e->src->aux);
457 
458   visit = visit_op;
459 
460   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
461     {
462       gimple stmt = gsi_stmt (gsi);
463       walk_stmt_load_store_addr_ops (stmt, work, NULL, NULL, visit);
464     }
465   for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
466     {
467       gimple stmt = gsi_stmt (gsi);
468 
469       if (gimple_clobber_p (stmt))
470 	{
471 	  tree lhs = gimple_assign_lhs (stmt);
472 	  size_t *v;
473 	  /* Nested function lowering might introduce LHSs
474 	     that are COMPONENT_REFs.  */
475 	  if (TREE_CODE (lhs) != VAR_DECL)
476 	    continue;
477 	  if (DECL_RTL_IF_SET (lhs) == pc_rtx
478 	      && (v = (size_t *)
479 		  pointer_map_contains (decl_to_stack_part, lhs)))
480 	    bitmap_clear_bit (work, *v);
481 	}
482       else if (!is_gimple_debug (stmt))
483 	{
484 	  if (for_conflict
485 	      && visit == visit_op)
486 	    {
487 	      /* If this is the first real instruction in this BB we need
488 	         to add conflicts for everything live at this point now.
489 		 Unlike classical liveness for named objects we can't
490 		 rely on seeing a def/use of the names we're interested in.
491 		 There might merely be indirect loads/stores.  We'd not add any
492 		 conflicts for such partitions.  */
493 	      bitmap_iterator bi;
494 	      unsigned i;
495 	      EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi)
496 		{
497 		  unsigned j;
498 		  bitmap_iterator bj;
499 		  EXECUTE_IF_SET_IN_BITMAP (work, i + 1, j, bj)
500 		    add_stack_var_conflict (i, j);
501 		}
502 	      visit = visit_conflict;
503 	    }
504 	  walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit);
505 	}
506     }
507 }
508 
509 /* Generate stack partition conflicts between all partitions that are
510    simultaneously live.  */
511 
512 static void
513 add_scope_conflicts (void)
514 {
515   basic_block bb;
516   bool changed;
517   bitmap work = BITMAP_ALLOC (NULL);
518 
519   /* We approximate the live range of a stack variable by taking the first
520      mention of its name as starting point(s), and by the end-of-scope
521      death clobber added by gimplify as ending point(s) of the range.
522      This overapproximates in the case we for instance moved an address-taken
523      operation upward, without also moving a dereference to it upwards.
524      But it's conservatively correct as a variable never can hold values
525      before its name is mentioned at least once.
526 
527      We then do a mostly classical bitmap liveness algorithm.  */
528 
529   FOR_ALL_BB (bb)
530     bb->aux = BITMAP_ALLOC (NULL);
531 
532   changed = true;
533   while (changed)
534     {
535       changed = false;
536       FOR_EACH_BB (bb)
537 	{
538 	  bitmap active = (bitmap)bb->aux;
539 	  add_scope_conflicts_1 (bb, work, false);
540 	  if (bitmap_ior_into (active, work))
541 	    changed = true;
542 	}
543     }
544 
545   FOR_EACH_BB (bb)
546     add_scope_conflicts_1 (bb, work, true);
547 
548   BITMAP_FREE (work);
549   FOR_ALL_BB (bb)
550     BITMAP_FREE (bb->aux);
551 }
552 
553 /* A subroutine of partition_stack_vars.  A comparison function for qsort,
554    sorting an array of indices by the properties of the object.  */
555 
556 static int
557 stack_var_cmp (const void *a, const void *b)
558 {
559   size_t ia = *(const size_t *)a;
560   size_t ib = *(const size_t *)b;
561   unsigned int aligna = stack_vars[ia].alignb;
562   unsigned int alignb = stack_vars[ib].alignb;
563   HOST_WIDE_INT sizea = stack_vars[ia].size;
564   HOST_WIDE_INT sizeb = stack_vars[ib].size;
565   tree decla = stack_vars[ia].decl;
566   tree declb = stack_vars[ib].decl;
567   bool largea, largeb;
568   unsigned int uida, uidb;
569 
570   /* Primary compare on "large" alignment.  Large comes first.  */
571   largea = (aligna * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT);
572   largeb = (alignb * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT);
573   if (largea != largeb)
574     return (int)largeb - (int)largea;
575 
576   /* Secondary compare on size, decreasing  */
577   if (sizea > sizeb)
578     return -1;
579   if (sizea < sizeb)
580     return 1;
581 
582   /* Tertiary compare on true alignment, decreasing.  */
583   if (aligna < alignb)
584     return -1;
585   if (aligna > alignb)
586     return 1;
587 
588   /* Final compare on ID for sort stability, increasing.
589      Two SSA names are compared by their version, SSA names come before
590      non-SSA names, and two normal decls are compared by their DECL_UID.  */
591   if (TREE_CODE (decla) == SSA_NAME)
592     {
593       if (TREE_CODE (declb) == SSA_NAME)
594 	uida = SSA_NAME_VERSION (decla), uidb = SSA_NAME_VERSION (declb);
595       else
596 	return -1;
597     }
598   else if (TREE_CODE (declb) == SSA_NAME)
599     return 1;
600   else
601     uida = DECL_UID (decla), uidb = DECL_UID (declb);
602   if (uida < uidb)
603     return 1;
604   if (uida > uidb)
605     return -1;
606   return 0;
607 }
608 
609 
610 /* If the points-to solution *PI points to variables that are in a partition
611    together with other variables add all partition members to the pointed-to
612    variables bitmap.  */
613 
614 static void
615 add_partitioned_vars_to_ptset (struct pt_solution *pt,
616 			       struct pointer_map_t *decls_to_partitions,
617 			       struct pointer_set_t *visited, bitmap temp)
618 {
619   bitmap_iterator bi;
620   unsigned i;
621   bitmap *part;
622 
623   if (pt->anything
624       || pt->vars == NULL
625       /* The pointed-to vars bitmap is shared, it is enough to
626 	 visit it once.  */
627       || pointer_set_insert(visited, pt->vars))
628     return;
629 
630   bitmap_clear (temp);
631 
632   /* By using a temporary bitmap to store all members of the partitions
633      we have to add we make sure to visit each of the partitions only
634      once.  */
635   EXECUTE_IF_SET_IN_BITMAP (pt->vars, 0, i, bi)
636     if ((!temp
637 	 || !bitmap_bit_p (temp, i))
638 	&& (part = (bitmap *) pointer_map_contains (decls_to_partitions,
639 						    (void *)(size_t) i)))
640       bitmap_ior_into (temp, *part);
641   if (!bitmap_empty_p (temp))
642     bitmap_ior_into (pt->vars, temp);
643 }
644 
645 /* Update points-to sets based on partition info, so we can use them on RTL.
646    The bitmaps representing stack partitions will be saved until expand,
647    where partitioned decls used as bases in memory expressions will be
648    rewritten.  */
649 
650 static void
651 update_alias_info_with_stack_vars (void)
652 {
653   struct pointer_map_t *decls_to_partitions = NULL;
654   size_t i, j;
655   tree var = NULL_TREE;
656 
657   for (i = 0; i < stack_vars_num; i++)
658     {
659       bitmap part = NULL;
660       tree name;
661       struct ptr_info_def *pi;
662 
663       /* Not interested in partitions with single variable.  */
664       if (stack_vars[i].representative != i
665           || stack_vars[i].next == EOC)
666         continue;
667 
668       if (!decls_to_partitions)
669 	{
670 	  decls_to_partitions = pointer_map_create ();
671 	  cfun->gimple_df->decls_to_pointers = pointer_map_create ();
672 	}
673 
674       /* Create an SSA_NAME that points to the partition for use
675          as base during alias-oracle queries on RTL for bases that
676 	 have been partitioned.  */
677       if (var == NULL_TREE)
678 	var = create_tmp_var (ptr_type_node, NULL);
679       name = make_ssa_name (var, NULL);
680 
681       /* Create bitmaps representing partitions.  They will be used for
682          points-to sets later, so use GGC alloc.  */
683       part = BITMAP_GGC_ALLOC ();
684       for (j = i; j != EOC; j = stack_vars[j].next)
685 	{
686 	  tree decl = stack_vars[j].decl;
687 	  unsigned int uid = DECL_PT_UID (decl);
688 	  /* We should never end up partitioning SSA names (though they
689 	     may end up on the stack).  Neither should we allocate stack
690 	     space to something that is unused and thus unreferenced, except
691 	     for -O0 where we are preserving even unreferenced variables.  */
692 	  gcc_assert (DECL_P (decl)
693 		      && (!optimize
694 			  || referenced_var_lookup (cfun, DECL_UID (decl))));
695 	  bitmap_set_bit (part, uid);
696 	  *((bitmap *) pointer_map_insert (decls_to_partitions,
697 					   (void *)(size_t) uid)) = part;
698 	  *((tree *) pointer_map_insert (cfun->gimple_df->decls_to_pointers,
699 					 decl)) = name;
700 	}
701 
702       /* Make the SSA name point to all partition members.  */
703       pi = get_ptr_info (name);
704       pt_solution_set (&pi->pt, part, false);
705     }
706 
707   /* Make all points-to sets that contain one member of a partition
708      contain all members of the partition.  */
709   if (decls_to_partitions)
710     {
711       unsigned i;
712       struct pointer_set_t *visited = pointer_set_create ();
713       bitmap temp = BITMAP_ALLOC (NULL);
714 
715       for (i = 1; i < num_ssa_names; i++)
716 	{
717 	  tree name = ssa_name (i);
718 	  struct ptr_info_def *pi;
719 
720 	  if (name
721 	      && POINTER_TYPE_P (TREE_TYPE (name))
722 	      && ((pi = SSA_NAME_PTR_INFO (name)) != NULL))
723 	    add_partitioned_vars_to_ptset (&pi->pt, decls_to_partitions,
724 					   visited, temp);
725 	}
726 
727       add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped,
728 				     decls_to_partitions, visited, temp);
729 
730       pointer_set_destroy (visited);
731       pointer_map_destroy (decls_to_partitions);
732       BITMAP_FREE (temp);
733     }
734 }
735 
736 /* A subroutine of partition_stack_vars.  The UNION portion of a UNION/FIND
737    partitioning algorithm.  Partitions A and B are known to be non-conflicting.
738    Merge them into a single partition A.  */
739 
740 static void
741 union_stack_vars (size_t a, size_t b)
742 {
743   struct stack_var *vb = &stack_vars[b];
744   bitmap_iterator bi;
745   unsigned u;
746 
747   gcc_assert (stack_vars[b].next == EOC);
748    /* Add B to A's partition.  */
749   stack_vars[b].next = stack_vars[a].next;
750   stack_vars[b].representative = a;
751   stack_vars[a].next = b;
752 
753   /* Update the required alignment of partition A to account for B.  */
754   if (stack_vars[a].alignb < stack_vars[b].alignb)
755     stack_vars[a].alignb = stack_vars[b].alignb;
756 
757   /* Update the interference graph and merge the conflicts.  */
758   if (vb->conflicts)
759     {
760       EXECUTE_IF_SET_IN_BITMAP (vb->conflicts, 0, u, bi)
761 	add_stack_var_conflict (a, stack_vars[u].representative);
762       BITMAP_FREE (vb->conflicts);
763     }
764 }
765 
766 /* A subroutine of expand_used_vars.  Binpack the variables into
767    partitions constrained by the interference graph.  The overall
768    algorithm used is as follows:
769 
770 	Sort the objects by size in descending order.
771 	For each object A {
772 	  S = size(A)
773 	  O = 0
774 	  loop {
775 	    Look for the largest non-conflicting object B with size <= S.
776 	    UNION (A, B)
777 	  }
778 	}
779 */
780 
781 static void
782 partition_stack_vars (void)
783 {
784   size_t si, sj, n = stack_vars_num;
785 
786   stack_vars_sorted = XNEWVEC (size_t, stack_vars_num);
787   for (si = 0; si < n; ++si)
788     stack_vars_sorted[si] = si;
789 
790   if (n == 1)
791     return;
792 
793   qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_cmp);
794 
795   for (si = 0; si < n; ++si)
796     {
797       size_t i = stack_vars_sorted[si];
798       unsigned int ialign = stack_vars[i].alignb;
799 
800       /* Ignore objects that aren't partition representatives. If we
801          see a var that is not a partition representative, it must
802          have been merged earlier.  */
803       if (stack_vars[i].representative != i)
804         continue;
805 
806       for (sj = si + 1; sj < n; ++sj)
807 	{
808 	  size_t j = stack_vars_sorted[sj];
809 	  unsigned int jalign = stack_vars[j].alignb;
810 
811 	  /* Ignore objects that aren't partition representatives.  */
812 	  if (stack_vars[j].representative != j)
813 	    continue;
814 
815 	  /* Ignore conflicting objects.  */
816 	  if (stack_var_conflict_p (i, j))
817 	    continue;
818 
819 	  /* Do not mix objects of "small" (supported) alignment
820 	     and "large" (unsupported) alignment.  */
821 	  if ((ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
822 	      != (jalign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT))
823 	    continue;
824 
825 	  /* UNION the objects, placing J at OFFSET.  */
826 	  union_stack_vars (i, j);
827 	}
828     }
829 
830   update_alias_info_with_stack_vars ();
831 }
832 
833 /* A debugging aid for expand_used_vars.  Dump the generated partitions.  */
834 
835 static void
836 dump_stack_var_partition (void)
837 {
838   size_t si, i, j, n = stack_vars_num;
839 
840   for (si = 0; si < n; ++si)
841     {
842       i = stack_vars_sorted[si];
843 
844       /* Skip variables that aren't partition representatives, for now.  */
845       if (stack_vars[i].representative != i)
846 	continue;
847 
848       fprintf (dump_file, "Partition %lu: size " HOST_WIDE_INT_PRINT_DEC
849 	       " align %u\n", (unsigned long) i, stack_vars[i].size,
850 	       stack_vars[i].alignb);
851 
852       for (j = i; j != EOC; j = stack_vars[j].next)
853 	{
854 	  fputc ('\t', dump_file);
855 	  print_generic_expr (dump_file, stack_vars[j].decl, dump_flags);
856 	}
857       fputc ('\n', dump_file);
858     }
859 }
860 
861 /* Assign rtl to DECL at BASE + OFFSET.  */
862 
863 static void
864 expand_one_stack_var_at (tree decl, rtx base, unsigned base_align,
865 			 HOST_WIDE_INT offset)
866 {
867   unsigned align;
868   rtx x;
869 
870   /* If this fails, we've overflowed the stack frame.  Error nicely?  */
871   gcc_assert (offset == trunc_int_for_mode (offset, Pmode));
872 
873   x = plus_constant (base, offset);
874   x = gen_rtx_MEM (DECL_MODE (SSAVAR (decl)), x);
875 
876   if (TREE_CODE (decl) != SSA_NAME)
877     {
878       /* Set alignment we actually gave this decl if it isn't an SSA name.
879          If it is we generate stack slots only accidentally so it isn't as
880 	 important, we'll simply use the alignment that is already set.  */
881       if (base == virtual_stack_vars_rtx)
882 	offset -= frame_phase;
883       align = offset & -offset;
884       align *= BITS_PER_UNIT;
885       if (align == 0 || align > base_align)
886 	align = base_align;
887 
888       /* One would think that we could assert that we're not decreasing
889 	 alignment here, but (at least) the i386 port does exactly this
890 	 via the MINIMUM_ALIGNMENT hook.  */
891 
892       DECL_ALIGN (decl) = align;
893       DECL_USER_ALIGN (decl) = 0;
894     }
895 
896   set_mem_attributes (x, SSAVAR (decl), true);
897   set_rtl (decl, x);
898 }
899 
900 /* A subroutine of expand_used_vars.  Give each partition representative
901    a unique location within the stack frame.  Update each partition member
902    with that location.  */
903 
904 static void
905 expand_stack_vars (bool (*pred) (tree))
906 {
907   size_t si, i, j, n = stack_vars_num;
908   HOST_WIDE_INT large_size = 0, large_alloc = 0;
909   rtx large_base = NULL;
910   unsigned large_align = 0;
911   tree decl;
912 
913   /* Determine if there are any variables requiring "large" alignment.
914      Since these are dynamically allocated, we only process these if
915      no predicate involved.  */
916   large_align = stack_vars[stack_vars_sorted[0]].alignb * BITS_PER_UNIT;
917   if (pred == NULL && large_align > MAX_SUPPORTED_STACK_ALIGNMENT)
918     {
919       /* Find the total size of these variables.  */
920       for (si = 0; si < n; ++si)
921 	{
922 	  unsigned alignb;
923 
924 	  i = stack_vars_sorted[si];
925 	  alignb = stack_vars[i].alignb;
926 
927 	  /* Stop when we get to the first decl with "small" alignment.  */
928 	  if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
929 	    break;
930 
931 	  /* Skip variables that aren't partition representatives.  */
932 	  if (stack_vars[i].representative != i)
933 	    continue;
934 
935 	  /* Skip variables that have already had rtl assigned.  See also
936 	     add_stack_var where we perpetrate this pc_rtx hack.  */
937 	  decl = stack_vars[i].decl;
938 	  if ((TREE_CODE (decl) == SSA_NAME
939 	      ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)]
940 	      : DECL_RTL (decl)) != pc_rtx)
941 	    continue;
942 
943 	  large_size += alignb - 1;
944 	  large_size &= -(HOST_WIDE_INT)alignb;
945 	  large_size += stack_vars[i].size;
946 	}
947 
948       /* If there were any, allocate space.  */
949       if (large_size > 0)
950 	large_base = allocate_dynamic_stack_space (GEN_INT (large_size), 0,
951 						   large_align, true);
952     }
953 
954   for (si = 0; si < n; ++si)
955     {
956       rtx base;
957       unsigned base_align, alignb;
958       HOST_WIDE_INT offset;
959 
960       i = stack_vars_sorted[si];
961 
962       /* Skip variables that aren't partition representatives, for now.  */
963       if (stack_vars[i].representative != i)
964 	continue;
965 
966       /* Skip variables that have already had rtl assigned.  See also
967 	 add_stack_var where we perpetrate this pc_rtx hack.  */
968       decl = stack_vars[i].decl;
969       if ((TREE_CODE (decl) == SSA_NAME
970 	   ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)]
971 	   : DECL_RTL (decl)) != pc_rtx)
972 	continue;
973 
974       /* Check the predicate to see whether this variable should be
975 	 allocated in this pass.  */
976       if (pred && !pred (decl))
977 	continue;
978 
979       alignb = stack_vars[i].alignb;
980       if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
981 	{
982 	  offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
983 	  base = virtual_stack_vars_rtx;
984 	  base_align = crtl->max_used_stack_slot_alignment;
985 	}
986       else
987 	{
988 	  /* Large alignment is only processed in the last pass.  */
989 	  if (pred)
990 	    continue;
991 	  gcc_assert (large_base != NULL);
992 
993 	  large_alloc += alignb - 1;
994 	  large_alloc &= -(HOST_WIDE_INT)alignb;
995 	  offset = large_alloc;
996 	  large_alloc += stack_vars[i].size;
997 
998 	  base = large_base;
999 	  base_align = large_align;
1000 	}
1001 
1002       /* Create rtl for each variable based on their location within the
1003 	 partition.  */
1004       for (j = i; j != EOC; j = stack_vars[j].next)
1005 	{
1006 	  expand_one_stack_var_at (stack_vars[j].decl,
1007 				   base, base_align,
1008 				   offset);
1009 	}
1010     }
1011 
1012   gcc_assert (large_alloc == large_size);
1013 }
1014 
1015 /* Take into account all sizes of partitions and reset DECL_RTLs.  */
1016 static HOST_WIDE_INT
1017 account_stack_vars (void)
1018 {
1019   size_t si, j, i, n = stack_vars_num;
1020   HOST_WIDE_INT size = 0;
1021 
1022   for (si = 0; si < n; ++si)
1023     {
1024       i = stack_vars_sorted[si];
1025 
1026       /* Skip variables that aren't partition representatives, for now.  */
1027       if (stack_vars[i].representative != i)
1028 	continue;
1029 
1030       size += stack_vars[i].size;
1031       for (j = i; j != EOC; j = stack_vars[j].next)
1032 	set_rtl (stack_vars[j].decl, NULL);
1033     }
1034   return size;
1035 }
1036 
1037 /* A subroutine of expand_one_var.  Called to immediately assign rtl
1038    to a variable to be allocated in the stack frame.  */
1039 
1040 static void
1041 expand_one_stack_var (tree var)
1042 {
1043   HOST_WIDE_INT size, offset;
1044   unsigned byte_align;
1045 
1046   size = tree_low_cst (DECL_SIZE_UNIT (SSAVAR (var)), 1);
1047   byte_align = align_local_variable (SSAVAR (var));
1048 
1049   /* We handle highly aligned variables in expand_stack_vars.  */
1050   gcc_assert (byte_align * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT);
1051 
1052   offset = alloc_stack_frame_space (size, byte_align);
1053 
1054   expand_one_stack_var_at (var, virtual_stack_vars_rtx,
1055 			   crtl->max_used_stack_slot_alignment, offset);
1056 }
1057 
1058 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL
1059    that will reside in a hard register.  */
1060 
1061 static void
1062 expand_one_hard_reg_var (tree var)
1063 {
1064   rest_of_decl_compilation (var, 0, 0);
1065 }
1066 
1067 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL
1068    that will reside in a pseudo register.  */
1069 
1070 static void
1071 expand_one_register_var (tree var)
1072 {
1073   tree decl = SSAVAR (var);
1074   tree type = TREE_TYPE (decl);
1075   enum machine_mode reg_mode = promote_decl_mode (decl, NULL);
1076   rtx x = gen_reg_rtx (reg_mode);
1077 
1078   set_rtl (var, x);
1079 
1080   /* Note if the object is a user variable.  */
1081   if (!DECL_ARTIFICIAL (decl))
1082     mark_user_reg (x);
1083 
1084   if (POINTER_TYPE_P (type))
1085     mark_reg_pointer (x, get_pointer_alignment (var));
1086 }
1087 
1088 /* A subroutine of expand_one_var.  Called to assign rtl to a VAR_DECL that
1089    has some associated error, e.g. its type is error-mark.  We just need
1090    to pick something that won't crash the rest of the compiler.  */
1091 
1092 static void
1093 expand_one_error_var (tree var)
1094 {
1095   enum machine_mode mode = DECL_MODE (var);
1096   rtx x;
1097 
1098   if (mode == BLKmode)
1099     x = gen_rtx_MEM (BLKmode, const0_rtx);
1100   else if (mode == VOIDmode)
1101     x = const0_rtx;
1102   else
1103     x = gen_reg_rtx (mode);
1104 
1105   SET_DECL_RTL (var, x);
1106 }
1107 
1108 /* A subroutine of expand_one_var.  VAR is a variable that will be
1109    allocated to the local stack frame.  Return true if we wish to
1110    add VAR to STACK_VARS so that it will be coalesced with other
1111    variables.  Return false to allocate VAR immediately.
1112 
1113    This function is used to reduce the number of variables considered
1114    for coalescing, which reduces the size of the quadratic problem.  */
1115 
1116 static bool
1117 defer_stack_allocation (tree var, bool toplevel)
1118 {
1119   /* If stack protection is enabled, *all* stack variables must be deferred,
1120      so that we can re-order the strings to the top of the frame.  */
1121   if (flag_stack_protect)
1122     return true;
1123 
1124   /* We handle "large" alignment via dynamic allocation.  We want to handle
1125      this extra complication in only one place, so defer them.  */
1126   if (DECL_ALIGN (var) > MAX_SUPPORTED_STACK_ALIGNMENT)
1127     return true;
1128 
1129   /* Variables in the outermost scope automatically conflict with
1130      every other variable.  The only reason to want to defer them
1131      at all is that, after sorting, we can more efficiently pack
1132      small variables in the stack frame.  Continue to defer at -O2.  */
1133   if (toplevel && optimize < 2)
1134     return false;
1135 
1136   /* Without optimization, *most* variables are allocated from the
1137      stack, which makes the quadratic problem large exactly when we
1138      want compilation to proceed as quickly as possible.  On the
1139      other hand, we don't want the function's stack frame size to
1140      get completely out of hand.  So we avoid adding scalars and
1141      "small" aggregates to the list at all.  */
1142   if (optimize == 0 && tree_low_cst (DECL_SIZE_UNIT (var), 1) < 32)
1143     return false;
1144 
1145   return true;
1146 }
1147 
1148 /* A subroutine of expand_used_vars.  Expand one variable according to
1149    its flavor.  Variables to be placed on the stack are not actually
1150    expanded yet, merely recorded.
1151    When REALLY_EXPAND is false, only add stack values to be allocated.
1152    Return stack usage this variable is supposed to take.
1153 */
1154 
1155 static HOST_WIDE_INT
1156 expand_one_var (tree var, bool toplevel, bool really_expand)
1157 {
1158   unsigned int align = BITS_PER_UNIT;
1159   tree origvar = var;
1160 
1161   var = SSAVAR (var);
1162 
1163   if (TREE_TYPE (var) != error_mark_node && TREE_CODE (var) == VAR_DECL)
1164     {
1165       /* Because we don't know if VAR will be in register or on stack,
1166 	 we conservatively assume it will be on stack even if VAR is
1167 	 eventually put into register after RA pass.  For non-automatic
1168 	 variables, which won't be on stack, we collect alignment of
1169 	 type and ignore user specified alignment.  */
1170       if (TREE_STATIC (var) || DECL_EXTERNAL (var))
1171 	align = MINIMUM_ALIGNMENT (TREE_TYPE (var),
1172 				   TYPE_MODE (TREE_TYPE (var)),
1173 				   TYPE_ALIGN (TREE_TYPE (var)));
1174       else if (DECL_HAS_VALUE_EXPR_P (var)
1175 	       || (DECL_RTL_SET_P (var) && MEM_P (DECL_RTL (var))))
1176 	/* Don't consider debug only variables with DECL_HAS_VALUE_EXPR_P set
1177 	   or variables which were assigned a stack slot already by
1178 	   expand_one_stack_var_at - in the latter case DECL_ALIGN has been
1179 	   changed from the offset chosen to it.  */
1180 	align = crtl->stack_alignment_estimated;
1181       else
1182 	align = MINIMUM_ALIGNMENT (var, DECL_MODE (var), DECL_ALIGN (var));
1183 
1184       /* If the variable alignment is very large we'll dynamicaly allocate
1185 	 it, which means that in-frame portion is just a pointer.  */
1186       if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
1187 	align = POINTER_SIZE;
1188     }
1189 
1190   if (SUPPORTS_STACK_ALIGNMENT
1191       && crtl->stack_alignment_estimated < align)
1192     {
1193       /* stack_alignment_estimated shouldn't change after stack
1194          realign decision made */
1195       gcc_assert(!crtl->stack_realign_processed);
1196       crtl->stack_alignment_estimated = align;
1197     }
1198 
1199   /* stack_alignment_needed > PREFERRED_STACK_BOUNDARY is permitted.
1200      So here we only make sure stack_alignment_needed >= align.  */
1201   if (crtl->stack_alignment_needed < align)
1202     crtl->stack_alignment_needed = align;
1203   if (crtl->max_used_stack_slot_alignment < align)
1204     crtl->max_used_stack_slot_alignment = align;
1205 
1206   if (TREE_CODE (origvar) == SSA_NAME)
1207     {
1208       gcc_assert (TREE_CODE (var) != VAR_DECL
1209 		  || (!DECL_EXTERNAL (var)
1210 		      && !DECL_HAS_VALUE_EXPR_P (var)
1211 		      && !TREE_STATIC (var)
1212 		      && TREE_TYPE (var) != error_mark_node
1213 		      && !DECL_HARD_REGISTER (var)
1214 		      && really_expand));
1215     }
1216   if (TREE_CODE (var) != VAR_DECL && TREE_CODE (origvar) != SSA_NAME)
1217     ;
1218   else if (DECL_EXTERNAL (var))
1219     ;
1220   else if (DECL_HAS_VALUE_EXPR_P (var))
1221     ;
1222   else if (TREE_STATIC (var))
1223     ;
1224   else if (TREE_CODE (origvar) != SSA_NAME && DECL_RTL_SET_P (var))
1225     ;
1226   else if (TREE_TYPE (var) == error_mark_node)
1227     {
1228       if (really_expand)
1229         expand_one_error_var (var);
1230     }
1231   else if (TREE_CODE (var) == VAR_DECL && DECL_HARD_REGISTER (var))
1232     {
1233       if (really_expand)
1234         expand_one_hard_reg_var (var);
1235     }
1236   else if (use_register_for_decl (var))
1237     {
1238       if (really_expand)
1239         expand_one_register_var (origvar);
1240     }
1241   else if (!host_integerp (DECL_SIZE_UNIT (var), 1))
1242     {
1243       if (really_expand)
1244 	{
1245 	  error ("size of variable %q+D is too large", var);
1246 	  expand_one_error_var (var);
1247 	}
1248     }
1249   else if (defer_stack_allocation (var, toplevel))
1250     add_stack_var (origvar);
1251   else
1252     {
1253       if (really_expand)
1254         expand_one_stack_var (origvar);
1255       return tree_low_cst (DECL_SIZE_UNIT (var), 1);
1256     }
1257   return 0;
1258 }
1259 
1260 /* A subroutine of expand_used_vars.  Walk down through the BLOCK tree
1261    expanding variables.  Those variables that can be put into registers
1262    are allocated pseudos; those that can't are put on the stack.
1263 
1264    TOPLEVEL is true if this is the outermost BLOCK.  */
1265 
1266 static void
1267 expand_used_vars_for_block (tree block, bool toplevel)
1268 {
1269   tree t;
1270 
1271   /* Expand all variables at this level.  */
1272   for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t))
1273     if (TREE_USED (t)
1274         && ((TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != RESULT_DECL)
1275 	    || !DECL_NONSHAREABLE (t)))
1276       expand_one_var (t, toplevel, true);
1277 
1278   /* Expand all variables at containing levels.  */
1279   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
1280     expand_used_vars_for_block (t, false);
1281 }
1282 
1283 /* A subroutine of expand_used_vars.  Walk down through the BLOCK tree
1284    and clear TREE_USED on all local variables.  */
1285 
1286 static void
1287 clear_tree_used (tree block)
1288 {
1289   tree t;
1290 
1291   for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t))
1292     /* if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) */
1293     if ((TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != RESULT_DECL)
1294 	|| !DECL_NONSHAREABLE (t))
1295       TREE_USED (t) = 0;
1296 
1297   for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
1298     clear_tree_used (t);
1299 }
1300 
1301 /* Examine TYPE and determine a bit mask of the following features.  */
1302 
1303 #define SPCT_HAS_LARGE_CHAR_ARRAY	1
1304 #define SPCT_HAS_SMALL_CHAR_ARRAY	2
1305 #define SPCT_HAS_ARRAY			4
1306 #define SPCT_HAS_AGGREGATE		8
1307 
1308 static unsigned int
1309 stack_protect_classify_type (tree type)
1310 {
1311   unsigned int ret = 0;
1312   tree t;
1313 
1314   switch (TREE_CODE (type))
1315     {
1316     case ARRAY_TYPE:
1317       t = TYPE_MAIN_VARIANT (TREE_TYPE (type));
1318       if (t == char_type_node
1319 	  || t == signed_char_type_node
1320 	  || t == unsigned_char_type_node)
1321 	{
1322 	  unsigned HOST_WIDE_INT max = PARAM_VALUE (PARAM_SSP_BUFFER_SIZE);
1323 	  unsigned HOST_WIDE_INT len;
1324 
1325 	  if (!TYPE_SIZE_UNIT (type)
1326 	      || !host_integerp (TYPE_SIZE_UNIT (type), 1))
1327 	    len = max;
1328 	  else
1329 	    len = tree_low_cst (TYPE_SIZE_UNIT (type), 1);
1330 
1331 	  if (len < max)
1332 	    ret = SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_ARRAY;
1333 	  else
1334 	    ret = SPCT_HAS_LARGE_CHAR_ARRAY | SPCT_HAS_ARRAY;
1335 	}
1336       else
1337 	ret = SPCT_HAS_ARRAY;
1338       break;
1339 
1340     case UNION_TYPE:
1341     case QUAL_UNION_TYPE:
1342     case RECORD_TYPE:
1343       ret = SPCT_HAS_AGGREGATE;
1344       for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t))
1345 	if (TREE_CODE (t) == FIELD_DECL)
1346 	  ret |= stack_protect_classify_type (TREE_TYPE (t));
1347       break;
1348 
1349     default:
1350       break;
1351     }
1352 
1353   return ret;
1354 }
1355 
1356 /* Return nonzero if DECL should be segregated into the "vulnerable" upper
1357    part of the local stack frame.  Remember if we ever return nonzero for
1358    any variable in this function.  The return value is the phase number in
1359    which the variable should be allocated.  */
1360 
1361 static int
1362 stack_protect_decl_phase (tree decl)
1363 {
1364   unsigned int bits = stack_protect_classify_type (TREE_TYPE (decl));
1365   int ret = 0;
1366 
1367   if (bits & SPCT_HAS_SMALL_CHAR_ARRAY)
1368     has_short_buffer = true;
1369 
1370   if (flag_stack_protect == 2)
1371     {
1372       if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY))
1373 	  && !(bits & SPCT_HAS_AGGREGATE))
1374 	ret = 1;
1375       else if (bits & SPCT_HAS_ARRAY)
1376 	ret = 2;
1377     }
1378   else
1379     ret = (bits & SPCT_HAS_LARGE_CHAR_ARRAY) != 0;
1380 
1381   if (ret)
1382     has_protected_decls = true;
1383 
1384   return ret;
1385 }
1386 
1387 /* Two helper routines that check for phase 1 and phase 2.  These are used
1388    as callbacks for expand_stack_vars.  */
1389 
1390 static bool
1391 stack_protect_decl_phase_1 (tree decl)
1392 {
1393   return stack_protect_decl_phase (decl) == 1;
1394 }
1395 
1396 static bool
1397 stack_protect_decl_phase_2 (tree decl)
1398 {
1399   return stack_protect_decl_phase (decl) == 2;
1400 }
1401 
1402 /* Ensure that variables in different stack protection phases conflict
1403    so that they are not merged and share the same stack slot.  */
1404 
1405 static void
1406 add_stack_protection_conflicts (void)
1407 {
1408   size_t i, j, n = stack_vars_num;
1409   unsigned char *phase;
1410 
1411   phase = XNEWVEC (unsigned char, n);
1412   for (i = 0; i < n; ++i)
1413     phase[i] = stack_protect_decl_phase (stack_vars[i].decl);
1414 
1415   for (i = 0; i < n; ++i)
1416     {
1417       unsigned char ph_i = phase[i];
1418       for (j = 0; j < i; ++j)
1419 	if (ph_i != phase[j])
1420 	  add_stack_var_conflict (i, j);
1421     }
1422 
1423   XDELETEVEC (phase);
1424 }
1425 
1426 /* Create a decl for the guard at the top of the stack frame.  */
1427 
1428 static void
1429 create_stack_guard (void)
1430 {
1431   tree guard = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
1432 			   VAR_DECL, NULL, ptr_type_node);
1433   TREE_THIS_VOLATILE (guard) = 1;
1434   TREE_USED (guard) = 1;
1435   expand_one_stack_var (guard);
1436   crtl->stack_protect_guard = guard;
1437 }
1438 
1439 /* Prepare for expanding variables.  */
1440 static void
1441 init_vars_expansion (void)
1442 {
1443   tree t;
1444   unsigned ix;
1445   /* Set TREE_USED on all variables in the local_decls.  */
1446   FOR_EACH_LOCAL_DECL (cfun, ix, t)
1447     TREE_USED (t) = 1;
1448 
1449   /* Clear TREE_USED on all variables associated with a block scope.  */
1450   clear_tree_used (DECL_INITIAL (current_function_decl));
1451 
1452   /* Initialize local stack smashing state.  */
1453   has_protected_decls = false;
1454   has_short_buffer = false;
1455 }
1456 
1457 /* Free up stack variable graph data.  */
1458 static void
1459 fini_vars_expansion (void)
1460 {
1461   size_t i, n = stack_vars_num;
1462   for (i = 0; i < n; i++)
1463     BITMAP_FREE (stack_vars[i].conflicts);
1464   XDELETEVEC (stack_vars);
1465   XDELETEVEC (stack_vars_sorted);
1466   stack_vars = NULL;
1467   stack_vars_alloc = stack_vars_num = 0;
1468   pointer_map_destroy (decl_to_stack_part);
1469   decl_to_stack_part = NULL;
1470 }
1471 
1472 /* Make a fair guess for the size of the stack frame of the function
1473    in NODE.  This doesn't have to be exact, the result is only used in
1474    the inline heuristics.  So we don't want to run the full stack var
1475    packing algorithm (which is quadratic in the number of stack vars).
1476    Instead, we calculate the total size of all stack vars.  This turns
1477    out to be a pretty fair estimate -- packing of stack vars doesn't
1478    happen very often.  */
1479 
1480 HOST_WIDE_INT
1481 estimated_stack_frame_size (struct cgraph_node *node)
1482 {
1483   HOST_WIDE_INT size = 0;
1484   size_t i;
1485   tree var;
1486   tree old_cur_fun_decl = current_function_decl;
1487   referenced_var_iterator rvi;
1488   struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
1489 
1490   current_function_decl = node->decl;
1491   push_cfun (fn);
1492 
1493   gcc_checking_assert (gimple_referenced_vars (fn));
1494   FOR_EACH_REFERENCED_VAR (fn, var, rvi)
1495     size += expand_one_var (var, true, false);
1496 
1497   if (stack_vars_num > 0)
1498     {
1499       /* Fake sorting the stack vars for account_stack_vars ().  */
1500       stack_vars_sorted = XNEWVEC (size_t, stack_vars_num);
1501       for (i = 0; i < stack_vars_num; ++i)
1502 	stack_vars_sorted[i] = i;
1503       size += account_stack_vars ();
1504       fini_vars_expansion ();
1505     }
1506   pop_cfun ();
1507   current_function_decl = old_cur_fun_decl;
1508   return size;
1509 }
1510 
1511 /* Expand all variables used in the function.  */
1512 
1513 static void
1514 expand_used_vars (void)
1515 {
1516   tree var, outer_block = DECL_INITIAL (current_function_decl);
1517   VEC(tree,heap) *maybe_local_decls = NULL;
1518   unsigned i;
1519   unsigned len;
1520 
1521   /* Compute the phase of the stack frame for this function.  */
1522   {
1523     int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1524     int off = STARTING_FRAME_OFFSET % align;
1525     frame_phase = off ? align - off : 0;
1526   }
1527 
1528   init_vars_expansion ();
1529 
1530   for (i = 0; i < SA.map->num_partitions; i++)
1531     {
1532       tree var = partition_to_var (SA.map, i);
1533 
1534       gcc_assert (is_gimple_reg (var));
1535       if (TREE_CODE (SSA_NAME_VAR (var)) == VAR_DECL)
1536 	expand_one_var (var, true, true);
1537       else
1538 	{
1539 	  /* This is a PARM_DECL or RESULT_DECL.  For those partitions that
1540 	     contain the default def (representing the parm or result itself)
1541 	     we don't do anything here.  But those which don't contain the
1542 	     default def (representing a temporary based on the parm/result)
1543 	     we need to allocate space just like for normal VAR_DECLs.  */
1544 	  if (!bitmap_bit_p (SA.partition_has_default_def, i))
1545 	    {
1546 	      expand_one_var (var, true, true);
1547 	      gcc_assert (SA.partition_to_pseudo[i]);
1548 	    }
1549 	}
1550     }
1551 
1552   /* At this point all variables on the local_decls with TREE_USED
1553      set are not associated with any block scope.  Lay them out.  */
1554 
1555   len = VEC_length (tree, cfun->local_decls);
1556   FOR_EACH_LOCAL_DECL (cfun, i, var)
1557     {
1558       bool expand_now = false;
1559 
1560       /* Expanded above already.  */
1561       if (is_gimple_reg (var))
1562 	{
1563 	  TREE_USED (var) = 0;
1564 	  goto next;
1565 	}
1566       /* We didn't set a block for static or extern because it's hard
1567 	 to tell the difference between a global variable (re)declared
1568 	 in a local scope, and one that's really declared there to
1569 	 begin with.  And it doesn't really matter much, since we're
1570 	 not giving them stack space.  Expand them now.  */
1571       else if (TREE_STATIC (var) || DECL_EXTERNAL (var))
1572 	expand_now = true;
1573 
1574       /* If the variable is not associated with any block, then it
1575 	 was created by the optimizers, and could be live anywhere
1576 	 in the function.  */
1577       else if (TREE_USED (var))
1578 	expand_now = true;
1579 
1580       /* Finally, mark all variables on the list as used.  We'll use
1581 	 this in a moment when we expand those associated with scopes.  */
1582       TREE_USED (var) = 1;
1583 
1584       if (expand_now)
1585 	expand_one_var (var, true, true);
1586 
1587     next:
1588       if (DECL_ARTIFICIAL (var) && !DECL_IGNORED_P (var))
1589 	{
1590 	  rtx rtl = DECL_RTL_IF_SET (var);
1591 
1592 	  /* Keep artificial non-ignored vars in cfun->local_decls
1593 	     chain until instantiate_decls.  */
1594 	  if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT))
1595 	    add_local_decl (cfun, var);
1596 	  else if (rtl == NULL_RTX)
1597 	    /* If rtl isn't set yet, which can happen e.g. with
1598 	       -fstack-protector, retry before returning from this
1599 	       function.  */
1600 	    VEC_safe_push (tree, heap, maybe_local_decls, var);
1601 	}
1602     }
1603 
1604   /* We duplicated some of the decls in CFUN->LOCAL_DECLS.
1605 
1606      +-----------------+-----------------+
1607      | ...processed... | ...duplicates...|
1608      +-----------------+-----------------+
1609                        ^
1610 		       +-- LEN points here.
1611 
1612      We just want the duplicates, as those are the artificial
1613      non-ignored vars that we want to keep until instantiate_decls.
1614      Move them down and truncate the array.  */
1615   if (!VEC_empty (tree, cfun->local_decls))
1616     VEC_block_remove (tree, cfun->local_decls, 0, len);
1617 
1618   /* At this point, all variables within the block tree with TREE_USED
1619      set are actually used by the optimized function.  Lay them out.  */
1620   expand_used_vars_for_block (outer_block, true);
1621 
1622   if (stack_vars_num > 0)
1623     {
1624       add_scope_conflicts ();
1625       /* Due to the way alias sets work, no variables with non-conflicting
1626 	 alias sets may be assigned the same address.  Add conflicts to
1627 	 reflect this.  */
1628       add_alias_set_conflicts ();
1629 
1630       /* If stack protection is enabled, we don't share space between
1631 	 vulnerable data and non-vulnerable data.  */
1632       if (flag_stack_protect)
1633 	add_stack_protection_conflicts ();
1634 
1635       /* Now that we have collected all stack variables, and have computed a
1636 	 minimal interference graph, attempt to save some stack space.  */
1637       partition_stack_vars ();
1638       if (dump_file)
1639 	dump_stack_var_partition ();
1640     }
1641 
1642   /* There are several conditions under which we should create a
1643      stack guard: protect-all, alloca used, protected decls present.  */
1644   if (flag_stack_protect == 2
1645       || (flag_stack_protect
1646 	  && (cfun->calls_alloca || has_protected_decls)))
1647     create_stack_guard ();
1648 
1649   /* Assign rtl to each variable based on these partitions.  */
1650   if (stack_vars_num > 0)
1651     {
1652       /* Reorder decls to be protected by iterating over the variables
1653 	 array multiple times, and allocating out of each phase in turn.  */
1654       /* ??? We could probably integrate this into the qsort we did
1655 	 earlier, such that we naturally see these variables first,
1656 	 and thus naturally allocate things in the right order.  */
1657       if (has_protected_decls)
1658 	{
1659 	  /* Phase 1 contains only character arrays.  */
1660 	  expand_stack_vars (stack_protect_decl_phase_1);
1661 
1662 	  /* Phase 2 contains other kinds of arrays.  */
1663 	  if (flag_stack_protect == 2)
1664 	    expand_stack_vars (stack_protect_decl_phase_2);
1665 	}
1666 
1667       expand_stack_vars (NULL);
1668 
1669       fini_vars_expansion ();
1670     }
1671 
1672   /* If there were any artificial non-ignored vars without rtl
1673      found earlier, see if deferred stack allocation hasn't assigned
1674      rtl to them.  */
1675   FOR_EACH_VEC_ELT_REVERSE (tree, maybe_local_decls, i, var)
1676     {
1677       rtx rtl = DECL_RTL_IF_SET (var);
1678 
1679       /* Keep artificial non-ignored vars in cfun->local_decls
1680 	 chain until instantiate_decls.  */
1681       if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT))
1682 	add_local_decl (cfun, var);
1683     }
1684   VEC_free (tree, heap, maybe_local_decls);
1685 
1686   /* If the target requires that FRAME_OFFSET be aligned, do it.  */
1687   if (STACK_ALIGNMENT_NEEDED)
1688     {
1689       HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
1690       if (!FRAME_GROWS_DOWNWARD)
1691 	frame_offset += align - 1;
1692       frame_offset &= -align;
1693     }
1694 }
1695 
1696 
1697 /* If we need to produce a detailed dump, print the tree representation
1698    for STMT to the dump file.  SINCE is the last RTX after which the RTL
1699    generated for STMT should have been appended.  */
1700 
1701 static void
1702 maybe_dump_rtl_for_gimple_stmt (gimple stmt, rtx since)
1703 {
1704   if (dump_file && (dump_flags & TDF_DETAILS))
1705     {
1706       fprintf (dump_file, "\n;; ");
1707       print_gimple_stmt (dump_file, stmt, 0,
1708 			 TDF_SLIM | (dump_flags & TDF_LINENO));
1709       fprintf (dump_file, "\n");
1710 
1711       print_rtl (dump_file, since ? NEXT_INSN (since) : since);
1712     }
1713 }
1714 
1715 /* Maps the blocks that do not contain tree labels to rtx labels.  */
1716 
1717 static struct pointer_map_t *lab_rtx_for_bb;
1718 
1719 /* Returns the label_rtx expression for a label starting basic block BB.  */
1720 
1721 static rtx
1722 label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED)
1723 {
1724   gimple_stmt_iterator gsi;
1725   tree lab;
1726   gimple lab_stmt;
1727   void **elt;
1728 
1729   if (bb->flags & BB_RTL)
1730     return block_label (bb);
1731 
1732   elt = pointer_map_contains (lab_rtx_for_bb, bb);
1733   if (elt)
1734     return (rtx) *elt;
1735 
1736   /* Find the tree label if it is present.  */
1737 
1738   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1739     {
1740       lab_stmt = gsi_stmt (gsi);
1741       if (gimple_code (lab_stmt) != GIMPLE_LABEL)
1742 	break;
1743 
1744       lab = gimple_label_label (lab_stmt);
1745       if (DECL_NONLOCAL (lab))
1746 	break;
1747 
1748       return label_rtx (lab);
1749     }
1750 
1751   elt = pointer_map_insert (lab_rtx_for_bb, bb);
1752   *elt = gen_label_rtx ();
1753   return (rtx) *elt;
1754 }
1755 
1756 
1757 /* A subroutine of expand_gimple_cond.  Given E, a fallthrough edge
1758    of a basic block where we just expanded the conditional at the end,
1759    possibly clean up the CFG and instruction sequence.  LAST is the
1760    last instruction before the just emitted jump sequence.  */
1761 
1762 static void
1763 maybe_cleanup_end_of_block (edge e, rtx last)
1764 {
1765   /* Special case: when jumpif decides that the condition is
1766      trivial it emits an unconditional jump (and the necessary
1767      barrier).  But we still have two edges, the fallthru one is
1768      wrong.  purge_dead_edges would clean this up later.  Unfortunately
1769      we have to insert insns (and split edges) before
1770      find_many_sub_basic_blocks and hence before purge_dead_edges.
1771      But splitting edges might create new blocks which depend on the
1772      fact that if there are two edges there's no barrier.  So the
1773      barrier would get lost and verify_flow_info would ICE.  Instead
1774      of auditing all edge splitters to care for the barrier (which
1775      normally isn't there in a cleaned CFG), fix it here.  */
1776   if (BARRIER_P (get_last_insn ()))
1777     {
1778       rtx insn;
1779       remove_edge (e);
1780       /* Now, we have a single successor block, if we have insns to
1781 	 insert on the remaining edge we potentially will insert
1782 	 it at the end of this block (if the dest block isn't feasible)
1783 	 in order to avoid splitting the edge.  This insertion will take
1784 	 place in front of the last jump.  But we might have emitted
1785 	 multiple jumps (conditional and one unconditional) to the
1786 	 same destination.  Inserting in front of the last one then
1787 	 is a problem.  See PR 40021.  We fix this by deleting all
1788 	 jumps except the last unconditional one.  */
1789       insn = PREV_INSN (get_last_insn ());
1790       /* Make sure we have an unconditional jump.  Otherwise we're
1791 	 confused.  */
1792       gcc_assert (JUMP_P (insn) && !any_condjump_p (insn));
1793       for (insn = PREV_INSN (insn); insn != last;)
1794 	{
1795 	  insn = PREV_INSN (insn);
1796 	  if (JUMP_P (NEXT_INSN (insn)))
1797 	    {
1798 	      if (!any_condjump_p (NEXT_INSN (insn)))
1799 		{
1800 		  gcc_assert (BARRIER_P (NEXT_INSN (NEXT_INSN (insn))));
1801 		  delete_insn (NEXT_INSN (NEXT_INSN (insn)));
1802 		}
1803 	      delete_insn (NEXT_INSN (insn));
1804 	    }
1805 	}
1806     }
1807 }
1808 
1809 /* A subroutine of expand_gimple_basic_block.  Expand one GIMPLE_COND.
1810    Returns a new basic block if we've terminated the current basic
1811    block and created a new one.  */
1812 
1813 static basic_block
1814 expand_gimple_cond (basic_block bb, gimple stmt)
1815 {
1816   basic_block new_bb, dest;
1817   edge new_edge;
1818   edge true_edge;
1819   edge false_edge;
1820   rtx last2, last;
1821   enum tree_code code;
1822   tree op0, op1;
1823 
1824   code = gimple_cond_code (stmt);
1825   op0 = gimple_cond_lhs (stmt);
1826   op1 = gimple_cond_rhs (stmt);
1827   /* We're sometimes presented with such code:
1828        D.123_1 = x < y;
1829        if (D.123_1 != 0)
1830          ...
1831      This would expand to two comparisons which then later might
1832      be cleaned up by combine.  But some pattern matchers like if-conversion
1833      work better when there's only one compare, so make up for this
1834      here as special exception if TER would have made the same change.  */
1835   if (gimple_cond_single_var_p (stmt)
1836       && SA.values
1837       && TREE_CODE (op0) == SSA_NAME
1838       && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0)))
1839     {
1840       gimple second = SSA_NAME_DEF_STMT (op0);
1841       if (gimple_code (second) == GIMPLE_ASSIGN)
1842 	{
1843 	  enum tree_code code2 = gimple_assign_rhs_code (second);
1844 	  if (TREE_CODE_CLASS (code2) == tcc_comparison)
1845 	    {
1846 	      code = code2;
1847 	      op0 = gimple_assign_rhs1 (second);
1848 	      op1 = gimple_assign_rhs2 (second);
1849 	    }
1850 	  /* If jumps are cheap turn some more codes into
1851 	     jumpy sequences.  */
1852 	  else if (BRANCH_COST (optimize_insn_for_speed_p (), false) < 4)
1853 	    {
1854 	      if ((code2 == BIT_AND_EXPR
1855 		   && TYPE_PRECISION (TREE_TYPE (op0)) == 1
1856 		   && TREE_CODE (gimple_assign_rhs2 (second)) != INTEGER_CST)
1857 		  || code2 == TRUTH_AND_EXPR)
1858 		{
1859 		  code = TRUTH_ANDIF_EXPR;
1860 		  op0 = gimple_assign_rhs1 (second);
1861 		  op1 = gimple_assign_rhs2 (second);
1862 		}
1863 	      else if (code2 == BIT_IOR_EXPR || code2 == TRUTH_OR_EXPR)
1864 		{
1865 		  code = TRUTH_ORIF_EXPR;
1866 		  op0 = gimple_assign_rhs1 (second);
1867 		  op1 = gimple_assign_rhs2 (second);
1868 		}
1869 	    }
1870 	}
1871     }
1872 
1873   last2 = last = get_last_insn ();
1874 
1875   extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
1876   set_curr_insn_source_location (gimple_location (stmt));
1877   set_curr_insn_block (gimple_block (stmt));
1878 
1879   /* These flags have no purpose in RTL land.  */
1880   true_edge->flags &= ~EDGE_TRUE_VALUE;
1881   false_edge->flags &= ~EDGE_FALSE_VALUE;
1882 
1883   /* We can either have a pure conditional jump with one fallthru edge or
1884      two-way jump that needs to be decomposed into two basic blocks.  */
1885   if (false_edge->dest == bb->next_bb)
1886     {
1887       jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest),
1888 		true_edge->probability);
1889       maybe_dump_rtl_for_gimple_stmt (stmt, last);
1890       if (true_edge->goto_locus)
1891 	{
1892 	  set_curr_insn_source_location (true_edge->goto_locus);
1893 	  set_curr_insn_block (true_edge->goto_block);
1894 	  true_edge->goto_locus = curr_insn_locator ();
1895 	}
1896       true_edge->goto_block = NULL;
1897       false_edge->flags |= EDGE_FALLTHRU;
1898       maybe_cleanup_end_of_block (false_edge, last);
1899       return NULL;
1900     }
1901   if (true_edge->dest == bb->next_bb)
1902     {
1903       jumpifnot_1 (code, op0, op1, label_rtx_for_bb (false_edge->dest),
1904 		   false_edge->probability);
1905       maybe_dump_rtl_for_gimple_stmt (stmt, last);
1906       if (false_edge->goto_locus)
1907 	{
1908 	  set_curr_insn_source_location (false_edge->goto_locus);
1909 	  set_curr_insn_block (false_edge->goto_block);
1910 	  false_edge->goto_locus = curr_insn_locator ();
1911 	}
1912       false_edge->goto_block = NULL;
1913       true_edge->flags |= EDGE_FALLTHRU;
1914       maybe_cleanup_end_of_block (true_edge, last);
1915       return NULL;
1916     }
1917 
1918   jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest),
1919 	    true_edge->probability);
1920   last = get_last_insn ();
1921   if (false_edge->goto_locus)
1922     {
1923       set_curr_insn_source_location (false_edge->goto_locus);
1924       set_curr_insn_block (false_edge->goto_block);
1925       false_edge->goto_locus = curr_insn_locator ();
1926     }
1927   false_edge->goto_block = NULL;
1928   emit_jump (label_rtx_for_bb (false_edge->dest));
1929 
1930   BB_END (bb) = last;
1931   if (BARRIER_P (BB_END (bb)))
1932     BB_END (bb) = PREV_INSN (BB_END (bb));
1933   update_bb_for_insn (bb);
1934 
1935   new_bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
1936   dest = false_edge->dest;
1937   redirect_edge_succ (false_edge, new_bb);
1938   false_edge->flags |= EDGE_FALLTHRU;
1939   new_bb->count = false_edge->count;
1940   new_bb->frequency = EDGE_FREQUENCY (false_edge);
1941   new_edge = make_edge (new_bb, dest, 0);
1942   new_edge->probability = REG_BR_PROB_BASE;
1943   new_edge->count = new_bb->count;
1944   if (BARRIER_P (BB_END (new_bb)))
1945     BB_END (new_bb) = PREV_INSN (BB_END (new_bb));
1946   update_bb_for_insn (new_bb);
1947 
1948   maybe_dump_rtl_for_gimple_stmt (stmt, last2);
1949 
1950   if (true_edge->goto_locus)
1951     {
1952       set_curr_insn_source_location (true_edge->goto_locus);
1953       set_curr_insn_block (true_edge->goto_block);
1954       true_edge->goto_locus = curr_insn_locator ();
1955     }
1956   true_edge->goto_block = NULL;
1957 
1958   return new_bb;
1959 }
1960 
1961 /* Mark all calls that can have a transaction restart.  */
1962 
1963 static void
1964 mark_transaction_restart_calls (gimple stmt)
1965 {
1966   struct tm_restart_node dummy;
1967   void **slot;
1968 
1969   if (!cfun->gimple_df->tm_restart)
1970     return;
1971 
1972   dummy.stmt = stmt;
1973   slot = htab_find_slot (cfun->gimple_df->tm_restart, &dummy, NO_INSERT);
1974   if (slot)
1975     {
1976       struct tm_restart_node *n = (struct tm_restart_node *) *slot;
1977       tree list = n->label_or_list;
1978       rtx insn;
1979 
1980       for (insn = next_real_insn (get_last_insn ());
1981 	   !CALL_P (insn);
1982 	   insn = next_real_insn (insn))
1983 	continue;
1984 
1985       if (TREE_CODE (list) == LABEL_DECL)
1986 	add_reg_note (insn, REG_TM, label_rtx (list));
1987       else
1988 	for (; list ; list = TREE_CHAIN (list))
1989 	  add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list)));
1990     }
1991 }
1992 
1993 /* A subroutine of expand_gimple_stmt_1, expanding one GIMPLE_CALL
1994    statement STMT.  */
1995 
1996 static void
1997 expand_call_stmt (gimple stmt)
1998 {
1999   tree exp, decl, lhs;
2000   bool builtin_p;
2001   size_t i;
2002 
2003   if (gimple_call_internal_p (stmt))
2004     {
2005       expand_internal_call (stmt);
2006       return;
2007     }
2008 
2009   exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
2010 
2011   CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
2012   decl = gimple_call_fndecl (stmt);
2013   builtin_p = decl && DECL_BUILT_IN (decl);
2014 
2015   /* If this is not a builtin function, the function type through which the
2016      call is made may be different from the type of the function.  */
2017   if (!builtin_p)
2018     CALL_EXPR_FN (exp)
2019       = fold_convert (build_pointer_type (gimple_call_fntype (stmt)),
2020 		      CALL_EXPR_FN (exp));
2021 
2022   TREE_TYPE (exp) = gimple_call_return_type (stmt);
2023   CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt);
2024 
2025   for (i = 0; i < gimple_call_num_args (stmt); i++)
2026     {
2027       tree arg = gimple_call_arg (stmt, i);
2028       gimple def;
2029       /* TER addresses into arguments of builtin functions so we have a
2030 	 chance to infer more correct alignment information.  See PR39954.  */
2031       if (builtin_p
2032 	  && TREE_CODE (arg) == SSA_NAME
2033 	  && (def = get_gimple_for_ssa_name (arg))
2034 	  && gimple_assign_rhs_code (def) == ADDR_EXPR)
2035 	arg = gimple_assign_rhs1 (def);
2036       CALL_EXPR_ARG (exp, i) = arg;
2037     }
2038 
2039   if (gimple_has_side_effects (stmt))
2040     TREE_SIDE_EFFECTS (exp) = 1;
2041 
2042   if (gimple_call_nothrow_p (stmt))
2043     TREE_NOTHROW (exp) = 1;
2044 
2045   CALL_EXPR_TAILCALL (exp) = gimple_call_tail_p (stmt);
2046   CALL_EXPR_RETURN_SLOT_OPT (exp) = gimple_call_return_slot_opt_p (stmt);
2047   if (decl
2048       && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
2049       && (DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA
2050 	  || DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA_WITH_ALIGN))
2051     CALL_ALLOCA_FOR_VAR_P (exp) = gimple_call_alloca_for_var_p (stmt);
2052   else
2053     CALL_FROM_THUNK_P (exp) = gimple_call_from_thunk_p (stmt);
2054   CALL_EXPR_VA_ARG_PACK (exp) = gimple_call_va_arg_pack_p (stmt);
2055   SET_EXPR_LOCATION (exp, gimple_location (stmt));
2056   TREE_BLOCK (exp) = gimple_block (stmt);
2057 
2058   /* Ensure RTL is created for debug args.  */
2059   if (decl && DECL_HAS_DEBUG_ARGS_P (decl))
2060     {
2061       VEC(tree, gc) **debug_args = decl_debug_args_lookup (decl);
2062       unsigned int ix;
2063       tree dtemp;
2064 
2065       if (debug_args)
2066 	for (ix = 1; VEC_iterate (tree, *debug_args, ix, dtemp); ix += 2)
2067 	  {
2068 	    gcc_assert (TREE_CODE (dtemp) == DEBUG_EXPR_DECL);
2069 	    expand_debug_expr (dtemp);
2070 	  }
2071     }
2072 
2073   lhs = gimple_call_lhs (stmt);
2074   if (lhs)
2075     expand_assignment (lhs, exp, false);
2076   else
2077     expand_expr_real_1 (exp, const0_rtx, VOIDmode, EXPAND_NORMAL, NULL);
2078 
2079   mark_transaction_restart_calls (stmt);
2080 }
2081 
2082 /* A subroutine of expand_gimple_stmt, expanding one gimple statement
2083    STMT that doesn't require special handling for outgoing edges.  That
2084    is no tailcalls and no GIMPLE_COND.  */
2085 
2086 static void
2087 expand_gimple_stmt_1 (gimple stmt)
2088 {
2089   tree op0;
2090 
2091   set_curr_insn_source_location (gimple_location (stmt));
2092   set_curr_insn_block (gimple_block (stmt));
2093 
2094   switch (gimple_code (stmt))
2095     {
2096     case GIMPLE_GOTO:
2097       op0 = gimple_goto_dest (stmt);
2098       if (TREE_CODE (op0) == LABEL_DECL)
2099 	expand_goto (op0);
2100       else
2101 	expand_computed_goto (op0);
2102       break;
2103     case GIMPLE_LABEL:
2104       expand_label (gimple_label_label (stmt));
2105       break;
2106     case GIMPLE_NOP:
2107     case GIMPLE_PREDICT:
2108       break;
2109     case GIMPLE_SWITCH:
2110       expand_case (stmt);
2111       break;
2112     case GIMPLE_ASM:
2113       expand_asm_stmt (stmt);
2114       break;
2115     case GIMPLE_CALL:
2116       expand_call_stmt (stmt);
2117       break;
2118 
2119     case GIMPLE_RETURN:
2120       op0 = gimple_return_retval (stmt);
2121 
2122       if (op0 && op0 != error_mark_node)
2123 	{
2124 	  tree result = DECL_RESULT (current_function_decl);
2125 
2126 	  /* If we are not returning the current function's RESULT_DECL,
2127 	     build an assignment to it.  */
2128 	  if (op0 != result)
2129 	    {
2130 	      /* I believe that a function's RESULT_DECL is unique.  */
2131 	      gcc_assert (TREE_CODE (op0) != RESULT_DECL);
2132 
2133 	      /* ??? We'd like to use simply expand_assignment here,
2134 	         but this fails if the value is of BLKmode but the return
2135 		 decl is a register.  expand_return has special handling
2136 		 for this combination, which eventually should move
2137 		 to common code.  See comments there.  Until then, let's
2138 		 build a modify expression :-/  */
2139 	      op0 = build2 (MODIFY_EXPR, TREE_TYPE (result),
2140 			    result, op0);
2141 	    }
2142 	}
2143       if (!op0)
2144 	expand_null_return ();
2145       else
2146 	expand_return (op0);
2147       break;
2148 
2149     case GIMPLE_ASSIGN:
2150       {
2151 	tree lhs = gimple_assign_lhs (stmt);
2152 
2153 	/* Tree expand used to fiddle with |= and &= of two bitfield
2154 	   COMPONENT_REFs here.  This can't happen with gimple, the LHS
2155 	   of binary assigns must be a gimple reg.  */
2156 
2157 	if (TREE_CODE (lhs) != SSA_NAME
2158 	    || get_gimple_rhs_class (gimple_expr_code (stmt))
2159 	       == GIMPLE_SINGLE_RHS)
2160 	  {
2161 	    tree rhs = gimple_assign_rhs1 (stmt);
2162 	    gcc_assert (get_gimple_rhs_class (gimple_expr_code (stmt))
2163 			== GIMPLE_SINGLE_RHS);
2164 	    if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs))
2165 	      SET_EXPR_LOCATION (rhs, gimple_location (stmt));
2166 	    if (TREE_CLOBBER_P (rhs))
2167 	      /* This is a clobber to mark the going out of scope for
2168 		 this LHS.  */
2169 	      ;
2170 	    else
2171 	      expand_assignment (lhs, rhs,
2172 				 gimple_assign_nontemporal_move_p (stmt));
2173 	  }
2174 	else
2175 	  {
2176 	    rtx target, temp;
2177 	    bool nontemporal = gimple_assign_nontemporal_move_p (stmt);
2178 	    struct separate_ops ops;
2179 	    bool promoted = false;
2180 
2181 	    target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
2182 	    if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
2183 	      promoted = true;
2184 
2185 	    ops.code = gimple_assign_rhs_code (stmt);
2186 	    ops.type = TREE_TYPE (lhs);
2187 	    switch (get_gimple_rhs_class (gimple_expr_code (stmt)))
2188 	      {
2189 		case GIMPLE_TERNARY_RHS:
2190 		  ops.op2 = gimple_assign_rhs3 (stmt);
2191 		  /* Fallthru */
2192 		case GIMPLE_BINARY_RHS:
2193 		  ops.op1 = gimple_assign_rhs2 (stmt);
2194 		  /* Fallthru */
2195 		case GIMPLE_UNARY_RHS:
2196 		  ops.op0 = gimple_assign_rhs1 (stmt);
2197 		  break;
2198 		default:
2199 		  gcc_unreachable ();
2200 	      }
2201 	    ops.location = gimple_location (stmt);
2202 
2203 	    /* If we want to use a nontemporal store, force the value to
2204 	       register first.  If we store into a promoted register,
2205 	       don't directly expand to target.  */
2206 	    temp = nontemporal || promoted ? NULL_RTX : target;
2207 	    temp = expand_expr_real_2 (&ops, temp, GET_MODE (target),
2208 				       EXPAND_NORMAL);
2209 
2210 	    if (temp == target)
2211 	      ;
2212 	    else if (promoted)
2213 	      {
2214 		int unsignedp = SUBREG_PROMOTED_UNSIGNED_P (target);
2215 		/* If TEMP is a VOIDmode constant, use convert_modes to make
2216 		   sure that we properly convert it.  */
2217 		if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
2218 		  {
2219 		    temp = convert_modes (GET_MODE (target),
2220 					  TYPE_MODE (ops.type),
2221 					  temp, unsignedp);
2222 		    temp = convert_modes (GET_MODE (SUBREG_REG (target)),
2223 					  GET_MODE (target), temp, unsignedp);
2224 		  }
2225 
2226 		convert_move (SUBREG_REG (target), temp, unsignedp);
2227 	      }
2228 	    else if (nontemporal && emit_storent_insn (target, temp))
2229 	      ;
2230 	    else
2231 	      {
2232 		temp = force_operand (temp, target);
2233 		if (temp != target)
2234 		  emit_move_insn (target, temp);
2235 	      }
2236 	  }
2237       }
2238       break;
2239 
2240     default:
2241       gcc_unreachable ();
2242     }
2243 }
2244 
2245 /* Expand one gimple statement STMT and return the last RTL instruction
2246    before any of the newly generated ones.
2247 
2248    In addition to generating the necessary RTL instructions this also
2249    sets REG_EH_REGION notes if necessary and sets the current source
2250    location for diagnostics.  */
2251 
2252 static rtx
2253 expand_gimple_stmt (gimple stmt)
2254 {
2255   location_t saved_location = input_location;
2256   rtx last = get_last_insn ();
2257   int lp_nr;
2258 
2259   gcc_assert (cfun);
2260 
2261   /* We need to save and restore the current source location so that errors
2262      discovered during expansion are emitted with the right location.  But
2263      it would be better if the diagnostic routines used the source location
2264      embedded in the tree nodes rather than globals.  */
2265   if (gimple_has_location (stmt))
2266     input_location = gimple_location (stmt);
2267 
2268   expand_gimple_stmt_1 (stmt);
2269 
2270   /* Free any temporaries used to evaluate this statement.  */
2271   free_temp_slots ();
2272 
2273   input_location = saved_location;
2274 
2275   /* Mark all insns that may trap.  */
2276   lp_nr = lookup_stmt_eh_lp (stmt);
2277   if (lp_nr)
2278     {
2279       rtx insn;
2280       for (insn = next_real_insn (last); insn;
2281 	   insn = next_real_insn (insn))
2282 	{
2283 	  if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
2284 	      /* If we want exceptions for non-call insns, any
2285 		 may_trap_p instruction may throw.  */
2286 	      && GET_CODE (PATTERN (insn)) != CLOBBER
2287 	      && GET_CODE (PATTERN (insn)) != USE
2288 	      && insn_could_throw_p (insn))
2289 	    make_reg_eh_region_note (insn, 0, lp_nr);
2290 	}
2291     }
2292 
2293   return last;
2294 }
2295 
2296 /* A subroutine of expand_gimple_basic_block.  Expand one GIMPLE_CALL
2297    that has CALL_EXPR_TAILCALL set.  Returns non-null if we actually
2298    generated a tail call (something that might be denied by the ABI
2299    rules governing the call; see calls.c).
2300 
2301    Sets CAN_FALLTHRU if we generated a *conditional* tail call, and
2302    can still reach the rest of BB.  The case here is __builtin_sqrt,
2303    where the NaN result goes through the external function (with a
2304    tailcall) and the normal result happens via a sqrt instruction.  */
2305 
2306 static basic_block
2307 expand_gimple_tailcall (basic_block bb, gimple stmt, bool *can_fallthru)
2308 {
2309   rtx last2, last;
2310   edge e;
2311   edge_iterator ei;
2312   int probability;
2313   gcov_type count;
2314 
2315   last2 = last = expand_gimple_stmt (stmt);
2316 
2317   for (last = NEXT_INSN (last); last; last = NEXT_INSN (last))
2318     if (CALL_P (last) && SIBLING_CALL_P (last))
2319       goto found;
2320 
2321   maybe_dump_rtl_for_gimple_stmt (stmt, last2);
2322 
2323   *can_fallthru = true;
2324   return NULL;
2325 
2326  found:
2327   /* ??? Wouldn't it be better to just reset any pending stack adjust?
2328      Any instructions emitted here are about to be deleted.  */
2329   do_pending_stack_adjust ();
2330 
2331   /* Remove any non-eh, non-abnormal edges that don't go to exit.  */
2332   /* ??? I.e. the fallthrough edge.  HOWEVER!  If there were to be
2333      EH or abnormal edges, we shouldn't have created a tail call in
2334      the first place.  So it seems to me we should just be removing
2335      all edges here, or redirecting the existing fallthru edge to
2336      the exit block.  */
2337 
2338   probability = 0;
2339   count = 0;
2340 
2341   for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
2342     {
2343       if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
2344 	{
2345 	  if (e->dest != EXIT_BLOCK_PTR)
2346 	    {
2347 	      e->dest->count -= e->count;
2348 	      e->dest->frequency -= EDGE_FREQUENCY (e);
2349 	      if (e->dest->count < 0)
2350 		e->dest->count = 0;
2351 	      if (e->dest->frequency < 0)
2352 		e->dest->frequency = 0;
2353 	    }
2354 	  count += e->count;
2355 	  probability += e->probability;
2356 	  remove_edge (e);
2357 	}
2358       else
2359 	ei_next (&ei);
2360     }
2361 
2362   /* This is somewhat ugly: the call_expr expander often emits instructions
2363      after the sibcall (to perform the function return).  These confuse the
2364      find_many_sub_basic_blocks code, so we need to get rid of these.  */
2365   last = NEXT_INSN (last);
2366   gcc_assert (BARRIER_P (last));
2367 
2368   *can_fallthru = false;
2369   while (NEXT_INSN (last))
2370     {
2371       /* For instance an sqrt builtin expander expands if with
2372 	 sibcall in the then and label for `else`.  */
2373       if (LABEL_P (NEXT_INSN (last)))
2374 	{
2375 	  *can_fallthru = true;
2376 	  break;
2377 	}
2378       delete_insn (NEXT_INSN (last));
2379     }
2380 
2381   e = make_edge (bb, EXIT_BLOCK_PTR, EDGE_ABNORMAL | EDGE_SIBCALL);
2382   e->probability += probability;
2383   e->count += count;
2384   BB_END (bb) = last;
2385   update_bb_for_insn (bb);
2386 
2387   if (NEXT_INSN (last))
2388     {
2389       bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
2390 
2391       last = BB_END (bb);
2392       if (BARRIER_P (last))
2393 	BB_END (bb) = PREV_INSN (last);
2394     }
2395 
2396   maybe_dump_rtl_for_gimple_stmt (stmt, last2);
2397 
2398   return bb;
2399 }
2400 
2401 /* Return the difference between the floor and the truncated result of
2402    a signed division by OP1 with remainder MOD.  */
2403 static rtx
2404 floor_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1)
2405 {
2406   /* (mod != 0 ? (op1 / mod < 0 ? -1 : 0) : 0) */
2407   return gen_rtx_IF_THEN_ELSE
2408     (mode, gen_rtx_NE (BImode, mod, const0_rtx),
2409      gen_rtx_IF_THEN_ELSE
2410      (mode, gen_rtx_LT (BImode,
2411 			gen_rtx_DIV (mode, op1, mod),
2412 			const0_rtx),
2413       constm1_rtx, const0_rtx),
2414      const0_rtx);
2415 }
2416 
2417 /* Return the difference between the ceil and the truncated result of
2418    a signed division by OP1 with remainder MOD.  */
2419 static rtx
2420 ceil_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1)
2421 {
2422   /* (mod != 0 ? (op1 / mod > 0 ? 1 : 0) : 0) */
2423   return gen_rtx_IF_THEN_ELSE
2424     (mode, gen_rtx_NE (BImode, mod, const0_rtx),
2425      gen_rtx_IF_THEN_ELSE
2426      (mode, gen_rtx_GT (BImode,
2427 			gen_rtx_DIV (mode, op1, mod),
2428 			const0_rtx),
2429       const1_rtx, const0_rtx),
2430      const0_rtx);
2431 }
2432 
2433 /* Return the difference between the ceil and the truncated result of
2434    an unsigned division by OP1 with remainder MOD.  */
2435 static rtx
2436 ceil_udiv_adjust (enum machine_mode mode, rtx mod, rtx op1 ATTRIBUTE_UNUSED)
2437 {
2438   /* (mod != 0 ? 1 : 0) */
2439   return gen_rtx_IF_THEN_ELSE
2440     (mode, gen_rtx_NE (BImode, mod, const0_rtx),
2441      const1_rtx, const0_rtx);
2442 }
2443 
2444 /* Return the difference between the rounded and the truncated result
2445    of a signed division by OP1 with remainder MOD.  Halfway cases are
2446    rounded away from zero, rather than to the nearest even number.  */
2447 static rtx
2448 round_sdiv_adjust (enum machine_mode mode, rtx mod, rtx op1)
2449 {
2450   /* (abs (mod) >= abs (op1) - abs (mod)
2451       ? (op1 / mod > 0 ? 1 : -1)
2452       : 0) */
2453   return gen_rtx_IF_THEN_ELSE
2454     (mode, gen_rtx_GE (BImode, gen_rtx_ABS (mode, mod),
2455 		       gen_rtx_MINUS (mode,
2456 				      gen_rtx_ABS (mode, op1),
2457 				      gen_rtx_ABS (mode, mod))),
2458      gen_rtx_IF_THEN_ELSE
2459      (mode, gen_rtx_GT (BImode,
2460 			gen_rtx_DIV (mode, op1, mod),
2461 			const0_rtx),
2462       const1_rtx, constm1_rtx),
2463      const0_rtx);
2464 }
2465 
2466 /* Return the difference between the rounded and the truncated result
2467    of a unsigned division by OP1 with remainder MOD.  Halfway cases
2468    are rounded away from zero, rather than to the nearest even
2469    number.  */
2470 static rtx
2471 round_udiv_adjust (enum machine_mode mode, rtx mod, rtx op1)
2472 {
2473   /* (mod >= op1 - mod ? 1 : 0) */
2474   return gen_rtx_IF_THEN_ELSE
2475     (mode, gen_rtx_GE (BImode, mod,
2476 		       gen_rtx_MINUS (mode, op1, mod)),
2477      const1_rtx, const0_rtx);
2478 }
2479 
2480 /* Convert X to MODE, that must be Pmode or ptr_mode, without emitting
2481    any rtl.  */
2482 
2483 static rtx
2484 convert_debug_memory_address (enum machine_mode mode, rtx x,
2485 			      addr_space_t as)
2486 {
2487   enum machine_mode xmode = GET_MODE (x);
2488 
2489 #ifndef POINTERS_EXTEND_UNSIGNED
2490   gcc_assert (mode == Pmode
2491 	      || mode == targetm.addr_space.address_mode (as));
2492   gcc_assert (xmode == mode || xmode == VOIDmode);
2493 #else
2494   rtx temp;
2495 
2496   gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as));
2497 
2498   if (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode)
2499     return x;
2500 
2501   if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode))
2502     x = simplify_gen_subreg (mode, x, xmode,
2503 			     subreg_lowpart_offset
2504 			     (mode, xmode));
2505   else if (POINTERS_EXTEND_UNSIGNED > 0)
2506     x = gen_rtx_ZERO_EXTEND (mode, x);
2507   else if (!POINTERS_EXTEND_UNSIGNED)
2508     x = gen_rtx_SIGN_EXTEND (mode, x);
2509   else
2510     {
2511       switch (GET_CODE (x))
2512 	{
2513 	case SUBREG:
2514 	  if ((SUBREG_PROMOTED_VAR_P (x)
2515 	       || (REG_P (SUBREG_REG (x)) && REG_POINTER (SUBREG_REG (x)))
2516 	       || (GET_CODE (SUBREG_REG (x)) == PLUS
2517 		   && REG_P (XEXP (SUBREG_REG (x), 0))
2518 		   && REG_POINTER (XEXP (SUBREG_REG (x), 0))
2519 		   && CONST_INT_P (XEXP (SUBREG_REG (x), 1))))
2520 	      && GET_MODE (SUBREG_REG (x)) == mode)
2521 	    return SUBREG_REG (x);
2522 	  break;
2523 	case LABEL_REF:
2524 	  temp = gen_rtx_LABEL_REF (mode, XEXP (x, 0));
2525 	  LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
2526 	  return temp;
2527 	case SYMBOL_REF:
2528 	  temp = shallow_copy_rtx (x);
2529 	  PUT_MODE (temp, mode);
2530 	  return temp;
2531 	case CONST:
2532 	  temp = convert_debug_memory_address (mode, XEXP (x, 0), as);
2533 	  if (temp)
2534 	    temp = gen_rtx_CONST (mode, temp);
2535 	  return temp;
2536 	case PLUS:
2537 	case MINUS:
2538 	  if (CONST_INT_P (XEXP (x, 1)))
2539 	    {
2540 	      temp = convert_debug_memory_address (mode, XEXP (x, 0), as);
2541 	      if (temp)
2542 		return gen_rtx_fmt_ee (GET_CODE (x), mode, temp, XEXP (x, 1));
2543 	    }
2544 	  break;
2545 	default:
2546 	  break;
2547 	}
2548       /* Don't know how to express ptr_extend as operation in debug info.  */
2549       return NULL;
2550     }
2551 #endif /* POINTERS_EXTEND_UNSIGNED */
2552 
2553   return x;
2554 }
2555 
2556 /* Return an RTX equivalent to the value of the parameter DECL.  */
2557 
2558 static rtx
2559 expand_debug_parm_decl (tree decl)
2560 {
2561   rtx incoming = DECL_INCOMING_RTL (decl);
2562 
2563   if (incoming
2564       && GET_MODE (incoming) != BLKmode
2565       && ((REG_P (incoming) && HARD_REGISTER_P (incoming))
2566 	  || (MEM_P (incoming)
2567 	      && REG_P (XEXP (incoming, 0))
2568 	      && HARD_REGISTER_P (XEXP (incoming, 0)))))
2569     {
2570       rtx rtl = gen_rtx_ENTRY_VALUE (GET_MODE (incoming));
2571 
2572 #ifdef HAVE_window_save
2573       /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers.
2574 	 If the target machine has an explicit window save instruction, the
2575 	 actual entry value is the corresponding OUTGOING_REGNO instead.  */
2576       if (REG_P (incoming)
2577 	  && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
2578 	incoming
2579 	  = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
2580 				OUTGOING_REGNO (REGNO (incoming)), 0);
2581       else if (MEM_P (incoming))
2582 	{
2583 	  rtx reg = XEXP (incoming, 0);
2584 	  if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg))
2585 	    {
2586 	      reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
2587 	      incoming = replace_equiv_address_nv (incoming, reg);
2588 	    }
2589 	}
2590 #endif
2591 
2592       ENTRY_VALUE_EXP (rtl) = incoming;
2593       return rtl;
2594     }
2595 
2596   if (incoming
2597       && GET_MODE (incoming) != BLKmode
2598       && !TREE_ADDRESSABLE (decl)
2599       && MEM_P (incoming)
2600       && (XEXP (incoming, 0) == virtual_incoming_args_rtx
2601 	  || (GET_CODE (XEXP (incoming, 0)) == PLUS
2602 	      && XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx
2603 	      && CONST_INT_P (XEXP (XEXP (incoming, 0), 1)))))
2604     return incoming;
2605 
2606   return NULL_RTX;
2607 }
2608 
2609 /* Return an RTX equivalent to the value of the tree expression EXP.  */
2610 
2611 static rtx
2612 expand_debug_expr (tree exp)
2613 {
2614   rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX;
2615   enum machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
2616   enum machine_mode inner_mode = VOIDmode;
2617   int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
2618   addr_space_t as;
2619 
2620   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
2621     {
2622     case tcc_expression:
2623       switch (TREE_CODE (exp))
2624 	{
2625 	case COND_EXPR:
2626 	case DOT_PROD_EXPR:
2627 	case WIDEN_MULT_PLUS_EXPR:
2628 	case WIDEN_MULT_MINUS_EXPR:
2629 	case FMA_EXPR:
2630 	  goto ternary;
2631 
2632 	case TRUTH_ANDIF_EXPR:
2633 	case TRUTH_ORIF_EXPR:
2634 	case TRUTH_AND_EXPR:
2635 	case TRUTH_OR_EXPR:
2636 	case TRUTH_XOR_EXPR:
2637 	  goto binary;
2638 
2639 	case TRUTH_NOT_EXPR:
2640 	  goto unary;
2641 
2642 	default:
2643 	  break;
2644 	}
2645       break;
2646 
2647     ternary:
2648       op2 = expand_debug_expr (TREE_OPERAND (exp, 2));
2649       if (!op2)
2650 	return NULL_RTX;
2651       /* Fall through.  */
2652 
2653     binary:
2654     case tcc_binary:
2655     case tcc_comparison:
2656       op1 = expand_debug_expr (TREE_OPERAND (exp, 1));
2657       if (!op1)
2658 	return NULL_RTX;
2659       /* Fall through.  */
2660 
2661     unary:
2662     case tcc_unary:
2663       inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
2664       op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
2665       if (!op0)
2666 	return NULL_RTX;
2667       break;
2668 
2669     case tcc_type:
2670     case tcc_statement:
2671       gcc_unreachable ();
2672 
2673     case tcc_constant:
2674     case tcc_exceptional:
2675     case tcc_declaration:
2676     case tcc_reference:
2677     case tcc_vl_exp:
2678       break;
2679     }
2680 
2681   switch (TREE_CODE (exp))
2682     {
2683     case STRING_CST:
2684       if (!lookup_constant_def (exp))
2685 	{
2686 	  if (strlen (TREE_STRING_POINTER (exp)) + 1
2687 	      != (size_t) TREE_STRING_LENGTH (exp))
2688 	    return NULL_RTX;
2689 	  op0 = gen_rtx_CONST_STRING (Pmode, TREE_STRING_POINTER (exp));
2690 	  op0 = gen_rtx_MEM (BLKmode, op0);
2691 	  set_mem_attributes (op0, exp, 0);
2692 	  return op0;
2693 	}
2694       /* Fall through...  */
2695 
2696     case INTEGER_CST:
2697     case REAL_CST:
2698     case FIXED_CST:
2699       op0 = expand_expr (exp, NULL_RTX, mode, EXPAND_INITIALIZER);
2700       return op0;
2701 
2702     case COMPLEX_CST:
2703       gcc_assert (COMPLEX_MODE_P (mode));
2704       op0 = expand_debug_expr (TREE_REALPART (exp));
2705       op1 = expand_debug_expr (TREE_IMAGPART (exp));
2706       return gen_rtx_CONCAT (mode, op0, op1);
2707 
2708     case DEBUG_EXPR_DECL:
2709       op0 = DECL_RTL_IF_SET (exp);
2710 
2711       if (op0)
2712 	return op0;
2713 
2714       op0 = gen_rtx_DEBUG_EXPR (mode);
2715       DEBUG_EXPR_TREE_DECL (op0) = exp;
2716       SET_DECL_RTL (exp, op0);
2717 
2718       return op0;
2719 
2720     case VAR_DECL:
2721     case PARM_DECL:
2722     case FUNCTION_DECL:
2723     case LABEL_DECL:
2724     case CONST_DECL:
2725     case RESULT_DECL:
2726       op0 = DECL_RTL_IF_SET (exp);
2727 
2728       /* This decl was probably optimized away.  */
2729       if (!op0)
2730 	{
2731 	  if (TREE_CODE (exp) != VAR_DECL
2732 	      || DECL_EXTERNAL (exp)
2733 	      || !TREE_STATIC (exp)
2734 	      || !DECL_NAME (exp)
2735 	      || DECL_HARD_REGISTER (exp)
2736 	      || DECL_IN_CONSTANT_POOL (exp)
2737 	      || mode == VOIDmode)
2738 	    return NULL;
2739 
2740 	  op0 = make_decl_rtl_for_debug (exp);
2741 	  if (!MEM_P (op0)
2742 	      || GET_CODE (XEXP (op0, 0)) != SYMBOL_REF
2743 	      || SYMBOL_REF_DECL (XEXP (op0, 0)) != exp)
2744 	    return NULL;
2745 	}
2746       else
2747 	op0 = copy_rtx (op0);
2748 
2749       if (GET_MODE (op0) == BLKmode
2750 	  /* If op0 is not BLKmode, but BLKmode is, adjust_mode
2751 	     below would ICE.  While it is likely a FE bug,
2752 	     try to be robust here.  See PR43166.  */
2753 	  || mode == BLKmode
2754 	  || (mode == VOIDmode && GET_MODE (op0) != VOIDmode))
2755 	{
2756 	  gcc_assert (MEM_P (op0));
2757 	  op0 = adjust_address_nv (op0, mode, 0);
2758 	  return op0;
2759 	}
2760 
2761       /* Fall through.  */
2762 
2763     adjust_mode:
2764     case PAREN_EXPR:
2765     case NOP_EXPR:
2766     case CONVERT_EXPR:
2767       {
2768 	inner_mode = GET_MODE (op0);
2769 
2770 	if (mode == inner_mode)
2771 	  return op0;
2772 
2773 	if (inner_mode == VOIDmode)
2774 	  {
2775 	    if (TREE_CODE (exp) == SSA_NAME)
2776 	      inner_mode = TYPE_MODE (TREE_TYPE (exp));
2777 	    else
2778 	      inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
2779 	    if (mode == inner_mode)
2780 	      return op0;
2781 	  }
2782 
2783 	if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode))
2784 	  {
2785 	    if (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (inner_mode))
2786 	      op0 = simplify_gen_subreg (mode, op0, inner_mode, 0);
2787 	    else if (GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (inner_mode))
2788 	      op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode);
2789 	    else
2790 	      op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode);
2791 	  }
2792 	else if (FLOAT_MODE_P (mode))
2793 	  {
2794 	    gcc_assert (TREE_CODE (exp) != SSA_NAME);
2795 	    if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
2796 	      op0 = simplify_gen_unary (UNSIGNED_FLOAT, mode, op0, inner_mode);
2797 	    else
2798 	      op0 = simplify_gen_unary (FLOAT, mode, op0, inner_mode);
2799 	  }
2800 	else if (FLOAT_MODE_P (inner_mode))
2801 	  {
2802 	    if (unsignedp)
2803 	      op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode);
2804 	    else
2805 	      op0 = simplify_gen_unary (FIX, mode, op0, inner_mode);
2806 	  }
2807 	else if (CONSTANT_P (op0)
2808 		 || GET_MODE_PRECISION (mode) <= GET_MODE_PRECISION (inner_mode))
2809 	  op0 = simplify_gen_subreg (mode, op0, inner_mode,
2810 				     subreg_lowpart_offset (mode,
2811 							    inner_mode));
2812 	else if (TREE_CODE_CLASS (TREE_CODE (exp)) == tcc_unary
2813 		 ? TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))
2814 		 : unsignedp)
2815 	  op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
2816 	else
2817 	  op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
2818 
2819 	return op0;
2820       }
2821 
2822     case MEM_REF:
2823       if (!is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0)))
2824 	{
2825 	  tree newexp = fold_binary (MEM_REF, TREE_TYPE (exp),
2826 				     TREE_OPERAND (exp, 0),
2827 				     TREE_OPERAND (exp, 1));
2828 	  if (newexp)
2829 	    return expand_debug_expr (newexp);
2830 	}
2831       /* FALLTHROUGH */
2832     case INDIRECT_REF:
2833       op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
2834       if (!op0)
2835 	return NULL;
2836 
2837       if (TREE_CODE (exp) == MEM_REF)
2838 	{
2839 	  if (GET_CODE (op0) == DEBUG_IMPLICIT_PTR
2840 	      || (GET_CODE (op0) == PLUS
2841 		  && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR))
2842 	    /* (mem (debug_implicit_ptr)) might confuse aliasing.
2843 	       Instead just use get_inner_reference.  */
2844 	    goto component_ref;
2845 
2846 	  op1 = expand_debug_expr (TREE_OPERAND (exp, 1));
2847 	  if (!op1 || !CONST_INT_P (op1))
2848 	    return NULL;
2849 
2850 	  op0 = plus_constant (op0, INTVAL (op1));
2851 	}
2852 
2853       if (POINTER_TYPE_P (TREE_TYPE (exp)))
2854 	as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
2855       else
2856 	as = ADDR_SPACE_GENERIC;
2857 
2858       op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as),
2859 					  op0, as);
2860       if (op0 == NULL_RTX)
2861 	return NULL;
2862 
2863       op0 = gen_rtx_MEM (mode, op0);
2864       set_mem_attributes (op0, exp, 0);
2865       if (TREE_CODE (exp) == MEM_REF
2866 	  && !is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0)))
2867 	set_mem_expr (op0, NULL_TREE);
2868       set_mem_addr_space (op0, as);
2869 
2870       return op0;
2871 
2872     case TARGET_MEM_REF:
2873       if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
2874 	  && !DECL_RTL_SET_P (TREE_OPERAND (TMR_BASE (exp), 0)))
2875 	return NULL;
2876 
2877       op0 = expand_debug_expr
2878 	    (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), exp));
2879       if (!op0)
2880 	return NULL;
2881 
2882       if (POINTER_TYPE_P (TREE_TYPE (exp)))
2883 	as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
2884       else
2885 	as = ADDR_SPACE_GENERIC;
2886 
2887       op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as),
2888 					  op0, as);
2889       if (op0 == NULL_RTX)
2890 	return NULL;
2891 
2892       op0 = gen_rtx_MEM (mode, op0);
2893 
2894       set_mem_attributes (op0, exp, 0);
2895       set_mem_addr_space (op0, as);
2896 
2897       return op0;
2898 
2899     component_ref:
2900     case ARRAY_REF:
2901     case ARRAY_RANGE_REF:
2902     case COMPONENT_REF:
2903     case BIT_FIELD_REF:
2904     case REALPART_EXPR:
2905     case IMAGPART_EXPR:
2906     case VIEW_CONVERT_EXPR:
2907       {
2908 	enum machine_mode mode1;
2909 	HOST_WIDE_INT bitsize, bitpos;
2910 	tree offset;
2911 	int volatilep = 0;
2912 	tree tem = get_inner_reference (exp, &bitsize, &bitpos, &offset,
2913 					&mode1, &unsignedp, &volatilep, false);
2914 	rtx orig_op0;
2915 
2916 	if (bitsize == 0)
2917 	  return NULL;
2918 
2919 	orig_op0 = op0 = expand_debug_expr (tem);
2920 
2921 	if (!op0)
2922 	  return NULL;
2923 
2924 	if (offset)
2925 	  {
2926 	    enum machine_mode addrmode, offmode;
2927 
2928 	    if (!MEM_P (op0))
2929 	      return NULL;
2930 
2931 	    op0 = XEXP (op0, 0);
2932 	    addrmode = GET_MODE (op0);
2933 	    if (addrmode == VOIDmode)
2934 	      addrmode = Pmode;
2935 
2936 	    op1 = expand_debug_expr (offset);
2937 	    if (!op1)
2938 	      return NULL;
2939 
2940 	    offmode = GET_MODE (op1);
2941 	    if (offmode == VOIDmode)
2942 	      offmode = TYPE_MODE (TREE_TYPE (offset));
2943 
2944 	    if (addrmode != offmode)
2945 	      op1 = simplify_gen_subreg (addrmode, op1, offmode,
2946 					 subreg_lowpart_offset (addrmode,
2947 								offmode));
2948 
2949 	    /* Don't use offset_address here, we don't need a
2950 	       recognizable address, and we don't want to generate
2951 	       code.  */
2952 	    op0 = gen_rtx_MEM (mode, simplify_gen_binary (PLUS, addrmode,
2953 							  op0, op1));
2954 	  }
2955 
2956 	if (MEM_P (op0))
2957 	  {
2958 	    if (mode1 == VOIDmode)
2959 	      /* Bitfield.  */
2960 	      mode1 = smallest_mode_for_size (bitsize, MODE_INT);
2961 	    if (bitpos >= BITS_PER_UNIT)
2962 	      {
2963 		op0 = adjust_address_nv (op0, mode1, bitpos / BITS_PER_UNIT);
2964 		bitpos %= BITS_PER_UNIT;
2965 	      }
2966 	    else if (bitpos < 0)
2967 	      {
2968 		HOST_WIDE_INT units
2969 		  = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
2970 		op0 = adjust_address_nv (op0, mode1, units);
2971 		bitpos += units * BITS_PER_UNIT;
2972 	      }
2973 	    else if (bitpos == 0 && bitsize == GET_MODE_BITSIZE (mode))
2974 	      op0 = adjust_address_nv (op0, mode, 0);
2975 	    else if (GET_MODE (op0) != mode1)
2976 	      op0 = adjust_address_nv (op0, mode1, 0);
2977 	    else
2978 	      op0 = copy_rtx (op0);
2979 	    if (op0 == orig_op0)
2980 	      op0 = shallow_copy_rtx (op0);
2981 	    set_mem_attributes (op0, exp, 0);
2982 	  }
2983 
2984 	if (bitpos == 0 && mode == GET_MODE (op0))
2985 	  return op0;
2986 
2987         if (bitpos < 0)
2988           return NULL;
2989 
2990 	if (GET_MODE (op0) == BLKmode)
2991 	  return NULL;
2992 
2993 	if ((bitpos % BITS_PER_UNIT) == 0
2994 	    && bitsize == GET_MODE_BITSIZE (mode1))
2995 	  {
2996 	    enum machine_mode opmode = GET_MODE (op0);
2997 
2998 	    if (opmode == VOIDmode)
2999 	      opmode = TYPE_MODE (TREE_TYPE (tem));
3000 
3001 	    /* This condition may hold if we're expanding the address
3002 	       right past the end of an array that turned out not to
3003 	       be addressable (i.e., the address was only computed in
3004 	       debug stmts).  The gen_subreg below would rightfully
3005 	       crash, and the address doesn't really exist, so just
3006 	       drop it.  */
3007 	    if (bitpos >= GET_MODE_BITSIZE (opmode))
3008 	      return NULL;
3009 
3010 	    if ((bitpos % GET_MODE_BITSIZE (mode)) == 0)
3011 	      return simplify_gen_subreg (mode, op0, opmode,
3012 					  bitpos / BITS_PER_UNIT);
3013 	  }
3014 
3015 	return simplify_gen_ternary (SCALAR_INT_MODE_P (GET_MODE (op0))
3016 				     && TYPE_UNSIGNED (TREE_TYPE (exp))
3017 				     ? SIGN_EXTRACT
3018 				     : ZERO_EXTRACT, mode,
3019 				     GET_MODE (op0) != VOIDmode
3020 				     ? GET_MODE (op0)
3021 				     : TYPE_MODE (TREE_TYPE (tem)),
3022 				     op0, GEN_INT (bitsize), GEN_INT (bitpos));
3023       }
3024 
3025     case ABS_EXPR:
3026       return simplify_gen_unary (ABS, mode, op0, mode);
3027 
3028     case NEGATE_EXPR:
3029       return simplify_gen_unary (NEG, mode, op0, mode);
3030 
3031     case BIT_NOT_EXPR:
3032       return simplify_gen_unary (NOT, mode, op0, mode);
3033 
3034     case FLOAT_EXPR:
3035       return simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
3036 									 0)))
3037 				 ? UNSIGNED_FLOAT : FLOAT, mode, op0,
3038 				 inner_mode);
3039 
3040     case FIX_TRUNC_EXPR:
3041       return simplify_gen_unary (unsignedp ? UNSIGNED_FIX : FIX, mode, op0,
3042 				 inner_mode);
3043 
3044     case POINTER_PLUS_EXPR:
3045       /* For the rare target where pointers are not the same size as
3046 	 size_t, we need to check for mis-matched modes and correct
3047 	 the addend.  */
3048       if (op0 && op1
3049 	  && GET_MODE (op0) != VOIDmode && GET_MODE (op1) != VOIDmode
3050 	  && GET_MODE (op0) != GET_MODE (op1))
3051 	{
3052 	  if (GET_MODE_BITSIZE (GET_MODE (op0)) < GET_MODE_BITSIZE (GET_MODE (op1)))
3053 	    op1 = simplify_gen_unary (TRUNCATE, GET_MODE (op0), op1,
3054 				      GET_MODE (op1));
3055 	  else
3056 	    /* We always sign-extend, regardless of the signedness of
3057 	       the operand, because the operand is always unsigned
3058 	       here even if the original C expression is signed.  */
3059 	    op1 = simplify_gen_unary (SIGN_EXTEND, GET_MODE (op0), op1,
3060 				      GET_MODE (op1));
3061 	}
3062       /* Fall through.  */
3063     case PLUS_EXPR:
3064       return simplify_gen_binary (PLUS, mode, op0, op1);
3065 
3066     case MINUS_EXPR:
3067       return simplify_gen_binary (MINUS, mode, op0, op1);
3068 
3069     case MULT_EXPR:
3070       return simplify_gen_binary (MULT, mode, op0, op1);
3071 
3072     case RDIV_EXPR:
3073     case TRUNC_DIV_EXPR:
3074     case EXACT_DIV_EXPR:
3075       if (unsignedp)
3076 	return simplify_gen_binary (UDIV, mode, op0, op1);
3077       else
3078 	return simplify_gen_binary (DIV, mode, op0, op1);
3079 
3080     case TRUNC_MOD_EXPR:
3081       return simplify_gen_binary (unsignedp ? UMOD : MOD, mode, op0, op1);
3082 
3083     case FLOOR_DIV_EXPR:
3084       if (unsignedp)
3085 	return simplify_gen_binary (UDIV, mode, op0, op1);
3086       else
3087 	{
3088 	  rtx div = simplify_gen_binary (DIV, mode, op0, op1);
3089 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3090 	  rtx adj = floor_sdiv_adjust (mode, mod, op1);
3091 	  return simplify_gen_binary (PLUS, mode, div, adj);
3092 	}
3093 
3094     case FLOOR_MOD_EXPR:
3095       if (unsignedp)
3096 	return simplify_gen_binary (UMOD, mode, op0, op1);
3097       else
3098 	{
3099 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3100 	  rtx adj = floor_sdiv_adjust (mode, mod, op1);
3101 	  adj = simplify_gen_unary (NEG, mode,
3102 				    simplify_gen_binary (MULT, mode, adj, op1),
3103 				    mode);
3104 	  return simplify_gen_binary (PLUS, mode, mod, adj);
3105 	}
3106 
3107     case CEIL_DIV_EXPR:
3108       if (unsignedp)
3109 	{
3110 	  rtx div = simplify_gen_binary (UDIV, mode, op0, op1);
3111 	  rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
3112 	  rtx adj = ceil_udiv_adjust (mode, mod, op1);
3113 	  return simplify_gen_binary (PLUS, mode, div, adj);
3114 	}
3115       else
3116 	{
3117 	  rtx div = simplify_gen_binary (DIV, mode, op0, op1);
3118 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3119 	  rtx adj = ceil_sdiv_adjust (mode, mod, op1);
3120 	  return simplify_gen_binary (PLUS, mode, div, adj);
3121 	}
3122 
3123     case CEIL_MOD_EXPR:
3124       if (unsignedp)
3125 	{
3126 	  rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
3127 	  rtx adj = ceil_udiv_adjust (mode, mod, op1);
3128 	  adj = simplify_gen_unary (NEG, mode,
3129 				    simplify_gen_binary (MULT, mode, adj, op1),
3130 				    mode);
3131 	  return simplify_gen_binary (PLUS, mode, mod, adj);
3132 	}
3133       else
3134 	{
3135 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3136 	  rtx adj = ceil_sdiv_adjust (mode, mod, op1);
3137 	  adj = simplify_gen_unary (NEG, mode,
3138 				    simplify_gen_binary (MULT, mode, adj, op1),
3139 				    mode);
3140 	  return simplify_gen_binary (PLUS, mode, mod, adj);
3141 	}
3142 
3143     case ROUND_DIV_EXPR:
3144       if (unsignedp)
3145 	{
3146 	  rtx div = simplify_gen_binary (UDIV, mode, op0, op1);
3147 	  rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
3148 	  rtx adj = round_udiv_adjust (mode, mod, op1);
3149 	  return simplify_gen_binary (PLUS, mode, div, adj);
3150 	}
3151       else
3152 	{
3153 	  rtx div = simplify_gen_binary (DIV, mode, op0, op1);
3154 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3155 	  rtx adj = round_sdiv_adjust (mode, mod, op1);
3156 	  return simplify_gen_binary (PLUS, mode, div, adj);
3157 	}
3158 
3159     case ROUND_MOD_EXPR:
3160       if (unsignedp)
3161 	{
3162 	  rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
3163 	  rtx adj = round_udiv_adjust (mode, mod, op1);
3164 	  adj = simplify_gen_unary (NEG, mode,
3165 				    simplify_gen_binary (MULT, mode, adj, op1),
3166 				    mode);
3167 	  return simplify_gen_binary (PLUS, mode, mod, adj);
3168 	}
3169       else
3170 	{
3171 	  rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
3172 	  rtx adj = round_sdiv_adjust (mode, mod, op1);
3173 	  adj = simplify_gen_unary (NEG, mode,
3174 				    simplify_gen_binary (MULT, mode, adj, op1),
3175 				    mode);
3176 	  return simplify_gen_binary (PLUS, mode, mod, adj);
3177 	}
3178 
3179     case LSHIFT_EXPR:
3180       return simplify_gen_binary (ASHIFT, mode, op0, op1);
3181 
3182     case RSHIFT_EXPR:
3183       if (unsignedp)
3184 	return simplify_gen_binary (LSHIFTRT, mode, op0, op1);
3185       else
3186 	return simplify_gen_binary (ASHIFTRT, mode, op0, op1);
3187 
3188     case LROTATE_EXPR:
3189       return simplify_gen_binary (ROTATE, mode, op0, op1);
3190 
3191     case RROTATE_EXPR:
3192       return simplify_gen_binary (ROTATERT, mode, op0, op1);
3193 
3194     case MIN_EXPR:
3195       return simplify_gen_binary (unsignedp ? UMIN : SMIN, mode, op0, op1);
3196 
3197     case MAX_EXPR:
3198       return simplify_gen_binary (unsignedp ? UMAX : SMAX, mode, op0, op1);
3199 
3200     case BIT_AND_EXPR:
3201     case TRUTH_AND_EXPR:
3202       return simplify_gen_binary (AND, mode, op0, op1);
3203 
3204     case BIT_IOR_EXPR:
3205     case TRUTH_OR_EXPR:
3206       return simplify_gen_binary (IOR, mode, op0, op1);
3207 
3208     case BIT_XOR_EXPR:
3209     case TRUTH_XOR_EXPR:
3210       return simplify_gen_binary (XOR, mode, op0, op1);
3211 
3212     case TRUTH_ANDIF_EXPR:
3213       return gen_rtx_IF_THEN_ELSE (mode, op0, op1, const0_rtx);
3214 
3215     case TRUTH_ORIF_EXPR:
3216       return gen_rtx_IF_THEN_ELSE (mode, op0, const_true_rtx, op1);
3217 
3218     case TRUTH_NOT_EXPR:
3219       return simplify_gen_relational (EQ, mode, inner_mode, op0, const0_rtx);
3220 
3221     case LT_EXPR:
3222       return simplify_gen_relational (unsignedp ? LTU : LT, mode, inner_mode,
3223 				      op0, op1);
3224 
3225     case LE_EXPR:
3226       return simplify_gen_relational (unsignedp ? LEU : LE, mode, inner_mode,
3227 				      op0, op1);
3228 
3229     case GT_EXPR:
3230       return simplify_gen_relational (unsignedp ? GTU : GT, mode, inner_mode,
3231 				      op0, op1);
3232 
3233     case GE_EXPR:
3234       return simplify_gen_relational (unsignedp ? GEU : GE, mode, inner_mode,
3235 				      op0, op1);
3236 
3237     case EQ_EXPR:
3238       return simplify_gen_relational (EQ, mode, inner_mode, op0, op1);
3239 
3240     case NE_EXPR:
3241       return simplify_gen_relational (NE, mode, inner_mode, op0, op1);
3242 
3243     case UNORDERED_EXPR:
3244       return simplify_gen_relational (UNORDERED, mode, inner_mode, op0, op1);
3245 
3246     case ORDERED_EXPR:
3247       return simplify_gen_relational (ORDERED, mode, inner_mode, op0, op1);
3248 
3249     case UNLT_EXPR:
3250       return simplify_gen_relational (UNLT, mode, inner_mode, op0, op1);
3251 
3252     case UNLE_EXPR:
3253       return simplify_gen_relational (UNLE, mode, inner_mode, op0, op1);
3254 
3255     case UNGT_EXPR:
3256       return simplify_gen_relational (UNGT, mode, inner_mode, op0, op1);
3257 
3258     case UNGE_EXPR:
3259       return simplify_gen_relational (UNGE, mode, inner_mode, op0, op1);
3260 
3261     case UNEQ_EXPR:
3262       return simplify_gen_relational (UNEQ, mode, inner_mode, op0, op1);
3263 
3264     case LTGT_EXPR:
3265       return simplify_gen_relational (LTGT, mode, inner_mode, op0, op1);
3266 
3267     case COND_EXPR:
3268       return gen_rtx_IF_THEN_ELSE (mode, op0, op1, op2);
3269 
3270     case COMPLEX_EXPR:
3271       gcc_assert (COMPLEX_MODE_P (mode));
3272       if (GET_MODE (op0) == VOIDmode)
3273 	op0 = gen_rtx_CONST (GET_MODE_INNER (mode), op0);
3274       if (GET_MODE (op1) == VOIDmode)
3275 	op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1);
3276       return gen_rtx_CONCAT (mode, op0, op1);
3277 
3278     case CONJ_EXPR:
3279       if (GET_CODE (op0) == CONCAT)
3280 	return gen_rtx_CONCAT (mode, XEXP (op0, 0),
3281 			       simplify_gen_unary (NEG, GET_MODE_INNER (mode),
3282 						   XEXP (op0, 1),
3283 						   GET_MODE_INNER (mode)));
3284       else
3285 	{
3286 	  enum machine_mode imode = GET_MODE_INNER (mode);
3287 	  rtx re, im;
3288 
3289 	  if (MEM_P (op0))
3290 	    {
3291 	      re = adjust_address_nv (op0, imode, 0);
3292 	      im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode));
3293 	    }
3294 	  else
3295 	    {
3296 	      enum machine_mode ifmode = int_mode_for_mode (mode);
3297 	      enum machine_mode ihmode = int_mode_for_mode (imode);
3298 	      rtx halfsize;
3299 	      if (ifmode == BLKmode || ihmode == BLKmode)
3300 		return NULL;
3301 	      halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode));
3302 	      re = op0;
3303 	      if (mode != ifmode)
3304 		re = gen_rtx_SUBREG (ifmode, re, 0);
3305 	      re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx);
3306 	      if (imode != ihmode)
3307 		re = gen_rtx_SUBREG (imode, re, 0);
3308 	      im = copy_rtx (op0);
3309 	      if (mode != ifmode)
3310 		im = gen_rtx_SUBREG (ifmode, im, 0);
3311 	      im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize);
3312 	      if (imode != ihmode)
3313 		im = gen_rtx_SUBREG (imode, im, 0);
3314 	    }
3315 	  im = gen_rtx_NEG (imode, im);
3316 	  return gen_rtx_CONCAT (mode, re, im);
3317 	}
3318 
3319     case ADDR_EXPR:
3320       op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
3321       if (!op0 || !MEM_P (op0))
3322 	{
3323 	  if ((TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL
3324 	       || TREE_CODE (TREE_OPERAND (exp, 0)) == PARM_DECL
3325 	       || TREE_CODE (TREE_OPERAND (exp, 0)) == RESULT_DECL)
3326 	      && (!TREE_ADDRESSABLE (TREE_OPERAND (exp, 0))
3327 		  || target_for_debug_bind (TREE_OPERAND (exp, 0))))
3328 	    return gen_rtx_DEBUG_IMPLICIT_PTR (mode, TREE_OPERAND (exp, 0));
3329 
3330 	  if (handled_component_p (TREE_OPERAND (exp, 0)))
3331 	    {
3332 	      HOST_WIDE_INT bitoffset, bitsize, maxsize;
3333 	      tree decl
3334 		= get_ref_base_and_extent (TREE_OPERAND (exp, 0),
3335 					   &bitoffset, &bitsize, &maxsize);
3336 	      if ((TREE_CODE (decl) == VAR_DECL
3337 		   || TREE_CODE (decl) == PARM_DECL
3338 		   || TREE_CODE (decl) == RESULT_DECL)
3339 		  && (!TREE_ADDRESSABLE (decl)
3340 		      || target_for_debug_bind (decl))
3341 		  && (bitoffset % BITS_PER_UNIT) == 0
3342 		  && bitsize > 0
3343 		  && bitsize == maxsize)
3344 		return plus_constant (gen_rtx_DEBUG_IMPLICIT_PTR (mode, decl),
3345 				      bitoffset / BITS_PER_UNIT);
3346 	    }
3347 
3348 	  return NULL;
3349 	}
3350 
3351       as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
3352       op0 = convert_debug_memory_address (mode, XEXP (op0, 0), as);
3353 
3354       return op0;
3355 
3356     case VECTOR_CST:
3357       exp = build_constructor_from_list (TREE_TYPE (exp),
3358 					 TREE_VECTOR_CST_ELTS (exp));
3359       /* Fall through.  */
3360 
3361     case CONSTRUCTOR:
3362       if (TREE_CLOBBER_P (exp))
3363 	return NULL;
3364       else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE)
3365 	{
3366 	  unsigned i;
3367 	  tree val;
3368 
3369 	  op0 = gen_rtx_CONCATN
3370 	    (mode, rtvec_alloc (TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp))));
3371 
3372 	  FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val)
3373 	    {
3374 	      op1 = expand_debug_expr (val);
3375 	      if (!op1)
3376 		return NULL;
3377 	      XVECEXP (op0, 0, i) = op1;
3378 	    }
3379 
3380 	  if (i < TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)))
3381 	    {
3382 	      op1 = expand_debug_expr
3383 		(build_zero_cst (TREE_TYPE (TREE_TYPE (exp))));
3384 
3385 	      if (!op1)
3386 		return NULL;
3387 
3388 	      for (; i < TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)); i++)
3389 		XVECEXP (op0, 0, i) = op1;
3390 	    }
3391 
3392 	  return op0;
3393 	}
3394       else
3395 	goto flag_unsupported;
3396 
3397     case CALL_EXPR:
3398       /* ??? Maybe handle some builtins?  */
3399       return NULL;
3400 
3401     case SSA_NAME:
3402       {
3403 	gimple g = get_gimple_for_ssa_name (exp);
3404 	if (g)
3405 	  {
3406 	    op0 = expand_debug_expr (gimple_assign_rhs_to_tree (g));
3407 	    if (!op0)
3408 	      return NULL;
3409 	  }
3410 	else
3411 	  {
3412 	    int part = var_to_partition (SA.map, exp);
3413 
3414 	    if (part == NO_PARTITION)
3415 	      {
3416 		/* If this is a reference to an incoming value of parameter
3417 		   that is never used in the code or where the incoming
3418 		   value is never used in the code, use PARM_DECL's
3419 		   DECL_RTL if set.  */
3420 		if (SSA_NAME_IS_DEFAULT_DEF (exp)
3421 		    && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL)
3422 		  {
3423 		    op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp));
3424 		    if (op0)
3425 		      goto adjust_mode;
3426 		    op0 = expand_debug_expr (SSA_NAME_VAR (exp));
3427 		    if (op0)
3428 		      goto adjust_mode;
3429 		  }
3430 		return NULL;
3431 	      }
3432 
3433 	    gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions);
3434 
3435 	    op0 = copy_rtx (SA.partition_to_pseudo[part]);
3436 	  }
3437 	goto adjust_mode;
3438       }
3439 
3440     case ERROR_MARK:
3441       return NULL;
3442 
3443     /* Vector stuff.  For most of the codes we don't have rtl codes.  */
3444     case REALIGN_LOAD_EXPR:
3445     case REDUC_MAX_EXPR:
3446     case REDUC_MIN_EXPR:
3447     case REDUC_PLUS_EXPR:
3448     case VEC_COND_EXPR:
3449     case VEC_LSHIFT_EXPR:
3450     case VEC_PACK_FIX_TRUNC_EXPR:
3451     case VEC_PACK_SAT_EXPR:
3452     case VEC_PACK_TRUNC_EXPR:
3453     case VEC_RSHIFT_EXPR:
3454     case VEC_UNPACK_FLOAT_HI_EXPR:
3455     case VEC_UNPACK_FLOAT_LO_EXPR:
3456     case VEC_UNPACK_HI_EXPR:
3457     case VEC_UNPACK_LO_EXPR:
3458     case VEC_WIDEN_MULT_HI_EXPR:
3459     case VEC_WIDEN_MULT_LO_EXPR:
3460     case VEC_WIDEN_LSHIFT_HI_EXPR:
3461     case VEC_WIDEN_LSHIFT_LO_EXPR:
3462     case VEC_PERM_EXPR:
3463       return NULL;
3464 
3465    /* Misc codes.  */
3466     case ADDR_SPACE_CONVERT_EXPR:
3467     case FIXED_CONVERT_EXPR:
3468     case OBJ_TYPE_REF:
3469     case WITH_SIZE_EXPR:
3470       return NULL;
3471 
3472     case DOT_PROD_EXPR:
3473       if (SCALAR_INT_MODE_P (GET_MODE (op0))
3474 	  && SCALAR_INT_MODE_P (mode))
3475 	{
3476 	  op0
3477 	    = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
3478 									  0)))
3479 				  ? ZERO_EXTEND : SIGN_EXTEND, mode, op0,
3480 				  inner_mode);
3481 	  op1
3482 	    = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
3483 									  1)))
3484 				  ? ZERO_EXTEND : SIGN_EXTEND, mode, op1,
3485 				  inner_mode);
3486 	  op0 = simplify_gen_binary (MULT, mode, op0, op1);
3487 	  return simplify_gen_binary (PLUS, mode, op0, op2);
3488 	}
3489       return NULL;
3490 
3491     case WIDEN_MULT_EXPR:
3492     case WIDEN_MULT_PLUS_EXPR:
3493     case WIDEN_MULT_MINUS_EXPR:
3494       if (SCALAR_INT_MODE_P (GET_MODE (op0))
3495 	  && SCALAR_INT_MODE_P (mode))
3496 	{
3497 	  inner_mode = GET_MODE (op0);
3498 	  if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
3499 	    op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
3500 	  else
3501 	    op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
3502 	  if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))))
3503 	    op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode);
3504 	  else
3505 	    op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode);
3506 	  op0 = simplify_gen_binary (MULT, mode, op0, op1);
3507 	  if (TREE_CODE (exp) == WIDEN_MULT_EXPR)
3508 	    return op0;
3509 	  else if (TREE_CODE (exp) == WIDEN_MULT_PLUS_EXPR)
3510 	    return simplify_gen_binary (PLUS, mode, op0, op2);
3511 	  else
3512 	    return simplify_gen_binary (MINUS, mode, op2, op0);
3513 	}
3514       return NULL;
3515 
3516     case WIDEN_SUM_EXPR:
3517     case WIDEN_LSHIFT_EXPR:
3518       if (SCALAR_INT_MODE_P (GET_MODE (op0))
3519 	  && SCALAR_INT_MODE_P (mode))
3520 	{
3521 	  op0
3522 	    = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
3523 									  0)))
3524 				  ? ZERO_EXTEND : SIGN_EXTEND, mode, op0,
3525 				  inner_mode);
3526 	  return simplify_gen_binary (TREE_CODE (exp) == WIDEN_LSHIFT_EXPR
3527 				      ? ASHIFT : PLUS, mode, op0, op1);
3528 	}
3529       return NULL;
3530 
3531     case FMA_EXPR:
3532       return simplify_gen_ternary (FMA, mode, inner_mode, op0, op1, op2);
3533 
3534     default:
3535     flag_unsupported:
3536 #ifdef ENABLE_CHECKING
3537       debug_tree (exp);
3538       gcc_unreachable ();
3539 #else
3540       return NULL;
3541 #endif
3542     }
3543 }
3544 
3545 /* Return an RTX equivalent to the source bind value of the tree expression
3546    EXP.  */
3547 
3548 static rtx
3549 expand_debug_source_expr (tree exp)
3550 {
3551   rtx op0 = NULL_RTX;
3552   enum machine_mode mode = VOIDmode, inner_mode;
3553 
3554   switch (TREE_CODE (exp))
3555     {
3556     case PARM_DECL:
3557       {
3558 	mode = DECL_MODE (exp);
3559 	op0 = expand_debug_parm_decl (exp);
3560 	if (op0)
3561 	   break;
3562 	/* See if this isn't an argument that has been completely
3563 	   optimized out.  */
3564 	if (!DECL_RTL_SET_P (exp)
3565 	    && !DECL_INCOMING_RTL (exp)
3566 	    && DECL_ABSTRACT_ORIGIN (current_function_decl))
3567 	  {
3568 	    tree aexp = exp;
3569 	    if (DECL_ABSTRACT_ORIGIN (exp))
3570 	      aexp = DECL_ABSTRACT_ORIGIN (exp);
3571 	    if (DECL_CONTEXT (aexp)
3572 		== DECL_ABSTRACT_ORIGIN (current_function_decl))
3573 	      {
3574 		VEC(tree, gc) **debug_args;
3575 		unsigned int ix;
3576 		tree ddecl;
3577 #ifdef ENABLE_CHECKING
3578 		tree parm;
3579 		for (parm = DECL_ARGUMENTS (current_function_decl);
3580 		     parm; parm = DECL_CHAIN (parm))
3581 		  gcc_assert (parm != exp
3582 			      && DECL_ABSTRACT_ORIGIN (parm) != aexp);
3583 #endif
3584 		debug_args = decl_debug_args_lookup (current_function_decl);
3585 		if (debug_args != NULL)
3586 		  {
3587 		    for (ix = 0; VEC_iterate (tree, *debug_args, ix, ddecl);
3588 			 ix += 2)
3589 		      if (ddecl == aexp)
3590 			return gen_rtx_DEBUG_PARAMETER_REF (mode, aexp);
3591 		  }
3592 	      }
3593 	  }
3594 	break;
3595       }
3596     default:
3597       break;
3598     }
3599 
3600   if (op0 == NULL_RTX)
3601     return NULL_RTX;
3602 
3603   inner_mode = GET_MODE (op0);
3604   if (mode == inner_mode)
3605     return op0;
3606 
3607   if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode))
3608     {
3609       if (GET_MODE_BITSIZE (mode) == GET_MODE_BITSIZE (inner_mode))
3610 	op0 = simplify_gen_subreg (mode, op0, inner_mode, 0);
3611       else if (GET_MODE_BITSIZE (mode) < GET_MODE_BITSIZE (inner_mode))
3612 	op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode);
3613       else
3614 	op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode);
3615     }
3616   else if (FLOAT_MODE_P (mode))
3617     gcc_unreachable ();
3618   else if (FLOAT_MODE_P (inner_mode))
3619     {
3620       if (TYPE_UNSIGNED (TREE_TYPE (exp)))
3621 	op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode);
3622       else
3623 	op0 = simplify_gen_unary (FIX, mode, op0, inner_mode);
3624     }
3625   else if (CONSTANT_P (op0)
3626 	   || GET_MODE_BITSIZE (mode) <= GET_MODE_BITSIZE (inner_mode))
3627     op0 = simplify_gen_subreg (mode, op0, inner_mode,
3628 			       subreg_lowpart_offset (mode, inner_mode));
3629   else if (TYPE_UNSIGNED (TREE_TYPE (exp)))
3630     op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
3631   else
3632     op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
3633 
3634   return op0;
3635 }
3636 
3637 /* Expand the _LOCs in debug insns.  We run this after expanding all
3638    regular insns, so that any variables referenced in the function
3639    will have their DECL_RTLs set.  */
3640 
3641 static void
3642 expand_debug_locations (void)
3643 {
3644   rtx insn;
3645   rtx last = get_last_insn ();
3646   int save_strict_alias = flag_strict_aliasing;
3647 
3648   /* New alias sets while setting up memory attributes cause
3649      -fcompare-debug failures, even though it doesn't bring about any
3650      codegen changes.  */
3651   flag_strict_aliasing = 0;
3652 
3653   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
3654     if (DEBUG_INSN_P (insn))
3655       {
3656 	tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
3657 	rtx val;
3658 	enum machine_mode mode;
3659 
3660 	if (value == NULL_TREE)
3661 	  val = NULL_RTX;
3662 	else
3663 	  {
3664 	    if (INSN_VAR_LOCATION_STATUS (insn)
3665 		== VAR_INIT_STATUS_UNINITIALIZED)
3666 	      val = expand_debug_source_expr (value);
3667 	    else
3668 	      val = expand_debug_expr (value);
3669 	    gcc_assert (last == get_last_insn ());
3670 	  }
3671 
3672 	if (!val)
3673 	  val = gen_rtx_UNKNOWN_VAR_LOC ();
3674 	else
3675 	  {
3676 	    mode = GET_MODE (INSN_VAR_LOCATION (insn));
3677 
3678 	    gcc_assert (mode == GET_MODE (val)
3679 			|| (GET_MODE (val) == VOIDmode
3680 			    && (CONST_INT_P (val)
3681 				|| GET_CODE (val) == CONST_FIXED
3682 				|| GET_CODE (val) == CONST_DOUBLE
3683 				|| GET_CODE (val) == LABEL_REF)));
3684 	  }
3685 
3686 	INSN_VAR_LOCATION_LOC (insn) = val;
3687       }
3688 
3689   flag_strict_aliasing = save_strict_alias;
3690 }
3691 
3692 /* Expand basic block BB from GIMPLE trees to RTL.  */
3693 
3694 static basic_block
3695 expand_gimple_basic_block (basic_block bb)
3696 {
3697   gimple_stmt_iterator gsi;
3698   gimple_seq stmts;
3699   gimple stmt = NULL;
3700   rtx note, last;
3701   edge e;
3702   edge_iterator ei;
3703   void **elt;
3704 
3705   if (dump_file)
3706     fprintf (dump_file, "\n;; Generating RTL for gimple basic block %d\n",
3707 	     bb->index);
3708 
3709   /* Note that since we are now transitioning from GIMPLE to RTL, we
3710      cannot use the gsi_*_bb() routines because they expect the basic
3711      block to be in GIMPLE, instead of RTL.  Therefore, we need to
3712      access the BB sequence directly.  */
3713   stmts = bb_seq (bb);
3714   bb->il.gimple = NULL;
3715   rtl_profile_for_bb (bb);
3716   init_rtl_bb_info (bb);
3717   bb->flags |= BB_RTL;
3718 
3719   /* Remove the RETURN_EXPR if we may fall though to the exit
3720      instead.  */
3721   gsi = gsi_last (stmts);
3722   if (!gsi_end_p (gsi)
3723       && gimple_code (gsi_stmt (gsi)) == GIMPLE_RETURN)
3724     {
3725       gimple ret_stmt = gsi_stmt (gsi);
3726 
3727       gcc_assert (single_succ_p (bb));
3728       gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR);
3729 
3730       if (bb->next_bb == EXIT_BLOCK_PTR
3731 	  && !gimple_return_retval (ret_stmt))
3732 	{
3733 	  gsi_remove (&gsi, false);
3734 	  single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
3735 	}
3736     }
3737 
3738   gsi = gsi_start (stmts);
3739   if (!gsi_end_p (gsi))
3740     {
3741       stmt = gsi_stmt (gsi);
3742       if (gimple_code (stmt) != GIMPLE_LABEL)
3743 	stmt = NULL;
3744     }
3745 
3746   elt = pointer_map_contains (lab_rtx_for_bb, bb);
3747 
3748   if (stmt || elt)
3749     {
3750       last = get_last_insn ();
3751 
3752       if (stmt)
3753 	{
3754 	  expand_gimple_stmt (stmt);
3755 	  gsi_next (&gsi);
3756 	}
3757 
3758       if (elt)
3759 	emit_label ((rtx) *elt);
3760 
3761       /* Java emits line number notes in the top of labels.
3762 	 ??? Make this go away once line number notes are obsoleted.  */
3763       BB_HEAD (bb) = NEXT_INSN (last);
3764       if (NOTE_P (BB_HEAD (bb)))
3765 	BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb));
3766       note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb));
3767 
3768       maybe_dump_rtl_for_gimple_stmt (stmt, last);
3769     }
3770   else
3771     note = BB_HEAD (bb) = emit_note (NOTE_INSN_BASIC_BLOCK);
3772 
3773   NOTE_BASIC_BLOCK (note) = bb;
3774 
3775   for (; !gsi_end_p (gsi); gsi_next (&gsi))
3776     {
3777       basic_block new_bb;
3778 
3779       stmt = gsi_stmt (gsi);
3780 
3781       /* If this statement is a non-debug one, and we generate debug
3782 	 insns, then this one might be the last real use of a TERed
3783 	 SSA_NAME, but where there are still some debug uses further
3784 	 down.  Expanding the current SSA name in such further debug
3785 	 uses by their RHS might lead to wrong debug info, as coalescing
3786 	 might make the operands of such RHS be placed into the same
3787 	 pseudo as something else.  Like so:
3788 	   a_1 = a_0 + 1;   // Assume a_1 is TERed and a_0 is dead
3789 	   use(a_1);
3790 	   a_2 = ...
3791            #DEBUG ... => a_1
3792 	 As a_0 and a_2 don't overlap in lifetime, assume they are coalesced.
3793 	 If we now would expand a_1 by it's RHS (a_0 + 1) in the debug use,
3794 	 the write to a_2 would actually have clobbered the place which
3795 	 formerly held a_0.
3796 
3797 	 So, instead of that, we recognize the situation, and generate
3798 	 debug temporaries at the last real use of TERed SSA names:
3799 	   a_1 = a_0 + 1;
3800            #DEBUG #D1 => a_1
3801 	   use(a_1);
3802 	   a_2 = ...
3803            #DEBUG ... => #D1
3804 	 */
3805       if (MAY_HAVE_DEBUG_INSNS
3806 	  && SA.values
3807 	  && !is_gimple_debug (stmt))
3808 	{
3809 	  ssa_op_iter iter;
3810 	  tree op;
3811 	  gimple def;
3812 
3813 	  location_t sloc = get_curr_insn_source_location ();
3814 	  tree sblock = get_curr_insn_block ();
3815 
3816 	  /* Look for SSA names that have their last use here (TERed
3817 	     names always have only one real use).  */
3818 	  FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
3819 	    if ((def = get_gimple_for_ssa_name (op)))
3820 	      {
3821 		imm_use_iterator imm_iter;
3822 		use_operand_p use_p;
3823 		bool have_debug_uses = false;
3824 
3825 		FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op)
3826 		  {
3827 		    if (gimple_debug_bind_p (USE_STMT (use_p)))
3828 		      {
3829 			have_debug_uses = true;
3830 			break;
3831 		      }
3832 		  }
3833 
3834 		if (have_debug_uses)
3835 		  {
3836 		    /* OP is a TERed SSA name, with DEF it's defining
3837 		       statement, and where OP is used in further debug
3838 		       instructions.  Generate a debug temporary, and
3839 		       replace all uses of OP in debug insns with that
3840 		       temporary.  */
3841 		    gimple debugstmt;
3842 		    tree value = gimple_assign_rhs_to_tree (def);
3843 		    tree vexpr = make_node (DEBUG_EXPR_DECL);
3844 		    rtx val;
3845 		    enum machine_mode mode;
3846 
3847 		    set_curr_insn_source_location (gimple_location (def));
3848 		    set_curr_insn_block (gimple_block (def));
3849 
3850 		    DECL_ARTIFICIAL (vexpr) = 1;
3851 		    TREE_TYPE (vexpr) = TREE_TYPE (value);
3852 		    if (DECL_P (value))
3853 		      mode = DECL_MODE (value);
3854 		    else
3855 		      mode = TYPE_MODE (TREE_TYPE (value));
3856 		    DECL_MODE (vexpr) = mode;
3857 
3858 		    val = gen_rtx_VAR_LOCATION
3859 			(mode, vexpr, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
3860 
3861 		    emit_debug_insn (val);
3862 
3863 		    FOR_EACH_IMM_USE_STMT (debugstmt, imm_iter, op)
3864 		      {
3865 			if (!gimple_debug_bind_p (debugstmt))
3866 			  continue;
3867 
3868 			FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
3869 			  SET_USE (use_p, vexpr);
3870 
3871 			update_stmt (debugstmt);
3872 		      }
3873 		  }
3874 	      }
3875 	  set_curr_insn_source_location (sloc);
3876 	  set_curr_insn_block (sblock);
3877 	}
3878 
3879       currently_expanding_gimple_stmt = stmt;
3880 
3881       /* Expand this statement, then evaluate the resulting RTL and
3882 	 fixup the CFG accordingly.  */
3883       if (gimple_code (stmt) == GIMPLE_COND)
3884 	{
3885 	  new_bb = expand_gimple_cond (bb, stmt);
3886 	  if (new_bb)
3887 	    return new_bb;
3888 	}
3889       else if (gimple_debug_bind_p (stmt))
3890 	{
3891 	  location_t sloc = get_curr_insn_source_location ();
3892 	  tree sblock = get_curr_insn_block ();
3893 	  gimple_stmt_iterator nsi = gsi;
3894 
3895 	  for (;;)
3896 	    {
3897 	      tree var = gimple_debug_bind_get_var (stmt);
3898 	      tree value;
3899 	      rtx val;
3900 	      enum machine_mode mode;
3901 
3902 	      if (TREE_CODE (var) != DEBUG_EXPR_DECL
3903 		  && TREE_CODE (var) != LABEL_DECL
3904 		  && !target_for_debug_bind (var))
3905 		goto delink_debug_stmt;
3906 
3907 	      if (gimple_debug_bind_has_value_p (stmt))
3908 		value = gimple_debug_bind_get_value (stmt);
3909 	      else
3910 		value = NULL_TREE;
3911 
3912 	      last = get_last_insn ();
3913 
3914 	      set_curr_insn_source_location (gimple_location (stmt));
3915 	      set_curr_insn_block (gimple_block (stmt));
3916 
3917 	      if (DECL_P (var))
3918 		mode = DECL_MODE (var);
3919 	      else
3920 		mode = TYPE_MODE (TREE_TYPE (var));
3921 
3922 	      val = gen_rtx_VAR_LOCATION
3923 		(mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
3924 
3925 	      emit_debug_insn (val);
3926 
3927 	      if (dump_file && (dump_flags & TDF_DETAILS))
3928 		{
3929 		  /* We can't dump the insn with a TREE where an RTX
3930 		     is expected.  */
3931 		  PAT_VAR_LOCATION_LOC (val) = const0_rtx;
3932 		  maybe_dump_rtl_for_gimple_stmt (stmt, last);
3933 		  PAT_VAR_LOCATION_LOC (val) = (rtx)value;
3934 		}
3935 
3936 	    delink_debug_stmt:
3937 	      /* In order not to generate too many debug temporaries,
3938 	         we delink all uses of debug statements we already expanded.
3939 		 Therefore debug statements between definition and real
3940 		 use of TERed SSA names will continue to use the SSA name,
3941 		 and not be replaced with debug temps.  */
3942 	      delink_stmt_imm_use (stmt);
3943 
3944 	      gsi = nsi;
3945 	      gsi_next (&nsi);
3946 	      if (gsi_end_p (nsi))
3947 		break;
3948 	      stmt = gsi_stmt (nsi);
3949 	      if (!gimple_debug_bind_p (stmt))
3950 		break;
3951 	    }
3952 
3953 	  set_curr_insn_source_location (sloc);
3954 	  set_curr_insn_block (sblock);
3955 	}
3956       else if (gimple_debug_source_bind_p (stmt))
3957 	{
3958 	  location_t sloc = get_curr_insn_source_location ();
3959 	  tree sblock = get_curr_insn_block ();
3960 	  tree var = gimple_debug_source_bind_get_var (stmt);
3961 	  tree value = gimple_debug_source_bind_get_value (stmt);
3962 	  rtx val;
3963 	  enum machine_mode mode;
3964 
3965 	  last = get_last_insn ();
3966 
3967 	  set_curr_insn_source_location (gimple_location (stmt));
3968 	  set_curr_insn_block (gimple_block (stmt));
3969 
3970 	  mode = DECL_MODE (var);
3971 
3972 	  val = gen_rtx_VAR_LOCATION (mode, var, (rtx)value,
3973 				      VAR_INIT_STATUS_UNINITIALIZED);
3974 
3975 	  emit_debug_insn (val);
3976 
3977 	  if (dump_file && (dump_flags & TDF_DETAILS))
3978 	    {
3979 	      /* We can't dump the insn with a TREE where an RTX
3980 		 is expected.  */
3981 	      PAT_VAR_LOCATION_LOC (val) = const0_rtx;
3982 	      maybe_dump_rtl_for_gimple_stmt (stmt, last);
3983 	      PAT_VAR_LOCATION_LOC (val) = (rtx)value;
3984 	    }
3985 
3986 	  set_curr_insn_source_location (sloc);
3987 	  set_curr_insn_block (sblock);
3988 	}
3989       else
3990 	{
3991 	  if (is_gimple_call (stmt) && gimple_call_tail_p (stmt))
3992 	    {
3993 	      bool can_fallthru;
3994 	      new_bb = expand_gimple_tailcall (bb, stmt, &can_fallthru);
3995 	      if (new_bb)
3996 		{
3997 		  if (can_fallthru)
3998 		    bb = new_bb;
3999 		  else
4000 		    return new_bb;
4001 		}
4002 	    }
4003 	  else
4004 	    {
4005 	      def_operand_p def_p;
4006 	      def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
4007 
4008 	      if (def_p != NULL)
4009 		{
4010 		  /* Ignore this stmt if it is in the list of
4011 		     replaceable expressions.  */
4012 		  if (SA.values
4013 		      && bitmap_bit_p (SA.values,
4014 				       SSA_NAME_VERSION (DEF_FROM_PTR (def_p))))
4015 		    continue;
4016 		}
4017 	      last = expand_gimple_stmt (stmt);
4018 	      maybe_dump_rtl_for_gimple_stmt (stmt, last);
4019 	    }
4020 	}
4021     }
4022 
4023   currently_expanding_gimple_stmt = NULL;
4024 
4025   /* Expand implicit goto and convert goto_locus.  */
4026   FOR_EACH_EDGE (e, ei, bb->succs)
4027     {
4028       if (e->goto_locus && e->goto_block)
4029 	{
4030 	  set_curr_insn_source_location (e->goto_locus);
4031 	  set_curr_insn_block (e->goto_block);
4032 	  e->goto_locus = curr_insn_locator ();
4033 	}
4034       e->goto_block = NULL;
4035       if ((e->flags & EDGE_FALLTHRU) && e->dest != bb->next_bb)
4036 	{
4037 	  emit_jump (label_rtx_for_bb (e->dest));
4038 	  e->flags &= ~EDGE_FALLTHRU;
4039 	}
4040     }
4041 
4042   /* Expanded RTL can create a jump in the last instruction of block.
4043      This later might be assumed to be a jump to successor and break edge insertion.
4044      We need to insert dummy move to prevent this. PR41440. */
4045   if (single_succ_p (bb)
4046       && (single_succ_edge (bb)->flags & EDGE_FALLTHRU)
4047       && (last = get_last_insn ())
4048       && JUMP_P (last))
4049     {
4050       rtx dummy = gen_reg_rtx (SImode);
4051       emit_insn_after_noloc (gen_move_insn (dummy, dummy), last, NULL);
4052     }
4053 
4054   do_pending_stack_adjust ();
4055 
4056   /* Find the block tail.  The last insn in the block is the insn
4057      before a barrier and/or table jump insn.  */
4058   last = get_last_insn ();
4059   if (BARRIER_P (last))
4060     last = PREV_INSN (last);
4061   if (JUMP_TABLE_DATA_P (last))
4062     last = PREV_INSN (PREV_INSN (last));
4063   BB_END (bb) = last;
4064 
4065   update_bb_for_insn (bb);
4066 
4067   return bb;
4068 }
4069 
4070 
4071 /* Create a basic block for initialization code.  */
4072 
4073 static basic_block
4074 construct_init_block (void)
4075 {
4076   basic_block init_block, first_block;
4077   edge e = NULL;
4078   int flags;
4079 
4080   /* Multiple entry points not supported yet.  */
4081   gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR->succs) == 1);
4082   init_rtl_bb_info (ENTRY_BLOCK_PTR);
4083   init_rtl_bb_info (EXIT_BLOCK_PTR);
4084   ENTRY_BLOCK_PTR->flags |= BB_RTL;
4085   EXIT_BLOCK_PTR->flags |= BB_RTL;
4086 
4087   e = EDGE_SUCC (ENTRY_BLOCK_PTR, 0);
4088 
4089   /* When entry edge points to first basic block, we don't need jump,
4090      otherwise we have to jump into proper target.  */
4091   if (e && e->dest != ENTRY_BLOCK_PTR->next_bb)
4092     {
4093       tree label = gimple_block_label (e->dest);
4094 
4095       emit_jump (label_rtx (label));
4096       flags = 0;
4097     }
4098   else
4099     flags = EDGE_FALLTHRU;
4100 
4101   init_block = create_basic_block (NEXT_INSN (get_insns ()),
4102 				   get_last_insn (),
4103 				   ENTRY_BLOCK_PTR);
4104   init_block->frequency = ENTRY_BLOCK_PTR->frequency;
4105   init_block->count = ENTRY_BLOCK_PTR->count;
4106   if (e)
4107     {
4108       first_block = e->dest;
4109       redirect_edge_succ (e, init_block);
4110       e = make_edge (init_block, first_block, flags);
4111     }
4112   else
4113     e = make_edge (init_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
4114   e->probability = REG_BR_PROB_BASE;
4115   e->count = ENTRY_BLOCK_PTR->count;
4116 
4117   update_bb_for_insn (init_block);
4118   return init_block;
4119 }
4120 
4121 /* For each lexical block, set BLOCK_NUMBER to the depth at which it is
4122    found in the block tree.  */
4123 
4124 static void
4125 set_block_levels (tree block, int level)
4126 {
4127   while (block)
4128     {
4129       BLOCK_NUMBER (block) = level;
4130       set_block_levels (BLOCK_SUBBLOCKS (block), level + 1);
4131       block = BLOCK_CHAIN (block);
4132     }
4133 }
4134 
4135 /* Create a block containing landing pads and similar stuff.  */
4136 
4137 static void
4138 construct_exit_block (void)
4139 {
4140   rtx head = get_last_insn ();
4141   rtx end;
4142   basic_block exit_block;
4143   edge e, e2;
4144   unsigned ix;
4145   edge_iterator ei;
4146   rtx orig_end = BB_END (EXIT_BLOCK_PTR->prev_bb);
4147 
4148   rtl_profile_for_bb (EXIT_BLOCK_PTR);
4149 
4150   /* Make sure the locus is set to the end of the function, so that
4151      epilogue line numbers and warnings are set properly.  */
4152   if (cfun->function_end_locus != UNKNOWN_LOCATION)
4153     input_location = cfun->function_end_locus;
4154 
4155   /* The following insns belong to the top scope.  */
4156   set_curr_insn_block (DECL_INITIAL (current_function_decl));
4157 
4158   /* Generate rtl for function exit.  */
4159   expand_function_end ();
4160 
4161   end = get_last_insn ();
4162   if (head == end)
4163     return;
4164   /* While emitting the function end we could move end of the last basic block.
4165    */
4166   BB_END (EXIT_BLOCK_PTR->prev_bb) = orig_end;
4167   while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head)))
4168     head = NEXT_INSN (head);
4169   exit_block = create_basic_block (NEXT_INSN (head), end,
4170 				   EXIT_BLOCK_PTR->prev_bb);
4171   exit_block->frequency = EXIT_BLOCK_PTR->frequency;
4172   exit_block->count = EXIT_BLOCK_PTR->count;
4173 
4174   ix = 0;
4175   while (ix < EDGE_COUNT (EXIT_BLOCK_PTR->preds))
4176     {
4177       e = EDGE_PRED (EXIT_BLOCK_PTR, ix);
4178       if (!(e->flags & EDGE_ABNORMAL))
4179 	redirect_edge_succ (e, exit_block);
4180       else
4181 	ix++;
4182     }
4183 
4184   e = make_edge (exit_block, EXIT_BLOCK_PTR, EDGE_FALLTHRU);
4185   e->probability = REG_BR_PROB_BASE;
4186   e->count = EXIT_BLOCK_PTR->count;
4187   FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR->preds)
4188     if (e2 != e)
4189       {
4190 	e->count -= e2->count;
4191 	exit_block->count -= e2->count;
4192 	exit_block->frequency -= EDGE_FREQUENCY (e2);
4193       }
4194   if (e->count < 0)
4195     e->count = 0;
4196   if (exit_block->count < 0)
4197     exit_block->count = 0;
4198   if (exit_block->frequency < 0)
4199     exit_block->frequency = 0;
4200   update_bb_for_insn (exit_block);
4201 }
4202 
4203 /* Helper function for discover_nonconstant_array_refs.
4204    Look for ARRAY_REF nodes with non-constant indexes and mark them
4205    addressable.  */
4206 
4207 static tree
4208 discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
4209 				   void *data ATTRIBUTE_UNUSED)
4210 {
4211   tree t = *tp;
4212 
4213   if (IS_TYPE_OR_DECL_P (t))
4214     *walk_subtrees = 0;
4215   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4216     {
4217       while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4218 	      && is_gimple_min_invariant (TREE_OPERAND (t, 1))
4219 	      && (!TREE_OPERAND (t, 2)
4220 		  || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
4221 	     || (TREE_CODE (t) == COMPONENT_REF
4222 		 && (!TREE_OPERAND (t,2)
4223 		     || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
4224 	     || TREE_CODE (t) == BIT_FIELD_REF
4225 	     || TREE_CODE (t) == REALPART_EXPR
4226 	     || TREE_CODE (t) == IMAGPART_EXPR
4227 	     || TREE_CODE (t) == VIEW_CONVERT_EXPR
4228 	     || CONVERT_EXPR_P (t))
4229 	t = TREE_OPERAND (t, 0);
4230 
4231       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
4232 	{
4233 	  t = get_base_address (t);
4234 	  if (t && DECL_P (t)
4235               && DECL_MODE (t) != BLKmode)
4236 	    TREE_ADDRESSABLE (t) = 1;
4237 	}
4238 
4239       *walk_subtrees = 0;
4240     }
4241 
4242   return NULL_TREE;
4243 }
4244 
4245 /* RTL expansion is not able to compile array references with variable
4246    offsets for arrays stored in single register.  Discover such
4247    expressions and mark variables as addressable to avoid this
4248    scenario.  */
4249 
4250 static void
4251 discover_nonconstant_array_refs (void)
4252 {
4253   basic_block bb;
4254   gimple_stmt_iterator gsi;
4255 
4256   FOR_EACH_BB (bb)
4257     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4258       {
4259 	gimple stmt = gsi_stmt (gsi);
4260 	if (!is_gimple_debug (stmt))
4261 	  walk_gimple_op (stmt, discover_nonconstant_array_refs_r, NULL);
4262       }
4263 }
4264 
4265 /* This function sets crtl->args.internal_arg_pointer to a virtual
4266    register if DRAP is needed.  Local register allocator will replace
4267    virtual_incoming_args_rtx with the virtual register.  */
4268 
4269 static void
4270 expand_stack_alignment (void)
4271 {
4272   rtx drap_rtx;
4273   unsigned int preferred_stack_boundary;
4274 
4275   if (! SUPPORTS_STACK_ALIGNMENT)
4276     return;
4277 
4278   if (cfun->calls_alloca
4279       || cfun->has_nonlocal_label
4280       || crtl->has_nonlocal_goto)
4281     crtl->need_drap = true;
4282 
4283   /* Call update_stack_boundary here again to update incoming stack
4284      boundary.  It may set incoming stack alignment to a different
4285      value after RTL expansion.  TARGET_FUNCTION_OK_FOR_SIBCALL may
4286      use the minimum incoming stack alignment to check if it is OK
4287      to perform sibcall optimization since sibcall optimization will
4288      only align the outgoing stack to incoming stack boundary.  */
4289   if (targetm.calls.update_stack_boundary)
4290     targetm.calls.update_stack_boundary ();
4291 
4292   /* The incoming stack frame has to be aligned at least at
4293      parm_stack_boundary.  */
4294   gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY);
4295 
4296   /* Update crtl->stack_alignment_estimated and use it later to align
4297      stack.  We check PREFERRED_STACK_BOUNDARY if there may be non-call
4298      exceptions since callgraph doesn't collect incoming stack alignment
4299      in this case.  */
4300   if (cfun->can_throw_non_call_exceptions
4301       && PREFERRED_STACK_BOUNDARY > crtl->preferred_stack_boundary)
4302     preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
4303   else
4304     preferred_stack_boundary = crtl->preferred_stack_boundary;
4305   if (preferred_stack_boundary > crtl->stack_alignment_estimated)
4306     crtl->stack_alignment_estimated = preferred_stack_boundary;
4307   if (preferred_stack_boundary > crtl->stack_alignment_needed)
4308     crtl->stack_alignment_needed = preferred_stack_boundary;
4309 
4310   gcc_assert (crtl->stack_alignment_needed
4311 	      <= crtl->stack_alignment_estimated);
4312 
4313   crtl->stack_realign_needed
4314     = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated;
4315   crtl->stack_realign_tried = crtl->stack_realign_needed;
4316 
4317   crtl->stack_realign_processed = true;
4318 
4319   /* Target has to redefine TARGET_GET_DRAP_RTX to support stack
4320      alignment.  */
4321   gcc_assert (targetm.calls.get_drap_rtx != NULL);
4322   drap_rtx = targetm.calls.get_drap_rtx ();
4323 
4324   /* stack_realign_drap and drap_rtx must match.  */
4325   gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL));
4326 
4327   /* Do nothing if NULL is returned, which means DRAP is not needed.  */
4328   if (NULL != drap_rtx)
4329     {
4330       crtl->args.internal_arg_pointer = drap_rtx;
4331 
4332       /* Call fixup_tail_calls to clean up REG_EQUIV note if DRAP is
4333          needed. */
4334       fixup_tail_calls ();
4335     }
4336 }
4337 
4338 /* Translate the intermediate representation contained in the CFG
4339    from GIMPLE trees to RTL.
4340 
4341    We do conversion per basic block and preserve/update the tree CFG.
4342    This implies we have to do some magic as the CFG can simultaneously
4343    consist of basic blocks containing RTL and GIMPLE trees.  This can
4344    confuse the CFG hooks, so be careful to not manipulate CFG during
4345    the expansion.  */
4346 
4347 static unsigned int
4348 gimple_expand_cfg (void)
4349 {
4350   basic_block bb, init_block;
4351   sbitmap blocks;
4352   edge_iterator ei;
4353   edge e;
4354   rtx var_seq;
4355   unsigned i;
4356 
4357   timevar_push (TV_OUT_OF_SSA);
4358   rewrite_out_of_ssa (&SA);
4359   timevar_pop (TV_OUT_OF_SSA);
4360   SA.partition_to_pseudo = (rtx *)xcalloc (SA.map->num_partitions,
4361 					   sizeof (rtx));
4362 
4363   /* Some backends want to know that we are expanding to RTL.  */
4364   currently_expanding_to_rtl = 1;
4365 
4366   rtl_profile_for_bb (ENTRY_BLOCK_PTR);
4367 
4368   insn_locators_alloc ();
4369   if (!DECL_IS_BUILTIN (current_function_decl))
4370     {
4371       /* Eventually, all FEs should explicitly set function_start_locus.  */
4372       if (cfun->function_start_locus == UNKNOWN_LOCATION)
4373        set_curr_insn_source_location
4374          (DECL_SOURCE_LOCATION (current_function_decl));
4375       else
4376        set_curr_insn_source_location (cfun->function_start_locus);
4377     }
4378   else
4379     set_curr_insn_source_location (UNKNOWN_LOCATION);
4380   set_curr_insn_block (DECL_INITIAL (current_function_decl));
4381   prologue_locator = curr_insn_locator ();
4382 
4383 #ifdef INSN_SCHEDULING
4384   init_sched_attrs ();
4385 #endif
4386 
4387   /* Make sure first insn is a note even if we don't want linenums.
4388      This makes sure the first insn will never be deleted.
4389      Also, final expects a note to appear there.  */
4390   emit_note (NOTE_INSN_DELETED);
4391 
4392   /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE.  */
4393   discover_nonconstant_array_refs ();
4394 
4395   targetm.expand_to_rtl_hook ();
4396   crtl->stack_alignment_needed = STACK_BOUNDARY;
4397   crtl->max_used_stack_slot_alignment = STACK_BOUNDARY;
4398   crtl->stack_alignment_estimated = 0;
4399   crtl->preferred_stack_boundary = STACK_BOUNDARY;
4400   cfun->cfg->max_jumptable_ents = 0;
4401 
4402   /* Resovle the function section.  Some targets, like ARM EABI rely on knowledge
4403      of the function section at exapnsion time to predict distance of calls.  */
4404   resolve_unique_section (current_function_decl, 0, flag_function_sections);
4405 
4406   /* Expand the variables recorded during gimple lowering.  */
4407   timevar_push (TV_VAR_EXPAND);
4408   start_sequence ();
4409 
4410   expand_used_vars ();
4411 
4412   var_seq = get_insns ();
4413   end_sequence ();
4414   timevar_pop (TV_VAR_EXPAND);
4415 
4416   /* Honor stack protection warnings.  */
4417   if (warn_stack_protect)
4418     {
4419       if (cfun->calls_alloca)
4420 	warning (OPT_Wstack_protector,
4421 		 "stack protector not protecting local variables: "
4422                  "variable length buffer");
4423       if (has_short_buffer && !crtl->stack_protect_guard)
4424 	warning (OPT_Wstack_protector,
4425 		 "stack protector not protecting function: "
4426                  "all local arrays are less than %d bytes long",
4427 		 (int) PARAM_VALUE (PARAM_SSP_BUFFER_SIZE));
4428     }
4429 
4430   /* Set up parameters and prepare for return, for the function.  */
4431   expand_function_start (current_function_decl);
4432 
4433   /* If we emitted any instructions for setting up the variables,
4434      emit them before the FUNCTION_START note.  */
4435   if (var_seq)
4436     {
4437       emit_insn_before (var_seq, parm_birth_insn);
4438 
4439       /* In expand_function_end we'll insert the alloca save/restore
4440 	 before parm_birth_insn.  We've just insertted an alloca call.
4441 	 Adjust the pointer to match.  */
4442       parm_birth_insn = var_seq;
4443     }
4444 
4445   /* Now that we also have the parameter RTXs, copy them over to our
4446      partitions.  */
4447   for (i = 0; i < SA.map->num_partitions; i++)
4448     {
4449       tree var = SSA_NAME_VAR (partition_to_var (SA.map, i));
4450 
4451       if (TREE_CODE (var) != VAR_DECL
4452 	  && !SA.partition_to_pseudo[i])
4453 	SA.partition_to_pseudo[i] = DECL_RTL_IF_SET (var);
4454       gcc_assert (SA.partition_to_pseudo[i]);
4455 
4456       /* If this decl was marked as living in multiple places, reset
4457          this now to NULL.  */
4458       if (DECL_RTL_IF_SET (var) == pc_rtx)
4459 	SET_DECL_RTL (var, NULL);
4460 
4461       /* Some RTL parts really want to look at DECL_RTL(x) when x
4462          was a decl marked in REG_ATTR or MEM_ATTR.  We could use
4463 	 SET_DECL_RTL here making this available, but that would mean
4464 	 to select one of the potentially many RTLs for one DECL.  Instead
4465 	 of doing that we simply reset the MEM_EXPR of the RTL in question,
4466 	 then nobody can get at it and hence nobody can call DECL_RTL on it.  */
4467       if (!DECL_RTL_SET_P (var))
4468 	{
4469 	  if (MEM_P (SA.partition_to_pseudo[i]))
4470 	    set_mem_expr (SA.partition_to_pseudo[i], NULL);
4471 	}
4472     }
4473 
4474   /* If we have a class containing differently aligned pointers
4475      we need to merge those into the corresponding RTL pointer
4476      alignment.  */
4477   for (i = 1; i < num_ssa_names; i++)
4478     {
4479       tree name = ssa_name (i);
4480       int part;
4481       rtx r;
4482 
4483       if (!name
4484 	  || !POINTER_TYPE_P (TREE_TYPE (name))
4485 	  /* We might have generated new SSA names in
4486 	     update_alias_info_with_stack_vars.  They will have a NULL
4487 	     defining statements, and won't be part of the partitioning,
4488 	     so ignore those.  */
4489 	  || !SSA_NAME_DEF_STMT (name))
4490 	continue;
4491       part = var_to_partition (SA.map, name);
4492       if (part == NO_PARTITION)
4493 	continue;
4494       r = SA.partition_to_pseudo[part];
4495       if (REG_P (r))
4496 	mark_reg_pointer (r, get_pointer_alignment (name));
4497     }
4498 
4499   /* If this function is `main', emit a call to `__main'
4500      to run global initializers, etc.  */
4501   if (DECL_NAME (current_function_decl)
4502       && MAIN_NAME_P (DECL_NAME (current_function_decl))
4503       && DECL_FILE_SCOPE_P (current_function_decl))
4504     expand_main_function ();
4505 
4506   /* Initialize the stack_protect_guard field.  This must happen after the
4507      call to __main (if any) so that the external decl is initialized.  */
4508   if (crtl->stack_protect_guard)
4509     stack_protect_prologue ();
4510 
4511   expand_phi_nodes (&SA);
4512 
4513   /* Register rtl specific functions for cfg.  */
4514   rtl_register_cfg_hooks ();
4515 
4516   init_block = construct_init_block ();
4517 
4518   /* Clear EDGE_EXECUTABLE on the entry edge(s).  It is cleaned from the
4519      remaining edges later.  */
4520   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
4521     e->flags &= ~EDGE_EXECUTABLE;
4522 
4523   lab_rtx_for_bb = pointer_map_create ();
4524   FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR, next_bb)
4525     bb = expand_gimple_basic_block (bb);
4526 
4527   if (MAY_HAVE_DEBUG_INSNS)
4528     expand_debug_locations ();
4529 
4530   execute_free_datastructures ();
4531   timevar_push (TV_OUT_OF_SSA);
4532   finish_out_of_ssa (&SA);
4533   timevar_pop (TV_OUT_OF_SSA);
4534 
4535   timevar_push (TV_POST_EXPAND);
4536   /* We are no longer in SSA form.  */
4537   cfun->gimple_df->in_ssa_p = false;
4538 
4539   /* Expansion is used by optimization passes too, set maybe_hot_insn_p
4540      conservatively to true until they are all profile aware.  */
4541   pointer_map_destroy (lab_rtx_for_bb);
4542   free_histograms ();
4543 
4544   construct_exit_block ();
4545   set_curr_insn_block (DECL_INITIAL (current_function_decl));
4546   insn_locators_finalize ();
4547 
4548   /* Zap the tree EH table.  */
4549   set_eh_throw_stmt_table (cfun, NULL);
4550 
4551   /* We need JUMP_LABEL be set in order to redirect jumps, and hence
4552      split edges which edge insertions might do.  */
4553   rebuild_jump_labels (get_insns ());
4554 
4555   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, EXIT_BLOCK_PTR, next_bb)
4556     {
4557       edge e;
4558       edge_iterator ei;
4559       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
4560 	{
4561 	  if (e->insns.r)
4562 	    {
4563 	      rebuild_jump_labels_chain (e->insns.r);
4564 	      /* Avoid putting insns before parm_birth_insn.  */
4565 	      if (e->src == ENTRY_BLOCK_PTR
4566 		  && single_succ_p (ENTRY_BLOCK_PTR)
4567 		  && parm_birth_insn)
4568 		{
4569 		  rtx insns = e->insns.r;
4570 		  e->insns.r = NULL_RTX;
4571 		  emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
4572 		}
4573 	      else
4574 		commit_one_edge_insertion (e);
4575 	    }
4576 	  else
4577 	    ei_next (&ei);
4578 	}
4579     }
4580 
4581   /* We're done expanding trees to RTL.  */
4582   currently_expanding_to_rtl = 0;
4583 
4584   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR->next_bb, EXIT_BLOCK_PTR, next_bb)
4585     {
4586       edge e;
4587       edge_iterator ei;
4588       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
4589 	{
4590 	  /* Clear EDGE_EXECUTABLE.  This flag is never used in the backend.  */
4591 	  e->flags &= ~EDGE_EXECUTABLE;
4592 
4593 	  /* At the moment not all abnormal edges match the RTL
4594 	     representation.  It is safe to remove them here as
4595 	     find_many_sub_basic_blocks will rediscover them.
4596 	     In the future we should get this fixed properly.  */
4597 	  if ((e->flags & EDGE_ABNORMAL)
4598 	      && !(e->flags & EDGE_SIBCALL))
4599 	    remove_edge (e);
4600 	  else
4601 	    ei_next (&ei);
4602 	}
4603     }
4604 
4605   blocks = sbitmap_alloc (last_basic_block);
4606   sbitmap_ones (blocks);
4607   find_many_sub_basic_blocks (blocks);
4608   sbitmap_free (blocks);
4609   purge_all_dead_edges ();
4610 
4611   compact_blocks ();
4612 
4613   expand_stack_alignment ();
4614 
4615 #ifdef ENABLE_CHECKING
4616   verify_flow_info ();
4617 #endif
4618 
4619   /* There's no need to defer outputting this function any more; we
4620      know we want to output it.  */
4621   DECL_DEFER_OUTPUT (current_function_decl) = 0;
4622 
4623   /* Now that we're done expanding trees to RTL, we shouldn't have any
4624      more CONCATs anywhere.  */
4625   generating_concat_p = 0;
4626 
4627   if (dump_file)
4628     {
4629       fprintf (dump_file,
4630 	       "\n\n;;\n;; Full RTL generated for this function:\n;;\n");
4631       /* And the pass manager will dump RTL for us.  */
4632     }
4633 
4634   /* If we're emitting a nested function, make sure its parent gets
4635      emitted as well.  Doing otherwise confuses debug info.  */
4636   {
4637     tree parent;
4638     for (parent = DECL_CONTEXT (current_function_decl);
4639 	 parent != NULL_TREE;
4640 	 parent = get_containing_scope (parent))
4641       if (TREE_CODE (parent) == FUNCTION_DECL)
4642 	TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
4643   }
4644 
4645   /* We are now committed to emitting code for this function.  Do any
4646      preparation, such as emitting abstract debug info for the inline
4647      before it gets mangled by optimization.  */
4648   if (cgraph_function_possibly_inlined_p (current_function_decl))
4649     (*debug_hooks->outlining_inline_function) (current_function_decl);
4650 
4651   TREE_ASM_WRITTEN (current_function_decl) = 1;
4652 
4653   /* After expanding, the return labels are no longer needed. */
4654   return_label = NULL;
4655   naked_return_label = NULL;
4656 
4657   /* After expanding, the tm_restart map is no longer needed.  */
4658   if (cfun->gimple_df->tm_restart)
4659     {
4660       htab_delete (cfun->gimple_df->tm_restart);
4661       cfun->gimple_df->tm_restart = NULL;
4662     }
4663 
4664   /* Tag the blocks with a depth number so that change_scope can find
4665      the common parent easily.  */
4666   set_block_levels (DECL_INITIAL (cfun->decl), 0);
4667   default_rtl_profile ();
4668   timevar_pop (TV_POST_EXPAND);
4669   return 0;
4670 }
4671 
4672 struct rtl_opt_pass pass_expand =
4673 {
4674  {
4675   RTL_PASS,
4676   "expand",				/* name */
4677   NULL,                                 /* gate */
4678   gimple_expand_cfg,			/* execute */
4679   NULL,                                 /* sub */
4680   NULL,                                 /* next */
4681   0,                                    /* static_pass_number */
4682   TV_EXPAND,				/* tv_id */
4683   PROP_ssa | PROP_gimple_leh | PROP_cfg
4684     | PROP_gimple_lcx,			/* properties_required */
4685   PROP_rtl,                             /* properties_provided */
4686   PROP_ssa | PROP_trees,		/* properties_destroyed */
4687   TODO_verify_ssa | TODO_verify_flow
4688     | TODO_verify_stmts,		/* todo_flags_start */
4689   TODO_ggc_collect			/* todo_flags_finish */
4690  }
4691 };
4692