1 /* A pass for lowering trees to RTL.
2 Copyright (C) 2004-2022 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "cfghooks.h"
29 #include "tree-pass.h"
30 #include "memmodel.h"
31 #include "tm_p.h"
32 #include "ssa.h"
33 #include "optabs.h"
34 #include "regs.h" /* For reg_renumber. */
35 #include "emit-rtl.h"
36 #include "recog.h"
37 #include "cgraph.h"
38 #include "diagnostic.h"
39 #include "fold-const.h"
40 #include "varasm.h"
41 #include "stor-layout.h"
42 #include "stmt.h"
43 #include "print-tree.h"
44 #include "cfgrtl.h"
45 #include "cfganal.h"
46 #include "cfgbuild.h"
47 #include "cfgcleanup.h"
48 #include "dojump.h"
49 #include "explow.h"
50 #include "calls.h"
51 #include "expr.h"
52 #include "internal-fn.h"
53 #include "tree-eh.h"
54 #include "gimple-iterator.h"
55 #include "gimple-expr.h"
56 #include "gimple-walk.h"
57 #include "tree-cfg.h"
58 #include "tree-dfa.h"
59 #include "tree-ssa.h"
60 #include "except.h"
61 #include "gimple-pretty-print.h"
62 #include "toplev.h"
63 #include "debug.h"
64 #include "tree-inline.h"
65 #include "value-prof.h"
66 #include "tree-ssa-live.h"
67 #include "tree-outof-ssa.h"
68 #include "cfgloop.h"
69 #include "insn-attr.h" /* For INSN_SCHEDULING. */
70 #include "stringpool.h"
71 #include "attribs.h"
72 #include "asan.h"
73 #include "tree-ssa-address.h"
74 #include "output.h"
75 #include "builtins.h"
76 #include "opts.h"
77
78 /* Some systems use __main in a way incompatible with its use in gcc, in these
79 cases use the macros NAME__MAIN to give a quoted symbol and SYMBOL__MAIN to
80 give the same symbol without quotes for an alternative entry point. You
81 must define both, or neither. */
82 #ifndef NAME__MAIN
83 #define NAME__MAIN "__main"
84 #endif
85
86 /* This variable holds information helping the rewriting of SSA trees
87 into RTL. */
88 struct ssaexpand SA;
89
90 /* This variable holds the currently expanded gimple statement for purposes
91 of comminucating the profile info to the builtin expanders. */
92 gimple *currently_expanding_gimple_stmt;
93
94 static rtx expand_debug_expr (tree);
95
96 static bool defer_stack_allocation (tree, bool);
97
98 static void record_alignment_for_reg_var (unsigned int);
99
100 /* Return an expression tree corresponding to the RHS of GIMPLE
101 statement STMT. */
102
103 tree
gimple_assign_rhs_to_tree(gimple * stmt)104 gimple_assign_rhs_to_tree (gimple *stmt)
105 {
106 tree t;
107 switch (gimple_assign_rhs_class (stmt))
108 {
109 case GIMPLE_TERNARY_RHS:
110 t = build3 (gimple_assign_rhs_code (stmt),
111 TREE_TYPE (gimple_assign_lhs (stmt)),
112 gimple_assign_rhs1 (stmt), gimple_assign_rhs2 (stmt),
113 gimple_assign_rhs3 (stmt));
114 break;
115 case GIMPLE_BINARY_RHS:
116 t = build2 (gimple_assign_rhs_code (stmt),
117 TREE_TYPE (gimple_assign_lhs (stmt)),
118 gimple_assign_rhs1 (stmt), gimple_assign_rhs2 (stmt));
119 break;
120 case GIMPLE_UNARY_RHS:
121 t = build1 (gimple_assign_rhs_code (stmt),
122 TREE_TYPE (gimple_assign_lhs (stmt)),
123 gimple_assign_rhs1 (stmt));
124 break;
125 case GIMPLE_SINGLE_RHS:
126 {
127 t = gimple_assign_rhs1 (stmt);
128 /* Avoid modifying this tree in place below. */
129 if ((gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t)
130 && gimple_location (stmt) != EXPR_LOCATION (t))
131 || (gimple_block (stmt) && currently_expanding_to_rtl
132 && EXPR_P (t)))
133 t = copy_node (t);
134 break;
135 }
136 default:
137 gcc_unreachable ();
138 }
139
140 if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (t))
141 SET_EXPR_LOCATION (t, gimple_location (stmt));
142
143 return t;
144 }
145
146
147 #ifndef STACK_ALIGNMENT_NEEDED
148 #define STACK_ALIGNMENT_NEEDED 1
149 #endif
150
151 #define SSAVAR(x) (TREE_CODE (x) == SSA_NAME ? SSA_NAME_VAR (x) : x)
152
153 /* Choose either CUR or NEXT as the leader DECL for a partition.
154 Prefer ignored decls, to simplify debug dumps and reduce ambiguity
155 out of the same user variable being in multiple partitions (this is
156 less likely for compiler-introduced temps). */
157
158 static tree
leader_merge(tree cur,tree next)159 leader_merge (tree cur, tree next)
160 {
161 if (cur == NULL || cur == next)
162 return next;
163
164 if (DECL_P (cur) && DECL_IGNORED_P (cur))
165 return cur;
166
167 if (DECL_P (next) && DECL_IGNORED_P (next))
168 return next;
169
170 return cur;
171 }
172
173 /* Associate declaration T with storage space X. If T is no
174 SSA name this is exactly SET_DECL_RTL, otherwise make the
175 partition of T associated with X. */
176 static inline void
set_rtl(tree t,rtx x)177 set_rtl (tree t, rtx x)
178 {
179 gcc_checking_assert (!x
180 || !(TREE_CODE (t) == SSA_NAME || is_gimple_reg (t))
181 || (use_register_for_decl (t)
182 ? (REG_P (x)
183 || (GET_CODE (x) == CONCAT
184 && (REG_P (XEXP (x, 0))
185 || SUBREG_P (XEXP (x, 0)))
186 && (REG_P (XEXP (x, 1))
187 || SUBREG_P (XEXP (x, 1))))
188 /* We need to accept PARALLELs for RESUT_DECLs
189 because of vector types with BLKmode returned
190 in multiple registers, but they are supposed
191 to be uncoalesced. */
192 || (GET_CODE (x) == PARALLEL
193 && SSAVAR (t)
194 && TREE_CODE (SSAVAR (t)) == RESULT_DECL
195 && (GET_MODE (x) == BLKmode
196 || !flag_tree_coalesce_vars)))
197 : (MEM_P (x) || x == pc_rtx
198 || (GET_CODE (x) == CONCAT
199 && MEM_P (XEXP (x, 0))
200 && MEM_P (XEXP (x, 1))))));
201 /* Check that the RTL for SSA_NAMEs and gimple-reg PARM_DECLs and
202 RESULT_DECLs has the expected mode. For memory, we accept
203 unpromoted modes, since that's what we're likely to get. For
204 PARM_DECLs and RESULT_DECLs, we'll have been called by
205 set_parm_rtl, which will give us the default def, so we don't
206 have to compute it ourselves. For RESULT_DECLs, we accept mode
207 mismatches too, as long as we have BLKmode or are not coalescing
208 across variables, so that we don't reject BLKmode PARALLELs or
209 unpromoted REGs. */
210 gcc_checking_assert (!x || x == pc_rtx || TREE_CODE (t) != SSA_NAME
211 || (SSAVAR (t)
212 && TREE_CODE (SSAVAR (t)) == RESULT_DECL
213 && (promote_ssa_mode (t, NULL) == BLKmode
214 || !flag_tree_coalesce_vars))
215 || !use_register_for_decl (t)
216 || GET_MODE (x) == promote_ssa_mode (t, NULL));
217
218 if (x)
219 {
220 bool skip = false;
221 tree cur = NULL_TREE;
222 rtx xm = x;
223
224 retry:
225 if (MEM_P (xm))
226 cur = MEM_EXPR (xm);
227 else if (REG_P (xm))
228 cur = REG_EXPR (xm);
229 else if (SUBREG_P (xm))
230 {
231 gcc_assert (subreg_lowpart_p (xm));
232 xm = SUBREG_REG (xm);
233 goto retry;
234 }
235 else if (GET_CODE (xm) == CONCAT)
236 {
237 xm = XEXP (xm, 0);
238 goto retry;
239 }
240 else if (GET_CODE (xm) == PARALLEL)
241 {
242 xm = XVECEXP (xm, 0, 0);
243 gcc_assert (GET_CODE (xm) == EXPR_LIST);
244 xm = XEXP (xm, 0);
245 goto retry;
246 }
247 else if (xm == pc_rtx)
248 skip = true;
249 else
250 gcc_unreachable ();
251
252 tree next = skip ? cur : leader_merge (cur, SSAVAR (t) ? SSAVAR (t) : t);
253
254 if (cur != next)
255 {
256 if (MEM_P (x))
257 set_mem_attributes (x,
258 next && TREE_CODE (next) == SSA_NAME
259 ? TREE_TYPE (next)
260 : next, true);
261 else
262 set_reg_attrs_for_decl_rtl (next, x);
263 }
264 }
265
266 if (TREE_CODE (t) == SSA_NAME)
267 {
268 int part = var_to_partition (SA.map, t);
269 if (part != NO_PARTITION)
270 {
271 if (SA.partition_to_pseudo[part])
272 gcc_assert (SA.partition_to_pseudo[part] == x);
273 else if (x != pc_rtx)
274 SA.partition_to_pseudo[part] = x;
275 }
276 /* For the benefit of debug information at -O0 (where
277 vartracking doesn't run) record the place also in the base
278 DECL. For PARMs and RESULTs, do so only when setting the
279 default def. */
280 if (x && x != pc_rtx && SSA_NAME_VAR (t)
281 && (VAR_P (SSA_NAME_VAR (t))
282 || SSA_NAME_IS_DEFAULT_DEF (t)))
283 {
284 tree var = SSA_NAME_VAR (t);
285 /* If we don't yet have something recorded, just record it now. */
286 if (!DECL_RTL_SET_P (var))
287 SET_DECL_RTL (var, x);
288 /* If we have it set already to "multiple places" don't
289 change this. */
290 else if (DECL_RTL (var) == pc_rtx)
291 ;
292 /* If we have something recorded and it's not the same place
293 as we want to record now, we have multiple partitions for the
294 same base variable, with different places. We can't just
295 randomly chose one, hence we have to say that we don't know.
296 This only happens with optimization, and there var-tracking
297 will figure out the right thing. */
298 else if (DECL_RTL (var) != x)
299 SET_DECL_RTL (var, pc_rtx);
300 }
301 }
302 else
303 SET_DECL_RTL (t, x);
304 }
305
306 /* This structure holds data relevant to one variable that will be
307 placed in a stack slot. */
308 class stack_var
309 {
310 public:
311 /* The Variable. */
312 tree decl;
313
314 /* Initially, the size of the variable. Later, the size of the partition,
315 if this variable becomes it's partition's representative. */
316 poly_uint64 size;
317
318 /* The *byte* alignment required for this variable. Or as, with the
319 size, the alignment for this partition. */
320 unsigned int alignb;
321
322 /* The partition representative. */
323 size_t representative;
324
325 /* The next stack variable in the partition, or EOC. */
326 size_t next;
327
328 /* The numbers of conflicting stack variables. */
329 bitmap conflicts;
330 };
331
332 #define EOC ((size_t)-1)
333
334 /* We have an array of such objects while deciding allocation. */
335 static class stack_var *stack_vars;
336 static size_t stack_vars_alloc;
337 static size_t stack_vars_num;
338 static hash_map<tree, size_t> *decl_to_stack_part;
339
340 /* Conflict bitmaps go on this obstack. This allows us to destroy
341 all of them in one big sweep. */
342 static bitmap_obstack stack_var_bitmap_obstack;
343
344 /* An array of indices such that stack_vars[stack_vars_sorted[i]].size
345 is non-decreasing. */
346 static size_t *stack_vars_sorted;
347
348 /* The phase of the stack frame. This is the known misalignment of
349 virtual_stack_vars_rtx from PREFERRED_STACK_BOUNDARY. That is,
350 (frame_offset+frame_phase) % PREFERRED_STACK_BOUNDARY == 0. */
351 static int frame_phase;
352
353 /* Used during expand_used_vars to remember if we saw any decls for
354 which we'd like to enable stack smashing protection. */
355 static bool has_protected_decls;
356
357 /* Used during expand_used_vars. Remember if we say a character buffer
358 smaller than our cutoff threshold. Used for -Wstack-protector. */
359 static bool has_short_buffer;
360
361 /* Compute the byte alignment to use for DECL. Ignore alignment
362 we can't do with expected alignment of the stack boundary. */
363
364 static unsigned int
align_local_variable(tree decl,bool really_expand)365 align_local_variable (tree decl, bool really_expand)
366 {
367 unsigned int align;
368
369 if (TREE_CODE (decl) == SSA_NAME)
370 {
371 tree type = TREE_TYPE (decl);
372 machine_mode mode = TYPE_MODE (type);
373
374 align = TYPE_ALIGN (type);
375 if (mode != BLKmode
376 && align < GET_MODE_ALIGNMENT (mode))
377 align = GET_MODE_ALIGNMENT (mode);
378 }
379 else
380 align = LOCAL_DECL_ALIGNMENT (decl);
381
382 if (hwasan_sanitize_stack_p ())
383 align = MAX (align, (unsigned) HWASAN_TAG_GRANULE_SIZE * BITS_PER_UNIT);
384
385 if (TREE_CODE (decl) != SSA_NAME && really_expand)
386 /* Don't change DECL_ALIGN when called from estimated_stack_frame_size.
387 That is done before IPA and could bump alignment based on host
388 backend even for offloaded code which wants different
389 LOCAL_DECL_ALIGNMENT. */
390 SET_DECL_ALIGN (decl, align);
391
392 return align / BITS_PER_UNIT;
393 }
394
395 /* Align given offset BASE with ALIGN. Truncate up if ALIGN_UP is true,
396 down otherwise. Return truncated BASE value. */
397
398 static inline unsigned HOST_WIDE_INT
align_base(HOST_WIDE_INT base,unsigned HOST_WIDE_INT align,bool align_up)399 align_base (HOST_WIDE_INT base, unsigned HOST_WIDE_INT align, bool align_up)
400 {
401 return align_up ? (base + align - 1) & -align : base & -align;
402 }
403
404 /* Allocate SIZE bytes at byte alignment ALIGN from the stack frame.
405 Return the frame offset. */
406
407 static poly_int64
alloc_stack_frame_space(poly_int64 size,unsigned HOST_WIDE_INT align)408 alloc_stack_frame_space (poly_int64 size, unsigned HOST_WIDE_INT align)
409 {
410 poly_int64 offset, new_frame_offset;
411
412 if (FRAME_GROWS_DOWNWARD)
413 {
414 new_frame_offset
415 = aligned_lower_bound (frame_offset - frame_phase - size,
416 align) + frame_phase;
417 offset = new_frame_offset;
418 }
419 else
420 {
421 new_frame_offset
422 = aligned_upper_bound (frame_offset - frame_phase,
423 align) + frame_phase;
424 offset = new_frame_offset;
425 new_frame_offset += size;
426 }
427 frame_offset = new_frame_offset;
428
429 if (frame_offset_overflow (frame_offset, cfun->decl))
430 frame_offset = offset = 0;
431
432 return offset;
433 }
434
435 /* Ensure that the stack is aligned to ALIGN bytes.
436 Return the new frame offset. */
437 static poly_int64
align_frame_offset(unsigned HOST_WIDE_INT align)438 align_frame_offset (unsigned HOST_WIDE_INT align)
439 {
440 return alloc_stack_frame_space (0, align);
441 }
442
443 /* Accumulate DECL into STACK_VARS. */
444
445 static void
add_stack_var(tree decl,bool really_expand)446 add_stack_var (tree decl, bool really_expand)
447 {
448 class stack_var *v;
449
450 if (stack_vars_num >= stack_vars_alloc)
451 {
452 if (stack_vars_alloc)
453 stack_vars_alloc = stack_vars_alloc * 3 / 2;
454 else
455 stack_vars_alloc = 32;
456 stack_vars
457 = XRESIZEVEC (class stack_var, stack_vars, stack_vars_alloc);
458 }
459 if (!decl_to_stack_part)
460 decl_to_stack_part = new hash_map<tree, size_t>;
461
462 v = &stack_vars[stack_vars_num];
463 decl_to_stack_part->put (decl, stack_vars_num);
464
465 v->decl = decl;
466 tree size = TREE_CODE (decl) == SSA_NAME
467 ? TYPE_SIZE_UNIT (TREE_TYPE (decl))
468 : DECL_SIZE_UNIT (decl);
469 v->size = tree_to_poly_uint64 (size);
470 /* Ensure that all variables have size, so that &a != &b for any two
471 variables that are simultaneously live. */
472 if (known_eq (v->size, 0U))
473 v->size = 1;
474 v->alignb = align_local_variable (decl, really_expand);
475 /* An alignment of zero can mightily confuse us later. */
476 gcc_assert (v->alignb != 0);
477
478 /* All variables are initially in their own partition. */
479 v->representative = stack_vars_num;
480 v->next = EOC;
481
482 /* All variables initially conflict with no other. */
483 v->conflicts = NULL;
484
485 /* Ensure that this decl doesn't get put onto the list twice. */
486 set_rtl (decl, pc_rtx);
487
488 stack_vars_num++;
489 }
490
491 /* Make the decls associated with luid's X and Y conflict. */
492
493 static void
add_stack_var_conflict(size_t x,size_t y)494 add_stack_var_conflict (size_t x, size_t y)
495 {
496 class stack_var *a = &stack_vars[x];
497 class stack_var *b = &stack_vars[y];
498 if (x == y)
499 return;
500 if (!a->conflicts)
501 a->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack);
502 if (!b->conflicts)
503 b->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack);
504 bitmap_set_bit (a->conflicts, y);
505 bitmap_set_bit (b->conflicts, x);
506 }
507
508 /* Check whether the decls associated with luid's X and Y conflict. */
509
510 static bool
stack_var_conflict_p(size_t x,size_t y)511 stack_var_conflict_p (size_t x, size_t y)
512 {
513 class stack_var *a = &stack_vars[x];
514 class stack_var *b = &stack_vars[y];
515 if (x == y)
516 return false;
517 /* Partitions containing an SSA name result from gimple registers
518 with things like unsupported modes. They are top-level and
519 hence conflict with everything else. */
520 if (TREE_CODE (a->decl) == SSA_NAME || TREE_CODE (b->decl) == SSA_NAME)
521 return true;
522
523 if (!a->conflicts || !b->conflicts)
524 return false;
525 return bitmap_bit_p (a->conflicts, y);
526 }
527
528 /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var
529 enter its partition number into bitmap DATA. */
530
531 static bool
visit_op(gimple *,tree op,tree,void * data)532 visit_op (gimple *, tree op, tree, void *data)
533 {
534 bitmap active = (bitmap)data;
535 op = get_base_address (op);
536 if (op
537 && DECL_P (op)
538 && DECL_RTL_IF_SET (op) == pc_rtx)
539 {
540 size_t *v = decl_to_stack_part->get (op);
541 if (v)
542 bitmap_set_bit (active, *v);
543 }
544 return false;
545 }
546
547 /* Callback for walk_stmt_ops. If OP is a decl touched by add_stack_var
548 record conflicts between it and all currently active other partitions
549 from bitmap DATA. */
550
551 static bool
visit_conflict(gimple *,tree op,tree,void * data)552 visit_conflict (gimple *, tree op, tree, void *data)
553 {
554 bitmap active = (bitmap)data;
555 op = get_base_address (op);
556 if (op
557 && DECL_P (op)
558 && DECL_RTL_IF_SET (op) == pc_rtx)
559 {
560 size_t *v = decl_to_stack_part->get (op);
561 if (v && bitmap_set_bit (active, *v))
562 {
563 size_t num = *v;
564 bitmap_iterator bi;
565 unsigned i;
566 gcc_assert (num < stack_vars_num);
567 EXECUTE_IF_SET_IN_BITMAP (active, 0, i, bi)
568 add_stack_var_conflict (num, i);
569 }
570 }
571 return false;
572 }
573
574 /* Helper function for add_scope_conflicts_1. For USE on
575 a stmt, if it is a SSA_NAME and in its SSA_NAME_DEF_STMT is known to be
576 based on some ADDR_EXPR, invoke VISIT on that ADDR_EXPR. */
577
578 static inline void
add_scope_conflicts_2(tree use,bitmap work,walk_stmt_load_store_addr_fn visit)579 add_scope_conflicts_2 (tree use, bitmap work,
580 walk_stmt_load_store_addr_fn visit)
581 {
582 if (TREE_CODE (use) == SSA_NAME
583 && (POINTER_TYPE_P (TREE_TYPE (use))
584 || INTEGRAL_TYPE_P (TREE_TYPE (use))))
585 {
586 gimple *g = SSA_NAME_DEF_STMT (use);
587 if (is_gimple_assign (g))
588 if (tree op = gimple_assign_rhs1 (g))
589 if (TREE_CODE (op) == ADDR_EXPR)
590 visit (g, TREE_OPERAND (op, 0), op, work);
591 }
592 }
593
594 /* Helper routine for add_scope_conflicts, calculating the active partitions
595 at the end of BB, leaving the result in WORK. We're called to generate
596 conflicts when FOR_CONFLICT is true, otherwise we're just tracking
597 liveness. */
598
599 static void
add_scope_conflicts_1(basic_block bb,bitmap work,bool for_conflict)600 add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict)
601 {
602 edge e;
603 edge_iterator ei;
604 gimple_stmt_iterator gsi;
605 walk_stmt_load_store_addr_fn visit;
606 use_operand_p use_p;
607 ssa_op_iter iter;
608
609 bitmap_clear (work);
610 FOR_EACH_EDGE (e, ei, bb->preds)
611 bitmap_ior_into (work, (bitmap)e->src->aux);
612
613 visit = visit_op;
614
615 for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
616 {
617 gimple *stmt = gsi_stmt (gsi);
618 gphi *phi = as_a <gphi *> (stmt);
619 walk_stmt_load_store_addr_ops (stmt, work, NULL, NULL, visit);
620 FOR_EACH_PHI_ARG (use_p, phi, iter, SSA_OP_USE)
621 add_scope_conflicts_2 (USE_FROM_PTR (use_p), work, visit);
622 }
623 for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi))
624 {
625 gimple *stmt = gsi_stmt (gsi);
626
627 if (gimple_clobber_p (stmt))
628 {
629 tree lhs = gimple_assign_lhs (stmt);
630 size_t *v;
631 /* Nested function lowering might introduce LHSs
632 that are COMPONENT_REFs. */
633 if (!VAR_P (lhs))
634 continue;
635 if (DECL_RTL_IF_SET (lhs) == pc_rtx
636 && (v = decl_to_stack_part->get (lhs)))
637 bitmap_clear_bit (work, *v);
638 }
639 else if (!is_gimple_debug (stmt))
640 {
641 if (for_conflict && visit == visit_op)
642 {
643 /* If this is the first real instruction in this BB we need
644 to add conflicts for everything live at this point now.
645 Unlike classical liveness for named objects we can't
646 rely on seeing a def/use of the names we're interested in.
647 There might merely be indirect loads/stores. We'd not add any
648 conflicts for such partitions. */
649 bitmap_iterator bi;
650 unsigned i;
651 EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi)
652 {
653 class stack_var *a = &stack_vars[i];
654 if (!a->conflicts)
655 a->conflicts = BITMAP_ALLOC (&stack_var_bitmap_obstack);
656 bitmap_ior_into (a->conflicts, work);
657 }
658 visit = visit_conflict;
659 }
660 walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit);
661 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
662 add_scope_conflicts_2 (USE_FROM_PTR (use_p), work, visit);
663 }
664 }
665 }
666
667 /* Generate stack partition conflicts between all partitions that are
668 simultaneously live. */
669
670 static void
add_scope_conflicts(void)671 add_scope_conflicts (void)
672 {
673 basic_block bb;
674 bool changed;
675 bitmap work = BITMAP_ALLOC (NULL);
676 int *rpo;
677 int n_bbs;
678
679 /* We approximate the live range of a stack variable by taking the first
680 mention of its name as starting point(s), and by the end-of-scope
681 death clobber added by gimplify as ending point(s) of the range.
682 This overapproximates in the case we for instance moved an address-taken
683 operation upward, without also moving a dereference to it upwards.
684 But it's conservatively correct as a variable never can hold values
685 before its name is mentioned at least once.
686
687 We then do a mostly classical bitmap liveness algorithm. */
688
689 FOR_ALL_BB_FN (bb, cfun)
690 bb->aux = BITMAP_ALLOC (&stack_var_bitmap_obstack);
691
692 rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
693 n_bbs = pre_and_rev_post_order_compute (NULL, rpo, false);
694
695 changed = true;
696 while (changed)
697 {
698 int i;
699 changed = false;
700 for (i = 0; i < n_bbs; i++)
701 {
702 bitmap active;
703 bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
704 active = (bitmap)bb->aux;
705 add_scope_conflicts_1 (bb, work, false);
706 if (bitmap_ior_into (active, work))
707 changed = true;
708 }
709 }
710
711 FOR_EACH_BB_FN (bb, cfun)
712 add_scope_conflicts_1 (bb, work, true);
713
714 free (rpo);
715 BITMAP_FREE (work);
716 FOR_ALL_BB_FN (bb, cfun)
717 BITMAP_FREE (bb->aux);
718 }
719
720 /* A subroutine of partition_stack_vars. A comparison function for qsort,
721 sorting an array of indices by the properties of the object. */
722
723 static int
stack_var_cmp(const void * a,const void * b)724 stack_var_cmp (const void *a, const void *b)
725 {
726 size_t ia = *(const size_t *)a;
727 size_t ib = *(const size_t *)b;
728 unsigned int aligna = stack_vars[ia].alignb;
729 unsigned int alignb = stack_vars[ib].alignb;
730 poly_int64 sizea = stack_vars[ia].size;
731 poly_int64 sizeb = stack_vars[ib].size;
732 tree decla = stack_vars[ia].decl;
733 tree declb = stack_vars[ib].decl;
734 bool largea, largeb;
735 unsigned int uida, uidb;
736
737 /* Primary compare on "large" alignment. Large comes first. */
738 largea = (aligna * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT);
739 largeb = (alignb * BITS_PER_UNIT > MAX_SUPPORTED_STACK_ALIGNMENT);
740 if (largea != largeb)
741 return (int)largeb - (int)largea;
742
743 /* Secondary compare on size, decreasing */
744 int diff = compare_sizes_for_sort (sizeb, sizea);
745 if (diff != 0)
746 return diff;
747
748 /* Tertiary compare on true alignment, decreasing. */
749 if (aligna < alignb)
750 return -1;
751 if (aligna > alignb)
752 return 1;
753
754 /* Final compare on ID for sort stability, increasing.
755 Two SSA names are compared by their version, SSA names come before
756 non-SSA names, and two normal decls are compared by their DECL_UID. */
757 if (TREE_CODE (decla) == SSA_NAME)
758 {
759 if (TREE_CODE (declb) == SSA_NAME)
760 uida = SSA_NAME_VERSION (decla), uidb = SSA_NAME_VERSION (declb);
761 else
762 return -1;
763 }
764 else if (TREE_CODE (declb) == SSA_NAME)
765 return 1;
766 else
767 uida = DECL_UID (decla), uidb = DECL_UID (declb);
768 if (uida < uidb)
769 return 1;
770 if (uida > uidb)
771 return -1;
772 return 0;
773 }
774
775 struct part_traits : unbounded_int_hashmap_traits <size_t, bitmap> {};
776 typedef hash_map<size_t, bitmap, part_traits> part_hashmap;
777
778 /* If the points-to solution *PI points to variables that are in a partition
779 together with other variables add all partition members to the pointed-to
780 variables bitmap. */
781
782 static void
add_partitioned_vars_to_ptset(struct pt_solution * pt,part_hashmap * decls_to_partitions,hash_set<bitmap> * visited,bitmap temp)783 add_partitioned_vars_to_ptset (struct pt_solution *pt,
784 part_hashmap *decls_to_partitions,
785 hash_set<bitmap> *visited, bitmap temp)
786 {
787 bitmap_iterator bi;
788 unsigned i;
789 bitmap *part;
790
791 if (pt->anything
792 || pt->vars == NULL
793 /* The pointed-to vars bitmap is shared, it is enough to
794 visit it once. */
795 || visited->add (pt->vars))
796 return;
797
798 bitmap_clear (temp);
799
800 /* By using a temporary bitmap to store all members of the partitions
801 we have to add we make sure to visit each of the partitions only
802 once. */
803 EXECUTE_IF_SET_IN_BITMAP (pt->vars, 0, i, bi)
804 if ((!temp
805 || !bitmap_bit_p (temp, i))
806 && (part = decls_to_partitions->get (i)))
807 bitmap_ior_into (temp, *part);
808 if (!bitmap_empty_p (temp))
809 bitmap_ior_into (pt->vars, temp);
810 }
811
812 /* Update points-to sets based on partition info, so we can use them on RTL.
813 The bitmaps representing stack partitions will be saved until expand,
814 where partitioned decls used as bases in memory expressions will be
815 rewritten. */
816
817 static void
update_alias_info_with_stack_vars(void)818 update_alias_info_with_stack_vars (void)
819 {
820 part_hashmap *decls_to_partitions = NULL;
821 size_t i, j;
822 tree var = NULL_TREE;
823
824 for (i = 0; i < stack_vars_num; i++)
825 {
826 bitmap part = NULL;
827 tree name;
828 struct ptr_info_def *pi;
829
830 /* Not interested in partitions with single variable. */
831 if (stack_vars[i].representative != i
832 || stack_vars[i].next == EOC)
833 continue;
834
835 if (!decls_to_partitions)
836 {
837 decls_to_partitions = new part_hashmap;
838 cfun->gimple_df->decls_to_pointers = new hash_map<tree, tree>;
839 }
840
841 /* Create an SSA_NAME that points to the partition for use
842 as base during alias-oracle queries on RTL for bases that
843 have been partitioned. */
844 if (var == NULL_TREE)
845 var = create_tmp_var (ptr_type_node);
846 name = make_ssa_name (var);
847
848 /* Create bitmaps representing partitions. They will be used for
849 points-to sets later, so use GGC alloc. */
850 part = BITMAP_GGC_ALLOC ();
851 for (j = i; j != EOC; j = stack_vars[j].next)
852 {
853 tree decl = stack_vars[j].decl;
854 unsigned int uid = DECL_PT_UID (decl);
855 bitmap_set_bit (part, uid);
856 decls_to_partitions->put (uid, part);
857 cfun->gimple_df->decls_to_pointers->put (decl, name);
858 if (TREE_ADDRESSABLE (decl))
859 TREE_ADDRESSABLE (name) = 1;
860 }
861
862 /* Make the SSA name point to all partition members. */
863 pi = get_ptr_info (name);
864 pt_solution_set (&pi->pt, part, false);
865 }
866
867 /* Make all points-to sets that contain one member of a partition
868 contain all members of the partition. */
869 if (decls_to_partitions)
870 {
871 unsigned i;
872 tree name;
873 hash_set<bitmap> visited;
874 bitmap temp = BITMAP_ALLOC (&stack_var_bitmap_obstack);
875
876 FOR_EACH_SSA_NAME (i, name, cfun)
877 {
878 struct ptr_info_def *pi;
879
880 if (POINTER_TYPE_P (TREE_TYPE (name))
881 && ((pi = SSA_NAME_PTR_INFO (name)) != NULL))
882 add_partitioned_vars_to_ptset (&pi->pt, decls_to_partitions,
883 &visited, temp);
884 }
885
886 add_partitioned_vars_to_ptset (&cfun->gimple_df->escaped,
887 decls_to_partitions, &visited, temp);
888
889 delete decls_to_partitions;
890 BITMAP_FREE (temp);
891 }
892 }
893
894 /* A subroutine of partition_stack_vars. The UNION portion of a UNION/FIND
895 partitioning algorithm. Partitions A and B are known to be non-conflicting.
896 Merge them into a single partition A. */
897
898 static void
union_stack_vars(size_t a,size_t b)899 union_stack_vars (size_t a, size_t b)
900 {
901 class stack_var *vb = &stack_vars[b];
902 bitmap_iterator bi;
903 unsigned u;
904
905 gcc_assert (stack_vars[b].next == EOC);
906 /* Add B to A's partition. */
907 stack_vars[b].next = stack_vars[a].next;
908 stack_vars[b].representative = a;
909 stack_vars[a].next = b;
910
911 /* Make sure A is big enough to hold B. */
912 stack_vars[a].size = upper_bound (stack_vars[a].size, stack_vars[b].size);
913
914 /* Update the required alignment of partition A to account for B. */
915 if (stack_vars[a].alignb < stack_vars[b].alignb)
916 stack_vars[a].alignb = stack_vars[b].alignb;
917
918 /* Update the interference graph and merge the conflicts. */
919 if (vb->conflicts)
920 {
921 EXECUTE_IF_SET_IN_BITMAP (vb->conflicts, 0, u, bi)
922 add_stack_var_conflict (a, stack_vars[u].representative);
923 BITMAP_FREE (vb->conflicts);
924 }
925 }
926
927 /* A subroutine of expand_used_vars. Binpack the variables into
928 partitions constrained by the interference graph. The overall
929 algorithm used is as follows:
930
931 Sort the objects by size in descending order.
932 For each object A {
933 S = size(A)
934 O = 0
935 loop {
936 Look for the largest non-conflicting object B with size <= S.
937 UNION (A, B)
938 }
939 }
940 */
941
942 static void
partition_stack_vars(void)943 partition_stack_vars (void)
944 {
945 size_t si, sj, n = stack_vars_num;
946
947 stack_vars_sorted = XNEWVEC (size_t, stack_vars_num);
948 for (si = 0; si < n; ++si)
949 stack_vars_sorted[si] = si;
950
951 if (n == 1)
952 return;
953
954 qsort (stack_vars_sorted, n, sizeof (size_t), stack_var_cmp);
955
956 for (si = 0; si < n; ++si)
957 {
958 size_t i = stack_vars_sorted[si];
959 unsigned int ialign = stack_vars[i].alignb;
960 poly_int64 isize = stack_vars[i].size;
961
962 /* Ignore objects that aren't partition representatives. If we
963 see a var that is not a partition representative, it must
964 have been merged earlier. */
965 if (stack_vars[i].representative != i)
966 continue;
967
968 for (sj = si + 1; sj < n; ++sj)
969 {
970 size_t j = stack_vars_sorted[sj];
971 unsigned int jalign = stack_vars[j].alignb;
972 poly_int64 jsize = stack_vars[j].size;
973
974 /* Ignore objects that aren't partition representatives. */
975 if (stack_vars[j].representative != j)
976 continue;
977
978 /* Do not mix objects of "small" (supported) alignment
979 and "large" (unsupported) alignment. */
980 if ((ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
981 != (jalign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT))
982 break;
983
984 /* For Address Sanitizer do not mix objects with different
985 sizes, as the shorter vars wouldn't be adequately protected.
986 Don't do that for "large" (unsupported) alignment objects,
987 those aren't protected anyway. */
988 if (asan_sanitize_stack_p ()
989 && maybe_ne (isize, jsize)
990 && ialign * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
991 break;
992
993 /* Ignore conflicting objects. */
994 if (stack_var_conflict_p (i, j))
995 continue;
996
997 /* UNION the objects, placing J at OFFSET. */
998 union_stack_vars (i, j);
999 }
1000 }
1001
1002 update_alias_info_with_stack_vars ();
1003 }
1004
1005 /* A debugging aid for expand_used_vars. Dump the generated partitions. */
1006
1007 static void
dump_stack_var_partition(void)1008 dump_stack_var_partition (void)
1009 {
1010 size_t si, i, j, n = stack_vars_num;
1011
1012 for (si = 0; si < n; ++si)
1013 {
1014 i = stack_vars_sorted[si];
1015
1016 /* Skip variables that aren't partition representatives, for now. */
1017 if (stack_vars[i].representative != i)
1018 continue;
1019
1020 fprintf (dump_file, "Partition %lu: size ", (unsigned long) i);
1021 print_dec (stack_vars[i].size, dump_file);
1022 fprintf (dump_file, " align %u\n", stack_vars[i].alignb);
1023
1024 for (j = i; j != EOC; j = stack_vars[j].next)
1025 {
1026 fputc ('\t', dump_file);
1027 print_generic_expr (dump_file, stack_vars[j].decl, dump_flags);
1028 }
1029 fputc ('\n', dump_file);
1030 }
1031 }
1032
1033 /* Assign rtl to DECL at BASE + OFFSET. */
1034
1035 static void
expand_one_stack_var_at(tree decl,rtx base,unsigned base_align,poly_int64 offset)1036 expand_one_stack_var_at (tree decl, rtx base, unsigned base_align,
1037 poly_int64 offset)
1038 {
1039 unsigned align;
1040 rtx x;
1041
1042 /* If this fails, we've overflowed the stack frame. Error nicely? */
1043 gcc_assert (known_eq (offset, trunc_int_for_mode (offset, Pmode)));
1044
1045 if (hwasan_sanitize_stack_p ())
1046 x = targetm.memtag.add_tag (base, offset,
1047 hwasan_current_frame_tag ());
1048 else
1049 x = plus_constant (Pmode, base, offset);
1050
1051 x = gen_rtx_MEM (TREE_CODE (decl) == SSA_NAME
1052 ? TYPE_MODE (TREE_TYPE (decl))
1053 : DECL_MODE (decl), x);
1054
1055 /* Set alignment we actually gave this decl if it isn't an SSA name.
1056 If it is we generate stack slots only accidentally so it isn't as
1057 important, we'll simply set the alignment directly on the MEM. */
1058
1059 if (stack_vars_base_reg_p (base))
1060 offset -= frame_phase;
1061 align = known_alignment (offset);
1062 align *= BITS_PER_UNIT;
1063 if (align == 0 || align > base_align)
1064 align = base_align;
1065
1066 if (TREE_CODE (decl) != SSA_NAME)
1067 {
1068 /* One would think that we could assert that we're not decreasing
1069 alignment here, but (at least) the i386 port does exactly this
1070 via the MINIMUM_ALIGNMENT hook. */
1071
1072 SET_DECL_ALIGN (decl, align);
1073 DECL_USER_ALIGN (decl) = 0;
1074 }
1075
1076 set_rtl (decl, x);
1077
1078 set_mem_align (x, align);
1079 }
1080
1081 class stack_vars_data
1082 {
1083 public:
1084 /* Vector of offset pairs, always end of some padding followed
1085 by start of the padding that needs Address Sanitizer protection.
1086 The vector is in reversed, highest offset pairs come first. */
1087 auto_vec<HOST_WIDE_INT> asan_vec;
1088
1089 /* Vector of partition representative decls in between the paddings. */
1090 auto_vec<tree> asan_decl_vec;
1091
1092 /* Base pseudo register for Address Sanitizer protected automatic vars. */
1093 rtx asan_base;
1094
1095 /* Alignment needed for the Address Sanitizer protected automatic vars. */
1096 unsigned int asan_alignb;
1097 };
1098
1099 /* A subroutine of expand_used_vars. Give each partition representative
1100 a unique location within the stack frame. Update each partition member
1101 with that location. */
1102 static void
expand_stack_vars(bool (* pred)(size_t),class stack_vars_data * data)1103 expand_stack_vars (bool (*pred) (size_t), class stack_vars_data *data)
1104 {
1105 size_t si, i, j, n = stack_vars_num;
1106 poly_uint64 large_size = 0, large_alloc = 0;
1107 rtx large_base = NULL;
1108 rtx large_untagged_base = NULL;
1109 unsigned large_align = 0;
1110 bool large_allocation_done = false;
1111 tree decl;
1112
1113 /* Determine if there are any variables requiring "large" alignment.
1114 Since these are dynamically allocated, we only process these if
1115 no predicate involved. */
1116 large_align = stack_vars[stack_vars_sorted[0]].alignb * BITS_PER_UNIT;
1117 if (pred == NULL && large_align > MAX_SUPPORTED_STACK_ALIGNMENT)
1118 {
1119 /* Find the total size of these variables. */
1120 for (si = 0; si < n; ++si)
1121 {
1122 unsigned alignb;
1123
1124 i = stack_vars_sorted[si];
1125 alignb = stack_vars[i].alignb;
1126
1127 /* All "large" alignment decls come before all "small" alignment
1128 decls, but "large" alignment decls are not sorted based on
1129 their alignment. Increase large_align to track the largest
1130 required alignment. */
1131 if ((alignb * BITS_PER_UNIT) > large_align)
1132 large_align = alignb * BITS_PER_UNIT;
1133
1134 /* Stop when we get to the first decl with "small" alignment. */
1135 if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
1136 break;
1137
1138 /* Skip variables that aren't partition representatives. */
1139 if (stack_vars[i].representative != i)
1140 continue;
1141
1142 /* Skip variables that have already had rtl assigned. See also
1143 add_stack_var where we perpetrate this pc_rtx hack. */
1144 decl = stack_vars[i].decl;
1145 if (TREE_CODE (decl) == SSA_NAME
1146 ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] != NULL_RTX
1147 : DECL_RTL (decl) != pc_rtx)
1148 continue;
1149
1150 large_size = aligned_upper_bound (large_size, alignb);
1151 large_size += stack_vars[i].size;
1152 }
1153 }
1154
1155 for (si = 0; si < n; ++si)
1156 {
1157 rtx base;
1158 unsigned base_align, alignb;
1159 poly_int64 offset = 0;
1160
1161 i = stack_vars_sorted[si];
1162
1163 /* Skip variables that aren't partition representatives, for now. */
1164 if (stack_vars[i].representative != i)
1165 continue;
1166
1167 /* Skip variables that have already had rtl assigned. See also
1168 add_stack_var where we perpetrate this pc_rtx hack. */
1169 decl = stack_vars[i].decl;
1170 if (TREE_CODE (decl) == SSA_NAME
1171 ? SA.partition_to_pseudo[var_to_partition (SA.map, decl)] != NULL_RTX
1172 : DECL_RTL (decl) != pc_rtx)
1173 continue;
1174
1175 /* Check the predicate to see whether this variable should be
1176 allocated in this pass. */
1177 if (pred && !pred (i))
1178 continue;
1179
1180 base = (hwasan_sanitize_stack_p ()
1181 ? hwasan_frame_base ()
1182 : virtual_stack_vars_rtx);
1183 alignb = stack_vars[i].alignb;
1184 if (alignb * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT)
1185 {
1186 poly_int64 hwasan_orig_offset;
1187 if (hwasan_sanitize_stack_p ())
1188 {
1189 /* There must be no tag granule "shared" between different
1190 objects. This means that no HWASAN_TAG_GRANULE_SIZE byte
1191 chunk can have more than one object in it.
1192
1193 We ensure this by forcing the end of the last bit of data to
1194 be aligned to HWASAN_TAG_GRANULE_SIZE bytes here, and setting
1195 the start of each variable to be aligned to
1196 HWASAN_TAG_GRANULE_SIZE bytes in `align_local_variable`.
1197
1198 We can't align just one of the start or end, since there are
1199 untagged things stored on the stack which we do not align to
1200 HWASAN_TAG_GRANULE_SIZE bytes. If we only aligned the start
1201 or the end of tagged objects then untagged objects could end
1202 up sharing the first granule of a tagged object or sharing the
1203 last granule of a tagged object respectively. */
1204 hwasan_orig_offset = align_frame_offset (HWASAN_TAG_GRANULE_SIZE);
1205 gcc_assert (stack_vars[i].alignb >= HWASAN_TAG_GRANULE_SIZE);
1206 }
1207 /* ASAN description strings don't yet have a syntax for expressing
1208 polynomial offsets. */
1209 HOST_WIDE_INT prev_offset;
1210 if (asan_sanitize_stack_p ()
1211 && pred
1212 && frame_offset.is_constant (&prev_offset)
1213 && stack_vars[i].size.is_constant ())
1214 {
1215 if (data->asan_vec.is_empty ())
1216 {
1217 align_frame_offset (ASAN_RED_ZONE_SIZE);
1218 prev_offset = frame_offset.to_constant ();
1219 }
1220 prev_offset = align_base (prev_offset,
1221 ASAN_MIN_RED_ZONE_SIZE,
1222 !FRAME_GROWS_DOWNWARD);
1223 tree repr_decl = NULL_TREE;
1224 unsigned HOST_WIDE_INT size
1225 = asan_var_and_redzone_size (stack_vars[i].size.to_constant ());
1226 if (data->asan_vec.is_empty ())
1227 size = MAX (size, ASAN_RED_ZONE_SIZE);
1228
1229 unsigned HOST_WIDE_INT alignment = MAX (alignb,
1230 ASAN_MIN_RED_ZONE_SIZE);
1231 offset = alloc_stack_frame_space (size, alignment);
1232
1233 data->asan_vec.safe_push (prev_offset);
1234 /* Allocating a constant amount of space from a constant
1235 starting offset must give a constant result. */
1236 data->asan_vec.safe_push ((offset + stack_vars[i].size)
1237 .to_constant ());
1238 /* Find best representative of the partition.
1239 Prefer those with DECL_NAME, even better
1240 satisfying asan_protect_stack_decl predicate. */
1241 for (j = i; j != EOC; j = stack_vars[j].next)
1242 if (asan_protect_stack_decl (stack_vars[j].decl)
1243 && DECL_NAME (stack_vars[j].decl))
1244 {
1245 repr_decl = stack_vars[j].decl;
1246 break;
1247 }
1248 else if (repr_decl == NULL_TREE
1249 && DECL_P (stack_vars[j].decl)
1250 && DECL_NAME (stack_vars[j].decl))
1251 repr_decl = stack_vars[j].decl;
1252 if (repr_decl == NULL_TREE)
1253 repr_decl = stack_vars[i].decl;
1254 data->asan_decl_vec.safe_push (repr_decl);
1255
1256 /* Make sure a representative is unpoison if another
1257 variable in the partition is handled by
1258 use-after-scope sanitization. */
1259 if (asan_handled_variables != NULL
1260 && !asan_handled_variables->contains (repr_decl))
1261 {
1262 for (j = i; j != EOC; j = stack_vars[j].next)
1263 if (asan_handled_variables->contains (stack_vars[j].decl))
1264 break;
1265 if (j != EOC)
1266 asan_handled_variables->add (repr_decl);
1267 }
1268
1269 data->asan_alignb = MAX (data->asan_alignb, alignb);
1270 if (data->asan_base == NULL)
1271 data->asan_base = gen_reg_rtx (Pmode);
1272 base = data->asan_base;
1273
1274 if (!STRICT_ALIGNMENT)
1275 base_align = crtl->max_used_stack_slot_alignment;
1276 else
1277 base_align = MAX (crtl->max_used_stack_slot_alignment,
1278 GET_MODE_ALIGNMENT (SImode)
1279 << ASAN_SHADOW_SHIFT);
1280 }
1281 else
1282 {
1283 offset = alloc_stack_frame_space (stack_vars[i].size, alignb);
1284 base_align = crtl->max_used_stack_slot_alignment;
1285
1286 if (hwasan_sanitize_stack_p ())
1287 {
1288 /* Align again since the point of this alignment is to handle
1289 the "end" of the object (i.e. smallest address after the
1290 stack object). For FRAME_GROWS_DOWNWARD that requires
1291 aligning the stack before allocating, but for a frame that
1292 grows upwards that requires aligning the stack after
1293 allocation.
1294
1295 Use `frame_offset` to record the offset value rather than
1296 `offset` since the `frame_offset` describes the extent
1297 allocated for this particular variable while `offset`
1298 describes the address that this variable starts at. */
1299 align_frame_offset (HWASAN_TAG_GRANULE_SIZE);
1300 hwasan_record_stack_var (virtual_stack_vars_rtx, base,
1301 hwasan_orig_offset, frame_offset);
1302 }
1303 }
1304 }
1305 else
1306 {
1307 /* Large alignment is only processed in the last pass. */
1308 if (pred)
1309 continue;
1310
1311 /* If there were any variables requiring "large" alignment, allocate
1312 space. */
1313 if (maybe_ne (large_size, 0U) && ! large_allocation_done)
1314 {
1315 poly_int64 loffset;
1316 rtx large_allocsize;
1317
1318 large_allocsize = gen_int_mode (large_size, Pmode);
1319 get_dynamic_stack_size (&large_allocsize, 0, large_align, NULL);
1320 loffset = alloc_stack_frame_space
1321 (rtx_to_poly_int64 (large_allocsize),
1322 PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT);
1323 large_base = get_dynamic_stack_base (loffset, large_align, base);
1324 large_allocation_done = true;
1325 }
1326
1327 gcc_assert (large_base != NULL);
1328 large_alloc = aligned_upper_bound (large_alloc, alignb);
1329 offset = large_alloc;
1330 large_alloc += stack_vars[i].size;
1331 if (hwasan_sanitize_stack_p ())
1332 {
1333 /* An object with a large alignment requirement means that the
1334 alignment requirement is greater than the required alignment
1335 for tags. */
1336 if (!large_untagged_base)
1337 large_untagged_base
1338 = targetm.memtag.untagged_pointer (large_base, NULL_RTX);
1339 /* Ensure the end of the variable is also aligned correctly. */
1340 poly_int64 align_again
1341 = aligned_upper_bound (large_alloc, HWASAN_TAG_GRANULE_SIZE);
1342 /* For large allocations we always allocate a chunk of space
1343 (which is addressed by large_untagged_base/large_base) and
1344 then use positive offsets from that. Hence the farthest
1345 offset is `align_again` and the nearest offset from the base
1346 is `offset`. */
1347 hwasan_record_stack_var (large_untagged_base, large_base,
1348 offset, align_again);
1349 }
1350
1351 base = large_base;
1352 base_align = large_align;
1353 }
1354
1355 /* Create rtl for each variable based on their location within the
1356 partition. */
1357 for (j = i; j != EOC; j = stack_vars[j].next)
1358 {
1359 expand_one_stack_var_at (stack_vars[j].decl,
1360 base, base_align, offset);
1361 }
1362 if (hwasan_sanitize_stack_p ())
1363 hwasan_increment_frame_tag ();
1364 }
1365
1366 gcc_assert (known_eq (large_alloc, large_size));
1367 }
1368
1369 /* Take into account all sizes of partitions and reset DECL_RTLs. */
1370 static poly_uint64
account_stack_vars(void)1371 account_stack_vars (void)
1372 {
1373 size_t si, j, i, n = stack_vars_num;
1374 poly_uint64 size = 0;
1375
1376 for (si = 0; si < n; ++si)
1377 {
1378 i = stack_vars_sorted[si];
1379
1380 /* Skip variables that aren't partition representatives, for now. */
1381 if (stack_vars[i].representative != i)
1382 continue;
1383
1384 size += stack_vars[i].size;
1385 for (j = i; j != EOC; j = stack_vars[j].next)
1386 set_rtl (stack_vars[j].decl, NULL);
1387 }
1388 return size;
1389 }
1390
1391 /* Record the RTL assignment X for the default def of PARM. */
1392
1393 extern void
set_parm_rtl(tree parm,rtx x)1394 set_parm_rtl (tree parm, rtx x)
1395 {
1396 gcc_assert (TREE_CODE (parm) == PARM_DECL
1397 || TREE_CODE (parm) == RESULT_DECL);
1398
1399 if (x && !MEM_P (x))
1400 {
1401 unsigned int align = MINIMUM_ALIGNMENT (TREE_TYPE (parm),
1402 TYPE_MODE (TREE_TYPE (parm)),
1403 TYPE_ALIGN (TREE_TYPE (parm)));
1404
1405 /* If the variable alignment is very large we'll dynamicaly
1406 allocate it, which means that in-frame portion is just a
1407 pointer. ??? We've got a pseudo for sure here, do we
1408 actually dynamically allocate its spilling area if needed?
1409 ??? Isn't it a problem when Pmode alignment also exceeds
1410 MAX_SUPPORTED_STACK_ALIGNMENT, as can happen on cris and lm32? */
1411 if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
1412 align = GET_MODE_ALIGNMENT (Pmode);
1413
1414 record_alignment_for_reg_var (align);
1415 }
1416
1417 tree ssa = ssa_default_def (cfun, parm);
1418 if (!ssa)
1419 return set_rtl (parm, x);
1420
1421 int part = var_to_partition (SA.map, ssa);
1422 gcc_assert (part != NO_PARTITION);
1423
1424 bool changed = bitmap_bit_p (SA.partitions_for_parm_default_defs, part);
1425 gcc_assert (changed);
1426
1427 set_rtl (ssa, x);
1428 gcc_assert (DECL_RTL (parm) == x);
1429 }
1430
1431 /* A subroutine of expand_one_var. Called to immediately assign rtl
1432 to a variable to be allocated in the stack frame. */
1433
1434 static void
expand_one_stack_var_1(tree var)1435 expand_one_stack_var_1 (tree var)
1436 {
1437 poly_uint64 size;
1438 poly_int64 offset;
1439 unsigned byte_align;
1440
1441 if (TREE_CODE (var) == SSA_NAME)
1442 {
1443 tree type = TREE_TYPE (var);
1444 size = tree_to_poly_uint64 (TYPE_SIZE_UNIT (type));
1445 }
1446 else
1447 size = tree_to_poly_uint64 (DECL_SIZE_UNIT (var));
1448
1449 byte_align = align_local_variable (var, true);
1450
1451 /* We handle highly aligned variables in expand_stack_vars. */
1452 gcc_assert (byte_align * BITS_PER_UNIT <= MAX_SUPPORTED_STACK_ALIGNMENT);
1453
1454 rtx base;
1455 if (hwasan_sanitize_stack_p ())
1456 {
1457 /* Allocate zero bytes to align the stack. */
1458 poly_int64 hwasan_orig_offset
1459 = align_frame_offset (HWASAN_TAG_GRANULE_SIZE);
1460 offset = alloc_stack_frame_space (size, byte_align);
1461 align_frame_offset (HWASAN_TAG_GRANULE_SIZE);
1462 base = hwasan_frame_base ();
1463 /* Use `frame_offset` to automatically account for machines where the
1464 frame grows upwards.
1465
1466 `offset` will always point to the "start" of the stack object, which
1467 will be the smallest address, for ! FRAME_GROWS_DOWNWARD this is *not*
1468 the "furthest" offset from the base delimiting the current stack
1469 object. `frame_offset` will always delimit the extent that the frame.
1470 */
1471 hwasan_record_stack_var (virtual_stack_vars_rtx, base,
1472 hwasan_orig_offset, frame_offset);
1473 }
1474 else
1475 {
1476 offset = alloc_stack_frame_space (size, byte_align);
1477 base = virtual_stack_vars_rtx;
1478 }
1479
1480 expand_one_stack_var_at (var, base,
1481 crtl->max_used_stack_slot_alignment, offset);
1482
1483 if (hwasan_sanitize_stack_p ())
1484 hwasan_increment_frame_tag ();
1485 }
1486
1487 /* Wrapper for expand_one_stack_var_1 that checks SSA_NAMEs are
1488 already assigned some MEM. */
1489
1490 static void
expand_one_stack_var(tree var)1491 expand_one_stack_var (tree var)
1492 {
1493 if (TREE_CODE (var) == SSA_NAME)
1494 {
1495 int part = var_to_partition (SA.map, var);
1496 if (part != NO_PARTITION)
1497 {
1498 rtx x = SA.partition_to_pseudo[part];
1499 gcc_assert (x);
1500 gcc_assert (MEM_P (x));
1501 return;
1502 }
1503 }
1504
1505 return expand_one_stack_var_1 (var);
1506 }
1507
1508 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL
1509 that will reside in a hard register. */
1510
1511 static void
expand_one_hard_reg_var(tree var)1512 expand_one_hard_reg_var (tree var)
1513 {
1514 rest_of_decl_compilation (var, 0, 0);
1515 }
1516
1517 /* Record the alignment requirements of some variable assigned to a
1518 pseudo. */
1519
1520 static void
record_alignment_for_reg_var(unsigned int align)1521 record_alignment_for_reg_var (unsigned int align)
1522 {
1523 if (SUPPORTS_STACK_ALIGNMENT
1524 && crtl->stack_alignment_estimated < align)
1525 {
1526 /* stack_alignment_estimated shouldn't change after stack
1527 realign decision made */
1528 gcc_assert (!crtl->stack_realign_processed);
1529 crtl->stack_alignment_estimated = align;
1530 }
1531
1532 /* stack_alignment_needed > PREFERRED_STACK_BOUNDARY is permitted.
1533 So here we only make sure stack_alignment_needed >= align. */
1534 if (crtl->stack_alignment_needed < align)
1535 crtl->stack_alignment_needed = align;
1536 if (crtl->max_used_stack_slot_alignment < align)
1537 crtl->max_used_stack_slot_alignment = align;
1538 }
1539
1540 /* Create RTL for an SSA partition. */
1541
1542 static void
expand_one_ssa_partition(tree var)1543 expand_one_ssa_partition (tree var)
1544 {
1545 int part = var_to_partition (SA.map, var);
1546 gcc_assert (part != NO_PARTITION);
1547
1548 if (SA.partition_to_pseudo[part])
1549 return;
1550
1551 unsigned int align = MINIMUM_ALIGNMENT (TREE_TYPE (var),
1552 TYPE_MODE (TREE_TYPE (var)),
1553 TYPE_ALIGN (TREE_TYPE (var)));
1554
1555 /* If the variable alignment is very large we'll dynamicaly allocate
1556 it, which means that in-frame portion is just a pointer. */
1557 if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
1558 align = GET_MODE_ALIGNMENT (Pmode);
1559
1560 record_alignment_for_reg_var (align);
1561
1562 if (!use_register_for_decl (var))
1563 {
1564 if (defer_stack_allocation (var, true))
1565 add_stack_var (var, true);
1566 else
1567 expand_one_stack_var_1 (var);
1568 return;
1569 }
1570
1571 machine_mode reg_mode = promote_ssa_mode (var, NULL);
1572 rtx x = gen_reg_rtx (reg_mode);
1573
1574 set_rtl (var, x);
1575
1576 /* For a promoted variable, X will not be used directly but wrapped in a
1577 SUBREG with SUBREG_PROMOTED_VAR_P set, which means that the RTL land
1578 will assume that its upper bits can be inferred from its lower bits.
1579 Therefore, if X isn't initialized on every path from the entry, then
1580 we must do it manually in order to fulfill the above assumption. */
1581 if (reg_mode != TYPE_MODE (TREE_TYPE (var))
1582 && bitmap_bit_p (SA.partitions_for_undefined_values, part))
1583 emit_move_insn (x, CONST0_RTX (reg_mode));
1584 }
1585
1586 /* Record the association between the RTL generated for partition PART
1587 and the underlying variable of the SSA_NAME VAR. */
1588
1589 static void
adjust_one_expanded_partition_var(tree var)1590 adjust_one_expanded_partition_var (tree var)
1591 {
1592 if (!var)
1593 return;
1594
1595 tree decl = SSA_NAME_VAR (var);
1596
1597 int part = var_to_partition (SA.map, var);
1598 if (part == NO_PARTITION)
1599 return;
1600
1601 rtx x = SA.partition_to_pseudo[part];
1602
1603 gcc_assert (x);
1604
1605 set_rtl (var, x);
1606
1607 if (!REG_P (x))
1608 return;
1609
1610 /* Note if the object is a user variable. */
1611 if (decl && !DECL_ARTIFICIAL (decl))
1612 mark_user_reg (x);
1613
1614 if (POINTER_TYPE_P (decl ? TREE_TYPE (decl) : TREE_TYPE (var)))
1615 mark_reg_pointer (x, get_pointer_alignment (var));
1616 }
1617
1618 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL
1619 that will reside in a pseudo register. */
1620
1621 static void
expand_one_register_var(tree var)1622 expand_one_register_var (tree var)
1623 {
1624 if (TREE_CODE (var) == SSA_NAME)
1625 {
1626 int part = var_to_partition (SA.map, var);
1627 if (part != NO_PARTITION)
1628 {
1629 rtx x = SA.partition_to_pseudo[part];
1630 gcc_assert (x);
1631 gcc_assert (REG_P (x));
1632 return;
1633 }
1634 gcc_unreachable ();
1635 }
1636
1637 tree decl = var;
1638 tree type = TREE_TYPE (decl);
1639 machine_mode reg_mode = promote_decl_mode (decl, NULL);
1640 rtx x = gen_reg_rtx (reg_mode);
1641
1642 set_rtl (var, x);
1643
1644 /* Note if the object is a user variable. */
1645 if (!DECL_ARTIFICIAL (decl))
1646 mark_user_reg (x);
1647
1648 if (POINTER_TYPE_P (type))
1649 mark_reg_pointer (x, get_pointer_alignment (var));
1650 }
1651
1652 /* A subroutine of expand_one_var. Called to assign rtl to a VAR_DECL that
1653 has some associated error, e.g. its type is error-mark. We just need
1654 to pick something that won't crash the rest of the compiler. */
1655
1656 static void
expand_one_error_var(tree var)1657 expand_one_error_var (tree var)
1658 {
1659 machine_mode mode = DECL_MODE (var);
1660 rtx x;
1661
1662 if (mode == BLKmode)
1663 x = gen_rtx_MEM (BLKmode, const0_rtx);
1664 else if (mode == VOIDmode)
1665 x = const0_rtx;
1666 else
1667 x = gen_reg_rtx (mode);
1668
1669 SET_DECL_RTL (var, x);
1670 }
1671
1672 /* A subroutine of expand_one_var. VAR is a variable that will be
1673 allocated to the local stack frame. Return true if we wish to
1674 add VAR to STACK_VARS so that it will be coalesced with other
1675 variables. Return false to allocate VAR immediately.
1676
1677 This function is used to reduce the number of variables considered
1678 for coalescing, which reduces the size of the quadratic problem. */
1679
1680 static bool
defer_stack_allocation(tree var,bool toplevel)1681 defer_stack_allocation (tree var, bool toplevel)
1682 {
1683 tree size_unit = TREE_CODE (var) == SSA_NAME
1684 ? TYPE_SIZE_UNIT (TREE_TYPE (var))
1685 : DECL_SIZE_UNIT (var);
1686 poly_uint64 size;
1687
1688 /* Whether the variable is small enough for immediate allocation not to be
1689 a problem with regard to the frame size. */
1690 bool smallish
1691 = (poly_int_tree_p (size_unit, &size)
1692 && (estimated_poly_value (size)
1693 < param_min_size_for_stack_sharing));
1694
1695 /* If stack protection is enabled, *all* stack variables must be deferred,
1696 so that we can re-order the strings to the top of the frame.
1697 Similarly for Address Sanitizer. */
1698 if (flag_stack_protect || asan_sanitize_stack_p ())
1699 return true;
1700
1701 unsigned int align = TREE_CODE (var) == SSA_NAME
1702 ? TYPE_ALIGN (TREE_TYPE (var))
1703 : DECL_ALIGN (var);
1704
1705 /* We handle "large" alignment via dynamic allocation. We want to handle
1706 this extra complication in only one place, so defer them. */
1707 if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
1708 return true;
1709
1710 bool ignored = TREE_CODE (var) == SSA_NAME
1711 ? !SSAVAR (var) || DECL_IGNORED_P (SSA_NAME_VAR (var))
1712 : DECL_IGNORED_P (var);
1713
1714 /* When optimization is enabled, DECL_IGNORED_P variables originally scoped
1715 might be detached from their block and appear at toplevel when we reach
1716 here. We want to coalesce them with variables from other blocks when
1717 the immediate contribution to the frame size would be noticeable. */
1718 if (toplevel && optimize > 0 && ignored && !smallish)
1719 return true;
1720
1721 /* Variables declared in the outermost scope automatically conflict
1722 with every other variable. The only reason to want to defer them
1723 at all is that, after sorting, we can more efficiently pack
1724 small variables in the stack frame. Continue to defer at -O2. */
1725 if (toplevel && optimize < 2)
1726 return false;
1727
1728 /* Without optimization, *most* variables are allocated from the
1729 stack, which makes the quadratic problem large exactly when we
1730 want compilation to proceed as quickly as possible. On the
1731 other hand, we don't want the function's stack frame size to
1732 get completely out of hand. So we avoid adding scalars and
1733 "small" aggregates to the list at all. */
1734 if (optimize == 0 && smallish)
1735 return false;
1736
1737 return true;
1738 }
1739
1740 /* A subroutine of expand_used_vars. Expand one variable according to
1741 its flavor. Variables to be placed on the stack are not actually
1742 expanded yet, merely recorded.
1743 When REALLY_EXPAND is false, only add stack values to be allocated.
1744 Return stack usage this variable is supposed to take.
1745 */
1746
1747 static poly_uint64
expand_one_var(tree var,bool toplevel,bool really_expand,bitmap forced_stack_var=NULL)1748 expand_one_var (tree var, bool toplevel, bool really_expand,
1749 bitmap forced_stack_var = NULL)
1750 {
1751 unsigned int align = BITS_PER_UNIT;
1752 tree origvar = var;
1753
1754 var = SSAVAR (var);
1755
1756 if (TREE_TYPE (var) != error_mark_node && VAR_P (var))
1757 {
1758 if (is_global_var (var))
1759 return 0;
1760
1761 /* Because we don't know if VAR will be in register or on stack,
1762 we conservatively assume it will be on stack even if VAR is
1763 eventually put into register after RA pass. For non-automatic
1764 variables, which won't be on stack, we collect alignment of
1765 type and ignore user specified alignment. Similarly for
1766 SSA_NAMEs for which use_register_for_decl returns true. */
1767 if (TREE_STATIC (var)
1768 || DECL_EXTERNAL (var)
1769 || (TREE_CODE (origvar) == SSA_NAME && use_register_for_decl (var)))
1770 align = MINIMUM_ALIGNMENT (TREE_TYPE (var),
1771 TYPE_MODE (TREE_TYPE (var)),
1772 TYPE_ALIGN (TREE_TYPE (var)));
1773 else if (DECL_HAS_VALUE_EXPR_P (var)
1774 || (DECL_RTL_SET_P (var) && MEM_P (DECL_RTL (var))))
1775 /* Don't consider debug only variables with DECL_HAS_VALUE_EXPR_P set
1776 or variables which were assigned a stack slot already by
1777 expand_one_stack_var_at - in the latter case DECL_ALIGN has been
1778 changed from the offset chosen to it. */
1779 align = crtl->stack_alignment_estimated;
1780 else
1781 align = MINIMUM_ALIGNMENT (var, DECL_MODE (var), DECL_ALIGN (var));
1782
1783 /* If the variable alignment is very large we'll dynamicaly allocate
1784 it, which means that in-frame portion is just a pointer. */
1785 if (align > MAX_SUPPORTED_STACK_ALIGNMENT)
1786 align = GET_MODE_ALIGNMENT (Pmode);
1787 }
1788
1789 record_alignment_for_reg_var (align);
1790
1791 poly_uint64 size;
1792 if (TREE_CODE (origvar) == SSA_NAME)
1793 {
1794 gcc_assert (!VAR_P (var)
1795 || (!DECL_EXTERNAL (var)
1796 && !DECL_HAS_VALUE_EXPR_P (var)
1797 && !TREE_STATIC (var)
1798 && TREE_TYPE (var) != error_mark_node
1799 && !DECL_HARD_REGISTER (var)
1800 && really_expand));
1801 }
1802 if (!VAR_P (var) && TREE_CODE (origvar) != SSA_NAME)
1803 ;
1804 else if (DECL_EXTERNAL (var))
1805 ;
1806 else if (DECL_HAS_VALUE_EXPR_P (var))
1807 ;
1808 else if (TREE_STATIC (var))
1809 ;
1810 else if (TREE_CODE (origvar) != SSA_NAME && DECL_RTL_SET_P (var))
1811 ;
1812 else if (TREE_TYPE (var) == error_mark_node)
1813 {
1814 if (really_expand)
1815 expand_one_error_var (var);
1816 }
1817 else if (VAR_P (var) && DECL_HARD_REGISTER (var))
1818 {
1819 if (really_expand)
1820 {
1821 expand_one_hard_reg_var (var);
1822 if (!DECL_HARD_REGISTER (var))
1823 /* Invalid register specification. */
1824 expand_one_error_var (var);
1825 }
1826 }
1827 else if (use_register_for_decl (var)
1828 && (!forced_stack_var
1829 || !bitmap_bit_p (forced_stack_var, DECL_UID (var))))
1830 {
1831 if (really_expand)
1832 expand_one_register_var (origvar);
1833 }
1834 else if (!poly_int_tree_p (DECL_SIZE_UNIT (var), &size)
1835 || !valid_constant_size_p (DECL_SIZE_UNIT (var)))
1836 {
1837 /* Reject variables which cover more than half of the address-space. */
1838 if (really_expand)
1839 {
1840 if (DECL_NONLOCAL_FRAME (var))
1841 error_at (DECL_SOURCE_LOCATION (current_function_decl),
1842 "total size of local objects is too large");
1843 else
1844 error_at (DECL_SOURCE_LOCATION (var),
1845 "size of variable %q+D is too large", var);
1846 expand_one_error_var (var);
1847 }
1848 }
1849 else if (defer_stack_allocation (var, toplevel))
1850 add_stack_var (origvar, really_expand);
1851 else
1852 {
1853 if (really_expand)
1854 {
1855 if (lookup_attribute ("naked",
1856 DECL_ATTRIBUTES (current_function_decl)))
1857 error ("cannot allocate stack for variable %q+D, naked function",
1858 var);
1859
1860 expand_one_stack_var (origvar);
1861 }
1862 return size;
1863 }
1864 return 0;
1865 }
1866
1867 /* A subroutine of expand_used_vars. Walk down through the BLOCK tree
1868 expanding variables. Those variables that can be put into registers
1869 are allocated pseudos; those that can't are put on the stack.
1870
1871 TOPLEVEL is true if this is the outermost BLOCK. */
1872
1873 static void
expand_used_vars_for_block(tree block,bool toplevel,bitmap forced_stack_vars)1874 expand_used_vars_for_block (tree block, bool toplevel, bitmap forced_stack_vars)
1875 {
1876 tree t;
1877
1878 /* Expand all variables at this level. */
1879 for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t))
1880 if (TREE_USED (t)
1881 && ((!VAR_P (t) && TREE_CODE (t) != RESULT_DECL)
1882 || !DECL_NONSHAREABLE (t)))
1883 expand_one_var (t, toplevel, true, forced_stack_vars);
1884
1885 /* Expand all variables at containing levels. */
1886 for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
1887 expand_used_vars_for_block (t, false, forced_stack_vars);
1888 }
1889
1890 /* A subroutine of expand_used_vars. Walk down through the BLOCK tree
1891 and clear TREE_USED on all local variables. */
1892
1893 static void
clear_tree_used(tree block)1894 clear_tree_used (tree block)
1895 {
1896 tree t;
1897
1898 for (t = BLOCK_VARS (block); t ; t = DECL_CHAIN (t))
1899 /* if (!TREE_STATIC (t) && !DECL_EXTERNAL (t)) */
1900 if ((!VAR_P (t) && TREE_CODE (t) != RESULT_DECL)
1901 || !DECL_NONSHAREABLE (t))
1902 TREE_USED (t) = 0;
1903
1904 for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
1905 clear_tree_used (t);
1906 }
1907
1908 /* Examine TYPE and determine a bit mask of the following features. */
1909
1910 #define SPCT_HAS_LARGE_CHAR_ARRAY 1
1911 #define SPCT_HAS_SMALL_CHAR_ARRAY 2
1912 #define SPCT_HAS_ARRAY 4
1913 #define SPCT_HAS_AGGREGATE 8
1914
1915 static unsigned int
stack_protect_classify_type(tree type)1916 stack_protect_classify_type (tree type)
1917 {
1918 unsigned int ret = 0;
1919 tree t;
1920
1921 switch (TREE_CODE (type))
1922 {
1923 case ARRAY_TYPE:
1924 t = TYPE_MAIN_VARIANT (TREE_TYPE (type));
1925 if (t == char_type_node
1926 || t == signed_char_type_node
1927 || t == unsigned_char_type_node)
1928 {
1929 unsigned HOST_WIDE_INT max = param_ssp_buffer_size;
1930 unsigned HOST_WIDE_INT len;
1931
1932 if (!TYPE_SIZE_UNIT (type)
1933 || !tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
1934 len = max;
1935 else
1936 len = tree_to_uhwi (TYPE_SIZE_UNIT (type));
1937
1938 if (len == 0)
1939 ret = SPCT_HAS_ARRAY;
1940 else if (len < max)
1941 ret = SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_ARRAY;
1942 else
1943 ret = SPCT_HAS_LARGE_CHAR_ARRAY | SPCT_HAS_ARRAY;
1944 }
1945 else
1946 ret = SPCT_HAS_ARRAY;
1947 break;
1948
1949 case UNION_TYPE:
1950 case QUAL_UNION_TYPE:
1951 case RECORD_TYPE:
1952 ret = SPCT_HAS_AGGREGATE;
1953 for (t = TYPE_FIELDS (type); t ; t = TREE_CHAIN (t))
1954 if (TREE_CODE (t) == FIELD_DECL)
1955 ret |= stack_protect_classify_type (TREE_TYPE (t));
1956 break;
1957
1958 default:
1959 break;
1960 }
1961
1962 return ret;
1963 }
1964
1965 /* Return nonzero if DECL should be segregated into the "vulnerable" upper
1966 part of the local stack frame. Remember if we ever return nonzero for
1967 any variable in this function. The return value is the phase number in
1968 which the variable should be allocated. */
1969
1970 static int
stack_protect_decl_phase(tree decl)1971 stack_protect_decl_phase (tree decl)
1972 {
1973 unsigned int bits = stack_protect_classify_type (TREE_TYPE (decl));
1974 int ret = 0;
1975
1976 if (bits & SPCT_HAS_SMALL_CHAR_ARRAY)
1977 has_short_buffer = true;
1978
1979 tree attribs = DECL_ATTRIBUTES (current_function_decl);
1980 if (!lookup_attribute ("no_stack_protector", attribs)
1981 && (flag_stack_protect == SPCT_FLAG_ALL
1982 || flag_stack_protect == SPCT_FLAG_STRONG
1983 || (flag_stack_protect == SPCT_FLAG_EXPLICIT
1984 && lookup_attribute ("stack_protect", attribs))))
1985 {
1986 if ((bits & (SPCT_HAS_SMALL_CHAR_ARRAY | SPCT_HAS_LARGE_CHAR_ARRAY))
1987 && !(bits & SPCT_HAS_AGGREGATE))
1988 ret = 1;
1989 else if (bits & SPCT_HAS_ARRAY)
1990 ret = 2;
1991 }
1992 else
1993 ret = (bits & SPCT_HAS_LARGE_CHAR_ARRAY) != 0;
1994
1995 if (ret)
1996 has_protected_decls = true;
1997
1998 return ret;
1999 }
2000
2001 /* Two helper routines that check for phase 1 and phase 2. These are used
2002 as callbacks for expand_stack_vars. */
2003
2004 static bool
stack_protect_decl_phase_1(size_t i)2005 stack_protect_decl_phase_1 (size_t i)
2006 {
2007 return stack_protect_decl_phase (stack_vars[i].decl) == 1;
2008 }
2009
2010 static bool
stack_protect_decl_phase_2(size_t i)2011 stack_protect_decl_phase_2 (size_t i)
2012 {
2013 return stack_protect_decl_phase (stack_vars[i].decl) == 2;
2014 }
2015
2016 /* And helper function that checks for asan phase (with stack protector
2017 it is phase 3). This is used as callback for expand_stack_vars.
2018 Returns true if any of the vars in the partition need to be protected. */
2019
2020 static bool
asan_decl_phase_3(size_t i)2021 asan_decl_phase_3 (size_t i)
2022 {
2023 while (i != EOC)
2024 {
2025 if (asan_protect_stack_decl (stack_vars[i].decl))
2026 return true;
2027 i = stack_vars[i].next;
2028 }
2029 return false;
2030 }
2031
2032 /* Ensure that variables in different stack protection phases conflict
2033 so that they are not merged and share the same stack slot.
2034 Return true if there are any address taken variables. */
2035
2036 static bool
add_stack_protection_conflicts(void)2037 add_stack_protection_conflicts (void)
2038 {
2039 size_t i, j, n = stack_vars_num;
2040 unsigned char *phase;
2041 bool ret = false;
2042
2043 phase = XNEWVEC (unsigned char, n);
2044 for (i = 0; i < n; ++i)
2045 {
2046 phase[i] = stack_protect_decl_phase (stack_vars[i].decl);
2047 if (TREE_ADDRESSABLE (stack_vars[i].decl))
2048 ret = true;
2049 }
2050
2051 for (i = 0; i < n; ++i)
2052 {
2053 unsigned char ph_i = phase[i];
2054 for (j = i + 1; j < n; ++j)
2055 if (ph_i != phase[j])
2056 add_stack_var_conflict (i, j);
2057 }
2058
2059 XDELETEVEC (phase);
2060 return ret;
2061 }
2062
2063 /* Create a decl for the guard at the top of the stack frame. */
2064
2065 static void
create_stack_guard(void)2066 create_stack_guard (void)
2067 {
2068 tree guard = build_decl (DECL_SOURCE_LOCATION (current_function_decl),
2069 VAR_DECL, NULL, ptr_type_node);
2070 TREE_THIS_VOLATILE (guard) = 1;
2071 TREE_USED (guard) = 1;
2072 expand_one_stack_var (guard);
2073 crtl->stack_protect_guard = guard;
2074 }
2075
2076 /* Prepare for expanding variables. */
2077 static void
init_vars_expansion(void)2078 init_vars_expansion (void)
2079 {
2080 /* Conflict bitmaps, and a few related temporary bitmaps, go here. */
2081 bitmap_obstack_initialize (&stack_var_bitmap_obstack);
2082
2083 /* A map from decl to stack partition. */
2084 decl_to_stack_part = new hash_map<tree, size_t>;
2085
2086 /* Initialize local stack smashing state. */
2087 has_protected_decls = false;
2088 has_short_buffer = false;
2089 if (hwasan_sanitize_stack_p ())
2090 hwasan_record_frame_init ();
2091 }
2092
2093 /* Free up stack variable graph data. */
2094 static void
fini_vars_expansion(void)2095 fini_vars_expansion (void)
2096 {
2097 bitmap_obstack_release (&stack_var_bitmap_obstack);
2098 if (stack_vars)
2099 XDELETEVEC (stack_vars);
2100 if (stack_vars_sorted)
2101 XDELETEVEC (stack_vars_sorted);
2102 stack_vars = NULL;
2103 stack_vars_sorted = NULL;
2104 stack_vars_alloc = stack_vars_num = 0;
2105 delete decl_to_stack_part;
2106 decl_to_stack_part = NULL;
2107 }
2108
2109 /* Make a fair guess for the size of the stack frame of the function
2110 in NODE. This doesn't have to be exact, the result is only used in
2111 the inline heuristics. So we don't want to run the full stack var
2112 packing algorithm (which is quadratic in the number of stack vars).
2113 Instead, we calculate the total size of all stack vars. This turns
2114 out to be a pretty fair estimate -- packing of stack vars doesn't
2115 happen very often. */
2116
2117 HOST_WIDE_INT
estimated_stack_frame_size(struct cgraph_node * node)2118 estimated_stack_frame_size (struct cgraph_node *node)
2119 {
2120 poly_int64 size = 0;
2121 size_t i;
2122 tree var;
2123 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
2124
2125 push_cfun (fn);
2126
2127 init_vars_expansion ();
2128
2129 FOR_EACH_LOCAL_DECL (fn, i, var)
2130 if (auto_var_in_fn_p (var, fn->decl))
2131 size += expand_one_var (var, true, false);
2132
2133 if (stack_vars_num > 0)
2134 {
2135 /* Fake sorting the stack vars for account_stack_vars (). */
2136 stack_vars_sorted = XNEWVEC (size_t, stack_vars_num);
2137 for (i = 0; i < stack_vars_num; ++i)
2138 stack_vars_sorted[i] = i;
2139 size += account_stack_vars ();
2140 }
2141
2142 fini_vars_expansion ();
2143 pop_cfun ();
2144 return estimated_poly_value (size);
2145 }
2146
2147 /* Check if the current function has calls that use a return slot. */
2148
2149 static bool
stack_protect_return_slot_p()2150 stack_protect_return_slot_p ()
2151 {
2152 basic_block bb;
2153
2154 FOR_ALL_BB_FN (bb, cfun)
2155 for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
2156 !gsi_end_p (gsi); gsi_next (&gsi))
2157 {
2158 gimple *stmt = gsi_stmt (gsi);
2159 /* This assumes that calls to internal-only functions never
2160 use a return slot. */
2161 if (is_gimple_call (stmt)
2162 && !gimple_call_internal_p (stmt)
2163 && aggregate_value_p (TREE_TYPE (gimple_call_fntype (stmt)),
2164 gimple_call_fndecl (stmt)))
2165 return true;
2166 }
2167 return false;
2168 }
2169
2170 /* Expand all variables used in the function. */
2171
2172 static rtx_insn *
expand_used_vars(bitmap forced_stack_vars)2173 expand_used_vars (bitmap forced_stack_vars)
2174 {
2175 tree var, outer_block = DECL_INITIAL (current_function_decl);
2176 auto_vec<tree> maybe_local_decls;
2177 rtx_insn *var_end_seq = NULL;
2178 unsigned i;
2179 unsigned len;
2180 bool gen_stack_protect_signal = false;
2181
2182 /* Compute the phase of the stack frame for this function. */
2183 {
2184 int align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
2185 int off = targetm.starting_frame_offset () % align;
2186 frame_phase = off ? align - off : 0;
2187 }
2188
2189 /* Set TREE_USED on all variables in the local_decls. */
2190 FOR_EACH_LOCAL_DECL (cfun, i, var)
2191 TREE_USED (var) = 1;
2192 /* Clear TREE_USED on all variables associated with a block scope. */
2193 clear_tree_used (DECL_INITIAL (current_function_decl));
2194
2195 init_vars_expansion ();
2196
2197 if (targetm.use_pseudo_pic_reg ())
2198 pic_offset_table_rtx = gen_reg_rtx (Pmode);
2199
2200 for (i = 0; i < SA.map->num_partitions; i++)
2201 {
2202 if (bitmap_bit_p (SA.partitions_for_parm_default_defs, i))
2203 continue;
2204
2205 tree var = partition_to_var (SA.map, i);
2206
2207 gcc_assert (!virtual_operand_p (var));
2208
2209 expand_one_ssa_partition (var);
2210 }
2211
2212 if (flag_stack_protect == SPCT_FLAG_STRONG)
2213 gen_stack_protect_signal = stack_protect_return_slot_p ();
2214
2215 /* At this point all variables on the local_decls with TREE_USED
2216 set are not associated with any block scope. Lay them out. */
2217
2218 len = vec_safe_length (cfun->local_decls);
2219 FOR_EACH_LOCAL_DECL (cfun, i, var)
2220 {
2221 bool expand_now = false;
2222
2223 /* Expanded above already. */
2224 if (is_gimple_reg (var))
2225 {
2226 TREE_USED (var) = 0;
2227 goto next;
2228 }
2229 /* We didn't set a block for static or extern because it's hard
2230 to tell the difference between a global variable (re)declared
2231 in a local scope, and one that's really declared there to
2232 begin with. And it doesn't really matter much, since we're
2233 not giving them stack space. Expand them now. */
2234 else if (TREE_STATIC (var) || DECL_EXTERNAL (var))
2235 expand_now = true;
2236
2237 /* Expand variables not associated with any block now. Those created by
2238 the optimizers could be live anywhere in the function. Those that
2239 could possibly have been scoped originally and detached from their
2240 block will have their allocation deferred so we coalesce them with
2241 others when optimization is enabled. */
2242 else if (TREE_USED (var))
2243 expand_now = true;
2244
2245 /* Finally, mark all variables on the list as used. We'll use
2246 this in a moment when we expand those associated with scopes. */
2247 TREE_USED (var) = 1;
2248
2249 if (expand_now)
2250 expand_one_var (var, true, true, forced_stack_vars);
2251
2252 next:
2253 if (DECL_ARTIFICIAL (var) && !DECL_IGNORED_P (var))
2254 {
2255 rtx rtl = DECL_RTL_IF_SET (var);
2256
2257 /* Keep artificial non-ignored vars in cfun->local_decls
2258 chain until instantiate_decls. */
2259 if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT))
2260 add_local_decl (cfun, var);
2261 else if (rtl == NULL_RTX)
2262 /* If rtl isn't set yet, which can happen e.g. with
2263 -fstack-protector, retry before returning from this
2264 function. */
2265 maybe_local_decls.safe_push (var);
2266 }
2267 }
2268
2269 /* We duplicated some of the decls in CFUN->LOCAL_DECLS.
2270
2271 +-----------------+-----------------+
2272 | ...processed... | ...duplicates...|
2273 +-----------------+-----------------+
2274 ^
2275 +-- LEN points here.
2276
2277 We just want the duplicates, as those are the artificial
2278 non-ignored vars that we want to keep until instantiate_decls.
2279 Move them down and truncate the array. */
2280 if (!vec_safe_is_empty (cfun->local_decls))
2281 cfun->local_decls->block_remove (0, len);
2282
2283 /* At this point, all variables within the block tree with TREE_USED
2284 set are actually used by the optimized function. Lay them out. */
2285 expand_used_vars_for_block (outer_block, true, forced_stack_vars);
2286
2287 tree attribs = DECL_ATTRIBUTES (current_function_decl);
2288 if (stack_vars_num > 0)
2289 {
2290 bool has_addressable_vars = false;
2291
2292 add_scope_conflicts ();
2293
2294 /* If stack protection is enabled, we don't share space between
2295 vulnerable data and non-vulnerable data. */
2296 if (flag_stack_protect != 0
2297 && !lookup_attribute ("no_stack_protector", attribs)
2298 && (flag_stack_protect != SPCT_FLAG_EXPLICIT
2299 || (flag_stack_protect == SPCT_FLAG_EXPLICIT
2300 && lookup_attribute ("stack_protect", attribs))))
2301 has_addressable_vars = add_stack_protection_conflicts ();
2302
2303 if (flag_stack_protect == SPCT_FLAG_STRONG && has_addressable_vars)
2304 gen_stack_protect_signal = true;
2305
2306 /* Now that we have collected all stack variables, and have computed a
2307 minimal interference graph, attempt to save some stack space. */
2308 partition_stack_vars ();
2309 if (dump_file)
2310 dump_stack_var_partition ();
2311 }
2312
2313
2314 if (!lookup_attribute ("no_stack_protector", attribs))
2315 switch (flag_stack_protect)
2316 {
2317 case SPCT_FLAG_ALL:
2318 create_stack_guard ();
2319 break;
2320
2321 case SPCT_FLAG_STRONG:
2322 if (gen_stack_protect_signal
2323 || cfun->calls_alloca
2324 || has_protected_decls
2325 || lookup_attribute ("stack_protect", attribs))
2326 create_stack_guard ();
2327 break;
2328
2329 case SPCT_FLAG_DEFAULT:
2330 if (cfun->calls_alloca
2331 || has_protected_decls
2332 || lookup_attribute ("stack_protect", attribs))
2333 create_stack_guard ();
2334 break;
2335
2336 case SPCT_FLAG_EXPLICIT:
2337 if (lookup_attribute ("stack_protect", attribs))
2338 create_stack_guard ();
2339 break;
2340
2341 default:
2342 break;
2343 }
2344
2345 /* Assign rtl to each variable based on these partitions. */
2346 if (stack_vars_num > 0)
2347 {
2348 class stack_vars_data data;
2349
2350 data.asan_base = NULL_RTX;
2351 data.asan_alignb = 0;
2352
2353 /* Reorder decls to be protected by iterating over the variables
2354 array multiple times, and allocating out of each phase in turn. */
2355 /* ??? We could probably integrate this into the qsort we did
2356 earlier, such that we naturally see these variables first,
2357 and thus naturally allocate things in the right order. */
2358 if (has_protected_decls)
2359 {
2360 /* Phase 1 contains only character arrays. */
2361 expand_stack_vars (stack_protect_decl_phase_1, &data);
2362
2363 /* Phase 2 contains other kinds of arrays. */
2364 if (!lookup_attribute ("no_stack_protector", attribs)
2365 && (flag_stack_protect == SPCT_FLAG_ALL
2366 || flag_stack_protect == SPCT_FLAG_STRONG
2367 || (flag_stack_protect == SPCT_FLAG_EXPLICIT
2368 && lookup_attribute ("stack_protect", attribs))))
2369 expand_stack_vars (stack_protect_decl_phase_2, &data);
2370 }
2371
2372 if (asan_sanitize_stack_p ())
2373 /* Phase 3, any partitions that need asan protection
2374 in addition to phase 1 and 2. */
2375 expand_stack_vars (asan_decl_phase_3, &data);
2376
2377 /* ASAN description strings don't yet have a syntax for expressing
2378 polynomial offsets. */
2379 HOST_WIDE_INT prev_offset;
2380 if (!data.asan_vec.is_empty ()
2381 && frame_offset.is_constant (&prev_offset))
2382 {
2383 HOST_WIDE_INT offset, sz, redzonesz;
2384 redzonesz = ASAN_RED_ZONE_SIZE;
2385 sz = data.asan_vec[0] - prev_offset;
2386 if (data.asan_alignb > ASAN_RED_ZONE_SIZE
2387 && data.asan_alignb <= 4096
2388 && sz + ASAN_RED_ZONE_SIZE >= (int) data.asan_alignb)
2389 redzonesz = ((sz + ASAN_RED_ZONE_SIZE + data.asan_alignb - 1)
2390 & ~(data.asan_alignb - HOST_WIDE_INT_1)) - sz;
2391 /* Allocating a constant amount of space from a constant
2392 starting offset must give a constant result. */
2393 offset = (alloc_stack_frame_space (redzonesz, ASAN_RED_ZONE_SIZE)
2394 .to_constant ());
2395 data.asan_vec.safe_push (prev_offset);
2396 data.asan_vec.safe_push (offset);
2397 /* Leave space for alignment if STRICT_ALIGNMENT. */
2398 if (STRICT_ALIGNMENT)
2399 alloc_stack_frame_space ((GET_MODE_ALIGNMENT (SImode)
2400 << ASAN_SHADOW_SHIFT)
2401 / BITS_PER_UNIT, 1);
2402
2403 var_end_seq
2404 = asan_emit_stack_protection (virtual_stack_vars_rtx,
2405 data.asan_base,
2406 data.asan_alignb,
2407 data.asan_vec.address (),
2408 data.asan_decl_vec.address (),
2409 data.asan_vec.length ());
2410 }
2411
2412 expand_stack_vars (NULL, &data);
2413 }
2414
2415 if (hwasan_sanitize_stack_p ())
2416 hwasan_emit_prologue ();
2417 if (asan_sanitize_allocas_p () && cfun->calls_alloca)
2418 var_end_seq = asan_emit_allocas_unpoison (virtual_stack_dynamic_rtx,
2419 virtual_stack_vars_rtx,
2420 var_end_seq);
2421 else if (hwasan_sanitize_allocas_p () && cfun->calls_alloca)
2422 /* When using out-of-line instrumentation we only want to emit one function
2423 call for clearing the tags in a region of shadow stack. When there are
2424 alloca calls in this frame we want to emit a call using the
2425 virtual_stack_dynamic_rtx, but when not we use the hwasan_frame_extent
2426 rtx we created in expand_stack_vars. */
2427 var_end_seq = hwasan_emit_untag_frame (virtual_stack_dynamic_rtx,
2428 virtual_stack_vars_rtx);
2429 else if (hwasan_sanitize_stack_p ())
2430 /* If no variables were stored on the stack, `hwasan_get_frame_extent`
2431 will return NULL_RTX and hence `hwasan_emit_untag_frame` will return
2432 NULL (i.e. an empty sequence). */
2433 var_end_seq = hwasan_emit_untag_frame (hwasan_get_frame_extent (),
2434 virtual_stack_vars_rtx);
2435
2436 fini_vars_expansion ();
2437
2438 /* If there were any artificial non-ignored vars without rtl
2439 found earlier, see if deferred stack allocation hasn't assigned
2440 rtl to them. */
2441 FOR_EACH_VEC_ELT_REVERSE (maybe_local_decls, i, var)
2442 {
2443 rtx rtl = DECL_RTL_IF_SET (var);
2444
2445 /* Keep artificial non-ignored vars in cfun->local_decls
2446 chain until instantiate_decls. */
2447 if (rtl && (MEM_P (rtl) || GET_CODE (rtl) == CONCAT))
2448 add_local_decl (cfun, var);
2449 }
2450
2451 /* If the target requires that FRAME_OFFSET be aligned, do it. */
2452 if (STACK_ALIGNMENT_NEEDED)
2453 {
2454 HOST_WIDE_INT align = PREFERRED_STACK_BOUNDARY / BITS_PER_UNIT;
2455 if (FRAME_GROWS_DOWNWARD)
2456 frame_offset = aligned_lower_bound (frame_offset, align);
2457 else
2458 frame_offset = aligned_upper_bound (frame_offset, align);
2459 }
2460
2461 return var_end_seq;
2462 }
2463
2464
2465 /* If we need to produce a detailed dump, print the tree representation
2466 for STMT to the dump file. SINCE is the last RTX after which the RTL
2467 generated for STMT should have been appended. */
2468
2469 static void
maybe_dump_rtl_for_gimple_stmt(gimple * stmt,rtx_insn * since)2470 maybe_dump_rtl_for_gimple_stmt (gimple *stmt, rtx_insn *since)
2471 {
2472 if (dump_file && (dump_flags & TDF_DETAILS))
2473 {
2474 fprintf (dump_file, "\n;; ");
2475 print_gimple_stmt (dump_file, stmt, 0,
2476 TDF_SLIM | (dump_flags & TDF_LINENO));
2477 fprintf (dump_file, "\n");
2478
2479 print_rtl (dump_file, since ? NEXT_INSN (since) : since);
2480 }
2481 }
2482
2483 /* Maps the blocks that do not contain tree labels to rtx labels. */
2484
2485 static hash_map<basic_block, rtx_code_label *> *lab_rtx_for_bb;
2486
2487 /* Returns the label_rtx expression for a label starting basic block BB. */
2488
2489 static rtx_code_label *
label_rtx_for_bb(basic_block bb ATTRIBUTE_UNUSED)2490 label_rtx_for_bb (basic_block bb ATTRIBUTE_UNUSED)
2491 {
2492 if (bb->flags & BB_RTL)
2493 return block_label (bb);
2494
2495 rtx_code_label **elt = lab_rtx_for_bb->get (bb);
2496 if (elt)
2497 return *elt;
2498
2499 /* Find the tree label if it is present. */
2500 gimple_stmt_iterator gsi = gsi_start_bb (bb);
2501 glabel *lab_stmt;
2502 if (!gsi_end_p (gsi)
2503 && (lab_stmt = dyn_cast <glabel *> (gsi_stmt (gsi)))
2504 && !DECL_NONLOCAL (gimple_label_label (lab_stmt)))
2505 return jump_target_rtx (gimple_label_label (lab_stmt));
2506
2507 rtx_code_label *l = gen_label_rtx ();
2508 lab_rtx_for_bb->put (bb, l);
2509 return l;
2510 }
2511
2512
2513 /* A subroutine of expand_gimple_cond. Given E, a fallthrough edge
2514 of a basic block where we just expanded the conditional at the end,
2515 possibly clean up the CFG and instruction sequence. LAST is the
2516 last instruction before the just emitted jump sequence. */
2517
2518 static void
maybe_cleanup_end_of_block(edge e,rtx_insn * last)2519 maybe_cleanup_end_of_block (edge e, rtx_insn *last)
2520 {
2521 /* Special case: when jumpif decides that the condition is
2522 trivial it emits an unconditional jump (and the necessary
2523 barrier). But we still have two edges, the fallthru one is
2524 wrong. purge_dead_edges would clean this up later. Unfortunately
2525 we have to insert insns (and split edges) before
2526 find_many_sub_basic_blocks and hence before purge_dead_edges.
2527 But splitting edges might create new blocks which depend on the
2528 fact that if there are two edges there's no barrier. So the
2529 barrier would get lost and verify_flow_info would ICE. Instead
2530 of auditing all edge splitters to care for the barrier (which
2531 normally isn't there in a cleaned CFG), fix it here. */
2532 if (BARRIER_P (get_last_insn ()))
2533 {
2534 rtx_insn *insn;
2535 remove_edge (e);
2536 /* Now, we have a single successor block, if we have insns to
2537 insert on the remaining edge we potentially will insert
2538 it at the end of this block (if the dest block isn't feasible)
2539 in order to avoid splitting the edge. This insertion will take
2540 place in front of the last jump. But we might have emitted
2541 multiple jumps (conditional and one unconditional) to the
2542 same destination. Inserting in front of the last one then
2543 is a problem. See PR 40021. We fix this by deleting all
2544 jumps except the last unconditional one. */
2545 insn = PREV_INSN (get_last_insn ());
2546 /* Make sure we have an unconditional jump. Otherwise we're
2547 confused. */
2548 gcc_assert (JUMP_P (insn) && !any_condjump_p (insn));
2549 for (insn = PREV_INSN (insn); insn != last;)
2550 {
2551 insn = PREV_INSN (insn);
2552 if (JUMP_P (NEXT_INSN (insn)))
2553 {
2554 if (!any_condjump_p (NEXT_INSN (insn)))
2555 {
2556 gcc_assert (BARRIER_P (NEXT_INSN (NEXT_INSN (insn))));
2557 delete_insn (NEXT_INSN (NEXT_INSN (insn)));
2558 }
2559 delete_insn (NEXT_INSN (insn));
2560 }
2561 }
2562 }
2563 }
2564
2565 /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_COND.
2566 Returns a new basic block if we've terminated the current basic
2567 block and created a new one. */
2568
2569 static basic_block
expand_gimple_cond(basic_block bb,gcond * stmt)2570 expand_gimple_cond (basic_block bb, gcond *stmt)
2571 {
2572 basic_block new_bb, dest;
2573 edge true_edge;
2574 edge false_edge;
2575 rtx_insn *last2, *last;
2576 enum tree_code code;
2577 tree op0, op1;
2578
2579 code = gimple_cond_code (stmt);
2580 op0 = gimple_cond_lhs (stmt);
2581 op1 = gimple_cond_rhs (stmt);
2582 /* We're sometimes presented with such code:
2583 D.123_1 = x < y;
2584 if (D.123_1 != 0)
2585 ...
2586 This would expand to two comparisons which then later might
2587 be cleaned up by combine. But some pattern matchers like if-conversion
2588 work better when there's only one compare, so make up for this
2589 here as special exception if TER would have made the same change. */
2590 if (SA.values
2591 && TREE_CODE (op0) == SSA_NAME
2592 && TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
2593 && TREE_CODE (op1) == INTEGER_CST
2594 && ((gimple_cond_code (stmt) == NE_EXPR
2595 && integer_zerop (op1))
2596 || (gimple_cond_code (stmt) == EQ_EXPR
2597 && integer_onep (op1)))
2598 && bitmap_bit_p (SA.values, SSA_NAME_VERSION (op0)))
2599 {
2600 gimple *second = SSA_NAME_DEF_STMT (op0);
2601 if (gimple_code (second) == GIMPLE_ASSIGN)
2602 {
2603 enum tree_code code2 = gimple_assign_rhs_code (second);
2604 if (TREE_CODE_CLASS (code2) == tcc_comparison)
2605 {
2606 code = code2;
2607 op0 = gimple_assign_rhs1 (second);
2608 op1 = gimple_assign_rhs2 (second);
2609 }
2610 /* If jumps are cheap and the target does not support conditional
2611 compare, turn some more codes into jumpy sequences. */
2612 else if (BRANCH_COST (optimize_insn_for_speed_p (), false) < 4
2613 && targetm.gen_ccmp_first == NULL)
2614 {
2615 if ((code2 == BIT_AND_EXPR
2616 && TYPE_PRECISION (TREE_TYPE (op0)) == 1
2617 && TREE_CODE (gimple_assign_rhs2 (second)) != INTEGER_CST)
2618 || code2 == TRUTH_AND_EXPR)
2619 {
2620 code = TRUTH_ANDIF_EXPR;
2621 op0 = gimple_assign_rhs1 (second);
2622 op1 = gimple_assign_rhs2 (second);
2623 }
2624 else if (code2 == BIT_IOR_EXPR || code2 == TRUTH_OR_EXPR)
2625 {
2626 code = TRUTH_ORIF_EXPR;
2627 op0 = gimple_assign_rhs1 (second);
2628 op1 = gimple_assign_rhs2 (second);
2629 }
2630 }
2631 }
2632 }
2633
2634 /* Optimize (x % C1) == C2 or (x % C1) != C2 if it is beneficial
2635 into (x - C2) * C3 < C4. */
2636 if ((code == EQ_EXPR || code == NE_EXPR)
2637 && TREE_CODE (op0) == SSA_NAME
2638 && TREE_CODE (op1) == INTEGER_CST)
2639 code = maybe_optimize_mod_cmp (code, &op0, &op1);
2640
2641 /* Optimize (x - y) < 0 into x < y if x - y has undefined overflow. */
2642 if (!TYPE_UNSIGNED (TREE_TYPE (op0))
2643 && (code == LT_EXPR || code == LE_EXPR
2644 || code == GT_EXPR || code == GE_EXPR)
2645 && integer_zerop (op1)
2646 && TREE_CODE (op0) == SSA_NAME)
2647 maybe_optimize_sub_cmp_0 (code, &op0, &op1);
2648
2649 last2 = last = get_last_insn ();
2650
2651 extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
2652 set_curr_insn_location (gimple_location (stmt));
2653
2654 /* These flags have no purpose in RTL land. */
2655 true_edge->flags &= ~EDGE_TRUE_VALUE;
2656 false_edge->flags &= ~EDGE_FALSE_VALUE;
2657
2658 /* We can either have a pure conditional jump with one fallthru edge or
2659 two-way jump that needs to be decomposed into two basic blocks. */
2660 if (false_edge->dest == bb->next_bb)
2661 {
2662 jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest),
2663 true_edge->probability);
2664 maybe_dump_rtl_for_gimple_stmt (stmt, last);
2665 if (true_edge->goto_locus != UNKNOWN_LOCATION)
2666 set_curr_insn_location (true_edge->goto_locus);
2667 false_edge->flags |= EDGE_FALLTHRU;
2668 maybe_cleanup_end_of_block (false_edge, last);
2669 return NULL;
2670 }
2671 if (true_edge->dest == bb->next_bb)
2672 {
2673 jumpifnot_1 (code, op0, op1, label_rtx_for_bb (false_edge->dest),
2674 false_edge->probability);
2675 maybe_dump_rtl_for_gimple_stmt (stmt, last);
2676 if (false_edge->goto_locus != UNKNOWN_LOCATION)
2677 set_curr_insn_location (false_edge->goto_locus);
2678 true_edge->flags |= EDGE_FALLTHRU;
2679 maybe_cleanup_end_of_block (true_edge, last);
2680 return NULL;
2681 }
2682
2683 jumpif_1 (code, op0, op1, label_rtx_for_bb (true_edge->dest),
2684 true_edge->probability);
2685 last = get_last_insn ();
2686 if (false_edge->goto_locus != UNKNOWN_LOCATION)
2687 set_curr_insn_location (false_edge->goto_locus);
2688 emit_jump (label_rtx_for_bb (false_edge->dest));
2689
2690 BB_END (bb) = last;
2691 if (BARRIER_P (BB_END (bb)))
2692 BB_END (bb) = PREV_INSN (BB_END (bb));
2693 update_bb_for_insn (bb);
2694
2695 new_bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
2696 dest = false_edge->dest;
2697 redirect_edge_succ (false_edge, new_bb);
2698 false_edge->flags |= EDGE_FALLTHRU;
2699 new_bb->count = false_edge->count ();
2700 loop_p loop = find_common_loop (bb->loop_father, dest->loop_father);
2701 add_bb_to_loop (new_bb, loop);
2702 if (loop->latch == bb
2703 && loop->header == dest)
2704 loop->latch = new_bb;
2705 make_single_succ_edge (new_bb, dest, 0);
2706 if (BARRIER_P (BB_END (new_bb)))
2707 BB_END (new_bb) = PREV_INSN (BB_END (new_bb));
2708 update_bb_for_insn (new_bb);
2709
2710 maybe_dump_rtl_for_gimple_stmt (stmt, last2);
2711
2712 if (true_edge->goto_locus != UNKNOWN_LOCATION)
2713 {
2714 set_curr_insn_location (true_edge->goto_locus);
2715 true_edge->goto_locus = curr_insn_location ();
2716 }
2717
2718 return new_bb;
2719 }
2720
2721 /* Mark all calls that can have a transaction restart. */
2722
2723 static void
mark_transaction_restart_calls(gimple * stmt)2724 mark_transaction_restart_calls (gimple *stmt)
2725 {
2726 struct tm_restart_node dummy;
2727 tm_restart_node **slot;
2728
2729 if (!cfun->gimple_df->tm_restart)
2730 return;
2731
2732 dummy.stmt = stmt;
2733 slot = cfun->gimple_df->tm_restart->find_slot (&dummy, NO_INSERT);
2734 if (slot)
2735 {
2736 struct tm_restart_node *n = *slot;
2737 tree list = n->label_or_list;
2738 rtx_insn *insn;
2739
2740 for (insn = next_real_insn (get_last_insn ());
2741 !CALL_P (insn);
2742 insn = next_real_insn (insn))
2743 continue;
2744
2745 if (TREE_CODE (list) == LABEL_DECL)
2746 add_reg_note (insn, REG_TM, label_rtx (list));
2747 else
2748 for (; list ; list = TREE_CHAIN (list))
2749 add_reg_note (insn, REG_TM, label_rtx (TREE_VALUE (list)));
2750 }
2751 }
2752
2753 /* A subroutine of expand_gimple_stmt_1, expanding one GIMPLE_CALL
2754 statement STMT. */
2755
2756 static void
expand_call_stmt(gcall * stmt)2757 expand_call_stmt (gcall *stmt)
2758 {
2759 tree exp, decl, lhs;
2760 bool builtin_p;
2761 size_t i;
2762
2763 if (gimple_call_internal_p (stmt))
2764 {
2765 expand_internal_call (stmt);
2766 return;
2767 }
2768
2769 /* If this is a call to a built-in function and it has no effect other
2770 than setting the lhs, try to implement it using an internal function
2771 instead. */
2772 decl = gimple_call_fndecl (stmt);
2773 if (gimple_call_lhs (stmt)
2774 && !gimple_has_side_effects (stmt)
2775 && (optimize || (decl && called_as_built_in (decl))))
2776 {
2777 internal_fn ifn = replacement_internal_fn (stmt);
2778 if (ifn != IFN_LAST)
2779 {
2780 expand_internal_call (ifn, stmt);
2781 return;
2782 }
2783 }
2784
2785 exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3);
2786
2787 CALL_EXPR_FN (exp) = gimple_call_fn (stmt);
2788 builtin_p = decl && fndecl_built_in_p (decl);
2789
2790 /* If this is not a builtin function, the function type through which the
2791 call is made may be different from the type of the function. */
2792 if (!builtin_p)
2793 CALL_EXPR_FN (exp)
2794 = fold_convert (build_pointer_type (gimple_call_fntype (stmt)),
2795 CALL_EXPR_FN (exp));
2796
2797 TREE_TYPE (exp) = gimple_call_return_type (stmt);
2798 CALL_EXPR_STATIC_CHAIN (exp) = gimple_call_chain (stmt);
2799
2800 for (i = 0; i < gimple_call_num_args (stmt); i++)
2801 {
2802 tree arg = gimple_call_arg (stmt, i);
2803 gimple *def;
2804 /* TER addresses into arguments of builtin functions so we have a
2805 chance to infer more correct alignment information. See PR39954. */
2806 if (builtin_p
2807 && TREE_CODE (arg) == SSA_NAME
2808 && (def = get_gimple_for_ssa_name (arg))
2809 && gimple_assign_rhs_code (def) == ADDR_EXPR)
2810 arg = gimple_assign_rhs1 (def);
2811 CALL_EXPR_ARG (exp, i) = arg;
2812 }
2813
2814 if (gimple_has_side_effects (stmt)
2815 /* ??? Downstream in expand_expr_real_1 we assume that expressions
2816 w/o side-effects do not throw so work around this here. */
2817 || stmt_could_throw_p (cfun, stmt))
2818 TREE_SIDE_EFFECTS (exp) = 1;
2819
2820 if (gimple_call_nothrow_p (stmt))
2821 TREE_NOTHROW (exp) = 1;
2822
2823 CALL_EXPR_TAILCALL (exp) = gimple_call_tail_p (stmt);
2824 CALL_EXPR_MUST_TAIL_CALL (exp) = gimple_call_must_tail_p (stmt);
2825 CALL_EXPR_RETURN_SLOT_OPT (exp) = gimple_call_return_slot_opt_p (stmt);
2826 if (decl
2827 && fndecl_built_in_p (decl, BUILT_IN_NORMAL)
2828 && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (decl)))
2829 CALL_ALLOCA_FOR_VAR_P (exp) = gimple_call_alloca_for_var_p (stmt);
2830 else
2831 CALL_FROM_THUNK_P (exp) = gimple_call_from_thunk_p (stmt);
2832 CALL_EXPR_VA_ARG_PACK (exp) = gimple_call_va_arg_pack_p (stmt);
2833 CALL_EXPR_BY_DESCRIPTOR (exp) = gimple_call_by_descriptor_p (stmt);
2834 SET_EXPR_LOCATION (exp, gimple_location (stmt));
2835
2836 /* Must come after copying location. */
2837 copy_warning (exp, stmt);
2838
2839 /* Ensure RTL is created for debug args. */
2840 if (decl && DECL_HAS_DEBUG_ARGS_P (decl))
2841 {
2842 vec<tree, va_gc> **debug_args = decl_debug_args_lookup (decl);
2843 unsigned int ix;
2844 tree dtemp;
2845
2846 if (debug_args)
2847 for (ix = 1; (*debug_args)->iterate (ix, &dtemp); ix += 2)
2848 {
2849 gcc_assert (TREE_CODE (dtemp) == DEBUG_EXPR_DECL);
2850 expand_debug_expr (dtemp);
2851 }
2852 }
2853
2854 rtx_insn *before_call = get_last_insn ();
2855 lhs = gimple_call_lhs (stmt);
2856 if (lhs)
2857 expand_assignment (lhs, exp, false);
2858 else
2859 expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
2860
2861 /* If the gimple call is an indirect call and has 'nocf_check'
2862 attribute find a generated CALL insn to mark it as no
2863 control-flow verification is needed. */
2864 if (gimple_call_nocf_check_p (stmt)
2865 && !gimple_call_fndecl (stmt))
2866 {
2867 rtx_insn *last = get_last_insn ();
2868 while (!CALL_P (last)
2869 && last != before_call)
2870 last = PREV_INSN (last);
2871
2872 if (last != before_call)
2873 add_reg_note (last, REG_CALL_NOCF_CHECK, const0_rtx);
2874 }
2875
2876 mark_transaction_restart_calls (stmt);
2877 }
2878
2879
2880 /* Generate RTL for an asm statement (explicit assembler code).
2881 STRING is a STRING_CST node containing the assembler code text,
2882 or an ADDR_EXPR containing a STRING_CST. VOL nonzero means the
2883 insn is volatile; don't optimize it. */
2884
2885 static void
expand_asm_loc(tree string,int vol,location_t locus)2886 expand_asm_loc (tree string, int vol, location_t locus)
2887 {
2888 rtx body;
2889
2890 body = gen_rtx_ASM_INPUT_loc (VOIDmode,
2891 ggc_strdup (TREE_STRING_POINTER (string)),
2892 locus);
2893
2894 MEM_VOLATILE_P (body) = vol;
2895
2896 /* Non-empty basic ASM implicitly clobbers memory. */
2897 if (TREE_STRING_LENGTH (string) != 0)
2898 {
2899 rtx asm_op, clob;
2900 unsigned i, nclobbers;
2901 auto_vec<rtx> input_rvec, output_rvec;
2902 auto_vec<machine_mode> input_mode;
2903 auto_vec<const char *> constraints;
2904 auto_vec<rtx> clobber_rvec;
2905 HARD_REG_SET clobbered_regs;
2906 CLEAR_HARD_REG_SET (clobbered_regs);
2907
2908 clob = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode));
2909 clobber_rvec.safe_push (clob);
2910
2911 if (targetm.md_asm_adjust)
2912 targetm.md_asm_adjust (output_rvec, input_rvec, input_mode,
2913 constraints, clobber_rvec, clobbered_regs,
2914 locus);
2915
2916 asm_op = body;
2917 nclobbers = clobber_rvec.length ();
2918 body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (1 + nclobbers));
2919
2920 XVECEXP (body, 0, 0) = asm_op;
2921 for (i = 0; i < nclobbers; i++)
2922 XVECEXP (body, 0, i + 1) = gen_rtx_CLOBBER (VOIDmode, clobber_rvec[i]);
2923 }
2924
2925 emit_insn (body);
2926 }
2927
2928 /* Return the number of times character C occurs in string S. */
2929 static int
n_occurrences(int c,const char * s)2930 n_occurrences (int c, const char *s)
2931 {
2932 int n = 0;
2933 while (*s)
2934 n += (*s++ == c);
2935 return n;
2936 }
2937
2938 /* A subroutine of expand_asm_operands. Check that all operands have
2939 the same number of alternatives. Return true if so. */
2940
2941 static bool
check_operand_nalternatives(const vec<const char * > & constraints)2942 check_operand_nalternatives (const vec<const char *> &constraints)
2943 {
2944 unsigned len = constraints.length();
2945 if (len > 0)
2946 {
2947 int nalternatives = n_occurrences (',', constraints[0]);
2948
2949 if (nalternatives + 1 > MAX_RECOG_ALTERNATIVES)
2950 {
2951 error ("too many alternatives in %<asm%>");
2952 return false;
2953 }
2954
2955 for (unsigned i = 1; i < len; ++i)
2956 if (n_occurrences (',', constraints[i]) != nalternatives)
2957 {
2958 error ("operand constraints for %<asm%> differ "
2959 "in number of alternatives");
2960 return false;
2961 }
2962 }
2963 return true;
2964 }
2965
2966 /* Check for overlap between registers marked in CLOBBERED_REGS and
2967 anything inappropriate in T. Emit error and return the register
2968 variable definition for error, NULL_TREE for ok. */
2969
2970 static bool
tree_conflicts_with_clobbers_p(tree t,HARD_REG_SET * clobbered_regs,location_t loc)2971 tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs,
2972 location_t loc)
2973 {
2974 /* Conflicts between asm-declared register variables and the clobber
2975 list are not allowed. */
2976 tree overlap = tree_overlaps_hard_reg_set (t, clobbered_regs);
2977
2978 if (overlap)
2979 {
2980 error_at (loc, "%<asm%> specifier for variable %qE conflicts with "
2981 "%<asm%> clobber list", DECL_NAME (overlap));
2982
2983 /* Reset registerness to stop multiple errors emitted for a single
2984 variable. */
2985 DECL_REGISTER (overlap) = 0;
2986 return true;
2987 }
2988
2989 return false;
2990 }
2991
2992 /* Check that the given REGNO spanning NREGS is a valid
2993 asm clobber operand. Some HW registers cannot be
2994 saved/restored, hence they should not be clobbered by
2995 asm statements. */
2996 static bool
asm_clobber_reg_is_valid(int regno,int nregs,const char * regname)2997 asm_clobber_reg_is_valid (int regno, int nregs, const char *regname)
2998 {
2999 bool is_valid = true;
3000 HARD_REG_SET regset;
3001
3002 CLEAR_HARD_REG_SET (regset);
3003
3004 add_range_to_hard_reg_set (®set, regno, nregs);
3005
3006 /* Clobbering the PIC register is an error. */
3007 if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
3008 && overlaps_hard_reg_set_p (regset, Pmode, PIC_OFFSET_TABLE_REGNUM))
3009 {
3010 /* ??? Diagnose during gimplification? */
3011 error ("PIC register clobbered by %qs in %<asm%>", regname);
3012 is_valid = false;
3013 }
3014 else if (!in_hard_reg_set_p
3015 (accessible_reg_set, reg_raw_mode[regno], regno))
3016 {
3017 /* ??? Diagnose during gimplification? */
3018 error ("the register %qs cannot be clobbered in %<asm%>"
3019 " for the current target", regname);
3020 is_valid = false;
3021 }
3022
3023 /* Clobbering the stack pointer register is deprecated. GCC expects
3024 the value of the stack pointer after an asm statement to be the same
3025 as it was before, so no asm can validly clobber the stack pointer in
3026 the usual sense. Adding the stack pointer to the clobber list has
3027 traditionally had some undocumented and somewhat obscure side-effects. */
3028 if (overlaps_hard_reg_set_p (regset, Pmode, STACK_POINTER_REGNUM))
3029 {
3030 crtl->sp_is_clobbered_by_asm = true;
3031 if (warning (OPT_Wdeprecated, "listing the stack pointer register"
3032 " %qs in a clobber list is deprecated", regname))
3033 inform (input_location, "the value of the stack pointer after"
3034 " an %<asm%> statement must be the same as it was before"
3035 " the statement");
3036 }
3037
3038 return is_valid;
3039 }
3040
3041 /* Generate RTL for an asm statement with arguments.
3042 STRING is the instruction template.
3043 OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
3044 Each output or input has an expression in the TREE_VALUE and
3045 a tree list in TREE_PURPOSE which in turn contains a constraint
3046 name in TREE_VALUE (or NULL_TREE) and a constraint string
3047 in TREE_PURPOSE.
3048 CLOBBERS is a list of STRING_CST nodes each naming a hard register
3049 that is clobbered by this insn.
3050
3051 LABELS is a list of labels, and if LABELS is non-NULL, FALLTHRU_BB
3052 should be the fallthru basic block of the asm goto.
3053
3054 Not all kinds of lvalue that may appear in OUTPUTS can be stored directly.
3055 Some elements of OUTPUTS may be replaced with trees representing temporary
3056 values. The caller should copy those temporary values to the originally
3057 specified lvalues.
3058
3059 VOL nonzero means the insn is volatile; don't optimize it. */
3060
3061 static void
expand_asm_stmt(gasm * stmt)3062 expand_asm_stmt (gasm *stmt)
3063 {
3064 class save_input_location
3065 {
3066 location_t old;
3067
3068 public:
3069 explicit save_input_location(location_t where)
3070 {
3071 old = input_location;
3072 input_location = where;
3073 }
3074
3075 ~save_input_location()
3076 {
3077 input_location = old;
3078 }
3079 };
3080
3081 location_t locus = gimple_location (stmt);
3082
3083 if (gimple_asm_input_p (stmt))
3084 {
3085 const char *s = gimple_asm_string (stmt);
3086 tree string = build_string (strlen (s), s);
3087 expand_asm_loc (string, gimple_asm_volatile_p (stmt), locus);
3088 return;
3089 }
3090
3091 /* There are some legacy diagnostics in here. */
3092 save_input_location s_i_l(locus);
3093
3094 unsigned noutputs = gimple_asm_noutputs (stmt);
3095 unsigned ninputs = gimple_asm_ninputs (stmt);
3096 unsigned nlabels = gimple_asm_nlabels (stmt);
3097 unsigned i;
3098 bool error_seen = false;
3099
3100 /* ??? Diagnose during gimplification? */
3101 if (ninputs + noutputs + nlabels > MAX_RECOG_OPERANDS)
3102 {
3103 error_at (locus, "more than %d operands in %<asm%>", MAX_RECOG_OPERANDS);
3104 return;
3105 }
3106
3107 auto_vec<tree, MAX_RECOG_OPERANDS> output_tvec;
3108 auto_vec<tree, MAX_RECOG_OPERANDS> input_tvec;
3109 auto_vec<const char *, MAX_RECOG_OPERANDS> constraints;
3110
3111 /* Copy the gimple vectors into new vectors that we can manipulate. */
3112
3113 output_tvec.safe_grow (noutputs, true);
3114 input_tvec.safe_grow (ninputs, true);
3115 constraints.safe_grow (noutputs + ninputs, true);
3116
3117 for (i = 0; i < noutputs; ++i)
3118 {
3119 tree t = gimple_asm_output_op (stmt, i);
3120 output_tvec[i] = TREE_VALUE (t);
3121 constraints[i] = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
3122 }
3123 for (i = 0; i < ninputs; i++)
3124 {
3125 tree t = gimple_asm_input_op (stmt, i);
3126 input_tvec[i] = TREE_VALUE (t);
3127 constraints[i + noutputs]
3128 = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
3129 }
3130
3131 /* ??? Diagnose during gimplification? */
3132 if (! check_operand_nalternatives (constraints))
3133 return;
3134
3135 /* Count the number of meaningful clobbered registers, ignoring what
3136 we would ignore later. */
3137 auto_vec<rtx> clobber_rvec;
3138 HARD_REG_SET clobbered_regs;
3139 CLEAR_HARD_REG_SET (clobbered_regs);
3140
3141 if (unsigned n = gimple_asm_nclobbers (stmt))
3142 {
3143 clobber_rvec.reserve (n);
3144 for (i = 0; i < n; i++)
3145 {
3146 tree t = gimple_asm_clobber_op (stmt, i);
3147 const char *regname = TREE_STRING_POINTER (TREE_VALUE (t));
3148 int nregs, j;
3149
3150 j = decode_reg_name_and_count (regname, &nregs);
3151 if (j < 0)
3152 {
3153 if (j == -2)
3154 {
3155 /* ??? Diagnose during gimplification? */
3156 error_at (locus, "unknown register name %qs in %<asm%>",
3157 regname);
3158 error_seen = true;
3159 }
3160 else if (j == -4)
3161 {
3162 rtx x = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode));
3163 clobber_rvec.safe_push (x);
3164 }
3165 else
3166 {
3167 /* Otherwise we should have -1 == empty string
3168 or -3 == cc, which is not a register. */
3169 gcc_assert (j == -1 || j == -3);
3170 }
3171 }
3172 else
3173 for (int reg = j; reg < j + nregs; reg++)
3174 {
3175 if (!asm_clobber_reg_is_valid (reg, nregs, regname))
3176 return;
3177
3178 SET_HARD_REG_BIT (clobbered_regs, reg);
3179 rtx x = gen_rtx_REG (reg_raw_mode[reg], reg);
3180 clobber_rvec.safe_push (x);
3181 }
3182 }
3183 }
3184
3185 /* First pass over inputs and outputs checks validity and sets
3186 mark_addressable if needed. */
3187 /* ??? Diagnose during gimplification? */
3188
3189 for (i = 0; i < noutputs; ++i)
3190 {
3191 tree val = output_tvec[i];
3192 tree type = TREE_TYPE (val);
3193 const char *constraint;
3194 bool is_inout;
3195 bool allows_reg;
3196 bool allows_mem;
3197
3198 /* Try to parse the output constraint. If that fails, there's
3199 no point in going further. */
3200 constraint = constraints[i];
3201 if (!parse_output_constraint (&constraint, i, ninputs, noutputs,
3202 &allows_mem, &allows_reg, &is_inout))
3203 return;
3204
3205 /* If the output is a hard register, verify it doesn't conflict with
3206 any other operand's possible hard register use. */
3207 if (DECL_P (val)
3208 && REG_P (DECL_RTL (val))
3209 && HARD_REGISTER_P (DECL_RTL (val)))
3210 {
3211 unsigned j, output_hregno = REGNO (DECL_RTL (val));
3212 bool early_clobber_p = strchr (constraints[i], '&') != NULL;
3213 unsigned long match;
3214
3215 /* Verify the other outputs do not use the same hard register. */
3216 for (j = i + 1; j < noutputs; ++j)
3217 if (DECL_P (output_tvec[j])
3218 && REG_P (DECL_RTL (output_tvec[j]))
3219 && HARD_REGISTER_P (DECL_RTL (output_tvec[j]))
3220 && output_hregno == REGNO (DECL_RTL (output_tvec[j])))
3221 {
3222 error_at (locus, "invalid hard register usage between output "
3223 "operands");
3224 error_seen = true;
3225 }
3226
3227 /* Verify matching constraint operands use the same hard register
3228 and that the non-matching constraint operands do not use the same
3229 hard register if the output is an early clobber operand. */
3230 for (j = 0; j < ninputs; ++j)
3231 if (DECL_P (input_tvec[j])
3232 && REG_P (DECL_RTL (input_tvec[j]))
3233 && HARD_REGISTER_P (DECL_RTL (input_tvec[j])))
3234 {
3235 unsigned input_hregno = REGNO (DECL_RTL (input_tvec[j]));
3236 switch (*constraints[j + noutputs])
3237 {
3238 case '0': case '1': case '2': case '3': case '4':
3239 case '5': case '6': case '7': case '8': case '9':
3240 match = strtoul (constraints[j + noutputs], NULL, 10);
3241 break;
3242 default:
3243 match = ULONG_MAX;
3244 break;
3245 }
3246 if (i == match
3247 && output_hregno != input_hregno)
3248 {
3249 error_at (locus, "invalid hard register usage between "
3250 "output operand and matching constraint operand");
3251 error_seen = true;
3252 }
3253 else if (early_clobber_p
3254 && i != match
3255 && output_hregno == input_hregno)
3256 {
3257 error_at (locus, "invalid hard register usage between "
3258 "earlyclobber operand and input operand");
3259 error_seen = true;
3260 }
3261 }
3262 }
3263
3264 if (! allows_reg
3265 && (allows_mem
3266 || is_inout
3267 || (DECL_P (val)
3268 && REG_P (DECL_RTL (val))
3269 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type))))
3270 mark_addressable (val);
3271 }
3272
3273 for (i = 0; i < ninputs; ++i)
3274 {
3275 bool allows_reg, allows_mem;
3276 const char *constraint;
3277
3278 constraint = constraints[i + noutputs];
3279 if (! parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
3280 constraints.address (),
3281 &allows_mem, &allows_reg))
3282 return;
3283
3284 if (! allows_reg && allows_mem)
3285 mark_addressable (input_tvec[i]);
3286 }
3287
3288 /* Second pass evaluates arguments. */
3289
3290 /* Make sure stack is consistent for asm goto. */
3291 if (nlabels > 0)
3292 do_pending_stack_adjust ();
3293 int old_generating_concat_p = generating_concat_p;
3294
3295 /* Vector of RTX's of evaluated output operands. */
3296 auto_vec<rtx, MAX_RECOG_OPERANDS> output_rvec;
3297 auto_vec<int, MAX_RECOG_OPERANDS> inout_opnum;
3298 rtx_insn *after_rtl_seq = NULL, *after_rtl_end = NULL;
3299
3300 output_rvec.safe_grow (noutputs, true);
3301
3302 for (i = 0; i < noutputs; ++i)
3303 {
3304 tree val = output_tvec[i];
3305 tree type = TREE_TYPE (val);
3306 bool is_inout, allows_reg, allows_mem, ok;
3307 rtx op;
3308
3309 ok = parse_output_constraint (&constraints[i], i, ninputs,
3310 noutputs, &allows_mem, &allows_reg,
3311 &is_inout);
3312 gcc_assert (ok);
3313
3314 /* If an output operand is not a decl or indirect ref and our constraint
3315 allows a register, make a temporary to act as an intermediate.
3316 Make the asm insn write into that, then we will copy it to
3317 the real output operand. Likewise for promoted variables. */
3318
3319 generating_concat_p = 0;
3320
3321 gcc_assert (TREE_CODE (val) != INDIRECT_REF);
3322 if (((TREE_CODE (val) == MEM_REF
3323 && TREE_CODE (TREE_OPERAND (val, 0)) != ADDR_EXPR)
3324 && allows_mem)
3325 || (DECL_P (val)
3326 && (allows_mem || REG_P (DECL_RTL (val)))
3327 && ! (REG_P (DECL_RTL (val))
3328 && GET_MODE (DECL_RTL (val)) != TYPE_MODE (type)))
3329 || ! allows_reg
3330 || is_inout
3331 || TREE_ADDRESSABLE (type)
3332 || (!tree_fits_poly_int64_p (TYPE_SIZE (type))
3333 && !known_size_p (max_int_size_in_bytes (type))))
3334 {
3335 op = expand_expr (val, NULL_RTX, VOIDmode,
3336 !allows_reg ? EXPAND_MEMORY : EXPAND_WRITE);
3337 if (MEM_P (op))
3338 op = validize_mem (op);
3339
3340 if (! allows_reg && !MEM_P (op))
3341 {
3342 error_at (locus, "output number %d not directly addressable", i);
3343 error_seen = true;
3344 }
3345 if ((! allows_mem && MEM_P (op) && GET_MODE (op) != BLKmode)
3346 || GET_CODE (op) == CONCAT)
3347 {
3348 rtx old_op = op;
3349 op = gen_reg_rtx (GET_MODE (op));
3350
3351 generating_concat_p = old_generating_concat_p;
3352
3353 if (is_inout)
3354 emit_move_insn (op, old_op);
3355
3356 push_to_sequence2 (after_rtl_seq, after_rtl_end);
3357 emit_move_insn (old_op, op);
3358 after_rtl_seq = get_insns ();
3359 after_rtl_end = get_last_insn ();
3360 end_sequence ();
3361 }
3362 }
3363 else
3364 {
3365 op = assign_temp (type, 0, 1);
3366 op = validize_mem (op);
3367 if (!MEM_P (op) && TREE_CODE (val) == SSA_NAME)
3368 set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (val), op);
3369
3370 generating_concat_p = old_generating_concat_p;
3371
3372 push_to_sequence2 (after_rtl_seq, after_rtl_end);
3373 expand_assignment (val, make_tree (type, op), false);
3374 after_rtl_seq = get_insns ();
3375 after_rtl_end = get_last_insn ();
3376 end_sequence ();
3377 }
3378 output_rvec[i] = op;
3379
3380 if (is_inout)
3381 inout_opnum.safe_push (i);
3382 }
3383
3384 const char *str = gimple_asm_string (stmt);
3385 if (error_seen)
3386 {
3387 ninputs = 0;
3388 noutputs = 0;
3389 inout_opnum.truncate (0);
3390 output_rvec.truncate (0);
3391 clobber_rvec.truncate (0);
3392 constraints.truncate (0);
3393 CLEAR_HARD_REG_SET (clobbered_regs);
3394 str = "";
3395 }
3396
3397 auto_vec<rtx, MAX_RECOG_OPERANDS> input_rvec;
3398 auto_vec<machine_mode, MAX_RECOG_OPERANDS> input_mode;
3399
3400 input_rvec.safe_grow (ninputs, true);
3401 input_mode.safe_grow (ninputs, true);
3402
3403 generating_concat_p = 0;
3404
3405 for (i = 0; i < ninputs; ++i)
3406 {
3407 tree val = input_tvec[i];
3408 tree type = TREE_TYPE (val);
3409 bool allows_reg, allows_mem, ok;
3410 const char *constraint;
3411 rtx op;
3412
3413 constraint = constraints[i + noutputs];
3414 ok = parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
3415 constraints.address (),
3416 &allows_mem, &allows_reg);
3417 gcc_assert (ok);
3418
3419 /* EXPAND_INITIALIZER will not generate code for valid initializer
3420 constants, but will still generate code for other types of operand.
3421 This is the behavior we want for constant constraints. */
3422 op = expand_expr (val, NULL_RTX, VOIDmode,
3423 allows_reg ? EXPAND_NORMAL
3424 : allows_mem ? EXPAND_MEMORY
3425 : EXPAND_INITIALIZER);
3426
3427 /* Never pass a CONCAT to an ASM. */
3428 if (GET_CODE (op) == CONCAT)
3429 op = force_reg (GET_MODE (op), op);
3430 else if (MEM_P (op))
3431 op = validize_mem (op);
3432
3433 if (asm_operand_ok (op, constraint, NULL) <= 0)
3434 {
3435 if (allows_reg && TYPE_MODE (type) != BLKmode)
3436 op = force_reg (TYPE_MODE (type), op);
3437 else if (!allows_mem)
3438 warning_at (locus, 0, "%<asm%> operand %d probably does not match "
3439 "constraints", i + noutputs);
3440 else if (MEM_P (op))
3441 {
3442 /* We won't recognize either volatile memory or memory
3443 with a queued address as available a memory_operand
3444 at this point. Ignore it: clearly this *is* a memory. */
3445 }
3446 else
3447 gcc_unreachable ();
3448 }
3449 input_rvec[i] = op;
3450 input_mode[i] = TYPE_MODE (type);
3451 }
3452
3453 /* For in-out operands, copy output rtx to input rtx. */
3454 unsigned ninout = inout_opnum.length ();
3455 for (i = 0; i < ninout; i++)
3456 {
3457 int j = inout_opnum[i];
3458 rtx o = output_rvec[j];
3459
3460 input_rvec.safe_push (o);
3461 input_mode.safe_push (GET_MODE (o));
3462
3463 char buffer[16];
3464 sprintf (buffer, "%d", j);
3465 constraints.safe_push (ggc_strdup (buffer));
3466 }
3467 ninputs += ninout;
3468
3469 /* Sometimes we wish to automatically clobber registers across an asm.
3470 Case in point is when the i386 backend moved from cc0 to a hard reg --
3471 maintaining source-level compatibility means automatically clobbering
3472 the flags register. */
3473 rtx_insn *after_md_seq = NULL;
3474 if (targetm.md_asm_adjust)
3475 after_md_seq
3476 = targetm.md_asm_adjust (output_rvec, input_rvec, input_mode,
3477 constraints, clobber_rvec, clobbered_regs,
3478 locus);
3479
3480 /* Do not allow the hook to change the output and input count,
3481 lest it mess up the operand numbering. */
3482 gcc_assert (output_rvec.length() == noutputs);
3483 gcc_assert (input_rvec.length() == ninputs);
3484 gcc_assert (constraints.length() == noutputs + ninputs);
3485
3486 /* But it certainly can adjust the clobbers. */
3487 unsigned nclobbers = clobber_rvec.length ();
3488
3489 /* Third pass checks for easy conflicts. */
3490 /* ??? Why are we doing this on trees instead of rtx. */
3491
3492 bool clobber_conflict_found = 0;
3493 for (i = 0; i < noutputs; ++i)
3494 if (tree_conflicts_with_clobbers_p (output_tvec[i], &clobbered_regs, locus))
3495 clobber_conflict_found = 1;
3496 for (i = 0; i < ninputs - ninout; ++i)
3497 if (tree_conflicts_with_clobbers_p (input_tvec[i], &clobbered_regs, locus))
3498 clobber_conflict_found = 1;
3499
3500 /* Make vectors for the expression-rtx, constraint strings,
3501 and named operands. */
3502
3503 rtvec argvec = rtvec_alloc (ninputs);
3504 rtvec constraintvec = rtvec_alloc (ninputs);
3505 rtvec labelvec = rtvec_alloc (nlabels);
3506
3507 rtx body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
3508 : GET_MODE (output_rvec[0])),
3509 ggc_strdup (str),
3510 "", 0, argvec, constraintvec,
3511 labelvec, locus);
3512 MEM_VOLATILE_P (body) = gimple_asm_volatile_p (stmt);
3513
3514 for (i = 0; i < ninputs; ++i)
3515 {
3516 ASM_OPERANDS_INPUT (body, i) = input_rvec[i];
3517 ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
3518 = gen_rtx_ASM_INPUT_loc (input_mode[i],
3519 constraints[i + noutputs],
3520 locus);
3521 }
3522
3523 /* Copy labels to the vector. */
3524 rtx_code_label *fallthru_label = NULL;
3525 if (nlabels > 0)
3526 {
3527 basic_block fallthru_bb = NULL;
3528 edge fallthru = find_fallthru_edge (gimple_bb (stmt)->succs);
3529 if (fallthru)
3530 fallthru_bb = fallthru->dest;
3531
3532 for (i = 0; i < nlabels; ++i)
3533 {
3534 tree label = TREE_VALUE (gimple_asm_label_op (stmt, i));
3535 rtx_insn *r;
3536 /* If asm goto has any labels in the fallthru basic block, use
3537 a label that we emit immediately after the asm goto. Expansion
3538 may insert further instructions into the same basic block after
3539 asm goto and if we don't do this, insertion of instructions on
3540 the fallthru edge might misbehave. See PR58670. */
3541 if (fallthru_bb && label_to_block (cfun, label) == fallthru_bb)
3542 {
3543 if (fallthru_label == NULL_RTX)
3544 fallthru_label = gen_label_rtx ();
3545 r = fallthru_label;
3546 }
3547 else
3548 r = label_rtx (label);
3549 ASM_OPERANDS_LABEL (body, i) = gen_rtx_LABEL_REF (Pmode, r);
3550 }
3551 }
3552
3553 /* Now, for each output, construct an rtx
3554 (set OUTPUT (asm_operands INSN OUTPUTCONSTRAINT OUTPUTNUMBER
3555 ARGVEC CONSTRAINTS OPNAMES))
3556 If there is more than one, put them inside a PARALLEL. */
3557
3558 if (noutputs == 0 && nclobbers == 0)
3559 {
3560 /* No output operands: put in a raw ASM_OPERANDS rtx. */
3561 if (nlabels > 0)
3562 emit_jump_insn (body);
3563 else
3564 emit_insn (body);
3565 }
3566 else if (noutputs == 1 && nclobbers == 0)
3567 {
3568 ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0];
3569 if (nlabels > 0)
3570 emit_jump_insn (gen_rtx_SET (output_rvec[0], body));
3571 else
3572 emit_insn (gen_rtx_SET (output_rvec[0], body));
3573 }
3574 else
3575 {
3576 rtx obody = body;
3577 int num = noutputs;
3578
3579 if (num == 0)
3580 num = 1;
3581
3582 body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (num + nclobbers));
3583
3584 /* For each output operand, store a SET. */
3585 for (i = 0; i < noutputs; ++i)
3586 {
3587 rtx src, o = output_rvec[i];
3588 if (i == 0)
3589 {
3590 ASM_OPERANDS_OUTPUT_CONSTRAINT (obody) = constraints[0];
3591 src = obody;
3592 }
3593 else
3594 {
3595 src = gen_rtx_ASM_OPERANDS (GET_MODE (o),
3596 ASM_OPERANDS_TEMPLATE (obody),
3597 constraints[i], i, argvec,
3598 constraintvec, labelvec, locus);
3599 MEM_VOLATILE_P (src) = gimple_asm_volatile_p (stmt);
3600 }
3601 XVECEXP (body, 0, i) = gen_rtx_SET (o, src);
3602 }
3603
3604 /* If there are no outputs (but there are some clobbers)
3605 store the bare ASM_OPERANDS into the PARALLEL. */
3606 if (i == 0)
3607 XVECEXP (body, 0, i++) = obody;
3608
3609 /* Store (clobber REG) for each clobbered register specified. */
3610 for (unsigned j = 0; j < nclobbers; ++j)
3611 {
3612 rtx clobbered_reg = clobber_rvec[j];
3613
3614 /* Do sanity check for overlap between clobbers and respectively
3615 input and outputs that hasn't been handled. Such overlap
3616 should have been detected and reported above. */
3617 if (!clobber_conflict_found && REG_P (clobbered_reg))
3618 {
3619 /* We test the old body (obody) contents to avoid
3620 tripping over the under-construction body. */
3621 for (unsigned k = 0; k < noutputs; ++k)
3622 if (reg_overlap_mentioned_p (clobbered_reg, output_rvec[k]))
3623 internal_error ("%<asm%> clobber conflict with "
3624 "output operand");
3625
3626 for (unsigned k = 0; k < ninputs - ninout; ++k)
3627 if (reg_overlap_mentioned_p (clobbered_reg, input_rvec[k]))
3628 internal_error ("%<asm%> clobber conflict with "
3629 "input operand");
3630 }
3631
3632 XVECEXP (body, 0, i++) = gen_rtx_CLOBBER (VOIDmode, clobbered_reg);
3633 }
3634
3635 if (nlabels > 0)
3636 emit_jump_insn (body);
3637 else
3638 emit_insn (body);
3639 }
3640
3641 generating_concat_p = old_generating_concat_p;
3642
3643 if (fallthru_label)
3644 emit_label (fallthru_label);
3645
3646 if (after_md_seq)
3647 emit_insn (after_md_seq);
3648 if (after_rtl_seq)
3649 {
3650 if (nlabels == 0)
3651 emit_insn (after_rtl_seq);
3652 else
3653 {
3654 edge e;
3655 edge_iterator ei;
3656
3657 FOR_EACH_EDGE (e, ei, gimple_bb (stmt)->succs)
3658 {
3659 start_sequence ();
3660 for (rtx_insn *curr = after_rtl_seq;
3661 curr != NULL_RTX;
3662 curr = NEXT_INSN (curr))
3663 emit_insn (copy_insn (PATTERN (curr)));
3664 rtx_insn *copy = get_insns ();
3665 end_sequence ();
3666 prepend_insn_to_edge (copy, e);
3667 }
3668 }
3669 }
3670
3671 free_temp_slots ();
3672 crtl->has_asm_statement = 1;
3673 }
3674
3675 /* Emit code to jump to the address
3676 specified by the pointer expression EXP. */
3677
3678 static void
expand_computed_goto(tree exp)3679 expand_computed_goto (tree exp)
3680 {
3681 rtx x = expand_normal (exp);
3682
3683 do_pending_stack_adjust ();
3684 emit_indirect_jump (x);
3685 }
3686
3687 /* Generate RTL code for a `goto' statement with target label LABEL.
3688 LABEL should be a LABEL_DECL tree node that was or will later be
3689 defined with `expand_label'. */
3690
3691 static void
expand_goto(tree label)3692 expand_goto (tree label)
3693 {
3694 if (flag_checking)
3695 {
3696 /* Check for a nonlocal goto to a containing function. Should have
3697 gotten translated to __builtin_nonlocal_goto. */
3698 tree context = decl_function_context (label);
3699 gcc_assert (!context || context == current_function_decl);
3700 }
3701
3702 emit_jump (jump_target_rtx (label));
3703 }
3704
3705 /* Output a return with no value. */
3706
3707 static void
expand_null_return_1(void)3708 expand_null_return_1 (void)
3709 {
3710 clear_pending_stack_adjust ();
3711 do_pending_stack_adjust ();
3712 emit_jump (return_label);
3713 }
3714
3715 /* Generate RTL to return from the current function, with no value.
3716 (That is, we do not do anything about returning any value.) */
3717
3718 void
expand_null_return(void)3719 expand_null_return (void)
3720 {
3721 /* If this function was declared to return a value, but we
3722 didn't, clobber the return registers so that they are not
3723 propagated live to the rest of the function. */
3724 clobber_return_register ();
3725
3726 expand_null_return_1 ();
3727 }
3728
3729 /* Generate RTL to return from the current function, with value VAL. */
3730
3731 static void
expand_value_return(rtx val)3732 expand_value_return (rtx val)
3733 {
3734 /* Copy the value to the return location unless it's already there. */
3735
3736 tree decl = DECL_RESULT (current_function_decl);
3737 rtx return_reg = DECL_RTL (decl);
3738 if (return_reg != val)
3739 {
3740 tree funtype = TREE_TYPE (current_function_decl);
3741 tree type = TREE_TYPE (decl);
3742 int unsignedp = TYPE_UNSIGNED (type);
3743 machine_mode old_mode = DECL_MODE (decl);
3744 machine_mode mode;
3745 if (DECL_BY_REFERENCE (decl))
3746 mode = promote_function_mode (type, old_mode, &unsignedp, funtype, 2);
3747 else
3748 mode = promote_function_mode (type, old_mode, &unsignedp, funtype, 1);
3749
3750 if (mode != old_mode)
3751 val = convert_modes (mode, old_mode, val, unsignedp);
3752
3753 if (GET_CODE (return_reg) == PARALLEL)
3754 emit_group_load (return_reg, val, type, int_size_in_bytes (type));
3755 else
3756 emit_move_insn (return_reg, val);
3757 }
3758
3759 expand_null_return_1 ();
3760 }
3761
3762 /* Generate RTL to evaluate the expression RETVAL and return it
3763 from the current function. */
3764
3765 static void
expand_return(tree retval)3766 expand_return (tree retval)
3767 {
3768 rtx result_rtl;
3769 rtx val = 0;
3770 tree retval_rhs;
3771
3772 /* If function wants no value, give it none. */
3773 if (TREE_CODE (TREE_TYPE (TREE_TYPE (current_function_decl))) == VOID_TYPE)
3774 {
3775 expand_normal (retval);
3776 expand_null_return ();
3777 return;
3778 }
3779
3780 if (retval == error_mark_node)
3781 {
3782 /* Treat this like a return of no value from a function that
3783 returns a value. */
3784 expand_null_return ();
3785 return;
3786 }
3787 else if ((TREE_CODE (retval) == MODIFY_EXPR
3788 || TREE_CODE (retval) == INIT_EXPR)
3789 && TREE_CODE (TREE_OPERAND (retval, 0)) == RESULT_DECL)
3790 retval_rhs = TREE_OPERAND (retval, 1);
3791 else
3792 retval_rhs = retval;
3793
3794 result_rtl = DECL_RTL (DECL_RESULT (current_function_decl));
3795
3796 /* If we are returning the RESULT_DECL, then the value has already
3797 been stored into it, so we don't have to do anything special. */
3798 if (TREE_CODE (retval_rhs) == RESULT_DECL)
3799 expand_value_return (result_rtl);
3800
3801 /* If the result is an aggregate that is being returned in one (or more)
3802 registers, load the registers here. */
3803
3804 else if (retval_rhs != 0
3805 && TYPE_MODE (TREE_TYPE (retval_rhs)) == BLKmode
3806 && REG_P (result_rtl))
3807 {
3808 val = copy_blkmode_to_reg (GET_MODE (result_rtl), retval_rhs);
3809 if (val)
3810 {
3811 /* Use the mode of the result value on the return register. */
3812 PUT_MODE (result_rtl, GET_MODE (val));
3813 expand_value_return (val);
3814 }
3815 else
3816 expand_null_return ();
3817 }
3818 else if (retval_rhs != 0
3819 && !VOID_TYPE_P (TREE_TYPE (retval_rhs))
3820 && (REG_P (result_rtl)
3821 || (GET_CODE (result_rtl) == PARALLEL)))
3822 {
3823 /* Compute the return value into a temporary (usually a pseudo reg). */
3824 val
3825 = assign_temp (TREE_TYPE (DECL_RESULT (current_function_decl)), 0, 1);
3826 val = expand_expr (retval_rhs, val, GET_MODE (val), EXPAND_NORMAL);
3827 val = force_not_mem (val);
3828 expand_value_return (val);
3829 }
3830 else
3831 {
3832 /* No hard reg used; calculate value into hard return reg. */
3833 expand_expr (retval, const0_rtx, VOIDmode, EXPAND_NORMAL);
3834 expand_value_return (result_rtl);
3835 }
3836 }
3837
3838 /* Expand a clobber of LHS. If LHS is stored it in a multi-part
3839 register, tell the rtl optimizers that its value is no longer
3840 needed. */
3841
3842 static void
expand_clobber(tree lhs)3843 expand_clobber (tree lhs)
3844 {
3845 if (DECL_P (lhs))
3846 {
3847 rtx decl_rtl = DECL_RTL_IF_SET (lhs);
3848 if (decl_rtl && REG_P (decl_rtl))
3849 {
3850 machine_mode decl_mode = GET_MODE (decl_rtl);
3851 if (maybe_gt (GET_MODE_SIZE (decl_mode),
3852 REGMODE_NATURAL_SIZE (decl_mode)))
3853 emit_clobber (decl_rtl);
3854 }
3855 }
3856 }
3857
3858 /* A subroutine of expand_gimple_stmt, expanding one gimple statement
3859 STMT that doesn't require special handling for outgoing edges. That
3860 is no tailcalls and no GIMPLE_COND. */
3861
3862 static void
expand_gimple_stmt_1(gimple * stmt)3863 expand_gimple_stmt_1 (gimple *stmt)
3864 {
3865 tree op0;
3866
3867 set_curr_insn_location (gimple_location (stmt));
3868
3869 switch (gimple_code (stmt))
3870 {
3871 case GIMPLE_GOTO:
3872 op0 = gimple_goto_dest (stmt);
3873 if (TREE_CODE (op0) == LABEL_DECL)
3874 expand_goto (op0);
3875 else
3876 expand_computed_goto (op0);
3877 break;
3878 case GIMPLE_LABEL:
3879 expand_label (gimple_label_label (as_a <glabel *> (stmt)));
3880 break;
3881 case GIMPLE_NOP:
3882 case GIMPLE_PREDICT:
3883 break;
3884 case GIMPLE_SWITCH:
3885 {
3886 gswitch *swtch = as_a <gswitch *> (stmt);
3887 if (gimple_switch_num_labels (swtch) == 1)
3888 expand_goto (CASE_LABEL (gimple_switch_default_label (swtch)));
3889 else
3890 expand_case (swtch);
3891 }
3892 break;
3893 case GIMPLE_ASM:
3894 expand_asm_stmt (as_a <gasm *> (stmt));
3895 break;
3896 case GIMPLE_CALL:
3897 expand_call_stmt (as_a <gcall *> (stmt));
3898 break;
3899
3900 case GIMPLE_RETURN:
3901 {
3902 op0 = gimple_return_retval (as_a <greturn *> (stmt));
3903
3904 /* If a return doesn't have a location, it very likely represents
3905 multiple user returns so we cannot let it inherit the location
3906 of the last statement of the previous basic block in RTL. */
3907 if (!gimple_has_location (stmt))
3908 set_curr_insn_location (cfun->function_end_locus);
3909
3910 if (op0 && op0 != error_mark_node)
3911 {
3912 tree result = DECL_RESULT (current_function_decl);
3913
3914 /* If we are not returning the current function's RESULT_DECL,
3915 build an assignment to it. */
3916 if (op0 != result)
3917 {
3918 /* I believe that a function's RESULT_DECL is unique. */
3919 gcc_assert (TREE_CODE (op0) != RESULT_DECL);
3920
3921 /* ??? We'd like to use simply expand_assignment here,
3922 but this fails if the value is of BLKmode but the return
3923 decl is a register. expand_return has special handling
3924 for this combination, which eventually should move
3925 to common code. See comments there. Until then, let's
3926 build a modify expression :-/ */
3927 op0 = build2 (MODIFY_EXPR, TREE_TYPE (result),
3928 result, op0);
3929 }
3930 }
3931
3932 if (!op0)
3933 expand_null_return ();
3934 else
3935 expand_return (op0);
3936 }
3937 break;
3938
3939 case GIMPLE_ASSIGN:
3940 {
3941 gassign *assign_stmt = as_a <gassign *> (stmt);
3942 tree lhs = gimple_assign_lhs (assign_stmt);
3943
3944 /* Tree expand used to fiddle with |= and &= of two bitfield
3945 COMPONENT_REFs here. This can't happen with gimple, the LHS
3946 of binary assigns must be a gimple reg. */
3947
3948 if (TREE_CODE (lhs) != SSA_NAME
3949 || gimple_assign_rhs_class (assign_stmt) == GIMPLE_SINGLE_RHS)
3950 {
3951 tree rhs = gimple_assign_rhs1 (assign_stmt);
3952 gcc_assert (gimple_assign_rhs_class (assign_stmt)
3953 == GIMPLE_SINGLE_RHS);
3954 if (gimple_has_location (stmt) && CAN_HAVE_LOCATION_P (rhs)
3955 /* Do not put locations on possibly shared trees. */
3956 && !is_gimple_min_invariant (rhs))
3957 SET_EXPR_LOCATION (rhs, gimple_location (stmt));
3958 if (TREE_CLOBBER_P (rhs))
3959 /* This is a clobber to mark the going out of scope for
3960 this LHS. */
3961 expand_clobber (lhs);
3962 else
3963 expand_assignment (lhs, rhs,
3964 gimple_assign_nontemporal_move_p (
3965 assign_stmt));
3966 }
3967 else
3968 {
3969 rtx target, temp;
3970 bool nontemporal = gimple_assign_nontemporal_move_p (assign_stmt);
3971 struct separate_ops ops;
3972 bool promoted = false;
3973
3974 target = expand_expr (lhs, NULL_RTX, VOIDmode, EXPAND_WRITE);
3975 if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
3976 promoted = true;
3977
3978 ops.code = gimple_assign_rhs_code (assign_stmt);
3979 ops.type = TREE_TYPE (lhs);
3980 switch (get_gimple_rhs_class (ops.code))
3981 {
3982 case GIMPLE_TERNARY_RHS:
3983 ops.op2 = gimple_assign_rhs3 (assign_stmt);
3984 /* Fallthru */
3985 case GIMPLE_BINARY_RHS:
3986 ops.op1 = gimple_assign_rhs2 (assign_stmt);
3987 /* Fallthru */
3988 case GIMPLE_UNARY_RHS:
3989 ops.op0 = gimple_assign_rhs1 (assign_stmt);
3990 break;
3991 default:
3992 gcc_unreachable ();
3993 }
3994 ops.location = gimple_location (stmt);
3995
3996 /* If we want to use a nontemporal store, force the value to
3997 register first. If we store into a promoted register,
3998 don't directly expand to target. */
3999 temp = nontemporal || promoted ? NULL_RTX : target;
4000 temp = expand_expr_real_2 (&ops, temp, GET_MODE (target),
4001 EXPAND_NORMAL);
4002
4003 if (temp == target)
4004 ;
4005 else if (promoted)
4006 {
4007 int unsignedp = SUBREG_PROMOTED_SIGN (target);
4008 /* If TEMP is a VOIDmode constant, use convert_modes to make
4009 sure that we properly convert it. */
4010 if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
4011 {
4012 temp = convert_modes (GET_MODE (target),
4013 TYPE_MODE (ops.type),
4014 temp, unsignedp);
4015 temp = convert_modes (GET_MODE (SUBREG_REG (target)),
4016 GET_MODE (target), temp, unsignedp);
4017 }
4018
4019 convert_move (SUBREG_REG (target), temp, unsignedp);
4020 }
4021 else if (nontemporal && emit_storent_insn (target, temp))
4022 ;
4023 else
4024 {
4025 temp = force_operand (temp, target);
4026 if (temp != target)
4027 emit_move_insn (target, temp);
4028 }
4029 }
4030 }
4031 break;
4032
4033 default:
4034 gcc_unreachable ();
4035 }
4036 }
4037
4038 /* Expand one gimple statement STMT and return the last RTL instruction
4039 before any of the newly generated ones.
4040
4041 In addition to generating the necessary RTL instructions this also
4042 sets REG_EH_REGION notes if necessary and sets the current source
4043 location for diagnostics. */
4044
4045 static rtx_insn *
expand_gimple_stmt(gimple * stmt)4046 expand_gimple_stmt (gimple *stmt)
4047 {
4048 location_t saved_location = input_location;
4049 rtx_insn *last = get_last_insn ();
4050 int lp_nr;
4051
4052 gcc_assert (cfun);
4053
4054 /* We need to save and restore the current source location so that errors
4055 discovered during expansion are emitted with the right location. But
4056 it would be better if the diagnostic routines used the source location
4057 embedded in the tree nodes rather than globals. */
4058 if (gimple_has_location (stmt))
4059 input_location = gimple_location (stmt);
4060
4061 expand_gimple_stmt_1 (stmt);
4062
4063 /* Free any temporaries used to evaluate this statement. */
4064 free_temp_slots ();
4065
4066 input_location = saved_location;
4067
4068 /* Mark all insns that may trap. */
4069 lp_nr = lookup_stmt_eh_lp (stmt);
4070 if (lp_nr)
4071 {
4072 rtx_insn *insn;
4073 for (insn = next_real_insn (last); insn;
4074 insn = next_real_insn (insn))
4075 {
4076 if (! find_reg_note (insn, REG_EH_REGION, NULL_RTX)
4077 /* If we want exceptions for non-call insns, any
4078 may_trap_p instruction may throw. */
4079 && GET_CODE (PATTERN (insn)) != CLOBBER
4080 && GET_CODE (PATTERN (insn)) != USE
4081 && insn_could_throw_p (insn))
4082 make_reg_eh_region_note (insn, 0, lp_nr);
4083 }
4084 }
4085
4086 return last;
4087 }
4088
4089 /* A subroutine of expand_gimple_basic_block. Expand one GIMPLE_CALL
4090 that has CALL_EXPR_TAILCALL set. Returns non-null if we actually
4091 generated a tail call (something that might be denied by the ABI
4092 rules governing the call; see calls.cc).
4093
4094 Sets CAN_FALLTHRU if we generated a *conditional* tail call, and
4095 can still reach the rest of BB. The case here is __builtin_sqrt,
4096 where the NaN result goes through the external function (with a
4097 tailcall) and the normal result happens via a sqrt instruction. */
4098
4099 static basic_block
expand_gimple_tailcall(basic_block bb,gcall * stmt,bool * can_fallthru)4100 expand_gimple_tailcall (basic_block bb, gcall *stmt, bool *can_fallthru)
4101 {
4102 rtx_insn *last2, *last;
4103 edge e;
4104 edge_iterator ei;
4105 profile_probability probability;
4106
4107 last2 = last = expand_gimple_stmt (stmt);
4108
4109 for (last = NEXT_INSN (last); last; last = NEXT_INSN (last))
4110 if (CALL_P (last) && SIBLING_CALL_P (last))
4111 goto found;
4112
4113 maybe_dump_rtl_for_gimple_stmt (stmt, last2);
4114
4115 *can_fallthru = true;
4116 return NULL;
4117
4118 found:
4119 /* ??? Wouldn't it be better to just reset any pending stack adjust?
4120 Any instructions emitted here are about to be deleted. */
4121 do_pending_stack_adjust ();
4122
4123 /* Remove any non-eh, non-abnormal edges that don't go to exit. */
4124 /* ??? I.e. the fallthrough edge. HOWEVER! If there were to be
4125 EH or abnormal edges, we shouldn't have created a tail call in
4126 the first place. So it seems to me we should just be removing
4127 all edges here, or redirecting the existing fallthru edge to
4128 the exit block. */
4129
4130 probability = profile_probability::never ();
4131
4132 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
4133 {
4134 if (!(e->flags & (EDGE_ABNORMAL | EDGE_EH)))
4135 {
4136 if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
4137 e->dest->count -= e->count ();
4138 probability += e->probability;
4139 remove_edge (e);
4140 }
4141 else
4142 ei_next (&ei);
4143 }
4144
4145 /* This is somewhat ugly: the call_expr expander often emits instructions
4146 after the sibcall (to perform the function return). These confuse the
4147 find_many_sub_basic_blocks code, so we need to get rid of these. */
4148 last = NEXT_INSN (last);
4149 gcc_assert (BARRIER_P (last));
4150
4151 *can_fallthru = false;
4152 while (NEXT_INSN (last))
4153 {
4154 /* For instance an sqrt builtin expander expands if with
4155 sibcall in the then and label for `else`. */
4156 if (LABEL_P (NEXT_INSN (last)))
4157 {
4158 *can_fallthru = true;
4159 break;
4160 }
4161 delete_insn (NEXT_INSN (last));
4162 }
4163
4164 e = make_edge (bb, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_ABNORMAL
4165 | EDGE_SIBCALL);
4166 e->probability = probability;
4167 BB_END (bb) = last;
4168 update_bb_for_insn (bb);
4169
4170 if (NEXT_INSN (last))
4171 {
4172 bb = create_basic_block (NEXT_INSN (last), get_last_insn (), bb);
4173
4174 last = BB_END (bb);
4175 if (BARRIER_P (last))
4176 BB_END (bb) = PREV_INSN (last);
4177 }
4178
4179 maybe_dump_rtl_for_gimple_stmt (stmt, last2);
4180
4181 return bb;
4182 }
4183
4184 /* Return the difference between the floor and the truncated result of
4185 a signed division by OP1 with remainder MOD. */
4186 static rtx
floor_sdiv_adjust(machine_mode mode,rtx mod,rtx op1)4187 floor_sdiv_adjust (machine_mode mode, rtx mod, rtx op1)
4188 {
4189 /* (mod != 0 ? (op1 / mod < 0 ? -1 : 0) : 0) */
4190 return gen_rtx_IF_THEN_ELSE
4191 (mode, gen_rtx_NE (BImode, mod, const0_rtx),
4192 gen_rtx_IF_THEN_ELSE
4193 (mode, gen_rtx_LT (BImode,
4194 gen_rtx_DIV (mode, op1, mod),
4195 const0_rtx),
4196 constm1_rtx, const0_rtx),
4197 const0_rtx);
4198 }
4199
4200 /* Return the difference between the ceil and the truncated result of
4201 a signed division by OP1 with remainder MOD. */
4202 static rtx
ceil_sdiv_adjust(machine_mode mode,rtx mod,rtx op1)4203 ceil_sdiv_adjust (machine_mode mode, rtx mod, rtx op1)
4204 {
4205 /* (mod != 0 ? (op1 / mod > 0 ? 1 : 0) : 0) */
4206 return gen_rtx_IF_THEN_ELSE
4207 (mode, gen_rtx_NE (BImode, mod, const0_rtx),
4208 gen_rtx_IF_THEN_ELSE
4209 (mode, gen_rtx_GT (BImode,
4210 gen_rtx_DIV (mode, op1, mod),
4211 const0_rtx),
4212 const1_rtx, const0_rtx),
4213 const0_rtx);
4214 }
4215
4216 /* Return the difference between the ceil and the truncated result of
4217 an unsigned division by OP1 with remainder MOD. */
4218 static rtx
ceil_udiv_adjust(machine_mode mode,rtx mod,rtx op1 ATTRIBUTE_UNUSED)4219 ceil_udiv_adjust (machine_mode mode, rtx mod, rtx op1 ATTRIBUTE_UNUSED)
4220 {
4221 /* (mod != 0 ? 1 : 0) */
4222 return gen_rtx_IF_THEN_ELSE
4223 (mode, gen_rtx_NE (BImode, mod, const0_rtx),
4224 const1_rtx, const0_rtx);
4225 }
4226
4227 /* Return the difference between the rounded and the truncated result
4228 of a signed division by OP1 with remainder MOD. Halfway cases are
4229 rounded away from zero, rather than to the nearest even number. */
4230 static rtx
round_sdiv_adjust(machine_mode mode,rtx mod,rtx op1)4231 round_sdiv_adjust (machine_mode mode, rtx mod, rtx op1)
4232 {
4233 /* (abs (mod) >= abs (op1) - abs (mod)
4234 ? (op1 / mod > 0 ? 1 : -1)
4235 : 0) */
4236 return gen_rtx_IF_THEN_ELSE
4237 (mode, gen_rtx_GE (BImode, gen_rtx_ABS (mode, mod),
4238 gen_rtx_MINUS (mode,
4239 gen_rtx_ABS (mode, op1),
4240 gen_rtx_ABS (mode, mod))),
4241 gen_rtx_IF_THEN_ELSE
4242 (mode, gen_rtx_GT (BImode,
4243 gen_rtx_DIV (mode, op1, mod),
4244 const0_rtx),
4245 const1_rtx, constm1_rtx),
4246 const0_rtx);
4247 }
4248
4249 /* Return the difference between the rounded and the truncated result
4250 of a unsigned division by OP1 with remainder MOD. Halfway cases
4251 are rounded away from zero, rather than to the nearest even
4252 number. */
4253 static rtx
round_udiv_adjust(machine_mode mode,rtx mod,rtx op1)4254 round_udiv_adjust (machine_mode mode, rtx mod, rtx op1)
4255 {
4256 /* (mod >= op1 - mod ? 1 : 0) */
4257 return gen_rtx_IF_THEN_ELSE
4258 (mode, gen_rtx_GE (BImode, mod,
4259 gen_rtx_MINUS (mode, op1, mod)),
4260 const1_rtx, const0_rtx);
4261 }
4262
4263 /* Convert X to MODE, that must be Pmode or ptr_mode, without emitting
4264 any rtl. */
4265
4266 static rtx
convert_debug_memory_address(scalar_int_mode mode,rtx x,addr_space_t as)4267 convert_debug_memory_address (scalar_int_mode mode, rtx x,
4268 addr_space_t as)
4269 {
4270 #ifndef POINTERS_EXTEND_UNSIGNED
4271 gcc_assert (mode == Pmode
4272 || mode == targetm.addr_space.address_mode (as));
4273 gcc_assert (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode);
4274 #else
4275 rtx temp;
4276
4277 gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as));
4278
4279 if (GET_MODE (x) == mode || GET_MODE (x) == VOIDmode)
4280 return x;
4281
4282 /* X must have some form of address mode already. */
4283 scalar_int_mode xmode = as_a <scalar_int_mode> (GET_MODE (x));
4284 if (GET_MODE_PRECISION (mode) < GET_MODE_PRECISION (xmode))
4285 x = lowpart_subreg (mode, x, xmode);
4286 else if (POINTERS_EXTEND_UNSIGNED > 0)
4287 x = gen_rtx_ZERO_EXTEND (mode, x);
4288 else if (!POINTERS_EXTEND_UNSIGNED)
4289 x = gen_rtx_SIGN_EXTEND (mode, x);
4290 else
4291 {
4292 switch (GET_CODE (x))
4293 {
4294 case SUBREG:
4295 if ((SUBREG_PROMOTED_VAR_P (x)
4296 || (REG_P (SUBREG_REG (x)) && REG_POINTER (SUBREG_REG (x)))
4297 || (GET_CODE (SUBREG_REG (x)) == PLUS
4298 && REG_P (XEXP (SUBREG_REG (x), 0))
4299 && REG_POINTER (XEXP (SUBREG_REG (x), 0))
4300 && CONST_INT_P (XEXP (SUBREG_REG (x), 1))))
4301 && GET_MODE (SUBREG_REG (x)) == mode)
4302 return SUBREG_REG (x);
4303 break;
4304 case LABEL_REF:
4305 temp = gen_rtx_LABEL_REF (mode, label_ref_label (x));
4306 LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
4307 return temp;
4308 case SYMBOL_REF:
4309 temp = shallow_copy_rtx (x);
4310 PUT_MODE (temp, mode);
4311 return temp;
4312 case CONST:
4313 temp = convert_debug_memory_address (mode, XEXP (x, 0), as);
4314 if (temp)
4315 temp = gen_rtx_CONST (mode, temp);
4316 return temp;
4317 case PLUS:
4318 case MINUS:
4319 if (CONST_INT_P (XEXP (x, 1)))
4320 {
4321 temp = convert_debug_memory_address (mode, XEXP (x, 0), as);
4322 if (temp)
4323 return gen_rtx_fmt_ee (GET_CODE (x), mode, temp, XEXP (x, 1));
4324 }
4325 break;
4326 default:
4327 break;
4328 }
4329 /* Don't know how to express ptr_extend as operation in debug info. */
4330 return NULL;
4331 }
4332 #endif /* POINTERS_EXTEND_UNSIGNED */
4333
4334 return x;
4335 }
4336
4337 /* Map from SSA_NAMEs to corresponding DEBUG_EXPR_DECLs created
4338 by avoid_deep_ter_for_debug. */
4339
4340 static hash_map<tree, tree> *deep_ter_debug_map;
4341
4342 /* Split too deep TER chains for debug stmts using debug temporaries. */
4343
4344 static void
avoid_deep_ter_for_debug(gimple * stmt,int depth)4345 avoid_deep_ter_for_debug (gimple *stmt, int depth)
4346 {
4347 use_operand_p use_p;
4348 ssa_op_iter iter;
4349 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
4350 {
4351 tree use = USE_FROM_PTR (use_p);
4352 if (TREE_CODE (use) != SSA_NAME || SSA_NAME_IS_DEFAULT_DEF (use))
4353 continue;
4354 gimple *g = get_gimple_for_ssa_name (use);
4355 if (g == NULL)
4356 continue;
4357 if (depth > 6 && !stmt_ends_bb_p (g))
4358 {
4359 if (deep_ter_debug_map == NULL)
4360 deep_ter_debug_map = new hash_map<tree, tree>;
4361
4362 tree &vexpr = deep_ter_debug_map->get_or_insert (use);
4363 if (vexpr != NULL)
4364 continue;
4365 vexpr = build_debug_expr_decl (TREE_TYPE (use));
4366 gimple *def_temp = gimple_build_debug_bind (vexpr, use, g);
4367 gimple_stmt_iterator gsi = gsi_for_stmt (g);
4368 gsi_insert_after (&gsi, def_temp, GSI_NEW_STMT);
4369 avoid_deep_ter_for_debug (def_temp, 0);
4370 }
4371 else
4372 avoid_deep_ter_for_debug (g, depth + 1);
4373 }
4374 }
4375
4376 /* Return an RTX equivalent to the value of the parameter DECL. */
4377
4378 static rtx
expand_debug_parm_decl(tree decl)4379 expand_debug_parm_decl (tree decl)
4380 {
4381 rtx incoming = DECL_INCOMING_RTL (decl);
4382
4383 if (incoming
4384 && GET_MODE (incoming) != BLKmode
4385 && ((REG_P (incoming) && HARD_REGISTER_P (incoming))
4386 || (MEM_P (incoming)
4387 && REG_P (XEXP (incoming, 0))
4388 && HARD_REGISTER_P (XEXP (incoming, 0)))))
4389 {
4390 rtx rtl = gen_rtx_ENTRY_VALUE (GET_MODE (incoming));
4391
4392 #ifdef HAVE_window_save
4393 /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers.
4394 If the target machine has an explicit window save instruction, the
4395 actual entry value is the corresponding OUTGOING_REGNO instead. */
4396 if (REG_P (incoming)
4397 && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
4398 incoming
4399 = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
4400 OUTGOING_REGNO (REGNO (incoming)), 0);
4401 else if (MEM_P (incoming))
4402 {
4403 rtx reg = XEXP (incoming, 0);
4404 if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg))
4405 {
4406 reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
4407 incoming = replace_equiv_address_nv (incoming, reg);
4408 }
4409 else
4410 incoming = copy_rtx (incoming);
4411 }
4412 #endif
4413
4414 ENTRY_VALUE_EXP (rtl) = incoming;
4415 return rtl;
4416 }
4417
4418 if (incoming
4419 && GET_MODE (incoming) != BLKmode
4420 && !TREE_ADDRESSABLE (decl)
4421 && MEM_P (incoming)
4422 && (XEXP (incoming, 0) == virtual_incoming_args_rtx
4423 || (GET_CODE (XEXP (incoming, 0)) == PLUS
4424 && XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx
4425 && CONST_INT_P (XEXP (XEXP (incoming, 0), 1)))))
4426 return copy_rtx (incoming);
4427
4428 return NULL_RTX;
4429 }
4430
4431 /* Return an RTX equivalent to the value of the tree expression EXP. */
4432
4433 static rtx
expand_debug_expr(tree exp)4434 expand_debug_expr (tree exp)
4435 {
4436 rtx op0 = NULL_RTX, op1 = NULL_RTX, op2 = NULL_RTX;
4437 machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
4438 machine_mode inner_mode = VOIDmode;
4439 int unsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
4440 addr_space_t as;
4441 scalar_int_mode op0_mode, op1_mode, addr_mode;
4442
4443 switch (TREE_CODE_CLASS (TREE_CODE (exp)))
4444 {
4445 case tcc_expression:
4446 switch (TREE_CODE (exp))
4447 {
4448 case COND_EXPR:
4449 case DOT_PROD_EXPR:
4450 case SAD_EXPR:
4451 case WIDEN_MULT_PLUS_EXPR:
4452 case WIDEN_MULT_MINUS_EXPR:
4453 goto ternary;
4454
4455 case TRUTH_ANDIF_EXPR:
4456 case TRUTH_ORIF_EXPR:
4457 case TRUTH_AND_EXPR:
4458 case TRUTH_OR_EXPR:
4459 case TRUTH_XOR_EXPR:
4460 goto binary;
4461
4462 case TRUTH_NOT_EXPR:
4463 goto unary;
4464
4465 default:
4466 break;
4467 }
4468 break;
4469
4470 ternary:
4471 op2 = expand_debug_expr (TREE_OPERAND (exp, 2));
4472 if (!op2)
4473 return NULL_RTX;
4474 /* Fall through. */
4475
4476 binary:
4477 case tcc_binary:
4478 if (mode == BLKmode)
4479 return NULL_RTX;
4480 op1 = expand_debug_expr (TREE_OPERAND (exp, 1));
4481 if (!op1)
4482 return NULL_RTX;
4483 switch (TREE_CODE (exp))
4484 {
4485 case LSHIFT_EXPR:
4486 case RSHIFT_EXPR:
4487 case LROTATE_EXPR:
4488 case RROTATE_EXPR:
4489 case WIDEN_LSHIFT_EXPR:
4490 /* Ensure second operand isn't wider than the first one. */
4491 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 1)));
4492 if (is_a <scalar_int_mode> (inner_mode, &op1_mode)
4493 && (GET_MODE_UNIT_PRECISION (mode)
4494 < GET_MODE_PRECISION (op1_mode)))
4495 op1 = lowpart_subreg (GET_MODE_INNER (mode), op1, op1_mode);
4496 break;
4497 default:
4498 break;
4499 }
4500 /* Fall through. */
4501
4502 unary:
4503 case tcc_unary:
4504 if (mode == BLKmode)
4505 return NULL_RTX;
4506 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
4507 op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
4508 if (!op0)
4509 return NULL_RTX;
4510 break;
4511
4512 case tcc_comparison:
4513 unsignedp = TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)));
4514 goto binary;
4515
4516 case tcc_type:
4517 case tcc_statement:
4518 gcc_unreachable ();
4519
4520 case tcc_constant:
4521 case tcc_exceptional:
4522 case tcc_declaration:
4523 case tcc_reference:
4524 case tcc_vl_exp:
4525 break;
4526 }
4527
4528 switch (TREE_CODE (exp))
4529 {
4530 case STRING_CST:
4531 if (!lookup_constant_def (exp))
4532 {
4533 if (strlen (TREE_STRING_POINTER (exp)) + 1
4534 != (size_t) TREE_STRING_LENGTH (exp))
4535 return NULL_RTX;
4536 op0 = gen_rtx_CONST_STRING (Pmode, TREE_STRING_POINTER (exp));
4537 op0 = gen_rtx_MEM (BLKmode, op0);
4538 set_mem_attributes (op0, exp, 0);
4539 return op0;
4540 }
4541 /* Fall through. */
4542
4543 case INTEGER_CST:
4544 case REAL_CST:
4545 case FIXED_CST:
4546 op0 = expand_expr (exp, NULL_RTX, mode, EXPAND_INITIALIZER);
4547 return op0;
4548
4549 case POLY_INT_CST:
4550 return immed_wide_int_const (poly_int_cst_value (exp), mode);
4551
4552 case COMPLEX_CST:
4553 gcc_assert (COMPLEX_MODE_P (mode));
4554 op0 = expand_debug_expr (TREE_REALPART (exp));
4555 op1 = expand_debug_expr (TREE_IMAGPART (exp));
4556 return gen_rtx_CONCAT (mode, op0, op1);
4557
4558 case DEBUG_EXPR_DECL:
4559 op0 = DECL_RTL_IF_SET (exp);
4560
4561 if (op0)
4562 {
4563 if (GET_MODE (op0) != mode)
4564 gcc_assert (VECTOR_TYPE_P (TREE_TYPE (exp)));
4565 else
4566 return op0;
4567 }
4568
4569 op0 = gen_rtx_DEBUG_EXPR (mode);
4570 DEBUG_EXPR_TREE_DECL (op0) = exp;
4571 SET_DECL_RTL (exp, op0);
4572
4573 return op0;
4574
4575 case VAR_DECL:
4576 case PARM_DECL:
4577 case FUNCTION_DECL:
4578 case LABEL_DECL:
4579 case CONST_DECL:
4580 case RESULT_DECL:
4581 op0 = DECL_RTL_IF_SET (exp);
4582
4583 /* This decl was probably optimized away. */
4584 if (!op0
4585 /* At least label RTXen are sometimes replaced by
4586 NOTE_INSN_DELETED_LABEL. Any notes here are not
4587 handled by copy_rtx. */
4588 || NOTE_P (op0))
4589 {
4590 if (!VAR_P (exp)
4591 || DECL_EXTERNAL (exp)
4592 || !TREE_STATIC (exp)
4593 || !DECL_NAME (exp)
4594 || DECL_HARD_REGISTER (exp)
4595 || DECL_IN_CONSTANT_POOL (exp)
4596 || mode == VOIDmode)
4597 return NULL;
4598
4599 op0 = make_decl_rtl_for_debug (exp);
4600 if (!MEM_P (op0)
4601 || GET_CODE (XEXP (op0, 0)) != SYMBOL_REF
4602 || SYMBOL_REF_DECL (XEXP (op0, 0)) != exp)
4603 return NULL;
4604 }
4605 else
4606 op0 = copy_rtx (op0);
4607
4608 if (GET_MODE (op0) == BLKmode
4609 /* If op0 is not BLKmode, but mode is, adjust_mode
4610 below would ICE. While it is likely a FE bug,
4611 try to be robust here. See PR43166. */
4612 || mode == BLKmode
4613 || (mode == VOIDmode && GET_MODE (op0) != VOIDmode))
4614 {
4615 gcc_assert (MEM_P (op0));
4616 op0 = adjust_address_nv (op0, mode, 0);
4617 return op0;
4618 }
4619
4620 /* Fall through. */
4621
4622 adjust_mode:
4623 case PAREN_EXPR:
4624 CASE_CONVERT:
4625 {
4626 inner_mode = GET_MODE (op0);
4627
4628 if (mode == inner_mode)
4629 return op0;
4630
4631 if (inner_mode == VOIDmode)
4632 {
4633 if (TREE_CODE (exp) == SSA_NAME)
4634 inner_mode = TYPE_MODE (TREE_TYPE (exp));
4635 else
4636 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
4637 if (mode == inner_mode)
4638 return op0;
4639 }
4640
4641 if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode))
4642 {
4643 if (GET_MODE_UNIT_BITSIZE (mode)
4644 == GET_MODE_UNIT_BITSIZE (inner_mode))
4645 op0 = simplify_gen_subreg (mode, op0, inner_mode, 0);
4646 else if (GET_MODE_UNIT_BITSIZE (mode)
4647 < GET_MODE_UNIT_BITSIZE (inner_mode))
4648 op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode);
4649 else
4650 op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode);
4651 }
4652 else if (FLOAT_MODE_P (mode))
4653 {
4654 gcc_assert (TREE_CODE (exp) != SSA_NAME);
4655 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
4656 op0 = simplify_gen_unary (UNSIGNED_FLOAT, mode, op0, inner_mode);
4657 else
4658 op0 = simplify_gen_unary (FLOAT, mode, op0, inner_mode);
4659 }
4660 else if (FLOAT_MODE_P (inner_mode))
4661 {
4662 if (unsignedp)
4663 op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode);
4664 else
4665 op0 = simplify_gen_unary (FIX, mode, op0, inner_mode);
4666 }
4667 else if (GET_MODE_UNIT_PRECISION (mode)
4668 == GET_MODE_UNIT_PRECISION (inner_mode))
4669 op0 = lowpart_subreg (mode, op0, inner_mode);
4670 else if (GET_MODE_UNIT_PRECISION (mode)
4671 < GET_MODE_UNIT_PRECISION (inner_mode))
4672 op0 = simplify_gen_unary (TRUNCATE, mode, op0, inner_mode);
4673 else if (UNARY_CLASS_P (exp)
4674 ? TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0)))
4675 : unsignedp)
4676 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
4677 else
4678 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
4679
4680 return op0;
4681 }
4682
4683 case MEM_REF:
4684 if (!is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0)))
4685 {
4686 tree newexp = fold_binary (MEM_REF, TREE_TYPE (exp),
4687 TREE_OPERAND (exp, 0),
4688 TREE_OPERAND (exp, 1));
4689 if (newexp)
4690 return expand_debug_expr (newexp);
4691 }
4692 /* FALLTHROUGH */
4693 case INDIRECT_REF:
4694 inner_mode = TYPE_MODE (TREE_TYPE (TREE_OPERAND (exp, 0)));
4695 op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
4696 if (!op0)
4697 return NULL;
4698
4699 if (TREE_CODE (exp) == MEM_REF)
4700 {
4701 if (GET_CODE (op0) == DEBUG_IMPLICIT_PTR
4702 || (GET_CODE (op0) == PLUS
4703 && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR))
4704 /* (mem (debug_implicit_ptr)) might confuse aliasing.
4705 Instead just use get_inner_reference. */
4706 goto component_ref;
4707
4708 op1 = expand_debug_expr (TREE_OPERAND (exp, 1));
4709 poly_int64 offset;
4710 if (!op1 || !poly_int_rtx_p (op1, &offset))
4711 return NULL;
4712
4713 op0 = plus_constant (inner_mode, op0, offset);
4714 }
4715
4716 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
4717
4718 op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as),
4719 op0, as);
4720 if (op0 == NULL_RTX)
4721 return NULL;
4722
4723 op0 = gen_rtx_MEM (mode, op0);
4724 set_mem_attributes (op0, exp, 0);
4725 if (TREE_CODE (exp) == MEM_REF
4726 && !is_gimple_mem_ref_addr (TREE_OPERAND (exp, 0)))
4727 set_mem_expr (op0, NULL_TREE);
4728 set_mem_addr_space (op0, as);
4729
4730 return op0;
4731
4732 case TARGET_MEM_REF:
4733 if (TREE_CODE (TMR_BASE (exp)) == ADDR_EXPR
4734 && !DECL_RTL_SET_P (TREE_OPERAND (TMR_BASE (exp), 0)))
4735 return NULL;
4736
4737 op0 = expand_debug_expr
4738 (tree_mem_ref_addr (build_pointer_type (TREE_TYPE (exp)), exp));
4739 if (!op0)
4740 return NULL;
4741
4742 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
4743 op0 = convert_debug_memory_address (targetm.addr_space.address_mode (as),
4744 op0, as);
4745 if (op0 == NULL_RTX)
4746 return NULL;
4747
4748 op0 = gen_rtx_MEM (mode, op0);
4749
4750 set_mem_attributes (op0, exp, 0);
4751 set_mem_addr_space (op0, as);
4752
4753 return op0;
4754
4755 component_ref:
4756 case ARRAY_REF:
4757 case ARRAY_RANGE_REF:
4758 case COMPONENT_REF:
4759 case BIT_FIELD_REF:
4760 case REALPART_EXPR:
4761 case IMAGPART_EXPR:
4762 case VIEW_CONVERT_EXPR:
4763 {
4764 machine_mode mode1;
4765 poly_int64 bitsize, bitpos;
4766 tree offset;
4767 int reversep, volatilep = 0;
4768 tree tem
4769 = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1,
4770 &unsignedp, &reversep, &volatilep);
4771 rtx orig_op0;
4772
4773 if (known_eq (bitsize, 0))
4774 return NULL;
4775
4776 orig_op0 = op0 = expand_debug_expr (tem);
4777
4778 if (!op0)
4779 return NULL;
4780
4781 if (offset)
4782 {
4783 machine_mode addrmode, offmode;
4784
4785 if (!MEM_P (op0))
4786 return NULL;
4787
4788 op0 = XEXP (op0, 0);
4789 addrmode = GET_MODE (op0);
4790 if (addrmode == VOIDmode)
4791 addrmode = Pmode;
4792
4793 op1 = expand_debug_expr (offset);
4794 if (!op1)
4795 return NULL;
4796
4797 offmode = GET_MODE (op1);
4798 if (offmode == VOIDmode)
4799 offmode = TYPE_MODE (TREE_TYPE (offset));
4800
4801 if (addrmode != offmode)
4802 op1 = lowpart_subreg (addrmode, op1, offmode);
4803
4804 /* Don't use offset_address here, we don't need a
4805 recognizable address, and we don't want to generate
4806 code. */
4807 op0 = gen_rtx_MEM (mode, simplify_gen_binary (PLUS, addrmode,
4808 op0, op1));
4809 }
4810
4811 if (MEM_P (op0))
4812 {
4813 if (mode1 == VOIDmode)
4814 {
4815 if (maybe_gt (bitsize, MAX_BITSIZE_MODE_ANY_INT))
4816 return NULL;
4817 /* Bitfield. */
4818 mode1 = smallest_int_mode_for_size (bitsize);
4819 }
4820 poly_int64 bytepos = bits_to_bytes_round_down (bitpos);
4821 if (maybe_ne (bytepos, 0))
4822 {
4823 op0 = adjust_address_nv (op0, mode1, bytepos);
4824 bitpos = num_trailing_bits (bitpos);
4825 }
4826 else if (known_eq (bitpos, 0)
4827 && known_eq (bitsize, GET_MODE_BITSIZE (mode)))
4828 op0 = adjust_address_nv (op0, mode, 0);
4829 else if (GET_MODE (op0) != mode1)
4830 op0 = adjust_address_nv (op0, mode1, 0);
4831 else
4832 op0 = copy_rtx (op0);
4833 if (op0 == orig_op0)
4834 op0 = shallow_copy_rtx (op0);
4835 if (TREE_CODE (tem) != SSA_NAME)
4836 set_mem_attributes (op0, exp, 0);
4837 }
4838
4839 if (known_eq (bitpos, 0) && mode == GET_MODE (op0))
4840 return op0;
4841
4842 if (maybe_lt (bitpos, 0))
4843 return NULL;
4844
4845 if (GET_MODE (op0) == BLKmode || mode == BLKmode)
4846 return NULL;
4847
4848 poly_int64 bytepos;
4849 if (multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
4850 && known_eq (bitsize, GET_MODE_BITSIZE (mode1)))
4851 {
4852 machine_mode opmode = GET_MODE (op0);
4853
4854 if (opmode == VOIDmode)
4855 opmode = TYPE_MODE (TREE_TYPE (tem));
4856
4857 /* This condition may hold if we're expanding the address
4858 right past the end of an array that turned out not to
4859 be addressable (i.e., the address was only computed in
4860 debug stmts). The gen_subreg below would rightfully
4861 crash, and the address doesn't really exist, so just
4862 drop it. */
4863 if (known_ge (bitpos, GET_MODE_BITSIZE (opmode)))
4864 return NULL;
4865
4866 if (multiple_p (bitpos, GET_MODE_BITSIZE (mode)))
4867 return simplify_gen_subreg (mode, op0, opmode, bytepos);
4868 }
4869
4870 return simplify_gen_ternary (SCALAR_INT_MODE_P (GET_MODE (op0))
4871 && TYPE_UNSIGNED (TREE_TYPE (exp))
4872 ? SIGN_EXTRACT
4873 : ZERO_EXTRACT, mode,
4874 GET_MODE (op0) != VOIDmode
4875 ? GET_MODE (op0)
4876 : TYPE_MODE (TREE_TYPE (tem)),
4877 op0, gen_int_mode (bitsize, word_mode),
4878 gen_int_mode (bitpos, word_mode));
4879 }
4880
4881 case ABS_EXPR:
4882 case ABSU_EXPR:
4883 return simplify_gen_unary (ABS, mode, op0, mode);
4884
4885 case NEGATE_EXPR:
4886 return simplify_gen_unary (NEG, mode, op0, mode);
4887
4888 case BIT_NOT_EXPR:
4889 return simplify_gen_unary (NOT, mode, op0, mode);
4890
4891 case FLOAT_EXPR:
4892 return simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
4893 0)))
4894 ? UNSIGNED_FLOAT : FLOAT, mode, op0,
4895 inner_mode);
4896
4897 case FIX_TRUNC_EXPR:
4898 return simplify_gen_unary (unsignedp ? UNSIGNED_FIX : FIX, mode, op0,
4899 inner_mode);
4900
4901 case POINTER_PLUS_EXPR:
4902 /* For the rare target where pointers are not the same size as
4903 size_t, we need to check for mis-matched modes and correct
4904 the addend. */
4905 if (op0 && op1
4906 && is_a <scalar_int_mode> (GET_MODE (op0), &op0_mode)
4907 && is_a <scalar_int_mode> (GET_MODE (op1), &op1_mode)
4908 && op0_mode != op1_mode)
4909 {
4910 if (GET_MODE_BITSIZE (op0_mode) < GET_MODE_BITSIZE (op1_mode)
4911 /* If OP0 is a partial mode, then we must truncate, even
4912 if it has the same bitsize as OP1 as GCC's
4913 representation of partial modes is opaque. */
4914 || (GET_MODE_CLASS (op0_mode) == MODE_PARTIAL_INT
4915 && (GET_MODE_BITSIZE (op0_mode)
4916 == GET_MODE_BITSIZE (op1_mode))))
4917 op1 = simplify_gen_unary (TRUNCATE, op0_mode, op1, op1_mode);
4918 else
4919 /* We always sign-extend, regardless of the signedness of
4920 the operand, because the operand is always unsigned
4921 here even if the original C expression is signed. */
4922 op1 = simplify_gen_unary (SIGN_EXTEND, op0_mode, op1, op1_mode);
4923 }
4924 /* Fall through. */
4925 case PLUS_EXPR:
4926 return simplify_gen_binary (PLUS, mode, op0, op1);
4927
4928 case MINUS_EXPR:
4929 case POINTER_DIFF_EXPR:
4930 return simplify_gen_binary (MINUS, mode, op0, op1);
4931
4932 case MULT_EXPR:
4933 return simplify_gen_binary (MULT, mode, op0, op1);
4934
4935 case RDIV_EXPR:
4936 case TRUNC_DIV_EXPR:
4937 case EXACT_DIV_EXPR:
4938 if (unsignedp)
4939 return simplify_gen_binary (UDIV, mode, op0, op1);
4940 else
4941 return simplify_gen_binary (DIV, mode, op0, op1);
4942
4943 case TRUNC_MOD_EXPR:
4944 return simplify_gen_binary (unsignedp ? UMOD : MOD, mode, op0, op1);
4945
4946 case FLOOR_DIV_EXPR:
4947 if (unsignedp)
4948 return simplify_gen_binary (UDIV, mode, op0, op1);
4949 else
4950 {
4951 rtx div = simplify_gen_binary (DIV, mode, op0, op1);
4952 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
4953 rtx adj = floor_sdiv_adjust (mode, mod, op1);
4954 return simplify_gen_binary (PLUS, mode, div, adj);
4955 }
4956
4957 case FLOOR_MOD_EXPR:
4958 if (unsignedp)
4959 return simplify_gen_binary (UMOD, mode, op0, op1);
4960 else
4961 {
4962 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
4963 rtx adj = floor_sdiv_adjust (mode, mod, op1);
4964 adj = simplify_gen_unary (NEG, mode,
4965 simplify_gen_binary (MULT, mode, adj, op1),
4966 mode);
4967 return simplify_gen_binary (PLUS, mode, mod, adj);
4968 }
4969
4970 case CEIL_DIV_EXPR:
4971 if (unsignedp)
4972 {
4973 rtx div = simplify_gen_binary (UDIV, mode, op0, op1);
4974 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
4975 rtx adj = ceil_udiv_adjust (mode, mod, op1);
4976 return simplify_gen_binary (PLUS, mode, div, adj);
4977 }
4978 else
4979 {
4980 rtx div = simplify_gen_binary (DIV, mode, op0, op1);
4981 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
4982 rtx adj = ceil_sdiv_adjust (mode, mod, op1);
4983 return simplify_gen_binary (PLUS, mode, div, adj);
4984 }
4985
4986 case CEIL_MOD_EXPR:
4987 if (unsignedp)
4988 {
4989 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
4990 rtx adj = ceil_udiv_adjust (mode, mod, op1);
4991 adj = simplify_gen_unary (NEG, mode,
4992 simplify_gen_binary (MULT, mode, adj, op1),
4993 mode);
4994 return simplify_gen_binary (PLUS, mode, mod, adj);
4995 }
4996 else
4997 {
4998 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
4999 rtx adj = ceil_sdiv_adjust (mode, mod, op1);
5000 adj = simplify_gen_unary (NEG, mode,
5001 simplify_gen_binary (MULT, mode, adj, op1),
5002 mode);
5003 return simplify_gen_binary (PLUS, mode, mod, adj);
5004 }
5005
5006 case ROUND_DIV_EXPR:
5007 if (unsignedp)
5008 {
5009 rtx div = simplify_gen_binary (UDIV, mode, op0, op1);
5010 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
5011 rtx adj = round_udiv_adjust (mode, mod, op1);
5012 return simplify_gen_binary (PLUS, mode, div, adj);
5013 }
5014 else
5015 {
5016 rtx div = simplify_gen_binary (DIV, mode, op0, op1);
5017 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
5018 rtx adj = round_sdiv_adjust (mode, mod, op1);
5019 return simplify_gen_binary (PLUS, mode, div, adj);
5020 }
5021
5022 case ROUND_MOD_EXPR:
5023 if (unsignedp)
5024 {
5025 rtx mod = simplify_gen_binary (UMOD, mode, op0, op1);
5026 rtx adj = round_udiv_adjust (mode, mod, op1);
5027 adj = simplify_gen_unary (NEG, mode,
5028 simplify_gen_binary (MULT, mode, adj, op1),
5029 mode);
5030 return simplify_gen_binary (PLUS, mode, mod, adj);
5031 }
5032 else
5033 {
5034 rtx mod = simplify_gen_binary (MOD, mode, op0, op1);
5035 rtx adj = round_sdiv_adjust (mode, mod, op1);
5036 adj = simplify_gen_unary (NEG, mode,
5037 simplify_gen_binary (MULT, mode, adj, op1),
5038 mode);
5039 return simplify_gen_binary (PLUS, mode, mod, adj);
5040 }
5041
5042 case LSHIFT_EXPR:
5043 return simplify_gen_binary (ASHIFT, mode, op0, op1);
5044
5045 case RSHIFT_EXPR:
5046 if (unsignedp)
5047 return simplify_gen_binary (LSHIFTRT, mode, op0, op1);
5048 else
5049 return simplify_gen_binary (ASHIFTRT, mode, op0, op1);
5050
5051 case LROTATE_EXPR:
5052 return simplify_gen_binary (ROTATE, mode, op0, op1);
5053
5054 case RROTATE_EXPR:
5055 return simplify_gen_binary (ROTATERT, mode, op0, op1);
5056
5057 case MIN_EXPR:
5058 return simplify_gen_binary (unsignedp ? UMIN : SMIN, mode, op0, op1);
5059
5060 case MAX_EXPR:
5061 return simplify_gen_binary (unsignedp ? UMAX : SMAX, mode, op0, op1);
5062
5063 case BIT_AND_EXPR:
5064 case TRUTH_AND_EXPR:
5065 return simplify_gen_binary (AND, mode, op0, op1);
5066
5067 case BIT_IOR_EXPR:
5068 case TRUTH_OR_EXPR:
5069 return simplify_gen_binary (IOR, mode, op0, op1);
5070
5071 case BIT_XOR_EXPR:
5072 case TRUTH_XOR_EXPR:
5073 return simplify_gen_binary (XOR, mode, op0, op1);
5074
5075 case TRUTH_ANDIF_EXPR:
5076 return gen_rtx_IF_THEN_ELSE (mode, op0, op1, const0_rtx);
5077
5078 case TRUTH_ORIF_EXPR:
5079 return gen_rtx_IF_THEN_ELSE (mode, op0, const_true_rtx, op1);
5080
5081 case TRUTH_NOT_EXPR:
5082 return simplify_gen_relational (EQ, mode, inner_mode, op0, const0_rtx);
5083
5084 case LT_EXPR:
5085 return simplify_gen_relational (unsignedp ? LTU : LT, mode, inner_mode,
5086 op0, op1);
5087
5088 case LE_EXPR:
5089 return simplify_gen_relational (unsignedp ? LEU : LE, mode, inner_mode,
5090 op0, op1);
5091
5092 case GT_EXPR:
5093 return simplify_gen_relational (unsignedp ? GTU : GT, mode, inner_mode,
5094 op0, op1);
5095
5096 case GE_EXPR:
5097 return simplify_gen_relational (unsignedp ? GEU : GE, mode, inner_mode,
5098 op0, op1);
5099
5100 case EQ_EXPR:
5101 return simplify_gen_relational (EQ, mode, inner_mode, op0, op1);
5102
5103 case NE_EXPR:
5104 return simplify_gen_relational (NE, mode, inner_mode, op0, op1);
5105
5106 case UNORDERED_EXPR:
5107 return simplify_gen_relational (UNORDERED, mode, inner_mode, op0, op1);
5108
5109 case ORDERED_EXPR:
5110 return simplify_gen_relational (ORDERED, mode, inner_mode, op0, op1);
5111
5112 case UNLT_EXPR:
5113 return simplify_gen_relational (UNLT, mode, inner_mode, op0, op1);
5114
5115 case UNLE_EXPR:
5116 return simplify_gen_relational (UNLE, mode, inner_mode, op0, op1);
5117
5118 case UNGT_EXPR:
5119 return simplify_gen_relational (UNGT, mode, inner_mode, op0, op1);
5120
5121 case UNGE_EXPR:
5122 return simplify_gen_relational (UNGE, mode, inner_mode, op0, op1);
5123
5124 case UNEQ_EXPR:
5125 return simplify_gen_relational (UNEQ, mode, inner_mode, op0, op1);
5126
5127 case LTGT_EXPR:
5128 return simplify_gen_relational (LTGT, mode, inner_mode, op0, op1);
5129
5130 case COND_EXPR:
5131 return gen_rtx_IF_THEN_ELSE (mode, op0, op1, op2);
5132
5133 case COMPLEX_EXPR:
5134 gcc_assert (COMPLEX_MODE_P (mode));
5135 if (GET_MODE (op0) == VOIDmode)
5136 op0 = gen_rtx_CONST (GET_MODE_INNER (mode), op0);
5137 if (GET_MODE (op1) == VOIDmode)
5138 op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1);
5139 return gen_rtx_CONCAT (mode, op0, op1);
5140
5141 case CONJ_EXPR:
5142 if (GET_CODE (op0) == CONCAT)
5143 return gen_rtx_CONCAT (mode, XEXP (op0, 0),
5144 simplify_gen_unary (NEG, GET_MODE_INNER (mode),
5145 XEXP (op0, 1),
5146 GET_MODE_INNER (mode)));
5147 else
5148 {
5149 scalar_mode imode = GET_MODE_INNER (mode);
5150 rtx re, im;
5151
5152 if (MEM_P (op0))
5153 {
5154 re = adjust_address_nv (op0, imode, 0);
5155 im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode));
5156 }
5157 else
5158 {
5159 scalar_int_mode ifmode;
5160 scalar_int_mode ihmode;
5161 rtx halfsize;
5162 if (!int_mode_for_mode (mode).exists (&ifmode)
5163 || !int_mode_for_mode (imode).exists (&ihmode))
5164 return NULL;
5165 halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode));
5166 re = op0;
5167 if (mode != ifmode)
5168 re = gen_rtx_SUBREG (ifmode, re, 0);
5169 re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx);
5170 if (imode != ihmode)
5171 re = gen_rtx_SUBREG (imode, re, 0);
5172 im = copy_rtx (op0);
5173 if (mode != ifmode)
5174 im = gen_rtx_SUBREG (ifmode, im, 0);
5175 im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize);
5176 if (imode != ihmode)
5177 im = gen_rtx_SUBREG (imode, im, 0);
5178 }
5179 im = gen_rtx_NEG (imode, im);
5180 return gen_rtx_CONCAT (mode, re, im);
5181 }
5182
5183 case ADDR_EXPR:
5184 op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
5185 if (!op0 || !MEM_P (op0))
5186 {
5187 if ((TREE_CODE (TREE_OPERAND (exp, 0)) == VAR_DECL
5188 || TREE_CODE (TREE_OPERAND (exp, 0)) == PARM_DECL
5189 || TREE_CODE (TREE_OPERAND (exp, 0)) == RESULT_DECL)
5190 && (!TREE_ADDRESSABLE (TREE_OPERAND (exp, 0))
5191 || target_for_debug_bind (TREE_OPERAND (exp, 0))))
5192 return gen_rtx_DEBUG_IMPLICIT_PTR (mode, TREE_OPERAND (exp, 0));
5193
5194 if (handled_component_p (TREE_OPERAND (exp, 0)))
5195 {
5196 poly_int64 bitoffset, bitsize, maxsize, byteoffset;
5197 bool reverse;
5198 tree decl
5199 = get_ref_base_and_extent (TREE_OPERAND (exp, 0), &bitoffset,
5200 &bitsize, &maxsize, &reverse);
5201 if ((VAR_P (decl)
5202 || TREE_CODE (decl) == PARM_DECL
5203 || TREE_CODE (decl) == RESULT_DECL)
5204 && (!TREE_ADDRESSABLE (decl)
5205 || target_for_debug_bind (decl))
5206 && multiple_p (bitoffset, BITS_PER_UNIT, &byteoffset)
5207 && known_gt (bitsize, 0)
5208 && known_eq (bitsize, maxsize))
5209 {
5210 rtx base = gen_rtx_DEBUG_IMPLICIT_PTR (mode, decl);
5211 return plus_constant (mode, base, byteoffset);
5212 }
5213 }
5214
5215 if (TREE_CODE (TREE_OPERAND (exp, 0)) == MEM_REF
5216 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5217 == ADDR_EXPR)
5218 {
5219 op0 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
5220 0));
5221 if (op0 != NULL
5222 && (GET_CODE (op0) == DEBUG_IMPLICIT_PTR
5223 || (GET_CODE (op0) == PLUS
5224 && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR
5225 && CONST_INT_P (XEXP (op0, 1)))))
5226 {
5227 op1 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
5228 1));
5229 poly_int64 offset;
5230 if (!op1 || !poly_int_rtx_p (op1, &offset))
5231 return NULL;
5232
5233 return plus_constant (mode, op0, offset);
5234 }
5235 }
5236
5237 return NULL;
5238 }
5239
5240 as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
5241 addr_mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (exp));
5242 op0 = convert_debug_memory_address (addr_mode, XEXP (op0, 0), as);
5243
5244 return op0;
5245
5246 case VECTOR_CST:
5247 {
5248 unsigned HOST_WIDE_INT i, nelts;
5249
5250 if (!VECTOR_CST_NELTS (exp).is_constant (&nelts))
5251 return NULL;
5252
5253 op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts));
5254
5255 for (i = 0; i < nelts; ++i)
5256 {
5257 op1 = expand_debug_expr (VECTOR_CST_ELT (exp, i));
5258 if (!op1)
5259 return NULL;
5260 XVECEXP (op0, 0, i) = op1;
5261 }
5262
5263 return op0;
5264 }
5265
5266 case CONSTRUCTOR:
5267 if (TREE_CLOBBER_P (exp))
5268 return NULL;
5269 else if (TREE_CODE (TREE_TYPE (exp)) == VECTOR_TYPE)
5270 {
5271 unsigned i;
5272 unsigned HOST_WIDE_INT nelts;
5273 tree val;
5274
5275 if (!TYPE_VECTOR_SUBPARTS (TREE_TYPE (exp)).is_constant (&nelts))
5276 goto flag_unsupported;
5277
5278 op0 = gen_rtx_CONCATN (mode, rtvec_alloc (nelts));
5279
5280 FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), i, val)
5281 {
5282 op1 = expand_debug_expr (val);
5283 if (!op1)
5284 return NULL;
5285 XVECEXP (op0, 0, i) = op1;
5286 }
5287
5288 if (i < nelts)
5289 {
5290 op1 = expand_debug_expr
5291 (build_zero_cst (TREE_TYPE (TREE_TYPE (exp))));
5292
5293 if (!op1)
5294 return NULL;
5295
5296 for (; i < nelts; i++)
5297 XVECEXP (op0, 0, i) = op1;
5298 }
5299
5300 return op0;
5301 }
5302 else
5303 goto flag_unsupported;
5304
5305 case CALL_EXPR:
5306 /* ??? Maybe handle some builtins? */
5307 return NULL;
5308
5309 case SSA_NAME:
5310 {
5311 gimple *g = get_gimple_for_ssa_name (exp);
5312 if (g)
5313 {
5314 tree t = NULL_TREE;
5315 if (deep_ter_debug_map)
5316 {
5317 tree *slot = deep_ter_debug_map->get (exp);
5318 if (slot)
5319 t = *slot;
5320 }
5321 if (t == NULL_TREE)
5322 t = gimple_assign_rhs_to_tree (g);
5323 op0 = expand_debug_expr (t);
5324 if (!op0)
5325 return NULL;
5326 }
5327 else
5328 {
5329 /* If this is a reference to an incoming value of
5330 parameter that is never used in the code or where the
5331 incoming value is never used in the code, use
5332 PARM_DECL's DECL_RTL if set. */
5333 if (SSA_NAME_IS_DEFAULT_DEF (exp)
5334 && SSA_NAME_VAR (exp)
5335 && TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL
5336 && has_zero_uses (exp))
5337 {
5338 op0 = expand_debug_parm_decl (SSA_NAME_VAR (exp));
5339 if (op0)
5340 goto adjust_mode;
5341 op0 = expand_debug_expr (SSA_NAME_VAR (exp));
5342 if (op0)
5343 goto adjust_mode;
5344 }
5345
5346 int part = var_to_partition (SA.map, exp);
5347
5348 if (part == NO_PARTITION)
5349 return NULL;
5350
5351 gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions);
5352
5353 op0 = copy_rtx (SA.partition_to_pseudo[part]);
5354 }
5355 goto adjust_mode;
5356 }
5357
5358 case ERROR_MARK:
5359 return NULL;
5360
5361 /* Vector stuff. For most of the codes we don't have rtl codes. */
5362 case REALIGN_LOAD_EXPR:
5363 case VEC_COND_EXPR:
5364 case VEC_PACK_FIX_TRUNC_EXPR:
5365 case VEC_PACK_FLOAT_EXPR:
5366 case VEC_PACK_SAT_EXPR:
5367 case VEC_PACK_TRUNC_EXPR:
5368 case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
5369 case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
5370 case VEC_UNPACK_FLOAT_HI_EXPR:
5371 case VEC_UNPACK_FLOAT_LO_EXPR:
5372 case VEC_UNPACK_HI_EXPR:
5373 case VEC_UNPACK_LO_EXPR:
5374 case VEC_WIDEN_MULT_HI_EXPR:
5375 case VEC_WIDEN_MULT_LO_EXPR:
5376 case VEC_WIDEN_MULT_EVEN_EXPR:
5377 case VEC_WIDEN_MULT_ODD_EXPR:
5378 case VEC_WIDEN_LSHIFT_HI_EXPR:
5379 case VEC_WIDEN_LSHIFT_LO_EXPR:
5380 case VEC_WIDEN_PLUS_HI_EXPR:
5381 case VEC_WIDEN_PLUS_LO_EXPR:
5382 case VEC_WIDEN_MINUS_HI_EXPR:
5383 case VEC_WIDEN_MINUS_LO_EXPR:
5384 case VEC_PERM_EXPR:
5385 case VEC_DUPLICATE_EXPR:
5386 case VEC_SERIES_EXPR:
5387 case SAD_EXPR:
5388 return NULL;
5389
5390 /* Misc codes. */
5391 case ADDR_SPACE_CONVERT_EXPR:
5392 case FIXED_CONVERT_EXPR:
5393 case OBJ_TYPE_REF:
5394 case WITH_SIZE_EXPR:
5395 case BIT_INSERT_EXPR:
5396 return NULL;
5397
5398 case DOT_PROD_EXPR:
5399 if (SCALAR_INT_MODE_P (GET_MODE (op0))
5400 && SCALAR_INT_MODE_P (mode))
5401 {
5402 op0
5403 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
5404 0)))
5405 ? ZERO_EXTEND : SIGN_EXTEND, mode, op0,
5406 inner_mode);
5407 op1
5408 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
5409 1)))
5410 ? ZERO_EXTEND : SIGN_EXTEND, mode, op1,
5411 inner_mode);
5412 op0 = simplify_gen_binary (MULT, mode, op0, op1);
5413 return simplify_gen_binary (PLUS, mode, op0, op2);
5414 }
5415 return NULL;
5416
5417 case WIDEN_MULT_EXPR:
5418 case WIDEN_MULT_PLUS_EXPR:
5419 case WIDEN_MULT_MINUS_EXPR:
5420 case WIDEN_PLUS_EXPR:
5421 case WIDEN_MINUS_EXPR:
5422 if (SCALAR_INT_MODE_P (GET_MODE (op0))
5423 && SCALAR_INT_MODE_P (mode))
5424 {
5425 inner_mode = GET_MODE (op0);
5426 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 0))))
5427 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
5428 else
5429 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
5430 if (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp, 1))))
5431 op1 = simplify_gen_unary (ZERO_EXTEND, mode, op1, inner_mode);
5432 else
5433 op1 = simplify_gen_unary (SIGN_EXTEND, mode, op1, inner_mode);
5434 if (TREE_CODE (exp) == WIDEN_PLUS_EXPR)
5435 return simplify_gen_binary (PLUS, mode, op0, op1);
5436 else if (TREE_CODE (exp) == WIDEN_MINUS_EXPR)
5437 return simplify_gen_binary (MINUS, mode, op0, op1);
5438 op0 = simplify_gen_binary (MULT, mode, op0, op1);
5439 if (TREE_CODE (exp) == WIDEN_MULT_EXPR)
5440 return op0;
5441 else if (TREE_CODE (exp) == WIDEN_MULT_PLUS_EXPR)
5442 return simplify_gen_binary (PLUS, mode, op0, op2);
5443 else
5444 return simplify_gen_binary (MINUS, mode, op2, op0);
5445 }
5446 return NULL;
5447
5448 case MULT_HIGHPART_EXPR:
5449 /* ??? Similar to the above. */
5450 return NULL;
5451
5452 case WIDEN_SUM_EXPR:
5453 case WIDEN_LSHIFT_EXPR:
5454 if (SCALAR_INT_MODE_P (GET_MODE (op0))
5455 && SCALAR_INT_MODE_P (mode))
5456 {
5457 op0
5458 = simplify_gen_unary (TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (exp,
5459 0)))
5460 ? ZERO_EXTEND : SIGN_EXTEND, mode, op0,
5461 inner_mode);
5462 return simplify_gen_binary (TREE_CODE (exp) == WIDEN_LSHIFT_EXPR
5463 ? ASHIFT : PLUS, mode, op0, op1);
5464 }
5465 return NULL;
5466
5467 default:
5468 flag_unsupported:
5469 if (flag_checking)
5470 {
5471 debug_tree (exp);
5472 gcc_unreachable ();
5473 }
5474 return NULL;
5475 }
5476 }
5477
5478 /* Return an RTX equivalent to the source bind value of the tree expression
5479 EXP. */
5480
5481 static rtx
expand_debug_source_expr(tree exp)5482 expand_debug_source_expr (tree exp)
5483 {
5484 rtx op0 = NULL_RTX;
5485 machine_mode mode = VOIDmode, inner_mode;
5486
5487 switch (TREE_CODE (exp))
5488 {
5489 case VAR_DECL:
5490 if (DECL_ABSTRACT_ORIGIN (exp))
5491 return expand_debug_source_expr (DECL_ABSTRACT_ORIGIN (exp));
5492 break;
5493 case PARM_DECL:
5494 {
5495 mode = DECL_MODE (exp);
5496 op0 = expand_debug_parm_decl (exp);
5497 if (op0)
5498 break;
5499 /* See if this isn't an argument that has been completely
5500 optimized out. */
5501 if (!DECL_RTL_SET_P (exp)
5502 && !DECL_INCOMING_RTL (exp)
5503 && DECL_ABSTRACT_ORIGIN (current_function_decl))
5504 {
5505 tree aexp = DECL_ORIGIN (exp);
5506 if (DECL_CONTEXT (aexp)
5507 == DECL_ABSTRACT_ORIGIN (current_function_decl))
5508 {
5509 vec<tree, va_gc> **debug_args;
5510 unsigned int ix;
5511 tree ddecl;
5512 debug_args = decl_debug_args_lookup (current_function_decl);
5513 if (debug_args != NULL)
5514 {
5515 for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl);
5516 ix += 2)
5517 if (ddecl == aexp)
5518 return gen_rtx_DEBUG_PARAMETER_REF (mode, aexp);
5519 }
5520 }
5521 }
5522 break;
5523 }
5524 default:
5525 break;
5526 }
5527
5528 if (op0 == NULL_RTX)
5529 return NULL_RTX;
5530
5531 inner_mode = GET_MODE (op0);
5532 if (mode == inner_mode)
5533 return op0;
5534
5535 if (FLOAT_MODE_P (mode) && FLOAT_MODE_P (inner_mode))
5536 {
5537 if (GET_MODE_UNIT_BITSIZE (mode)
5538 == GET_MODE_UNIT_BITSIZE (inner_mode))
5539 op0 = simplify_gen_subreg (mode, op0, inner_mode, 0);
5540 else if (GET_MODE_UNIT_BITSIZE (mode)
5541 < GET_MODE_UNIT_BITSIZE (inner_mode))
5542 op0 = simplify_gen_unary (FLOAT_TRUNCATE, mode, op0, inner_mode);
5543 else
5544 op0 = simplify_gen_unary (FLOAT_EXTEND, mode, op0, inner_mode);
5545 }
5546 else if (FLOAT_MODE_P (mode))
5547 gcc_unreachable ();
5548 else if (FLOAT_MODE_P (inner_mode))
5549 {
5550 if (TYPE_UNSIGNED (TREE_TYPE (exp)))
5551 op0 = simplify_gen_unary (UNSIGNED_FIX, mode, op0, inner_mode);
5552 else
5553 op0 = simplify_gen_unary (FIX, mode, op0, inner_mode);
5554 }
5555 else if (GET_MODE_UNIT_PRECISION (mode)
5556 == GET_MODE_UNIT_PRECISION (inner_mode))
5557 op0 = lowpart_subreg (mode, op0, inner_mode);
5558 else if (GET_MODE_UNIT_PRECISION (mode)
5559 < GET_MODE_UNIT_PRECISION (inner_mode))
5560 op0 = simplify_gen_unary (TRUNCATE, mode, op0, inner_mode);
5561 else if (TYPE_UNSIGNED (TREE_TYPE (exp)))
5562 op0 = simplify_gen_unary (ZERO_EXTEND, mode, op0, inner_mode);
5563 else
5564 op0 = simplify_gen_unary (SIGN_EXTEND, mode, op0, inner_mode);
5565
5566 return op0;
5567 }
5568
5569 /* Ensure INSN_VAR_LOCATION_LOC (insn) doesn't have unbound complexity.
5570 Allow 4 levels of rtl nesting for most rtl codes, and if we see anything
5571 deeper than that, create DEBUG_EXPRs and emit DEBUG_INSNs before INSN. */
5572
5573 static void
avoid_complex_debug_insns(rtx_insn * insn,rtx * exp_p,int depth)5574 avoid_complex_debug_insns (rtx_insn *insn, rtx *exp_p, int depth)
5575 {
5576 rtx exp = *exp_p;
5577
5578 if (exp == NULL_RTX)
5579 return;
5580
5581 if ((OBJECT_P (exp) && !MEM_P (exp)) || GET_CODE (exp) == CLOBBER)
5582 return;
5583
5584 if (depth == 4)
5585 {
5586 /* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
5587 rtx dval = make_debug_expr_from_rtl (exp);
5588
5589 /* Emit a debug bind insn before INSN. */
5590 rtx bind = gen_rtx_VAR_LOCATION (GET_MODE (exp),
5591 DEBUG_EXPR_TREE_DECL (dval), exp,
5592 VAR_INIT_STATUS_INITIALIZED);
5593
5594 emit_debug_insn_before (bind, insn);
5595 *exp_p = dval;
5596 return;
5597 }
5598
5599 const char *format_ptr = GET_RTX_FORMAT (GET_CODE (exp));
5600 int i, j;
5601 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
5602 switch (*format_ptr++)
5603 {
5604 case 'e':
5605 avoid_complex_debug_insns (insn, &XEXP (exp, i), depth + 1);
5606 break;
5607
5608 case 'E':
5609 case 'V':
5610 for (j = 0; j < XVECLEN (exp, i); j++)
5611 avoid_complex_debug_insns (insn, &XVECEXP (exp, i, j), depth + 1);
5612 break;
5613
5614 default:
5615 break;
5616 }
5617 }
5618
5619 /* Expand the _LOCs in debug insns. We run this after expanding all
5620 regular insns, so that any variables referenced in the function
5621 will have their DECL_RTLs set. */
5622
5623 static void
expand_debug_locations(void)5624 expand_debug_locations (void)
5625 {
5626 rtx_insn *insn;
5627 rtx_insn *last = get_last_insn ();
5628 int save_strict_alias = flag_strict_aliasing;
5629
5630 /* New alias sets while setting up memory attributes cause
5631 -fcompare-debug failures, even though it doesn't bring about any
5632 codegen changes. */
5633 flag_strict_aliasing = 0;
5634
5635 for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
5636 if (DEBUG_BIND_INSN_P (insn))
5637 {
5638 tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
5639 rtx val;
5640 rtx_insn *prev_insn, *insn2;
5641 machine_mode mode;
5642
5643 if (value == NULL_TREE)
5644 val = NULL_RTX;
5645 else
5646 {
5647 if (INSN_VAR_LOCATION_STATUS (insn)
5648 == VAR_INIT_STATUS_UNINITIALIZED)
5649 val = expand_debug_source_expr (value);
5650 /* The avoid_deep_ter_for_debug function inserts
5651 debug bind stmts after SSA_NAME definition, with the
5652 SSA_NAME as the whole bind location. Disable temporarily
5653 expansion of that SSA_NAME into the DEBUG_EXPR_DECL
5654 being defined in this DEBUG_INSN. */
5655 else if (deep_ter_debug_map && TREE_CODE (value) == SSA_NAME)
5656 {
5657 tree *slot = deep_ter_debug_map->get (value);
5658 if (slot)
5659 {
5660 if (*slot == INSN_VAR_LOCATION_DECL (insn))
5661 *slot = NULL_TREE;
5662 else
5663 slot = NULL;
5664 }
5665 val = expand_debug_expr (value);
5666 if (slot)
5667 *slot = INSN_VAR_LOCATION_DECL (insn);
5668 }
5669 else
5670 val = expand_debug_expr (value);
5671 gcc_assert (last == get_last_insn ());
5672 }
5673
5674 if (!val)
5675 val = gen_rtx_UNKNOWN_VAR_LOC ();
5676 else
5677 {
5678 mode = GET_MODE (INSN_VAR_LOCATION (insn));
5679
5680 gcc_assert (mode == GET_MODE (val)
5681 || (GET_MODE (val) == VOIDmode
5682 && (CONST_SCALAR_INT_P (val)
5683 || GET_CODE (val) == CONST_FIXED
5684 || GET_CODE (val) == LABEL_REF)));
5685 }
5686
5687 INSN_VAR_LOCATION_LOC (insn) = val;
5688 prev_insn = PREV_INSN (insn);
5689 for (insn2 = insn; insn2 != prev_insn; insn2 = PREV_INSN (insn2))
5690 avoid_complex_debug_insns (insn2, &INSN_VAR_LOCATION_LOC (insn2), 0);
5691 }
5692
5693 flag_strict_aliasing = save_strict_alias;
5694 }
5695
5696 /* Performs swapping operands of commutative operations to expand
5697 the expensive one first. */
5698
5699 static void
reorder_operands(basic_block bb)5700 reorder_operands (basic_block bb)
5701 {
5702 unsigned int *lattice; /* Hold cost of each statement. */
5703 unsigned int i = 0, n = 0;
5704 gimple_stmt_iterator gsi;
5705 gimple_seq stmts;
5706 gimple *stmt;
5707 bool swap;
5708 tree op0, op1;
5709 ssa_op_iter iter;
5710 use_operand_p use_p;
5711 gimple *def0, *def1;
5712
5713 /* Compute cost of each statement using estimate_num_insns. */
5714 stmts = bb_seq (bb);
5715 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
5716 {
5717 stmt = gsi_stmt (gsi);
5718 if (!is_gimple_debug (stmt))
5719 gimple_set_uid (stmt, n++);
5720 }
5721 lattice = XNEWVEC (unsigned int, n);
5722 for (gsi = gsi_start (stmts); !gsi_end_p (gsi); gsi_next (&gsi))
5723 {
5724 unsigned cost;
5725 stmt = gsi_stmt (gsi);
5726 if (is_gimple_debug (stmt))
5727 continue;
5728 cost = estimate_num_insns (stmt, &eni_size_weights);
5729 lattice[i] = cost;
5730 FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
5731 {
5732 tree use = USE_FROM_PTR (use_p);
5733 gimple *def_stmt;
5734 if (TREE_CODE (use) != SSA_NAME)
5735 continue;
5736 def_stmt = get_gimple_for_ssa_name (use);
5737 if (!def_stmt)
5738 continue;
5739 lattice[i] += lattice[gimple_uid (def_stmt)];
5740 }
5741 i++;
5742 if (!is_gimple_assign (stmt)
5743 || !commutative_tree_code (gimple_assign_rhs_code (stmt)))
5744 continue;
5745 op0 = gimple_op (stmt, 1);
5746 op1 = gimple_op (stmt, 2);
5747 if (TREE_CODE (op0) != SSA_NAME
5748 || TREE_CODE (op1) != SSA_NAME)
5749 continue;
5750 /* Swap operands if the second one is more expensive. */
5751 def0 = get_gimple_for_ssa_name (op0);
5752 def1 = get_gimple_for_ssa_name (op1);
5753 if (!def1)
5754 continue;
5755 swap = false;
5756 if (!def0 || lattice[gimple_uid (def1)] > lattice[gimple_uid (def0)])
5757 swap = true;
5758 if (swap)
5759 {
5760 if (dump_file && (dump_flags & TDF_DETAILS))
5761 {
5762 fprintf (dump_file, "Swap operands in stmt:\n");
5763 print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
5764 fprintf (dump_file, "Cost left opnd=%d, right opnd=%d\n",
5765 def0 ? lattice[gimple_uid (def0)] : 0,
5766 lattice[gimple_uid (def1)]);
5767 }
5768 swap_ssa_operands (stmt, gimple_assign_rhs1_ptr (stmt),
5769 gimple_assign_rhs2_ptr (stmt));
5770 }
5771 }
5772 XDELETE (lattice);
5773 }
5774
5775 /* Expand basic block BB from GIMPLE trees to RTL. */
5776
5777 static basic_block
expand_gimple_basic_block(basic_block bb,bool disable_tail_calls)5778 expand_gimple_basic_block (basic_block bb, bool disable_tail_calls)
5779 {
5780 gimple_stmt_iterator gsi;
5781 gimple_seq stmts;
5782 gimple *stmt = NULL;
5783 rtx_note *note = NULL;
5784 rtx_insn *last;
5785 edge e;
5786 edge_iterator ei;
5787 bool nondebug_stmt_seen = false;
5788
5789 if (dump_file)
5790 fprintf (dump_file, "\n;; Generating RTL for gimple basic block %d\n",
5791 bb->index);
5792
5793 /* Note that since we are now transitioning from GIMPLE to RTL, we
5794 cannot use the gsi_*_bb() routines because they expect the basic
5795 block to be in GIMPLE, instead of RTL. Therefore, we need to
5796 access the BB sequence directly. */
5797 if (optimize)
5798 reorder_operands (bb);
5799 stmts = bb_seq (bb);
5800 bb->il.gimple.seq = NULL;
5801 bb->il.gimple.phi_nodes = NULL;
5802 rtl_profile_for_bb (bb);
5803 init_rtl_bb_info (bb);
5804 bb->flags |= BB_RTL;
5805
5806 /* Remove the RETURN_EXPR if we may fall though to the exit
5807 instead. */
5808 gsi = gsi_last (stmts);
5809 if (!gsi_end_p (gsi)
5810 && gimple_code (gsi_stmt (gsi)) == GIMPLE_RETURN)
5811 {
5812 greturn *ret_stmt = as_a <greturn *> (gsi_stmt (gsi));
5813
5814 gcc_assert (single_succ_p (bb));
5815 gcc_assert (single_succ (bb) == EXIT_BLOCK_PTR_FOR_FN (cfun));
5816
5817 if (bb->next_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)
5818 && !gimple_return_retval (ret_stmt))
5819 {
5820 gsi_remove (&gsi, false);
5821 single_succ_edge (bb)->flags |= EDGE_FALLTHRU;
5822 }
5823 }
5824
5825 gsi = gsi_start (stmts);
5826 if (!gsi_end_p (gsi))
5827 {
5828 stmt = gsi_stmt (gsi);
5829 if (gimple_code (stmt) != GIMPLE_LABEL)
5830 stmt = NULL;
5831 }
5832
5833 rtx_code_label **elt = lab_rtx_for_bb->get (bb);
5834
5835 if (stmt || elt)
5836 {
5837 gcc_checking_assert (!note);
5838 last = get_last_insn ();
5839
5840 if (stmt)
5841 {
5842 expand_gimple_stmt (stmt);
5843 gsi_next (&gsi);
5844 }
5845
5846 if (elt)
5847 emit_label (*elt);
5848
5849 BB_HEAD (bb) = NEXT_INSN (last);
5850 if (NOTE_P (BB_HEAD (bb)))
5851 BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb));
5852 gcc_assert (LABEL_P (BB_HEAD (bb)));
5853 note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb));
5854
5855 maybe_dump_rtl_for_gimple_stmt (stmt, last);
5856 }
5857 else
5858 BB_HEAD (bb) = note = emit_note (NOTE_INSN_BASIC_BLOCK);
5859
5860 if (note)
5861 NOTE_BASIC_BLOCK (note) = bb;
5862
5863 for (; !gsi_end_p (gsi); gsi_next (&gsi))
5864 {
5865 basic_block new_bb;
5866
5867 stmt = gsi_stmt (gsi);
5868 if (!is_gimple_debug (stmt))
5869 nondebug_stmt_seen = true;
5870
5871 /* If this statement is a non-debug one, and we generate debug
5872 insns, then this one might be the last real use of a TERed
5873 SSA_NAME, but where there are still some debug uses further
5874 down. Expanding the current SSA name in such further debug
5875 uses by their RHS might lead to wrong debug info, as coalescing
5876 might make the operands of such RHS be placed into the same
5877 pseudo as something else. Like so:
5878 a_1 = a_0 + 1; // Assume a_1 is TERed and a_0 is dead
5879 use(a_1);
5880 a_2 = ...
5881 #DEBUG ... => a_1
5882 As a_0 and a_2 don't overlap in lifetime, assume they are coalesced.
5883 If we now would expand a_1 by it's RHS (a_0 + 1) in the debug use,
5884 the write to a_2 would actually have clobbered the place which
5885 formerly held a_0.
5886
5887 So, instead of that, we recognize the situation, and generate
5888 debug temporaries at the last real use of TERed SSA names:
5889 a_1 = a_0 + 1;
5890 #DEBUG #D1 => a_1
5891 use(a_1);
5892 a_2 = ...
5893 #DEBUG ... => #D1
5894 */
5895 if (MAY_HAVE_DEBUG_BIND_INSNS
5896 && SA.values
5897 && !is_gimple_debug (stmt))
5898 {
5899 ssa_op_iter iter;
5900 tree op;
5901 gimple *def;
5902
5903 location_t sloc = curr_insn_location ();
5904
5905 /* Look for SSA names that have their last use here (TERed
5906 names always have only one real use). */
5907 FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE)
5908 if ((def = get_gimple_for_ssa_name (op)))
5909 {
5910 imm_use_iterator imm_iter;
5911 use_operand_p use_p;
5912 bool have_debug_uses = false;
5913
5914 FOR_EACH_IMM_USE_FAST (use_p, imm_iter, op)
5915 {
5916 if (gimple_debug_bind_p (USE_STMT (use_p)))
5917 {
5918 have_debug_uses = true;
5919 break;
5920 }
5921 }
5922
5923 if (have_debug_uses)
5924 {
5925 /* OP is a TERed SSA name, with DEF its defining
5926 statement, and where OP is used in further debug
5927 instructions. Generate a debug temporary, and
5928 replace all uses of OP in debug insns with that
5929 temporary. */
5930 gimple *debugstmt;
5931 tree value = gimple_assign_rhs_to_tree (def);
5932 tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
5933 rtx val;
5934 machine_mode mode;
5935
5936 set_curr_insn_location (gimple_location (def));
5937
5938 if (DECL_P (value))
5939 mode = DECL_MODE (value);
5940 else
5941 mode = TYPE_MODE (TREE_TYPE (value));
5942 /* FIXME: Is setting the mode really necessary? */
5943 SET_DECL_MODE (vexpr, mode);
5944
5945 val = gen_rtx_VAR_LOCATION
5946 (mode, vexpr, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
5947
5948 emit_debug_insn (val);
5949
5950 FOR_EACH_IMM_USE_STMT (debugstmt, imm_iter, op)
5951 {
5952 if (!gimple_debug_bind_p (debugstmt))
5953 continue;
5954
5955 FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
5956 SET_USE (use_p, vexpr);
5957
5958 update_stmt (debugstmt);
5959 }
5960 }
5961 }
5962 set_curr_insn_location (sloc);
5963 }
5964
5965 currently_expanding_gimple_stmt = stmt;
5966
5967 /* Expand this statement, then evaluate the resulting RTL and
5968 fixup the CFG accordingly. */
5969 if (gimple_code (stmt) == GIMPLE_COND)
5970 {
5971 new_bb = expand_gimple_cond (bb, as_a <gcond *> (stmt));
5972 if (new_bb)
5973 {
5974 currently_expanding_gimple_stmt = NULL;
5975 return new_bb;
5976 }
5977 }
5978 else if (is_gimple_debug (stmt))
5979 {
5980 location_t sloc = curr_insn_location ();
5981 gimple_stmt_iterator nsi = gsi;
5982
5983 for (;;)
5984 {
5985 tree var;
5986 tree value = NULL_TREE;
5987 rtx val = NULL_RTX;
5988 machine_mode mode;
5989
5990 if (!gimple_debug_nonbind_marker_p (stmt))
5991 {
5992 if (gimple_debug_bind_p (stmt))
5993 {
5994 var = gimple_debug_bind_get_var (stmt);
5995
5996 if (TREE_CODE (var) != DEBUG_EXPR_DECL
5997 && TREE_CODE (var) != LABEL_DECL
5998 && !target_for_debug_bind (var))
5999 goto delink_debug_stmt;
6000
6001 if (DECL_P (var) && !VECTOR_TYPE_P (TREE_TYPE (var)))
6002 mode = DECL_MODE (var);
6003 else
6004 mode = TYPE_MODE (TREE_TYPE (var));
6005
6006 if (gimple_debug_bind_has_value_p (stmt))
6007 value = gimple_debug_bind_get_value (stmt);
6008
6009 val = gen_rtx_VAR_LOCATION
6010 (mode, var, (rtx)value, VAR_INIT_STATUS_INITIALIZED);
6011 }
6012 else if (gimple_debug_source_bind_p (stmt))
6013 {
6014 var = gimple_debug_source_bind_get_var (stmt);
6015
6016 value = gimple_debug_source_bind_get_value (stmt);
6017
6018 if (!VECTOR_TYPE_P (TREE_TYPE (var)))
6019 mode = DECL_MODE (var);
6020 else
6021 mode = TYPE_MODE (TREE_TYPE (var));
6022
6023 val = gen_rtx_VAR_LOCATION (mode, var, (rtx)value,
6024 VAR_INIT_STATUS_UNINITIALIZED);
6025 }
6026 else
6027 gcc_unreachable ();
6028 }
6029 /* If this function was first compiled with markers
6030 enabled, but they're now disable (e.g. LTO), drop
6031 them on the floor. */
6032 else if (gimple_debug_nonbind_marker_p (stmt)
6033 && !MAY_HAVE_DEBUG_MARKER_INSNS)
6034 goto delink_debug_stmt;
6035 else if (gimple_debug_begin_stmt_p (stmt))
6036 val = GEN_RTX_DEBUG_MARKER_BEGIN_STMT_PAT ();
6037 else if (gimple_debug_inline_entry_p (stmt))
6038 val = GEN_RTX_DEBUG_MARKER_INLINE_ENTRY_PAT ();
6039 else
6040 gcc_unreachable ();
6041
6042 last = get_last_insn ();
6043
6044 set_curr_insn_location (gimple_location (stmt));
6045
6046 emit_debug_insn (val);
6047
6048 if (dump_file && (dump_flags & TDF_DETAILS))
6049 {
6050 /* We can't dump the insn with a TREE where an RTX
6051 is expected. */
6052 if (GET_CODE (val) == VAR_LOCATION)
6053 {
6054 gcc_checking_assert (PAT_VAR_LOCATION_LOC (val) == (rtx)value);
6055 PAT_VAR_LOCATION_LOC (val) = const0_rtx;
6056 }
6057 maybe_dump_rtl_for_gimple_stmt (stmt, last);
6058 if (GET_CODE (val) == VAR_LOCATION)
6059 PAT_VAR_LOCATION_LOC (val) = (rtx)value;
6060 }
6061
6062 delink_debug_stmt:
6063 /* In order not to generate too many debug temporaries,
6064 we delink all uses of debug statements we already expanded.
6065 Therefore debug statements between definition and real
6066 use of TERed SSA names will continue to use the SSA name,
6067 and not be replaced with debug temps. */
6068 delink_stmt_imm_use (stmt);
6069
6070 gsi = nsi;
6071 gsi_next (&nsi);
6072 if (gsi_end_p (nsi))
6073 break;
6074 stmt = gsi_stmt (nsi);
6075 if (!is_gimple_debug (stmt))
6076 break;
6077 }
6078
6079 set_curr_insn_location (sloc);
6080 }
6081 else
6082 {
6083 gcall *call_stmt = dyn_cast <gcall *> (stmt);
6084 if (call_stmt
6085 && gimple_call_tail_p (call_stmt)
6086 && disable_tail_calls)
6087 gimple_call_set_tail (call_stmt, false);
6088
6089 if (call_stmt && gimple_call_tail_p (call_stmt))
6090 {
6091 bool can_fallthru;
6092 new_bb = expand_gimple_tailcall (bb, call_stmt, &can_fallthru);
6093 if (new_bb)
6094 {
6095 if (can_fallthru)
6096 bb = new_bb;
6097 else
6098 {
6099 currently_expanding_gimple_stmt = NULL;
6100 return new_bb;
6101 }
6102 }
6103 }
6104 else
6105 {
6106 def_operand_p def_p;
6107 def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
6108
6109 if (def_p != NULL)
6110 {
6111 /* Ignore this stmt if it is in the list of
6112 replaceable expressions. */
6113 if (SA.values
6114 && bitmap_bit_p (SA.values,
6115 SSA_NAME_VERSION (DEF_FROM_PTR (def_p))))
6116 continue;
6117 }
6118 last = expand_gimple_stmt (stmt);
6119 maybe_dump_rtl_for_gimple_stmt (stmt, last);
6120 }
6121 }
6122 }
6123
6124 currently_expanding_gimple_stmt = NULL;
6125
6126 /* Expand implicit goto and convert goto_locus. */
6127 FOR_EACH_EDGE (e, ei, bb->succs)
6128 {
6129 if (e->goto_locus != UNKNOWN_LOCATION || !nondebug_stmt_seen)
6130 set_curr_insn_location (e->goto_locus);
6131 if ((e->flags & EDGE_FALLTHRU) && e->dest != bb->next_bb)
6132 {
6133 emit_jump (label_rtx_for_bb (e->dest));
6134 e->flags &= ~EDGE_FALLTHRU;
6135 }
6136 }
6137
6138 /* Expanded RTL can create a jump in the last instruction of block.
6139 This later might be assumed to be a jump to successor and break edge insertion.
6140 We need to insert dummy move to prevent this. PR41440. */
6141 if (single_succ_p (bb)
6142 && (single_succ_edge (bb)->flags & EDGE_FALLTHRU)
6143 && (last = get_last_insn ())
6144 && (JUMP_P (last)
6145 || (DEBUG_INSN_P (last)
6146 && JUMP_P (prev_nondebug_insn (last)))))
6147 {
6148 rtx dummy = gen_reg_rtx (SImode);
6149 emit_insn_after_noloc (gen_move_insn (dummy, dummy), last, NULL);
6150 }
6151
6152 do_pending_stack_adjust ();
6153
6154 /* Find the block tail. The last insn in the block is the insn
6155 before a barrier and/or table jump insn. */
6156 last = get_last_insn ();
6157 if (BARRIER_P (last))
6158 last = PREV_INSN (last);
6159 if (JUMP_TABLE_DATA_P (last))
6160 last = PREV_INSN (PREV_INSN (last));
6161 if (BARRIER_P (last))
6162 last = PREV_INSN (last);
6163 BB_END (bb) = last;
6164
6165 update_bb_for_insn (bb);
6166
6167 return bb;
6168 }
6169
6170
6171 /* Create a basic block for initialization code. */
6172
6173 static basic_block
construct_init_block(void)6174 construct_init_block (void)
6175 {
6176 basic_block init_block, first_block;
6177 edge e = NULL;
6178 int flags;
6179
6180 /* Multiple entry points not supported yet. */
6181 gcc_assert (EDGE_COUNT (ENTRY_BLOCK_PTR_FOR_FN (cfun)->succs) == 1);
6182 init_rtl_bb_info (ENTRY_BLOCK_PTR_FOR_FN (cfun));
6183 init_rtl_bb_info (EXIT_BLOCK_PTR_FOR_FN (cfun));
6184 ENTRY_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_RTL;
6185 EXIT_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_RTL;
6186
6187 e = EDGE_SUCC (ENTRY_BLOCK_PTR_FOR_FN (cfun), 0);
6188
6189 /* When entry edge points to first basic block, we don't need jump,
6190 otherwise we have to jump into proper target. */
6191 if (e && e->dest != ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb)
6192 {
6193 tree label = gimple_block_label (e->dest);
6194
6195 emit_jump (jump_target_rtx (label));
6196 flags = 0;
6197 }
6198 else
6199 flags = EDGE_FALLTHRU;
6200
6201 init_block = create_basic_block (NEXT_INSN (get_insns ()),
6202 get_last_insn (),
6203 ENTRY_BLOCK_PTR_FOR_FN (cfun));
6204 init_block->count = ENTRY_BLOCK_PTR_FOR_FN (cfun)->count;
6205 add_bb_to_loop (init_block, ENTRY_BLOCK_PTR_FOR_FN (cfun)->loop_father);
6206 if (e)
6207 {
6208 first_block = e->dest;
6209 redirect_edge_succ (e, init_block);
6210 make_single_succ_edge (init_block, first_block, flags);
6211 }
6212 else
6213 make_single_succ_edge (init_block, EXIT_BLOCK_PTR_FOR_FN (cfun),
6214 EDGE_FALLTHRU);
6215
6216 update_bb_for_insn (init_block);
6217 return init_block;
6218 }
6219
6220 /* For each lexical block, set BLOCK_NUMBER to the depth at which it is
6221 found in the block tree. */
6222
6223 static void
set_block_levels(tree block,int level)6224 set_block_levels (tree block, int level)
6225 {
6226 while (block)
6227 {
6228 BLOCK_NUMBER (block) = level;
6229 set_block_levels (BLOCK_SUBBLOCKS (block), level + 1);
6230 block = BLOCK_CHAIN (block);
6231 }
6232 }
6233
6234 /* Create a block containing landing pads and similar stuff. */
6235
6236 static void
construct_exit_block(void)6237 construct_exit_block (void)
6238 {
6239 rtx_insn *head = get_last_insn ();
6240 rtx_insn *end;
6241 basic_block exit_block;
6242 edge e, e2;
6243 unsigned ix;
6244 edge_iterator ei;
6245 basic_block prev_bb = EXIT_BLOCK_PTR_FOR_FN (cfun)->prev_bb;
6246 rtx_insn *orig_end = BB_END (prev_bb);
6247
6248 rtl_profile_for_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
6249
6250 /* Make sure the locus is set to the end of the function, so that
6251 epilogue line numbers and warnings are set properly. */
6252 if (LOCATION_LOCUS (cfun->function_end_locus) != UNKNOWN_LOCATION)
6253 input_location = cfun->function_end_locus;
6254
6255 /* Generate rtl for function exit. */
6256 expand_function_end ();
6257
6258 end = get_last_insn ();
6259 if (head == end)
6260 return;
6261 /* While emitting the function end we could move end of the last basic
6262 block. */
6263 BB_END (prev_bb) = orig_end;
6264 while (NEXT_INSN (head) && NOTE_P (NEXT_INSN (head)))
6265 head = NEXT_INSN (head);
6266 /* But make sure exit_block starts with RETURN_LABEL, otherwise the
6267 bb count counting will be confused. Any instructions before that
6268 label are emitted for the case where PREV_BB falls through into the
6269 exit block, so append those instructions to prev_bb in that case. */
6270 if (NEXT_INSN (head) != return_label)
6271 {
6272 while (NEXT_INSN (head) != return_label)
6273 {
6274 if (!NOTE_P (NEXT_INSN (head)))
6275 BB_END (prev_bb) = NEXT_INSN (head);
6276 head = NEXT_INSN (head);
6277 }
6278 }
6279 exit_block = create_basic_block (NEXT_INSN (head), end, prev_bb);
6280 exit_block->count = EXIT_BLOCK_PTR_FOR_FN (cfun)->count;
6281 add_bb_to_loop (exit_block, EXIT_BLOCK_PTR_FOR_FN (cfun)->loop_father);
6282
6283 ix = 0;
6284 while (ix < EDGE_COUNT (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds))
6285 {
6286 e = EDGE_PRED (EXIT_BLOCK_PTR_FOR_FN (cfun), ix);
6287 if (!(e->flags & EDGE_ABNORMAL))
6288 redirect_edge_succ (e, exit_block);
6289 else
6290 ix++;
6291 }
6292
6293 e = make_single_succ_edge (exit_block, EXIT_BLOCK_PTR_FOR_FN (cfun),
6294 EDGE_FALLTHRU);
6295 FOR_EACH_EDGE (e2, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
6296 if (e2 != e)
6297 {
6298 exit_block->count -= e2->count ();
6299 }
6300 update_bb_for_insn (exit_block);
6301 }
6302
6303 /* Helper function for discover_nonconstant_array_refs.
6304 Look for ARRAY_REF nodes with non-constant indexes and mark them
6305 addressable. */
6306
6307 static tree
discover_nonconstant_array_refs_r(tree * tp,int * walk_subtrees,void * data)6308 discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
6309 void *data)
6310 {
6311 tree t = *tp;
6312 bitmap forced_stack_vars = (bitmap)((walk_stmt_info *)data)->info;
6313
6314 if (IS_TYPE_OR_DECL_P (t))
6315 *walk_subtrees = 0;
6316 else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
6317 {
6318 while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
6319 && is_gimple_min_invariant (TREE_OPERAND (t, 1))
6320 && (!TREE_OPERAND (t, 2)
6321 || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
6322 || (TREE_CODE (t) == COMPONENT_REF
6323 && (!TREE_OPERAND (t,2)
6324 || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
6325 || TREE_CODE (t) == BIT_FIELD_REF
6326 || TREE_CODE (t) == REALPART_EXPR
6327 || TREE_CODE (t) == IMAGPART_EXPR
6328 || TREE_CODE (t) == VIEW_CONVERT_EXPR
6329 || CONVERT_EXPR_P (t))
6330 t = TREE_OPERAND (t, 0);
6331
6332 if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
6333 {
6334 t = get_base_address (t);
6335 if (t && DECL_P (t)
6336 && DECL_MODE (t) != BLKmode
6337 && !TREE_ADDRESSABLE (t))
6338 bitmap_set_bit (forced_stack_vars, DECL_UID (t));
6339 }
6340
6341 *walk_subtrees = 0;
6342 }
6343 /* References of size POLY_INT_CST to a fixed-size object must go
6344 through memory. It's more efficient to force that here than
6345 to create temporary slots on the fly.
6346 RTL expansion expectes TARGET_MEM_REF to always address actual memory. */
6347 else if (TREE_CODE (t) == TARGET_MEM_REF
6348 || (TREE_CODE (t) == MEM_REF
6349 && TYPE_SIZE (TREE_TYPE (t))
6350 && POLY_INT_CST_P (TYPE_SIZE (TREE_TYPE (t)))))
6351 {
6352 tree base = get_base_address (t);
6353 if (base
6354 && DECL_P (base)
6355 && !TREE_ADDRESSABLE (base)
6356 && DECL_MODE (base) != BLKmode
6357 && GET_MODE_SIZE (DECL_MODE (base)).is_constant ())
6358 bitmap_set_bit (forced_stack_vars, DECL_UID (base));
6359 *walk_subtrees = 0;
6360 }
6361
6362 return NULL_TREE;
6363 }
6364
6365 /* If there's a chance to get a pseudo for t then if it would be of float mode
6366 and the actual access is via an integer mode (lowered memcpy or similar
6367 access) then avoid the register expansion if the mode likely is not storage
6368 suitable for raw bits processing (like XFmode on i?86). */
6369
6370 static void
avoid_type_punning_on_regs(tree t,bitmap forced_stack_vars)6371 avoid_type_punning_on_regs (tree t, bitmap forced_stack_vars)
6372 {
6373 machine_mode access_mode = TYPE_MODE (TREE_TYPE (t));
6374 if (access_mode != BLKmode
6375 && !SCALAR_INT_MODE_P (access_mode))
6376 return;
6377 tree base = get_base_address (t);
6378 if (DECL_P (base)
6379 && !TREE_ADDRESSABLE (base)
6380 && FLOAT_MODE_P (DECL_MODE (base))
6381 && maybe_lt (GET_MODE_PRECISION (DECL_MODE (base)),
6382 GET_MODE_BITSIZE (GET_MODE_INNER (DECL_MODE (base))))
6383 /* Double check in the expensive way we really would get a pseudo. */
6384 && use_register_for_decl (base))
6385 bitmap_set_bit (forced_stack_vars, DECL_UID (base));
6386 }
6387
6388 /* RTL expansion is not able to compile array references with variable
6389 offsets for arrays stored in single register. Discover such
6390 expressions and mark variables as addressable to avoid this
6391 scenario. */
6392
6393 static void
discover_nonconstant_array_refs(bitmap forced_stack_vars)6394 discover_nonconstant_array_refs (bitmap forced_stack_vars)
6395 {
6396 basic_block bb;
6397 gimple_stmt_iterator gsi;
6398
6399 walk_stmt_info wi = {};
6400 wi.info = forced_stack_vars;
6401 FOR_EACH_BB_FN (bb, cfun)
6402 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6403 {
6404 gimple *stmt = gsi_stmt (gsi);
6405 if (!is_gimple_debug (stmt))
6406 {
6407 walk_gimple_op (stmt, discover_nonconstant_array_refs_r, &wi);
6408 gcall *call = dyn_cast <gcall *> (stmt);
6409 if (call && gimple_call_internal_p (call))
6410 {
6411 tree cand = NULL_TREE;
6412 switch (gimple_call_internal_fn (call))
6413 {
6414 case IFN_LOAD_LANES:
6415 /* The source must be a MEM. */
6416 cand = gimple_call_arg (call, 0);
6417 break;
6418 case IFN_STORE_LANES:
6419 /* The destination must be a MEM. */
6420 cand = gimple_call_lhs (call);
6421 break;
6422 default:
6423 break;
6424 }
6425 if (cand)
6426 cand = get_base_address (cand);
6427 if (cand
6428 && DECL_P (cand)
6429 && use_register_for_decl (cand))
6430 bitmap_set_bit (forced_stack_vars, DECL_UID (cand));
6431 }
6432 if (gimple_vdef (stmt))
6433 {
6434 tree t = gimple_get_lhs (stmt);
6435 if (t && REFERENCE_CLASS_P (t))
6436 avoid_type_punning_on_regs (t, forced_stack_vars);
6437 }
6438 }
6439 }
6440 }
6441
6442 /* This function sets crtl->args.internal_arg_pointer to a virtual
6443 register if DRAP is needed. Local register allocator will replace
6444 virtual_incoming_args_rtx with the virtual register. */
6445
6446 static void
expand_stack_alignment(void)6447 expand_stack_alignment (void)
6448 {
6449 rtx drap_rtx;
6450 unsigned int preferred_stack_boundary;
6451
6452 if (! SUPPORTS_STACK_ALIGNMENT)
6453 return;
6454
6455 if (cfun->calls_alloca
6456 || cfun->has_nonlocal_label
6457 || crtl->has_nonlocal_goto)
6458 crtl->need_drap = true;
6459
6460 /* Call update_stack_boundary here again to update incoming stack
6461 boundary. It may set incoming stack alignment to a different
6462 value after RTL expansion. TARGET_FUNCTION_OK_FOR_SIBCALL may
6463 use the minimum incoming stack alignment to check if it is OK
6464 to perform sibcall optimization since sibcall optimization will
6465 only align the outgoing stack to incoming stack boundary. */
6466 if (targetm.calls.update_stack_boundary)
6467 targetm.calls.update_stack_boundary ();
6468
6469 /* The incoming stack frame has to be aligned at least at
6470 parm_stack_boundary. */
6471 gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY);
6472
6473 /* Update crtl->stack_alignment_estimated and use it later to align
6474 stack. We check PREFERRED_STACK_BOUNDARY if there may be non-call
6475 exceptions since callgraph doesn't collect incoming stack alignment
6476 in this case. */
6477 if (cfun->can_throw_non_call_exceptions
6478 && PREFERRED_STACK_BOUNDARY > crtl->preferred_stack_boundary)
6479 preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
6480 else
6481 preferred_stack_boundary = crtl->preferred_stack_boundary;
6482 if (preferred_stack_boundary > crtl->stack_alignment_estimated)
6483 crtl->stack_alignment_estimated = preferred_stack_boundary;
6484 if (preferred_stack_boundary > crtl->stack_alignment_needed)
6485 crtl->stack_alignment_needed = preferred_stack_boundary;
6486
6487 gcc_assert (crtl->stack_alignment_needed
6488 <= crtl->stack_alignment_estimated);
6489
6490 crtl->stack_realign_needed
6491 = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated;
6492 crtl->stack_realign_tried = crtl->stack_realign_needed;
6493
6494 crtl->stack_realign_processed = true;
6495
6496 /* Target has to redefine TARGET_GET_DRAP_RTX to support stack
6497 alignment. */
6498 gcc_assert (targetm.calls.get_drap_rtx != NULL);
6499 drap_rtx = targetm.calls.get_drap_rtx ();
6500
6501 /* stack_realign_drap and drap_rtx must match. */
6502 gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL));
6503
6504 /* Do nothing if NULL is returned, which means DRAP is not needed. */
6505 if (drap_rtx != NULL)
6506 {
6507 crtl->args.internal_arg_pointer = drap_rtx;
6508
6509 /* Call fixup_tail_calls to clean up REG_EQUIV note if DRAP is
6510 needed. */
6511 fixup_tail_calls ();
6512 }
6513 }
6514
6515
6516 static void
expand_main_function(void)6517 expand_main_function (void)
6518 {
6519 #if (defined(INVOKE__main) \
6520 || (!defined(HAS_INIT_SECTION) \
6521 && !defined(INIT_SECTION_ASM_OP) \
6522 && !defined(INIT_ARRAY_SECTION_ASM_OP)))
6523 emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode);
6524 #endif
6525 }
6526
6527
6528 /* Expand code to initialize the stack_protect_guard. This is invoked at
6529 the beginning of a function to be protected. */
6530
6531 static void
stack_protect_prologue(void)6532 stack_protect_prologue (void)
6533 {
6534 tree guard_decl = targetm.stack_protect_guard ();
6535 rtx x, y;
6536
6537 crtl->stack_protect_guard_decl = guard_decl;
6538 x = expand_normal (crtl->stack_protect_guard);
6539
6540 if (targetm.have_stack_protect_combined_set () && guard_decl)
6541 {
6542 gcc_assert (DECL_P (guard_decl));
6543 y = DECL_RTL (guard_decl);
6544
6545 /* Allow the target to compute address of Y and copy it to X without
6546 leaking Y into a register. This combined address + copy pattern
6547 allows the target to prevent spilling of any intermediate results by
6548 splitting it after register allocator. */
6549 if (rtx_insn *insn = targetm.gen_stack_protect_combined_set (x, y))
6550 {
6551 emit_insn (insn);
6552 return;
6553 }
6554 }
6555
6556 if (guard_decl)
6557 y = expand_normal (guard_decl);
6558 else
6559 y = const0_rtx;
6560
6561 /* Allow the target to copy from Y to X without leaking Y into a
6562 register. */
6563 if (targetm.have_stack_protect_set ())
6564 if (rtx_insn *insn = targetm.gen_stack_protect_set (x, y))
6565 {
6566 emit_insn (insn);
6567 return;
6568 }
6569
6570 /* Otherwise do a straight move. */
6571 emit_move_insn (x, y);
6572 }
6573
6574 /* Translate the intermediate representation contained in the CFG
6575 from GIMPLE trees to RTL.
6576
6577 We do conversion per basic block and preserve/update the tree CFG.
6578 This implies we have to do some magic as the CFG can simultaneously
6579 consist of basic blocks containing RTL and GIMPLE trees. This can
6580 confuse the CFG hooks, so be careful to not manipulate CFG during
6581 the expansion. */
6582
6583 namespace {
6584
6585 const pass_data pass_data_expand =
6586 {
6587 RTL_PASS, /* type */
6588 "expand", /* name */
6589 OPTGROUP_NONE, /* optinfo_flags */
6590 TV_EXPAND, /* tv_id */
6591 ( PROP_ssa | PROP_gimple_leh | PROP_cfg
6592 | PROP_gimple_lcx
6593 | PROP_gimple_lvec
6594 | PROP_gimple_lva), /* properties_required */
6595 PROP_rtl, /* properties_provided */
6596 ( PROP_ssa | PROP_gimple ), /* properties_destroyed */
6597 0, /* todo_flags_start */
6598 0, /* todo_flags_finish */
6599 };
6600
6601 class pass_expand : public rtl_opt_pass
6602 {
6603 public:
pass_expand(gcc::context * ctxt)6604 pass_expand (gcc::context *ctxt)
6605 : rtl_opt_pass (pass_data_expand, ctxt)
6606 {}
6607
6608 /* opt_pass methods: */
6609 virtual unsigned int execute (function *);
6610
6611 }; // class pass_expand
6612
6613 unsigned int
execute(function * fun)6614 pass_expand::execute (function *fun)
6615 {
6616 basic_block bb, init_block;
6617 edge_iterator ei;
6618 edge e;
6619 rtx_insn *var_seq, *var_ret_seq;
6620 unsigned i;
6621
6622 timevar_push (TV_OUT_OF_SSA);
6623 rewrite_out_of_ssa (&SA);
6624 timevar_pop (TV_OUT_OF_SSA);
6625 SA.partition_to_pseudo = XCNEWVEC (rtx, SA.map->num_partitions);
6626
6627 if (MAY_HAVE_DEBUG_BIND_STMTS && flag_tree_ter)
6628 {
6629 gimple_stmt_iterator gsi;
6630 FOR_EACH_BB_FN (bb, cfun)
6631 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
6632 if (gimple_debug_bind_p (gsi_stmt (gsi)))
6633 avoid_deep_ter_for_debug (gsi_stmt (gsi), 0);
6634 }
6635
6636 /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */
6637 auto_bitmap forced_stack_vars;
6638 discover_nonconstant_array_refs (forced_stack_vars);
6639
6640 /* Make sure all values used by the optimization passes have sane
6641 defaults. */
6642 reg_renumber = 0;
6643
6644 /* Some backends want to know that we are expanding to RTL. */
6645 currently_expanding_to_rtl = 1;
6646 /* Dominators are not kept up-to-date as we may create new basic-blocks. */
6647 free_dominance_info (CDI_DOMINATORS);
6648
6649 rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
6650
6651 insn_locations_init ();
6652 if (!DECL_IS_UNDECLARED_BUILTIN (current_function_decl))
6653 {
6654 /* Eventually, all FEs should explicitly set function_start_locus. */
6655 if (LOCATION_LOCUS (fun->function_start_locus) == UNKNOWN_LOCATION)
6656 set_curr_insn_location
6657 (DECL_SOURCE_LOCATION (current_function_decl));
6658 else
6659 set_curr_insn_location (fun->function_start_locus);
6660 }
6661 else
6662 set_curr_insn_location (UNKNOWN_LOCATION);
6663 prologue_location = curr_insn_location ();
6664
6665 #ifdef INSN_SCHEDULING
6666 init_sched_attrs ();
6667 #endif
6668
6669 /* Make sure first insn is a note even if we don't want linenums.
6670 This makes sure the first insn will never be deleted.
6671 Also, final expects a note to appear there. */
6672 emit_note (NOTE_INSN_DELETED);
6673
6674 targetm.expand_to_rtl_hook ();
6675 crtl->init_stack_alignment ();
6676 fun->cfg->max_jumptable_ents = 0;
6677
6678 /* Resovle the function section. Some targets, like ARM EABI rely on knowledge
6679 of the function section at exapnsion time to predict distance of calls. */
6680 resolve_unique_section (current_function_decl, 0, flag_function_sections);
6681
6682 /* Expand the variables recorded during gimple lowering. */
6683 timevar_push (TV_VAR_EXPAND);
6684 start_sequence ();
6685
6686 var_ret_seq = expand_used_vars (forced_stack_vars);
6687
6688 var_seq = get_insns ();
6689 end_sequence ();
6690 timevar_pop (TV_VAR_EXPAND);
6691
6692 /* Honor stack protection warnings. */
6693 if (warn_stack_protect)
6694 {
6695 if (fun->calls_alloca)
6696 warning (OPT_Wstack_protector,
6697 "stack protector not protecting local variables: "
6698 "variable length buffer");
6699 if (has_short_buffer && !crtl->stack_protect_guard)
6700 warning (OPT_Wstack_protector,
6701 "stack protector not protecting function: "
6702 "all local arrays are less than %d bytes long",
6703 (int) param_ssp_buffer_size);
6704 }
6705
6706 /* Temporarily mark PARM_DECLs and RESULT_DECLs we need to expand to
6707 memory addressable so expand_function_start can emit the required
6708 copies. */
6709 auto_vec<tree, 16> marked_parms;
6710 for (tree parm = DECL_ARGUMENTS (current_function_decl); parm;
6711 parm = DECL_CHAIN (parm))
6712 if (!TREE_ADDRESSABLE (parm)
6713 && bitmap_bit_p (forced_stack_vars, DECL_UID (parm)))
6714 {
6715 TREE_ADDRESSABLE (parm) = 1;
6716 marked_parms.safe_push (parm);
6717 }
6718 if (DECL_RESULT (current_function_decl)
6719 && !TREE_ADDRESSABLE (DECL_RESULT (current_function_decl))
6720 && bitmap_bit_p (forced_stack_vars,
6721 DECL_UID (DECL_RESULT (current_function_decl))))
6722 {
6723 TREE_ADDRESSABLE (DECL_RESULT (current_function_decl)) = 1;
6724 marked_parms.safe_push (DECL_RESULT (current_function_decl));
6725 }
6726
6727 /* Set up parameters and prepare for return, for the function. */
6728 expand_function_start (current_function_decl);
6729
6730 /* Clear TREE_ADDRESSABLE again. */
6731 while (!marked_parms.is_empty ())
6732 TREE_ADDRESSABLE (marked_parms.pop ()) = 0;
6733
6734 /* If we emitted any instructions for setting up the variables,
6735 emit them before the FUNCTION_START note. */
6736 if (var_seq)
6737 {
6738 emit_insn_before (var_seq, parm_birth_insn);
6739
6740 /* In expand_function_end we'll insert the alloca save/restore
6741 before parm_birth_insn. We've just insertted an alloca call.
6742 Adjust the pointer to match. */
6743 parm_birth_insn = var_seq;
6744 }
6745
6746 /* Now propagate the RTL assignment of each partition to the
6747 underlying var of each SSA_NAME. */
6748 tree name;
6749
6750 FOR_EACH_SSA_NAME (i, name, cfun)
6751 {
6752 /* We might have generated new SSA names in
6753 update_alias_info_with_stack_vars. They will have a NULL
6754 defining statements, and won't be part of the partitioning,
6755 so ignore those. */
6756 if (!SSA_NAME_DEF_STMT (name))
6757 continue;
6758
6759 adjust_one_expanded_partition_var (name);
6760 }
6761
6762 /* Clean up RTL of variables that straddle across multiple
6763 partitions, and check that the rtl of any PARM_DECLs that are not
6764 cleaned up is that of their default defs. */
6765 FOR_EACH_SSA_NAME (i, name, cfun)
6766 {
6767 int part;
6768
6769 /* We might have generated new SSA names in
6770 update_alias_info_with_stack_vars. They will have a NULL
6771 defining statements, and won't be part of the partitioning,
6772 so ignore those. */
6773 if (!SSA_NAME_DEF_STMT (name))
6774 continue;
6775 part = var_to_partition (SA.map, name);
6776 if (part == NO_PARTITION)
6777 continue;
6778
6779 /* If this decl was marked as living in multiple places, reset
6780 this now to NULL. */
6781 tree var = SSA_NAME_VAR (name);
6782 if (var && DECL_RTL_IF_SET (var) == pc_rtx)
6783 SET_DECL_RTL (var, NULL);
6784 /* Check that the pseudos chosen by assign_parms are those of
6785 the corresponding default defs. */
6786 else if (SSA_NAME_IS_DEFAULT_DEF (name)
6787 && (TREE_CODE (var) == PARM_DECL
6788 || TREE_CODE (var) == RESULT_DECL))
6789 {
6790 rtx in = DECL_RTL_IF_SET (var);
6791 gcc_assert (in);
6792 rtx out = SA.partition_to_pseudo[part];
6793 gcc_assert (in == out);
6794
6795 /* Now reset VAR's RTL to IN, so that the _EXPR attrs match
6796 those expected by debug backends for each parm and for
6797 the result. This is particularly important for stabs,
6798 whose register elimination from parm's DECL_RTL may cause
6799 -fcompare-debug differences as SET_DECL_RTL changes reg's
6800 attrs. So, make sure the RTL already has the parm as the
6801 EXPR, so that it won't change. */
6802 SET_DECL_RTL (var, NULL_RTX);
6803 if (MEM_P (in))
6804 set_mem_attributes (in, var, true);
6805 SET_DECL_RTL (var, in);
6806 }
6807 }
6808
6809 /* If this function is `main', emit a call to `__main'
6810 to run global initializers, etc. */
6811 if (DECL_NAME (current_function_decl)
6812 && MAIN_NAME_P (DECL_NAME (current_function_decl))
6813 && DECL_FILE_SCOPE_P (current_function_decl))
6814 expand_main_function ();
6815
6816 /* Initialize the stack_protect_guard field. This must happen after the
6817 call to __main (if any) so that the external decl is initialized. */
6818 if (crtl->stack_protect_guard && targetm.stack_protect_runtime_enabled_p ())
6819 stack_protect_prologue ();
6820
6821 expand_phi_nodes (&SA);
6822
6823 /* Release any stale SSA redirection data. */
6824 redirect_edge_var_map_empty ();
6825
6826 /* Register rtl specific functions for cfg. */
6827 rtl_register_cfg_hooks ();
6828
6829 init_block = construct_init_block ();
6830
6831 /* Clear EDGE_EXECUTABLE on the entry edge(s). It is cleaned from the
6832 remaining edges later. */
6833 FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs)
6834 e->flags &= ~EDGE_EXECUTABLE;
6835
6836 /* If the function has too many markers, drop them while expanding. */
6837 if (cfun->debug_marker_count
6838 >= param_max_debug_marker_count)
6839 cfun->debug_nonbind_markers = false;
6840
6841 lab_rtx_for_bb = new hash_map<basic_block, rtx_code_label *>;
6842 FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
6843 next_bb)
6844 bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
6845
6846 if (MAY_HAVE_DEBUG_BIND_INSNS)
6847 expand_debug_locations ();
6848
6849 if (deep_ter_debug_map)
6850 {
6851 delete deep_ter_debug_map;
6852 deep_ter_debug_map = NULL;
6853 }
6854
6855 /* Free stuff we no longer need after GIMPLE optimizations. */
6856 free_dominance_info (CDI_DOMINATORS);
6857 free_dominance_info (CDI_POST_DOMINATORS);
6858 delete_tree_cfg_annotations (fun);
6859
6860 timevar_push (TV_OUT_OF_SSA);
6861 finish_out_of_ssa (&SA);
6862 timevar_pop (TV_OUT_OF_SSA);
6863
6864 timevar_push (TV_POST_EXPAND);
6865 /* We are no longer in SSA form. */
6866 fun->gimple_df->in_ssa_p = false;
6867 loops_state_clear (LOOP_CLOSED_SSA);
6868
6869 /* Expansion is used by optimization passes too, set maybe_hot_insn_p
6870 conservatively to true until they are all profile aware. */
6871 delete lab_rtx_for_bb;
6872 free_histograms (fun);
6873
6874 construct_exit_block ();
6875 insn_locations_finalize ();
6876
6877 if (var_ret_seq)
6878 {
6879 rtx_insn *after = return_label;
6880 rtx_insn *next = NEXT_INSN (after);
6881 if (next && NOTE_INSN_BASIC_BLOCK_P (next))
6882 after = next;
6883 emit_insn_after (var_ret_seq, after);
6884 }
6885
6886 if (hwasan_sanitize_stack_p ())
6887 hwasan_maybe_emit_frame_base_init ();
6888
6889 /* Zap the tree EH table. */
6890 set_eh_throw_stmt_table (fun, NULL);
6891
6892 /* We need JUMP_LABEL be set in order to redirect jumps, and hence
6893 split edges which edge insertions might do. */
6894 rebuild_jump_labels (get_insns ());
6895
6896 /* If we have a single successor to the entry block, put the pending insns
6897 after parm birth, but before NOTE_INSNS_FUNCTION_BEG. */
6898 if (single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun)))
6899 {
6900 edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fun));
6901 if (e->insns.r)
6902 {
6903 rtx_insn *insns = e->insns.r;
6904 e->insns.r = NULL;
6905 rebuild_jump_labels_chain (insns);
6906 if (NOTE_P (parm_birth_insn)
6907 && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG)
6908 emit_insn_before_noloc (insns, parm_birth_insn, e->dest);
6909 else
6910 emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
6911 }
6912 }
6913
6914 /* Otherwise, as well as for other edges, take the usual way. */
6915 commit_edge_insertions ();
6916
6917 /* We're done expanding trees to RTL. */
6918 currently_expanding_to_rtl = 0;
6919
6920 flush_mark_addressable_queue ();
6921
6922 FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun)->next_bb,
6923 EXIT_BLOCK_PTR_FOR_FN (fun), next_bb)
6924 {
6925 edge e;
6926 edge_iterator ei;
6927 for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
6928 {
6929 /* Clear EDGE_EXECUTABLE. This flag is never used in the backend. */
6930 e->flags &= ~EDGE_EXECUTABLE;
6931
6932 /* At the moment not all abnormal edges match the RTL
6933 representation. It is safe to remove them here as
6934 find_many_sub_basic_blocks will rediscover them.
6935 In the future we should get this fixed properly. */
6936 if ((e->flags & EDGE_ABNORMAL)
6937 && !(e->flags & EDGE_SIBCALL))
6938 remove_edge (e);
6939 else
6940 ei_next (&ei);
6941 }
6942 }
6943
6944 auto_sbitmap blocks (last_basic_block_for_fn (fun));
6945 bitmap_ones (blocks);
6946 find_many_sub_basic_blocks (blocks);
6947 purge_all_dead_edges ();
6948
6949 /* After initial rtl generation, call back to finish generating
6950 exception support code. We need to do this before cleaning up
6951 the CFG as the code does not expect dead landing pads. */
6952 if (fun->eh->region_tree != NULL)
6953 finish_eh_generation ();
6954
6955 /* Call expand_stack_alignment after finishing all
6956 updates to crtl->preferred_stack_boundary. */
6957 expand_stack_alignment ();
6958
6959 /* Fixup REG_EQUIV notes in the prologue if there are tailcalls in this
6960 function. */
6961 if (crtl->tail_call_emit)
6962 fixup_tail_calls ();
6963
6964 HOST_WIDE_INT patch_area_size, patch_area_entry;
6965 parse_and_check_patch_area (flag_patchable_function_entry, false,
6966 &patch_area_size, &patch_area_entry);
6967
6968 tree patchable_function_entry_attr
6969 = lookup_attribute ("patchable_function_entry",
6970 DECL_ATTRIBUTES (cfun->decl));
6971 if (patchable_function_entry_attr)
6972 {
6973 tree pp_val = TREE_VALUE (patchable_function_entry_attr);
6974 tree patchable_function_entry_value1 = TREE_VALUE (pp_val);
6975
6976 patch_area_size = tree_to_uhwi (patchable_function_entry_value1);
6977 patch_area_entry = 0;
6978 if (TREE_CHAIN (pp_val) != NULL_TREE)
6979 {
6980 tree patchable_function_entry_value2
6981 = TREE_VALUE (TREE_CHAIN (pp_val));
6982 patch_area_entry = tree_to_uhwi (patchable_function_entry_value2);
6983 }
6984 }
6985
6986 if (patch_area_entry > patch_area_size)
6987 {
6988 if (patch_area_size > 0)
6989 warning (OPT_Wattributes,
6990 "patchable function entry %wu exceeds size %wu",
6991 patch_area_entry, patch_area_size);
6992 patch_area_entry = 0;
6993 }
6994
6995 crtl->patch_area_size = patch_area_size;
6996 crtl->patch_area_entry = patch_area_entry;
6997
6998 /* BB subdivision may have created basic blocks that are only reachable
6999 from unlikely bbs but not marked as such in the profile. */
7000 if (optimize)
7001 propagate_unlikely_bbs_forward ();
7002
7003 /* Remove unreachable blocks, otherwise we cannot compute dominators
7004 which are needed for loop state verification. As a side-effect
7005 this also compacts blocks.
7006 ??? We cannot remove trivially dead insns here as for example
7007 the DRAP reg on i?86 is not magically live at this point.
7008 gcc.c-torture/execute/ipa-sra-2.c execution, -Os -m32 fails otherwise. */
7009 cleanup_cfg (CLEANUP_NO_INSN_DEL);
7010
7011 checking_verify_flow_info ();
7012
7013 /* Initialize pseudos allocated for hard registers. */
7014 emit_initial_value_sets ();
7015
7016 /* And finally unshare all RTL. */
7017 unshare_all_rtl ();
7018
7019 /* There's no need to defer outputting this function any more; we
7020 know we want to output it. */
7021 DECL_DEFER_OUTPUT (current_function_decl) = 0;
7022
7023 /* Now that we're done expanding trees to RTL, we shouldn't have any
7024 more CONCATs anywhere. */
7025 generating_concat_p = 0;
7026
7027 if (dump_file)
7028 {
7029 fprintf (dump_file,
7030 "\n\n;;\n;; Full RTL generated for this function:\n;;\n");
7031 /* And the pass manager will dump RTL for us. */
7032 }
7033
7034 /* If we're emitting a nested function, make sure its parent gets
7035 emitted as well. Doing otherwise confuses debug info. */
7036 {
7037 tree parent;
7038 for (parent = DECL_CONTEXT (current_function_decl);
7039 parent != NULL_TREE;
7040 parent = get_containing_scope (parent))
7041 if (TREE_CODE (parent) == FUNCTION_DECL)
7042 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
7043 }
7044
7045 TREE_ASM_WRITTEN (current_function_decl) = 1;
7046
7047 /* After expanding, the return labels are no longer needed. */
7048 return_label = NULL;
7049 naked_return_label = NULL;
7050
7051 /* After expanding, the tm_restart map is no longer needed. */
7052 if (fun->gimple_df->tm_restart)
7053 fun->gimple_df->tm_restart = NULL;
7054
7055 /* Tag the blocks with a depth number so that change_scope can find
7056 the common parent easily. */
7057 set_block_levels (DECL_INITIAL (fun->decl), 0);
7058 default_rtl_profile ();
7059
7060 /* For -dx discard loops now, otherwise IL verify in clean_state will
7061 ICE. */
7062 if (rtl_dump_and_exit)
7063 {
7064 cfun->curr_properties &= ~PROP_loops;
7065 loop_optimizer_finalize ();
7066 }
7067
7068 timevar_pop (TV_POST_EXPAND);
7069
7070 return 0;
7071 }
7072
7073 } // anon namespace
7074
7075 rtl_opt_pass *
make_pass_expand(gcc::context * ctxt)7076 make_pass_expand (gcc::context *ctxt)
7077 {
7078 return new pass_expand (ctxt);
7079 }
7080