LCOV - code coverage report
Current view: top level - gcc - tree-ssa.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 86.2 % 1095 944
Test Date: 2024-12-21 13:15:12 Functions: 97.1 % 35 34
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* Miscellaneous SSA utility functions.
       2                 :             :    Copyright (C) 2001-2024 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                 :     7444262 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
      56                 :             : {
      57                 :     7444262 :   edge_var_map new_node;
      58                 :             : 
      59                 :     7444262 :   if (edge_var_maps == NULL)
      60                 :       63087 :     edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
      61                 :             : 
      62                 :     7444262 :   auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
      63                 :     7444262 :   new_node.def = def;
      64                 :     7444262 :   new_node.result = result;
      65                 :     7444262 :   new_node.locus = locus;
      66                 :             : 
      67                 :     7444262 :   slot.safe_push (new_node);
      68                 :     7444262 : }
      69                 :             : 
      70                 :             : 
      71                 :             : /* Clear the var mappings in edge E.  */
      72                 :             : 
      73                 :             : void
      74                 :   124172964 : redirect_edge_var_map_clear (edge e)
      75                 :             : {
      76                 :   124172964 :   if (!edge_var_maps)
      77                 :             :     return;
      78                 :             : 
      79                 :   109934623 :   auto_vec<edge_var_map> *head = edge_var_maps->get (e);
      80                 :             : 
      81                 :   109934623 :   if (head)
      82                 :     6569186 :     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                 :      330937 : redirect_edge_var_map_dup (edge newe, edge olde)
      94                 :             : {
      95                 :      330937 :   if (!edge_var_maps)
      96                 :             :     return;
      97                 :             : 
      98                 :      303974 :   auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
      99                 :      303974 :   auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
     100                 :      303974 :   if (!old_head)
     101                 :             :     return;
     102                 :             : 
     103                 :        4654 :   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                 :     4742635 : redirect_edge_var_map_vector (edge e)
     112                 :             : {
     113                 :             :   /* Hey, what kind of idiot would... you'd be surprised.  */
     114                 :     4742635 :   if (!edge_var_maps)
     115                 :             :     return NULL;
     116                 :             : 
     117                 :     4728366 :   auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
     118                 :     4728366 :   if (!slot)
     119                 :             :     return NULL;
     120                 :             : 
     121                 :             :   return slot;
     122                 :             : }
     123                 :             : 
     124                 :             : /* Clear the edge variable mappings.  */
     125                 :             : 
     126                 :             : void
     127                 :   785032831 : redirect_edge_var_map_empty (void)
     128                 :             : {
     129                 :   785032831 :   if (edge_var_maps)
     130                 :   227563153 :     edge_var_maps->empty ();
     131                 :   785032831 : }
     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                 :    58093447 : ssa_redirect_edge (edge e, basic_block dest)
     141                 :             : {
     142                 :    58093447 :   gphi_iterator gsi;
     143                 :    58093447 :   gphi *phi;
     144                 :             : 
     145                 :    58093447 :   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                 :    58093447 :   if (! (e->dest->flags & BB_DUPLICATED))
     151                 :    64360316 :     for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
     152                 :             :       {
     153                 :     7874224 :         tree def;
     154                 :     7874224 :         location_t locus;
     155                 :             : 
     156                 :     7874224 :         phi = gsi.phi ();
     157                 :     7874224 :         def = gimple_phi_arg_def (phi, e->dest_idx);
     158                 :     7874224 :         locus = gimple_phi_arg_location (phi, e->dest_idx);
     159                 :             : 
     160                 :     7874224 :         if (def == NULL_TREE)
     161                 :     1302777 :           continue;
     162                 :             : 
     163                 :     6571447 :         redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
     164                 :             :       }
     165                 :             : 
     166                 :    58093447 :   e = redirect_edge_succ_nodup (e, dest);
     167                 :             : 
     168                 :    58093447 :   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                 :     2933164 : flush_pending_stmts (edge e)
     177                 :             : {
     178                 :     2933164 :   gphi *phi;
     179                 :     2933164 :   edge_var_map *vm;
     180                 :     2933164 :   int i;
     181                 :     2933164 :   gphi_iterator gsi;
     182                 :             : 
     183                 :     2933164 :   vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
     184                 :     2933164 :   if (!v)
     185                 :      312658 :     return;
     186                 :             : 
     187                 :     2620506 :   for (gsi = gsi_start_phis (e->dest), i = 0;
     188                 :     7486485 :        !gsi_end_p (gsi) && v->iterate (i, &vm);
     189                 :     4865979 :        gsi_next (&gsi), i++)
     190                 :             :     {
     191                 :     4865979 :       tree def;
     192                 :             : 
     193                 :     4865979 :       phi = gsi.phi ();
     194                 :     4865979 :       def = redirect_edge_var_map_def (vm);
     195                 :     4865979 :       add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
     196                 :             :     }
     197                 :             : 
     198                 :     2620506 :   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                 :          61 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
     222                 :             : {
     223                 :          61 :   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                 :          61 :   gimple_set_lhs (stmt, nlhs);
     233                 :          61 : }
     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                 :   300226358 : target_for_debug_bind (tree var)
     244                 :             : {
     245                 :   300228446 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     246                 :             :     return NULL_TREE;
     247                 :             : 
     248                 :   280577908 :   if (TREE_CODE (var) == SSA_NAME)
     249                 :             :     {
     250                 :    14051712 :       var = SSA_NAME_VAR (var);
     251                 :             :       if (var == NULL_TREE)
     252                 :             :         return NULL_TREE;
     253                 :             :     }
     254                 :             : 
     255                 :   232958561 :   if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
     256                 :   288535544 :       && TREE_CODE (var) != PARM_DECL)
     257                 :             :     return NULL_TREE;
     258                 :             : 
     259                 :   232735683 :   if (DECL_HAS_VALUE_EXPR_P (var))
     260                 :        2088 :     return target_for_debug_bind (DECL_VALUE_EXPR (var));
     261                 :             : 
     262                 :   232733595 :   if (DECL_IGNORED_P (var))
     263                 :             :     return NULL_TREE;
     264                 :             : 
     265                 :             :   /* var-tracking only tracks registers.  */
     266                 :   211351612 :   if (!is_gimple_reg_type (TREE_TYPE (var)))
     267                 :     8619294 :     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                 :     9965410 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
     277                 :             : {
     278                 :     9965410 :   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
     279                 :             : 
     280                 :     9965410 :   if (wi && wi->is_lhs)
     281                 :             :     return NULL_TREE;
     282                 :             : 
     283                 :     9948881 :   if (TREE_CODE (*tp) == SSA_NAME)
     284                 :             :     {
     285                 :     1595367 :       if (SSA_NAME_IN_FREE_LIST (*tp))
     286                 :             :         return *tp;
     287                 :             : 
     288                 :     1590334 :       *walk_subtrees = 0;
     289                 :             :     }
     290                 :     8353514 :   else if (IS_TYPE_OR_DECL_P (*tp))
     291                 :       21743 :     *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                 :    80932315 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
     302                 :             : {
     303                 :    80932315 :   imm_use_iterator imm_iter;
     304                 :    80932315 :   use_operand_p use_p;
     305                 :    80932315 :   gimple *stmt;
     306                 :    80932315 :   gimple *def_stmt = NULL;
     307                 :    80932315 :   int usecount = 0;
     308                 :    80932315 :   tree value = NULL;
     309                 :             : 
     310                 :    80932315 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     311                 :    77875450 :     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                 :    80932315 :   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                 :    88584242 :   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
     321                 :             :     {
     322                 :     9044089 :       stmt = USE_STMT (use_p);
     323                 :             : 
     324                 :     9044089 :       if (!gimple_debug_bind_p (stmt))
     325                 :     5588533 :         continue;
     326                 :             : 
     327                 :     3455556 :       if (usecount++)
     328                 :             :         break;
     329                 :             : 
     330                 :     3056865 :       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                 :             :     }
     339                 :             : 
     340                 :    80541374 :   if (!usecount)
     341                 :             :     return;
     342                 :             : 
     343                 :     3056865 :   if (gsi)
     344                 :     2738120 :     def_stmt = gsi_stmt (*gsi);
     345                 :             :   else
     346                 :      318745 :     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                 :     3056865 :   if (gimple_code (def_stmt) == GIMPLE_PHI)
     352                 :             :     {
     353                 :      131623 :       value = degenerate_phi_result (as_a <gphi *> (def_stmt));
     354                 :      131623 :       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
     355                 :          44 :         value = NULL;
     356                 :             :       /* error_mark_node is what fixup_noreturn_call changes PHI arguments
     357                 :             :          to.  */
     358                 :      131579 :       else if (value == error_mark_node)
     359                 :           0 :         value = NULL;
     360                 :             :     }
     361                 :     2925242 :   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                 :     1257141 :     value = NULL;
     366                 :     1668101 :   else if (is_gimple_assign (def_stmt))
     367                 :             :     {
     368                 :     1644100 :       bool no_value = false;
     369                 :             : 
     370                 :     1644100 :       if (!dom_info_available_p (CDI_DOMINATORS))
     371                 :             :         {
     372                 :       21518 :           struct walk_stmt_info wi;
     373                 :             : 
     374                 :       21518 :           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                 :       18395 :           if ((!gsi && !gimple_bb (def_stmt))
     403                 :       39913 :               || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
     404                 :        4989 :             no_value = true;
     405                 :             :         }
     406                 :             : 
     407                 :       21518 :       if (!no_value)
     408                 :     1639111 :         value = gimple_assign_rhs_to_tree (def_stmt);
     409                 :             :     }
     410                 :             : 
     411                 :     3056865 :   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                 :     1663667 :       if (usecount == 1
     427                 :      912611 :           || gimple_code (def_stmt) == GIMPLE_PHI
     428                 :      908011 :           || CONSTANT_CLASS_P (value)
     429                 :     2568692 :           || is_gimple_reg (value))
     430                 :             :         ;
     431                 :             :       else
     432                 :             :         {
     433                 :      903724 :           gdebug *def_temp;
     434                 :      903724 :           tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
     435                 :             : 
     436                 :      903724 :           def_temp = gimple_build_debug_bind (vexpr,
     437                 :             :                                               unshare_expr (value),
     438                 :             :                                               def_stmt);
     439                 :             : 
     440                 :             :           /* FIXME: Is setting the mode really necessary? */
     441                 :      903724 :           if (DECL_P (value))
     442                 :        7240 :             SET_DECL_MODE (vexpr, DECL_MODE (value));
     443                 :             :           else
     444                 :      896484 :             SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
     445                 :             : 
     446                 :      903724 :           if (gsi)
     447                 :      740492 :             gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
     448                 :             :           else
     449                 :             :             {
     450                 :      163232 :               gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
     451                 :      163232 :               gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
     452                 :             :             }
     453                 :             : 
     454                 :      903724 :           value = vexpr;
     455                 :             :         }
     456                 :             :     }
     457                 :             : 
     458                 :     8307775 :   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
     459                 :             :     {
     460                 :     5250910 :       if (!gimple_debug_bind_p (stmt))
     461                 :      712343 :         continue;
     462                 :             : 
     463                 :     4538567 :       if (value)
     464                 :             :         {
     465                 :     9113239 :           FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
     466                 :     3037866 :             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                 :     3037507 :           if (TREE_CODE (value) != DEBUG_EXPR_DECL)
     470                 :             :             {
     471                 :      774375 :               gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
     472                 :      774375 :               fold_stmt_inplace (&gsi);
     473                 :             :             }
     474                 :             :         }
     475                 :             :       else
     476                 :     1501060 :         gimple_debug_bind_reset_value (stmt);
     477                 :             : 
     478                 :     4538567 :       update_stmt (stmt);
     479                 :     3056865 :     }
     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                 :   145646670 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
     489                 :             : {
     490                 :   145646670 :   gimple *stmt;
     491                 :   145646670 :   ssa_op_iter op_iter;
     492                 :   145646670 :   def_operand_p def_p;
     493                 :             : 
     494                 :   145646670 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     495                 :    41060516 :     return;
     496                 :             : 
     497                 :   104586154 :   stmt = gsi_stmt (*gsi);
     498                 :             : 
     499                 :   241411258 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     500                 :             :     {
     501                 :    32238950 :       tree var = DEF_FROM_PTR (def_p);
     502                 :             : 
     503                 :    32238950 :       if (TREE_CODE (var) != SSA_NAME)
     504                 :      109931 :         continue;
     505                 :             : 
     506                 :    32129019 :       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                 :        6224 : reset_debug_uses (gimple *stmt)
     514                 :             : {
     515                 :        6224 :   ssa_op_iter op_iter;
     516                 :        6224 :   def_operand_p def_p;
     517                 :        6224 :   imm_use_iterator imm_iter;
     518                 :        6224 :   gimple *use_stmt;
     519                 :             : 
     520                 :        6224 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     521                 :         252 :     return;
     522                 :             : 
     523                 :       15842 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     524                 :             :     {
     525                 :        3898 :       tree var = DEF_FROM_PTR (def_p);
     526                 :             : 
     527                 :        3898 :       if (TREE_CODE (var) != SSA_NAME)
     528                 :           0 :         continue;
     529                 :             : 
     530                 :        8208 :       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
     531                 :             :         {
     532                 :        4310 :           if (!gimple_debug_bind_p (use_stmt))
     533                 :        4270 :             continue;
     534                 :             : 
     535                 :          40 :           gimple_debug_bind_reset_value (use_stmt);
     536                 :          40 :           update_stmt (use_stmt);
     537                 :        3898 :         }
     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                 :      225954 : release_defs_bitset (bitmap toremove)
     547                 :             : {
     548                 :      225954 :   unsigned j;
     549                 :      225954 :   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                 :      225954 :   auto_vec<tree, 16> names;
     559                 :      225954 :   names.reserve (bitmap_count_bits (toremove) + 1);
     560                 :      225954 :   names.quick_push (NULL_TREE);
     561                 :     2548417 :   EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
     562                 :     2322463 :     names.quick_push (ssa_name (j));
     563                 :             : 
     564                 :      225954 :   bitmap_tree_view (toremove);
     565                 :      698117 :   while (!bitmap_empty_p (toremove))
     566                 :             :     {
     567                 :      246209 :       j = names.length () - 1;
     568                 :     3322201 :       for (unsigned i = names.length () - 1; names[i];)
     569                 :             :         {
     570                 :     3075992 :           bool remove_now = true;
     571                 :     3075992 :           tree var = names[i];
     572                 :     3075992 :           gimple *stmt;
     573                 :     3075992 :           imm_use_iterator uit;
     574                 :             : 
     575                 :     3697689 :           FOR_EACH_IMM_USE_STMT (stmt, uit, var)
     576                 :             :             {
     577                 :     1375226 :               ssa_op_iter dit;
     578                 :     1375226 :               def_operand_p def_p;
     579                 :             : 
     580                 :             :               /* We can't propagate PHI nodes into debug stmts.  */
     581                 :     1375226 :               if (gimple_code (stmt) == GIMPLE_PHI
     582                 :     1375226 :                   || is_gimple_debug (stmt))
     583                 :      621697 :                 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                 :      753529 :               FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
     590                 :             :                 {
     591                 :      753529 :                   tree odef = DEF_FROM_PTR (def_p);
     592                 :             : 
     593                 :      753529 :                   if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
     594                 :             :                     {
     595                 :             :                       remove_now = false;
     596                 :             :                       break;
     597                 :             :                     }
     598                 :             :                 }
     599                 :             : 
     600                 :      753529 :               if (!remove_now)
     601                 :             :                 break;
     602                 :     3075992 :             }
     603                 :             : 
     604                 :     3075992 :           if (remove_now)
     605                 :             :             {
     606                 :     2322463 :               gimple *def = SSA_NAME_DEF_STMT (var);
     607                 :     2322463 :               gimple_stmt_iterator gsi = gsi_for_stmt (def);
     608                 :             : 
     609                 :     2322463 :               if (gimple_code (def) == GIMPLE_PHI)
     610                 :      576743 :                 remove_phi_node (&gsi, true);
     611                 :             :               else
     612                 :             :                 {
     613                 :     1745720 :                   gsi_remove (&gsi, true);
     614                 :     1745720 :                   release_defs (def);
     615                 :             :                 }
     616                 :     2322463 :               bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
     617                 :             :             }
     618                 :             :           else
     619                 :      753529 :             --i;
     620                 :     3075992 :           if (--j != i)
     621                 :     2899242 :             names[i] = names[j];
     622                 :             :         }
     623                 :             :     }
     624                 :      225954 :   bitmap_list_view (toremove);
     625                 :      225954 : }
     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                 :  2757771717 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
     640                 :             : {
     641                 :  2757771717 :   bool err = false;
     642                 :             : 
     643                 :  2757771717 :   if (!bitmap_set_bit (visited, bb->index))
     644                 :             :     return false;
     645                 :             : 
     646                 :             :   /* Pick up the single virtual PHI def.  */
     647                 :  2099542950 :   gphi *phi = NULL;
     648                 :  2723278453 :   for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
     649                 :   623735503 :        gsi_next (&si))
     650                 :             :     {
     651                 :   623735503 :       tree res = gimple_phi_result (si.phi ());
     652                 :  1543929492 :       if (virtual_operand_p (res))
     653                 :             :         {
     654                 :   296458486 :           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                 :  2099542950 :   if (phi)
     666                 :             :     {
     667                 :   296458486 :       current_vdef = gimple_phi_result (phi);
     668                 :   296458486 :       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                 : 14911304055 :   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
     678                 : 10712218155 :        gsi_next (&gsi))
     679                 :             :     {
     680                 : 10712218155 :       gimple *stmt = gsi_stmt (gsi);
     681                 : 15577095524 :       tree vuse = gimple_vuse (stmt);
     682                 :  4808184194 :       if (vuse)
     683                 :             :         {
     684                 :  3226671919 :           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                 : 13938890074 :           tree vdef = gimple_vdef (stmt);
     694                 :  3226671919 :           if (vdef)
     695                 :             :             {
     696                 :  2008803968 :               current_vdef = vdef;
     697                 :  2008803968 :               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                 :  2099542950 :   edge_iterator ei;
     709                 :  2099542950 :   edge e;
     710                 :  4650575506 :   FOR_EACH_EDGE (e, ei, bb->succs)
     711                 :             :     {
     712                 :  2551032556 :       gphi *phi = get_virtual_phi (e->dest);
     713                 :  2551032556 :       if (phi
     714                 :  2551032556 :           && 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                 :  2551032556 :       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                 : 12699053164 : verify_ssa_name (tree ssa_name, bool is_virtual)
     739                 :             : {
     740                 : 12699053164 :   if (TREE_CODE (ssa_name) != SSA_NAME)
     741                 :             :     {
     742                 :           0 :       error ("expected an SSA_NAME object");
     743                 :           0 :       return true;
     744                 :             :     }
     745                 :             : 
     746                 : 12699053164 :   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                 : 12699053164 :   if (SSA_NAME_VAR (ssa_name) != NULL_TREE
     753                 :  7624693580 :       && 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                 : 12699053164 :   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                 : 12699053164 :   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                 : 12699053164 :   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                 : 12699053164 :   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
     778                 : 12699053164 :       && !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                 :  5400439473 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
     801                 :             :             gimple *stmt, bool is_virtual)
     802                 :             : {
     803                 :  5400439473 :   if (verify_ssa_name (ssa_name, is_virtual))
     804                 :           0 :     goto err;
     805                 :             : 
     806                 :  5400439473 :   if (SSA_NAME_VAR (ssa_name)
     807                 :  2976174535 :       && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
     808                 :         106 :       && 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                 :  5400439473 :   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                 :  5400439473 :   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
     822                 :             : 
     823                 :  5400439473 :   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                 : 10150951813 : 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                 : 10150951813 :   bool err = false;
     864                 : 10150951813 :   tree ssa_name = USE_FROM_PTR (use_p);
     865                 :             : 
     866                 : 10150951813 :   if (!TREE_VISITED (ssa_name))
     867                 :  5760517817 :     if (verify_imm_links (stderr, ssa_name))
     868                 : 10150951813 :       err = true;
     869                 :             : 
     870                 : 10150951813 :   TREE_VISITED (ssa_name) = 1;
     871                 :             : 
     872                 : 10150951813 :   if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
     873                 : 10150951813 :       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
     874                 :             :     ; /* Default definitions have empty statements.  Nothing to do.  */
     875                 :  8718882836 :   else if (!def_bb)
     876                 :             :     {
     877                 :           0 :       error ("missing definition");
     878                 :           0 :       err = true;
     879                 :             :     }
     880                 :  8718882836 :   else if (bb != def_bb
     881                 :  8718882836 :            && !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                 :  8718882836 :   else if (bb == def_bb
     888                 :  8718882836 :            && names_defined_in_bb != NULL
     889                 : 13976252533 :            && !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                 : 10150951813 :   if (check_abnormal
     896                 : 10158341161 :       && !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                 : 10150951813 :   if (use_p->prev == NULL)
     905                 :             :     {
     906                 :           0 :       error ("no immediate_use list");
     907                 :           0 :       err = true;
     908                 :             :     }
     909                 :             :   else
     910                 :             :     {
     911                 : 10150951813 :       tree listvar;
     912                 : 10150951813 :       if (use_p->prev->use == NULL)
     913                 :  5760517817 :         listvar = use_p->prev->loc.ssa_name;
     914                 :             :       else
     915                 :  4390433996 :         listvar = USE_FROM_PTR (use_p->prev);
     916                 : 10150951813 :       if (listvar != ssa_name)
     917                 :             :         {
     918                 :           0 :           error ("wrong immediate use list");
     919                 :           0 :           err = true;
     920                 :             :         }
     921                 :             :     }
     922                 :             : 
     923                 : 10150951813 :   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                 : 10150951813 :   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                 :   623746438 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
     945                 :             : {
     946                 :   623746438 :   edge e;
     947                 :   623746438 :   bool err = false;
     948                 :   623746438 :   size_t i, phi_num_args = gimple_phi_num_args (phi);
     949                 :             : 
     950                 :  1247492876 :   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                 :  2158821964 :   for (i = 0; i < phi_num_args; i++)
     958                 :             :     {
     959                 :  1535075526 :       use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
     960                 :  1535075526 :       tree op = USE_FROM_PTR (op_p);
     961                 :             : 
     962                 :  1535075526 :       e = EDGE_PRED (bb, i);
     963                 :             : 
     964                 :  1535075526 :       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                 :  1535075526 :       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                 :  1535075526 :       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                 :  1535075526 :       if (TREE_CODE (op) == SSA_NAME)
     986                 :             :         {
     987                 :  2660231366 :           err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
     988                 :  1330115683 :           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
     989                 :  1330115683 :                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
     990                 :             :         }
     991                 :             : 
     992                 :  1535075526 :       if (TREE_CODE (op) == ADDR_EXPR)
     993                 :             :         {
     994                 :    10878913 :           tree base = TREE_OPERAND (op, 0);
     995                 :    14581180 :           while (handled_component_p (base))
     996                 :     3702267 :             base = TREE_OPERAND (base, 0);
     997                 :    10878913 :           if ((VAR_P (base)
     998                 :             :                || TREE_CODE (base) == PARM_DECL
     999                 :             :                || TREE_CODE (base) == RESULT_DECL)
    1000                 :     4885753 :               && !TREE_ADDRESSABLE (base))
    1001                 :             :             {
    1002                 :           0 :               error ("address taken, but ADDRESSABLE bit not set");
    1003                 :           0 :               err = true;
    1004                 :             :             }
    1005                 :             :         }
    1006                 :             : 
    1007                 :  1535075526 :       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                 :  1535075526 :       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                 :   623746438 : error:
    1023                 :   623746438 :   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                 :   623746438 :   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                 :   206839058 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
    1039                 :             : {
    1040                 :   206839058 :   basic_block bb;
    1041                 :   413678116 :   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
    1042                 :   206839058 :   ssa_op_iter iter;
    1043                 :   206839058 :   tree op;
    1044                 :   206839058 :   enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
    1045                 :   206839058 :   auto_bitmap names_defined_in_bb;
    1046                 :             : 
    1047                 :   206839058 :   gcc_assert (!need_ssa_update_p (cfun));
    1048                 :             : 
    1049                 :   206839058 :   timevar_push (TV_TREE_SSA_VERIFY);
    1050                 :             : 
    1051                 :   206839058 :     {
    1052                 :             :       /* Keep track of SSA names present in the IL.  */
    1053                 :   206839058 :       size_t i;
    1054                 :   206839058 :       tree name;
    1055                 :   206839058 :       hash_map <void *, tree> ssa_info;
    1056                 :             : 
    1057                 :  7777479328 :       FOR_EACH_SSA_NAME (i, name, cfun)
    1058                 :             :         {
    1059                 :  5968498008 :           gimple *stmt;
    1060                 :  5968498008 :           TREE_VISITED (name) = 0;
    1061                 :             : 
    1062                 : 11936996016 :           verify_ssa_name (name, virtual_operand_p (name));
    1063                 :             : 
    1064                 :  5968498008 :           stmt = SSA_NAME_DEF_STMT (name);
    1065                 :  5968498008 :           if (!gimple_nop_p (stmt))
    1066                 :             :             {
    1067                 :  5400439473 :               basic_block bb = gimple_bb (stmt);
    1068                 :  5400439473 :               if (verify_def (bb, definition_block,
    1069                 :  5400439473 :                               name, stmt, virtual_operand_p (name)))
    1070                 :           0 :                 goto err;
    1071                 :             :             }
    1072                 :             : 
    1073                 :  5968498008 :           void *info = NULL;
    1074                 :  5968498008 :           if (POINTER_TYPE_P (TREE_TYPE (name)))
    1075                 :  1050069414 :             info = SSA_NAME_PTR_INFO (name);
    1076                 :  4918428594 :           else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
    1077                 :  2057728453 :             info = SSA_NAME_RANGE_INFO (name);
    1078                 :  5968498008 :           if (info)
    1079                 :             :             {
    1080                 :  1253655387 :               bool existed;
    1081                 :  1253655387 :               tree &val = ssa_info.get_or_insert (info, &existed);
    1082                 :  1253655387 :               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                 :  1253655387 :                 val = name;
    1093                 :             :             }
    1094                 :             :         }
    1095                 :           0 :     }
    1096                 :             : 
    1097                 :   206839058 :   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                 :  1897060291 :   FOR_EACH_BB_FN (bb, cfun)
    1102                 :             :     {
    1103                 :  1690221233 :       edge e;
    1104                 :  1690221233 :       edge_iterator ei;
    1105                 :             : 
    1106                 :             :       /* Make sure that all edges have a clear 'aux' field.  */
    1107                 :  4038532966 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1108                 :             :         {
    1109                 :  2348311733 :           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                 :  2313967671 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
    1119                 :             :         {
    1120                 :   623746438 :           gphi *phi = gsi.phi ();
    1121                 :   623746438 :           if (verify_phi_args (phi, bb, definition_block))
    1122                 :           0 :             goto err;
    1123                 :             : 
    1124                 :   623746438 :           bitmap_set_bit (names_defined_in_bb,
    1125                 :   623746438 :                           SSA_NAME_VERSION (gimple_phi_result (phi)));
    1126                 :             :         }
    1127                 :             : 
    1128                 :             :       /* Now verify all the uses and vuses in every statement of the block.  */
    1129                 : 14092810880 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1130                 : 10712368414 :            gsi_next (&gsi))
    1131                 :             :         {
    1132                 : 10712368414 :           gimple *stmt = gsi_stmt (gsi);
    1133                 : 10712368414 :           use_operand_p use_p;
    1134                 :             : 
    1135                 : 21361282678 :           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                 : 10712368414 :           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                 : 10712368414 :           if (gimple_debug_bind_p (stmt)
    1150                 :  5098357611 :               && !gimple_debug_bind_has_value_p (stmt))
    1151                 :  1612757919 :             continue;
    1152                 :             : 
    1153                 : 17920446625 :           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
    1154                 :             :             {
    1155                 :  8820836130 :               op = USE_FROM_PTR (use_p);
    1156                 :  8820836130 :               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                 : 13865834346 :           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
    1162                 :             :             {
    1163                 :  4766223851 :               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                 :  4766223851 :               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
    1174                 :             :             }
    1175                 :             :         }
    1176                 :             : 
    1177                 :  1690221233 :       bitmap_clear (names_defined_in_bb);
    1178                 :             :     }
    1179                 :             : 
    1180                 :   206839058 :   free (definition_block);
    1181                 :             : 
    1182                 :   206839058 :   if (gimple_vop (cfun)
    1183                 :   206839058 :       && ssa_default_def (cfun, gimple_vop (cfun)))
    1184                 :             :     {
    1185                 :   206739161 :       auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
    1186                 :   206739161 :       bitmap_clear (visited);
    1187                 :   206739161 :       if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
    1188                 :             :                        ssa_default_def (cfun, gimple_vop (cfun)), visited))
    1189                 :           0 :         goto err;
    1190                 :   206739161 :     }
    1191                 :             : 
    1192                 :             :   /* Restore the dominance information to its prior known state, so
    1193                 :             :      that we do not perturb the compiler's subsequent behavior.  */
    1194                 :   206839058 :   if (orig_dom_state == DOM_NONE)
    1195                 :    65351308 :     free_dominance_info (CDI_DOMINATORS);
    1196                 :             :   else
    1197                 :   141487750 :     set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
    1198                 :             : 
    1199                 :   206839058 :   timevar_pop (TV_TREE_SSA_VERIFY);
    1200                 :   206839058 :   return;
    1201                 :             : 
    1202                 :           0 : err:
    1203                 :           0 :   internal_error ("verify_ssa failed");
    1204                 :   206839058 : }
    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                 :     3032726 : init_tree_ssa (struct function *fn, int size)
    1215                 :             : {
    1216                 :     3032726 :   fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
    1217                 :     3032726 :   fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
    1218                 :     3032726 :   pt_solution_reset (&fn->gimple_df->escaped);
    1219                 :     3032726 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1220                 :     3032726 :   init_ssanames (fn, size);
    1221                 :     3032726 : }
    1222                 :             : 
    1223                 :             : /* Deallocate memory associated with SSA data structures for FNDECL.  */
    1224                 :             : 
    1225                 :             : void
    1226                 :     2928225 : delete_tree_ssa (struct function *fn)
    1227                 :             : {
    1228                 :     2928225 :   fini_ssanames (fn);
    1229                 :             : 
    1230                 :             :   /* We no longer maintain the SSA operand cache at this point.  */
    1231                 :     2928225 :   if (ssa_operands_active (fn))
    1232                 :     2906730 :     fini_ssa_operands (fn);
    1233                 :             : 
    1234                 :     2928225 :   fn->gimple_df->default_defs->empty ();
    1235                 :     2928225 :   fn->gimple_df->default_defs = NULL;
    1236                 :     2928225 :   pt_solution_reset (&fn->gimple_df->escaped);
    1237                 :     2928225 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1238                 :     2928225 :   if (fn->gimple_df->decls_to_pointers != NULL)
    1239                 :       40368 :     delete fn->gimple_df->decls_to_pointers;
    1240                 :     2928225 :   fn->gimple_df->decls_to_pointers = NULL;
    1241                 :     2928225 :   fn->gimple_df = NULL;
    1242                 :             : 
    1243                 :             :   /* We no longer need the edge variable maps.  */
    1244                 :     2928225 :   redirect_edge_var_map_empty ();
    1245                 :     2928225 : }
    1246                 :             : 
    1247                 :             : /* Return true if EXPR is a useless type conversion, otherwise return
    1248                 :             :    false.  */
    1249                 :             : 
    1250                 :             : bool
    1251                 :   895086216 : tree_ssa_useless_type_conversion (tree expr)
    1252                 :             : {
    1253                 :   895086216 :   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                 :   895086216 :   if (!CONVERT_EXPR_P (expr)
    1260                 :   827252807 :       && TREE_CODE (expr) != VIEW_CONVERT_EXPR
    1261                 :   826187448 :       && TREE_CODE (expr) != NON_LVALUE_EXPR)
    1262                 :             :     return false;
    1263                 :             : 
    1264                 :    69407191 :   outer_type = TREE_TYPE (expr);
    1265                 :    69407191 :   inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
    1266                 :             : 
    1267                 :    69407191 :   if (inner_type == error_mark_node)
    1268                 :             :     return false;
    1269                 :             : 
    1270                 :    69407128 :   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                 :   863387696 : tree_ssa_strip_useless_type_conversions (tree exp)
    1279                 :             : {
    1280                 :   882710001 :   while (tree_ssa_useless_type_conversion (exp))
    1281                 :    19322305 :     exp = TREE_OPERAND (exp, 0);
    1282                 :   863387696 :   return exp;
    1283                 :             : }
    1284                 :             : 
    1285                 :             : /* Return true if T, as SSA_NAME, has an implicit default defined value.  */
    1286                 :             : 
    1287                 :             : bool
    1288                 :   341777084 : ssa_defined_default_def_p (tree t)
    1289                 :             : {
    1290                 :   341777084 :   tree var = SSA_NAME_VAR (t);
    1291                 :             : 
    1292                 :   136155566 :   if (!var)
    1293                 :             :     ;
    1294                 :             :   /* Parameters get their initial value from the function entry.  */
    1295                 :   136155566 :   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                 :   106960204 :   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                 :   106778398 :   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                 :   341539407 : ssa_undefined_value_p (tree t, bool partial)
    1314                 :             : {
    1315                 :   341539407 :   gimple *def_stmt;
    1316                 :             : 
    1317                 :   683078814 :   gcc_checking_assert (!virtual_operand_p (t));
    1318                 :             : 
    1319                 :   341539407 :   if (ssa_defined_default_def_p (t))
    1320                 :             :     return false;
    1321                 :             : 
    1322                 :             :   /* The value is undefined iff its definition statement is empty.  */
    1323                 :   312162239 :   def_stmt = SSA_NAME_DEF_STMT (t);
    1324                 :   312162239 :   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                 :   306131581 :   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                 :    48994911 :   if (partial && is_gimple_assign (def_stmt)
    1357                 :   343645254 :       && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
    1358                 :    37234048 :           || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
    1359                 :             :     {
    1360                 :      604396 :       tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
    1361                 :      604396 :       if (TREE_CODE (real_imag_part) == SSA_NAME
    1362                 :      604396 :          && 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                 :    48994837 :   if (partial && is_gimple_assign (def_stmt)
    1369                 :   343645106 :       && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
    1370                 :             :     {
    1371                 :       17157 :       tree rhs1, rhs2;
    1372                 :             : 
    1373                 :       17157 :       rhs1 = gimple_assign_rhs1 (def_stmt);
    1374                 :       17157 :       rhs2 = gimple_assign_rhs2 (def_stmt);
    1375                 :       16730 :       return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
    1376                 :       33846 :              || (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                 :      313118 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
    1389                 :             : {
    1390                 :      313118 :   imm_use_iterator iter;
    1391                 :      313118 :   use_operand_p use_p;
    1392                 :      921852 :   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
    1393                 :             :     {
    1394                 :      632918 :       if (is_a <gphi *> (USE_STMT (use_p))
    1395                 :      632918 :           || is_gimple_debug (USE_STMT (use_p)))
    1396                 :      570522 :         continue;
    1397                 :       62396 :       basic_block dombb = gimple_bb (USE_STMT (use_p));
    1398                 :       62396 :       if (dominated_by_p (CDI_DOMINATORS, bb, dombb))
    1399                 :             :         return true;
    1400                 :             :     }
    1401                 :             : 
    1402                 :             :   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                 :    11153068 : mark_ssa_maybe_undefs (void)
    1410                 :             : {
    1411                 :    11153068 :   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                 :    11153068 :   unsigned int i;
    1417                 :    11153068 :   tree var;
    1418                 :   513231724 :   FOR_EACH_SSA_NAME (i, var, cfun)
    1419                 :             :     {
    1420                 :   347886896 :       if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
    1421                 :   347886896 :           || !ssa_undefined_value_p (var, false))
    1422                 :   343838517 :         ssa_name_set_maybe_undef (var, false);
    1423                 :             :       else
    1424                 :             :         {
    1425                 :     4048379 :           ssa_name_set_maybe_undef (var);
    1426                 :     4048379 :           queue.safe_push (var);
    1427                 :     4048379 :           if (dump_file && (dump_flags & TDF_DETAILS))
    1428                 :          34 :             fprintf (dump_file, "marking _%i as maybe-undef\n",
    1429                 :          17 :                      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                 :    16526578 :   while (!queue.is_empty ())
    1436                 :             :     {
    1437                 :     4334362 :       var = queue.pop ();
    1438                 :     4334362 :       imm_use_iterator iter;
    1439                 :     4334362 :       use_operand_p use_p;
    1440                 :     5606953 :       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                 :     1272591 :           if (!is_a <gphi *> (USE_STMT (use_p)))
    1448                 :      986608 :             continue;
    1449                 :      485320 :           gphi *phi = as_a <gphi *> (USE_STMT (use_p));
    1450                 :             : 
    1451                 :      485320 :           tree def = gimple_phi_result (phi);
    1452                 :      485320 :           if (ssa_name_maybe_undef_p (def))
    1453                 :      180226 :             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                 :      305094 :           int idx = phi_arg_index_from_use (use_p);
    1462                 :      305094 :           basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
    1463                 :      305094 :           if (ssa_name_any_use_dominates_bb_p (var, bb))
    1464                 :       19111 :             continue;
    1465                 :             : 
    1466                 :      285983 :           ssa_name_set_maybe_undef (def);
    1467                 :      285983 :           queue.safe_push (def);
    1468                 :      285983 :           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                 :             :         }
    1472                 :             :     }
    1473                 :    11153068 : }
    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                 :    23096743 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
    1481                 :             : {
    1482                 :    23096743 :   tree sym;
    1483                 :             : 
    1484                 :    26237727 :   while (handled_component_p (*tp))
    1485                 :     3140984 :     tp = &TREE_OPERAND (*tp, 0);
    1486                 :    23096743 :   if (TREE_CODE (*tp) == MEM_REF
    1487                 :     1626266 :       && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
    1488                 :      264144 :       && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
    1489                 :      264144 :       && DECL_P (sym)
    1490                 :      263732 :       && !TREE_ADDRESSABLE (sym)
    1491                 :      141642 :       && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    1492                 :       50696 :       && is_gimple_reg_type (TREE_TYPE (*tp))
    1493                 :    23147427 :       && ! VOID_TYPE_P (TREE_TYPE (*tp)))
    1494                 :             :     {
    1495                 :       50684 :       if (VECTOR_TYPE_P (TREE_TYPE (sym))
    1496                 :         779 :           && useless_type_conversion_p (TREE_TYPE (*tp),
    1497                 :         779 :                                         TREE_TYPE (TREE_TYPE (sym)))
    1498                 :       50768 :           && 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                 :       50601 :       else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
    1508                 :        1007 :                && useless_type_conversion_p (TREE_TYPE (*tp),
    1509                 :        1007 :                                              TREE_TYPE (TREE_TYPE (sym)))
    1510                 :       50606 :                && (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                 :       50597 :       else if (integer_zerop (TREE_OPERAND (*tp, 1))
    1519                 :       50597 :                && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
    1520                 :             :         {
    1521                 :       50240 :           if (!useless_type_conversion_p (TREE_TYPE (*tp),
    1522                 :       50240 :                                           TREE_TYPE (sym)))
    1523                 :       13398 :             *tp = build1 (VIEW_CONVERT_EXPR,
    1524                 :       13398 :                           TREE_TYPE (*tp), sym);
    1525                 :             :           else
    1526                 :       36842 :             *tp = sym;
    1527                 :             :         }
    1528                 :         357 :       else if (DECL_SIZE (sym)
    1529                 :         357 :                && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
    1530                 :         357 :                && (known_subrange_p
    1531                 :         357 :                    (mem_ref_offset (*tp),
    1532                 :         357 :                     wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
    1533                 :         357 :                     0, wi::to_offset (DECL_SIZE_UNIT (sym))))
    1534                 :         357 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp))
    1535                 :         343 :                    || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
    1536                 :         686 :                        == TYPE_PRECISION (TREE_TYPE (*tp))))
    1537                 :         357 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
    1538                 :         167 :                    || type_has_mode_precision_p (TREE_TYPE (sym)))
    1539                 :         714 :                && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
    1540                 :         714 :                                   BITS_PER_UNIT) == 0)
    1541                 :             :         {
    1542                 :         714 :           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
    1543                 :         357 :                         TYPE_SIZE (TREE_TYPE (*tp)),
    1544                 :         714 :                         wide_int_to_tree (bitsizetype,
    1545                 :         357 :                                           mem_ref_offset (*tp)
    1546                 :         714 :                                           << LOG2_BITS_PER_UNIT));
    1547                 :             :         }
    1548                 :             :     }
    1549                 :    23096743 : }
    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                 :   274546881 : non_rewritable_mem_ref_base (tree ref)
    1556                 :             : {
    1557                 :   274546881 :   tree base;
    1558                 :             : 
    1559                 :             :   /* A plain decl does not need it set.  */
    1560                 :   274546881 :   if (DECL_P (ref))
    1561                 :             :     return NULL_TREE;
    1562                 :             : 
    1563                 :   246315116 :   switch (TREE_CODE (ref))
    1564                 :             :     {
    1565                 :     2446185 :     case REALPART_EXPR:
    1566                 :     2446185 :     case IMAGPART_EXPR:
    1567                 :     2446185 :     case BIT_FIELD_REF:
    1568                 :     2446185 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1569                 :             :         return NULL_TREE;
    1570                 :             :       break;
    1571                 :     2354288 :     case VIEW_CONVERT_EXPR:
    1572                 :     2354288 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1573                 :             :         {
    1574                 :     1093837 :           if (TYPE_SIZE (TREE_TYPE (ref))
    1575                 :     1093837 :               != TYPE_SIZE (TREE_TYPE (TREE_OPERAND  (ref, 0))))
    1576                 :         719 :             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                 :   244761485 :     default:;
    1583                 :             :     }
    1584                 :             : 
    1585                 :   244761485 :   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                 :   244761485 :   if (TREE_CODE (base) == MEM_REF
    1590                 :   244761485 :       && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
    1591                 :             :     {
    1592                 :     4787555 :       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
    1593                 :     4787555 :       if (! DECL_P (decl))
    1594                 :             :         return NULL_TREE;
    1595                 :     4753565 :       if (! is_gimple_reg_type (TREE_TYPE (base))
    1596                 :     4614363 :           || VOID_TYPE_P (TREE_TYPE (base))
    1597                 :     9367928 :           || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
    1598                 :             :         return decl;
    1599                 :     4613490 :       if ((VECTOR_TYPE_P (TREE_TYPE (decl))
    1600                 :     4612386 :            || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
    1601                 :        2407 :           && useless_type_conversion_p (TREE_TYPE (base),
    1602                 :        2407 :                                         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                 :     4613704 :           && 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                 :     4613278 :       if (integer_zerop (TREE_OPERAND (base, 1))
    1611                 :     4613278 :           && 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                 :     4206621 :       if (DECL_SIZE (decl)
    1615                 :     4202315 :           && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
    1616                 :     4202315 :           && (known_subrange_p
    1617                 :     4202315 :               (mem_ref_offset (base),
    1618                 :     4202315 :                wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
    1619                 :     4202315 :                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                 :     4200418 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
    1625                 :     2433165 :               || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
    1626                 :     4866330 :                   == 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                 :     4196206 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1630                 :       38391 :               || type_has_mode_precision_p (TREE_TYPE (decl)))
    1631                 :     8369551 :           && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
    1632                 :     8325860 :                              BITS_PER_UNIT) == 0)
    1633                 :     4162930 :         return NULL_TREE;
    1634                 :       43691 :       return decl;
    1635                 :             :     }
    1636                 :             : 
    1637                 :             :   /* We cannot rewrite a decl in the base.  */
    1638                 :   239973930 :   base = get_base_address (ref);
    1639                 :   239973930 :   if (DECL_P (base))
    1640                 :             :     return base;
    1641                 :             : 
    1642                 :             :   /* We cannot rewrite TARGET_MEM_REFs.  */
    1643                 :   220159503 :   else if (TREE_CODE (base) == TARGET_MEM_REF
    1644                 :   220159503 :            && 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                 :    96827915 : non_rewritable_lvalue_p (tree lhs)
    1660                 :             : {
    1661                 :             :   /* A plain decl is always rewritable.  */
    1662                 :    96827915 :   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                 :    58610751 :   if ((TREE_CODE (lhs) == REALPART_EXPR
    1668                 :    58610751 :        || TREE_CODE (lhs) == IMAGPART_EXPR)
    1669                 :    58610751 :       && 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                 :    58580864 :   if (TREE_CODE (lhs) == MEM_REF
    1675                 :    58580864 :       && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
    1676                 :             :     {
    1677                 :     7013184 :       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                 :     7013184 :       if (integer_zerop (TREE_OPERAND (lhs, 1))
    1682                 :     2981075 :           && DECL_P (decl)
    1683                 :     2981075 :           && 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                 :     1559784 :           && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1687                 :        9522 :                || compare_tree_int (DECL_SIZE (decl),
    1688                 :        9522 :                                     TYPE_PRECISION (TREE_TYPE (decl))) == 0)
    1689                 :         805 :               || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
    1690                 :         784 :                   && (TYPE_PRECISION (TREE_TYPE (decl))
    1691                 :         784 :                       >= 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                 :     1559659 :           && (! FLOAT_TYPE_P (TREE_TYPE (decl))
    1695                 :        5318 :               || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
    1696                 :     8568223 :           && (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                 :     5458803 :       if (DECL_P (decl)
    1702                 :     5458797 :           && VECTOR_TYPE_P (TREE_TYPE (decl))
    1703                 :        1732 :           && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
    1704                 :         270 :           && known_ge (mem_ref_offset (lhs), 0)
    1705                 :         235 :           && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
    1706                 :             :                        mem_ref_offset (lhs))
    1707                 :         235 :           && multiple_p (mem_ref_offset (lhs),
    1708                 :         235 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
    1709                 :    10917600 :           && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
    1710                 :             :                        wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
    1711                 :             :         {
    1712                 :         234 :           poly_uint64 lhs_bits, nelts;
    1713                 :         234 :           if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
    1714                 :         236 :               && multiple_p (lhs_bits,
    1715                 :             :                              tree_to_uhwi
    1716                 :         234 :                                (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
    1717                 :             :                              &nelts)
    1718                 :         254 :               && valid_vector_subparts_p (nelts))
    1719                 :             :             {
    1720                 :         214 :               if (known_eq (nelts, 1u))
    1721                 :         214 :                 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                 :             :                                               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                 :    57026269 :   if (TREE_CODE (lhs) == BIT_FIELD_REF
    1735                 :       18617 :       && DECL_P (TREE_OPERAND (lhs, 0))
    1736                 :       13247 :       && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    1737                 :       13188 :       && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    1738                 :        1440 :       && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    1739                 :        1440 :                           TYPE_SIZE_UNIT
    1740                 :             :                             (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
    1741                 :    57027703 :       && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    1742                 :        1434 :           % 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                 :    99180953 : 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                 :    99180953 :   if (is_global_var (var)
    1758                 :    97641853 :       || TREE_CODE (var) == RESULT_DECL
    1759                 :   196822806 :       || bitmap_bit_p (addresses_taken, DECL_UID (var)))
    1760                 :     9765806 :     return;
    1761                 :             : 
    1762                 :    89415147 :   bool maybe_reg = false;
    1763                 :    89415147 :   if (TREE_ADDRESSABLE (var))
    1764                 :             :     {
    1765                 :     1378221 :       TREE_ADDRESSABLE (var) = 0;
    1766                 :     1378221 :       maybe_reg = true;
    1767                 :     1378221 :       if (dump_file)
    1768                 :             :         {
    1769                 :          67 :           fprintf (dump_file, "No longer having address taken: ");
    1770                 :          67 :           print_generic_expr (dump_file, var);
    1771                 :          67 :           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                 :    89415147 :   if (is_gimple_reg_type (TREE_TYPE (var)))
    1780                 :             :     {
    1781                 :    74543267 :       if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
    1782                 :             :         {
    1783                 :       31694 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1784                 :       31694 :           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                 :    74511573 :       else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
    1792                 :       36506 :                && (cfun->curr_properties & PROP_gimple_lbitint) != 0
    1793                 :    74528685 :                && 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                 :        1120 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1798                 :        1120 :           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                 :    74510453 :       else if (DECL_NOT_GIMPLE_REG_P (var))
    1806                 :             :         {
    1807                 :        7497 :           maybe_reg = true;
    1808                 :        7497 :           DECL_NOT_GIMPLE_REG_P (var) = 0;
    1809                 :             :         }
    1810                 :    74543267 :       if (maybe_reg)
    1811                 :             :         {
    1812                 :      509823 :           if (is_gimple_reg (var))
    1813                 :             :             {
    1814                 :      503114 :               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                 :      503114 :               bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
    1821                 :             :             }
    1822                 :             :           else
    1823                 :        6709 :             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                 :    54420892 : is_asan_mark_p (gimple *stmt)
    1833                 :             : {
    1834                 :    54420892 :   if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
    1835                 :             :     return false;
    1836                 :             : 
    1837                 :       43888 :   tree addr = get_base_address (gimple_call_arg (stmt, 1));
    1838                 :       43888 :   if (TREE_CODE (addr) == ADDR_EXPR
    1839                 :       43888 :       && VAR_P (TREE_OPERAND (addr, 0)))
    1840                 :             :     {
    1841                 :       43684 :       tree var = TREE_OPERAND (addr, 0);
    1842                 :       43684 :       if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
    1843                 :       43684 :                             DECL_ATTRIBUTES (var)))
    1844                 :             :         return false;
    1845                 :             : 
    1846                 :       39634 :       unsigned addressable = TREE_ADDRESSABLE (var);
    1847                 :       39634 :       TREE_ADDRESSABLE (var) = 0;
    1848                 :       39634 :       bool r = is_gimple_reg (var);
    1849                 :       39634 :       TREE_ADDRESSABLE (var) = addressable;
    1850                 :       39634 :       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                 :    11706325 : execute_update_addresses_taken (void)
    1861                 :             : {
    1862                 :    11706325 :   basic_block bb;
    1863                 :    11706325 :   auto_bitmap addresses_taken;
    1864                 :    11706325 :   auto_bitmap not_reg_needs;
    1865                 :    11706325 :   auto_bitmap suitable_for_renaming;
    1866                 :    11706325 :   bool optimistic_not_addressable = false;
    1867                 :    11706325 :   tree var;
    1868                 :    11706325 :   unsigned i;
    1869                 :             : 
    1870                 :    11706325 :   timevar_push (TV_ADDRESS_TAKEN);
    1871                 :             : 
    1872                 :             :   /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
    1873                 :             :      the function body.  */
    1874                 :   114131575 :   FOR_EACH_BB_FN (bb, cfun)
    1875                 :             :     {
    1876                 :   923295708 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1877                 :   718445208 :            gsi_next (&gsi))
    1878                 :             :         {
    1879                 :   718445208 :           gimple *stmt = gsi_stmt (gsi);
    1880                 :   718445208 :           enum gimple_code code = gimple_code (stmt);
    1881                 :   718445208 :           tree decl;
    1882                 :             : 
    1883                 :   718445208 :           if (code == GIMPLE_CALL)
    1884                 :             :             {
    1885                 :    51995516 :               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                 :        5865 :                   tree arg = gimple_call_arg (stmt, 1);
    1892                 :        5865 :                   gimple_call_set_arg (stmt, 1, null_pointer_node);
    1893                 :        5865 :                   gimple_ior_addresses_taken (addresses_taken, stmt);
    1894                 :        5865 :                   gimple_call_set_arg (stmt, 1, arg);
    1895                 :             :                   /* Remember we have to check again below.  */
    1896                 :        5865 :                   optimistic_not_addressable = true;
    1897                 :             :                 }
    1898                 :    51989651 :               else if (is_asan_mark_p (stmt)
    1899                 :    51989651 :                        || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
    1900                 :             :                 ;
    1901                 :             :               else
    1902                 :    51979785 :                 gimple_ior_addresses_taken (addresses_taken, stmt);
    1903                 :             :             }
    1904                 :             :           else
    1905                 :             :             /* Note all addresses taken by the stmt.  */
    1906                 :   666449692 :             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                 :   718445208 :           if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
    1911                 :             :             {
    1912                 :   295165549 :               tree lhs = gimple_get_lhs (stmt);
    1913                 :   295165549 :               if (lhs
    1914                 :   263890615 :                   && TREE_CODE (lhs) != SSA_NAME
    1915                 :   392002502 :                   && ((code == GIMPLE_CALL && ! DECL_P (lhs))
    1916                 :    96728728 :                       || non_rewritable_lvalue_p (lhs)))
    1917                 :             :                 {
    1918                 :    57122978 :                   decl = get_base_address (lhs);
    1919                 :    57122978 :                   if (DECL_P (decl))
    1920                 :    40037621 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1921                 :             :                 }
    1922                 :             :             }
    1923                 :             : 
    1924                 :   718445208 :           if (gimple_assign_single_p (stmt))
    1925                 :             :             {
    1926                 :   164352676 :               tree rhs = gimple_assign_rhs1 (stmt);
    1927                 :   164352676 :               if ((decl = non_rewritable_mem_ref_base (rhs)))
    1928                 :    19887369 :                 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1929                 :             :             }
    1930                 :             : 
    1931                 :   554092532 :           else if (code == GIMPLE_CALL)
    1932                 :             :             {
    1933                 :   154940863 :               for (i = 0; i < gimple_call_num_args (stmt); ++i)
    1934                 :             :                 {
    1935                 :   102945347 :                   tree arg = gimple_call_arg (stmt, i);
    1936                 :   102945347 :                   if ((decl = non_rewritable_mem_ref_base (arg)))
    1937                 :       93922 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1938                 :             :                 }
    1939                 :             :             }
    1940                 :             : 
    1941                 :   502097016 :           else if (code == GIMPLE_ASM)
    1942                 :             :             {
    1943                 :      694664 :               gasm *asm_stmt = as_a <gasm *> (stmt);
    1944                 :     1297975 :               for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    1945                 :             :                 {
    1946                 :      603311 :                   tree link = gimple_asm_output_op (asm_stmt, i);
    1947                 :      603311 :                   tree lhs = TREE_VALUE (link);
    1948                 :      603311 :                   if (TREE_CODE (lhs) != SSA_NAME)
    1949                 :             :                     {
    1950                 :      151315 :                       decl = get_base_address (lhs);
    1951                 :      151315 :                       if (DECL_P (decl)
    1952                 :      151315 :                           && (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                 :       89105 :                               || !useless_type_conversion_p
    1957                 :       89105 :                                     (TREE_TYPE (lhs), TREE_TYPE (decl))))
    1958                 :       10612 :                         bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1959                 :             :                     }
    1960                 :             :                 }
    1961                 :     1088769 :               for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    1962                 :             :                 {
    1963                 :      394105 :                   tree link = gimple_asm_input_op (asm_stmt, i);
    1964                 :      394105 :                   if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
    1965                 :        1094 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1966                 :             :                 }
    1967                 :             :             }
    1968                 :             :         }
    1969                 :             : 
    1970                 :   137914474 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
    1971                 :    35489224 :            gsi_next (&gsi))
    1972                 :             :         {
    1973                 :    35489224 :           size_t i;
    1974                 :    35489224 :           gphi *phi = gsi.phi ();
    1975                 :             : 
    1976                 :   124391817 :           for (i = 0; i < gimple_phi_num_args (phi); i++)
    1977                 :             :             {
    1978                 :    88902593 :               tree op = PHI_ARG_DEF (phi, i), var;
    1979                 :    88902593 :               if (TREE_CODE (op) == ADDR_EXPR
    1980                 :      725140 :                   && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
    1981                 :    89627733 :                   && DECL_P (var))
    1982                 :      529677 :                 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                 :    36491780 :   for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
    1991                 :    24785455 :     maybe_optimize_var (var, addresses_taken, not_reg_needs,
    1992                 :             :                         suitable_for_renaming);
    1993                 :             : 
    1994                 :    86101823 :   FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
    1995                 :    74395498 :     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                 :    11706325 :   if (!bitmap_empty_p (suitable_for_renaming)
    2001                 :    11706325 :       || optimistic_not_addressable)
    2002                 :             :     {
    2003                 :     5573400 :       FOR_EACH_BB_FN (bb, cfun)
    2004                 :    47701183 :         for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
    2005                 :             :           {
    2006                 :    36939265 :             gimple *stmt = gsi_stmt (gsi);
    2007                 :             : 
    2008                 :             :             /* Re-write TARGET_MEM_REFs of symbols we want to
    2009                 :             :                rewrite into SSA form.  */
    2010                 :    36939265 :             if (gimple_assign_single_p (stmt))
    2011                 :             :               {
    2012                 :    11915930 :                 tree lhs = gimple_assign_lhs (stmt);
    2013                 :    11915930 :                 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
    2014                 :    11915930 :                 tree sym;
    2015                 :             : 
    2016                 :             :                 /* Rewrite LHS IMAG/REALPART_EXPR similar to
    2017                 :             :                    gimplify_modify_expr_complex_part.  */
    2018                 :    11915930 :                 if ((TREE_CODE (lhs) == IMAGPART_EXPR
    2019                 :    11915930 :                      || TREE_CODE (lhs) == REALPART_EXPR)
    2020                 :        1944 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2021                 :    11917387 :                     && bitmap_bit_p (suitable_for_renaming,
    2022                 :        1457 :                                      DECL_UID (TREE_OPERAND (lhs, 0))))
    2023                 :             :                   {
    2024                 :        1381 :                     tree other = make_ssa_name (TREE_TYPE (lhs));
    2025                 :        2074 :                     tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
    2026                 :             :                                         ? REALPART_EXPR : IMAGPART_EXPR,
    2027                 :        1381 :                                         TREE_TYPE (other),
    2028                 :        1381 :                                         TREE_OPERAND (lhs, 0));
    2029                 :        1381 :                     suppress_warning (lrhs);
    2030                 :        1381 :                     gimple *load = gimple_build_assign (other, lrhs);
    2031                 :        1381 :                     location_t loc = gimple_location (stmt);
    2032                 :        1381 :                     gimple_set_location (load, loc);
    2033                 :        2762 :                     gimple_set_vuse (load, gimple_vuse (stmt));
    2034                 :        1381 :                     gsi_insert_before (&gsi, load, GSI_SAME_STMT);
    2035                 :        1381 :                     gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
    2036                 :        1381 :                     gimple_assign_set_rhs_with_ops
    2037                 :        2074 :                       (&gsi, COMPLEX_EXPR,
    2038                 :             :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2039                 :         693 :                        ? other : gimple_assign_rhs1 (stmt),
    2040                 :        1381 :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2041                 :         688 :                        ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
    2042                 :        1381 :                     stmt = gsi_stmt (gsi);
    2043                 :        1381 :                     unlink_stmt_vdef (stmt);
    2044                 :        1381 :                     update_stmt (stmt);
    2045                 :        1381 :                     continue;
    2046                 :        1381 :                   }
    2047                 :             : 
    2048                 :             :                 /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
    2049                 :             :                    into a BIT_INSERT_EXPR.  */
    2050                 :    11914549 :                 if (TREE_CODE (lhs) == BIT_FIELD_REF
    2051                 :         736 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2052                 :         680 :                     && bitmap_bit_p (suitable_for_renaming,
    2053                 :         680 :                                      DECL_UID (TREE_OPERAND (lhs, 0)))
    2054                 :         570 :                     && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    2055                 :         570 :                     && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    2056                 :         570 :                     && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    2057                 :         570 :                                         TYPE_SIZE_UNIT (TREE_TYPE
    2058                 :             :                                           (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
    2059                 :             :                                         0)
    2060                 :    11915119 :                     && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    2061                 :         570 :                         % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
    2062                 :             :                   {
    2063                 :         570 :                     tree var = TREE_OPERAND (lhs, 0);
    2064                 :         570 :                     tree val = gimple_assign_rhs1 (stmt);
    2065                 :         570 :                     if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
    2066                 :         570 :                                               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                 :         570 :                     tree bitpos = TREE_OPERAND (lhs, 2);
    2077                 :         570 :                     gimple_assign_set_lhs (stmt, var);
    2078                 :         570 :                     gimple_assign_set_rhs_with_ops
    2079                 :         570 :                       (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
    2080                 :         570 :                     stmt = gsi_stmt (gsi);
    2081                 :         570 :                     unlink_stmt_vdef (stmt);
    2082                 :         570 :                     update_stmt (stmt);
    2083                 :         570 :                     continue;
    2084                 :         570 :                   }
    2085                 :             : 
    2086                 :             :                 /* Rewrite a vector insert using a MEM_REF on the LHS
    2087                 :             :                    into a BIT_INSERT_EXPR.  */
    2088                 :    11913979 :                 if (TREE_CODE (lhs) == MEM_REF
    2089                 :      613784 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2090                 :      208712 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2091                 :      208712 :                     && DECL_P (sym)
    2092                 :      208712 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    2093                 :        6423 :                     && VECTOR_TYPE_P (TREE_TYPE (sym))
    2094                 :         133 :                     && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
    2095                 :             :                     /* If it is a full replacement we can do better below.  */
    2096                 :         131 :                     && maybe_ne (wi::to_poly_offset
    2097                 :         131 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
    2098                 :             :                                  wi::to_poly_offset
    2099                 :         131 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
    2100                 :          79 :                     && known_ge (mem_ref_offset (lhs), 0)
    2101                 :          79 :                     && known_gt (wi::to_poly_offset
    2102                 :             :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
    2103                 :             :                                  mem_ref_offset (lhs))
    2104                 :    11914058 :                     && multiple_p (mem_ref_offset (lhs),
    2105                 :             :                                    wi::to_poly_offset
    2106                 :    11913979 :                                      (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
    2107                 :             :                   {
    2108                 :          79 :                     tree val = gimple_assign_rhs1 (stmt);
    2109                 :          79 :                     if (! types_compatible_p (TREE_TYPE (val),
    2110                 :          79 :                                               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                 :          79 :                     tree bitpos
    2133                 :          79 :                       = wide_int_to_tree (bitsizetype,
    2134                 :          79 :                                           mem_ref_offset (lhs) * BITS_PER_UNIT);
    2135                 :          79 :                     gimple_assign_set_lhs (stmt, sym);
    2136                 :          79 :                     gimple_assign_set_rhs_with_ops
    2137                 :          79 :                       (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
    2138                 :          79 :                     stmt = gsi_stmt (gsi);
    2139                 :          79 :                     unlink_stmt_vdef (stmt);
    2140                 :          79 :                     update_stmt (stmt);
    2141                 :          79 :                     continue;
    2142                 :          79 :                   }
    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                 :    11913910 :                 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
    2148                 :          10 :                   lhs = TREE_OPERAND (lhs, 0);
    2149                 :    11913900 :                 if (TREE_CODE (lhs) == MEM_REF
    2150                 :      613710 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2151                 :      208633 :                     && integer_zerop (TREE_OPERAND (lhs, 1))
    2152                 :      139151 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2153                 :      139151 :                     && DECL_P (sym)
    2154                 :      139151 :                     && !TREE_ADDRESSABLE (sym)
    2155                 :    11980283 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
    2156                 :             :                   lhs = sym;
    2157                 :             :                 else
    2158                 :    11907556 :                   lhs = gimple_assign_lhs (stmt);
    2159                 :             : 
    2160                 :             :                 /* Rewrite the RHS and make sure the resulting assignment
    2161                 :             :                    is validly typed.  */
    2162                 :    11913900 :                 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
    2163                 :    11913900 :                 rhs = gimple_assign_rhs1 (stmt);
    2164                 :    11913900 :                 if (gimple_assign_lhs (stmt) != lhs
    2165                 :    11920244 :                     && !useless_type_conversion_p (TREE_TYPE (lhs),
    2166                 :        6344 :                                                    TREE_TYPE (rhs)))
    2167                 :             :                   {
    2168                 :        3367 :                     if (gimple_clobber_p (stmt))
    2169                 :             :                       {
    2170                 :           5 :                         rhs = build_constructor (TREE_TYPE (lhs), NULL);
    2171                 :           5 :                         TREE_THIS_VOLATILE (rhs) = 1;
    2172                 :             :                       }
    2173                 :             :                     else
    2174                 :        3362 :                       rhs = fold_build1 (VIEW_CONVERT_EXPR,
    2175                 :             :                                          TREE_TYPE (lhs), rhs);
    2176                 :             :                   }
    2177                 :    11913900 :                 if (gimple_assign_lhs (stmt) != lhs)
    2178                 :        6344 :                   gimple_assign_set_lhs (stmt, lhs);
    2179                 :             : 
    2180                 :    11913900 :                 if (gimple_assign_rhs1 (stmt) != rhs)
    2181                 :             :                   {
    2182                 :        3367 :                     gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
    2183                 :        3367 :                     gimple_assign_set_rhs_from_tree (&gsi, rhs);
    2184                 :             :                   }
    2185                 :             :               }
    2186                 :             : 
    2187                 :    25023335 :             else if (gimple_code (stmt) == GIMPLE_CALL)
    2188                 :             :               {
    2189                 :     2437106 :                 unsigned i;
    2190                 :     2437106 :                 if (optimize_atomic_compare_exchange_p (stmt))
    2191                 :             :                   {
    2192                 :        5865 :                     tree expected = gimple_call_arg (stmt, 1);
    2193                 :        5865 :                     tree decl = TREE_OPERAND (expected, 0);
    2194                 :        5865 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2195                 :             :                       {
    2196                 :        5758 :                         fold_builtin_atomic_compare_exchange (&gsi);
    2197                 :        5758 :                         continue;
    2198                 :             :                       }
    2199                 :         107 :                     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                 :     2431241 :                 else if (is_asan_mark_p (stmt))
    2207                 :             :                   {
    2208                 :         404 :                     tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
    2209                 :         404 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
    2210                 :             :                       {
    2211                 :         356 :                         unlink_stmt_vdef (stmt);
    2212                 :         356 :                         if (asan_mark_p (stmt, ASAN_MARK_POISON))
    2213                 :             :                           {
    2214                 :         183 :                             gcall *call
    2215                 :         183 :                               = gimple_build_call_internal (IFN_ASAN_POISON, 0);
    2216                 :         183 :                             gimple_call_set_lhs (call, var);
    2217                 :         183 :                             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                 :         173 :                             tree clobber = build_clobber (TREE_TYPE (var));
    2225                 :         173 :                             gimple *g = gimple_build_assign (var, clobber);
    2226                 :         173 :                             gsi_replace (&gsi, g, true);
    2227                 :             :                           }
    2228                 :         356 :                         continue;
    2229                 :         356 :                       }
    2230                 :             :                   }
    2231                 :     2430837 :                 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                 :     6712026 :                 for (i = 0; i < gimple_call_num_args (stmt); ++i)
    2244                 :             :                   {
    2245                 :     4281034 :                     tree *argp = gimple_call_arg_ptr (stmt, i);
    2246                 :     4281034 :                     maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
    2247                 :             :                   }
    2248                 :             :               }
    2249                 :             : 
    2250                 :    22586229 :             else if (gimple_code (stmt) == GIMPLE_ASM)
    2251                 :             :               {
    2252                 :        9519 :                 gasm *asm_stmt = as_a <gasm *> (stmt);
    2253                 :        9519 :                 unsigned i;
    2254                 :       43876 :                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    2255                 :             :                   {
    2256                 :       34357 :                     tree link = gimple_asm_output_op (asm_stmt, i);
    2257                 :       34357 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2258                 :             :                                                 suitable_for_renaming);
    2259                 :             :                   }
    2260                 :       22218 :                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    2261                 :             :                   {
    2262                 :       12699 :                     tree link = gimple_asm_input_op (asm_stmt, i);
    2263                 :       12699 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2264                 :             :                                                 suitable_for_renaming);
    2265                 :             :                   }
    2266                 :             :               }
    2267                 :             : 
    2268                 :    22576710 :             else if (gimple_debug_bind_p (stmt)
    2269                 :    17169071 :                      && gimple_debug_bind_has_value_p (stmt))
    2270                 :             :               {
    2271                 :     6854753 :                 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
    2272                 :     6854753 :                 tree decl;
    2273                 :     6854753 :                 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
    2274                 :     6854753 :                 decl = non_rewritable_mem_ref_base (*valuep);
    2275                 :     6854753 :                 if (decl
    2276                 :     6854753 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2277                 :          12 :                   gimple_debug_bind_reset_value (stmt);
    2278                 :             :               }
    2279                 :             : 
    2280                 :    49802794 :             if (gimple_references_memory_p (stmt)
    2281                 :    32144125 :                 || is_gimple_debug (stmt))
    2282                 :    21956067 :               update_stmt (stmt);
    2283                 :             : 
    2284                 :    36931121 :             gsi_next (&gsi);
    2285                 :             :           }
    2286                 :             : 
    2287                 :             :       /* Update SSA form here, we are called as non-pass as well.  */
    2288                 :      192441 :       if (number_of_loops (cfun) > 1
    2289                 :      192441 :           && loops_state_satisfies_p (LOOP_CLOSED_SSA))
    2290                 :          60 :         rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
    2291                 :             :       else
    2292                 :      192381 :         update_ssa (TODO_update_ssa);
    2293                 :             :     }
    2294                 :             : 
    2295                 :    11706325 :   timevar_pop (TV_ADDRESS_TAKEN);
    2296                 :    11706325 : }
    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.1-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.