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