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