Home | History | Annotate | Line # | Download | only in gcc
      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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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 *
   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
   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 *
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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 (&regset, 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
   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
   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
   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
   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
   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
   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
   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
   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
   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 *
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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
   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 (REFERENCE_CLASS_P (t) && TREE_THIS_VOLATILE (t))
   6317     {
   6318       t = get_base_address (t);
   6319       if (t && DECL_P (t)
   6320 	  && DECL_MODE (t) != BLKmode
   6321 	  && !TREE_ADDRESSABLE (t))
   6322 	bitmap_set_bit (forced_stack_vars, DECL_UID (t));
   6323       *walk_subtrees = 0;
   6324     }
   6325   else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
   6326     {
   6327       while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
   6328 	      && is_gimple_min_invariant (TREE_OPERAND (t, 1))
   6329 	      && (!TREE_OPERAND (t, 2)
   6330 		  || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
   6331 	     || (TREE_CODE (t) == COMPONENT_REF
   6332 		 && (!TREE_OPERAND (t,2)
   6333 		     || is_gimple_min_invariant (TREE_OPERAND (t, 2))))
   6334 	     || TREE_CODE (t) == BIT_FIELD_REF
   6335 	     || TREE_CODE (t) == REALPART_EXPR
   6336 	     || TREE_CODE (t) == IMAGPART_EXPR
   6337 	     || TREE_CODE (t) == VIEW_CONVERT_EXPR
   6338 	     || CONVERT_EXPR_P (t))
   6339 	t = TREE_OPERAND (t, 0);
   6340 
   6341       if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
   6342 	{
   6343 	  t = get_base_address (t);
   6344 	  if (t && DECL_P (t)
   6345 	      && DECL_MODE (t) != BLKmode
   6346 	      && !TREE_ADDRESSABLE (t))
   6347 	    bitmap_set_bit (forced_stack_vars, DECL_UID (t));
   6348 	}
   6349 
   6350       *walk_subtrees = 0;
   6351     }
   6352   /* References of size POLY_INT_CST to a fixed-size object must go
   6353      through memory.  It's more efficient to force that here than
   6354      to create temporary slots on the fly.
   6355      RTL expansion expectes TARGET_MEM_REF to always address actual memory.  */
   6356   else if (TREE_CODE (t) == TARGET_MEM_REF
   6357 	   || (TREE_CODE (t) == MEM_REF
   6358 	       && TYPE_SIZE (TREE_TYPE (t))
   6359 	       && POLY_INT_CST_P (TYPE_SIZE (TREE_TYPE (t)))))
   6360     {
   6361       tree base = get_base_address (t);
   6362       if (base
   6363 	  && DECL_P (base)
   6364 	  && !TREE_ADDRESSABLE (base)
   6365 	  && DECL_MODE (base) != BLKmode
   6366 	  && GET_MODE_SIZE (DECL_MODE (base)).is_constant ())
   6367 	bitmap_set_bit (forced_stack_vars, DECL_UID (base));
   6368       *walk_subtrees = 0;
   6369     }
   6370 
   6371   return NULL_TREE;
   6372 }
   6373 
   6374 /* If there's a chance to get a pseudo for t then if it would be of float mode
   6375    and the actual access is via an integer mode (lowered memcpy or similar
   6376    access) then avoid the register expansion if the mode likely is not storage
   6377    suitable for raw bits processing (like XFmode on i?86).  */
   6378 
   6379 static void
   6380 avoid_type_punning_on_regs (tree t, bitmap forced_stack_vars)
   6381 {
   6382   machine_mode access_mode = TYPE_MODE (TREE_TYPE (t));
   6383   if (access_mode != BLKmode
   6384       && !SCALAR_INT_MODE_P (access_mode))
   6385     return;
   6386   tree base = get_base_address (t);
   6387   if (DECL_P (base)
   6388       && !TREE_ADDRESSABLE (base)
   6389       && FLOAT_MODE_P (DECL_MODE (base))
   6390       && maybe_lt (GET_MODE_PRECISION (DECL_MODE (base)),
   6391 		   GET_MODE_BITSIZE (GET_MODE_INNER (DECL_MODE (base))))
   6392       /* Double check in the expensive way we really would get a pseudo.  */
   6393       && use_register_for_decl (base))
   6394     bitmap_set_bit (forced_stack_vars, DECL_UID (base));
   6395 }
   6396 
   6397 /* RTL expansion is not able to compile array references with variable
   6398    offsets for arrays stored in single register.  Discover such
   6399    expressions and mark variables as addressable to avoid this
   6400    scenario.  */
   6401 
   6402 static void
   6403 discover_nonconstant_array_refs (bitmap forced_stack_vars)
   6404 {
   6405   basic_block bb;
   6406   gimple_stmt_iterator gsi;
   6407 
   6408   walk_stmt_info wi = {};
   6409   wi.info = forced_stack_vars;
   6410   FOR_EACH_BB_FN (bb, cfun)
   6411     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   6412       {
   6413 	gimple *stmt = gsi_stmt (gsi);
   6414 	if (!is_gimple_debug (stmt))
   6415 	  {
   6416 	    walk_gimple_op (stmt, discover_nonconstant_array_refs_r, &wi);
   6417 	    gcall *call = dyn_cast <gcall *> (stmt);
   6418 	    if (call && gimple_call_internal_p (call))
   6419 	      {
   6420 		tree cand = NULL_TREE;
   6421 		switch (gimple_call_internal_fn (call))
   6422 		  {
   6423 		  case IFN_LOAD_LANES:
   6424 		    /* The source must be a MEM.  */
   6425 		    cand = gimple_call_arg (call, 0);
   6426 		    break;
   6427 		  case IFN_STORE_LANES:
   6428 		    /* The destination must be a MEM.  */
   6429 		    cand = gimple_call_lhs (call);
   6430 		    break;
   6431 		  default:
   6432 		    break;
   6433 		  }
   6434 		if (cand)
   6435 		  cand = get_base_address (cand);
   6436 		if (cand
   6437 		    && DECL_P (cand)
   6438 		    && use_register_for_decl (cand))
   6439 		  bitmap_set_bit (forced_stack_vars, DECL_UID (cand));
   6440 	      }
   6441 	    if (gimple_vdef (stmt))
   6442 	      {
   6443 		tree t = gimple_get_lhs (stmt);
   6444 		if (t && REFERENCE_CLASS_P (t))
   6445 		  avoid_type_punning_on_regs (t, forced_stack_vars);
   6446 	      }
   6447 	  }
   6448       }
   6449 }
   6450 
   6451 /* This function sets crtl->args.internal_arg_pointer to a virtual
   6452    register if DRAP is needed.  Local register allocator will replace
   6453    virtual_incoming_args_rtx with the virtual register.  */
   6454 
   6455 static void
   6456 expand_stack_alignment (void)
   6457 {
   6458   rtx drap_rtx;
   6459   unsigned int preferred_stack_boundary;
   6460 
   6461   if (! SUPPORTS_STACK_ALIGNMENT)
   6462     return;
   6463 
   6464   if (cfun->calls_alloca
   6465       || cfun->has_nonlocal_label
   6466       || crtl->has_nonlocal_goto)
   6467     crtl->need_drap = true;
   6468 
   6469   /* Call update_stack_boundary here again to update incoming stack
   6470      boundary.  It may set incoming stack alignment to a different
   6471      value after RTL expansion.  TARGET_FUNCTION_OK_FOR_SIBCALL may
   6472      use the minimum incoming stack alignment to check if it is OK
   6473      to perform sibcall optimization since sibcall optimization will
   6474      only align the outgoing stack to incoming stack boundary.  */
   6475   if (targetm.calls.update_stack_boundary)
   6476     targetm.calls.update_stack_boundary ();
   6477 
   6478   /* The incoming stack frame has to be aligned at least at
   6479      parm_stack_boundary.  */
   6480   gcc_assert (crtl->parm_stack_boundary <= INCOMING_STACK_BOUNDARY);
   6481 
   6482   /* Update crtl->stack_alignment_estimated and use it later to align
   6483      stack.  We check PREFERRED_STACK_BOUNDARY if there may be non-call
   6484      exceptions since callgraph doesn't collect incoming stack alignment
   6485      in this case.  */
   6486   if (cfun->can_throw_non_call_exceptions
   6487       && PREFERRED_STACK_BOUNDARY > crtl->preferred_stack_boundary)
   6488     preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
   6489   else
   6490     preferred_stack_boundary = crtl->preferred_stack_boundary;
   6491   if (preferred_stack_boundary > crtl->stack_alignment_estimated)
   6492     crtl->stack_alignment_estimated = preferred_stack_boundary;
   6493   if (preferred_stack_boundary > crtl->stack_alignment_needed)
   6494     crtl->stack_alignment_needed = preferred_stack_boundary;
   6495 
   6496   gcc_assert (crtl->stack_alignment_needed
   6497 	      <= crtl->stack_alignment_estimated);
   6498 
   6499   crtl->stack_realign_needed
   6500     = INCOMING_STACK_BOUNDARY < crtl->stack_alignment_estimated;
   6501   crtl->stack_realign_tried = crtl->stack_realign_needed;
   6502 
   6503   crtl->stack_realign_processed = true;
   6504 
   6505   /* Target has to redefine TARGET_GET_DRAP_RTX to support stack
   6506      alignment.  */
   6507   gcc_assert (targetm.calls.get_drap_rtx != NULL);
   6508   drap_rtx = targetm.calls.get_drap_rtx ();
   6509 
   6510   /* stack_realign_drap and drap_rtx must match.  */
   6511   gcc_assert ((stack_realign_drap != 0) == (drap_rtx != NULL));
   6512 
   6513   /* Do nothing if NULL is returned, which means DRAP is not needed.  */
   6514   if (drap_rtx != NULL)
   6515     {
   6516       crtl->args.internal_arg_pointer = drap_rtx;
   6517 
   6518       /* Call fixup_tail_calls to clean up REG_EQUIV note if DRAP is
   6519          needed. */
   6520       fixup_tail_calls ();
   6521     }
   6522 }
   6523 
   6524 
   6526 static void
   6527 expand_main_function (void)
   6528 {
   6529 #if (defined(INVOKE__main)				\
   6530      || (!defined(HAS_INIT_SECTION)			\
   6531 	 && !defined(INIT_SECTION_ASM_OP)		\
   6532 	 && !defined(INIT_ARRAY_SECTION_ASM_OP)))
   6533   emit_library_call (init_one_libfunc (NAME__MAIN), LCT_NORMAL, VOIDmode);
   6534 #endif
   6535 }
   6536 
   6537 
   6539 /* Expand code to initialize the stack_protect_guard.  This is invoked at
   6540    the beginning of a function to be protected.  */
   6541 
   6542 static void
   6543 stack_protect_prologue (void)
   6544 {
   6545   tree guard_decl = targetm.stack_protect_guard ();
   6546   rtx x, y;
   6547 
   6548   crtl->stack_protect_guard_decl = guard_decl;
   6549   x = expand_normal (crtl->stack_protect_guard);
   6550 
   6551   if (targetm.have_stack_protect_combined_set () && guard_decl)
   6552     {
   6553       gcc_assert (DECL_P (guard_decl));
   6554       y = DECL_RTL (guard_decl);
   6555 
   6556       /* Allow the target to compute address of Y and copy it to X without
   6557 	 leaking Y into a register.  This combined address + copy pattern
   6558 	 allows the target to prevent spilling of any intermediate results by
   6559 	 splitting it after register allocator.  */
   6560       if (rtx_insn *insn = targetm.gen_stack_protect_combined_set (x, y))
   6561 	{
   6562 	  emit_insn (insn);
   6563 	  return;
   6564 	}
   6565     }
   6566 
   6567   if (guard_decl)
   6568     y = expand_normal (guard_decl);
   6569   else
   6570     y = const0_rtx;
   6571 
   6572   /* Allow the target to copy from Y to X without leaking Y into a
   6573      register.  */
   6574   if (targetm.have_stack_protect_set ())
   6575     if (rtx_insn *insn = targetm.gen_stack_protect_set (x, y))
   6576       {
   6577 	emit_insn (insn);
   6578 	return;
   6579       }
   6580 
   6581   /* Otherwise do a straight move.  */
   6582   emit_move_insn (x, y);
   6583 }
   6584 
   6585 /* Translate the intermediate representation contained in the CFG
   6586    from GIMPLE trees to RTL.
   6587 
   6588    We do conversion per basic block and preserve/update the tree CFG.
   6589    This implies we have to do some magic as the CFG can simultaneously
   6590    consist of basic blocks containing RTL and GIMPLE trees.  This can
   6591    confuse the CFG hooks, so be careful to not manipulate CFG during
   6592    the expansion.  */
   6593 
   6594 namespace {
   6595 
   6596 const pass_data pass_data_expand =
   6597 {
   6598   RTL_PASS, /* type */
   6599   "expand", /* name */
   6600   OPTGROUP_NONE, /* optinfo_flags */
   6601   TV_EXPAND, /* tv_id */
   6602   ( PROP_ssa | PROP_gimple_leh | PROP_cfg
   6603     | PROP_gimple_lcx
   6604     | PROP_gimple_lvec
   6605     | PROP_gimple_lva), /* properties_required */
   6606   PROP_rtl, /* properties_provided */
   6607   ( PROP_ssa | PROP_gimple ), /* properties_destroyed */
   6608   0, /* todo_flags_start */
   6609   0, /* todo_flags_finish */
   6610 };
   6611 
   6612 class pass_expand : public rtl_opt_pass
   6613 {
   6614 public:
   6615   pass_expand (gcc::context *ctxt)
   6616     : rtl_opt_pass (pass_data_expand, ctxt)
   6617   {}
   6618 
   6619   /* opt_pass methods: */
   6620   virtual unsigned int execute (function *);
   6621 
   6622 }; // class pass_expand
   6623 
   6624 unsigned int
   6625 pass_expand::execute (function *fun)
   6626 {
   6627   basic_block bb, init_block;
   6628   edge_iterator ei;
   6629   edge e;
   6630   rtx_insn *var_seq, *var_ret_seq;
   6631   unsigned i;
   6632 
   6633   timevar_push (TV_OUT_OF_SSA);
   6634   rewrite_out_of_ssa (&SA);
   6635   timevar_pop (TV_OUT_OF_SSA);
   6636   SA.partition_to_pseudo = XCNEWVEC (rtx, SA.map->num_partitions);
   6637 
   6638   if (MAY_HAVE_DEBUG_BIND_STMTS && flag_tree_ter)
   6639     {
   6640       gimple_stmt_iterator gsi;
   6641       FOR_EACH_BB_FN (bb, cfun)
   6642 	for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
   6643 	  if (gimple_debug_bind_p (gsi_stmt (gsi)))
   6644 	    avoid_deep_ter_for_debug (gsi_stmt (gsi), 0);
   6645     }
   6646 
   6647   /* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE.  */
   6648   auto_bitmap forced_stack_vars;
   6649   discover_nonconstant_array_refs (forced_stack_vars);
   6650 
   6651   /* Make sure all values used by the optimization passes have sane
   6652      defaults.  */
   6653   reg_renumber = 0;
   6654 
   6655   /* Some backends want to know that we are expanding to RTL.  */
   6656   currently_expanding_to_rtl = 1;
   6657   /* Dominators are not kept up-to-date as we may create new basic-blocks.  */
   6658   free_dominance_info (CDI_DOMINATORS);
   6659 
   6660   rtl_profile_for_bb (ENTRY_BLOCK_PTR_FOR_FN (fun));
   6661 
   6662   insn_locations_init ();
   6663   if (!DECL_IS_UNDECLARED_BUILTIN (current_function_decl))
   6664     {
   6665       /* Eventually, all FEs should explicitly set function_start_locus.  */
   6666       if (LOCATION_LOCUS (fun->function_start_locus) == UNKNOWN_LOCATION)
   6667 	set_curr_insn_location
   6668 	  (DECL_SOURCE_LOCATION (current_function_decl));
   6669       else
   6670 	set_curr_insn_location (fun->function_start_locus);
   6671     }
   6672   else
   6673     set_curr_insn_location (UNKNOWN_LOCATION);
   6674   prologue_location = curr_insn_location ();
   6675 
   6676 #ifdef INSN_SCHEDULING
   6677   init_sched_attrs ();
   6678 #endif
   6679 
   6680   /* Make sure first insn is a note even if we don't want linenums.
   6681      This makes sure the first insn will never be deleted.
   6682      Also, final expects a note to appear there.  */
   6683   emit_note (NOTE_INSN_DELETED);
   6684 
   6685   targetm.expand_to_rtl_hook ();
   6686   crtl->init_stack_alignment ();
   6687   fun->cfg->max_jumptable_ents = 0;
   6688 
   6689   /* Resovle the function section.  Some targets, like ARM EABI rely on knowledge
   6690      of the function section at exapnsion time to predict distance of calls.  */
   6691   resolve_unique_section (current_function_decl, 0, flag_function_sections);
   6692 
   6693   /* Expand the variables recorded during gimple lowering.  */
   6694   timevar_push (TV_VAR_EXPAND);
   6695   start_sequence ();
   6696 
   6697   var_ret_seq = expand_used_vars (forced_stack_vars);
   6698 
   6699   var_seq = get_insns ();
   6700   end_sequence ();
   6701   timevar_pop (TV_VAR_EXPAND);
   6702 
   6703   /* Honor stack protection warnings.  */
   6704   if (warn_stack_protect)
   6705     {
   6706       if (fun->calls_alloca)
   6707 	warning (OPT_Wstack_protector,
   6708 		 "stack protector not protecting local variables: "
   6709 		 "variable length buffer");
   6710       if (has_short_buffer && !crtl->stack_protect_guard)
   6711 	warning (OPT_Wstack_protector,
   6712 		 "stack protector not protecting function: "
   6713 		 "all local arrays are less than %d bytes long",
   6714 		 (int) param_ssp_buffer_size);
   6715     }
   6716 
   6717   /* Temporarily mark PARM_DECLs and RESULT_DECLs we need to expand to
   6718      memory addressable so expand_function_start can emit the required
   6719      copies.  */
   6720   auto_vec<tree, 16> marked_parms;
   6721   for (tree parm = DECL_ARGUMENTS (current_function_decl); parm;
   6722        parm = DECL_CHAIN (parm))
   6723     if (!TREE_ADDRESSABLE (parm)
   6724 	&& bitmap_bit_p (forced_stack_vars, DECL_UID (parm)))
   6725       {
   6726 	TREE_ADDRESSABLE (parm) = 1;
   6727 	marked_parms.safe_push (parm);
   6728       }
   6729   if (DECL_RESULT (current_function_decl)
   6730       && !TREE_ADDRESSABLE (DECL_RESULT (current_function_decl))
   6731       && bitmap_bit_p (forced_stack_vars,
   6732 		       DECL_UID (DECL_RESULT (current_function_decl))))
   6733     {
   6734       TREE_ADDRESSABLE (DECL_RESULT (current_function_decl)) = 1;
   6735       marked_parms.safe_push (DECL_RESULT (current_function_decl));
   6736     }
   6737 
   6738   /* Set up parameters and prepare for return, for the function.  */
   6739   expand_function_start (current_function_decl);
   6740 
   6741   /* Clear TREE_ADDRESSABLE again.  */
   6742   while (!marked_parms.is_empty ())
   6743     TREE_ADDRESSABLE (marked_parms.pop ()) = 0;
   6744 
   6745   /* If we emitted any instructions for setting up the variables,
   6746      emit them before the FUNCTION_START note.  */
   6747   if (var_seq)
   6748     {
   6749       emit_insn_before (var_seq, parm_birth_insn);
   6750 
   6751       /* In expand_function_end we'll insert the alloca save/restore
   6752 	 before parm_birth_insn.  We've just insertted an alloca call.
   6753 	 Adjust the pointer to match.  */
   6754       parm_birth_insn = var_seq;
   6755     }
   6756 
   6757   /* Now propagate the RTL assignment of each partition to the
   6758      underlying var of each SSA_NAME.  */
   6759   tree name;
   6760 
   6761   FOR_EACH_SSA_NAME (i, name, cfun)
   6762     {
   6763       /* We might have generated new SSA names in
   6764 	 update_alias_info_with_stack_vars.  They will have a NULL
   6765 	 defining statements, and won't be part of the partitioning,
   6766 	 so ignore those.  */
   6767       if (!SSA_NAME_DEF_STMT (name))
   6768 	continue;
   6769 
   6770       adjust_one_expanded_partition_var (name);
   6771     }
   6772 
   6773   /* Clean up RTL of variables that straddle across multiple
   6774      partitions, and check that the rtl of any PARM_DECLs that are not
   6775      cleaned up is that of their default defs.  */
   6776   FOR_EACH_SSA_NAME (i, name, cfun)
   6777     {
   6778       int part;
   6779 
   6780       /* We might have generated new SSA names in
   6781 	 update_alias_info_with_stack_vars.  They will have a NULL
   6782 	 defining statements, and won't be part of the partitioning,
   6783 	 so ignore those.  */
   6784       if (!SSA_NAME_DEF_STMT (name))
   6785 	continue;
   6786       part = var_to_partition (SA.map, name);
   6787       if (part == NO_PARTITION)
   6788 	continue;
   6789 
   6790       /* If this decl was marked as living in multiple places, reset
   6791 	 this now to NULL.  */
   6792       tree var = SSA_NAME_VAR (name);
   6793       if (var && DECL_RTL_IF_SET (var) == pc_rtx)
   6794 	SET_DECL_RTL (var, NULL);
   6795       /* Check that the pseudos chosen by assign_parms are those of
   6796 	 the corresponding default defs.  */
   6797       else if (SSA_NAME_IS_DEFAULT_DEF (name)
   6798 	       && (TREE_CODE (var) == PARM_DECL
   6799 		   || TREE_CODE (var) == RESULT_DECL))
   6800 	{
   6801 	  rtx in = DECL_RTL_IF_SET (var);
   6802 	  gcc_assert (in);
   6803 	  rtx out = SA.partition_to_pseudo[part];
   6804 	  gcc_assert (in == out);
   6805 
   6806 	  /* Now reset VAR's RTL to IN, so that the _EXPR attrs match
   6807 	     those expected by debug backends for each parm and for
   6808 	     the result.  This is particularly important for stabs,
   6809 	     whose register elimination from parm's DECL_RTL may cause
   6810 	     -fcompare-debug differences as SET_DECL_RTL changes reg's
   6811 	     attrs.  So, make sure the RTL already has the parm as the
   6812 	     EXPR, so that it won't change.  */
   6813 	  SET_DECL_RTL (var, NULL_RTX);
   6814 	  if (MEM_P (in))
   6815 	    set_mem_attributes (in, var, true);
   6816 	  SET_DECL_RTL (var, in);
   6817 	}
   6818     }
   6819 
   6820   /* If this function is `main', emit a call to `__main'
   6821      to run global initializers, etc.  */
   6822   if (DECL_NAME (current_function_decl)
   6823       && MAIN_NAME_P (DECL_NAME (current_function_decl))
   6824       && DECL_FILE_SCOPE_P (current_function_decl))
   6825     expand_main_function ();
   6826 
   6827   /* Initialize the stack_protect_guard field.  This must happen after the
   6828      call to __main (if any) so that the external decl is initialized.  */
   6829   if (crtl->stack_protect_guard && targetm.stack_protect_runtime_enabled_p ())
   6830     stack_protect_prologue ();
   6831 
   6832   expand_phi_nodes (&SA);
   6833 
   6834   /* Release any stale SSA redirection data.  */
   6835   redirect_edge_var_map_empty ();
   6836 
   6837   /* Register rtl specific functions for cfg.  */
   6838   rtl_register_cfg_hooks ();
   6839 
   6840   init_block = construct_init_block ();
   6841 
   6842   /* Clear EDGE_EXECUTABLE on the entry edge(s).  It is cleaned from the
   6843      remaining edges later.  */
   6844   FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fun)->succs)
   6845     e->flags &= ~EDGE_EXECUTABLE;
   6846 
   6847   /* If the function has too many markers, drop them while expanding.  */
   6848   if (cfun->debug_marker_count
   6849       >= param_max_debug_marker_count)
   6850     cfun->debug_nonbind_markers = false;
   6851 
   6852   lab_rtx_for_bb = new hash_map<basic_block, rtx_code_label *>;
   6853   FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR_FOR_FN (fun),
   6854 		  next_bb)
   6855     bb = expand_gimple_basic_block (bb, var_ret_seq != NULL_RTX);
   6856 
   6857   if (MAY_HAVE_DEBUG_BIND_INSNS)
   6858     expand_debug_locations ();
   6859 
   6860   if (deep_ter_debug_map)
   6861     {
   6862       delete deep_ter_debug_map;
   6863       deep_ter_debug_map = NULL;
   6864     }
   6865 
   6866   /* Free stuff we no longer need after GIMPLE optimizations.  */
   6867   free_dominance_info (CDI_DOMINATORS);
   6868   free_dominance_info (CDI_POST_DOMINATORS);
   6869   delete_tree_cfg_annotations (fun);
   6870 
   6871   timevar_push (TV_OUT_OF_SSA);
   6872   finish_out_of_ssa (&SA);
   6873   timevar_pop (TV_OUT_OF_SSA);
   6874 
   6875   timevar_push (TV_POST_EXPAND);
   6876   /* We are no longer in SSA form.  */
   6877   fun->gimple_df->in_ssa_p = false;
   6878   loops_state_clear (LOOP_CLOSED_SSA);
   6879 
   6880   /* Expansion is used by optimization passes too, set maybe_hot_insn_p
   6881      conservatively to true until they are all profile aware.  */
   6882   delete lab_rtx_for_bb;
   6883   free_histograms (fun);
   6884 
   6885   construct_exit_block ();
   6886   insn_locations_finalize ();
   6887 
   6888   if (var_ret_seq)
   6889     {
   6890       rtx_insn *after = return_label;
   6891       rtx_insn *next = NEXT_INSN (after);
   6892       if (next && NOTE_INSN_BASIC_BLOCK_P (next))
   6893 	after = next;
   6894       emit_insn_after (var_ret_seq, after);
   6895     }
   6896 
   6897   if (hwasan_sanitize_stack_p ())
   6898     hwasan_maybe_emit_frame_base_init ();
   6899 
   6900   /* Zap the tree EH table.  */
   6901   set_eh_throw_stmt_table (fun, NULL);
   6902 
   6903   /* We need JUMP_LABEL be set in order to redirect jumps, and hence
   6904      split edges which edge insertions might do.  */
   6905   rebuild_jump_labels (get_insns ());
   6906 
   6907   /* If we have a single successor to the entry block, put the pending insns
   6908      after parm birth, but before NOTE_INSNS_FUNCTION_BEG.  */
   6909   if (single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (fun)))
   6910     {
   6911       edge e = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FN (fun));
   6912       if (e->insns.r)
   6913 	{
   6914 	  rtx_insn *insns = e->insns.r;
   6915 	  e->insns.r = NULL;
   6916 	  rebuild_jump_labels_chain (insns);
   6917 	  if (NOTE_P (parm_birth_insn)
   6918 	      && NOTE_KIND (parm_birth_insn) == NOTE_INSN_FUNCTION_BEG)
   6919 	    emit_insn_before_noloc (insns, parm_birth_insn, e->dest);
   6920 	  else
   6921 	    emit_insn_after_noloc (insns, parm_birth_insn, e->dest);
   6922 	}
   6923     }
   6924 
   6925   /* Otherwise, as well as for other edges, take the usual way.  */
   6926   commit_edge_insertions ();
   6927 
   6928   /* We're done expanding trees to RTL.  */
   6929   currently_expanding_to_rtl = 0;
   6930 
   6931   flush_mark_addressable_queue ();
   6932 
   6933   FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR_FOR_FN (fun)->next_bb,
   6934 		  EXIT_BLOCK_PTR_FOR_FN (fun), next_bb)
   6935     {
   6936       edge e;
   6937       edge_iterator ei;
   6938       for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); )
   6939 	{
   6940 	  /* Clear EDGE_EXECUTABLE.  This flag is never used in the backend.  */
   6941 	  e->flags &= ~EDGE_EXECUTABLE;
   6942 
   6943 	  /* At the moment not all abnormal edges match the RTL
   6944 	     representation.  It is safe to remove them here as
   6945 	     find_many_sub_basic_blocks will rediscover them.
   6946 	     In the future we should get this fixed properly.  */
   6947 	  if ((e->flags & EDGE_ABNORMAL)
   6948 	      && !(e->flags & EDGE_SIBCALL))
   6949 	    remove_edge (e);
   6950 	  else
   6951 	    ei_next (&ei);
   6952 	}
   6953     }
   6954 
   6955   auto_sbitmap blocks (last_basic_block_for_fn (fun));
   6956   bitmap_ones (blocks);
   6957   find_many_sub_basic_blocks (blocks);
   6958   purge_all_dead_edges ();
   6959 
   6960   /* After initial rtl generation, call back to finish generating
   6961      exception support code.  We need to do this before cleaning up
   6962      the CFG as the code does not expect dead landing pads.  */
   6963   if (fun->eh->region_tree != NULL)
   6964     finish_eh_generation ();
   6965 
   6966   /* Call expand_stack_alignment after finishing all
   6967      updates to crtl->preferred_stack_boundary.  */
   6968   expand_stack_alignment ();
   6969 
   6970   /* Fixup REG_EQUIV notes in the prologue if there are tailcalls in this
   6971      function.  */
   6972   if (crtl->tail_call_emit)
   6973     fixup_tail_calls ();
   6974 
   6975   HOST_WIDE_INT patch_area_size, patch_area_entry;
   6976   parse_and_check_patch_area (flag_patchable_function_entry, false,
   6977 			      &patch_area_size, &patch_area_entry);
   6978 
   6979   tree patchable_function_entry_attr
   6980     = lookup_attribute ("patchable_function_entry",
   6981 			DECL_ATTRIBUTES (cfun->decl));
   6982   if (patchable_function_entry_attr)
   6983     {
   6984       tree pp_val = TREE_VALUE (patchable_function_entry_attr);
   6985       tree patchable_function_entry_value1 = TREE_VALUE (pp_val);
   6986 
   6987       patch_area_size = tree_to_uhwi (patchable_function_entry_value1);
   6988       patch_area_entry = 0;
   6989       if (TREE_CHAIN (pp_val) != NULL_TREE)
   6990 	{
   6991 	  tree patchable_function_entry_value2
   6992 	    = TREE_VALUE (TREE_CHAIN (pp_val));
   6993 	  patch_area_entry = tree_to_uhwi (patchable_function_entry_value2);
   6994 	}
   6995     }
   6996 
   6997   if (patch_area_entry > patch_area_size)
   6998     {
   6999       if (patch_area_size > 0)
   7000 	warning (OPT_Wattributes,
   7001 		 "patchable function entry %wu exceeds size %wu",
   7002 		 patch_area_entry, patch_area_size);
   7003       patch_area_entry = 0;
   7004     }
   7005 
   7006   crtl->patch_area_size = patch_area_size;
   7007   crtl->patch_area_entry = patch_area_entry;
   7008 
   7009   /* BB subdivision may have created basic blocks that are only reachable
   7010      from unlikely bbs but not marked as such in the profile.  */
   7011   if (optimize)
   7012     propagate_unlikely_bbs_forward ();
   7013 
   7014   /* Remove unreachable blocks, otherwise we cannot compute dominators
   7015      which are needed for loop state verification.  As a side-effect
   7016      this also compacts blocks.
   7017      ???  We cannot remove trivially dead insns here as for example
   7018      the DRAP reg on i?86 is not magically live at this point.
   7019      gcc.c-torture/execute/ipa-sra-2.c execution, -Os -m32 fails otherwise.  */
   7020   cleanup_cfg (CLEANUP_NO_INSN_DEL);
   7021 
   7022   checking_verify_flow_info ();
   7023 
   7024   /* Initialize pseudos allocated for hard registers.  */
   7025   emit_initial_value_sets ();
   7026 
   7027   /* And finally unshare all RTL.  */
   7028   unshare_all_rtl ();
   7029 
   7030   /* There's no need to defer outputting this function any more; we
   7031      know we want to output it.  */
   7032   DECL_DEFER_OUTPUT (current_function_decl) = 0;
   7033 
   7034   /* Now that we're done expanding trees to RTL, we shouldn't have any
   7035      more CONCATs anywhere.  */
   7036   generating_concat_p = 0;
   7037 
   7038   if (dump_file)
   7039     {
   7040       fprintf (dump_file,
   7041 	       "\n\n;;\n;; Full RTL generated for this function:\n;;\n");
   7042       /* And the pass manager will dump RTL for us.  */
   7043     }
   7044 
   7045   /* If we're emitting a nested function, make sure its parent gets
   7046      emitted as well.  Doing otherwise confuses debug info.  */
   7047     {
   7048       tree parent;
   7049       for (parent = DECL_CONTEXT (current_function_decl);
   7050 	   parent != NULL_TREE;
   7051 	   parent = get_containing_scope (parent))
   7052 	if (TREE_CODE (parent) == FUNCTION_DECL)
   7053 	  TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
   7054     }
   7055 
   7056   TREE_ASM_WRITTEN (current_function_decl) = 1;
   7057 
   7058   /* After expanding, the return labels are no longer needed. */
   7059   return_label = NULL;
   7060   naked_return_label = NULL;
   7061 
   7062   /* After expanding, the tm_restart map is no longer needed.  */
   7063   if (fun->gimple_df->tm_restart)
   7064     fun->gimple_df->tm_restart = NULL;
   7065 
   7066   /* Tag the blocks with a depth number so that change_scope can find
   7067      the common parent easily.  */
   7068   set_block_levels (DECL_INITIAL (fun->decl), 0);
   7069   default_rtl_profile ();
   7070 
   7071   /* For -dx discard loops now, otherwise IL verify in clean_state will
   7072      ICE.  */
   7073   if (rtl_dump_and_exit)
   7074     {
   7075       cfun->curr_properties &= ~PROP_loops;
   7076       loop_optimizer_finalize ();
   7077     }
   7078 
   7079   timevar_pop (TV_POST_EXPAND);
   7080 
   7081   return 0;
   7082 }
   7083 
   7084 } // anon namespace
   7085 
   7086 rtl_opt_pass *
   7087 make_pass_expand (gcc::context *ctxt)
   7088 {
   7089   return new pass_expand (ctxt);
   7090 }
   7091