LCOV - code coverage report
Current view: top level - gcc - tree-ssa.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 86.2 % 1100 948
Test Date: 2026-02-28 14:20:25 Functions: 97.1 % 35 34
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Miscellaneous SSA utility functions.
       2              :    Copyright (C) 2001-2026 Free Software Foundation, Inc.
       3              : 
       4              : This file is part of GCC.
       5              : 
       6              : GCC is free software; you can redistribute it and/or modify
       7              : it under the terms of the GNU General Public License as published by
       8              : the Free Software Foundation; either version 3, or (at your option)
       9              : any later version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful,
      12              : but WITHOUT ANY WARRANTY; without even the implied warranty of
      13              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14              : GNU General Public License for more details.
      15              : 
      16              : You should have received a copy of the GNU General Public License
      17              : along with GCC; see the file COPYING3.  If not see
      18              : <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : #include "config.h"
      21              : #include "system.h"
      22              : #include "coretypes.h"
      23              : #include "backend.h"
      24              : #include "tree.h"
      25              : #include "gimple.h"
      26              : #include "cfghooks.h"
      27              : #include "tree-pass.h"
      28              : #include "ssa.h"
      29              : #include "gimple-pretty-print.h"
      30              : #include "diagnostic-core.h"
      31              : #include "fold-const.h"
      32              : #include "stor-layout.h"
      33              : #include "gimple-iterator.h"
      34              : #include "gimple-fold.h"
      35              : #include "gimplify.h"
      36              : #include "gimple-walk.h"
      37              : #include "tree-ssa-loop-manip.h"
      38              : #include "tree-into-ssa.h"
      39              : #include "tree-ssa.h"
      40              : #include "cfgloop.h"
      41              : #include "cfgexpand.h"
      42              : #include "tree-cfg.h"
      43              : #include "tree-dfa.h"
      44              : #include "stringpool.h"
      45              : #include "attribs.h"
      46              : #include "asan.h"
      47              : 
      48              : /* Pointer map of variable mappings, keyed by edge.  */
      49              : static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
      50              : 
      51              : 
      52              : /* Add a mapping with PHI RESULT and PHI DEF associated with edge E.  */
      53              : 
      54              : void
      55     12027882 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
      56              : {
      57     12027882 :   edge_var_map new_node;
      58              : 
      59     12027882 :   if (edge_var_maps == NULL)
      60        68248 :     edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
      61              : 
      62     12027882 :   auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
      63     12027882 :   new_node.def = def;
      64     12027882 :   new_node.result = result;
      65     12027882 :   new_node.locus = locus;
      66              : 
      67     12027882 :   slot.safe_push (new_node);
      68     12027882 : }
      69              : 
      70              : 
      71              : /* Clear the var mappings in edge E.  */
      72              : 
      73              : void
      74    140553126 : redirect_edge_var_map_clear (edge e)
      75              : {
      76    140553126 :   if (!edge_var_maps)
      77              :     return;
      78              : 
      79    124945015 :   auto_vec<edge_var_map> *head = edge_var_maps->get (e);
      80              : 
      81    124945015 :   if (head)
      82     10568457 :     head->release ();
      83              : }
      84              : 
      85              : 
      86              : /* Duplicate the redirected var mappings in OLDE in NEWE.
      87              : 
      88              :    This assumes a hash_map can have multiple edges mapping to the same
      89              :    var_map (many to one mapping), since we don't remove the previous mappings.
      90              :    */
      91              : 
      92              : void
      93       420906 : redirect_edge_var_map_dup (edge newe, edge olde)
      94              : {
      95       420906 :   if (!edge_var_maps)
      96              :     return;
      97              : 
      98       392029 :   auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
      99       392029 :   auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
     100       392029 :   if (!old_head)
     101              :     return;
     102              : 
     103         7859 :   new_head->safe_splice (*old_head);
     104              : }
     105              : 
     106              : 
     107              : /* Return the variable mappings for a given edge.  If there is none, return
     108              :    NULL.  */
     109              : 
     110              : vec<edge_var_map> *
     111      8302010 : redirect_edge_var_map_vector (edge e)
     112              : {
     113              :   /* Hey, what kind of idiot would... you'd be surprised.  */
     114      8302010 :   if (!edge_var_maps)
     115              :     return NULL;
     116              : 
     117      8275182 :   auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
     118      8275182 :   if (!slot)
     119              :     return NULL;
     120              : 
     121              :   return slot;
     122              : }
     123              : 
     124              : /* Clear the edge variable mappings.  */
     125              : 
     126              : void
     127    972775337 : redirect_edge_var_map_empty (void)
     128              : {
     129    972775337 :   if (edge_var_maps)
     130    245318884 :     edge_var_maps->empty ();
     131    972775337 : }
     132              : 
     133              : 
     134              : /* Remove the corresponding arguments from the PHI nodes in E's
     135              :    destination block and redirect it to DEST.  Return redirected edge.
     136              :    The list of removed arguments is stored in a vector accessed
     137              :    through edge_var_maps.  */
     138              : 
     139              : edge
     140     64004215 : ssa_redirect_edge (edge e, basic_block dest)
     141              : {
     142     64004215 :   gphi_iterator gsi;
     143     64004215 :   gphi *phi;
     144              : 
     145     64004215 :   redirect_edge_var_map_clear (e);
     146              : 
     147              :   /* Remove the appropriate PHI arguments in E's destination block.
     148              :      If we are redirecting a copied edge the destination has not
     149              :      got PHI argument space reserved nor an interesting argument.  */
     150     64004215 :   if (! (e->dest->flags & BB_DUPLICATED))
     151     74750496 :     for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
     152              :       {
     153     12655384 :         tree def;
     154     12655384 :         location_t locus;
     155              : 
     156     12655384 :         phi = gsi.phi ();
     157     12655384 :         def = gimple_phi_arg_def (phi, e->dest_idx);
     158     12655384 :         locus = gimple_phi_arg_location (phi, e->dest_idx);
     159              : 
     160     12655384 :         if (def == NULL_TREE)
     161      1525682 :           continue;
     162              : 
     163     11129702 :         redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
     164              :       }
     165              : 
     166     64004215 :   e = redirect_edge_succ_nodup (e, dest);
     167              : 
     168     64004215 :   return e;
     169              : }
     170              : 
     171              : 
     172              : /* Add PHI arguments queued in PENDING_STMT list on edge E to edge
     173              :    E->dest.  */
     174              : 
     175              : void
     176      3346212 : flush_pending_stmts (edge e)
     177              : {
     178      3346212 :   gphi *phi;
     179      3346212 :   edge_var_map *vm;
     180      3346212 :   int i;
     181      3346212 :   gphi_iterator gsi;
     182              : 
     183      3346212 :   vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
     184      3346212 :   if (!v)
     185       342594 :     return;
     186              : 
     187      3003618 :   for (gsi = gsi_start_phis (e->dest), i = 0;
     188      8291584 :        !gsi_end_p (gsi) && v->iterate (i, &vm);
     189      5287966 :        gsi_next (&gsi), i++)
     190              :     {
     191      5287966 :       tree def;
     192              : 
     193      5287966 :       phi = gsi.phi ();
     194      5287966 :       def = redirect_edge_var_map_def (vm);
     195      5287966 :       add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
     196              :     }
     197              : 
     198      3003618 :   redirect_edge_var_map_clear (e);
     199              : }
     200              : 
     201              : /* Replace the LHS of STMT, an assignment, either a GIMPLE_ASSIGN or a
     202              :    GIMPLE_CALL, with NLHS, in preparation for modifying the RHS to an
     203              :    expression with a different value.
     204              : 
     205              :    This will update any annotations (say debug bind stmts) referring
     206              :    to the original LHS, so that they use the RHS instead.  This is
     207              :    done even if NLHS and LHS are the same, for it is understood that
     208              :    the RHS will be modified afterwards, and NLHS will not be assigned
     209              :    an equivalent value.
     210              : 
     211              :    Adjusting any non-annotation uses of the LHS, if needed, is a
     212              :    responsibility of the caller.
     213              : 
     214              :    The effect of this call should be pretty much the same as that of
     215              :    inserting a copy of STMT before STMT, and then removing the
     216              :    original stmt, at which time gsi_remove() would have update
     217              :    annotations, but using this function saves all the inserting,
     218              :    copying and removing.  */
     219              : 
     220              : void
     221           63 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
     222              : {
     223           63 :   if (MAY_HAVE_DEBUG_BIND_STMTS)
     224              :     {
     225            0 :       tree lhs = gimple_get_lhs (stmt);
     226              : 
     227            0 :       gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
     228              : 
     229            0 :       insert_debug_temp_for_var_def (NULL, lhs);
     230              :     }
     231              : 
     232           63 :   gimple_set_lhs (stmt, nlhs);
     233           63 : }
     234              : 
     235              : 
     236              : /* Given a tree for an expression for which we might want to emit
     237              :    locations or values in debug information (generally a variable, but
     238              :    we might deal with other kinds of trees in the future), return the
     239              :    tree that should be used as the variable of a DEBUG_BIND STMT or
     240              :    VAR_LOCATION INSN or NOTE.  Return NULL if VAR is not to be tracked.  */
     241              : 
     242              : tree
     243    349487818 : target_for_debug_bind (tree var)
     244              : {
     245    349489851 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     246              :     return NULL_TREE;
     247              : 
     248    328346197 :   if (TREE_CODE (var) == SSA_NAME)
     249              :     {
     250     16120124 :       var = SSA_NAME_VAR (var);
     251              :       if (var == NULL_TREE)
     252              :         return NULL_TREE;
     253              :     }
     254              : 
     255    275762292 :   if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
     256    336261772 :       && TREE_CODE (var) != PARM_DECL)
     257              :     return NULL_TREE;
     258              : 
     259    275502256 :   if (DECL_HAS_VALUE_EXPR_P (var))
     260         2033 :     return target_for_debug_bind (DECL_VALUE_EXPR (var));
     261              : 
     262    275500223 :   if (DECL_IGNORED_P (var))
     263              :     return NULL_TREE;
     264              : 
     265              :   /* var-tracking only tracks registers.  */
     266    253610354 :   if (!is_gimple_reg_type (TREE_TYPE (var)))
     267      8912085 :     return NULL_TREE;
     268              : 
     269              :   return var;
     270              : }
     271              : 
     272              : /* Called via walk_tree, look for SSA_NAMEs that have already been
     273              :    released.  */
     274              : 
     275              : tree
     276     11007962 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
     277              : {
     278     11007962 :   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
     279              : 
     280     11007962 :   if (wi && wi->is_lhs)
     281              :     return NULL_TREE;
     282              : 
     283     10979498 :   if (TREE_CODE (*tp) == SSA_NAME)
     284              :     {
     285      1774660 :       if (SSA_NAME_IN_FREE_LIST (*tp))
     286              :         return *tp;
     287              : 
     288      1765017 :       *walk_subtrees = 0;
     289              :     }
     290      9204838 :   else if (IS_TYPE_OR_DECL_P (*tp))
     291        37039 :     *walk_subtrees = 0;
     292              : 
     293              :   return NULL_TREE;
     294              : }
     295              : 
     296              : /* Insert a DEBUG BIND stmt before the DEF of VAR if VAR is referenced
     297              :    by other DEBUG stmts, and replace uses of the DEF with the
     298              :    newly-created debug temp.  */
     299              : 
     300              : void
     301     89074108 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
     302              : {
     303     89074108 :   imm_use_iterator imm_iter;
     304     89074108 :   use_operand_p use_p;
     305     89074108 :   gimple *stmt;
     306     89074108 :   gimple *def_stmt = NULL;
     307     89074108 :   int usecount = 0;
     308     89074108 :   tree value = NULL;
     309              : 
     310     89074108 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     311     85691364 :     return;
     312              : 
     313              :   /* If this name has already been registered for replacement, do nothing
     314              :      as anything that uses this name isn't in SSA form.  */
     315     89074108 :   if (name_registered_for_update_p (var))
     316              :     return;
     317              : 
     318              :   /* Check whether there are debug stmts that reference this variable and,
     319              :      if there are, decide whether we should use a debug temp.  */
     320    187489391 :   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
     321              :     {
     322     11498733 :       stmt = USE_STMT (use_p);
     323              : 
     324     11498733 :       if (!gimple_debug_bind_p (stmt))
     325      7646953 :         continue;
     326              : 
     327      3851780 :       if (usecount++)
     328              :         break;
     329              : 
     330      3382744 :       if (gimple_debug_bind_get_value (stmt) != var)
     331              :         {
     332              :           /* Count this as an additional use, so as to make sure we
     333              :              use a temp unless VAR's definition has a SINGLE_RHS that
     334              :              can be shared.  */
     335              :           usecount++;
     336              :           break;
     337              :         }
     338     88567790 :     }
     339              : 
     340     88567790 :   if (!usecount)
     341              :     return;
     342              : 
     343      3382744 :   if (gsi)
     344      2977622 :     def_stmt = gsi_stmt (*gsi);
     345              :   else
     346       405122 :     def_stmt = SSA_NAME_DEF_STMT (var);
     347              : 
     348              :   /* If we didn't get an insertion point, and the stmt has already
     349              :      been removed, we won't be able to insert the debug bind stmt, so
     350              :      we'll have to drop debug information.  */
     351      3382744 :   if (gimple_code (def_stmt) == GIMPLE_PHI)
     352              :     {
     353       163453 :       value = degenerate_phi_result (as_a <gphi *> (def_stmt));
     354       163453 :       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
     355          132 :         value = NULL;
     356              :       /* error_mark_node is what fixup_noreturn_call changes PHI arguments
     357              :          to.  */
     358       163321 :       else if (value == error_mark_node)
     359            0 :         value = NULL;
     360              :     }
     361      3219291 :   else if (gimple_clobber_p (def_stmt))
     362              :     /* We can end up here when rewriting a decl into SSA and coming
     363              :        along a clobber for the original decl.  Turn that into
     364              :        # DEBUG decl => NULL  */
     365      1274499 :     value = NULL;
     366      1944792 :   else if (is_gimple_assign (def_stmt))
     367              :     {
     368      1882935 :       bool no_value = false;
     369              : 
     370      1882935 :       if (!dom_info_available_p (CDI_DOMINATORS))
     371              :         {
     372        37975 :           struct walk_stmt_info wi;
     373              : 
     374        37975 :           memset (&wi, 0, sizeof (wi));
     375              : 
     376              :           /* When removing blocks without following reverse dominance
     377              :              order, we may sometimes encounter SSA_NAMEs that have
     378              :              already been released, referenced in other SSA_DEFs that
     379              :              we're about to release.  Consider:
     380              : 
     381              :              <bb X>:
     382              :              v_1 = foo;
     383              : 
     384              :              <bb Y>:
     385              :              w_2 = v_1 + bar;
     386              :              # DEBUG w => w_2
     387              : 
     388              :              If we deleted BB X first, propagating the value of w_2
     389              :              won't do us any good.  It's too late to recover their
     390              :              original definition of v_1: when it was deleted, it was
     391              :              only referenced in other DEFs, it couldn't possibly know
     392              :              it should have been retained, and propagating every
     393              :              single DEF just in case it might have to be propagated
     394              :              into a DEBUG STMT would probably be too wasteful.
     395              : 
     396              :              When dominator information is not readily available, we
     397              :              check for and accept some loss of debug information.  But
     398              :              if it is available, there's no excuse for us to remove
     399              :              blocks in the wrong order, so we don't even check for
     400              :              dead SSA NAMEs.  SSA verification shall catch any
     401              :              errors.  */
     402        37942 :           if ((!gsi && !gimple_bb (def_stmt))
     403        75917 :               || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
     404         9511 :             no_value = true;
     405              :         }
     406              : 
     407        37975 :       if (!no_value)
     408      1873424 :         value = gimple_assign_rhs_to_tree (def_stmt);
     409              :     }
     410              : 
     411      3382744 :   if (value)
     412              :     {
     413              :       /* If there's a single use of VAR, and VAR is the entire debug
     414              :          expression (usecount would have been incremented again
     415              :          otherwise), then we can propagate VALUE into this single use,
     416              :          avoiding the temp.
     417              : 
     418              :          We can also avoid using a temp if VALUE can be shared and
     419              :          propagated into all uses, without generating expressions that
     420              :          wouldn't be valid gimple RHSs.
     421              : 
     422              :          Other cases that would require unsharing or non-gimple RHSs
     423              :          are deferred to a debug temp, although we could avoid temps
     424              :          at the expense of duplication of expressions.  */
     425              : 
     426      1900911 :       if (usecount == 1
     427      1043023 :           || gimple_code (def_stmt) == GIMPLE_PHI
     428      1034599 :           || CONSTANT_CLASS_P (value)
     429      2934396 :           || is_gimple_reg (value))
     430              :         ;
     431              :       else
     432              :         {
     433      1032033 :           gdebug *def_temp;
     434      1032033 :           tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
     435              : 
     436      1032033 :           def_temp = gimple_build_debug_bind (vexpr,
     437              :                                               unshare_expr (value),
     438              :                                               def_stmt);
     439              : 
     440              :           /* FIXME: Is setting the mode really necessary? */
     441      1032033 :           if (DECL_P (value))
     442         2797 :             SET_DECL_MODE (vexpr, DECL_MODE (value));
     443              :           else
     444      1029236 :             SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
     445              : 
     446      1032033 :           if (gsi)
     447       819631 :             gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
     448              :           else
     449              :             {
     450       212402 :               gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
     451       212402 :               gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
     452              :             }
     453              : 
     454      1032033 :           value = vexpr;
     455              :         }
     456              :     }
     457              : 
     458     13047120 :   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
     459              :     {
     460      6281632 :       if (!gimple_debug_bind_p (stmt))
     461       861843 :         continue;
     462              : 
     463      5419789 :       if (value)
     464              :         {
     465     11390494 :           FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
     466      3796983 :             SET_USE (use_p, unshare_expr (value));
     467              :           /* If we didn't replace uses with a debug decl fold the
     468              :              resulting expression.  Otherwise we end up with invalid IL.  */
     469      3796528 :           if (TREE_CODE (value) != DEBUG_EXPR_DECL)
     470              :             {
     471       890029 :               gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
     472       890029 :               fold_stmt_inplace (&gsi);
     473              :             }
     474              :         }
     475              :       else
     476      1623261 :         gimple_debug_bind_reset_value (stmt);
     477              : 
     478      5419789 :       update_stmt (stmt);
     479      3382744 :     }
     480              : }
     481              : 
     482              : 
     483              : /* Insert a DEBUG BIND stmt before STMT for each DEF referenced by
     484              :    other DEBUG stmts, and replace uses of the DEF with the
     485              :    newly-created debug temp.  */
     486              : 
     487              : void
     488    161815441 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
     489              : {
     490    161815441 :   gimple *stmt;
     491    161815441 :   ssa_op_iter op_iter;
     492    161815441 :   def_operand_p def_p;
     493              : 
     494    161815441 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     495     44541150 :     return;
     496              : 
     497    117274291 :   stmt = gsi_stmt (*gsi);
     498              : 
     499    269530528 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     500              :     {
     501     34981946 :       tree var = DEF_FROM_PTR (def_p);
     502              : 
     503     34981946 :       if (TREE_CODE (var) != SSA_NAME)
     504       180841 :         continue;
     505              : 
     506     34801105 :       insert_debug_temp_for_var_def (gsi, var);
     507              :     }
     508              : }
     509              : 
     510              : /* Reset all debug stmts that use SSA_NAME(s) defined in STMT.  */
     511              : 
     512              : void
     513         7167 : reset_debug_uses (gimple *stmt)
     514              : {
     515         7167 :   ssa_op_iter op_iter;
     516         7167 :   def_operand_p def_p;
     517         7167 :   imm_use_iterator imm_iter;
     518         7167 :   gimple *use_stmt;
     519              : 
     520         7167 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     521          177 :     return;
     522              : 
     523        18627 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     524              :     {
     525         4647 :       tree var = DEF_FROM_PTR (def_p);
     526              : 
     527         4647 :       if (TREE_CODE (var) != SSA_NAME)
     528            0 :         continue;
     529              : 
     530        14517 :       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
     531              :         {
     532         5223 :           if (!gimple_debug_bind_p (use_stmt))
     533         5141 :             continue;
     534              : 
     535           82 :           gimple_debug_bind_reset_value (use_stmt);
     536           82 :           update_stmt (use_stmt);
     537         4647 :         }
     538              :     }
     539              : }
     540              : 
     541              : /* Delete SSA DEFs for SSA versions in the TOREMOVE bitmap, removing
     542              :    dominated stmts before their dominators, so that release_ssa_defs
     543              :    stands a chance of propagating DEFs into debug bind stmts.  */
     544              : 
     545              : void
     546       241428 : release_defs_bitset (bitmap toremove)
     547              : {
     548       241428 :   unsigned j;
     549       241428 :   bitmap_iterator bi;
     550              : 
     551              :   /* Performing a topological sort is probably overkill, this will
     552              :      most likely run in slightly superlinear time, rather than the
     553              :      pathological quadratic worst case.
     554              :      But iterate from max SSA name version to min one because
     555              :      that mimics allocation order during code generation behavior best.
     556              :      Use an array for this which we compact on-the-fly with a NULL
     557              :      marker moving towards the end of the vector.  */
     558       241428 :   auto_vec<tree, 16> names;
     559       241428 :   names.reserve (bitmap_count_bits (toremove) + 1);
     560       241428 :   names.quick_push (NULL_TREE);
     561      2702752 :   EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
     562      2461324 :     names.quick_push (ssa_name (j));
     563              : 
     564       241428 :   bitmap_tree_view (toremove);
     565       746112 :   while (!bitmap_empty_p (toremove))
     566              :     {
     567       263256 :       j = names.length () - 1;
     568      3513090 :       for (unsigned i = names.length () - 1; names[i];)
     569              :         {
     570      3249834 :           bool remove_now = true;
     571      3249834 :           tree var = names[i];
     572      3249834 :           gimple *stmt;
     573      3249834 :           imm_use_iterator uit;
     574              : 
     575      7179483 :           FOR_EACH_IMM_USE_STMT (stmt, uit, var)
     576              :             {
     577      1468325 :               ssa_op_iter dit;
     578      1468325 :               def_operand_p def_p;
     579              : 
     580              :               /* We can't propagate PHI nodes into debug stmts.  */
     581      1468325 :               if (gimple_code (stmt) == GIMPLE_PHI
     582      1468325 :                   || is_gimple_debug (stmt))
     583       679815 :                 continue;
     584              : 
     585              :               /* If we find another definition to remove that uses
     586              :                  the one we're looking at, defer the removal of this
     587              :                  one, so that it can be propagated into debug stmts
     588              :                  after the other is.  */
     589       788510 :               FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
     590              :                 {
     591       788510 :                   tree odef = DEF_FROM_PTR (def_p);
     592              : 
     593       788510 :                   if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
     594              :                     {
     595              :                       remove_now = false;
     596              :                       break;
     597              :                     }
     598              :                 }
     599              : 
     600       788510 :               if (!remove_now)
     601              :                 break;
     602      3249834 :             }
     603              : 
     604      3249834 :           if (remove_now)
     605              :             {
     606      2461324 :               gimple *def = SSA_NAME_DEF_STMT (var);
     607      2461324 :               gimple_stmt_iterator gsi = gsi_for_stmt (def);
     608              : 
     609      2461324 :               if (gimple_code (def) == GIMPLE_PHI)
     610       627224 :                 remove_phi_node (&gsi, true);
     611              :               else
     612              :                 {
     613      1834100 :                   gsi_remove (&gsi, true);
     614      1834100 :                   release_defs (def);
     615              :                 }
     616      2461324 :               bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
     617              :             }
     618              :           else
     619       788510 :             --i;
     620      3249834 :           if (--j != i)
     621      3063669 :             names[i] = names[j];
     622              :         }
     623              :     }
     624       241428 :   bitmap_list_view (toremove);
     625       241428 : }
     626              : 
     627              : /* Disable warnings about missing quoting in GCC diagnostics for
     628              :    the verification errors.  Their format strings don't follow GCC
     629              :    diagnostic conventions and the calls are ultimately followed by
     630              :    one to internal_error.  */
     631              : #if __GNUC__ >= 10
     632              : #  pragma GCC diagnostic push
     633              : #  pragma GCC diagnostic ignored "-Wformat-diag"
     634              : #endif
     635              : 
     636              : /* Verify virtual SSA form.  */
     637              : 
     638              : bool
     639   2939714065 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
     640              : {
     641   2939714065 :   bool err = false;
     642              : 
     643   2939714065 :   if (!bitmap_set_bit (visited, bb->index))
     644              :     return false;
     645              : 
     646              :   /* Pick up the single virtual PHI def.  */
     647   2241408615 :   gphi *phi = NULL;
     648   2895399522 :   for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
     649    653990907 :        gsi_next (&si))
     650              :     {
     651    653990907 :       tree res = gimple_phi_result (si.phi ());
     652   1613624967 :       if (virtual_operand_p (res))
     653              :         {
     654    305643153 :           if (phi)
     655              :             {
     656            0 :               error ("multiple virtual PHI nodes in BB %d", bb->index);
     657            0 :               print_gimple_stmt (stderr, phi, 0);
     658            0 :               print_gimple_stmt (stderr, si.phi (), 0);
     659            0 :               err = true;
     660              :             }
     661              :           else
     662              :             phi = si.phi ();
     663              :         }
     664              :     }
     665   2241408615 :   if (phi)
     666              :     {
     667    305643153 :       current_vdef = gimple_phi_result (phi);
     668    305643153 :       if (TREE_CODE (current_vdef) != SSA_NAME)
     669              :         {
     670            0 :           error ("virtual definition is not an SSA name");
     671            0 :           print_gimple_stmt (stderr, phi, 0);
     672            0 :           err = true;
     673              :         }
     674              :     }
     675              : 
     676              :   /* Verify stmts.  */
     677  16582058869 :   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
     678  12099241639 :        gsi_next (&gsi))
     679              :     {
     680  12099241639 :       gimple *stmt = gsi_stmt (gsi);
     681  17272068466 :       tree vuse = gimple_vuse (stmt);
     682   5112581670 :       if (vuse)
     683              :         {
     684   3416140952 :           if (vuse != current_vdef)
     685              :             {
     686            0 :               error ("stmt with wrong VUSE");
     687            0 :               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
     688            0 :               fprintf (stderr, "expected ");
     689            0 :               print_generic_expr (stderr, current_vdef);
     690            0 :               fprintf (stderr, "\n");
     691            0 :               err = true;
     692              :             }
     693  15515382591 :           tree vdef = gimple_vdef (stmt);
     694   3416140952 :           if (vdef)
     695              :             {
     696   2125598689 :               current_vdef = vdef;
     697   2125598689 :               if (TREE_CODE (current_vdef) != SSA_NAME)
     698              :                 {
     699            0 :                   error ("virtual definition is not an SSA name");
     700            0 :                   print_gimple_stmt (stderr, phi, 0);
     701            0 :                   err = true;
     702              :                 }
     703              :             }
     704              :         }
     705              :     }
     706              : 
     707              :   /* Verify destination PHI uses and recurse.  */
     708   2241408615 :   edge_iterator ei;
     709   2241408615 :   edge e;
     710   4960493300 :   FOR_EACH_EDGE (e, ei, bb->succs)
     711              :     {
     712   2719084685 :       gphi *phi = get_virtual_phi (e->dest);
     713   2719084685 :       if (phi
     714   2719084685 :           && PHI_ARG_DEF_FROM_EDGE (phi, e) != current_vdef)
     715              :         {
     716            0 :           error ("PHI node with wrong VUSE on edge from BB %d",
     717            0 :                  e->src->index);
     718            0 :           print_gimple_stmt (stderr, phi, 0, TDF_VOPS);
     719            0 :           fprintf (stderr, "expected ");
     720            0 :           print_generic_expr (stderr, current_vdef);
     721            0 :           fprintf (stderr, "\n");
     722            0 :           err = true;
     723              :         }
     724              : 
     725              :       /* Recurse.  */
     726   2719084685 :       err |= verify_vssa (e->dest, current_vdef, visited);
     727              :     }
     728              : 
     729              :   return err;
     730              : }
     731              : 
     732              : /* Return true if SSA_NAME is malformed and mark it visited.
     733              : 
     734              :    IS_VIRTUAL is true if this SSA_NAME was found inside a virtual
     735              :       operand.  */
     736              : 
     737              : static bool
     738  13499208260 : verify_ssa_name (tree ssa_name, bool is_virtual)
     739              : {
     740  13499208260 :   if (TREE_CODE (ssa_name) != SSA_NAME)
     741              :     {
     742            0 :       error ("expected an SSA_NAME object");
     743            0 :       return true;
     744              :     }
     745              : 
     746  13499208260 :   if (SSA_NAME_IN_FREE_LIST (ssa_name))
     747              :     {
     748            0 :       error ("found an SSA_NAME that had been released into the free pool");
     749            0 :       return true;
     750              :     }
     751              : 
     752  13499208260 :   if (SSA_NAME_VAR (ssa_name) != NULL_TREE
     753   8055563034 :       && TREE_TYPE (ssa_name) != TREE_TYPE (SSA_NAME_VAR (ssa_name)))
     754              :     {
     755            0 :       error ("type mismatch between an SSA_NAME and its symbol");
     756            0 :       return true;
     757              :     }
     758              : 
     759  13499208260 :   if (is_virtual && !virtual_operand_p (ssa_name))
     760              :     {
     761            0 :       error ("found a virtual definition for a GIMPLE register");
     762            0 :       return true;
     763              :     }
     764              : 
     765  13499208260 :   if (is_virtual && SSA_NAME_VAR (ssa_name) != gimple_vop (cfun))
     766              :     {
     767            0 :       error ("virtual SSA name for non-VOP decl");
     768            0 :       return true;
     769              :     }
     770              : 
     771  13499208260 :   if (!is_virtual && virtual_operand_p (ssa_name))
     772              :     {
     773            0 :       error ("found a real definition for a non-register");
     774            0 :       return true;
     775              :     }
     776              : 
     777  13499208260 :   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
     778  13499208260 :       && !gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name)))
     779              :     {
     780            0 :       error ("found a default name with a non-empty defining statement");
     781            0 :       return true;
     782              :     }
     783              : 
     784              :   return false;
     785              : }
     786              : 
     787              : 
     788              : /* Return true if the definition of SSA_NAME at block BB is malformed.
     789              : 
     790              :    STMT is the statement where SSA_NAME is created.
     791              : 
     792              :    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
     793              :       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
     794              :       it means that the block in that array slot contains the
     795              :       definition of SSA_NAME.
     796              : 
     797              :    IS_VIRTUAL is true if SSA_NAME is created by a VDEF.  */
     798              : 
     799              : static bool
     800   5731990811 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
     801              :             gimple *stmt, bool is_virtual)
     802              : {
     803   5731990811 :   if (verify_ssa_name (ssa_name, is_virtual))
     804            0 :     goto err;
     805              : 
     806   5731990811 :   if (SSA_NAME_VAR (ssa_name)
     807   3137610845 :       && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
     808            0 :       && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
     809              :     {
     810            0 :       error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
     811            0 :       goto err;
     812              :     }
     813              : 
     814   5731990811 :   if (definition_block[SSA_NAME_VERSION (ssa_name)])
     815              :     {
     816            0 :       error ("SSA_NAME created in two different blocks %i and %i",
     817            0 :              definition_block[SSA_NAME_VERSION (ssa_name)]->index, bb->index);
     818            0 :       goto err;
     819              :     }
     820              : 
     821   5731990811 :   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
     822              : 
     823   5731990811 :   if (SSA_NAME_DEF_STMT (ssa_name) != stmt)
     824              :     {
     825            0 :       error ("SSA_NAME_DEF_STMT is wrong");
     826            0 :       fprintf (stderr, "Expected definition statement:\n");
     827            0 :       print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (ssa_name), 4, TDF_VOPS);
     828            0 :       fprintf (stderr, "\nActual definition statement:\n");
     829            0 :       print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
     830            0 :       goto err;
     831              :     }
     832              : 
     833              :   return false;
     834              : 
     835            0 : err:
     836            0 :   fprintf (stderr, "while verifying SSA_NAME ");
     837            0 :   print_generic_expr (stderr, ssa_name);
     838            0 :   fprintf (stderr, " in statement\n");
     839            0 :   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
     840              : 
     841            0 :   return true;
     842              : }
     843              : 
     844              : 
     845              : /* Return true if the use of SSA_NAME at statement STMT in block BB is
     846              :    malformed.
     847              : 
     848              :    DEF_BB is the block where SSA_NAME was found to be created.
     849              : 
     850              :    IDOM contains immediate dominator information for the flowgraph.
     851              : 
     852              :    CHECK_ABNORMAL is true if the caller wants to check whether this use
     853              :       is flowing through an abnormal edge (only used when checking PHI
     854              :       arguments).
     855              : 
     856              :    If NAMES_DEFINED_IN_BB is not NULL, it contains a bitmap of ssa names
     857              :      that are defined before STMT in basic block BB.  */
     858              : 
     859              : static bool
     860  10981093127 : verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p,
     861              :             gimple *stmt, bool check_abnormal, bitmap names_defined_in_bb)
     862              : {
     863  10981093127 :   bool err = false;
     864  10981093127 :   tree ssa_name = USE_FROM_PTR (use_p);
     865              : 
     866  10981093127 :   if (!TREE_VISITED (ssa_name))
     867   6111791841 :     if (verify_imm_links (stderr, ssa_name))
     868  10981093127 :       err = true;
     869              : 
     870  10981093127 :   TREE_VISITED (ssa_name) = 1;
     871              : 
     872  10981093127 :   if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
     873  10981093127 :       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
     874              :     ; /* Default definitions have empty statements.  Nothing to do.  */
     875   9430841529 :   else if (!def_bb)
     876              :     {
     877            0 :       error ("missing definition");
     878            0 :       err = true;
     879              :     }
     880   9430841529 :   else if (bb != def_bb
     881   9430841529 :            && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
     882              :     {
     883            0 :       error ("definition in block %i does not dominate use in block %i",
     884              :              def_bb->index, bb->index);
     885            0 :       err = true;
     886              :     }
     887   9430841529 :   else if (bb == def_bb
     888   9430841529 :            && names_defined_in_bb != NULL
     889  15054730897 :            && !bitmap_bit_p (names_defined_in_bb, SSA_NAME_VERSION (ssa_name)))
     890              :     {
     891            0 :       error ("definition in block %i follows the use", def_bb->index);
     892            0 :       err = true;
     893              :     }
     894              : 
     895  10981093127 :   if (check_abnormal
     896  10988807892 :       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (ssa_name))
     897              :     {
     898            0 :       error ("SSA_NAME_OCCURS_IN_ABNORMAL_PHI should be set");
     899            0 :       err = true;
     900              :     }
     901              : 
     902              :   /* Make sure the use is in an appropriate list by checking the previous
     903              :      element to make sure it's the same.  */
     904  10981093127 :   if (use_p->prev == NULL)
     905              :     {
     906            0 :       error ("no immediate_use list");
     907            0 :       err = true;
     908              :     }
     909              :   else
     910              :     {
     911  10981093127 :       tree listvar;
     912  10981093127 :       if (use_p->prev->use == NULL)
     913   6111791841 :         listvar = use_p->prev->loc.ssa_name;
     914              :       else
     915   4869301286 :         listvar = USE_FROM_PTR (use_p->prev);
     916  10981093127 :       if (listvar != ssa_name)
     917              :         {
     918            0 :           error ("wrong immediate use list");
     919            0 :           err = true;
     920              :         }
     921              :     }
     922              : 
     923  10981093127 :   if (err)
     924              :     {
     925            0 :       fprintf (stderr, "for SSA_NAME: ");
     926            0 :       print_generic_expr (stderr, ssa_name, TDF_VOPS);
     927            0 :       fprintf (stderr, " in statement:\n");
     928            0 :       print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
     929              :     }
     930              : 
     931  10981093127 :   return err;
     932              : }
     933              : 
     934              : 
     935              : /* Return true if any of the arguments for PHI node PHI at block BB is
     936              :    malformed.
     937              : 
     938              :    DEFINITION_BLOCK is an array of basic blocks indexed by SSA_NAME
     939              :       version numbers.  If DEFINITION_BLOCK[SSA_NAME_VERSION] is set,
     940              :       it means that the block in that array slot contains the
     941              :       definition of SSA_NAME.  */
     942              : 
     943              : static bool
     944    654002012 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
     945              : {
     946    654002012 :   edge e;
     947    654002012 :   bool err = false;
     948    654002012 :   size_t i, phi_num_args = gimple_phi_num_args (phi);
     949              : 
     950   1308004024 :   if (EDGE_COUNT (bb->preds) != phi_num_args)
     951              :     {
     952            0 :       error ("incoming edge count does not match number of PHI arguments");
     953            0 :       err = true;
     954            0 :       goto error;
     955              :     }
     956              : 
     957   2313394214 :   for (i = 0; i < phi_num_args; i++)
     958              :     {
     959   1659392202 :       use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
     960   1659392202 :       tree op = USE_FROM_PTR (op_p);
     961              : 
     962   1659392202 :       e = EDGE_PRED (bb, i);
     963              : 
     964   1659392202 :       if (op == NULL_TREE)
     965              :         {
     966            0 :           error ("PHI argument is missing for edge %d->%d",
     967            0 :                  e->src->index,
     968            0 :                  e->dest->index);
     969            0 :           err = true;
     970            0 :           goto error;
     971              :         }
     972              : 
     973   1659392202 :       if (TREE_CODE (op) != SSA_NAME && !is_gimple_min_invariant (op))
     974              :         {
     975            0 :           error ("PHI argument is not SSA_NAME, or invariant");
     976            0 :           err = true;
     977              :         }
     978              : 
     979   1659392202 :       if ((e->flags & EDGE_ABNORMAL) && TREE_CODE (op) != SSA_NAME)
     980              :         {
     981            0 :           error ("PHI argument on abnormal edge is not SSA_NAME");
     982            0 :           err = true;
     983              :         }
     984              : 
     985   1659392202 :       if (TREE_CODE (op) == SSA_NAME)
     986              :         {
     987   2864393554 :           err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
     988   1432196777 :           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
     989   1432196777 :                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
     990              :         }
     991              : 
     992   1659392202 :       if (TREE_CODE (op) == ADDR_EXPR)
     993              :         {
     994     11986144 :           tree base = TREE_OPERAND (op, 0);
     995     16050955 :           while (handled_component_p (base))
     996      4064811 :             base = TREE_OPERAND (base, 0);
     997     11986144 :           if ((VAR_P (base)
     998              :                || TREE_CODE (base) == PARM_DECL
     999              :                || TREE_CODE (base) == RESULT_DECL)
    1000      5483834 :               && !TREE_ADDRESSABLE (base))
    1001              :             {
    1002            0 :               error ("address taken, but ADDRESSABLE bit not set");
    1003            0 :               err = true;
    1004              :             }
    1005              :         }
    1006              : 
    1007   1659392202 :       if (e->dest != bb)
    1008              :         {
    1009            0 :           error ("wrong edge %d->%d for PHI argument",
    1010            0 :                  e->src->index, e->dest->index);
    1011            0 :           err = true;
    1012              :         }
    1013              : 
    1014   1659392202 :       if (err)
    1015              :         {
    1016            0 :           fprintf (stderr, "PHI argument\n");
    1017            0 :           print_generic_stmt (stderr, op, TDF_VOPS);
    1018            0 :           goto error;
    1019              :         }
    1020              :     }
    1021              : 
    1022    654002012 : error:
    1023    654002012 :   if (err)
    1024              :     {
    1025            0 :       fprintf (stderr, "for PHI node\n");
    1026            0 :       print_gimple_stmt (stderr, phi, 0, TDF_VOPS|TDF_MEMSYMS);
    1027              :     }
    1028              : 
    1029              : 
    1030    654002012 :   return err;
    1031              : }
    1032              : 
    1033              : 
    1034              : /* Verify common invariants in the SSA web.
    1035              :    TODO: verify the variable annotations.  */
    1036              : 
    1037              : DEBUG_FUNCTION void
    1038    220735797 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
    1039              : {
    1040    220735797 :   basic_block bb;
    1041    441471594 :   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
    1042    220735797 :   ssa_op_iter iter;
    1043    220735797 :   tree op;
    1044    220735797 :   enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
    1045    220735797 :   auto_bitmap names_defined_in_bb;
    1046              : 
    1047    220735797 :   gcc_assert (!need_ssa_update_p (cfun));
    1048              : 
    1049    220735797 :   timevar_push (TV_TREE_SSA_VERIFY);
    1050              : 
    1051    220735797 :     {
    1052              :       /* Keep track of SSA names present in the IL.  */
    1053    220735797 :       size_t i;
    1054    220735797 :       tree name;
    1055    220735797 :       hash_map <void *, tree> ssa_info;
    1056              : 
    1057   8399727901 :       FOR_EACH_SSA_NAME (i, name, cfun)
    1058              :         {
    1059   6335020672 :           gimple *stmt;
    1060   6335020672 :           TREE_VISITED (name) = 0;
    1061              : 
    1062  12670041344 :           verify_ssa_name (name, virtual_operand_p (name));
    1063              : 
    1064   6335020672 :           stmt = SSA_NAME_DEF_STMT (name);
    1065   6335020672 :           if (!gimple_nop_p (stmt))
    1066              :             {
    1067   5731990811 :               basic_block bb = gimple_bb (stmt);
    1068   5731990811 :               if (verify_def (bb, definition_block,
    1069   5731990811 :                               name, stmt, virtual_operand_p (name)))
    1070            0 :                 goto err;
    1071              :             }
    1072              : 
    1073   6335020672 :           void *info = NULL;
    1074   6335020672 :           if (POINTER_TYPE_P (TREE_TYPE (name)))
    1075   1133689930 :             info = SSA_NAME_PTR_INFO (name);
    1076   5201330742 :           else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
    1077   2193654995 :             info = SSA_NAME_RANGE_INFO (name);
    1078   6335020672 :           if (info)
    1079              :             {
    1080   1332509139 :               bool existed;
    1081   1332509139 :               tree &val = ssa_info.get_or_insert (info, &existed);
    1082   1332509139 :               if (existed)
    1083              :                 {
    1084            0 :                   error ("shared SSA name info");
    1085            0 :                   print_generic_expr (stderr, val);
    1086            0 :                   fprintf (stderr, " and ");
    1087            0 :                   print_generic_expr (stderr, name);
    1088            0 :                   fprintf (stderr, "\n");
    1089            0 :                   goto err;
    1090              :                 }
    1091              :               else
    1092   1332509139 :                 val = name;
    1093              :             }
    1094              :         }
    1095            0 :     }
    1096              : 
    1097    220735797 :   calculate_dominance_info (CDI_DOMINATORS);
    1098              : 
    1099              :   /* Now verify all the uses and make sure they agree with the definitions
    1100              :      found in the previous pass.  */
    1101   2025262426 :   FOR_EACH_BB_FN (bb, cfun)
    1102              :     {
    1103   1804526629 :       edge e;
    1104   1804526629 :       edge_iterator ei;
    1105              : 
    1106              :       /* Make sure that all edges have a clear 'aux' field.  */
    1107   4307214474 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1108              :         {
    1109   2502687845 :           if (e->aux)
    1110              :             {
    1111            0 :               error ("AUX pointer initialized for edge %d->%d", e->src->index,
    1112            0 :                       e->dest->index);
    1113            0 :               goto err;
    1114              :             }
    1115              :         }
    1116              : 
    1117              :       /* Verify the arguments for every PHI node in the block.  */
    1118   2458528641 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
    1119              :         {
    1120    654002012 :           gphi *phi = gsi.phi ();
    1121    654002012 :           if (verify_phi_args (phi, bb, definition_block))
    1122            0 :             goto err;
    1123              : 
    1124    654002012 :           bitmap_set_bit (names_defined_in_bb,
    1125    654002012 :                           SSA_NAME_VERSION (gimple_phi_result (phi)));
    1126              :         }
    1127              : 
    1128              :       /* Now verify all the uses and vuses in every statement of the block.  */
    1129  15708449135 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1130  12099395877 :            gsi_next (&gsi))
    1131              :         {
    1132  12099395877 :           gimple *stmt = gsi_stmt (gsi);
    1133  12099395877 :           use_operand_p use_p;
    1134              : 
    1135  24130657521 :           if (check_modified_stmt && gimple_modified_p (stmt))
    1136              :             {
    1137            0 :               error ("stmt (%p) marked modified after optimization pass: ",
    1138              :                      (void *)stmt);
    1139            0 :               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
    1140            0 :               goto err;
    1141              :             }
    1142              : 
    1143  12099395877 :           if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
    1144              :             {
    1145            0 :               print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
    1146            0 :               goto err;
    1147              :             }
    1148              : 
    1149  12099395877 :           if (gimple_debug_bind_p (stmt)
    1150   6115162455 :               && !gimple_debug_bind_has_value_p (stmt))
    1151   2029443369 :             continue;
    1152              : 
    1153  19618848858 :           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
    1154              :             {
    1155   9548896350 :               op = USE_FROM_PTR (use_p);
    1156   9548896350 :               if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)],
    1157              :                               use_p, stmt, false, names_defined_in_bb))
    1158            0 :                 goto err;
    1159              :             }
    1160              : 
    1161  15136124624 :           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
    1162              :             {
    1163   5066172116 :               if (SSA_NAME_DEF_STMT (op) != stmt)
    1164              :                 {
    1165            0 :                   error ("SSA_NAME_DEF_STMT is wrong");
    1166            0 :                   fprintf (stderr, "Expected definition statement:\n");
    1167            0 :                   print_gimple_stmt (stderr, stmt, 4, TDF_VOPS);
    1168            0 :                   fprintf (stderr, "\nActual definition statement:\n");
    1169            0 :                   print_gimple_stmt (stderr, SSA_NAME_DEF_STMT (op),
    1170              :                                      4, TDF_VOPS);
    1171            0 :                   goto err;
    1172              :                 }
    1173   5066172116 :               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
    1174              :             }
    1175              :         }
    1176              : 
    1177   1804526629 :       bitmap_clear (names_defined_in_bb);
    1178              :     }
    1179              : 
    1180    220735797 :   free (definition_block);
    1181              : 
    1182    220735797 :   if (gimple_vop (cfun)
    1183    220735797 :       && ssa_default_def (cfun, gimple_vop (cfun)))
    1184              :     {
    1185    220629380 :       auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
    1186    220629380 :       bitmap_clear (visited);
    1187    220629380 :       if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
    1188              :                        ssa_default_def (cfun, gimple_vop (cfun)), visited))
    1189            0 :         goto err;
    1190    220629380 :     }
    1191              : 
    1192              :   /* Restore the dominance information to its prior known state, so
    1193              :      that we do not perturb the compiler's subsequent behavior.  */
    1194    220735797 :   if (orig_dom_state == DOM_NONE)
    1195     71734106 :     free_dominance_info (CDI_DOMINATORS);
    1196              :   else
    1197    149001691 :     set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
    1198              : 
    1199    220735797 :   timevar_pop (TV_TREE_SSA_VERIFY);
    1200    220735797 :   return;
    1201              : 
    1202            0 : err:
    1203            0 :   internal_error ("verify_ssa failed");
    1204    220735797 : }
    1205              : 
    1206              : #if __GNUC__ >= 10
    1207              : #  pragma GCC diagnostic pop
    1208              : #endif
    1209              : 
    1210              : /* Initialize global DFA and SSA structures.
    1211              :    If SIZE is non-zero allocated ssa names array of a given size.  */
    1212              : 
    1213              : void
    1214      3257665 : init_tree_ssa (struct function *fn, int size)
    1215              : {
    1216      3257665 :   fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
    1217      3257665 :   fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
    1218      3257665 :   pt_solution_reset (&fn->gimple_df->escaped);
    1219      3257665 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1220      3257665 :   init_ssanames (fn, size);
    1221      3257665 : }
    1222              : 
    1223              : /* Deallocate memory associated with SSA data structures for FNDECL.  */
    1224              : 
    1225              : void
    1226      3152021 : delete_tree_ssa (struct function *fn)
    1227              : {
    1228      3152021 :   fini_ssanames (fn);
    1229              : 
    1230              :   /* We no longer maintain the SSA operand cache at this point.  */
    1231      3152021 :   if (ssa_operands_active (fn))
    1232      3128378 :     fini_ssa_operands (fn);
    1233              : 
    1234      3152021 :   fn->gimple_df->default_defs->empty ();
    1235      3152021 :   fn->gimple_df->default_defs = NULL;
    1236      3152021 :   pt_solution_reset (&fn->gimple_df->escaped);
    1237      3152021 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1238      3152021 :   if (fn->gimple_df->decls_to_pointers != NULL)
    1239        39736 :     delete fn->gimple_df->decls_to_pointers;
    1240      3152021 :   fn->gimple_df->decls_to_pointers = NULL;
    1241      3152021 :   fn->gimple_df = NULL;
    1242              : 
    1243              :   /* We no longer need the edge variable maps.  */
    1244      3152021 :   redirect_edge_var_map_empty ();
    1245      3152021 : }
    1246              : 
    1247              : /* Return true if EXPR is a useless type conversion, otherwise return
    1248              :    false.  */
    1249              : 
    1250              : bool
    1251    950475439 : tree_ssa_useless_type_conversion (tree expr)
    1252              : {
    1253    950475439 :   tree outer_type, inner_type;
    1254              : 
    1255              :   /* If we have an assignment that merely uses a NOP_EXPR to change
    1256              :      the top of the RHS to the type of the LHS and the type conversion
    1257              :      is "safe", then strip away the type conversion so that we can
    1258              :      enter LHS = RHS into the const_and_copies table.  */
    1259    950475439 :   if (!CONVERT_EXPR_P (expr)
    1260    878460279 :       && TREE_CODE (expr) != VIEW_CONVERT_EXPR
    1261    877430609 :       && TREE_CODE (expr) != NON_LVALUE_EXPR)
    1262              :     return false;
    1263              : 
    1264     73597264 :   outer_type = TREE_TYPE (expr);
    1265     73597264 :   inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
    1266              : 
    1267     73597264 :   if (inner_type == error_mark_node)
    1268              :     return false;
    1269              : 
    1270     73597221 :   return useless_type_conversion_p (outer_type, inner_type);
    1271              : }
    1272              : 
    1273              : /* Strip conversions from EXP according to
    1274              :    tree_ssa_useless_type_conversion and return the resulting
    1275              :    expression.  */
    1276              : 
    1277              : tree
    1278    916334899 : tree_ssa_strip_useless_type_conversions (tree exp)
    1279              : {
    1280    937650070 :   while (tree_ssa_useless_type_conversion (exp))
    1281     21315171 :     exp = TREE_OPERAND (exp, 0);
    1282    916334899 :   return exp;
    1283              : }
    1284              : 
    1285              : /* Return true if T, as SSA_NAME, has an implicit default defined value.  */
    1286              : 
    1287              : bool
    1288    367019742 : ssa_defined_default_def_p (tree t)
    1289              : {
    1290    367019742 :   tree var = SSA_NAME_VAR (t);
    1291              : 
    1292    146166037 :   if (!var)
    1293              :     ;
    1294              :   /* Parameters get their initial value from the function entry.  */
    1295    146166037 :   else if (TREE_CODE (var) == PARM_DECL)
    1296              :     return true;
    1297              :   /* When returning by reference the return address is actually a hidden
    1298              :      parameter.  */
    1299    113536373 :   else if (TREE_CODE (var) == RESULT_DECL && DECL_BY_REFERENCE (var))
    1300              :     return true;
    1301              :   /* Hard register variables get their initial value from the ether.  */
    1302    113333382 :   else if (VAR_P (var) && DECL_HARD_REGISTER (var))
    1303            0 :     return true;
    1304              : 
    1305              :   return false;
    1306              : }
    1307              : 
    1308              : 
    1309              : /* Return true if T, an SSA_NAME, has an undefined value.  PARTIAL is what
    1310              :    should be returned if the value is only partially undefined.  */
    1311              : 
    1312              : bool
    1313    364710887 : ssa_undefined_value_p (tree t, bool partial)
    1314              : {
    1315    364710887 :   gimple *def_stmt;
    1316              : 
    1317    729421774 :   gcc_checking_assert (!virtual_operand_p (t));
    1318              : 
    1319    364710887 :   if (ssa_defined_default_def_p (t))
    1320              :     return false;
    1321              : 
    1322              :   /* The value is undefined iff its definition statement is empty.  */
    1323    333927257 :   def_stmt = SSA_NAME_DEF_STMT (t);
    1324    333927257 :   if (gimple_nop_p (def_stmt))
    1325              :     return true;
    1326              : 
    1327              :   /* The value is undefined if the definition statement is a call
    1328              :      to .DEFERRED_INIT function.  */
    1329    327611129 :   if (gimple_call_internal_p (def_stmt, IFN_DEFERRED_INIT))
    1330              :     return true;
    1331              : 
    1332              :   /* The value is partially undefined if the definition statement is
    1333              :      a REALPART_EXPR or IMAGPART_EXPR and its operand is defined by
    1334              :      the call to .DEFERRED_INIT function.  This is for handling the
    1335              :      following case:
    1336              : 
    1337              :   1 typedef _Complex float C;
    1338              :   2 C foo (int cond)
    1339              :   3 {
    1340              :   4   C f;
    1341              :   5   __imag__ f = 0;
    1342              :   6   if (cond)
    1343              :   7     {
    1344              :   8       __real__ f = 1;
    1345              :   9       return f;
    1346              :  10     }
    1347              :  11   return f;
    1348              :  12 }
    1349              : 
    1350              :     with -ftrivial-auto-var-init, compiler will insert the following
    1351              :     artificial initialization:
    1352              :   f = .DEFERRED_INIT (f, 2);
    1353              :   _1 = REALPART_EXPR <f>;
    1354              : 
    1355              :     we should treat the definition _1 = REALPART_EXPR <f> as undefined.  */
    1356     51807097 :   if (partial && is_gimple_assign (def_stmt)
    1357    367158860 :       && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
    1358     39296103 :           || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
    1359              :     {
    1360       603728 :       tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
    1361       603728 :       if (TREE_CODE (real_imag_part) == SSA_NAME
    1362       603728 :          && gimple_call_internal_p (SSA_NAME_DEF_STMT (real_imag_part),
    1363              :                                     IFN_DEFERRED_INIT))
    1364              :         return true;
    1365              :     }
    1366              : 
    1367              :   /* Check if the complex was not only partially defined.  */
    1368     51806952 :   if (partial && is_gimple_assign (def_stmt)
    1369    367158570 :       && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
    1370              :     {
    1371        17477 :       tree rhs1, rhs2;
    1372              : 
    1373        17477 :       rhs1 = gimple_assign_rhs1 (def_stmt);
    1374        17477 :       rhs2 = gimple_assign_rhs2 (def_stmt);
    1375        17141 :       return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
    1376        34577 :              || (TREE_CODE (rhs2) == SSA_NAME && ssa_undefined_value_p (rhs2));
    1377              :     }
    1378              :   return false;
    1379              : }
    1380              : 
    1381              : 
    1382              : /* Return TRUE iff there are any non-PHI uses of VAR that dominate the
    1383              :    end of BB.  If we return TRUE and BB is a loop header, then VAR we
    1384              :    be assumed to be defined within the loop, even if it is marked as
    1385              :    maybe-undefined.  */
    1386              : 
    1387              : bool
    1388       319990 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
    1389              : {
    1390       319990 :   imm_use_iterator iter;
    1391       319990 :   use_operand_p use_p;
    1392      1296540 :   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
    1393              :     {
    1394       679283 :       if (is_a <gphi *> (USE_STMT (use_p))
    1395       679283 :           || is_gimple_debug (USE_STMT (use_p)))
    1396       615540 :         continue;
    1397        63743 :       basic_block dombb = gimple_bb (USE_STMT (use_p));
    1398        63743 :       if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
    1399        22723 :         return true;
    1400        22723 :     }
    1401              : 
    1402       297267 :   return false;
    1403              : }
    1404              : 
    1405              : /* Mark as maybe_undef any SSA_NAMEs that are unsuitable as ivopts
    1406              :    candidates for potentially involving undefined behavior.  */
    1407              : 
    1408              : void
    1409     11823840 : mark_ssa_maybe_undefs (void)
    1410              : {
    1411     11823840 :   auto_vec<tree> queue;
    1412              : 
    1413              :   /* Scan all SSA_NAMEs, marking the definitely-undefined ones as
    1414              :      maybe-undefined and queuing them for propagation, while clearing
    1415              :      the mark on others.  */
    1416     11823840 :   unsigned int i;
    1417     11823840 :   tree var;
    1418    558216527 :   FOR_EACH_SSA_NAME (i, var, cfun)
    1419              :     {
    1420    367503930 :       if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
    1421    367503930 :           || !ssa_undefined_value_p (var, false))
    1422    363219816 :         ssa_name_set_maybe_undef (var, false);
    1423              :       else
    1424              :         {
    1425      4284114 :           ssa_name_set_maybe_undef (var);
    1426      4284114 :           queue.safe_push (var);
    1427      4284114 :           if (dump_file && (dump_flags & TDF_DETAILS))
    1428           42 :             fprintf (dump_file, "marking _%i as maybe-undef\n",
    1429           21 :                      SSA_NAME_VERSION (var));
    1430              :         }
    1431              :     }
    1432              : 
    1433              :   /* Now propagate maybe-undefined from a DEF to any other PHI that
    1434              :      uses it, as long as there isn't any intervening use of DEF.  */
    1435     17430582 :   while (!queue.is_empty ())
    1436              :     {
    1437      4578301 :       var = queue.pop ();
    1438      4578301 :       imm_use_iterator iter;
    1439      4578301 :       use_operand_p use_p;
    1440     10544861 :       FOR_EACH_IMM_USE_FAST (use_p, iter, var)
    1441              :         {
    1442              :           /* Any uses of VAR that aren't PHI args imply VAR must be
    1443              :              defined, otherwise undefined behavior would have been
    1444              :              definitely invoked.  Only PHI args may hold
    1445              :              maybe-undefined values without invoking undefined
    1446              :              behavior for that reason alone.  */
    1447      1388259 :           if (!is_a <gphi *> (USE_STMT (use_p)))
    1448      1094072 :             continue;
    1449       500038 :           gphi *phi = as_a <gphi *> (USE_STMT (use_p));
    1450              : 
    1451       500038 :           tree def = gimple_phi_result (phi);
    1452       500038 :           if (ssa_name_maybe_undef_p (def))
    1453       188663 :             continue;
    1454              : 
    1455              :           /* Look for any uses of the maybe-unused SSA_NAME that
    1456              :              dominates the block that reaches the incoming block
    1457              :              corresponding to the PHI arg in which it is mentioned.
    1458              :              That means we can assume the SSA_NAME is defined in that
    1459              :              path, so we only mark a PHI result as maybe-undef if we
    1460              :              find an unused reaching SSA_NAME.  */
    1461       311375 :           int idx = phi_arg_index_from_use (use_p);
    1462       311375 :           basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
    1463       311375 :           if (ssa_name_any_use_dominates_bb_p (var, bb))
    1464        17188 :             continue;
    1465              : 
    1466       294187 :           ssa_name_set_maybe_undef (def);
    1467       294187 :           queue.safe_push (def);
    1468       294187 :           if (dump_file && (dump_flags & TDF_DETAILS))
    1469            0 :             fprintf (dump_file, "marking _%i as maybe-undef because of _%i\n",
    1470            0 :                      SSA_NAME_VERSION (def), SSA_NAME_VERSION (var));
    1471      4578301 :         }
    1472              :     }
    1473     11823840 : }
    1474              : 
    1475              : 
    1476              : /* If necessary, rewrite the base of the reference tree *TP from
    1477              :    a MEM_REF to a plain or converted symbol.  */
    1478              : 
    1479              : static void
    1480     30264299 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
    1481              : {
    1482     30264299 :   tree sym;
    1483              : 
    1484     34266750 :   while (handled_component_p (*tp))
    1485      4002451 :     tp = &TREE_OPERAND (*tp, 0);
    1486     30264299 :   if (TREE_CODE (*tp) == MEM_REF
    1487      2081312 :       && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
    1488       380469 :       && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
    1489       380469 :       && DECL_P (sym)
    1490       379929 :       && !TREE_ADDRESSABLE (sym)
    1491       191448 :       && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    1492        55262 :       && is_gimple_reg_type (TREE_TYPE (*tp))
    1493     30319551 :       && ! VOID_TYPE_P (TREE_TYPE (*tp)))
    1494              :     {
    1495        55252 :       if (VECTOR_TYPE_P (TREE_TYPE (sym))
    1496          654 :           && useless_type_conversion_p (TREE_TYPE (*tp),
    1497          654 :                                         TREE_TYPE (TREE_TYPE (sym)))
    1498        55336 :           && multiple_p (mem_ref_offset (*tp),
    1499           84 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
    1500              :         {
    1501          166 :           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
    1502           83 :                         TYPE_SIZE (TREE_TYPE (*tp)),
    1503              :                         int_const_binop (MULT_EXPR,
    1504          166 :                                          bitsize_int (BITS_PER_UNIT),
    1505           83 :                                          TREE_OPERAND (*tp, 1)));
    1506              :         }
    1507        55169 :       else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
    1508         1050 :                && useless_type_conversion_p (TREE_TYPE (*tp),
    1509         1050 :                                              TREE_TYPE (TREE_TYPE (sym)))
    1510        55174 :                && (integer_zerop (TREE_OPERAND (*tp, 1))
    1511            3 :                    || tree_int_cst_equal (TREE_OPERAND (*tp, 1),
    1512            3 :                                           TYPE_SIZE_UNIT (TREE_TYPE (*tp)))))
    1513              :         {
    1514            6 :           *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
    1515              :                         ? REALPART_EXPR : IMAGPART_EXPR,
    1516            4 :                         TREE_TYPE (*tp), sym);
    1517              :         }
    1518        55165 :       else if (integer_zerop (TREE_OPERAND (*tp, 1))
    1519        55165 :                && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
    1520              :         {
    1521        54807 :           if (!useless_type_conversion_p (TREE_TYPE (*tp),
    1522        54807 :                                           TREE_TYPE (sym)))
    1523        12334 :             *tp = build1 (VIEW_CONVERT_EXPR,
    1524        12334 :                           TREE_TYPE (*tp), sym);
    1525              :           else
    1526        42473 :             *tp = sym;
    1527              :         }
    1528          358 :       else if (DECL_SIZE (sym)
    1529          358 :                && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
    1530          358 :                && (known_subrange_p
    1531          358 :                    (mem_ref_offset (*tp),
    1532          358 :                     wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
    1533          358 :                     0, wi::to_offset (DECL_SIZE_UNIT (sym))))
    1534          358 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
    1535          344 :                    || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
    1536          688 :                        == TYPE_PRECISION (TREE_TYPE (*tp))))
    1537          358 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
    1538          168 :                    || type_has_mode_precision_p (TREE_TYPE (sym)))
    1539          716 :                && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
    1540          716 :                                   BITS_PER_UNIT) == 0)
    1541              :         {
    1542          716 :           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
    1543          358 :                         TYPE_SIZE (TREE_TYPE (*tp)),
    1544              :                         wide_int_to_tree (bitsizetype,
    1545          358 :                                           mem_ref_offset (*tp)
    1546          716 :                                           << LOG2_BITS_PER_UNIT));
    1547              :         }
    1548              :     }
    1549     30264299 : }
    1550              : 
    1551              : /* For a tree REF return its base if it is the base of a MEM_REF
    1552              :    that cannot be rewritten into SSA form.  Otherwise return NULL_TREE.  */
    1553              : 
    1554              : static tree
    1555    296850597 : non_rewritable_mem_ref_base (tree ref)
    1556              : {
    1557    296850597 :   tree base;
    1558              : 
    1559              :   /* A plain decl does not need it set.  */
    1560    296850597 :   if (DECL_P (ref))
    1561              :     return NULL_TREE;
    1562              : 
    1563    266263442 :   switch (TREE_CODE (ref))
    1564              :     {
    1565      2483910 :     case REALPART_EXPR:
    1566      2483910 :     case IMAGPART_EXPR:
    1567      2483910 :     case BIT_FIELD_REF:
    1568      2483910 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1569              :         return NULL_TREE;
    1570              :       break;
    1571      2410490 :     case VIEW_CONVERT_EXPR:
    1572      2410490 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1573              :         {
    1574      1096777 :           if (TYPE_SIZE (TREE_TYPE (ref))
    1575      1096777 :               != TYPE_SIZE (TREE_TYPE (TREE_OPERAND  (ref, 0))))
    1576          676 :             return TREE_OPERAND (ref, 0);
    1577              :           return NULL_TREE;
    1578              :         }
    1579              :       break;
    1580              :     /* We would need to rewrite ARRAY_REFs or COMPONENT_REFs and even
    1581              :        more so multiple levels of handled components.  */
    1582    264706530 :     default:;
    1583              :     }
    1584              : 
    1585    264706530 :   base = ref;
    1586              : 
    1587              :   /* But watch out for MEM_REFs we cannot lower to a
    1588              :      VIEW_CONVERT_EXPR or a BIT_FIELD_REF.  */
    1589    264706530 :   if (TREE_CODE (base) == MEM_REF
    1590    264706530 :       && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
    1591              :     {
    1592      6108581 :       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
    1593      6108581 :       if (! DECL_P (decl))
    1594              :         return NULL_TREE;
    1595      6074701 :       if (! is_gimple_reg_type (TREE_TYPE (base))
    1596      5906904 :           || VOID_TYPE_P (TREE_TYPE (base))
    1597     11981605 :           || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
    1598              :         return decl;
    1599      5905680 :       if ((VECTOR_TYPE_P (TREE_TYPE (decl))
    1600      5903998 :            || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
    1601         3069 :           && useless_type_conversion_p (TREE_TYPE (base),
    1602         3069 :                                         TREE_TYPE (TREE_TYPE (decl)))
    1603          267 :           && known_ge (mem_ref_offset (base), 0)
    1604          220 :           && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
    1605              :                        mem_ref_offset (base))
    1606      5905894 :           && multiple_p (mem_ref_offset (base),
    1607          214 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base)))))
    1608          212 :         return NULL_TREE;
    1609              :       /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR.  */
    1610      5905468 :       if (integer_zerop (TREE_OPERAND (base, 1))
    1611      5905468 :           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
    1612              :         return NULL_TREE;
    1613              :       /* For integral typed extracts we can use a BIT_FIELD_REF.  */
    1614      5295848 :       if (DECL_SIZE (decl)
    1615      5291319 :           && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
    1616      5291319 :           && (known_subrange_p
    1617      5291319 :               (mem_ref_offset (base),
    1618      5291319 :                wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
    1619      5291319 :                0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
    1620              :           /* ???  We can't handle bitfield precision extracts without
    1621              :              either using an alternate type for the BIT_FIELD_REF and
    1622              :              then doing a conversion or possibly adjusting the offset
    1623              :              according to endianness.  */
    1624      5288895 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
    1625      2735486 :               || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
    1626      5470972 :                   == TYPE_PRECISION (TREE_TYPE (base))))
    1627              :           /* ???  Likewise for extracts from bitfields, we'd have
    1628              :              to pun the base object to a size precision mode first.  */
    1629      5283542 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1630        39505 :               || type_has_mode_precision_p (TREE_TYPE (decl)))
    1631     10545491 :           && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
    1632     10499286 :                              BITS_PER_UNIT) == 0)
    1633      5249643 :         return NULL_TREE;
    1634        46205 :       return decl;
    1635              :     }
    1636              : 
    1637              :   /* We cannot rewrite a decl in the base.  */
    1638    258597949 :   base = get_base_address (ref);
    1639    258597949 :   if (DECL_P (base))
    1640              :     return base;
    1641              : 
    1642              :   /* We cannot rewrite TARGET_MEM_REFs.  */
    1643    238887731 :   else if (TREE_CODE (base) == TARGET_MEM_REF
    1644    238887731 :            && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
    1645              :     {
    1646            0 :       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
    1647            0 :       if (! DECL_P (decl))
    1648              :         return NULL_TREE;
    1649              :       return decl;
    1650              :     }
    1651              : 
    1652              :   return NULL_TREE;
    1653              : }
    1654              : 
    1655              : /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
    1656              :    Otherwise return true.  */
    1657              : 
    1658              : static bool
    1659    102378674 : non_rewritable_lvalue_p (tree lhs)
    1660              : {
    1661              :   /* A plain decl is always rewritable.  */
    1662    102378674 :   if (DECL_P (lhs))
    1663              :     return false;
    1664              : 
    1665              :   /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
    1666              :      a reasonably efficient manner... */
    1667     60004002 :   if ((TREE_CODE (lhs) == REALPART_EXPR
    1668     60004002 :        || TREE_CODE (lhs) == IMAGPART_EXPR)
    1669     60004002 :       && DECL_P (TREE_OPERAND (lhs, 0)))
    1670              :     return false;
    1671              : 
    1672              :   /* ???  The following could be relaxed allowing component
    1673              :      references that do not change the access size.  */
    1674     59972946 :   if (TREE_CODE (lhs) == MEM_REF
    1675     59972946 :       && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
    1676              :     {
    1677      7105681 :       tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
    1678              : 
    1679              :       /* A decl that is wrapped inside a MEM-REF that covers
    1680              :          it full is also rewritable.  */
    1681      7105681 :       if (integer_zerop (TREE_OPERAND (lhs, 1))
    1682      2072682 :           && DECL_P (decl)
    1683      2072622 :           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
    1684              :           /* If the dynamic type of the decl has larger precision than
    1685              :              the decl itself we can't use the decls type for SSA rewriting.  */
    1686       534479 :           && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1687        13576 :                || compare_tree_int (DECL_SIZE (decl),
    1688        13576 :                                     TYPE_PRECISION (TREE_TYPE (decl))) == 0)
    1689          814 :               || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
    1690          793 :                   && (TYPE_PRECISION (TREE_TYPE (decl))
    1691          793 :                       >= TYPE_PRECISION (TREE_TYPE (lhs)))))
    1692              :           /* Make sure we are not re-writing non-float copying into float
    1693              :              copying as that can incur normalization.  */
    1694       534326 :           && (! FLOAT_TYPE_P (TREE_TYPE (decl))
    1695         4962 :               || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
    1696      7635752 :           && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
    1697              :         return false;
    1698              : 
    1699              :       /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
    1700              :          using a BIT_INSERT_EXPR.  */
    1701      6576096 :       if (DECL_P (decl)
    1702      6576030 :           && VECTOR_TYPE_P (TREE_TYPE (decl))
    1703         1699 :           && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
    1704          273 :           && known_ge (mem_ref_offset (lhs), 0)
    1705          238 :           && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
    1706              :                        mem_ref_offset (lhs))
    1707          238 :           && multiple_p (mem_ref_offset (lhs),
    1708          238 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
    1709     13152126 :           && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
    1710              :                        wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
    1711              :         {
    1712          237 :           poly_uint64 lhs_bits, nelts;
    1713          237 :           if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
    1714          239 :               && multiple_p (lhs_bits,
    1715              :                              tree_to_uhwi
    1716          237 :                                (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
    1717              :                              &nelts)
    1718          257 :               && valid_vector_subparts_p (nelts))
    1719              :             {
    1720          217 :               if (known_eq (nelts, 1u))
    1721          217 :                 return false;
    1722              :               /* For sub-vector inserts the insert vector mode has to be
    1723              :                  supported.  */
    1724          159 :               tree vtype = build_vector_type (TREE_TYPE (TREE_TYPE (decl)),
    1725          159 :                                               nelts);
    1726          159 :               if (TYPE_MODE (vtype) != BLKmode)
    1727              :                 return false;
    1728              :             }
    1729              :         }
    1730              :     }
    1731              : 
    1732              :   /* A vector-insert using a BIT_FIELD_REF is rewritable using
    1733              :      BIT_INSERT_EXPR.  */
    1734     59443144 :   if (TREE_CODE (lhs) == BIT_FIELD_REF
    1735        18996 :       && DECL_P (TREE_OPERAND (lhs, 0))
    1736        13349 :       && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    1737        13295 :       && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    1738         1510 :       && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    1739         1510 :                           TYPE_SIZE_UNIT
    1740              :                             (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
    1741     59444653 :       && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    1742         1509 :           % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
    1743              :     return false;
    1744              : 
    1745              :   return true;
    1746              : }
    1747              : 
    1748              : /* When possible, clear TREE_ADDRESSABLE bit, set or clear DECL_NOT_GIMPLE_REG_P
    1749              :    and mark the variable VAR for conversion into SSA.  Return true when updating
    1750              :    stmts is required.  */
    1751              : 
    1752              : static void
    1753    105677759 : maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
    1754              :                     bitmap suitable_for_renaming)
    1755              : {
    1756              :   /* Global Variables, result decls cannot be changed.  */
    1757    105677759 :   if (is_global_var (var)
    1758    104056117 :       || TREE_CODE (var) == RESULT_DECL
    1759    209733876 :       || bitmap_bit_p (addresses_taken, DECL_UID (var)))
    1760     10386576 :     return;
    1761              : 
    1762     95291183 :   bool maybe_reg = false;
    1763     95291183 :   if (TREE_ADDRESSABLE (var))
    1764              :     {
    1765      1511807 :       TREE_ADDRESSABLE (var) = 0;
    1766      1511807 :       maybe_reg = true;
    1767      1511807 :       if (dump_file)
    1768              :         {
    1769           69 :           fprintf (dump_file, "No longer having address taken: ");
    1770           69 :           print_generic_expr (dump_file, var);
    1771           69 :           fprintf (dump_file, "\n");
    1772              :         }
    1773              :     }
    1774              : 
    1775              :   /* For register type decls if we do not have any partial defs
    1776              :      we cannot express in SSA form mark them as DECL_NOT_GIMPLE_REG_P
    1777              :      as to avoid SSA rewrite.  For the others go ahead and mark
    1778              :      them for renaming.  */
    1779     95291183 :   if (is_gimple_reg_type (TREE_TYPE (var)))
    1780              :     {
    1781     79795148 :       if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
    1782              :         {
    1783        32238 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1784        32238 :           if (dump_file)
    1785              :             {
    1786            4 :               fprintf (dump_file, "Has partial defs: ");
    1787            4 :               print_generic_expr (dump_file, var);
    1788            4 :               fprintf (dump_file, "\n");
    1789              :             }
    1790              :         }
    1791     79762910 :       else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
    1792        37445 :                && (cfun->curr_properties & PROP_gimple_lbitint) != 0
    1793     79780680 :                && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE)
    1794              :         {
    1795              :           /* Don't rewrite large/huge _BitInt vars after _BitInt lowering
    1796              :              into SSA form.  */
    1797         1266 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1798         1266 :           if (dump_file)
    1799              :             {
    1800            0 :               fprintf (dump_file, "_BitInt var after its lowering: ");
    1801            0 :               print_generic_expr (dump_file, var);
    1802            0 :               fprintf (dump_file, "\n");
    1803              :             }
    1804              :         }
    1805     79761644 :       else if (DECL_NOT_GIMPLE_REG_P (var))
    1806              :         {
    1807         7857 :           maybe_reg = true;
    1808         7857 :           DECL_NOT_GIMPLE_REG_P (var) = 0;
    1809              :         }
    1810     79795148 :       if (maybe_reg)
    1811              :         {
    1812       550081 :           if (is_gimple_reg (var))
    1813              :             {
    1814       542783 :               if (dump_file)
    1815              :                 {
    1816           16 :                   fprintf (dump_file, "Now a gimple register: ");
    1817           16 :                   print_generic_expr (dump_file, var);
    1818           16 :                   fprintf (dump_file, "\n");
    1819              :                 }
    1820       542783 :               bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
    1821              :             }
    1822              :           else
    1823         7298 :             DECL_NOT_GIMPLE_REG_P (var) = 1;
    1824              :         }
    1825              :     }
    1826              : }
    1827              : 
    1828              : /* Return true when STMT is ASAN mark where second argument is an address
    1829              :    of a local variable.  */
    1830              : 
    1831              : static bool
    1832     59125765 : is_asan_mark_p (gimple *stmt)
    1833              : {
    1834     59125765 :   if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
    1835              :     return false;
    1836              : 
    1837        55353 :   tree addr = get_base_address (gimple_call_arg (stmt, 1));
    1838        55353 :   if (TREE_CODE (addr) == ADDR_EXPR
    1839        55353 :       && VAR_P (TREE_OPERAND (addr, 0)))
    1840              :     {
    1841        55149 :       tree var = TREE_OPERAND (addr, 0);
    1842        55149 :       if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
    1843        55149 :                             DECL_ATTRIBUTES (var)))
    1844              :         return false;
    1845              : 
    1846        51278 :       unsigned addressable = TREE_ADDRESSABLE (var);
    1847        51278 :       TREE_ADDRESSABLE (var) = 0;
    1848        51278 :       bool r = is_gimple_reg (var);
    1849        51278 :       TREE_ADDRESSABLE (var) = addressable;
    1850        51278 :       return r;
    1851              :     }
    1852              : 
    1853              :   return false;
    1854              : }
    1855              : 
    1856              : /* Compute TREE_ADDRESSABLE and whether we have unhandled partial defs
    1857              :    for local variables.  */
    1858              : 
    1859              : void
    1860     12460035 : execute_update_addresses_taken (void)
    1861              : {
    1862     12460035 :   basic_block bb;
    1863     12460035 :   auto_bitmap addresses_taken;
    1864     12460035 :   auto_bitmap not_reg_needs;
    1865     12460035 :   auto_bitmap suitable_for_renaming;
    1866     12460035 :   bool optimistic_not_addressable = false;
    1867     12460035 :   tree var;
    1868     12460035 :   unsigned i;
    1869              : 
    1870     12460035 :   timevar_push (TV_ADDRESS_TAKEN);
    1871              : 
    1872              :   /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
    1873              :      the function body.  */
    1874    122862400 :   FOR_EACH_BB_FN (bb, cfun)
    1875              :     {
    1876   1045734369 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1877    824929639 :            gsi_next (&gsi))
    1878              :         {
    1879    824929639 :           gimple *stmt = gsi_stmt (gsi);
    1880    824929639 :           enum gimple_code code = gimple_code (stmt);
    1881    824929639 :           tree decl;
    1882              : 
    1883    824929639 :           if (code == GIMPLE_CALL)
    1884              :             {
    1885     56161726 :               if (optimize_atomic_compare_exchange_p (stmt))
    1886              :                 {
    1887              :                   /* For __atomic_compare_exchange_N if the second argument
    1888              :                      is &var, don't mark var addressable;
    1889              :                      if it becomes non-addressable, we'll rewrite it into
    1890              :                      ATOMIC_COMPARE_EXCHANGE call.  */
    1891         5780 :                   tree arg = gimple_call_arg (stmt, 1);
    1892         5780 :                   gimple_call_set_arg (stmt, 1, null_pointer_node);
    1893         5780 :                   gimple_ior_addresses_taken (addresses_taken, stmt);
    1894         5780 :                   gimple_call_set_arg (stmt, 1, arg);
    1895              :                   /* Remember we have to check again below.  */
    1896         5780 :                   optimistic_not_addressable = true;
    1897              :                 }
    1898     56155946 :               else if (is_asan_mark_p (stmt)
    1899     56155946 :                        || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
    1900              :                 ;
    1901              :               else
    1902     56134887 :                 gimple_ior_addresses_taken (addresses_taken, stmt);
    1903              :             }
    1904              :           else
    1905              :             /* Note all addresses taken by the stmt.  */
    1906    768767913 :             gimple_ior_addresses_taken (addresses_taken, stmt);
    1907              : 
    1908              :           /* If we have a call or an assignment, see if the lhs contains
    1909              :              a local decl that requires not to be a gimple register.  */
    1910    824929639 :           if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
    1911              :             {
    1912    315450273 :               tree lhs = gimple_get_lhs (stmt);
    1913    315450273 :               if (lhs
    1914    281639431 :                   && TREE_CODE (lhs) != SSA_NAME
    1915    417831193 :                   && ((code == GIMPLE_CALL && ! DECL_P (lhs))
    1916    102271437 :                       || non_rewritable_lvalue_p (lhs)))
    1917              :                 {
    1918     59538805 :                   decl = get_base_address (lhs);
    1919     59538805 :                   if (DECL_P (decl))
    1920     41403250 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1921              :                 }
    1922              :             }
    1923              : 
    1924    824929639 :           if (gimple_assign_single_p (stmt))
    1925              :             {
    1926    174855842 :               tree rhs = gimple_assign_rhs1 (stmt);
    1927    174855842 :               if ((decl = non_rewritable_mem_ref_base (rhs)))
    1928     19719876 :                 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1929              :             }
    1930              : 
    1931    650073797 :           else if (code == GIMPLE_CALL)
    1932              :             {
    1933    166513989 :               for (i = 0; i < gimple_call_num_args (stmt); ++i)
    1934              :                 {
    1935    110352263 :                   tree arg = gimple_call_arg (stmt, i);
    1936    110352263 :                   if ((decl = non_rewritable_mem_ref_base (arg)))
    1937       161535 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1938              :                 }
    1939              :             }
    1940              : 
    1941    593912071 :           else if (code == GIMPLE_ASM)
    1942              :             {
    1943       725381 :               gasm *asm_stmt = as_a <gasm *> (stmt);
    1944      1370345 :               for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    1945              :                 {
    1946       644964 :                   tree link = gimple_asm_output_op (asm_stmt, i);
    1947       644964 :                   tree lhs = TREE_VALUE (link);
    1948       644964 :                   if (TREE_CODE (lhs) != SSA_NAME)
    1949              :                     {
    1950       163083 :                       decl = get_base_address (lhs);
    1951       163083 :                       if (DECL_P (decl)
    1952       163083 :                           && (non_rewritable_lvalue_p (lhs)
    1953              :                               /* We cannot move required conversions from
    1954              :                                  the lhs to the rhs in asm statements, so
    1955              :                                  require we do not need any.  */
    1956        94924 :                               || !useless_type_conversion_p
    1957        94924 :                                     (TREE_TYPE (lhs), TREE_TYPE (decl))))
    1958        12859 :                         bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1959              :                     }
    1960              :                 }
    1961      1145921 :               for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    1962              :                 {
    1963       420540 :                   tree link = gimple_asm_input_op (asm_stmt, i);
    1964       420540 :                   if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
    1965         3418 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1966              :                 }
    1967              :             }
    1968              :         }
    1969              : 
    1970    148089294 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
    1971     37686929 :            gsi_next (&gsi))
    1972              :         {
    1973     37686929 :           size_t i;
    1974     37686929 :           gphi *phi = gsi.phi ();
    1975              : 
    1976    135524843 :           for (i = 0; i < gimple_phi_num_args (phi); i++)
    1977              :             {
    1978     97837914 :               tree op = PHI_ARG_DEF (phi, i), var;
    1979     97837914 :               if (TREE_CODE (op) == ADDR_EXPR
    1980       811654 :                   && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
    1981     98649568 :                   && DECL_P (var))
    1982       608790 :                 bitmap_set_bit (addresses_taken, DECL_UID (var));
    1983              :             }
    1984              :         }
    1985              :     }
    1986              : 
    1987              :   /* We cannot iterate over all referenced vars because that can contain
    1988              :      unused vars from BLOCK trees, which causes code generation differences
    1989              :      for -g vs. -g0.  */
    1990     38631223 :   for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
    1991     26171188 :     maybe_optimize_var (var, addresses_taken, not_reg_needs,
    1992              :                         suitable_for_renaming);
    1993              : 
    1994     91966606 :   FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
    1995     79506571 :     maybe_optimize_var (var, addresses_taken, not_reg_needs,
    1996              :                         suitable_for_renaming);
    1997              : 
    1998              :   /* Operand caches need to be recomputed for operands referencing the updated
    1999              :      variables and operands need to be rewritten to expose bare symbols.  */
    2000     12460035 :   if (!bitmap_empty_p (suitable_for_renaming)
    2001     12460035 :       || optimistic_not_addressable)
    2002              :     {
    2003      6867113 :       FOR_EACH_BB_FN (bb, cfun)
    2004     64264639 :         for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
    2005              :           {
    2006     50972329 :             gimple *stmt = gsi_stmt (gsi);
    2007              : 
    2008              :             /* Re-write TARGET_MEM_REFs of symbols we want to
    2009              :                rewrite into SSA form.  */
    2010     50972329 :             if (gimple_assign_single_p (stmt))
    2011              :               {
    2012     13957400 :                 tree lhs = gimple_assign_lhs (stmt);
    2013     13957400 :                 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
    2014     13957400 :                 tree sym;
    2015              : 
    2016              :                 /* Rewrite LHS IMAG/REALPART_EXPR similar to
    2017              :                    gimplify_modify_expr_complex_part.  */
    2018     13957400 :                 if ((TREE_CODE (lhs) == IMAGPART_EXPR
    2019     13957400 :                      || TREE_CODE (lhs) == REALPART_EXPR)
    2020         2215 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2021     13958882 :                     && bitmap_bit_p (suitable_for_renaming,
    2022         1482 :                                      DECL_UID (TREE_OPERAND (lhs, 0))))
    2023              :                   {
    2024         1408 :                     tree other = make_ssa_name (TREE_TYPE (lhs));
    2025         2121 :                     tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
    2026              :                                         ? REALPART_EXPR : IMAGPART_EXPR,
    2027         1408 :                                         TREE_TYPE (other),
    2028         1408 :                                         TREE_OPERAND (lhs, 0));
    2029         1408 :                     suppress_warning (lrhs);
    2030         1408 :                     gimple *load = gimple_build_assign (other, lrhs);
    2031         1408 :                     location_t loc = gimple_location (stmt);
    2032         1408 :                     gimple_set_location (load, loc);
    2033         2816 :                     gimple_set_vuse (load, gimple_vuse (stmt));
    2034         1408 :                     gsi_insert_before (&gsi, load, GSI_SAME_STMT);
    2035         1408 :                     gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
    2036         1408 :                     gimple_assign_set_rhs_with_ops
    2037         2121 :                       (&gsi, COMPLEX_EXPR,
    2038              :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2039          713 :                        ? other : gimple_assign_rhs1 (stmt),
    2040         1408 :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2041          695 :                        ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
    2042         1408 :                     stmt = gsi_stmt (gsi);
    2043         1408 :                     unlink_stmt_vdef (stmt);
    2044         1408 :                     update_stmt (stmt);
    2045         1408 :                     continue;
    2046         1408 :                   }
    2047              : 
    2048              :                 /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
    2049              :                    into a BIT_INSERT_EXPR.  */
    2050     13955992 :                 if (TREE_CODE (lhs) == BIT_FIELD_REF
    2051          803 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2052          745 :                     && bitmap_bit_p (suitable_for_renaming,
    2053          745 :                                      DECL_UID (TREE_OPERAND (lhs, 0)))
    2054          626 :                     && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    2055          626 :                     && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    2056          626 :                     && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    2057          626 :                                         TYPE_SIZE_UNIT (TREE_TYPE
    2058              :                                           (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
    2059              :                                         0)
    2060     13956618 :                     && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    2061          626 :                         % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
    2062              :                   {
    2063          626 :                     tree var = TREE_OPERAND (lhs, 0);
    2064          626 :                     tree val = gimple_assign_rhs1 (stmt);
    2065          626 :                     if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
    2066          626 :                                               TREE_TYPE (val)))
    2067              :                       {
    2068            0 :                         tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
    2069            0 :                         gimple *pun
    2070            0 :                           = gimple_build_assign (tem,
    2071              :                                                  build1 (VIEW_CONVERT_EXPR,
    2072            0 :                                                          TREE_TYPE (tem), val));
    2073            0 :                         gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
    2074            0 :                         val = tem;
    2075              :                       }
    2076          626 :                     tree bitpos = TREE_OPERAND (lhs, 2);
    2077          626 :                     gimple_assign_set_lhs (stmt, var);
    2078          626 :                     gimple_assign_set_rhs_with_ops
    2079          626 :                       (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
    2080          626 :                     stmt = gsi_stmt (gsi);
    2081          626 :                     unlink_stmt_vdef (stmt);
    2082          626 :                     update_stmt (stmt);
    2083          626 :                     continue;
    2084          626 :                   }
    2085              : 
    2086              :                 /* Rewrite a vector insert using a MEM_REF on the LHS
    2087              :                    into a BIT_INSERT_EXPR.  */
    2088     13955366 :                 if (TREE_CODE (lhs) == MEM_REF
    2089       615746 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2090       137181 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2091       137181 :                     && DECL_P (sym)
    2092       137181 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    2093         8512 :                     && VECTOR_TYPE_P (TREE_TYPE (sym))
    2094          138 :                     && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
    2095              :                     /* If it is a full replacement we can do better below.  */
    2096          136 :                     && maybe_ne (wi::to_poly_offset
    2097          136 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
    2098              :                                  wi::to_poly_offset
    2099          136 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
    2100           82 :                     && known_ge (mem_ref_offset (lhs), 0)
    2101           82 :                     && known_gt (wi::to_poly_offset
    2102              :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
    2103              :                                  mem_ref_offset (lhs))
    2104     13955448 :                     && multiple_p (mem_ref_offset (lhs),
    2105              :                                    wi::to_poly_offset
    2106     13955366 :                                      (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
    2107              :                   {
    2108           82 :                     tree val = gimple_assign_rhs1 (stmt);
    2109           82 :                     if (! types_compatible_p (TREE_TYPE (val),
    2110           82 :                                               TREE_TYPE (TREE_TYPE (sym))))
    2111              :                       {
    2112           56 :                         poly_uint64 lhs_bits, nelts;
    2113           56 :                         tree temtype = TREE_TYPE (TREE_TYPE (sym));
    2114           56 :                         if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)),
    2115              :                                              &lhs_bits)
    2116           56 :                             && multiple_p (lhs_bits,
    2117              :                                            tree_to_uhwi
    2118           56 :                                              (TYPE_SIZE (TREE_TYPE
    2119              :                                                            (TREE_TYPE (sym)))),
    2120              :                                            &nelts)
    2121           56 :                             && maybe_ne (nelts, 1u)
    2122           56 :                             && valid_vector_subparts_p (nelts))
    2123           30 :                           temtype = build_vector_type (temtype, nelts);
    2124           56 :                         tree tem = make_ssa_name (temtype);
    2125           56 :                         gimple *pun
    2126           56 :                           = gimple_build_assign (tem,
    2127              :                                                  build1 (VIEW_CONVERT_EXPR,
    2128           56 :                                                          TREE_TYPE (tem), val));
    2129           56 :                         gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
    2130           56 :                         val = tem;
    2131              :                       }
    2132           82 :                     tree bitpos
    2133           82 :                       = wide_int_to_tree (bitsizetype,
    2134           82 :                                           mem_ref_offset (lhs) * BITS_PER_UNIT);
    2135           82 :                     gimple_assign_set_lhs (stmt, sym);
    2136           82 :                     gimple_assign_set_rhs_with_ops
    2137           82 :                       (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
    2138           82 :                     stmt = gsi_stmt (gsi);
    2139           82 :                     unlink_stmt_vdef (stmt);
    2140           82 :                     update_stmt (stmt);
    2141           82 :                     continue;
    2142           82 :                   }
    2143              : 
    2144              :                 /* We shouldn't have any fancy wrapping of
    2145              :                    component-refs on the LHS, but look through
    2146              :                    VIEW_CONVERT_EXPRs as that is easy.  */
    2147     13955294 :                 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
    2148           10 :                   lhs = TREE_OPERAND (lhs, 0);
    2149     13955284 :                 if (TREE_CODE (lhs) == MEM_REF
    2150       615669 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2151       137099 :                     && integer_zerop (TREE_OPERAND (lhs, 1))
    2152        57664 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2153        57664 :                     && DECL_P (sym)
    2154        57664 :                     && !TREE_ADDRESSABLE (sym)
    2155     13990680 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
    2156              :                   lhs = sym;
    2157              :                 else
    2158     13946854 :                   lhs = gimple_assign_lhs (stmt);
    2159              : 
    2160              :                 /* Rewrite the RHS and make sure the resulting assignment
    2161              :                    is validly typed.  */
    2162     13955284 :                 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
    2163     13955284 :                 rhs = gimple_assign_rhs1 (stmt);
    2164     13955284 :                 if (gimple_assign_lhs (stmt) != lhs
    2165     13963714 :                     && !useless_type_conversion_p (TREE_TYPE (lhs),
    2166         8430 :                                                    TREE_TYPE (rhs)))
    2167              :                   {
    2168         3883 :                     if (gimple_clobber_p (stmt))
    2169              :                       {
    2170           11 :                         rhs = build_constructor (TREE_TYPE (lhs), NULL);
    2171           11 :                         TREE_THIS_VOLATILE (rhs) = 1;
    2172              :                       }
    2173              :                     else
    2174         3872 :                       rhs = fold_build1 (VIEW_CONVERT_EXPR,
    2175              :                                          TREE_TYPE (lhs), rhs);
    2176              :                   }
    2177     13955284 :                 if (gimple_assign_lhs (stmt) != lhs)
    2178         8430 :                   gimple_assign_set_lhs (stmt, lhs);
    2179              : 
    2180     13955284 :                 if (gimple_assign_rhs1 (stmt) != rhs)
    2181              :                   {
    2182         3883 :                     gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
    2183         3883 :                     gimple_assign_set_rhs_from_tree (&gsi, rhs);
    2184              :                   }
    2185              :               }
    2186              : 
    2187     37014929 :             else if (gimple_code (stmt) == GIMPLE_CALL)
    2188              :               {
    2189      2975599 :                 unsigned i;
    2190      2975599 :                 if (optimize_atomic_compare_exchange_p (stmt))
    2191              :                   {
    2192         5780 :                     tree expected = gimple_call_arg (stmt, 1);
    2193         5780 :                     tree decl = TREE_OPERAND (expected, 0);
    2194         5780 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2195              :                       {
    2196         5705 :                         fold_builtin_atomic_compare_exchange (&gsi);
    2197         5705 :                         continue;
    2198              :                       }
    2199           75 :                     else if (!TREE_ADDRESSABLE (decl))
    2200              :                       /* If there are partial defs of the decl we may
    2201              :                          have cleared the addressable bit but set
    2202              :                          DECL_NOT_GIMPLE_REG_P.  We have to restore
    2203              :                          TREE_ADDRESSABLE here.  */
    2204           27 :                       TREE_ADDRESSABLE (decl) = 1;
    2205              :                   }
    2206      2969819 :                 else if (is_asan_mark_p (stmt))
    2207              :                   {
    2208          714 :                     tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
    2209          714 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
    2210              :                       {
    2211          663 :                         unlink_stmt_vdef (stmt);
    2212          663 :                         if (asan_mark_p (stmt, ASAN_MARK_POISON))
    2213              :                           {
    2214          352 :                             gcall *call
    2215          352 :                               = gimple_build_call_internal (IFN_ASAN_POISON, 0);
    2216          352 :                             gimple_call_set_lhs (call, var);
    2217          352 :                             gsi_replace (&gsi, call, true);
    2218              :                           }
    2219              :                         else
    2220              :                           {
    2221              :                             /* In ASAN_MARK (UNPOISON, &b, ...) the variable
    2222              :                                is uninitialized.  Avoid dependencies on
    2223              :                                previous out of scope value.  */
    2224          311 :                             tree clobber = build_clobber (TREE_TYPE (var));
    2225          311 :                             gimple *g = gimple_build_assign (var, clobber);
    2226          311 :                             gsi_replace (&gsi, g, true);
    2227              :                           }
    2228          663 :                         continue;
    2229          663 :                       }
    2230              :                   }
    2231      2969105 :                 else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
    2232            0 :                   for (i = 1; i < gimple_call_num_args (stmt); i++)
    2233              :                     {
    2234            0 :                       tree *argp = gimple_call_arg_ptr (stmt, i);
    2235            0 :                       if (*argp == null_pointer_node)
    2236            0 :                         continue;
    2237            0 :                       gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
    2238              :                                   && VAR_P (TREE_OPERAND (*argp, 0)));
    2239            0 :                       tree var = TREE_OPERAND (*argp, 0);
    2240            0 :                       if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
    2241            0 :                         *argp = null_pointer_node;
    2242              :                     }
    2243      8005542 :                 for (i = 0; i < gimple_call_num_args (stmt); ++i)
    2244              :                   {
    2245      5036311 :                     tree *argp = gimple_call_arg_ptr (stmt, i);
    2246      5036311 :                     maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
    2247              :                   }
    2248              :               }
    2249              : 
    2250     34039330 :             else if (gimple_code (stmt) == GIMPLE_ASM)
    2251              :               {
    2252        10868 :                 gasm *asm_stmt = as_a <gasm *> (stmt);
    2253        10868 :                 unsigned i;
    2254        47699 :                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    2255              :                   {
    2256        36831 :                     tree link = gimple_asm_output_op (asm_stmt, i);
    2257        36831 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2258              :                                                 suitable_for_renaming);
    2259              :                   }
    2260        24789 :                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    2261              :                   {
    2262        13921 :                     tree link = gimple_asm_input_op (asm_stmt, i);
    2263        13921 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2264              :                                                 suitable_for_renaming);
    2265              :                   }
    2266              :               }
    2267              : 
    2268     34028462 :             else if (gimple_debug_bind_p (stmt)
    2269     27183392 :                      && gimple_debug_bind_has_value_p (stmt))
    2270              :               {
    2271     11221952 :                 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
    2272     11221952 :                 tree decl;
    2273     11221952 :                 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
    2274     11221952 :                 decl = non_rewritable_mem_ref_base (*valuep);
    2275     11221952 :                 if (decl
    2276     11221952 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2277           10 :                   gimple_debug_bind_reset_value (stmt);
    2278              :               }
    2279              : 
    2280     65383868 :             if (gimple_references_memory_p (stmt)
    2281     44379329 :                 || is_gimple_debug (stmt))
    2282     33767908 :               update_stmt (stmt);
    2283              : 
    2284     50963845 :             gsi_next (&gsi);
    2285              :           }
    2286              : 
    2287              :       /* Update SSA form here, we are called as non-pass as well.  */
    2288       220958 :       if (number_of_loops (cfun) > 1
    2289       220958 :           && loops_state_satisfies_p (LOOP_CLOSED_SSA))
    2290           65 :         rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
    2291              :       else
    2292       220893 :         update_ssa (TODO_update_ssa);
    2293              :     }
    2294              : 
    2295     12460035 :   timevar_pop (TV_ADDRESS_TAKEN);
    2296     12460035 : }
    2297              : 
    2298              : namespace {
    2299              : 
    2300              : const pass_data pass_data_update_address_taken =
    2301              : {
    2302              :   GIMPLE_PASS, /* type */
    2303              :   "addressables", /* name */
    2304              :   OPTGROUP_NONE, /* optinfo_flags */
    2305              :   TV_ADDRESS_TAKEN, /* tv_id */
    2306              :   PROP_ssa, /* properties_required */
    2307              :   0, /* properties_provided */
    2308              :   0, /* properties_destroyed */
    2309              :   0, /* todo_flags_start */
    2310              :   TODO_update_address_taken, /* todo_flags_finish */
    2311              : };
    2312              : 
    2313              : class pass_update_address_taken : public gimple_opt_pass
    2314              : {
    2315              : public:
    2316            0 :   pass_update_address_taken (gcc::context *ctxt)
    2317            0 :     : gimple_opt_pass (pass_data_update_address_taken, ctxt)
    2318              :   {}
    2319              : 
    2320              :   /* opt_pass methods: */
    2321              : 
    2322              : }; // class pass_update_address_taken
    2323              : 
    2324              : } // anon namespace
    2325              : 
    2326              : gimple_opt_pass *
    2327            0 : make_pass_update_address_taken (gcc::context *ctxt)
    2328              : {
    2329            0 :   return new pass_update_address_taken (ctxt);
    2330              : }
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.