OSDN Git Service

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