OSDN Git Service

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