LCOV - code coverage report
Current view: top level - gcc - tree-ssa.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 86.3 % 1091 941
Test Date: 2024-04-20 14:03:02 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                 :     7338816 : redirect_edge_var_map_add (edge e, tree result, tree def, location_t locus)
      56                 :             : {
      57                 :     7338816 :   edge_var_map new_node;
      58                 :             : 
      59                 :     7338816 :   if (edge_var_maps == NULL)
      60                 :       62109 :     edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
      61                 :             : 
      62                 :     7338816 :   auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
      63                 :     7338816 :   new_node.def = def;
      64                 :     7338816 :   new_node.result = result;
      65                 :     7338816 :   new_node.locus = locus;
      66                 :             : 
      67                 :     7338816 :   slot.safe_push (new_node);
      68                 :     7338816 : }
      69                 :             : 
      70                 :             : 
      71                 :             : /* Clear the var mappings in edge E.  */
      72                 :             : 
      73                 :             : void
      74                 :   118615060 : redirect_edge_var_map_clear (edge e)
      75                 :             : {
      76                 :   118615060 :   if (!edge_var_maps)
      77                 :             :     return;
      78                 :             : 
      79                 :   104785636 :   auto_vec<edge_var_map> *head = edge_var_maps->get (e);
      80                 :             : 
      81                 :   104785636 :   if (head)
      82                 :     6309651 :     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                 :      306536 : redirect_edge_var_map_dup (edge newe, edge olde)
      94                 :             : {
      95                 :      306536 :   if (!edge_var_maps)
      96                 :             :     return;
      97                 :             : 
      98                 :      281980 :   auto_vec<edge_var_map> *new_head = &edge_var_maps->get_or_insert (newe);
      99                 :      281980 :   auto_vec<edge_var_map> *old_head = edge_var_maps->get (olde);
     100                 :      281980 :   if (!old_head)
     101                 :             :     return;
     102                 :             : 
     103                 :        3332 :   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                 :     4554582 : redirect_edge_var_map_vector (edge e)
     112                 :             : {
     113                 :             :   /* Hey, what kind of idiot would... you'd be surprised.  */
     114                 :     4554582 :   if (!edge_var_maps)
     115                 :             :     return NULL;
     116                 :             : 
     117                 :     4541196 :   auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
     118                 :     4541196 :   if (!slot)
     119                 :             :     return NULL;
     120                 :             : 
     121                 :             :   return slot;
     122                 :             : }
     123                 :             : 
     124                 :             : /* Clear the edge variable mappings.  */
     125                 :             : 
     126                 :             : void
     127                 :   769608765 : redirect_edge_var_map_empty (void)
     128                 :             : {
     129                 :   769608765 :   if (edge_var_maps)
     130                 :   222405802 :     edge_var_maps->empty ();
     131                 :   769608765 : }
     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                 :    55245709 : ssa_redirect_edge (edge e, basic_block dest)
     141                 :             : {
     142                 :    55245709 :   gphi_iterator gsi;
     143                 :    55245709 :   gphi *phi;
     144                 :             : 
     145                 :    55245709 :   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                 :    55245709 :   if (! (e->dest->flags & BB_DUPLICATED))
     151                 :    61343800 :     for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi); gsi_next (&gsi))
     152                 :             :       {
     153                 :     7496777 :         tree def;
     154                 :     7496777 :         location_t locus;
     155                 :             : 
     156                 :     7496777 :         phi = gsi.phi ();
     157                 :     7496777 :         def = gimple_phi_arg_def (phi, e->dest_idx);
     158                 :     7496777 :         locus = gimple_phi_arg_location (phi, e->dest_idx);
     159                 :             : 
     160                 :     7496777 :         if (def == NULL_TREE)
     161                 :     1184643 :           continue;
     162                 :             : 
     163                 :     6312134 :         redirect_edge_var_map_add (e, gimple_phi_result (phi), def, locus);
     164                 :             :       }
     165                 :             : 
     166                 :    55245709 :   e = redirect_edge_succ_nodup (e, dest);
     167                 :             : 
     168                 :    55245709 :   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                 :     2756510 : flush_pending_stmts (edge e)
     177                 :             : {
     178                 :     2756510 :   gphi *phi;
     179                 :     2756510 :   edge_var_map *vm;
     180                 :     2756510 :   int i;
     181                 :     2756510 :   gphi_iterator gsi;
     182                 :             : 
     183                 :     2756510 :   vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
     184                 :     2756510 :   if (!v)
     185                 :      279089 :     return;
     186                 :             : 
     187                 :     2477421 :   for (gsi = gsi_start_phis (e->dest), i = 0;
     188                 :     7154373 :        !gsi_end_p (gsi) && v->iterate (i, &vm);
     189                 :     4676952 :        gsi_next (&gsi), i++)
     190                 :             :     {
     191                 :     4676952 :       tree def;
     192                 :             : 
     193                 :     4676952 :       phi = gsi.phi ();
     194                 :     4676952 :       def = redirect_edge_var_map_def (vm);
     195                 :     4676952 :       add_phi_arg (phi, def, e, redirect_edge_var_map_location (vm));
     196                 :             :     }
     197                 :             : 
     198                 :     2477421 :   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                 :          65 : gimple_replace_ssa_lhs (gimple *stmt, tree nlhs)
     222                 :             : {
     223                 :          65 :   if (MAY_HAVE_DEBUG_BIND_STMTS)
     224                 :             :     {
     225                 :           1 :       tree lhs = gimple_get_lhs (stmt);
     226                 :             : 
     227                 :           1 :       gcc_assert (SSA_NAME_DEF_STMT (lhs) == stmt);
     228                 :             : 
     229                 :           1 :       insert_debug_temp_for_var_def (NULL, lhs);
     230                 :             :     }
     231                 :             : 
     232                 :          65 :   gimple_set_lhs (stmt, nlhs);
     233                 :          65 : }
     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                 :   289863200 : target_for_debug_bind (tree var)
     244                 :             : {
     245                 :   289865173 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     246                 :             :     return NULL_TREE;
     247                 :             : 
     248                 :   270607963 :   if (TREE_CODE (var) == SSA_NAME)
     249                 :             :     {
     250                 :    13746232 :       var = SSA_NAME_VAR (var);
     251                 :             :       if (var == NULL_TREE)
     252                 :             :         return NULL_TREE;
     253                 :             :     }
     254                 :             : 
     255                 :   223922447 :   if ((!VAR_P (var) || VAR_DECL_IS_VIRTUAL_OPERAND (var))
     256                 :   278085840 :       && TREE_CODE (var) != PARM_DECL)
     257                 :             :     return NULL_TREE;
     258                 :             : 
     259                 :   223736708 :   if (DECL_HAS_VALUE_EXPR_P (var))
     260                 :        1973 :     return target_for_debug_bind (DECL_VALUE_EXPR (var));
     261                 :             : 
     262                 :   223734735 :   if (DECL_IGNORED_P (var))
     263                 :             :     return NULL_TREE;
     264                 :             : 
     265                 :             :   /* var-tracking only tracks registers.  */
     266                 :   203482303 :   if (!is_gimple_reg_type (TREE_TYPE (var)))
     267                 :     8155362 :     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                 :     7368445 : find_released_ssa_name (tree *tp, int *walk_subtrees, void *data_)
     277                 :             : {
     278                 :     7368445 :   struct walk_stmt_info *wi = (struct walk_stmt_info *) data_;
     279                 :             : 
     280                 :     7368445 :   if (wi && wi->is_lhs)
     281                 :             :     return NULL_TREE;
     282                 :             : 
     283                 :     7317405 :   if (TREE_CODE (*tp) == SSA_NAME)
     284                 :             :     {
     285                 :     1234404 :       if (SSA_NAME_IN_FREE_LIST (*tp))
     286                 :             :         return *tp;
     287                 :             : 
     288                 :     1230025 :       *walk_subtrees = 0;
     289                 :             :     }
     290                 :     6083001 :   else if (IS_TYPE_OR_DECL_P (*tp))
     291                 :       73396 :     *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                 :    77595252 : insert_debug_temp_for_var_def (gimple_stmt_iterator *gsi, tree var)
     302                 :             : {
     303                 :    77595252 :   imm_use_iterator imm_iter;
     304                 :    77595252 :   use_operand_p use_p;
     305                 :    77595252 :   gimple *stmt;
     306                 :    77595252 :   gimple *def_stmt = NULL;
     307                 :    77595252 :   int usecount = 0;
     308                 :    77595252 :   tree value = NULL;
     309                 :             : 
     310                 :    77595252 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     311                 :    74779931 :     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                 :    77595252 :   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                 :    84451187 :   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var)
     321                 :             :     {
     322                 :     8056511 :       stmt = USE_STMT (use_p);
     323                 :             : 
     324                 :     8056511 :       if (!gimple_debug_bind_p (stmt))
     325                 :     4889937 :         continue;
     326                 :             : 
     327                 :     3166574 :       if (usecount++)
     328                 :             :         break;
     329                 :             : 
     330                 :     2815321 :       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                 :    77261563 :   if (!usecount)
     341                 :             :     return;
     342                 :             : 
     343                 :     2815321 :   if (gsi)
     344                 :     2510701 :     def_stmt = gsi_stmt (*gsi);
     345                 :             :   else
     346                 :      304620 :     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                 :     2815321 :   if (gimple_code (def_stmt) == GIMPLE_PHI)
     352                 :             :     {
     353                 :      117246 :       value = degenerate_phi_result (as_a <gphi *> (def_stmt));
     354                 :      117246 :       if (value && walk_tree (&value, find_released_ssa_name, NULL, NULL))
     355                 :          36 :         value = NULL;
     356                 :             :       /* error_mark_node is what fixup_noreturn_call changes PHI arguments
     357                 :             :          to.  */
     358                 :      117210 :       else if (value == error_mark_node)
     359                 :           0 :         value = NULL;
     360                 :             :     }
     361                 :     2698075 :   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                 :     1224462 :     value = NULL;
     366                 :     1473613 :   else if (is_gimple_assign (def_stmt))
     367                 :             :     {
     368                 :     1454417 :       bool no_value = false;
     369                 :             : 
     370                 :     1454417 :       if (!dom_info_available_p (CDI_DOMINATORS))
     371                 :             :         {
     372                 :       55383 :           struct walk_stmt_info wi;
     373                 :             : 
     374                 :       55383 :           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                 :       48374 :           if ((!gsi && !gimple_bb (def_stmt))
     403                 :      103757 :               || walk_gimple_op (def_stmt, find_released_ssa_name, &wi))
     404                 :        4343 :             no_value = true;
     405                 :             :         }
     406                 :             : 
     407                 :       55383 :       if (!no_value)
     408                 :     1450074 :         value = gimple_assign_rhs_to_tree (def_stmt);
     409                 :             :     }
     410                 :             : 
     411                 :     2815321 :   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                 :     1472321 :       if (usecount == 1
     427                 :      791274 :           || gimple_code (def_stmt) == GIMPLE_PHI
     428                 :      786985 :           || CONSTANT_CLASS_P (value)
     429                 :     2256653 :           || is_gimple_reg (value))
     430                 :             :         ;
     431                 :             :       else
     432                 :             :         {
     433                 :      783200 :           gdebug *def_temp;
     434                 :      783200 :           tree vexpr = build_debug_expr_decl (TREE_TYPE (value));
     435                 :             : 
     436                 :      783200 :           def_temp = gimple_build_debug_bind (vexpr,
     437                 :             :                                               unshare_expr (value),
     438                 :             :                                               def_stmt);
     439                 :             : 
     440                 :             :           /* FIXME: Is setting the mode really necessary? */
     441                 :      783200 :           if (DECL_P (value))
     442                 :        7828 :             SET_DECL_MODE (vexpr, DECL_MODE (value));
     443                 :             :           else
     444                 :      775372 :             SET_DECL_MODE (vexpr, TYPE_MODE (TREE_TYPE (value)));
     445                 :             : 
     446                 :      783200 :           if (gsi)
     447                 :      622794 :             gsi_insert_before (gsi, def_temp, GSI_SAME_STMT);
     448                 :             :           else
     449                 :             :             {
     450                 :      160406 :               gimple_stmt_iterator ngsi = gsi_for_stmt (def_stmt);
     451                 :      160406 :               gsi_insert_before (&ngsi, def_temp, GSI_SAME_STMT);
     452                 :             :             }
     453                 :             : 
     454                 :      783200 :           value = vexpr;
     455                 :             :         }
     456                 :             :     }
     457                 :             : 
     458                 :     7441318 :   FOR_EACH_IMM_USE_STMT (stmt, imm_iter, var)
     459                 :             :     {
     460                 :     4625997 :       if (!gimple_debug_bind_p (stmt))
     461                 :      440619 :         continue;
     462                 :             : 
     463                 :     4185378 :       if (value)
     464                 :             :         {
     465                 :     8285749 :           FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
     466                 :     2761973 :             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                 :     2761803 :           if (TREE_CODE (value) != DEBUG_EXPR_DECL)
     470                 :             :             {
     471                 :      701753 :               gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
     472                 :      701753 :               fold_stmt_inplace (&gsi);
     473                 :             :             }
     474                 :             :         }
     475                 :             :       else
     476                 :     1423575 :         gimple_debug_bind_reset_value (stmt);
     477                 :             : 
     478                 :     4185378 :       update_stmt (stmt);
     479                 :     2815321 :     }
     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                 :   137101248 : insert_debug_temps_for_defs (gimple_stmt_iterator *gsi)
     489                 :             : {
     490                 :   137101248 :   gimple *stmt;
     491                 :   137101248 :   ssa_op_iter op_iter;
     492                 :   137101248 :   def_operand_p def_p;
     493                 :             : 
     494                 :   137101248 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     495                 :    39068555 :     return;
     496                 :             : 
     497                 :    98032693 :   stmt = gsi_stmt (*gsi);
     498                 :             : 
     499                 :   226873715 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     500                 :             :     {
     501                 :    30808329 :       tree var = DEF_FROM_PTR (def_p);
     502                 :             : 
     503                 :    30808329 :       if (TREE_CODE (var) != SSA_NAME)
     504                 :      118693 :         continue;
     505                 :             : 
     506                 :    30689636 :       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                 :        5896 : reset_debug_uses (gimple *stmt)
     514                 :             : {
     515                 :        5896 :   ssa_op_iter op_iter;
     516                 :        5896 :   def_operand_p def_p;
     517                 :        5896 :   imm_use_iterator imm_iter;
     518                 :        5896 :   gimple *use_stmt;
     519                 :             : 
     520                 :        5896 :   if (!MAY_HAVE_DEBUG_BIND_STMTS)
     521                 :         248 :     return;
     522                 :             : 
     523                 :       15048 :   FOR_EACH_PHI_OR_STMT_DEF (def_p, stmt, op_iter, SSA_OP_DEF)
     524                 :             :     {
     525                 :        3752 :       tree var = DEF_FROM_PTR (def_p);
     526                 :             : 
     527                 :        3752 :       if (TREE_CODE (var) != SSA_NAME)
     528                 :           0 :         continue;
     529                 :             : 
     530                 :        7926 :       FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, var)
     531                 :             :         {
     532                 :        4174 :           if (!gimple_debug_bind_p (use_stmt))
     533                 :        4113 :             continue;
     534                 :             : 
     535                 :          61 :           gimple_debug_bind_reset_value (use_stmt);
     536                 :          61 :           update_stmt (use_stmt);
     537                 :        3752 :         }
     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                 :      219508 : release_defs_bitset (bitmap toremove)
     547                 :             : {
     548                 :      219508 :   unsigned j;
     549                 :      219508 :   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                 :      219508 :   auto_vec<tree, 16> names;
     559                 :      219508 :   names.reserve (bitmap_count_bits (toremove) + 1);
     560                 :      219508 :   names.quick_push (NULL_TREE);
     561                 :     2378888 :   EXECUTE_IF_SET_IN_BITMAP (toremove, 0, j, bi)
     562                 :     2159380 :     names.quick_push (ssa_name (j));
     563                 :             : 
     564                 :      219508 :   bitmap_tree_view (toremove);
     565                 :      671167 :   while (!bitmap_empty_p (toremove))
     566                 :             :     {
     567                 :      232151 :       j = names.length () - 1;
     568                 :     3066773 :       for (unsigned i = names.length () - 1; names[i];)
     569                 :             :         {
     570                 :     2834622 :           bool remove_now = true;
     571                 :     2834622 :           tree var = names[i];
     572                 :     2834622 :           gimple *stmt;
     573                 :     2834622 :           imm_use_iterator uit;
     574                 :             : 
     575                 :     3383134 :           FOR_EACH_IMM_USE_STMT (stmt, uit, var)
     576                 :             :             {
     577                 :     1223754 :               ssa_op_iter dit;
     578                 :     1223754 :               def_operand_p def_p;
     579                 :             : 
     580                 :             :               /* We can't propagate PHI nodes into debug stmts.  */
     581                 :     1223754 :               if (gimple_code (stmt) == GIMPLE_PHI
     582                 :     1223754 :                   || is_gimple_debug (stmt))
     583                 :      548512 :                 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                 :      675242 :               FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, dit, SSA_OP_DEF)
     590                 :             :                 {
     591                 :      675242 :                   tree odef = DEF_FROM_PTR (def_p);
     592                 :             : 
     593                 :      675242 :                   if (bitmap_bit_p (toremove, SSA_NAME_VERSION (odef)))
     594                 :             :                     {
     595                 :             :                       remove_now = false;
     596                 :             :                       break;
     597                 :             :                     }
     598                 :             :                 }
     599                 :             : 
     600                 :      675242 :               if (!remove_now)
     601                 :             :                 break;
     602                 :     2834622 :             }
     603                 :             : 
     604                 :     2834622 :           if (remove_now)
     605                 :             :             {
     606                 :     2159380 :               gimple *def = SSA_NAME_DEF_STMT (var);
     607                 :     2159380 :               gimple_stmt_iterator gsi = gsi_for_stmt (def);
     608                 :             : 
     609                 :     2159380 :               if (gimple_code (def) == GIMPLE_PHI)
     610                 :      529784 :                 remove_phi_node (&gsi, true);
     611                 :             :               else
     612                 :             :                 {
     613                 :     1629596 :                   gsi_remove (&gsi, true);
     614                 :     1629596 :                   release_defs (def);
     615                 :             :                 }
     616                 :     2159380 :               bitmap_clear_bit (toremove, SSA_NAME_VERSION (var));
     617                 :             :             }
     618                 :             :           else
     619                 :      675242 :             --i;
     620                 :     2834622 :           if (--j != i)
     621                 :     2671585 :             names[i] = names[j];
     622                 :             :         }
     623                 :             :     }
     624                 :      219508 :   bitmap_list_view (toremove);
     625                 :      219508 : }
     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                 :  2672538013 : verify_vssa (basic_block bb, tree current_vdef, sbitmap visited)
     640                 :             : {
     641                 :  2672538013 :   bool err = false;
     642                 :             : 
     643                 :  2672538013 :   if (!bitmap_set_bit (visited, bb->index))
     644                 :             :     return false;
     645                 :             : 
     646                 :             :   /* Pick up the single virtual PHI def.  */
     647                 :  2035918595 :   gphi *phi = NULL;
     648                 :  2629454604 :   for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
     649                 :   593536009 :        gsi_next (&si))
     650                 :             :     {
     651                 :   593536009 :       tree res = gimple_phi_result (si.phi ());
     652                 :  1476655715 :       if (virtual_operand_p (res))
     653                 :             :         {
     654                 :   289583697 :           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                 :  2035918595 :   if (phi)
     666                 :             :     {
     667                 :   289583697 :       current_vdef = gimple_phi_result (phi);
     668                 :   289583697 :       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                 : 14377270030 :   for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
     678                 : 10305432840 :        gsi_next (&gsi))
     679                 :             :     {
     680                 : 10305432840 :       gimple *stmt = gsi_stmt (gsi);
     681                 : 15039102322 :       tree vuse = gimple_vuse (stmt);
     682                 :  4676630326 :       if (vuse)
     683                 :             :         {
     684                 :  3160497611 :           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                 : 13465930451 :           tree vdef = gimple_vdef (stmt);
     694                 :  3160497611 :           if (vdef)
     695                 :             :             {
     696                 :  1972535765 :               current_vdef = vdef;
     697                 :  1972535765 :               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                 :  2035918595 :   edge_iterator ei;
     709                 :  2035918595 :   edge e;
     710                 :  4503144476 :   FOR_EACH_EDGE (e, ei, bb->succs)
     711                 :             :     {
     712                 :  2467225881 :       gphi *phi = get_virtual_phi (e->dest);
     713                 :  2467225881 :       if (phi
     714                 :  2467225881 :           && 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                 :  2467225881 :       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                 : 12353917889 : verify_ssa_name (tree ssa_name, bool is_virtual)
     739                 :             : {
     740                 : 12353917889 :   if (TREE_CODE (ssa_name) != SSA_NAME)
     741                 :             :     {
     742                 :           0 :       error ("expected an SSA_NAME object");
     743                 :           0 :       return true;
     744                 :             :     }
     745                 :             : 
     746                 : 12353917889 :   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                 : 12353917889 :   if (SSA_NAME_VAR (ssa_name) != NULL_TREE
     753                 :  7431082755 :       && 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                 : 12353917889 :   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                 : 12353917889 :   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                 : 12353917889 :   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                 : 12353917889 :   if (SSA_NAME_IS_DEFAULT_DEF (ssa_name)
     778                 : 12353917889 :       && !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                 :  5249196304 : verify_def (basic_block bb, basic_block *definition_block, tree ssa_name,
     801                 :             :             gimple *stmt, bool is_virtual)
     802                 :             : {
     803                 :  5249196304 :   if (verify_ssa_name (ssa_name, is_virtual))
     804                 :           0 :     goto err;
     805                 :             : 
     806                 :  5249196304 :   if (SSA_NAME_VAR (ssa_name)
     807                 :  2891705828 :       && TREE_CODE (SSA_NAME_VAR (ssa_name)) == RESULT_DECL
     808                 :           0 :       && DECL_BY_REFERENCE (SSA_NAME_VAR (ssa_name)))
     809                 :             :     {
     810                 :           0 :       error ("RESULT_DECL should be read only when DECL_BY_REFERENCE is set");
     811                 :           0 :       goto err;
     812                 :             :     }
     813                 :             : 
     814                 :  5249196304 :   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                 :  5249196304 :   definition_block[SSA_NAME_VERSION (ssa_name)] = bb;
     822                 :             : 
     823                 :  5249196304 :   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                 :  9860092810 : 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                 :  9860092810 :   bool err = false;
     864                 :  9860092810 :   tree ssa_name = USE_FROM_PTR (use_p);
     865                 :             : 
     866                 :  9860092810 :   if (!TREE_VISITED (ssa_name))
     867                 :  5602858839 :     if (verify_imm_links (stderr, ssa_name))
     868                 :  9860092810 :       err = true;
     869                 :             : 
     870                 :  9860092810 :   TREE_VISITED (ssa_name) = 1;
     871                 :             : 
     872                 :  9860092810 :   if (gimple_nop_p (SSA_NAME_DEF_STMT (ssa_name))
     873                 :  9860092810 :       && SSA_NAME_IS_DEFAULT_DEF (ssa_name))
     874                 :             :     ; /* Default definitions have empty statements.  Nothing to do.  */
     875                 :  8459274596 :   else if (!def_bb)
     876                 :             :     {
     877                 :           0 :       error ("missing definition");
     878                 :           0 :       err = true;
     879                 :             :     }
     880                 :  8459274596 :   else if (bb != def_bb
     881                 :  8459274596 :            && !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                 :  8459274596 :   else if (bb == def_bb
     888                 :  8459274596 :            && names_defined_in_bb != NULL
     889                 : 13591223464 :            && !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                 :  9860092810 :   if (check_abnormal
     896                 :  9867448193 :       && !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                 :  9860092810 :   if (use_p->prev == NULL)
     905                 :             :     {
     906                 :           0 :       error ("no immediate_use list");
     907                 :           0 :       err = true;
     908                 :             :     }
     909                 :             :   else
     910                 :             :     {
     911                 :  9860092810 :       tree listvar;
     912                 :  9860092810 :       if (use_p->prev->use == NULL)
     913                 :  5602858839 :         listvar = use_p->prev->loc.ssa_name;
     914                 :             :       else
     915                 :  4257233971 :         listvar = USE_FROM_PTR (use_p->prev);
     916                 :  9860092810 :       if (listvar != ssa_name)
     917                 :             :         {
     918                 :           0 :           error ("wrong immediate use list");
     919                 :           0 :           err = true;
     920                 :             :         }
     921                 :             :     }
     922                 :             : 
     923                 :  9860092810 :   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                 :  9860092810 :   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                 :   593546991 : verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
     945                 :             : {
     946                 :   593546991 :   edge e;
     947                 :   593546991 :   bool err = false;
     948                 :   593546991 :   size_t i, phi_num_args = gimple_phi_num_args (phi);
     949                 :             : 
     950                 :  1187093982 :   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                 :  2068489478 :   for (i = 0; i < phi_num_args; i++)
     958                 :             :     {
     959                 :  1474942487 :       use_operand_p op_p = gimple_phi_arg_imm_use_ptr (phi, i);
     960                 :  1474942487 :       tree op = USE_FROM_PTR (op_p);
     961                 :             : 
     962                 :  1474942487 :       e = EDGE_PRED (bb, i);
     963                 :             : 
     964                 :  1474942487 :       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                 :  1474942487 :       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                 :  1474942487 :       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                 :  1474942487 :       if (TREE_CODE (op) == SSA_NAME)
     986                 :             :         {
     987                 :  2565484692 :           err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
     988                 :  1282742346 :           err |= verify_use (e->src, definition_block[SSA_NAME_VERSION (op)],
     989                 :  1282742346 :                              op_p, phi, e->flags & EDGE_ABNORMAL, NULL);
     990                 :             :         }
     991                 :             : 
     992                 :  1474942487 :       if (TREE_CODE (op) == ADDR_EXPR)
     993                 :             :         {
     994                 :    10802894 :           tree base = TREE_OPERAND (op, 0);
     995                 :    14405610 :           while (handled_component_p (base))
     996                 :     3602716 :             base = TREE_OPERAND (base, 0);
     997                 :    10802894 :           if ((VAR_P (base)
     998                 :             :                || TREE_CODE (base) == PARM_DECL
     999                 :             :                || TREE_CODE (base) == RESULT_DECL)
    1000                 :     4816444 :               && !TREE_ADDRESSABLE (base))
    1001                 :             :             {
    1002                 :           0 :               error ("address taken, but ADDRESSABLE bit not set");
    1003                 :           0 :               err = true;
    1004                 :             :             }
    1005                 :             :         }
    1006                 :             : 
    1007                 :  1474942487 :       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                 :  1474942487 :       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                 :   593546991 : error:
    1023                 :   593546991 :   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                 :   593546991 :   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                 :   205416861 : verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
    1039                 :             : {
    1040                 :   205416861 :   basic_block bb;
    1041                 :   410833722 :   basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
    1042                 :   205416861 :   ssa_op_iter iter;
    1043                 :   205416861 :   tree op;
    1044                 :   205416861 :   enum dom_state orig_dom_state = dom_info_state (CDI_DOMINATORS);
    1045                 :   205416861 :   auto_bitmap names_defined_in_bb;
    1046                 :             : 
    1047                 :   205416861 :   gcc_assert (!need_ssa_update_p (cfun));
    1048                 :             : 
    1049                 :   205416861 :   timevar_push (TV_TREE_SSA_VERIFY);
    1050                 :             : 
    1051                 :   205416861 :     {
    1052                 :             :       /* Keep track of SSA names present in the IL.  */
    1053                 :   205416861 :       size_t i;
    1054                 :   205416861 :       tree name;
    1055                 :   205416861 :       hash_map <void *, tree> ssa_info;
    1056                 :             : 
    1057                 :  7533029399 :       FOR_EACH_SSA_NAME (i, name, cfun)
    1058                 :             :         {
    1059                 :  5821979239 :           gimple *stmt;
    1060                 :  5821979239 :           TREE_VISITED (name) = 0;
    1061                 :             : 
    1062                 : 11643958478 :           verify_ssa_name (name, virtual_operand_p (name));
    1063                 :             : 
    1064                 :  5821979239 :           stmt = SSA_NAME_DEF_STMT (name);
    1065                 :  5821979239 :           if (!gimple_nop_p (stmt))
    1066                 :             :             {
    1067                 :  5249196304 :               basic_block bb = gimple_bb (stmt);
    1068                 :  5249196304 :               if (verify_def (bb, definition_block,
    1069                 :  5249196304 :                               name, stmt, virtual_operand_p (name)))
    1070                 :           0 :                 goto err;
    1071                 :             :             }
    1072                 :             : 
    1073                 :  5821979239 :           void *info = NULL;
    1074                 :  5821979239 :           if (POINTER_TYPE_P (TREE_TYPE (name)))
    1075                 :  1032156766 :             info = SSA_NAME_PTR_INFO (name);
    1076                 :  4789822473 :           else if (INTEGRAL_TYPE_P (TREE_TYPE (name)))
    1077                 :  1985749559 :             info = SSA_NAME_RANGE_INFO (name);
    1078                 :  5821979239 :           if (info)
    1079                 :             :             {
    1080                 :  1192204135 :               bool existed;
    1081                 :  1192204135 :               tree &val = ssa_info.get_or_insert (info, &existed);
    1082                 :  1192204135 :               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                 :  1192204135 :                 val = name;
    1093                 :             :             }
    1094                 :             :         }
    1095                 :           0 :     }
    1096                 :             : 
    1097                 :   205416861 :   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                 :  1834875626 :   FOR_EACH_BB_FN (bb, cfun)
    1102                 :             :     {
    1103                 :  1629458765 :       edge e;
    1104                 :  1629458765 :       edge_iterator ei;
    1105                 :             : 
    1106                 :             :       /* Make sure that all edges have a clear 'aux' field.  */
    1107                 :  3895395966 :       FOR_EACH_EDGE (e, ei, bb->preds)
    1108                 :             :         {
    1109                 :  2265937201 :           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                 :  2223005756 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
    1119                 :             :         {
    1120                 :   593546991 :           gphi *phi = gsi.phi ();
    1121                 :   593546991 :           if (verify_phi_args (phi, bb, definition_block))
    1122                 :           0 :             goto err;
    1123                 :             : 
    1124                 :   593546991 :           bitmap_set_bit (names_defined_in_bb,
    1125                 :   593546991 :                           SSA_NAME_VERSION (gimple_phi_result (phi)));
    1126                 :             :         }
    1127                 :             : 
    1128                 :             :       /* Now verify all the uses and vuses in every statement of the block.  */
    1129                 : 13564505191 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1130                 : 10305587661 :            gsi_next (&gsi))
    1131                 :             :         {
    1132                 : 10305587661 :           gimple *stmt = gsi_stmt (gsi);
    1133                 : 10305587661 :           use_operand_p use_p;
    1134                 :             : 
    1135                 : 20548426325 :           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                 : 10305587661 :           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                 : 10305587661 :           if (gimple_debug_bind_p (stmt)
    1150                 :  4853242242 :               && !gimple_debug_bind_has_value_p (stmt))
    1151                 :  1529766394 :             continue;
    1152                 :             : 
    1153                 : 17353171731 :           FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE|SSA_OP_VUSE)
    1154                 :             :             {
    1155                 :  8577350464 :               op = USE_FROM_PTR (use_p);
    1156                 :  8577350464 :               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                 : 13421102355 :           FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_ALL_DEFS)
    1162                 :             :             {
    1163                 :  4645281088 :               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                 :  4645281088 :               bitmap_set_bit (names_defined_in_bb, SSA_NAME_VERSION (op));
    1174                 :             :             }
    1175                 :             :         }
    1176                 :             : 
    1177                 :  1629458765 :       bitmap_clear (names_defined_in_bb);
    1178                 :             :     }
    1179                 :             : 
    1180                 :   205416861 :   free (definition_block);
    1181                 :             : 
    1182                 :   205416861 :   if (gimple_vop (cfun)
    1183                 :   205416861 :       && ssa_default_def (cfun, gimple_vop (cfun)))
    1184                 :             :     {
    1185                 :   205312132 :       auto_sbitmap visited (last_basic_block_for_fn (cfun) + 1);
    1186                 :   205312132 :       bitmap_clear (visited);
    1187                 :   205312132 :       if (verify_vssa (ENTRY_BLOCK_PTR_FOR_FN (cfun),
    1188                 :             :                        ssa_default_def (cfun, gimple_vop (cfun)), visited))
    1189                 :           0 :         goto err;
    1190                 :   205312132 :     }
    1191                 :             : 
    1192                 :             :   /* Restore the dominance information to its prior known state, so
    1193                 :             :      that we do not perturb the compiler's subsequent behavior.  */
    1194                 :   205416861 :   if (orig_dom_state == DOM_NONE)
    1195                 :    66512011 :     free_dominance_info (CDI_DOMINATORS);
    1196                 :             :   else
    1197                 :   138904850 :     set_dom_info_availability (CDI_DOMINATORS, orig_dom_state);
    1198                 :             : 
    1199                 :   205416861 :   timevar_pop (TV_TREE_SSA_VERIFY);
    1200                 :   205416861 :   return;
    1201                 :             : 
    1202                 :           0 : err:
    1203                 :           0 :   internal_error ("verify_ssa failed");
    1204                 :   205416861 : }
    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                 :     3042738 : init_tree_ssa (struct function *fn, int size)
    1215                 :             : {
    1216                 :     3042738 :   fn->gimple_df = ggc_cleared_alloc<gimple_df> ();
    1217                 :     3042738 :   fn->gimple_df->default_defs = hash_table<ssa_name_hasher>::create_ggc (20);
    1218                 :     3042738 :   pt_solution_reset (&fn->gimple_df->escaped);
    1219                 :     3042738 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1220                 :     3042738 :   init_ssanames (fn, size);
    1221                 :     3042738 : }
    1222                 :             : 
    1223                 :             : /* Deallocate memory associated with SSA data structures for FNDECL.  */
    1224                 :             : 
    1225                 :             : void
    1226                 :     2938978 : delete_tree_ssa (struct function *fn)
    1227                 :             : {
    1228                 :     2938978 :   fini_ssanames (fn);
    1229                 :             : 
    1230                 :             :   /* We no longer maintain the SSA operand cache at this point.  */
    1231                 :     2938978 :   if (ssa_operands_active (fn))
    1232                 :     2915806 :     fini_ssa_operands (fn);
    1233                 :             : 
    1234                 :     2938978 :   fn->gimple_df->default_defs->empty ();
    1235                 :     2938978 :   fn->gimple_df->default_defs = NULL;
    1236                 :     2938978 :   pt_solution_reset (&fn->gimple_df->escaped);
    1237                 :     2938978 :   pt_solution_reset (&fn->gimple_df->escaped_return);
    1238                 :     2938978 :   if (fn->gimple_df->decls_to_pointers != NULL)
    1239                 :       37969 :     delete fn->gimple_df->decls_to_pointers;
    1240                 :     2938978 :   fn->gimple_df->decls_to_pointers = NULL;
    1241                 :     2938978 :   fn->gimple_df = NULL;
    1242                 :             : 
    1243                 :             :   /* We no longer need the edge variable maps.  */
    1244                 :     2938978 :   redirect_edge_var_map_empty ();
    1245                 :     2938978 : }
    1246                 :             : 
    1247                 :             : /* Return true if EXPR is a useless type conversion, otherwise return
    1248                 :             :    false.  */
    1249                 :             : 
    1250                 :             : bool
    1251                 :   866033804 : tree_ssa_useless_type_conversion (tree expr)
    1252                 :             : {
    1253                 :   866033804 :   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                 :   866033804 :   if (!CONVERT_EXPR_P (expr)
    1260                 :   800526051 :       && TREE_CODE (expr) != VIEW_CONVERT_EXPR
    1261                 :   799525671 :       && TREE_CODE (expr) != NON_LVALUE_EXPR)
    1262                 :             :     return false;
    1263                 :             : 
    1264                 :    66984598 :   outer_type = TREE_TYPE (expr);
    1265                 :    66984598 :   inner_type = TREE_TYPE (TREE_OPERAND (expr, 0));
    1266                 :             : 
    1267                 :    66984598 :   if (inner_type == error_mark_node)
    1268                 :             :     return false;
    1269                 :             : 
    1270                 :    66984567 :   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                 :   835099347 : tree_ssa_strip_useless_type_conversions (tree exp)
    1279                 :             : {
    1280                 :   854125276 :   while (tree_ssa_useless_type_conversion (exp))
    1281                 :    19025929 :     exp = TREE_OPERAND (exp, 0);
    1282                 :   835099347 :   return exp;
    1283                 :             : }
    1284                 :             : 
    1285                 :             : /* Return true if T, as SSA_NAME, has an implicit default defined value.  */
    1286                 :             : 
    1287                 :             : bool
    1288                 :   326846920 : ssa_defined_default_def_p (tree t)
    1289                 :             : {
    1290                 :   326846920 :   tree var = SSA_NAME_VAR (t);
    1291                 :             : 
    1292                 :   130527321 :   if (!var)
    1293                 :             :     ;
    1294                 :             :   /* Parameters get their initial value from the function entry.  */
    1295                 :   130527321 :   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                 :   101845878 :   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                 :   101668007 :   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                 :   326608512 : ssa_undefined_value_p (tree t, bool partial)
    1314                 :             : {
    1315                 :   326608512 :   gimple *def_stmt;
    1316                 :             : 
    1317                 :   653217024 :   gcc_checking_assert (!virtual_operand_p (t));
    1318                 :             : 
    1319                 :   326608512 :   if (ssa_defined_default_def_p (t))
    1320                 :             :     return false;
    1321                 :             : 
    1322                 :             :   /* The value is undefined iff its definition statement is empty.  */
    1323                 :   297751645 :   def_stmt = SSA_NAME_DEF_STMT (t);
    1324                 :   297751645 :   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                 :   290172435 :   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                 :    47352030 :   if (partial && is_gimple_assign (def_stmt)
    1357                 :   326489314 :       && (gimple_assign_rhs_code (def_stmt) == REALPART_EXPR
    1358                 :    36038047 :           || gimple_assign_rhs_code (def_stmt) == IMAGPART_EXPR))
    1359                 :             :     {
    1360                 :      602789 :       tree real_imag_part = TREE_OPERAND (gimple_assign_rhs1 (def_stmt), 0);
    1361                 :      602789 :       if (TREE_CODE (real_imag_part) == SSA_NAME
    1362                 :      602789 :          && 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                 :    47351944 :   if (partial && is_gimple_assign (def_stmt)
    1369                 :   326489142 :       && gimple_assign_rhs_code (def_stmt) == COMPLEX_EXPR)
    1370                 :             :     {
    1371                 :       17513 :       tree rhs1, rhs2;
    1372                 :             : 
    1373                 :       17513 :       rhs1 = gimple_assign_rhs1 (def_stmt);
    1374                 :       17513 :       rhs2 = gimple_assign_rhs2 (def_stmt);
    1375                 :       17050 :       return (TREE_CODE (rhs1) == SSA_NAME && ssa_undefined_value_p (rhs1))
    1376                 :       34522 :              || (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                 :      296464 : ssa_name_any_use_dominates_bb_p (tree var, basic_block bb)
    1389                 :             : {
    1390                 :      296464 :   imm_use_iterator iter;
    1391                 :      296464 :   use_operand_p use_p;
    1392                 :      859356 :   FOR_EACH_IMM_USE_FAST (use_p, iter, var)
    1393                 :             :     {
    1394                 :      585716 :       if (is_a <gphi *> (USE_STMT (use_p))
    1395                 :      585716 :           || is_gimple_debug (USE_STMT (use_p)))
    1396                 :      528900 :         continue;
    1397                 :       56816 :       basic_block dombb = gimple_bb (USE_STMT (use_p));
    1398                 :       56816 :       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                 :    11019785 : mark_ssa_maybe_undefs (void)
    1410                 :             : {
    1411                 :    11019785 :   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                 :    11019785 :   unsigned int i;
    1417                 :    11019785 :   tree var;
    1418                 :   492965541 :   FOR_EACH_SSA_NAME (i, var, cfun)
    1419                 :             :     {
    1420                 :   339004950 :       if (SSA_NAME_IS_VIRTUAL_OPERAND (var)
    1421                 :   339004950 :           || !ssa_undefined_value_p (var, false))
    1422                 :   333338053 :         ssa_name_set_maybe_undef (var, false);
    1423                 :             :       else
    1424                 :             :         {
    1425                 :     5666897 :           ssa_name_set_maybe_undef (var);
    1426                 :     5666897 :           queue.safe_push (var);
    1427                 :     5666897 :           if (dump_file && (dump_flags & TDF_DETAILS))
    1428                 :          32 :             fprintf (dump_file, "marking _%i as maybe-undef\n",
    1429                 :          16 :                      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                 :    18338967 :   while (!queue.is_empty ())
    1436                 :             :     {
    1437                 :     5938174 :       var = queue.pop ();
    1438                 :     5938174 :       imm_use_iterator iter;
    1439                 :     5938174 :       use_operand_p use_p;
    1440                 :     7135186 :       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                 :     1197012 :           if (!is_a <gphi *> (USE_STMT (use_p)))
    1448                 :      925735 :             continue;
    1449                 :      459739 :           gphi *phi = as_a <gphi *> (USE_STMT (use_p));
    1450                 :             : 
    1451                 :      459739 :           tree def = gimple_phi_result (phi);
    1452                 :      459739 :           if (ssa_name_maybe_undef_p (def))
    1453                 :      170259 :             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                 :      289480 :           int idx = phi_arg_index_from_use (use_p);
    1462                 :      289480 :           basic_block bb = gimple_phi_arg_edge (phi, idx)->src;
    1463                 :      289480 :           if (ssa_name_any_use_dominates_bb_p (var, bb))
    1464                 :       18203 :             continue;
    1465                 :             : 
    1466                 :      271277 :           ssa_name_set_maybe_undef (def);
    1467                 :      271277 :           queue.safe_push (def);
    1468                 :      271277 :           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                 :    11019785 : }
    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                 :    22608002 : maybe_rewrite_mem_ref_base (tree *tp, bitmap suitable_for_renaming)
    1481                 :             : {
    1482                 :    22608002 :   tree sym;
    1483                 :             : 
    1484                 :    25618573 :   while (handled_component_p (*tp))
    1485                 :     3010571 :     tp = &TREE_OPERAND (*tp, 0);
    1486                 :    22608002 :   if (TREE_CODE (*tp) == MEM_REF
    1487                 :     1590350 :       && TREE_CODE (TREE_OPERAND (*tp, 0)) == ADDR_EXPR
    1488                 :      255374 :       && (sym = TREE_OPERAND (TREE_OPERAND (*tp, 0), 0))
    1489                 :      255374 :       && DECL_P (sym)
    1490                 :      254956 :       && !TREE_ADDRESSABLE (sym)
    1491                 :      136962 :       && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    1492                 :       52703 :       && is_gimple_reg_type (TREE_TYPE (*tp))
    1493                 :    22660693 :       && ! VOID_TYPE_P (TREE_TYPE (*tp)))
    1494                 :             :     {
    1495                 :       52691 :       if (VECTOR_TYPE_P (TREE_TYPE (sym))
    1496                 :         763 :           && useless_type_conversion_p (TREE_TYPE (*tp),
    1497                 :         763 :                                         TREE_TYPE (TREE_TYPE (sym)))
    1498                 :       52775 :           && 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                 :       52608 :       else if (TREE_CODE (TREE_TYPE (sym)) == COMPLEX_TYPE
    1508                 :       53613 :                && useless_type_conversion_p (TREE_TYPE (*tp),
    1509                 :        1005 :                                              TREE_TYPE (TREE_TYPE (sym))))
    1510                 :             :         {
    1511                 :           6 :           *tp = build1 (integer_zerop (TREE_OPERAND (*tp, 1))
    1512                 :             :                         ? REALPART_EXPR : IMAGPART_EXPR,
    1513                 :           4 :                         TREE_TYPE (*tp), sym);
    1514                 :             :         }
    1515                 :       52604 :       else if (integer_zerop (TREE_OPERAND (*tp, 1))
    1516                 :       52604 :                && DECL_SIZE (sym) == TYPE_SIZE (TREE_TYPE (*tp)))
    1517                 :             :         {
    1518                 :       52258 :           if (!useless_type_conversion_p (TREE_TYPE (*tp),
    1519                 :       52258 :                                           TREE_TYPE (sym)))
    1520                 :       13312 :             *tp = build1 (VIEW_CONVERT_EXPR,
    1521                 :       13312 :                           TREE_TYPE (*tp), sym);
    1522                 :             :           else
    1523                 :       38946 :             *tp = sym;
    1524                 :             :         }
    1525                 :         346 :       else if (DECL_SIZE (sym)
    1526                 :         346 :                && TREE_CODE (DECL_SIZE (sym)) == INTEGER_CST
    1527                 :         346 :                && (known_subrange_p
    1528                 :         346 :                    (mem_ref_offset (*tp),
    1529                 :         346 :                     wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (*tp))),
    1530                 :         346 :                     0, wi::to_offset (DECL_SIZE_UNIT (sym))))
    1531                 :         346 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (*tp)) 
    1532                 :         341 :                    || (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp)))
    1533                 :         682 :                        == TYPE_PRECISION (TREE_TYPE (*tp))))
    1534                 :         346 :                && (! INTEGRAL_TYPE_P (TREE_TYPE (sym))
    1535                 :         162 :                    || type_has_mode_precision_p (TREE_TYPE (sym)))
    1536                 :         692 :                && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (*tp))),
    1537                 :         692 :                                   BITS_PER_UNIT) == 0)
    1538                 :             :         {
    1539                 :         692 :           *tp = build3 (BIT_FIELD_REF, TREE_TYPE (*tp), sym,
    1540                 :         346 :                         TYPE_SIZE (TREE_TYPE (*tp)),
    1541                 :             :                         wide_int_to_tree (bitsizetype,
    1542                 :         346 :                                           mem_ref_offset (*tp)
    1543                 :         692 :                                           << LOG2_BITS_PER_UNIT));
    1544                 :             :         }
    1545                 :             :     }
    1546                 :    22608002 : }
    1547                 :             : 
    1548                 :             : /* For a tree REF return its base if it is the base of a MEM_REF
    1549                 :             :    that cannot be rewritten into SSA form.  Otherwise return NULL_TREE.  */
    1550                 :             : 
    1551                 :             : static tree
    1552                 :   267696627 : non_rewritable_mem_ref_base (tree ref)
    1553                 :             : {
    1554                 :   267696627 :   tree base;
    1555                 :             : 
    1556                 :             :   /* A plain decl does not need it set.  */
    1557                 :   267696627 :   if (DECL_P (ref))
    1558                 :             :     return NULL_TREE;
    1559                 :             : 
    1560                 :   239849548 :   switch (TREE_CODE (ref))
    1561                 :             :     {
    1562                 :     2379822 :     case REALPART_EXPR:
    1563                 :     2379822 :     case IMAGPART_EXPR:
    1564                 :     2379822 :     case BIT_FIELD_REF:
    1565                 :     2379822 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1566                 :             :         return NULL_TREE;
    1567                 :             :       break;
    1568                 :     2340451 :     case VIEW_CONVERT_EXPR:
    1569                 :     2340451 :       if (DECL_P (TREE_OPERAND (ref, 0)))
    1570                 :             :         {
    1571                 :     1095564 :           if (TYPE_SIZE (TREE_TYPE (ref))
    1572                 :     1095564 :               != TYPE_SIZE (TREE_TYPE (TREE_OPERAND  (ref, 0))))
    1573                 :         551 :             return TREE_OPERAND (ref, 0);
    1574                 :             :           return NULL_TREE;
    1575                 :             :         }
    1576                 :             :       break;
    1577                 :             :     /* We would need to rewrite ARRAY_REFs or COMPONENT_REFs and even
    1578                 :             :        more so multiple levels of handled components.  */
    1579                 :   238277947 :     default:;
    1580                 :             :     }
    1581                 :             : 
    1582                 :   238277947 :   base = ref;
    1583                 :             : 
    1584                 :             :   /* But watch out for MEM_REFs we cannot lower to a
    1585                 :             :      VIEW_CONVERT_EXPR or a BIT_FIELD_REF.  */
    1586                 :   238277947 :   if (TREE_CODE (base) == MEM_REF
    1587                 :   238277947 :       && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
    1588                 :             :     {
    1589                 :     4729176 :       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
    1590                 :     4729176 :       if (! DECL_P (decl))
    1591                 :             :         return NULL_TREE;
    1592                 :     4692346 :       if (! is_gimple_reg_type (TREE_TYPE (base))
    1593                 :     4548389 :           || VOID_TYPE_P (TREE_TYPE (base))
    1594                 :     9240735 :           || TREE_THIS_VOLATILE (decl) != TREE_THIS_VOLATILE (base))
    1595                 :             :         return decl;
    1596                 :     4547516 :       if ((VECTOR_TYPE_P (TREE_TYPE (decl))
    1597                 :     4546451 :            || TREE_CODE (TREE_TYPE (decl)) == COMPLEX_TYPE)
    1598                 :        2351 :           && useless_type_conversion_p (TREE_TYPE (base),
    1599                 :        2351 :                                         TREE_TYPE (TREE_TYPE (decl)))
    1600                 :         266 :           && known_ge (mem_ref_offset (base), 0)
    1601                 :         219 :           && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
    1602                 :             :                        mem_ref_offset (base))
    1603                 :     4547729 :           && multiple_p (mem_ref_offset (base),
    1604                 :         213 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base)))))
    1605                 :         212 :         return NULL_TREE;
    1606                 :             :       /* For same sizes and zero offset we can use a VIEW_CONVERT_EXPR.  */
    1607                 :     4547304 :       if (integer_zerop (TREE_OPERAND (base, 1))
    1608                 :     4547304 :           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (base)))
    1609                 :             :         return NULL_TREE;
    1610                 :             :       /* For integral typed extracts we can use a BIT_FIELD_REF.  */
    1611                 :     4119605 :       if (DECL_SIZE (decl)
    1612                 :     4115409 :           && TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST
    1613                 :     4115409 :           && (known_subrange_p
    1614                 :     4115409 :               (mem_ref_offset (base),
    1615                 :     4115409 :                wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (base))),
    1616                 :     4115409 :                0, wi::to_poly_offset (DECL_SIZE_UNIT (decl))))
    1617                 :             :           /* ???  We can't handle bitfield precision extracts without
    1618                 :             :              either using an alternate type for the BIT_FIELD_REF and
    1619                 :             :              then doing a conversion or possibly adjusting the offset
    1620                 :             :              according to endianness.  */
    1621                 :     4113283 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (base))
    1622                 :     2433785 :               || (wi::to_offset (TYPE_SIZE (TREE_TYPE (base)))
    1623                 :     4867570 :                   == TYPE_PRECISION (TREE_TYPE (base))))
    1624                 :             :           /* ???  Likewise for extracts from bitfields, we'd have
    1625                 :             :              to pun the base object to a size precision mode first.  */
    1626                 :     4109457 :           && (! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1627                 :       38087 :               || type_has_mode_precision_p (TREE_TYPE (decl)))
    1628                 :     8196065 :           && wi::umod_trunc (wi::to_offset (TYPE_SIZE (TREE_TYPE (base))),
    1629                 :     8152920 :                              BITS_PER_UNIT) == 0)
    1630                 :     4076460 :         return NULL_TREE;
    1631                 :       43145 :       return decl;
    1632                 :             :     }
    1633                 :             : 
    1634                 :             :   /* We cannot rewrite a decl in the base.  */
    1635                 :   233548771 :   base = get_base_address (ref);
    1636                 :   233548771 :   if (DECL_P (base))
    1637                 :             :     return base;
    1638                 :             : 
    1639                 :             :   /* We cannot rewrite TARGET_MEM_REFs.  */
    1640                 :   214810852 :   else if (TREE_CODE (base) == TARGET_MEM_REF
    1641                 :   214810852 :            && TREE_CODE (TREE_OPERAND (base, 0)) == ADDR_EXPR)
    1642                 :             :     {
    1643                 :           0 :       tree decl = TREE_OPERAND (TREE_OPERAND (base, 0), 0);
    1644                 :           0 :       if (! DECL_P (decl))
    1645                 :             :         return NULL_TREE;
    1646                 :             :       return decl;
    1647                 :             :     }
    1648                 :             : 
    1649                 :             :   return NULL_TREE;
    1650                 :             : }
    1651                 :             : 
    1652                 :             : /* For an lvalue tree LHS return true if it cannot be rewritten into SSA form.
    1653                 :             :    Otherwise return true.  */
    1654                 :             : 
    1655                 :             : static bool 
    1656                 :    93975474 : non_rewritable_lvalue_p (tree lhs)
    1657                 :             : {
    1658                 :             :   /* A plain decl is always rewritable.  */
    1659                 :    93975474 :   if (DECL_P (lhs))
    1660                 :             :     return false;
    1661                 :             : 
    1662                 :             :   /* We can re-write REALPART_EXPR and IMAGPART_EXPR sets in
    1663                 :             :      a reasonably efficient manner... */
    1664                 :    56548436 :   if ((TREE_CODE (lhs) == REALPART_EXPR
    1665                 :    56548436 :        || TREE_CODE (lhs) == IMAGPART_EXPR)
    1666                 :    56548436 :       && DECL_P (TREE_OPERAND (lhs, 0)))
    1667                 :             :     return false;
    1668                 :             : 
    1669                 :             :   /* ???  The following could be relaxed allowing component
    1670                 :             :      references that do not change the access size.  */
    1671                 :    56518831 :   if (TREE_CODE (lhs) == MEM_REF
    1672                 :    56518831 :       && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR)
    1673                 :             :     {
    1674                 :     6870229 :       tree decl = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0);
    1675                 :             : 
    1676                 :             :       /* A decl that is wrapped inside a MEM-REF that covers
    1677                 :             :          it full is also rewritable.  */
    1678                 :     6870229 :       if (integer_zerop (TREE_OPERAND (lhs, 1))
    1679                 :     2933079 :           && DECL_P (decl)
    1680                 :     2933079 :           && DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
    1681                 :             :           /* If the dynamic type of the decl has larger precision than
    1682                 :             :              the decl itself we can't use the decls type for SSA rewriting.  */
    1683                 :     1532931 :           && ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
    1684                 :        9361 :                || compare_tree_int (DECL_SIZE (decl),
    1685                 :        9361 :                                     TYPE_PRECISION (TREE_TYPE (decl))) == 0)
    1686                 :         805 :               || (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
    1687                 :         784 :                   && (TYPE_PRECISION (TREE_TYPE (decl))
    1688                 :         784 :                       >= TYPE_PRECISION (TREE_TYPE (lhs)))))
    1689                 :             :           /* Make sure we are not re-writing non-float copying into float
    1690                 :             :              copying as that can incur normalization.  */
    1691                 :     1532806 :           && (! FLOAT_TYPE_P (TREE_TYPE (decl))
    1692                 :        5468 :               || types_compatible_p (TREE_TYPE (lhs), TREE_TYPE (decl)))
    1693                 :     8398451 :           && (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
    1694                 :             :         return false;
    1695                 :             : 
    1696                 :             :       /* A vector-insert using a MEM_REF or ARRAY_REF is rewritable
    1697                 :             :          using a BIT_INSERT_EXPR.  */
    1698                 :     5342742 :       if (DECL_P (decl)
    1699                 :     5342736 :           && VECTOR_TYPE_P (TREE_TYPE (decl))
    1700                 :        1742 :           && TYPE_MODE (TREE_TYPE (decl)) != BLKmode
    1701                 :         260 :           && known_ge (mem_ref_offset (lhs), 0)
    1702                 :         225 :           && known_gt (wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (decl))),
    1703                 :             :                        mem_ref_offset (lhs))
    1704                 :         225 :           && multiple_p (mem_ref_offset (lhs),
    1705                 :         225 :                          wi::to_poly_offset (TYPE_SIZE_UNIT (TREE_TYPE (lhs))))
    1706                 :    10685478 :           && known_ge (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (decl))),
    1707                 :             :                        wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (lhs)))))
    1708                 :             :         {
    1709                 :         224 :           poly_uint64 lhs_bits, nelts;
    1710                 :         224 :           if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)), &lhs_bits)
    1711                 :         226 :               && multiple_p (lhs_bits,
    1712                 :             :                              tree_to_uhwi
    1713                 :         224 :                                (TYPE_SIZE (TREE_TYPE (TREE_TYPE (decl)))),
    1714                 :             :                              &nelts)
    1715                 :         250 :               && valid_vector_subparts_p (nelts))
    1716                 :             :             {
    1717                 :         198 :               if (known_eq (nelts, 1u))
    1718                 :         198 :                 return false;
    1719                 :             :               /* For sub-vector inserts the insert vector mode has to be
    1720                 :             :                  supported.  */
    1721                 :         143 :               tree vtype = build_vector_type (TREE_TYPE (TREE_TYPE (decl)),
    1722                 :             :                                               nelts);
    1723                 :         143 :               if (TYPE_MODE (vtype) != BLKmode)
    1724                 :             :                 return false;
    1725                 :             :             }
    1726                 :             :         }
    1727                 :             :     }
    1728                 :             : 
    1729                 :             :   /* A vector-insert using a BIT_FIELD_REF is rewritable using
    1730                 :             :      BIT_INSERT_EXPR.  */
    1731                 :    54991146 :   if (TREE_CODE (lhs) == BIT_FIELD_REF
    1732                 :       20224 :       && DECL_P (TREE_OPERAND (lhs, 0))
    1733                 :       13340 :       && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    1734                 :       13260 :       && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    1735                 :        1342 :       && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    1736                 :        1342 :                           TYPE_SIZE_UNIT
    1737                 :             :                             (TREE_TYPE (TREE_TYPE (TREE_OPERAND (lhs, 0)))), 0)
    1738                 :    54992482 :       && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    1739                 :        1336 :           % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs)))) == 0)
    1740                 :             :     return false;
    1741                 :             : 
    1742                 :             :   return true;
    1743                 :             : }
    1744                 :             : 
    1745                 :             : /* When possible, clear TREE_ADDRESSABLE bit, set or clear DECL_NOT_GIMPLE_REG_P
    1746                 :             :    and mark the variable VAR for conversion into SSA.  Return true when updating
    1747                 :             :    stmts is required.  */
    1748                 :             : 
    1749                 :             : static void
    1750                 :    96923743 : maybe_optimize_var (tree var, bitmap addresses_taken, bitmap not_reg_needs,
    1751                 :             :                     bitmap suitable_for_renaming)
    1752                 :             : {
    1753                 :             :   /* Global Variables, result decls cannot be changed.  */
    1754                 :    96923743 :   if (is_global_var (var)
    1755                 :    95431891 :       || TREE_CODE (var) == RESULT_DECL
    1756                 :   192355634 :       || bitmap_bit_p (addresses_taken, DECL_UID (var)))
    1757                 :     9380013 :     return;
    1758                 :             : 
    1759                 :    87543730 :   bool maybe_reg = false;
    1760                 :    87543730 :   if (TREE_ADDRESSABLE (var))
    1761                 :             :     {
    1762                 :     1311467 :       TREE_ADDRESSABLE (var) = 0;
    1763                 :     1311467 :       maybe_reg = true;
    1764                 :     1311467 :       if (dump_file)
    1765                 :             :         {
    1766                 :          78 :           fprintf (dump_file, "No longer having address taken: ");
    1767                 :          78 :           print_generic_expr (dump_file, var);
    1768                 :          78 :           fprintf (dump_file, "\n");
    1769                 :             :         }
    1770                 :             :     }
    1771                 :             : 
    1772                 :             :   /* For register type decls if we do not have any partial defs
    1773                 :             :      we cannot express in SSA form mark them as DECL_NOT_GIMPLE_REG_P
    1774                 :             :      as to avoid SSA rewrite.  For the others go ahead and mark
    1775                 :             :      them for renaming.  */
    1776                 :    87543730 :   if (is_gimple_reg_type (TREE_TYPE (var)))
    1777                 :             :     {
    1778                 :    72697139 :       if (bitmap_bit_p (not_reg_needs, DECL_UID (var)))
    1779                 :             :         {
    1780                 :       31448 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1781                 :       31448 :           if (dump_file)
    1782                 :             :             {
    1783                 :           5 :               fprintf (dump_file, "Has partial defs: ");
    1784                 :           5 :               print_generic_expr (dump_file, var);
    1785                 :           5 :               fprintf (dump_file, "\n");
    1786                 :             :             }
    1787                 :             :         }
    1788                 :    72665691 :       else if (TREE_CODE (TREE_TYPE (var)) == BITINT_TYPE
    1789                 :       36375 :                && (cfun->curr_properties & PROP_gimple_lbitint) != 0
    1790                 :    72682637 :                && TYPE_PRECISION (TREE_TYPE (var)) > MAX_FIXED_MODE_SIZE)
    1791                 :             :         {
    1792                 :             :           /* Don't rewrite large/huge _BitInt vars after _BitInt lowering
    1793                 :             :              into SSA form.  */
    1794                 :        1084 :           DECL_NOT_GIMPLE_REG_P (var) = 1;
    1795                 :        1084 :           if (dump_file)
    1796                 :             :             {
    1797                 :           0 :               fprintf (dump_file, "_BitInt var after its lowering: ");
    1798                 :           0 :               print_generic_expr (dump_file, var);
    1799                 :           0 :               fprintf (dump_file, "\n");
    1800                 :             :             }
    1801                 :             :         }
    1802                 :    72664607 :       else if (DECL_NOT_GIMPLE_REG_P (var))
    1803                 :             :         {
    1804                 :        7438 :           maybe_reg = true;
    1805                 :        7438 :           DECL_NOT_GIMPLE_REG_P (var) = 0;
    1806                 :             :         }
    1807                 :    72697139 :       if (maybe_reg)
    1808                 :             :         {
    1809                 :      511319 :           if (is_gimple_reg (var))
    1810                 :             :             {
    1811                 :      504641 :               if (dump_file)
    1812                 :             :                 {
    1813                 :          16 :                   fprintf (dump_file, "Now a gimple register: ");
    1814                 :          16 :                   print_generic_expr (dump_file, var);
    1815                 :          16 :                   fprintf (dump_file, "\n");
    1816                 :             :                 }
    1817                 :      504641 :               bitmap_set_bit (suitable_for_renaming, DECL_UID (var));
    1818                 :             :             }
    1819                 :             :           else
    1820                 :        6678 :             DECL_NOT_GIMPLE_REG_P (var) = 1;
    1821                 :             :         }
    1822                 :             :     }
    1823                 :             : }
    1824                 :             : 
    1825                 :             : /* Return true when STMT is ASAN mark where second argument is an address
    1826                 :             :    of a local variable.  */
    1827                 :             : 
    1828                 :             : static bool
    1829                 :    53186076 : is_asan_mark_p (gimple *stmt)
    1830                 :             : {
    1831                 :    53186076 :   if (!gimple_call_internal_p (stmt, IFN_ASAN_MARK))
    1832                 :             :     return false;
    1833                 :             : 
    1834                 :       42379 :   tree addr = get_base_address (gimple_call_arg (stmt, 1));
    1835                 :       42379 :   if (TREE_CODE (addr) == ADDR_EXPR
    1836                 :       42379 :       && VAR_P (TREE_OPERAND (addr, 0)))
    1837                 :             :     {
    1838                 :       42175 :       tree var = TREE_OPERAND (addr, 0);
    1839                 :       42175 :       if (lookup_attribute (ASAN_USE_AFTER_SCOPE_ATTRIBUTE,
    1840                 :       42175 :                             DECL_ATTRIBUTES (var)))
    1841                 :             :         return false;
    1842                 :             : 
    1843                 :       38248 :       unsigned addressable = TREE_ADDRESSABLE (var);
    1844                 :       38248 :       TREE_ADDRESSABLE (var) = 0;
    1845                 :       38248 :       bool r = is_gimple_reg (var);
    1846                 :       38248 :       TREE_ADDRESSABLE (var) = addressable;
    1847                 :       38248 :       return r;
    1848                 :             :     }
    1849                 :             : 
    1850                 :             :   return false;
    1851                 :             : }
    1852                 :             : 
    1853                 :             : /* Compute TREE_ADDRESSABLE and whether we have unhandled partial defs
    1854                 :             :    for local variables.  */
    1855                 :             : 
    1856                 :             : void
    1857                 :    11584039 : execute_update_addresses_taken (void)
    1858                 :             : {
    1859                 :    11584039 :   basic_block bb;
    1860                 :    11584039 :   auto_bitmap addresses_taken;
    1861                 :    11584039 :   auto_bitmap not_reg_needs;
    1862                 :    11584039 :   auto_bitmap suitable_for_renaming;
    1863                 :    11584039 :   bool optimistic_not_addressable = false;
    1864                 :    11584039 :   tree var;
    1865                 :    11584039 :   unsigned i;
    1866                 :             : 
    1867                 :    11584039 :   timevar_push (TV_ADDRESS_TAKEN);
    1868                 :             : 
    1869                 :             :   /* Collect into ADDRESSES_TAKEN all variables whose address is taken within
    1870                 :             :      the function body.  */
    1871                 :   109950982 :   FOR_EACH_BB_FN (bb, cfun)
    1872                 :             :     {
    1873                 :   883660388 :       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
    1874                 :   686926502 :            gsi_next (&gsi))
    1875                 :             :         {
    1876                 :   686926502 :           gimple *stmt = gsi_stmt (gsi);
    1877                 :   686926502 :           enum gimple_code code = gimple_code (stmt);
    1878                 :   686926502 :           tree decl;
    1879                 :             : 
    1880                 :   686926502 :           if (code == GIMPLE_CALL)
    1881                 :             :             {
    1882                 :    50863229 :               if (optimize_atomic_compare_exchange_p (stmt))
    1883                 :             :                 {
    1884                 :             :                   /* For __atomic_compare_exchange_N if the second argument
    1885                 :             :                      is &var, don't mark var addressable;
    1886                 :             :                      if it becomes non-addressable, we'll rewrite it into
    1887                 :             :                      ATOMIC_COMPARE_EXCHANGE call.  */
    1888                 :        5869 :                   tree arg = gimple_call_arg (stmt, 1);
    1889                 :        5869 :                   gimple_call_set_arg (stmt, 1, null_pointer_node);
    1890                 :        5869 :                   gimple_ior_addresses_taken (addresses_taken, stmt);
    1891                 :        5869 :                   gimple_call_set_arg (stmt, 1, arg);
    1892                 :             :                   /* Remember we have to check again below.  */
    1893                 :        5869 :                   optimistic_not_addressable = true;
    1894                 :             :                 }
    1895                 :    50857360 :               else if (is_asan_mark_p (stmt)
    1896                 :    50857360 :                        || gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
    1897                 :             :                 ;
    1898                 :             :               else
    1899                 :    50847726 :                 gimple_ior_addresses_taken (addresses_taken, stmt);
    1900                 :             :             }
    1901                 :             :           else
    1902                 :             :             /* Note all addresses taken by the stmt.  */
    1903                 :   636063273 :             gimple_ior_addresses_taken (addresses_taken, stmt);
    1904                 :             : 
    1905                 :             :           /* If we have a call or an assignment, see if the lhs contains
    1906                 :             :              a local decl that requires not to be a gimple register.  */
    1907                 :   686926502 :           if (code == GIMPLE_ASSIGN || code == GIMPLE_CALL)
    1908                 :             :             {
    1909                 :   284784348 :               tree lhs = gimple_get_lhs (stmt);
    1910                 :   284784348 :               if (lhs
    1911                 :   254456362 :                   && TREE_CODE (lhs) != SSA_NAME
    1912                 :   378738640 :                   && ((code == GIMPLE_CALL && ! DECL_P (lhs))
    1913                 :    93851725 :                       || non_rewritable_lvalue_p (lhs)))
    1914                 :             :                 {
    1915                 :    55082784 :                   decl = get_base_address (lhs);
    1916                 :    55082784 :                   if (DECL_P (decl))
    1917                 :    38097217 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1918                 :             :                 }
    1919                 :             :             }
    1920                 :             : 
    1921                 :   686926502 :           if (gimple_assign_single_p (stmt))
    1922                 :             :             {
    1923                 :   159461339 :               tree rhs = gimple_assign_rhs1 (stmt);
    1924                 :   159461339 :               if ((decl = non_rewritable_mem_ref_base (rhs)))
    1925                 :    18818557 :                 bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1926                 :             :             }
    1927                 :             : 
    1928                 :   527465163 :           else if (code == GIMPLE_CALL)
    1929                 :             :             {
    1930                 :   152041781 :               for (i = 0; i < gimple_call_num_args (stmt); ++i)
    1931                 :             :                 {
    1932                 :   101178552 :                   tree arg = gimple_call_arg (stmt, i);
    1933                 :   101178552 :                   if ((decl = non_rewritable_mem_ref_base (arg)))
    1934                 :       94181 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1935                 :             :                 }
    1936                 :             :             }
    1937                 :             : 
    1938                 :   476601934 :           else if (code == GIMPLE_ASM)
    1939                 :             :             {
    1940                 :      783999 :               gasm *asm_stmt = as_a <gasm *> (stmt);
    1941                 :     1600866 :               for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    1942                 :             :                 {
    1943                 :      816867 :                   tree link = gimple_asm_output_op (asm_stmt, i);
    1944                 :      816867 :                   tree lhs = TREE_VALUE (link);
    1945                 :      816867 :                   if (TREE_CODE (lhs) != SSA_NAME)
    1946                 :             :                     {
    1947                 :      192544 :                       decl = get_base_address (lhs);
    1948                 :      192544 :                       if (DECL_P (decl)
    1949                 :      192544 :                           && (non_rewritable_lvalue_p (lhs)
    1950                 :             :                               /* We cannot move required conversions from
    1951                 :             :                                  the lhs to the rhs in asm statements, so
    1952                 :             :                                  require we do not need any.  */
    1953                 :      114156 :                               || !useless_type_conversion_p
    1954                 :      114156 :                                     (TREE_TYPE (lhs), TREE_TYPE (decl))))
    1955                 :       10123 :                         bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1956                 :             :                     }
    1957                 :             :                 }
    1958                 :     1256870 :               for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    1959                 :             :                 {
    1960                 :      472871 :                   tree link = gimple_asm_input_op (asm_stmt, i);
    1961                 :      472871 :                   if ((decl = non_rewritable_mem_ref_base (TREE_VALUE (link))))
    1962                 :        2294 :                     bitmap_set_bit (not_reg_needs, DECL_UID (decl));
    1963                 :             :                 }
    1964                 :             :             }
    1965                 :             :         }
    1966                 :             : 
    1967                 :   131880456 :       for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
    1968                 :    33513513 :            gsi_next (&gsi))
    1969                 :             :         {
    1970                 :    33513513 :           size_t i;
    1971                 :    33513513 :           gphi *phi = gsi.phi ();
    1972                 :             : 
    1973                 :   118469813 :           for (i = 0; i < gimple_phi_num_args (phi); i++)
    1974                 :             :             {
    1975                 :    84956300 :               tree op = PHI_ARG_DEF (phi, i), var;
    1976                 :    84956300 :               if (TREE_CODE (op) == ADDR_EXPR
    1977                 :      713677 :                   && (var = get_base_address (TREE_OPERAND (op, 0))) != NULL
    1978                 :    85669977 :                   && DECL_P (var))
    1979                 :      516205 :                 bitmap_set_bit (addresses_taken, DECL_UID (var));
    1980                 :             :             }
    1981                 :             :         }
    1982                 :             :     }
    1983                 :             : 
    1984                 :             :   /* We cannot iterate over all referenced vars because that can contain
    1985                 :             :      unused vars from BLOCK trees, which causes code generation differences
    1986                 :             :      for -g vs. -g0.  */
    1987                 :    36064661 :   for (var = DECL_ARGUMENTS (cfun->decl); var; var = DECL_CHAIN (var))
    1988                 :    24480622 :     maybe_optimize_var (var, addresses_taken, not_reg_needs,
    1989                 :             :                         suitable_for_renaming);
    1990                 :             : 
    1991                 :    84027160 :   FOR_EACH_VEC_SAFE_ELT (cfun->local_decls, i, var)
    1992                 :    72443121 :     maybe_optimize_var (var, addresses_taken, not_reg_needs,
    1993                 :             :                         suitable_for_renaming);
    1994                 :             : 
    1995                 :             :   /* Operand caches need to be recomputed for operands referencing the updated
    1996                 :             :      variables and operands need to be rewritten to expose bare symbols.  */
    1997                 :    11584039 :   if (!bitmap_empty_p (suitable_for_renaming)
    1998                 :    11584039 :       || optimistic_not_addressable)
    1999                 :             :     {
    2000                 :     5343482 :       FOR_EACH_BB_FN (bb, cfun)
    2001                 :    46244267 :         for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);)
    2002                 :             :           {
    2003                 :    35932503 :             gimple *stmt = gsi_stmt (gsi);
    2004                 :             : 
    2005                 :             :             /* Re-write TARGET_MEM_REFs of symbols we want to
    2006                 :             :                rewrite into SSA form.  */
    2007                 :    35932503 :             if (gimple_assign_single_p (stmt))
    2008                 :             :               {
    2009                 :    11733531 :                 tree lhs = gimple_assign_lhs (stmt);
    2010                 :    11733531 :                 tree rhs, *rhsp = gimple_assign_rhs1_ptr (stmt);
    2011                 :    11733531 :                 tree sym;
    2012                 :             : 
    2013                 :             :                 /* Rewrite LHS IMAG/REALPART_EXPR similar to
    2014                 :             :                    gimplify_modify_expr_complex_part.  */
    2015                 :    11733531 :                 if ((TREE_CODE (lhs) == IMAGPART_EXPR
    2016                 :    11733531 :                      || TREE_CODE (lhs) == REALPART_EXPR)
    2017                 :        2190 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2018                 :    11734980 :                     && bitmap_bit_p (suitable_for_renaming,
    2019                 :        1449 :                                      DECL_UID (TREE_OPERAND (lhs, 0))))
    2020                 :             :                   {
    2021                 :        1379 :                     tree other = make_ssa_name (TREE_TYPE (lhs));
    2022                 :        2068 :                     tree lrhs = build1 (TREE_CODE (lhs) == IMAGPART_EXPR
    2023                 :             :                                         ? REALPART_EXPR : IMAGPART_EXPR,
    2024                 :        1379 :                                         TREE_TYPE (other),
    2025                 :        1379 :                                         TREE_OPERAND (lhs, 0));
    2026                 :        1379 :                     suppress_warning (lrhs);
    2027                 :        1379 :                     gimple *load = gimple_build_assign (other, lrhs);
    2028                 :        1379 :                     location_t loc = gimple_location (stmt);
    2029                 :        1379 :                     gimple_set_location (load, loc);
    2030                 :        2758 :                     gimple_set_vuse (load, gimple_vuse (stmt));
    2031                 :        1379 :                     gsi_insert_before (&gsi, load, GSI_SAME_STMT);
    2032                 :        1379 :                     gimple_assign_set_lhs (stmt, TREE_OPERAND (lhs, 0));
    2033                 :        1379 :                     gimple_assign_set_rhs_with_ops
    2034                 :        2068 :                       (&gsi, COMPLEX_EXPR,
    2035                 :             :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2036                 :         689 :                        ? other : gimple_assign_rhs1 (stmt),
    2037                 :        1379 :                        TREE_CODE (lhs) == IMAGPART_EXPR
    2038                 :         690 :                        ? gimple_assign_rhs1 (stmt) : other, NULL_TREE);
    2039                 :        1379 :                     stmt = gsi_stmt (gsi);
    2040                 :        1379 :                     unlink_stmt_vdef (stmt);
    2041                 :        1379 :                     update_stmt (stmt);
    2042                 :        1379 :                     continue;
    2043                 :        1379 :                   }
    2044                 :             : 
    2045                 :             :                 /* Rewrite a vector insert via a BIT_FIELD_REF on the LHS
    2046                 :             :                    into a BIT_INSERT_EXPR.  */
    2047                 :    11732152 :                 if (TREE_CODE (lhs) == BIT_FIELD_REF
    2048                 :         670 :                     && DECL_P (TREE_OPERAND (lhs, 0))
    2049                 :         614 :                     && bitmap_bit_p (suitable_for_renaming,
    2050                 :         614 :                                      DECL_UID (TREE_OPERAND (lhs, 0)))
    2051                 :         536 :                     && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (lhs, 0)))
    2052                 :         536 :                     && TYPE_MODE (TREE_TYPE (TREE_OPERAND (lhs, 0))) != BLKmode
    2053                 :         536 :                     && operand_equal_p (TYPE_SIZE_UNIT (TREE_TYPE (lhs)),
    2054                 :         536 :                                         TYPE_SIZE_UNIT (TREE_TYPE
    2055                 :             :                                           (TREE_TYPE (TREE_OPERAND (lhs, 0)))),
    2056                 :             :                                         0)
    2057                 :    11732688 :                     && (tree_to_uhwi (TREE_OPERAND (lhs, 2))
    2058                 :         536 :                         % tree_to_uhwi (TYPE_SIZE (TREE_TYPE (lhs))) == 0))
    2059                 :             :                   {
    2060                 :         536 :                     tree var = TREE_OPERAND (lhs, 0);
    2061                 :         536 :                     tree val = gimple_assign_rhs1 (stmt);
    2062                 :         536 :                     if (! types_compatible_p (TREE_TYPE (TREE_TYPE (var)),
    2063                 :         536 :                                               TREE_TYPE (val)))
    2064                 :             :                       {
    2065                 :           0 :                         tree tem = make_ssa_name (TREE_TYPE (TREE_TYPE (var)));
    2066                 :           0 :                         gimple *pun
    2067                 :           0 :                           = gimple_build_assign (tem,
    2068                 :             :                                                  build1 (VIEW_CONVERT_EXPR,
    2069                 :           0 :                                                          TREE_TYPE (tem), val));
    2070                 :           0 :                         gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
    2071                 :           0 :                         val = tem;
    2072                 :             :                       }
    2073                 :         536 :                     tree bitpos = TREE_OPERAND (lhs, 2);
    2074                 :         536 :                     gimple_assign_set_lhs (stmt, var);
    2075                 :         536 :                     gimple_assign_set_rhs_with_ops
    2076                 :         536 :                       (&gsi, BIT_INSERT_EXPR, var, val, bitpos);
    2077                 :         536 :                     stmt = gsi_stmt (gsi);
    2078                 :         536 :                     unlink_stmt_vdef (stmt);
    2079                 :         536 :                     update_stmt (stmt);
    2080                 :         536 :                     continue;
    2081                 :         536 :                   }
    2082                 :             : 
    2083                 :             :                 /* Rewrite a vector insert using a MEM_REF on the LHS
    2084                 :             :                    into a BIT_INSERT_EXPR.  */
    2085                 :    11731616 :                 if (TREE_CODE (lhs) == MEM_REF
    2086                 :      605189 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2087                 :      201206 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2088                 :      201206 :                     && DECL_P (sym)
    2089                 :      201206 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym))
    2090                 :        6405 :                     && VECTOR_TYPE_P (TREE_TYPE (sym))
    2091                 :         130 :                     && TYPE_MODE (TREE_TYPE (sym)) != BLKmode
    2092                 :             :                     /* If it is a full replacement we can do better below.  */
    2093                 :         128 :                     && maybe_ne (wi::to_poly_offset
    2094                 :         128 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (lhs))),
    2095                 :             :                                  wi::to_poly_offset
    2096                 :         128 :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))))
    2097                 :          79 :                     && known_ge (mem_ref_offset (lhs), 0)
    2098                 :          79 :                     && known_gt (wi::to_poly_offset
    2099                 :             :                                    (TYPE_SIZE_UNIT (TREE_TYPE (sym))),
    2100                 :             :                                  mem_ref_offset (lhs))
    2101                 :    11731695 :                     && multiple_p (mem_ref_offset (lhs),
    2102                 :             :                                    wi::to_poly_offset
    2103                 :    11731616 :                                      (TYPE_SIZE_UNIT (TREE_TYPE (lhs)))))
    2104                 :             :                   {
    2105                 :          79 :                     tree val = gimple_assign_rhs1 (stmt);
    2106                 :          79 :                     if (! types_compatible_p (TREE_TYPE (val),
    2107                 :          79 :                                               TREE_TYPE (TREE_TYPE (sym))))
    2108                 :             :                       {
    2109                 :          56 :                         poly_uint64 lhs_bits, nelts;
    2110                 :          56 :                         tree temtype = TREE_TYPE (TREE_TYPE (sym));
    2111                 :          56 :                         if (poly_int_tree_p (TYPE_SIZE (TREE_TYPE (lhs)),
    2112                 :             :                                              &lhs_bits)
    2113                 :          56 :                             && multiple_p (lhs_bits,
    2114                 :             :                                            tree_to_uhwi
    2115                 :          56 :                                              (TYPE_SIZE (TREE_TYPE
    2116                 :             :                                                            (TREE_TYPE (sym)))),
    2117                 :             :                                            &nelts)
    2118                 :          56 :                             && maybe_ne (nelts, 1u)
    2119                 :          56 :                             && valid_vector_subparts_p (nelts))
    2120                 :          30 :                           temtype = build_vector_type (temtype, nelts);
    2121                 :          56 :                         tree tem = make_ssa_name (temtype);
    2122                 :          56 :                         gimple *pun
    2123                 :          56 :                           = gimple_build_assign (tem,
    2124                 :             :                                                  build1 (VIEW_CONVERT_EXPR,
    2125                 :          56 :                                                          TREE_TYPE (tem), val));
    2126                 :          56 :                         gsi_insert_before (&gsi, pun, GSI_SAME_STMT);
    2127                 :          56 :                         val = tem;
    2128                 :             :                       }
    2129                 :          79 :                     tree bitpos
    2130                 :          79 :                       = wide_int_to_tree (bitsizetype,
    2131                 :          79 :                                           mem_ref_offset (lhs) * BITS_PER_UNIT);
    2132                 :          79 :                     gimple_assign_set_lhs (stmt, sym);
    2133                 :          79 :                     gimple_assign_set_rhs_with_ops
    2134                 :          79 :                       (&gsi, BIT_INSERT_EXPR, sym, val, bitpos);
    2135                 :          79 :                     stmt = gsi_stmt (gsi);
    2136                 :          79 :                     unlink_stmt_vdef (stmt);
    2137                 :          79 :                     update_stmt (stmt);
    2138                 :          79 :                     continue;
    2139                 :          79 :                   }
    2140                 :             : 
    2141                 :             :                 /* We shouldn't have any fancy wrapping of
    2142                 :             :                    component-refs on the LHS, but look through
    2143                 :             :                    VIEW_CONVERT_EXPRs as that is easy.  */
    2144                 :    11731537 :                 while (TREE_CODE (lhs) == VIEW_CONVERT_EXPR)
    2145                 :           0 :                   lhs = TREE_OPERAND (lhs, 0);
    2146                 :    11731537 :                 if (TREE_CODE (lhs) == MEM_REF
    2147                 :      605110 :                     && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR
    2148                 :      201127 :                     && integer_zerop (TREE_OPERAND (lhs, 1))
    2149                 :      136985 :                     && (sym = TREE_OPERAND (TREE_OPERAND (lhs, 0), 0))
    2150                 :      136985 :                     && DECL_P (sym)
    2151                 :      136985 :                     && !TREE_ADDRESSABLE (sym)
    2152                 :    11795024 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (sym)))
    2153                 :             :                   lhs = sym;
    2154                 :             :                 else
    2155                 :    11725211 :                   lhs = gimple_assign_lhs (stmt);
    2156                 :             : 
    2157                 :             :                 /* Rewrite the RHS and make sure the resulting assignment
    2158                 :             :                    is validly typed.  */
    2159                 :    11731537 :                 maybe_rewrite_mem_ref_base (rhsp, suitable_for_renaming);
    2160                 :    11731537 :                 rhs = gimple_assign_rhs1 (stmt);
    2161                 :    11731537 :                 if (gimple_assign_lhs (stmt) != lhs
    2162                 :    11737863 :                     && !useless_type_conversion_p (TREE_TYPE (lhs),
    2163                 :        6326 :                                                    TREE_TYPE (rhs)))
    2164                 :             :                   {
    2165                 :        3292 :                     if (gimple_clobber_p (stmt))
    2166                 :             :                       {
    2167                 :           5 :                         rhs = build_constructor (TREE_TYPE (lhs), NULL);
    2168                 :           5 :                         TREE_THIS_VOLATILE (rhs) = 1;
    2169                 :             :                       }
    2170                 :             :                     else
    2171                 :        3287 :                       rhs = fold_build1 (VIEW_CONVERT_EXPR,
    2172                 :             :                                          TREE_TYPE (lhs), rhs);
    2173                 :             :                   }
    2174                 :    11731537 :                 if (gimple_assign_lhs (stmt) != lhs)
    2175                 :        6326 :                   gimple_assign_set_lhs (stmt, lhs);
    2176                 :             : 
    2177                 :    11731537 :                 if (gimple_assign_rhs1 (stmt) != rhs)
    2178                 :             :                   {
    2179                 :        3292 :                     gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
    2180                 :        3292 :                     gimple_assign_set_rhs_from_tree (&gsi, rhs);
    2181                 :             :                   }
    2182                 :             :               }
    2183                 :             : 
    2184                 :    24198972 :             else if (gimple_code (stmt) == GIMPLE_CALL)
    2185                 :             :               {
    2186                 :     2334585 :                 unsigned i;
    2187                 :     2334585 :                 if (optimize_atomic_compare_exchange_p (stmt))
    2188                 :             :                   {
    2189                 :        5869 :                     tree expected = gimple_call_arg (stmt, 1);
    2190                 :        5869 :                     tree decl = TREE_OPERAND (expected, 0);
    2191                 :        5869 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2192                 :             :                       {
    2193                 :        5753 :                         fold_builtin_atomic_compare_exchange (&gsi);
    2194                 :        5753 :                         continue;
    2195                 :             :                       }
    2196                 :         116 :                     else if (!TREE_ADDRESSABLE (decl))
    2197                 :             :                       /* If there are partial defs of the decl we may
    2198                 :             :                          have cleared the addressable bit but set
    2199                 :             :                          DECL_NOT_GIMPLE_REG_P.  We have to restore
    2200                 :             :                          TREE_ADDRESSABLE here.  */
    2201                 :          36 :                       TREE_ADDRESSABLE (decl) = 1;
    2202                 :             :                   }
    2203                 :     2328716 :                 else if (is_asan_mark_p (stmt))
    2204                 :             :                   {
    2205                 :         332 :                     tree var = TREE_OPERAND (gimple_call_arg (stmt, 1), 0);
    2206                 :         332 :                     if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
    2207                 :             :                       {
    2208                 :         284 :                         unlink_stmt_vdef (stmt);
    2209                 :         284 :                         if (asan_mark_p (stmt, ASAN_MARK_POISON))
    2210                 :             :                           {
    2211                 :         147 :                             gcall *call
    2212                 :         147 :                               = gimple_build_call_internal (IFN_ASAN_POISON, 0);
    2213                 :         147 :                             gimple_call_set_lhs (call, var);
    2214                 :         147 :                             gsi_replace (&gsi, call, true);
    2215                 :             :                           }
    2216                 :             :                         else
    2217                 :             :                           {
    2218                 :             :                             /* In ASAN_MARK (UNPOISON, &b, ...) the variable
    2219                 :             :                                is uninitialized.  Avoid dependencies on
    2220                 :             :                                previous out of scope value.  */
    2221                 :         137 :                             tree clobber = build_clobber (TREE_TYPE (var));
    2222                 :         137 :                             gimple *g = gimple_build_assign (var, clobber);
    2223                 :         137 :                             gsi_replace (&gsi, g, true);
    2224                 :             :                           }
    2225                 :         284 :                         continue;
    2226                 :         284 :                       }
    2227                 :             :                   }
    2228                 :     2328384 :                 else if (gimple_call_internal_p (stmt, IFN_GOMP_SIMT_ENTER))
    2229                 :           0 :                   for (i = 1; i < gimple_call_num_args (stmt); i++)
    2230                 :             :                     {
    2231                 :           0 :                       tree *argp = gimple_call_arg_ptr (stmt, i);
    2232                 :           0 :                       if (*argp == null_pointer_node)
    2233                 :           0 :                         continue;
    2234                 :           0 :                       gcc_assert (TREE_CODE (*argp) == ADDR_EXPR
    2235                 :             :                                   && VAR_P (TREE_OPERAND (*argp, 0)));
    2236                 :           0 :                       tree var = TREE_OPERAND (*argp, 0);
    2237                 :           0 :                       if (bitmap_bit_p (suitable_for_renaming, DECL_UID (var)))
    2238                 :           0 :                         *argp = null_pointer_node;
    2239                 :             :                     }
    2240                 :     6547495 :                 for (i = 0; i < gimple_call_num_args (stmt); ++i)
    2241                 :             :                   {
    2242                 :     4218947 :                     tree *argp = gimple_call_arg_ptr (stmt, i);
    2243                 :     4218947 :                     maybe_rewrite_mem_ref_base (argp, suitable_for_renaming);
    2244                 :             :                   }
    2245                 :             :               }
    2246                 :             : 
    2247                 :    21864387 :             else if (gimple_code (stmt) == GIMPLE_ASM)
    2248                 :             :               {
    2249                 :       18304 :                 gasm *asm_stmt = as_a <gasm *> (stmt);
    2250                 :       18304 :                 unsigned i;
    2251                 :       72151 :                 for (i = 0; i < gimple_asm_noutputs (asm_stmt); ++i)
    2252                 :             :                   {
    2253                 :       53847 :                     tree link = gimple_asm_output_op (asm_stmt, i);
    2254                 :       53847 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2255                 :             :                                                 suitable_for_renaming);
    2256                 :             :                   }
    2257                 :       38110 :                 for (i = 0; i < gimple_asm_ninputs (asm_stmt); ++i)
    2258                 :             :                   {
    2259                 :       19806 :                     tree link = gimple_asm_input_op (asm_stmt, i);
    2260                 :       19806 :                     maybe_rewrite_mem_ref_base (&TREE_VALUE (link),
    2261                 :             :                                                 suitable_for_renaming);
    2262                 :             :                   }
    2263                 :             :               }
    2264                 :             : 
    2265                 :    21846083 :             else if (gimple_debug_bind_p (stmt)
    2266                 :    16670344 :                      && gimple_debug_bind_has_value_p (stmt))
    2267                 :             :               {
    2268                 :     6583865 :                 tree *valuep = gimple_debug_bind_get_value_ptr (stmt);
    2269                 :     6583865 :                 tree decl;
    2270                 :     6583865 :                 maybe_rewrite_mem_ref_base (valuep, suitable_for_renaming);
    2271                 :     6583865 :                 decl = non_rewritable_mem_ref_base (*valuep);
    2272                 :     6583865 :                 if (decl
    2273                 :     6583865 :                     && bitmap_bit_p (suitable_for_renaming, DECL_UID (decl)))
    2274                 :          12 :                   gimple_debug_bind_reset_value (stmt);
    2275                 :             :               }
    2276                 :             : 
    2277                 :    48635927 :             if (gimple_references_memory_p (stmt)
    2278                 :    31356344 :                 || is_gimple_debug (stmt))
    2279                 :    21238472 :               update_stmt (stmt);
    2280                 :             : 
    2281                 :    35924472 :             gsi_next (&gsi);
    2282                 :             :           }
    2283                 :             : 
    2284                 :             :       /* Update SSA form here, we are called as non-pass as well.  */
    2285                 :      187600 :       if (number_of_loops (cfun) > 1
    2286                 :      187600 :           && loops_state_satisfies_p (LOOP_CLOSED_SSA))
    2287                 :          47 :         rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
    2288                 :             :       else
    2289                 :      187553 :         update_ssa (TODO_update_ssa);
    2290                 :             :     }
    2291                 :             : 
    2292                 :    11584039 :   timevar_pop (TV_ADDRESS_TAKEN);
    2293                 :    11584039 : }
    2294                 :             : 
    2295                 :             : namespace {
    2296                 :             : 
    2297                 :             : const pass_data pass_data_update_address_taken =
    2298                 :             : {
    2299                 :             :   GIMPLE_PASS, /* type */
    2300                 :             :   "addressables", /* name */
    2301                 :             :   OPTGROUP_NONE, /* optinfo_flags */
    2302                 :             :   TV_ADDRESS_TAKEN, /* tv_id */
    2303                 :             :   PROP_ssa, /* properties_required */
    2304                 :             :   0, /* properties_provided */
    2305                 :             :   0, /* properties_destroyed */
    2306                 :             :   0, /* todo_flags_start */
    2307                 :             :   TODO_update_address_taken, /* todo_flags_finish */
    2308                 :             : };
    2309                 :             : 
    2310                 :             : class pass_update_address_taken : public gimple_opt_pass
    2311                 :             : {
    2312                 :             : public:
    2313                 :           0 :   pass_update_address_taken (gcc::context *ctxt)
    2314                 :           0 :     : gimple_opt_pass (pass_data_update_address_taken, ctxt)
    2315                 :             :   {}
    2316                 :             : 
    2317                 :             :   /* opt_pass methods: */
    2318                 :             : 
    2319                 :             : }; // class pass_update_address_taken
    2320                 :             : 
    2321                 :             : } // anon namespace
    2322                 :             : 
    2323                 :             : gimple_opt_pass *
    2324                 :           0 : make_pass_update_address_taken (gcc::context *ctxt)
    2325                 :             : {
    2326                 :           0 :   return new pass_update_address_taken (ctxt);
    2327                 :             : }
        

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.