OSDN Git Service

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