xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/tree-into-ssa.c (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
11debfc3dSmrg /* Rewrite a program in Normal form into SSA.
2*8feb0f0bSmrg    Copyright (C) 2001-2020 Free Software Foundation, Inc.
31debfc3dSmrg    Contributed by Diego Novillo <dnovillo@redhat.com>
41debfc3dSmrg 
51debfc3dSmrg This file is part of GCC.
61debfc3dSmrg 
71debfc3dSmrg GCC is free software; you can redistribute it and/or modify
81debfc3dSmrg it under the terms of the GNU General Public License as published by
91debfc3dSmrg the Free Software Foundation; either version 3, or (at your option)
101debfc3dSmrg any later version.
111debfc3dSmrg 
121debfc3dSmrg GCC is distributed in the hope that it will be useful,
131debfc3dSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
141debfc3dSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151debfc3dSmrg GNU General Public License for more details.
161debfc3dSmrg 
171debfc3dSmrg You should have received a copy of the GNU General Public License
181debfc3dSmrg along with GCC; see the file COPYING3.  If not see
191debfc3dSmrg <http://www.gnu.org/licenses/>.  */
201debfc3dSmrg 
211debfc3dSmrg #include "config.h"
221debfc3dSmrg #include "system.h"
231debfc3dSmrg #include "coretypes.h"
241debfc3dSmrg #include "backend.h"
251debfc3dSmrg #include "rtl.h"
261debfc3dSmrg #include "tree.h"
271debfc3dSmrg #include "gimple.h"
281debfc3dSmrg #include "tree-pass.h"
291debfc3dSmrg #include "ssa.h"
301debfc3dSmrg #include "gimple-pretty-print.h"
311debfc3dSmrg #include "diagnostic-core.h"
321debfc3dSmrg #include "langhooks.h"
331debfc3dSmrg #include "cfganal.h"
341debfc3dSmrg #include "gimple-iterator.h"
351debfc3dSmrg #include "tree-cfg.h"
361debfc3dSmrg #include "tree-into-ssa.h"
371debfc3dSmrg #include "tree-dfa.h"
381debfc3dSmrg #include "tree-ssa.h"
391debfc3dSmrg #include "domwalk.h"
401debfc3dSmrg #include "statistics.h"
41a2dc1f3fSmrg #include "stringpool.h"
42a2dc1f3fSmrg #include "attribs.h"
431debfc3dSmrg #include "asan.h"
441debfc3dSmrg 
451debfc3dSmrg #define PERCENT(x,y) ((float)(x) * 100.0 / (float)(y))
461debfc3dSmrg 
471debfc3dSmrg /* This file builds the SSA form for a function as described in:
481debfc3dSmrg    R. Cytron, J. Ferrante, B. Rosen, M. Wegman, and K. Zadeck. Efficiently
491debfc3dSmrg    Computing Static Single Assignment Form and the Control Dependence
501debfc3dSmrg    Graph. ACM Transactions on Programming Languages and Systems,
511debfc3dSmrg    13(4):451-490, October 1991.  */
521debfc3dSmrg 
531debfc3dSmrg /* Structure to map a variable VAR to the set of blocks that contain
541debfc3dSmrg    definitions for VAR.  */
551debfc3dSmrg struct def_blocks
561debfc3dSmrg {
571debfc3dSmrg   /* Blocks that contain definitions of VAR.  Bit I will be set if the
581debfc3dSmrg      Ith block contains a definition of VAR.  */
591debfc3dSmrg   bitmap def_blocks;
601debfc3dSmrg 
611debfc3dSmrg   /* Blocks that contain a PHI node for VAR.  */
621debfc3dSmrg   bitmap phi_blocks;
631debfc3dSmrg 
641debfc3dSmrg   /* Blocks where VAR is live-on-entry.  Similar semantics as
651debfc3dSmrg      DEF_BLOCKS.  */
661debfc3dSmrg   bitmap livein_blocks;
671debfc3dSmrg };
681debfc3dSmrg 
691debfc3dSmrg /* Stack of trees used to restore the global currdefs to its original
701debfc3dSmrg    state after completing rewriting of a block and its dominator
711debfc3dSmrg    children.  Its elements have the following properties:
721debfc3dSmrg 
731debfc3dSmrg    - An SSA_NAME (N) indicates that the current definition of the
741debfc3dSmrg      underlying variable should be set to the given SSA_NAME.  If the
751debfc3dSmrg      symbol associated with the SSA_NAME is not a GIMPLE register, the
761debfc3dSmrg      next slot in the stack must be a _DECL node (SYM).  In this case,
771debfc3dSmrg      the name N in the previous slot is the current reaching
781debfc3dSmrg      definition for SYM.
791debfc3dSmrg 
801debfc3dSmrg    - A _DECL node indicates that the underlying variable has no
811debfc3dSmrg      current definition.
821debfc3dSmrg 
831debfc3dSmrg    - A NULL node at the top entry is used to mark the last slot
841debfc3dSmrg      associated with the current block.  */
851debfc3dSmrg static vec<tree> block_defs_stack;
861debfc3dSmrg 
871debfc3dSmrg 
881debfc3dSmrg /* Set of existing SSA names being replaced by update_ssa.  */
891debfc3dSmrg static sbitmap old_ssa_names;
901debfc3dSmrg 
911debfc3dSmrg /* Set of new SSA names being added by update_ssa.  Note that both
921debfc3dSmrg    NEW_SSA_NAMES and OLD_SSA_NAMES are dense bitmaps because most of
931debfc3dSmrg    the operations done on them are presence tests.  */
941debfc3dSmrg static sbitmap new_ssa_names;
951debfc3dSmrg 
961debfc3dSmrg static sbitmap interesting_blocks;
971debfc3dSmrg 
981debfc3dSmrg /* Set of SSA names that have been marked to be released after they
991debfc3dSmrg    were registered in the replacement table.  They will be finally
1001debfc3dSmrg    released after we finish updating the SSA web.  */
1011debfc3dSmrg bitmap names_to_release;
1021debfc3dSmrg 
1031debfc3dSmrg /* vec of vec of PHIs to rewrite in a basic block.  Element I corresponds
1041debfc3dSmrg    the to basic block with index I.  Allocated once per compilation, *not*
1051debfc3dSmrg    released between different functions.  */
1061debfc3dSmrg static vec< vec<gphi *> > phis_to_rewrite;
1071debfc3dSmrg 
1081debfc3dSmrg /* The bitmap of non-NULL elements of PHIS_TO_REWRITE.  */
1091debfc3dSmrg static bitmap blocks_with_phis_to_rewrite;
1101debfc3dSmrg 
1111debfc3dSmrg /* Growth factor for NEW_SSA_NAMES and OLD_SSA_NAMES.  These sets need
1121debfc3dSmrg    to grow as the callers to create_new_def_for will create new names on
1131debfc3dSmrg    the fly.
1141debfc3dSmrg    FIXME.  Currently set to 1/3 to avoid frequent reallocations but still
1151debfc3dSmrg    need to find a reasonable growth strategy.  */
1161debfc3dSmrg #define NAME_SETS_GROWTH_FACTOR	(MAX (3, num_ssa_names / 3))
1171debfc3dSmrg 
1181debfc3dSmrg 
1191debfc3dSmrg /* The function the SSA updating data structures have been initialized for.
1201debfc3dSmrg    NULL if they need to be initialized by create_new_def_for.  */
1211debfc3dSmrg static struct function *update_ssa_initialized_fn = NULL;
1221debfc3dSmrg 
1231debfc3dSmrg /* Global data to attach to the main dominator walk structure.  */
1241debfc3dSmrg struct mark_def_sites_global_data
1251debfc3dSmrg {
1261debfc3dSmrg   /* This bitmap contains the variables which are set before they
1271debfc3dSmrg      are used in a basic block.  */
1281debfc3dSmrg   bitmap kills;
1291debfc3dSmrg };
1301debfc3dSmrg 
1311debfc3dSmrg /* It is advantageous to avoid things like life analysis for variables which
1321debfc3dSmrg    do not need PHI nodes.  This enum describes whether or not a particular
1331debfc3dSmrg    variable may need a PHI node.  */
1341debfc3dSmrg 
1351debfc3dSmrg enum need_phi_state {
1361debfc3dSmrg   /* This is the default.  If we are still in this state after finding
1371debfc3dSmrg      all the definition and use sites, then we will assume the variable
1381debfc3dSmrg      needs PHI nodes.  This is probably an overly conservative assumption.  */
1391debfc3dSmrg   NEED_PHI_STATE_UNKNOWN,
1401debfc3dSmrg 
1411debfc3dSmrg   /* This state indicates that we have seen one or more sets of the
1421debfc3dSmrg      variable in a single basic block and that the sets dominate all
1431debfc3dSmrg      uses seen so far.  If after finding all definition and use sites
1441debfc3dSmrg      we are still in this state, then the variable does not need any
1451debfc3dSmrg      PHI nodes.  */
1461debfc3dSmrg   NEED_PHI_STATE_NO,
1471debfc3dSmrg 
1481debfc3dSmrg   /* This state indicates that we have either seen multiple definitions of
1491debfc3dSmrg      the variable in multiple blocks, or that we encountered a use in a
1501debfc3dSmrg      block that was not dominated by the block containing the set(s) of
1511debfc3dSmrg      this variable.  This variable is assumed to need PHI nodes.  */
1521debfc3dSmrg   NEED_PHI_STATE_MAYBE
1531debfc3dSmrg };
1541debfc3dSmrg 
1551debfc3dSmrg /* Information stored for both SSA names and decls.  */
1561debfc3dSmrg struct common_info
1571debfc3dSmrg {
1581debfc3dSmrg   /* This field indicates whether or not the variable may need PHI nodes.
1591debfc3dSmrg      See the enum's definition for more detailed information about the
1601debfc3dSmrg      states.  */
1611debfc3dSmrg   ENUM_BITFIELD (need_phi_state) need_phi_state : 2;
1621debfc3dSmrg 
1631debfc3dSmrg   /* The current reaching definition replacing this var.  */
1641debfc3dSmrg   tree current_def;
1651debfc3dSmrg 
1661debfc3dSmrg   /* Definitions for this var.  */
1671debfc3dSmrg   struct def_blocks def_blocks;
1681debfc3dSmrg };
1691debfc3dSmrg 
1701debfc3dSmrg /* Information stored for decls.  */
1711debfc3dSmrg struct var_info
1721debfc3dSmrg {
1731debfc3dSmrg   /* The variable.  */
1741debfc3dSmrg   tree var;
1751debfc3dSmrg 
1761debfc3dSmrg   /* Information stored for both SSA names and decls.  */
1771debfc3dSmrg   common_info info;
1781debfc3dSmrg };
1791debfc3dSmrg 
1801debfc3dSmrg 
1811debfc3dSmrg /* VAR_INFOS hashtable helpers.  */
1821debfc3dSmrg 
1831debfc3dSmrg struct var_info_hasher : free_ptr_hash <var_info>
1841debfc3dSmrg {
1851debfc3dSmrg   static inline hashval_t hash (const value_type &);
1861debfc3dSmrg   static inline bool equal (const value_type &, const compare_type &);
1871debfc3dSmrg };
1881debfc3dSmrg 
1891debfc3dSmrg inline hashval_t
hash(const value_type & p)1901debfc3dSmrg var_info_hasher::hash (const value_type &p)
1911debfc3dSmrg {
1921debfc3dSmrg   return DECL_UID (p->var);
1931debfc3dSmrg }
1941debfc3dSmrg 
1951debfc3dSmrg inline bool
equal(const value_type & p1,const compare_type & p2)1961debfc3dSmrg var_info_hasher::equal (const value_type &p1, const compare_type &p2)
1971debfc3dSmrg {
1981debfc3dSmrg   return p1->var == p2->var;
1991debfc3dSmrg }
2001debfc3dSmrg 
2011debfc3dSmrg 
2021debfc3dSmrg /* Each entry in VAR_INFOS contains an element of type STRUCT
2031debfc3dSmrg    VAR_INFO_D.  */
2041debfc3dSmrg static hash_table<var_info_hasher> *var_infos;
2051debfc3dSmrg 
2061debfc3dSmrg 
2071debfc3dSmrg /* Information stored for SSA names.  */
2081debfc3dSmrg struct ssa_name_info
2091debfc3dSmrg {
2101debfc3dSmrg   /* Age of this record (so that info_for_ssa_name table can be cleared
2111debfc3dSmrg      quickly); if AGE < CURRENT_INFO_FOR_SSA_NAME_AGE, then the fields
2121debfc3dSmrg      are assumed to be null.  */
2131debfc3dSmrg   unsigned age;
2141debfc3dSmrg 
2151debfc3dSmrg   /* Replacement mappings, allocated from update_ssa_obstack.  */
2161debfc3dSmrg   bitmap repl_set;
2171debfc3dSmrg 
2181debfc3dSmrg   /* Information stored for both SSA names and decls.  */
2191debfc3dSmrg   common_info info;
2201debfc3dSmrg };
2211debfc3dSmrg 
2221debfc3dSmrg static vec<ssa_name_info *> info_for_ssa_name;
2231debfc3dSmrg static unsigned current_info_for_ssa_name_age;
2241debfc3dSmrg 
2251debfc3dSmrg static bitmap_obstack update_ssa_obstack;
2261debfc3dSmrg 
2271debfc3dSmrg /* The set of blocks affected by update_ssa.  */
2281debfc3dSmrg static bitmap blocks_to_update;
2291debfc3dSmrg 
2301debfc3dSmrg /* The main entry point to the SSA renamer (rewrite_blocks) may be
2311debfc3dSmrg    called several times to do different, but related, tasks.
2321debfc3dSmrg    Initially, we need it to rename the whole program into SSA form.
2331debfc3dSmrg    At other times, we may need it to only rename into SSA newly
2341debfc3dSmrg    exposed symbols.  Finally, we can also call it to incrementally fix
2351debfc3dSmrg    an already built SSA web.  */
2361debfc3dSmrg enum rewrite_mode {
2371debfc3dSmrg     /* Convert the whole function into SSA form.  */
2381debfc3dSmrg     REWRITE_ALL,
2391debfc3dSmrg 
2401debfc3dSmrg     /* Incrementally update the SSA web by replacing existing SSA
2411debfc3dSmrg        names with new ones.  See update_ssa for details.  */
2421debfc3dSmrg     REWRITE_UPDATE
2431debfc3dSmrg };
2441debfc3dSmrg 
2451debfc3dSmrg /* The set of symbols we ought to re-write into SSA form in update_ssa.  */
2461debfc3dSmrg static bitmap symbols_to_rename_set;
2471debfc3dSmrg static vec<tree> symbols_to_rename;
2481debfc3dSmrg 
2491debfc3dSmrg /* Mark SYM for renaming.  */
2501debfc3dSmrg 
2511debfc3dSmrg static void
mark_for_renaming(tree sym)2521debfc3dSmrg mark_for_renaming (tree sym)
2531debfc3dSmrg {
2541debfc3dSmrg   if (!symbols_to_rename_set)
2551debfc3dSmrg     symbols_to_rename_set = BITMAP_ALLOC (NULL);
2561debfc3dSmrg   if (bitmap_set_bit (symbols_to_rename_set, DECL_UID (sym)))
2571debfc3dSmrg     symbols_to_rename.safe_push (sym);
2581debfc3dSmrg }
2591debfc3dSmrg 
2601debfc3dSmrg /* Return true if SYM is marked for renaming.  */
2611debfc3dSmrg 
2621debfc3dSmrg static bool
marked_for_renaming(tree sym)2631debfc3dSmrg marked_for_renaming (tree sym)
2641debfc3dSmrg {
2651debfc3dSmrg   if (!symbols_to_rename_set || sym == NULL_TREE)
2661debfc3dSmrg     return false;
2671debfc3dSmrg   return bitmap_bit_p (symbols_to_rename_set, DECL_UID (sym));
2681debfc3dSmrg }
2691debfc3dSmrg 
2701debfc3dSmrg 
2711debfc3dSmrg /* Return true if STMT needs to be rewritten.  When renaming a subset
2721debfc3dSmrg    of the variables, not all statements will be processed.  This is
2731debfc3dSmrg    decided in mark_def_sites.  */
2741debfc3dSmrg 
2751debfc3dSmrg static inline bool
rewrite_uses_p(gimple * stmt)2761debfc3dSmrg rewrite_uses_p (gimple *stmt)
2771debfc3dSmrg {
2781debfc3dSmrg   return gimple_visited_p (stmt);
2791debfc3dSmrg }
2801debfc3dSmrg 
2811debfc3dSmrg 
2821debfc3dSmrg /* Set the rewrite marker on STMT to the value given by REWRITE_P.  */
2831debfc3dSmrg 
2841debfc3dSmrg static inline void
set_rewrite_uses(gimple * stmt,bool rewrite_p)2851debfc3dSmrg set_rewrite_uses (gimple *stmt, bool rewrite_p)
2861debfc3dSmrg {
2871debfc3dSmrg   gimple_set_visited (stmt, rewrite_p);
2881debfc3dSmrg }
2891debfc3dSmrg 
2901debfc3dSmrg 
2911debfc3dSmrg /* Return true if the DEFs created by statement STMT should be
2921debfc3dSmrg    registered when marking new definition sites.  This is slightly
2931debfc3dSmrg    different than rewrite_uses_p: it's used by update_ssa to
2941debfc3dSmrg    distinguish statements that need to have both uses and defs
2951debfc3dSmrg    processed from those that only need to have their defs processed.
2961debfc3dSmrg    Statements that define new SSA names only need to have their defs
2971debfc3dSmrg    registered, but they don't need to have their uses renamed.  */
2981debfc3dSmrg 
2991debfc3dSmrg static inline bool
register_defs_p(gimple * stmt)3001debfc3dSmrg register_defs_p (gimple *stmt)
3011debfc3dSmrg {
3021debfc3dSmrg   return gimple_plf (stmt, GF_PLF_1) != 0;
3031debfc3dSmrg }
3041debfc3dSmrg 
3051debfc3dSmrg 
3061debfc3dSmrg /* If REGISTER_DEFS_P is true, mark STMT to have its DEFs registered.  */
3071debfc3dSmrg 
3081debfc3dSmrg static inline void
set_register_defs(gimple * stmt,bool register_defs_p)3091debfc3dSmrg set_register_defs (gimple *stmt, bool register_defs_p)
3101debfc3dSmrg {
3111debfc3dSmrg   gimple_set_plf (stmt, GF_PLF_1, register_defs_p);
3121debfc3dSmrg }
3131debfc3dSmrg 
3141debfc3dSmrg 
3151debfc3dSmrg /* Get the information associated with NAME.  */
3161debfc3dSmrg 
3171debfc3dSmrg static inline ssa_name_info *
get_ssa_name_ann(tree name)3181debfc3dSmrg get_ssa_name_ann (tree name)
3191debfc3dSmrg {
3201debfc3dSmrg   unsigned ver = SSA_NAME_VERSION (name);
3211debfc3dSmrg   unsigned len = info_for_ssa_name.length ();
3221debfc3dSmrg   struct ssa_name_info *info;
3231debfc3dSmrg 
3241debfc3dSmrg   /* Re-allocate the vector at most once per update/into-SSA.  */
3251debfc3dSmrg   if (ver >= len)
3261debfc3dSmrg     info_for_ssa_name.safe_grow_cleared (num_ssa_names);
3271debfc3dSmrg 
3281debfc3dSmrg   /* But allocate infos lazily.  */
3291debfc3dSmrg   info = info_for_ssa_name[ver];
3301debfc3dSmrg   if (!info)
3311debfc3dSmrg     {
3321debfc3dSmrg       info = XCNEW (struct ssa_name_info);
3331debfc3dSmrg       info->age = current_info_for_ssa_name_age;
3341debfc3dSmrg       info->info.need_phi_state = NEED_PHI_STATE_UNKNOWN;
3351debfc3dSmrg       info_for_ssa_name[ver] = info;
3361debfc3dSmrg     }
3371debfc3dSmrg 
3381debfc3dSmrg   if (info->age < current_info_for_ssa_name_age)
3391debfc3dSmrg     {
3401debfc3dSmrg       info->age = current_info_for_ssa_name_age;
3411debfc3dSmrg       info->repl_set = NULL;
3421debfc3dSmrg       info->info.need_phi_state = NEED_PHI_STATE_UNKNOWN;
3431debfc3dSmrg       info->info.current_def = NULL_TREE;
3441debfc3dSmrg       info->info.def_blocks.def_blocks = NULL;
3451debfc3dSmrg       info->info.def_blocks.phi_blocks = NULL;
3461debfc3dSmrg       info->info.def_blocks.livein_blocks = NULL;
3471debfc3dSmrg     }
3481debfc3dSmrg 
3491debfc3dSmrg   return info;
3501debfc3dSmrg }
3511debfc3dSmrg 
3521debfc3dSmrg /* Return and allocate the auxiliar information for DECL.  */
3531debfc3dSmrg 
3541debfc3dSmrg static inline var_info *
get_var_info(tree decl)3551debfc3dSmrg get_var_info (tree decl)
3561debfc3dSmrg {
3571debfc3dSmrg   var_info vi;
3581debfc3dSmrg   var_info **slot;
3591debfc3dSmrg   vi.var = decl;
3601debfc3dSmrg   slot = var_infos->find_slot_with_hash (&vi, DECL_UID (decl), INSERT);
3611debfc3dSmrg   if (*slot == NULL)
3621debfc3dSmrg     {
3631debfc3dSmrg       var_info *v = XCNEW (var_info);
3641debfc3dSmrg       v->var = decl;
3651debfc3dSmrg       *slot = v;
3661debfc3dSmrg       return v;
3671debfc3dSmrg     }
3681debfc3dSmrg   return *slot;
3691debfc3dSmrg }
3701debfc3dSmrg 
3711debfc3dSmrg 
3721debfc3dSmrg /* Clears info for SSA names.  */
3731debfc3dSmrg 
3741debfc3dSmrg static void
clear_ssa_name_info(void)3751debfc3dSmrg clear_ssa_name_info (void)
3761debfc3dSmrg {
3771debfc3dSmrg   current_info_for_ssa_name_age++;
3781debfc3dSmrg 
3791debfc3dSmrg   /* If current_info_for_ssa_name_age wraps we use stale information.
3801debfc3dSmrg      Asser that this does not happen.  */
3811debfc3dSmrg   gcc_assert (current_info_for_ssa_name_age != 0);
3821debfc3dSmrg }
3831debfc3dSmrg 
3841debfc3dSmrg 
3851debfc3dSmrg /* Get access to the auxiliar information stored per SSA name or decl.  */
3861debfc3dSmrg 
3871debfc3dSmrg static inline common_info *
get_common_info(tree var)3881debfc3dSmrg get_common_info (tree var)
3891debfc3dSmrg {
3901debfc3dSmrg   if (TREE_CODE (var) == SSA_NAME)
3911debfc3dSmrg     return &get_ssa_name_ann (var)->info;
3921debfc3dSmrg   else
3931debfc3dSmrg     return &get_var_info (var)->info;
3941debfc3dSmrg }
3951debfc3dSmrg 
3961debfc3dSmrg 
3971debfc3dSmrg /* Return the current definition for VAR.  */
3981debfc3dSmrg 
3991debfc3dSmrg tree
get_current_def(tree var)4001debfc3dSmrg get_current_def (tree var)
4011debfc3dSmrg {
4021debfc3dSmrg   return get_common_info (var)->current_def;
4031debfc3dSmrg }
4041debfc3dSmrg 
4051debfc3dSmrg 
4061debfc3dSmrg /* Sets current definition of VAR to DEF.  */
4071debfc3dSmrg 
4081debfc3dSmrg void
set_current_def(tree var,tree def)4091debfc3dSmrg set_current_def (tree var, tree def)
4101debfc3dSmrg {
4111debfc3dSmrg   get_common_info (var)->current_def = def;
4121debfc3dSmrg }
4131debfc3dSmrg 
4141debfc3dSmrg /* Cleans up the REWRITE_THIS_STMT and REGISTER_DEFS_IN_THIS_STMT flags for
4151debfc3dSmrg    all statements in basic block BB.  */
4161debfc3dSmrg 
4171debfc3dSmrg static void
initialize_flags_in_bb(basic_block bb)4181debfc3dSmrg initialize_flags_in_bb (basic_block bb)
4191debfc3dSmrg {
4201debfc3dSmrg   gimple *stmt;
4211debfc3dSmrg   gimple_stmt_iterator gsi;
4221debfc3dSmrg 
4231debfc3dSmrg   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4241debfc3dSmrg     {
4251debfc3dSmrg       gimple *phi = gsi_stmt (gsi);
4261debfc3dSmrg       set_rewrite_uses (phi, false);
4271debfc3dSmrg       set_register_defs (phi, false);
4281debfc3dSmrg     }
4291debfc3dSmrg 
4301debfc3dSmrg   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
4311debfc3dSmrg     {
4321debfc3dSmrg       stmt = gsi_stmt (gsi);
4331debfc3dSmrg 
4341debfc3dSmrg       /* We are going to use the operand cache API, such as
4351debfc3dSmrg 	 SET_USE, SET_DEF, and FOR_EACH_IMM_USE_FAST.  The operand
4361debfc3dSmrg 	 cache for each statement should be up-to-date.  */
4371debfc3dSmrg       gcc_checking_assert (!gimple_modified_p (stmt));
4381debfc3dSmrg       set_rewrite_uses (stmt, false);
4391debfc3dSmrg       set_register_defs (stmt, false);
4401debfc3dSmrg     }
4411debfc3dSmrg }
4421debfc3dSmrg 
4431debfc3dSmrg /* Mark block BB as interesting for update_ssa.  */
4441debfc3dSmrg 
4451debfc3dSmrg static void
mark_block_for_update(basic_block bb)4461debfc3dSmrg mark_block_for_update (basic_block bb)
4471debfc3dSmrg {
4481debfc3dSmrg   gcc_checking_assert (blocks_to_update != NULL);
4491debfc3dSmrg   if (!bitmap_set_bit (blocks_to_update, bb->index))
4501debfc3dSmrg     return;
4511debfc3dSmrg   initialize_flags_in_bb (bb);
4521debfc3dSmrg }
4531debfc3dSmrg 
4541debfc3dSmrg /* Return the set of blocks where variable VAR is defined and the blocks
4551debfc3dSmrg    where VAR is live on entry (livein).  If no entry is found in
4561debfc3dSmrg    DEF_BLOCKS, a new one is created and returned.  */
4571debfc3dSmrg 
4581debfc3dSmrg static inline def_blocks *
get_def_blocks_for(common_info * info)4591debfc3dSmrg get_def_blocks_for (common_info *info)
4601debfc3dSmrg {
4611debfc3dSmrg   def_blocks *db_p = &info->def_blocks;
4621debfc3dSmrg   if (!db_p->def_blocks)
4631debfc3dSmrg     {
4641debfc3dSmrg       db_p->def_blocks = BITMAP_ALLOC (&update_ssa_obstack);
4651debfc3dSmrg       db_p->phi_blocks = BITMAP_ALLOC (&update_ssa_obstack);
4661debfc3dSmrg       db_p->livein_blocks = BITMAP_ALLOC (&update_ssa_obstack);
4671debfc3dSmrg     }
4681debfc3dSmrg 
4691debfc3dSmrg   return db_p;
4701debfc3dSmrg }
4711debfc3dSmrg 
4721debfc3dSmrg 
4731debfc3dSmrg /* Mark block BB as the definition site for variable VAR.  PHI_P is true if
4741debfc3dSmrg    VAR is defined by a PHI node.  */
4751debfc3dSmrg 
4761debfc3dSmrg static void
set_def_block(tree var,basic_block bb,bool phi_p)4771debfc3dSmrg set_def_block (tree var, basic_block bb, bool phi_p)
4781debfc3dSmrg {
4791debfc3dSmrg   def_blocks *db_p;
4801debfc3dSmrg   common_info *info;
4811debfc3dSmrg 
4821debfc3dSmrg   info = get_common_info (var);
4831debfc3dSmrg   db_p = get_def_blocks_for (info);
4841debfc3dSmrg 
4851debfc3dSmrg   /* Set the bit corresponding to the block where VAR is defined.  */
4861debfc3dSmrg   bitmap_set_bit (db_p->def_blocks, bb->index);
4871debfc3dSmrg   if (phi_p)
4881debfc3dSmrg     bitmap_set_bit (db_p->phi_blocks, bb->index);
4891debfc3dSmrg 
4901debfc3dSmrg   /* Keep track of whether or not we may need to insert PHI nodes.
4911debfc3dSmrg 
4921debfc3dSmrg      If we are in the UNKNOWN state, then this is the first definition
4931debfc3dSmrg      of VAR.  Additionally, we have not seen any uses of VAR yet, so
4941debfc3dSmrg      we do not need a PHI node for this variable at this time (i.e.,
4951debfc3dSmrg      transition to NEED_PHI_STATE_NO).
4961debfc3dSmrg 
4971debfc3dSmrg      If we are in any other state, then we either have multiple definitions
4981debfc3dSmrg      of this variable occurring in different blocks or we saw a use of the
4991debfc3dSmrg      variable which was not dominated by the block containing the
5001debfc3dSmrg      definition(s).  In this case we may need a PHI node, so enter
5011debfc3dSmrg      state NEED_PHI_STATE_MAYBE.  */
5021debfc3dSmrg   if (info->need_phi_state == NEED_PHI_STATE_UNKNOWN)
5031debfc3dSmrg     info->need_phi_state = NEED_PHI_STATE_NO;
5041debfc3dSmrg   else
5051debfc3dSmrg     info->need_phi_state = NEED_PHI_STATE_MAYBE;
5061debfc3dSmrg }
5071debfc3dSmrg 
5081debfc3dSmrg 
5091debfc3dSmrg /* Mark block BB as having VAR live at the entry to BB.  */
5101debfc3dSmrg 
5111debfc3dSmrg static void
set_livein_block(tree var,basic_block bb)5121debfc3dSmrg set_livein_block (tree var, basic_block bb)
5131debfc3dSmrg {
5141debfc3dSmrg   common_info *info;
5151debfc3dSmrg   def_blocks *db_p;
5161debfc3dSmrg 
5171debfc3dSmrg   info = get_common_info (var);
5181debfc3dSmrg   db_p = get_def_blocks_for (info);
5191debfc3dSmrg 
5201debfc3dSmrg   /* Set the bit corresponding to the block where VAR is live in.  */
5211debfc3dSmrg   bitmap_set_bit (db_p->livein_blocks, bb->index);
5221debfc3dSmrg 
5231debfc3dSmrg   /* Keep track of whether or not we may need to insert PHI nodes.
5241debfc3dSmrg 
5251debfc3dSmrg      If we reach here in NEED_PHI_STATE_NO, see if this use is dominated
5261debfc3dSmrg      by the single block containing the definition(s) of this variable.  If
5271debfc3dSmrg      it is, then we remain in NEED_PHI_STATE_NO, otherwise we transition to
5281debfc3dSmrg      NEED_PHI_STATE_MAYBE.  */
5291debfc3dSmrg   if (info->need_phi_state == NEED_PHI_STATE_NO)
5301debfc3dSmrg     {
5311debfc3dSmrg       int def_block_index = bitmap_first_set_bit (db_p->def_blocks);
5321debfc3dSmrg 
5331debfc3dSmrg       if (def_block_index == -1
5341debfc3dSmrg 	  || ! dominated_by_p (CDI_DOMINATORS, bb,
5351debfc3dSmrg 	                       BASIC_BLOCK_FOR_FN (cfun, def_block_index)))
5361debfc3dSmrg 	info->need_phi_state = NEED_PHI_STATE_MAYBE;
5371debfc3dSmrg     }
5381debfc3dSmrg   else
5391debfc3dSmrg     info->need_phi_state = NEED_PHI_STATE_MAYBE;
5401debfc3dSmrg }
5411debfc3dSmrg 
5421debfc3dSmrg 
5431debfc3dSmrg /* Return true if NAME is in OLD_SSA_NAMES.  */
5441debfc3dSmrg 
5451debfc3dSmrg static inline bool
is_old_name(tree name)5461debfc3dSmrg is_old_name (tree name)
5471debfc3dSmrg {
5481debfc3dSmrg   unsigned ver = SSA_NAME_VERSION (name);
5491debfc3dSmrg   if (!old_ssa_names)
5501debfc3dSmrg     return false;
5511debfc3dSmrg   return (ver < SBITMAP_SIZE (old_ssa_names)
5521debfc3dSmrg 	  && bitmap_bit_p (old_ssa_names, ver));
5531debfc3dSmrg }
5541debfc3dSmrg 
5551debfc3dSmrg 
5561debfc3dSmrg /* Return true if NAME is in NEW_SSA_NAMES.  */
5571debfc3dSmrg 
5581debfc3dSmrg static inline bool
is_new_name(tree name)5591debfc3dSmrg is_new_name (tree name)
5601debfc3dSmrg {
5611debfc3dSmrg   unsigned ver = SSA_NAME_VERSION (name);
5621debfc3dSmrg   if (!new_ssa_names)
5631debfc3dSmrg     return false;
5641debfc3dSmrg   return (ver < SBITMAP_SIZE (new_ssa_names)
5651debfc3dSmrg 	  && bitmap_bit_p (new_ssa_names, ver));
5661debfc3dSmrg }
5671debfc3dSmrg 
5681debfc3dSmrg 
5691debfc3dSmrg /* Return the names replaced by NEW_TREE (i.e., REPL_TBL[NEW_TREE].SET).  */
5701debfc3dSmrg 
5711debfc3dSmrg static inline bitmap
names_replaced_by(tree new_tree)5721debfc3dSmrg names_replaced_by (tree new_tree)
5731debfc3dSmrg {
5741debfc3dSmrg   return get_ssa_name_ann (new_tree)->repl_set;
5751debfc3dSmrg }
5761debfc3dSmrg 
5771debfc3dSmrg 
5781debfc3dSmrg /* Add OLD to REPL_TBL[NEW_TREE].SET.  */
5791debfc3dSmrg 
5801debfc3dSmrg static inline void
add_to_repl_tbl(tree new_tree,tree old)5811debfc3dSmrg add_to_repl_tbl (tree new_tree, tree old)
5821debfc3dSmrg {
5831debfc3dSmrg   bitmap *set = &get_ssa_name_ann (new_tree)->repl_set;
5841debfc3dSmrg   if (!*set)
5851debfc3dSmrg     *set = BITMAP_ALLOC (&update_ssa_obstack);
5861debfc3dSmrg   bitmap_set_bit (*set, SSA_NAME_VERSION (old));
5871debfc3dSmrg }
5881debfc3dSmrg 
5891debfc3dSmrg 
5901debfc3dSmrg /* Add a new mapping NEW_TREE -> OLD REPL_TBL.  Every entry N_i in REPL_TBL
5911debfc3dSmrg    represents the set of names O_1 ... O_j replaced by N_i.  This is
5921debfc3dSmrg    used by update_ssa and its helpers to introduce new SSA names in an
5931debfc3dSmrg    already formed SSA web.  */
5941debfc3dSmrg 
5951debfc3dSmrg static void
add_new_name_mapping(tree new_tree,tree old)5961debfc3dSmrg add_new_name_mapping (tree new_tree, tree old)
5971debfc3dSmrg {
5981debfc3dSmrg   /* OLD and NEW_TREE must be different SSA names for the same symbol.  */
5991debfc3dSmrg   gcc_checking_assert (new_tree != old
6001debfc3dSmrg 		       && SSA_NAME_VAR (new_tree) == SSA_NAME_VAR (old));
6011debfc3dSmrg 
6021debfc3dSmrg   /* We may need to grow NEW_SSA_NAMES and OLD_SSA_NAMES because our
6031debfc3dSmrg      caller may have created new names since the set was created.  */
6041debfc3dSmrg   if (SBITMAP_SIZE (new_ssa_names) <= num_ssa_names - 1)
6051debfc3dSmrg     {
6061debfc3dSmrg       unsigned int new_sz = num_ssa_names + NAME_SETS_GROWTH_FACTOR;
6071debfc3dSmrg       new_ssa_names = sbitmap_resize (new_ssa_names, new_sz, 0);
6081debfc3dSmrg       old_ssa_names = sbitmap_resize (old_ssa_names, new_sz, 0);
6091debfc3dSmrg     }
6101debfc3dSmrg 
6111debfc3dSmrg   /* Update the REPL_TBL table.  */
6121debfc3dSmrg   add_to_repl_tbl (new_tree, old);
6131debfc3dSmrg 
6141debfc3dSmrg   /* If OLD had already been registered as a new name, then all the
6151debfc3dSmrg      names that OLD replaces should also be replaced by NEW_TREE.  */
6161debfc3dSmrg   if (is_new_name (old))
6171debfc3dSmrg     bitmap_ior_into (names_replaced_by (new_tree), names_replaced_by (old));
6181debfc3dSmrg 
6191debfc3dSmrg   /* Register NEW_TREE and OLD in NEW_SSA_NAMES and OLD_SSA_NAMES,
6201debfc3dSmrg      respectively.  */
6211debfc3dSmrg   bitmap_set_bit (new_ssa_names, SSA_NAME_VERSION (new_tree));
6221debfc3dSmrg   bitmap_set_bit (old_ssa_names, SSA_NAME_VERSION (old));
6231debfc3dSmrg }
6241debfc3dSmrg 
6251debfc3dSmrg 
6261debfc3dSmrg /* Call back for walk_dominator_tree used to collect definition sites
6271debfc3dSmrg    for every variable in the function.  For every statement S in block
6281debfc3dSmrg    BB:
6291debfc3dSmrg 
6301debfc3dSmrg    1- Variables defined by S in the DEFS of S are marked in the bitmap
6311debfc3dSmrg       KILLS.
6321debfc3dSmrg 
6331debfc3dSmrg    2- If S uses a variable VAR and there is no preceding kill of VAR,
6341debfc3dSmrg       then it is marked in the LIVEIN_BLOCKS bitmap associated with VAR.
6351debfc3dSmrg 
6361debfc3dSmrg    This information is used to determine which variables are live
6371debfc3dSmrg    across block boundaries to reduce the number of PHI nodes
6381debfc3dSmrg    we create.  */
6391debfc3dSmrg 
6401debfc3dSmrg static void
mark_def_sites(basic_block bb,gimple * stmt,bitmap kills)6411debfc3dSmrg mark_def_sites (basic_block bb, gimple *stmt, bitmap kills)
6421debfc3dSmrg {
6431debfc3dSmrg   tree def;
6441debfc3dSmrg   use_operand_p use_p;
6451debfc3dSmrg   ssa_op_iter iter;
6461debfc3dSmrg 
6471debfc3dSmrg   /* Since this is the first time that we rewrite the program into SSA
6481debfc3dSmrg      form, force an operand scan on every statement.  */
6491debfc3dSmrg   update_stmt (stmt);
6501debfc3dSmrg 
6511debfc3dSmrg   gcc_checking_assert (blocks_to_update == NULL);
6521debfc3dSmrg   set_register_defs (stmt, false);
6531debfc3dSmrg   set_rewrite_uses (stmt, false);
6541debfc3dSmrg 
6551debfc3dSmrg   if (is_gimple_debug (stmt))
6561debfc3dSmrg     {
6571debfc3dSmrg       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
6581debfc3dSmrg 	{
6591debfc3dSmrg 	  tree sym = USE_FROM_PTR (use_p);
6601debfc3dSmrg 	  gcc_checking_assert (DECL_P (sym));
6611debfc3dSmrg 	  set_rewrite_uses (stmt, true);
6621debfc3dSmrg 	}
6631debfc3dSmrg       if (rewrite_uses_p (stmt))
6641debfc3dSmrg 	bitmap_set_bit (interesting_blocks, bb->index);
6651debfc3dSmrg       return;
6661debfc3dSmrg     }
6671debfc3dSmrg 
6681debfc3dSmrg   /* If a variable is used before being set, then the variable is live
6691debfc3dSmrg      across a block boundary, so mark it live-on-entry to BB.  */
6701debfc3dSmrg   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
6711debfc3dSmrg     {
6721debfc3dSmrg       tree sym = USE_FROM_PTR (use_p);
6731debfc3dSmrg       if (TREE_CODE (sym) == SSA_NAME)
6741debfc3dSmrg 	continue;
6751debfc3dSmrg       gcc_checking_assert (DECL_P (sym));
6761debfc3dSmrg       if (!bitmap_bit_p (kills, DECL_UID (sym)))
6771debfc3dSmrg 	set_livein_block (sym, bb);
6781debfc3dSmrg       set_rewrite_uses (stmt, true);
6791debfc3dSmrg     }
6801debfc3dSmrg 
6811debfc3dSmrg   /* Now process the defs.  Mark BB as the definition block and add
6821debfc3dSmrg      each def to the set of killed symbols.  */
6831debfc3dSmrg   FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_ALL_DEFS)
6841debfc3dSmrg     {
6851debfc3dSmrg       if (TREE_CODE (def) == SSA_NAME)
6861debfc3dSmrg 	continue;
6871debfc3dSmrg       gcc_checking_assert (DECL_P (def));
6881debfc3dSmrg       set_def_block (def, bb, false);
6891debfc3dSmrg       bitmap_set_bit (kills, DECL_UID (def));
6901debfc3dSmrg       set_register_defs (stmt, true);
6911debfc3dSmrg     }
6921debfc3dSmrg 
6931debfc3dSmrg   /* If we found the statement interesting then also mark the block BB
6941debfc3dSmrg      as interesting.  */
6951debfc3dSmrg   if (rewrite_uses_p (stmt) || register_defs_p (stmt))
6961debfc3dSmrg     bitmap_set_bit (interesting_blocks, bb->index);
6971debfc3dSmrg }
6981debfc3dSmrg 
6991debfc3dSmrg /* Structure used by prune_unused_phi_nodes to record bounds of the intervals
7001debfc3dSmrg    in the dfs numbering of the dominance tree.  */
7011debfc3dSmrg 
7021debfc3dSmrg struct dom_dfsnum
7031debfc3dSmrg {
7041debfc3dSmrg   /* Basic block whose index this entry corresponds to.  */
7051debfc3dSmrg   unsigned bb_index;
7061debfc3dSmrg 
7071debfc3dSmrg   /* The dfs number of this node.  */
7081debfc3dSmrg   unsigned dfs_num;
7091debfc3dSmrg };
7101debfc3dSmrg 
7111debfc3dSmrg /* Compares two entries of type struct dom_dfsnum by dfs_num field.  Callback
7121debfc3dSmrg    for qsort.  */
7131debfc3dSmrg 
7141debfc3dSmrg static int
cmp_dfsnum(const void * a,const void * b)7151debfc3dSmrg cmp_dfsnum (const void *a, const void *b)
7161debfc3dSmrg {
7171debfc3dSmrg   const struct dom_dfsnum *const da = (const struct dom_dfsnum *) a;
7181debfc3dSmrg   const struct dom_dfsnum *const db = (const struct dom_dfsnum *) b;
7191debfc3dSmrg 
7201debfc3dSmrg   return (int) da->dfs_num - (int) db->dfs_num;
7211debfc3dSmrg }
7221debfc3dSmrg 
7231debfc3dSmrg /* Among the intervals starting at the N points specified in DEFS, find
7241debfc3dSmrg    the one that contains S, and return its bb_index.  */
7251debfc3dSmrg 
7261debfc3dSmrg static unsigned
find_dfsnum_interval(struct dom_dfsnum * defs,unsigned n,unsigned s)7271debfc3dSmrg find_dfsnum_interval (struct dom_dfsnum *defs, unsigned n, unsigned s)
7281debfc3dSmrg {
7291debfc3dSmrg   unsigned f = 0, t = n, m;
7301debfc3dSmrg 
7311debfc3dSmrg   while (t > f + 1)
7321debfc3dSmrg     {
7331debfc3dSmrg       m = (f + t) / 2;
7341debfc3dSmrg       if (defs[m].dfs_num <= s)
7351debfc3dSmrg 	f = m;
7361debfc3dSmrg       else
7371debfc3dSmrg 	t = m;
7381debfc3dSmrg     }
7391debfc3dSmrg 
7401debfc3dSmrg   return defs[f].bb_index;
7411debfc3dSmrg }
7421debfc3dSmrg 
7431debfc3dSmrg /* Clean bits from PHIS for phi nodes whose value cannot be used in USES.
7441debfc3dSmrg    KILLS is a bitmap of blocks where the value is defined before any use.  */
7451debfc3dSmrg 
7461debfc3dSmrg static void
prune_unused_phi_nodes(bitmap phis,bitmap kills,bitmap uses)7471debfc3dSmrg prune_unused_phi_nodes (bitmap phis, bitmap kills, bitmap uses)
7481debfc3dSmrg {
7491debfc3dSmrg   bitmap_iterator bi;
7501debfc3dSmrg   unsigned i, b, p, u, top;
7511debfc3dSmrg   bitmap live_phis;
7521debfc3dSmrg   basic_block def_bb, use_bb;
7531debfc3dSmrg   edge e;
7541debfc3dSmrg   edge_iterator ei;
7551debfc3dSmrg   bitmap to_remove;
7561debfc3dSmrg   struct dom_dfsnum *defs;
7571debfc3dSmrg   unsigned n_defs, adef;
7581debfc3dSmrg 
7591debfc3dSmrg   if (bitmap_empty_p (uses))
7601debfc3dSmrg     {
7611debfc3dSmrg       bitmap_clear (phis);
7621debfc3dSmrg       return;
7631debfc3dSmrg     }
7641debfc3dSmrg 
7651debfc3dSmrg   /* The phi must dominate a use, or an argument of a live phi.  Also, we
7661debfc3dSmrg      do not create any phi nodes in def blocks, unless they are also livein.  */
7671debfc3dSmrg   to_remove = BITMAP_ALLOC (NULL);
7681debfc3dSmrg   bitmap_and_compl (to_remove, kills, uses);
7691debfc3dSmrg   bitmap_and_compl_into (phis, to_remove);
7701debfc3dSmrg   if (bitmap_empty_p (phis))
7711debfc3dSmrg     {
7721debfc3dSmrg       BITMAP_FREE (to_remove);
7731debfc3dSmrg       return;
7741debfc3dSmrg     }
7751debfc3dSmrg 
7761debfc3dSmrg   /* We want to remove the unnecessary phi nodes, but we do not want to compute
7771debfc3dSmrg      liveness information, as that may be linear in the size of CFG, and if
7781debfc3dSmrg      there are lot of different variables to rewrite, this may lead to quadratic
7791debfc3dSmrg      behavior.
7801debfc3dSmrg 
7811debfc3dSmrg      Instead, we basically emulate standard dce.  We put all uses to worklist,
7821debfc3dSmrg      then for each of them find the nearest def that dominates them.  If this
7831debfc3dSmrg      def is a phi node, we mark it live, and if it was not live before, we
7841debfc3dSmrg      add the predecessors of its basic block to the worklist.
7851debfc3dSmrg 
7861debfc3dSmrg      To quickly locate the nearest def that dominates use, we use dfs numbering
7871debfc3dSmrg      of the dominance tree (that is already available in order to speed up
7881debfc3dSmrg      queries).  For each def, we have the interval given by the dfs number on
7891debfc3dSmrg      entry to and on exit from the corresponding subtree in the dominance tree.
7901debfc3dSmrg      The nearest dominator for a given use is the smallest of these intervals
7911debfc3dSmrg      that contains entry and exit dfs numbers for the basic block with the use.
7921debfc3dSmrg      If we store the bounds for all the uses to an array and sort it, we can
7931debfc3dSmrg      locate the nearest dominating def in logarithmic time by binary search.*/
7941debfc3dSmrg   bitmap_ior (to_remove, kills, phis);
7951debfc3dSmrg   n_defs = bitmap_count_bits (to_remove);
7961debfc3dSmrg   defs = XNEWVEC (struct dom_dfsnum, 2 * n_defs + 1);
7971debfc3dSmrg   defs[0].bb_index = 1;
7981debfc3dSmrg   defs[0].dfs_num = 0;
7991debfc3dSmrg   adef = 1;
8001debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (to_remove, 0, i, bi)
8011debfc3dSmrg     {
8021debfc3dSmrg       def_bb = BASIC_BLOCK_FOR_FN (cfun, i);
8031debfc3dSmrg       defs[adef].bb_index = i;
8041debfc3dSmrg       defs[adef].dfs_num = bb_dom_dfs_in (CDI_DOMINATORS, def_bb);
8051debfc3dSmrg       defs[adef + 1].bb_index = i;
8061debfc3dSmrg       defs[adef + 1].dfs_num = bb_dom_dfs_out (CDI_DOMINATORS, def_bb);
8071debfc3dSmrg       adef += 2;
8081debfc3dSmrg     }
8091debfc3dSmrg   BITMAP_FREE (to_remove);
8101debfc3dSmrg   gcc_assert (adef == 2 * n_defs + 1);
8111debfc3dSmrg   qsort (defs, adef, sizeof (struct dom_dfsnum), cmp_dfsnum);
8121debfc3dSmrg   gcc_assert (defs[0].bb_index == 1);
8131debfc3dSmrg 
8141debfc3dSmrg   /* Now each DEFS entry contains the number of the basic block to that the
8151debfc3dSmrg      dfs number corresponds.  Change them to the number of basic block that
8161debfc3dSmrg      corresponds to the interval following the dfs number.  Also, for the
8171debfc3dSmrg      dfs_out numbers, increase the dfs number by one (so that it corresponds
8181debfc3dSmrg      to the start of the following interval, not to the end of the current
8191debfc3dSmrg      one).  We use WORKLIST as a stack.  */
8201debfc3dSmrg   auto_vec<int> worklist (n_defs + 1);
8211debfc3dSmrg   worklist.quick_push (1);
8221debfc3dSmrg   top = 1;
8231debfc3dSmrg   n_defs = 1;
8241debfc3dSmrg   for (i = 1; i < adef; i++)
8251debfc3dSmrg     {
8261debfc3dSmrg       b = defs[i].bb_index;
8271debfc3dSmrg       if (b == top)
8281debfc3dSmrg 	{
8291debfc3dSmrg 	  /* This is a closing element.  Interval corresponding to the top
8301debfc3dSmrg 	     of the stack after removing it follows.  */
8311debfc3dSmrg 	  worklist.pop ();
8321debfc3dSmrg 	  top = worklist[worklist.length () - 1];
8331debfc3dSmrg 	  defs[n_defs].bb_index = top;
8341debfc3dSmrg 	  defs[n_defs].dfs_num = defs[i].dfs_num + 1;
8351debfc3dSmrg 	}
8361debfc3dSmrg       else
8371debfc3dSmrg 	{
8381debfc3dSmrg 	  /* Opening element.  Nothing to do, just push it to the stack and move
8391debfc3dSmrg 	     it to the correct position.  */
8401debfc3dSmrg 	  defs[n_defs].bb_index = defs[i].bb_index;
8411debfc3dSmrg 	  defs[n_defs].dfs_num = defs[i].dfs_num;
8421debfc3dSmrg 	  worklist.quick_push (b);
8431debfc3dSmrg 	  top = b;
8441debfc3dSmrg 	}
8451debfc3dSmrg 
8461debfc3dSmrg       /* If this interval starts at the same point as the previous one, cancel
8471debfc3dSmrg 	 the previous one.  */
8481debfc3dSmrg       if (defs[n_defs].dfs_num == defs[n_defs - 1].dfs_num)
8491debfc3dSmrg 	defs[n_defs - 1].bb_index = defs[n_defs].bb_index;
8501debfc3dSmrg       else
8511debfc3dSmrg 	n_defs++;
8521debfc3dSmrg     }
8531debfc3dSmrg   worklist.pop ();
8541debfc3dSmrg   gcc_assert (worklist.is_empty ());
8551debfc3dSmrg 
8561debfc3dSmrg   /* Now process the uses.  */
8571debfc3dSmrg   live_phis = BITMAP_ALLOC (NULL);
8581debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (uses, 0, i, bi)
8591debfc3dSmrg     {
8601debfc3dSmrg       worklist.safe_push (i);
8611debfc3dSmrg     }
8621debfc3dSmrg 
8631debfc3dSmrg   while (!worklist.is_empty ())
8641debfc3dSmrg     {
8651debfc3dSmrg       b = worklist.pop ();
8661debfc3dSmrg       if (b == ENTRY_BLOCK)
8671debfc3dSmrg 	continue;
8681debfc3dSmrg 
8691debfc3dSmrg       /* If there is a phi node in USE_BB, it is made live.  Otherwise,
8701debfc3dSmrg 	 find the def that dominates the immediate dominator of USE_BB
8711debfc3dSmrg 	 (the kill in USE_BB does not dominate the use).  */
8721debfc3dSmrg       if (bitmap_bit_p (phis, b))
8731debfc3dSmrg 	p = b;
8741debfc3dSmrg       else
8751debfc3dSmrg 	{
8761debfc3dSmrg 	  use_bb = get_immediate_dominator (CDI_DOMINATORS,
8771debfc3dSmrg 					    BASIC_BLOCK_FOR_FN (cfun, b));
8781debfc3dSmrg 	  p = find_dfsnum_interval (defs, n_defs,
8791debfc3dSmrg 				    bb_dom_dfs_in (CDI_DOMINATORS, use_bb));
8801debfc3dSmrg 	  if (!bitmap_bit_p (phis, p))
8811debfc3dSmrg 	    continue;
8821debfc3dSmrg 	}
8831debfc3dSmrg 
8841debfc3dSmrg       /* If the phi node is already live, there is nothing to do.  */
8851debfc3dSmrg       if (!bitmap_set_bit (live_phis, p))
8861debfc3dSmrg 	continue;
8871debfc3dSmrg 
8881debfc3dSmrg       /* Add the new uses to the worklist.  */
8891debfc3dSmrg       def_bb = BASIC_BLOCK_FOR_FN (cfun, p);
8901debfc3dSmrg       FOR_EACH_EDGE (e, ei, def_bb->preds)
8911debfc3dSmrg 	{
8921debfc3dSmrg 	  u = e->src->index;
8931debfc3dSmrg 	  if (bitmap_bit_p (uses, u))
8941debfc3dSmrg 	    continue;
8951debfc3dSmrg 
8961debfc3dSmrg 	  /* In case there is a kill directly in the use block, do not record
8971debfc3dSmrg 	     the use (this is also necessary for correctness, as we assume that
8981debfc3dSmrg 	     uses dominated by a def directly in their block have been filtered
8991debfc3dSmrg 	     out before).  */
9001debfc3dSmrg 	  if (bitmap_bit_p (kills, u))
9011debfc3dSmrg 	    continue;
9021debfc3dSmrg 
9031debfc3dSmrg 	  bitmap_set_bit (uses, u);
9041debfc3dSmrg 	  worklist.safe_push (u);
9051debfc3dSmrg 	}
9061debfc3dSmrg     }
9071debfc3dSmrg 
9081debfc3dSmrg   bitmap_copy (phis, live_phis);
9091debfc3dSmrg   BITMAP_FREE (live_phis);
9101debfc3dSmrg   free (defs);
9111debfc3dSmrg }
9121debfc3dSmrg 
9131debfc3dSmrg /* Return the set of blocks where variable VAR is defined and the blocks
9141debfc3dSmrg    where VAR is live on entry (livein).  Return NULL, if no entry is
9151debfc3dSmrg    found in DEF_BLOCKS.  */
9161debfc3dSmrg 
9171debfc3dSmrg static inline def_blocks *
find_def_blocks_for(tree var)9181debfc3dSmrg find_def_blocks_for (tree var)
9191debfc3dSmrg {
9201debfc3dSmrg   def_blocks *p = &get_common_info (var)->def_blocks;
9211debfc3dSmrg   if (!p->def_blocks)
9221debfc3dSmrg     return NULL;
9231debfc3dSmrg   return p;
9241debfc3dSmrg }
9251debfc3dSmrg 
9261debfc3dSmrg 
9271debfc3dSmrg /* Marks phi node PHI in basic block BB for rewrite.  */
9281debfc3dSmrg 
9291debfc3dSmrg static void
mark_phi_for_rewrite(basic_block bb,gphi * phi)9301debfc3dSmrg mark_phi_for_rewrite (basic_block bb, gphi *phi)
9311debfc3dSmrg {
9321debfc3dSmrg   vec<gphi *> phis;
9331debfc3dSmrg   unsigned n, idx = bb->index;
9341debfc3dSmrg 
9351debfc3dSmrg   if (rewrite_uses_p (phi))
9361debfc3dSmrg     return;
9371debfc3dSmrg 
9381debfc3dSmrg   set_rewrite_uses (phi, true);
9391debfc3dSmrg 
9401debfc3dSmrg   if (!blocks_with_phis_to_rewrite)
9411debfc3dSmrg     return;
9421debfc3dSmrg 
943*8feb0f0bSmrg   if (bitmap_set_bit (blocks_with_phis_to_rewrite, idx))
944*8feb0f0bSmrg     {
9451debfc3dSmrg       n = (unsigned) last_basic_block_for_fn (cfun) + 1;
9461debfc3dSmrg       if (phis_to_rewrite.length () < n)
9471debfc3dSmrg 	phis_to_rewrite.safe_grow_cleared (n);
9481debfc3dSmrg 
9491debfc3dSmrg       phis = phis_to_rewrite[idx];
950*8feb0f0bSmrg       gcc_assert (!phis.exists ());
951*8feb0f0bSmrg       phis.create (10);
952*8feb0f0bSmrg     }
953*8feb0f0bSmrg   else
954*8feb0f0bSmrg     phis = phis_to_rewrite[idx];
9551debfc3dSmrg 
9561debfc3dSmrg   phis.safe_push (phi);
9571debfc3dSmrg   phis_to_rewrite[idx] = phis;
9581debfc3dSmrg }
9591debfc3dSmrg 
9601debfc3dSmrg /* Insert PHI nodes for variable VAR using the iterated dominance
9611debfc3dSmrg    frontier given in PHI_INSERTION_POINTS.  If UPDATE_P is true, this
9621debfc3dSmrg    function assumes that the caller is incrementally updating the
9631debfc3dSmrg    existing SSA form, in which case VAR may be an SSA name instead of
9641debfc3dSmrg    a symbol.
9651debfc3dSmrg 
9661debfc3dSmrg    PHI_INSERTION_POINTS is updated to reflect nodes that already had a
9671debfc3dSmrg    PHI node for VAR.  On exit, only the nodes that received a PHI node
9681debfc3dSmrg    for VAR will be present in PHI_INSERTION_POINTS.  */
9691debfc3dSmrg 
9701debfc3dSmrg static void
insert_phi_nodes_for(tree var,bitmap phi_insertion_points,bool update_p)9711debfc3dSmrg insert_phi_nodes_for (tree var, bitmap phi_insertion_points, bool update_p)
9721debfc3dSmrg {
9731debfc3dSmrg   unsigned bb_index;
9741debfc3dSmrg   edge e;
9751debfc3dSmrg   gphi *phi;
9761debfc3dSmrg   basic_block bb;
9771debfc3dSmrg   bitmap_iterator bi;
9781debfc3dSmrg   def_blocks *def_map = find_def_blocks_for (var);
9791debfc3dSmrg 
9801debfc3dSmrg   /* Remove the blocks where we already have PHI nodes for VAR.  */
9811debfc3dSmrg   bitmap_and_compl_into (phi_insertion_points, def_map->phi_blocks);
9821debfc3dSmrg 
9831debfc3dSmrg   /* Remove obviously useless phi nodes.  */
9841debfc3dSmrg   prune_unused_phi_nodes (phi_insertion_points, def_map->def_blocks,
9851debfc3dSmrg 			  def_map->livein_blocks);
9861debfc3dSmrg 
9871debfc3dSmrg   /* And insert the PHI nodes.  */
9881debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (phi_insertion_points, 0, bb_index, bi)
9891debfc3dSmrg     {
9901debfc3dSmrg       bb = BASIC_BLOCK_FOR_FN (cfun, bb_index);
9911debfc3dSmrg       if (update_p)
9921debfc3dSmrg 	mark_block_for_update (bb);
9931debfc3dSmrg 
9941debfc3dSmrg       if (dump_file && (dump_flags & TDF_DETAILS))
9951debfc3dSmrg 	{
9961debfc3dSmrg 	  fprintf (dump_file, "creating PHI node in block #%d for ", bb_index);
9971debfc3dSmrg 	  print_generic_expr (dump_file, var, TDF_SLIM);
9981debfc3dSmrg 	  fprintf (dump_file, "\n");
9991debfc3dSmrg 	}
10001debfc3dSmrg       phi = NULL;
10011debfc3dSmrg 
10021debfc3dSmrg       if (TREE_CODE (var) == SSA_NAME)
10031debfc3dSmrg 	{
10041debfc3dSmrg 	  /* If we are rewriting SSA names, create the LHS of the PHI
10051debfc3dSmrg 	     node by duplicating VAR.  This is useful in the case of
10061debfc3dSmrg 	     pointers, to also duplicate pointer attributes (alias
10071debfc3dSmrg 	     information, in particular).  */
10081debfc3dSmrg 	  edge_iterator ei;
10091debfc3dSmrg 	  tree new_lhs;
10101debfc3dSmrg 
10111debfc3dSmrg 	  gcc_checking_assert (update_p);
10121debfc3dSmrg 	  new_lhs = duplicate_ssa_name (var, NULL);
10131debfc3dSmrg 	  phi = create_phi_node (new_lhs, bb);
10141debfc3dSmrg 	  add_new_name_mapping (new_lhs, var);
10151debfc3dSmrg 
10161debfc3dSmrg 	  /* Add VAR to every argument slot of PHI.  We need VAR in
10171debfc3dSmrg 	     every argument so that rewrite_update_phi_arguments knows
10181debfc3dSmrg 	     which name is this PHI node replacing.  If VAR is a
10191debfc3dSmrg 	     symbol marked for renaming, this is not necessary, the
10201debfc3dSmrg 	     renamer will use the symbol on the LHS to get its
10211debfc3dSmrg 	     reaching definition.  */
10221debfc3dSmrg 	  FOR_EACH_EDGE (e, ei, bb->preds)
10231debfc3dSmrg 	    add_phi_arg (phi, var, e, UNKNOWN_LOCATION);
10241debfc3dSmrg 	}
10251debfc3dSmrg       else
10261debfc3dSmrg 	{
10271debfc3dSmrg 	  tree tracked_var;
10281debfc3dSmrg 
10291debfc3dSmrg 	  gcc_checking_assert (DECL_P (var));
10301debfc3dSmrg 	  phi = create_phi_node (var, bb);
10311debfc3dSmrg 
10321debfc3dSmrg 	  tracked_var = target_for_debug_bind (var);
10331debfc3dSmrg 	  if (tracked_var)
10341debfc3dSmrg 	    {
10351debfc3dSmrg 	      gimple *note = gimple_build_debug_bind (tracked_var,
10361debfc3dSmrg 						      PHI_RESULT (phi),
10371debfc3dSmrg 						     phi);
10381debfc3dSmrg 	      gimple_stmt_iterator si = gsi_after_labels (bb);
10391debfc3dSmrg 	      gsi_insert_before (&si, note, GSI_SAME_STMT);
10401debfc3dSmrg 	    }
10411debfc3dSmrg 	}
10421debfc3dSmrg 
10431debfc3dSmrg       /* Mark this PHI node as interesting for update_ssa.  */
10441debfc3dSmrg       set_register_defs (phi, true);
10451debfc3dSmrg       mark_phi_for_rewrite (bb, phi);
10461debfc3dSmrg     }
10471debfc3dSmrg }
10481debfc3dSmrg 
10491debfc3dSmrg /* Sort var_infos after DECL_UID of their var.  */
10501debfc3dSmrg 
10511debfc3dSmrg static int
insert_phi_nodes_compare_var_infos(const void * a,const void * b)10521debfc3dSmrg insert_phi_nodes_compare_var_infos (const void *a, const void *b)
10531debfc3dSmrg {
10541debfc3dSmrg   const var_info *defa = *(var_info * const *)a;
10551debfc3dSmrg   const var_info *defb = *(var_info * const *)b;
10561debfc3dSmrg   if (DECL_UID (defa->var) < DECL_UID (defb->var))
10571debfc3dSmrg     return -1;
10581debfc3dSmrg   else
10591debfc3dSmrg     return 1;
10601debfc3dSmrg }
10611debfc3dSmrg 
10621debfc3dSmrg /* Insert PHI nodes at the dominance frontier of blocks with variable
10631debfc3dSmrg    definitions.  DFS contains the dominance frontier information for
10641debfc3dSmrg    the flowgraph.  */
10651debfc3dSmrg 
10661debfc3dSmrg static void
insert_phi_nodes(bitmap_head * dfs)10671debfc3dSmrg insert_phi_nodes (bitmap_head *dfs)
10681debfc3dSmrg {
10691debfc3dSmrg   hash_table<var_info_hasher>::iterator hi;
10701debfc3dSmrg   unsigned i;
10711debfc3dSmrg   var_info *info;
10721debfc3dSmrg 
10731debfc3dSmrg   timevar_push (TV_TREE_INSERT_PHI_NODES);
10741debfc3dSmrg 
10751debfc3dSmrg   /* When the gimplifier introduces SSA names it cannot easily avoid
10761debfc3dSmrg      situations where abnormal edges added by CFG construction break
10771debfc3dSmrg      the use-def dominance requirement.  For this case rewrite SSA
10781debfc3dSmrg      names with broken use-def dominance out-of-SSA and register them
10791debfc3dSmrg      for PHI insertion.  We only need to do this if abnormal edges
10801debfc3dSmrg      can appear in the function.  */
10811debfc3dSmrg   tree name;
10821debfc3dSmrg   if (cfun->calls_setjmp
10831debfc3dSmrg       || cfun->has_nonlocal_label)
10841debfc3dSmrg     FOR_EACH_SSA_NAME (i, name, cfun)
10851debfc3dSmrg       {
10861debfc3dSmrg 	gimple *def_stmt = SSA_NAME_DEF_STMT (name);
10871debfc3dSmrg 	if (SSA_NAME_IS_DEFAULT_DEF (name))
10881debfc3dSmrg 	  continue;
10891debfc3dSmrg 
10901debfc3dSmrg 	basic_block def_bb = gimple_bb (def_stmt);
10911debfc3dSmrg 	imm_use_iterator it;
10921debfc3dSmrg 	gimple *use_stmt;
10931debfc3dSmrg 	bool need_phis = false;
10941debfc3dSmrg 	FOR_EACH_IMM_USE_STMT (use_stmt, it, name)
10951debfc3dSmrg 	  {
10961debfc3dSmrg 	    basic_block use_bb = gimple_bb (use_stmt);
10971debfc3dSmrg 	    if (use_bb != def_bb
10981debfc3dSmrg 		&& ! dominated_by_p (CDI_DOMINATORS, use_bb, def_bb))
10991debfc3dSmrg 	      need_phis = true;
11001debfc3dSmrg 	  }
11011debfc3dSmrg 	if (need_phis)
11021debfc3dSmrg 	  {
11031debfc3dSmrg 	    tree var = create_tmp_reg (TREE_TYPE (name));
11041debfc3dSmrg 	    use_operand_p use_p;
11051debfc3dSmrg 	    FOR_EACH_IMM_USE_STMT (use_stmt, it, name)
11061debfc3dSmrg 	      {
11071debfc3dSmrg 		basic_block use_bb = gimple_bb (use_stmt);
11081debfc3dSmrg 		FOR_EACH_IMM_USE_ON_STMT (use_p, it)
11091debfc3dSmrg 		    SET_USE (use_p, var);
11101debfc3dSmrg 		update_stmt (use_stmt);
11111debfc3dSmrg 		set_livein_block (var, use_bb);
11121debfc3dSmrg 		set_rewrite_uses (use_stmt, true);
11131debfc3dSmrg 		bitmap_set_bit (interesting_blocks, use_bb->index);
11141debfc3dSmrg 	      }
11151debfc3dSmrg 	    def_operand_p def_p;
11161debfc3dSmrg 	    ssa_op_iter dit;
11171debfc3dSmrg 	    FOR_EACH_SSA_DEF_OPERAND (def_p, def_stmt, dit, SSA_OP_DEF)
11181debfc3dSmrg 	      if (DEF_FROM_PTR (def_p) == name)
11191debfc3dSmrg 		SET_DEF (def_p, var);
11201debfc3dSmrg 	    update_stmt (def_stmt);
11211debfc3dSmrg 	    set_def_block (var, def_bb, false);
11221debfc3dSmrg 	    set_register_defs (def_stmt, true);
11231debfc3dSmrg 	    bitmap_set_bit (interesting_blocks, def_bb->index);
11241debfc3dSmrg 	    release_ssa_name (name);
11251debfc3dSmrg 	  }
11261debfc3dSmrg       }
11271debfc3dSmrg 
11281debfc3dSmrg   auto_vec<var_info *> vars (var_infos->elements ());
11291debfc3dSmrg   FOR_EACH_HASH_TABLE_ELEMENT (*var_infos, info, var_info_p, hi)
11301debfc3dSmrg     if (info->info.need_phi_state != NEED_PHI_STATE_NO)
11311debfc3dSmrg       vars.quick_push (info);
11321debfc3dSmrg 
11331debfc3dSmrg   /* Do two stages to avoid code generation differences for UID
11341debfc3dSmrg      differences but no UID ordering differences.  */
11351debfc3dSmrg   vars.qsort (insert_phi_nodes_compare_var_infos);
11361debfc3dSmrg 
11371debfc3dSmrg   FOR_EACH_VEC_ELT (vars, i, info)
11381debfc3dSmrg     {
11391debfc3dSmrg       bitmap idf = compute_idf (info->info.def_blocks.def_blocks, dfs);
11401debfc3dSmrg       insert_phi_nodes_for (info->var, idf, false);
11411debfc3dSmrg       BITMAP_FREE (idf);
11421debfc3dSmrg     }
11431debfc3dSmrg 
11441debfc3dSmrg   timevar_pop (TV_TREE_INSERT_PHI_NODES);
11451debfc3dSmrg }
11461debfc3dSmrg 
11471debfc3dSmrg 
11481debfc3dSmrg /* Push SYM's current reaching definition into BLOCK_DEFS_STACK and
11491debfc3dSmrg    register DEF (an SSA_NAME) to be a new definition for SYM.  */
11501debfc3dSmrg 
11511debfc3dSmrg static void
register_new_def(tree def,tree sym)11521debfc3dSmrg register_new_def (tree def, tree sym)
11531debfc3dSmrg {
11541debfc3dSmrg   common_info *info = get_common_info (sym);
11551debfc3dSmrg   tree currdef;
11561debfc3dSmrg 
11571debfc3dSmrg   /* If this variable is set in a single basic block and all uses are
11581debfc3dSmrg      dominated by the set(s) in that single basic block, then there is
11591debfc3dSmrg      no reason to record anything for this variable in the block local
11601debfc3dSmrg      definition stacks.  Doing so just wastes time and memory.
11611debfc3dSmrg 
11621debfc3dSmrg      This is the same test to prune the set of variables which may
11631debfc3dSmrg      need PHI nodes.  So we just use that information since it's already
11641debfc3dSmrg      computed and available for us to use.  */
11651debfc3dSmrg   if (info->need_phi_state == NEED_PHI_STATE_NO)
11661debfc3dSmrg     {
11671debfc3dSmrg       info->current_def = def;
11681debfc3dSmrg       return;
11691debfc3dSmrg     }
11701debfc3dSmrg 
11711debfc3dSmrg   currdef = info->current_def;
11721debfc3dSmrg 
11731debfc3dSmrg   /* If SYM is not a GIMPLE register, then CURRDEF may be a name whose
11741debfc3dSmrg      SSA_NAME_VAR is not necessarily SYM.  In this case, also push SYM
11751debfc3dSmrg      in the stack so that we know which symbol is being defined by
11761debfc3dSmrg      this SSA name when we unwind the stack.  */
11771debfc3dSmrg   if (currdef && !is_gimple_reg (sym))
11781debfc3dSmrg     block_defs_stack.safe_push (sym);
11791debfc3dSmrg 
11801debfc3dSmrg   /* Push the current reaching definition into BLOCK_DEFS_STACK.  This
11811debfc3dSmrg      stack is later used by the dominator tree callbacks to restore
11821debfc3dSmrg      the reaching definitions for all the variables defined in the
11831debfc3dSmrg      block after a recursive visit to all its immediately dominated
11841debfc3dSmrg      blocks.  If there is no current reaching definition, then just
11851debfc3dSmrg      record the underlying _DECL node.  */
11861debfc3dSmrg   block_defs_stack.safe_push (currdef ? currdef : sym);
11871debfc3dSmrg 
11881debfc3dSmrg   /* Set the current reaching definition for SYM to be DEF.  */
11891debfc3dSmrg   info->current_def = def;
11901debfc3dSmrg }
11911debfc3dSmrg 
11921debfc3dSmrg 
11931debfc3dSmrg /* Perform a depth-first traversal of the dominator tree looking for
11941debfc3dSmrg    variables to rename.  BB is the block where to start searching.
11951debfc3dSmrg    Renaming is a five step process:
11961debfc3dSmrg 
11971debfc3dSmrg    1- Every definition made by PHI nodes at the start of the blocks is
11981debfc3dSmrg       registered as the current definition for the corresponding variable.
11991debfc3dSmrg 
12001debfc3dSmrg    2- Every statement in BB is rewritten.  USE and VUSE operands are
12011debfc3dSmrg       rewritten with their corresponding reaching definition.  DEF and
12021debfc3dSmrg       VDEF targets are registered as new definitions.
12031debfc3dSmrg 
12041debfc3dSmrg    3- All the PHI nodes in successor blocks of BB are visited.  The
12051debfc3dSmrg       argument corresponding to BB is replaced with its current reaching
12061debfc3dSmrg       definition.
12071debfc3dSmrg 
12081debfc3dSmrg    4- Recursively rewrite every dominator child block of BB.
12091debfc3dSmrg 
12101debfc3dSmrg    5- Restore (in reverse order) the current reaching definition for every
12111debfc3dSmrg       new definition introduced in this block.  This is done so that when
12121debfc3dSmrg       we return from the recursive call, all the current reaching
12131debfc3dSmrg       definitions are restored to the names that were valid in the
12141debfc3dSmrg       dominator parent of BB.  */
12151debfc3dSmrg 
12161debfc3dSmrg /* Return the current definition for variable VAR.  If none is found,
12171debfc3dSmrg    create a new SSA name to act as the zeroth definition for VAR.  */
12181debfc3dSmrg 
12191debfc3dSmrg static tree
get_reaching_def(tree var)12201debfc3dSmrg get_reaching_def (tree var)
12211debfc3dSmrg {
12221debfc3dSmrg   common_info *info = get_common_info (var);
12231debfc3dSmrg   tree currdef;
12241debfc3dSmrg 
12251debfc3dSmrg   /* Lookup the current reaching definition for VAR.  */
12261debfc3dSmrg   currdef = info->current_def;
12271debfc3dSmrg 
12281debfc3dSmrg   /* If there is no reaching definition for VAR, create and register a
12291debfc3dSmrg      default definition for it (if needed).  */
12301debfc3dSmrg   if (currdef == NULL_TREE)
12311debfc3dSmrg     {
12321debfc3dSmrg       tree sym = DECL_P (var) ? var : SSA_NAME_VAR (var);
1233a2dc1f3fSmrg       if (! sym)
1234a2dc1f3fSmrg 	sym = create_tmp_reg (TREE_TYPE (var));
12351debfc3dSmrg       currdef = get_or_create_ssa_default_def (cfun, sym);
12361debfc3dSmrg     }
12371debfc3dSmrg 
12381debfc3dSmrg   /* Return the current reaching definition for VAR, or the default
12391debfc3dSmrg      definition, if we had to create one.  */
12401debfc3dSmrg   return currdef;
12411debfc3dSmrg }
12421debfc3dSmrg 
12431debfc3dSmrg 
12441debfc3dSmrg /* Helper function for rewrite_stmt.  Rewrite uses in a debug stmt.  */
12451debfc3dSmrg 
12461debfc3dSmrg static void
rewrite_debug_stmt_uses(gimple * stmt)12471debfc3dSmrg rewrite_debug_stmt_uses (gimple *stmt)
12481debfc3dSmrg {
12491debfc3dSmrg   use_operand_p use_p;
12501debfc3dSmrg   ssa_op_iter iter;
12511debfc3dSmrg   bool update = false;
12521debfc3dSmrg 
12531debfc3dSmrg   FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
12541debfc3dSmrg     {
12551debfc3dSmrg       tree var = USE_FROM_PTR (use_p), def;
12561debfc3dSmrg       common_info *info = get_common_info (var);
12571debfc3dSmrg       gcc_checking_assert (DECL_P (var));
12581debfc3dSmrg       def = info->current_def;
12591debfc3dSmrg       if (!def)
12601debfc3dSmrg 	{
12611debfc3dSmrg 	  if (TREE_CODE (var) == PARM_DECL
12621debfc3dSmrg 	      && single_succ_p (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
12631debfc3dSmrg 	    {
12641debfc3dSmrg 	      gimple_stmt_iterator gsi
12651debfc3dSmrg 		=
12661debfc3dSmrg 	     gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
12671debfc3dSmrg 	      int lim;
12681debfc3dSmrg 	      /* Search a few source bind stmts at the start of first bb to
12691debfc3dSmrg 		 see if a DEBUG_EXPR_DECL can't be reused.  */
12701debfc3dSmrg 	      for (lim = 32;
12711debfc3dSmrg 		   !gsi_end_p (gsi) && lim > 0;
12721debfc3dSmrg 		   gsi_next (&gsi), lim--)
12731debfc3dSmrg 		{
12741debfc3dSmrg 		  gimple *gstmt = gsi_stmt (gsi);
12751debfc3dSmrg 		  if (!gimple_debug_source_bind_p (gstmt))
12761debfc3dSmrg 		    break;
12771debfc3dSmrg 		  if (gimple_debug_source_bind_get_value (gstmt) == var)
12781debfc3dSmrg 		    {
12791debfc3dSmrg 		      def = gimple_debug_source_bind_get_var (gstmt);
12801debfc3dSmrg 		      if (TREE_CODE (def) == DEBUG_EXPR_DECL)
12811debfc3dSmrg 			break;
12821debfc3dSmrg 		      else
12831debfc3dSmrg 			def = NULL_TREE;
12841debfc3dSmrg 		    }
12851debfc3dSmrg 		}
12861debfc3dSmrg 	      /* If not, add a new source bind stmt.  */
12871debfc3dSmrg 	      if (def == NULL_TREE)
12881debfc3dSmrg 		{
12891debfc3dSmrg 		  gimple *def_temp;
12901debfc3dSmrg 		  def = make_node (DEBUG_EXPR_DECL);
12911debfc3dSmrg 		  def_temp = gimple_build_debug_source_bind (def, var, NULL);
12921debfc3dSmrg 		  DECL_ARTIFICIAL (def) = 1;
12931debfc3dSmrg 		  TREE_TYPE (def) = TREE_TYPE (var);
12941debfc3dSmrg 		  SET_DECL_MODE (def, DECL_MODE (var));
12951debfc3dSmrg 		  gsi =
12961debfc3dSmrg 		 gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
12971debfc3dSmrg 		  gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
12981debfc3dSmrg 		}
12991debfc3dSmrg 	      update = true;
13001debfc3dSmrg 	    }
13011debfc3dSmrg 	}
13021debfc3dSmrg       else
13031debfc3dSmrg 	{
13041debfc3dSmrg 	  /* Check if info->current_def can be trusted.  */
13051debfc3dSmrg 	  basic_block bb = gimple_bb (stmt);
13061debfc3dSmrg 	  basic_block def_bb
13071debfc3dSmrg 	      = SSA_NAME_IS_DEFAULT_DEF (def)
13081debfc3dSmrg 	      ? NULL : gimple_bb (SSA_NAME_DEF_STMT (def));
13091debfc3dSmrg 
13101debfc3dSmrg 	  /* If definition is in current bb, it is fine.  */
13111debfc3dSmrg 	  if (bb == def_bb)
13121debfc3dSmrg 	    ;
13131debfc3dSmrg 	  /* If definition bb doesn't dominate the current bb,
13141debfc3dSmrg 	     it can't be used.  */
13151debfc3dSmrg 	  else if (def_bb && !dominated_by_p (CDI_DOMINATORS, bb, def_bb))
13161debfc3dSmrg 	    def = NULL;
13171debfc3dSmrg 	  /* If there is just one definition and dominates the current
13181debfc3dSmrg 	     bb, it is fine.  */
13191debfc3dSmrg 	  else if (info->need_phi_state == NEED_PHI_STATE_NO)
13201debfc3dSmrg 	    ;
13211debfc3dSmrg 	  else
13221debfc3dSmrg 	    {
13231debfc3dSmrg 	      def_blocks *db_p = get_def_blocks_for (info);
13241debfc3dSmrg 
13251debfc3dSmrg 	      /* If there are some non-debug uses in the current bb,
13261debfc3dSmrg 		 it is fine.  */
13271debfc3dSmrg 	      if (bitmap_bit_p (db_p->livein_blocks, bb->index))
13281debfc3dSmrg 		;
13291debfc3dSmrg 	      /* Otherwise give up for now.  */
13301debfc3dSmrg 	      else
13311debfc3dSmrg 		def = NULL;
13321debfc3dSmrg 	    }
13331debfc3dSmrg 	}
13341debfc3dSmrg       if (def == NULL)
13351debfc3dSmrg 	{
13361debfc3dSmrg 	  gimple_debug_bind_reset_value (stmt);
13371debfc3dSmrg 	  update_stmt (stmt);
13381debfc3dSmrg 	  return;
13391debfc3dSmrg 	}
13401debfc3dSmrg       SET_USE (use_p, def);
13411debfc3dSmrg     }
13421debfc3dSmrg   if (update)
13431debfc3dSmrg     update_stmt (stmt);
13441debfc3dSmrg }
13451debfc3dSmrg 
13461debfc3dSmrg /* SSA Rewriting Step 2.  Rewrite every variable used in each statement in
13471debfc3dSmrg    the block with its immediate reaching definitions.  Update the current
13481debfc3dSmrg    definition of a variable when a new real or virtual definition is found.  */
13491debfc3dSmrg 
13501debfc3dSmrg static void
rewrite_stmt(gimple_stmt_iterator * si)13511debfc3dSmrg rewrite_stmt (gimple_stmt_iterator *si)
13521debfc3dSmrg {
13531debfc3dSmrg   use_operand_p use_p;
13541debfc3dSmrg   def_operand_p def_p;
13551debfc3dSmrg   ssa_op_iter iter;
13561debfc3dSmrg   gimple *stmt = gsi_stmt (*si);
13571debfc3dSmrg 
13581debfc3dSmrg   /* If mark_def_sites decided that we don't need to rewrite this
13591debfc3dSmrg      statement, ignore it.  */
13601debfc3dSmrg   gcc_assert (blocks_to_update == NULL);
13611debfc3dSmrg   if (!rewrite_uses_p (stmt) && !register_defs_p (stmt))
13621debfc3dSmrg     return;
13631debfc3dSmrg 
13641debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
13651debfc3dSmrg     {
13661debfc3dSmrg       fprintf (dump_file, "Renaming statement ");
13671debfc3dSmrg       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
13681debfc3dSmrg       fprintf (dump_file, "\n");
13691debfc3dSmrg     }
13701debfc3dSmrg 
13711debfc3dSmrg   /* Step 1.  Rewrite USES in the statement.  */
13721debfc3dSmrg   if (rewrite_uses_p (stmt))
13731debfc3dSmrg     {
13741debfc3dSmrg       if (is_gimple_debug (stmt))
13751debfc3dSmrg 	rewrite_debug_stmt_uses (stmt);
13761debfc3dSmrg       else
13771debfc3dSmrg 	FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
13781debfc3dSmrg 	  {
13791debfc3dSmrg 	    tree var = USE_FROM_PTR (use_p);
13801debfc3dSmrg 	    if (TREE_CODE (var) == SSA_NAME)
13811debfc3dSmrg 	      continue;
13821debfc3dSmrg 	    gcc_checking_assert (DECL_P (var));
13831debfc3dSmrg 	    SET_USE (use_p, get_reaching_def (var));
13841debfc3dSmrg 	  }
13851debfc3dSmrg     }
13861debfc3dSmrg 
13871debfc3dSmrg   /* Step 2.  Register the statement's DEF operands.  */
13881debfc3dSmrg   if (register_defs_p (stmt))
13891debfc3dSmrg     FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
13901debfc3dSmrg       {
13911debfc3dSmrg 	tree var = DEF_FROM_PTR (def_p);
13921debfc3dSmrg 	tree name;
13931debfc3dSmrg 	tree tracked_var;
13941debfc3dSmrg 
13951debfc3dSmrg 	if (TREE_CODE (var) == SSA_NAME)
13961debfc3dSmrg 	  continue;
13971debfc3dSmrg 	gcc_checking_assert (DECL_P (var));
13981debfc3dSmrg 
13991debfc3dSmrg 	if (gimple_clobber_p (stmt)
14001debfc3dSmrg 	    && is_gimple_reg (var))
14011debfc3dSmrg 	  {
14021debfc3dSmrg 	    /* If we rewrite a DECL into SSA form then drop its
14031debfc3dSmrg 	       clobber stmts and replace uses with a new default def.  */
14041debfc3dSmrg 	    gcc_checking_assert (VAR_P (var) && !gimple_vdef (stmt));
14051debfc3dSmrg 	    gsi_replace (si, gimple_build_nop (), true);
14061debfc3dSmrg 	    register_new_def (get_or_create_ssa_default_def (cfun, var), var);
14071debfc3dSmrg 	    break;
14081debfc3dSmrg 	  }
14091debfc3dSmrg 
14101debfc3dSmrg 	name = make_ssa_name (var, stmt);
14111debfc3dSmrg 	SET_DEF (def_p, name);
14121debfc3dSmrg 	register_new_def (DEF_FROM_PTR (def_p), var);
14131debfc3dSmrg 
14141debfc3dSmrg 	tracked_var = target_for_debug_bind (var);
14151debfc3dSmrg 	if (tracked_var)
14161debfc3dSmrg 	  {
14171debfc3dSmrg 	    gimple *note = gimple_build_debug_bind (tracked_var, name, stmt);
14181debfc3dSmrg 	    gsi_insert_after (si, note, GSI_SAME_STMT);
14191debfc3dSmrg 	  }
14201debfc3dSmrg       }
14211debfc3dSmrg }
14221debfc3dSmrg 
14231debfc3dSmrg 
14241debfc3dSmrg /* SSA Rewriting Step 3.  Visit all the successor blocks of BB looking for
14251debfc3dSmrg    PHI nodes.  For every PHI node found, add a new argument containing the
14261debfc3dSmrg    current reaching definition for the variable and the edge through which
14271debfc3dSmrg    that definition is reaching the PHI node.  */
14281debfc3dSmrg 
14291debfc3dSmrg static void
rewrite_add_phi_arguments(basic_block bb)14301debfc3dSmrg rewrite_add_phi_arguments (basic_block bb)
14311debfc3dSmrg {
14321debfc3dSmrg   edge e;
14331debfc3dSmrg   edge_iterator ei;
14341debfc3dSmrg 
14351debfc3dSmrg   FOR_EACH_EDGE (e, ei, bb->succs)
14361debfc3dSmrg     {
14371debfc3dSmrg       gphi *phi;
14381debfc3dSmrg       gphi_iterator gsi;
14391debfc3dSmrg 
14401debfc3dSmrg       for (gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi);
14411debfc3dSmrg 	   gsi_next (&gsi))
14421debfc3dSmrg 	{
1443c0a68be4Smrg 	  tree currdef, res;
14441debfc3dSmrg 	  location_t loc;
14451debfc3dSmrg 
14461debfc3dSmrg 	  phi = gsi.phi ();
14471debfc3dSmrg 	  res = gimple_phi_result (phi);
1448c0a68be4Smrg 	  currdef = get_reaching_def (SSA_NAME_VAR (res));
14491debfc3dSmrg 	  /* Virtual operand PHI args do not need a location.  */
14501debfc3dSmrg 	  if (virtual_operand_p (res))
14511debfc3dSmrg 	    loc = UNKNOWN_LOCATION;
14521debfc3dSmrg 	  else
14531debfc3dSmrg 	    loc = gimple_location (SSA_NAME_DEF_STMT (currdef));
14541debfc3dSmrg 	  add_phi_arg (phi, currdef, e, loc);
14551debfc3dSmrg 	}
14561debfc3dSmrg     }
14571debfc3dSmrg }
14581debfc3dSmrg 
14591debfc3dSmrg class rewrite_dom_walker : public dom_walker
14601debfc3dSmrg {
14611debfc3dSmrg public:
rewrite_dom_walker(cdi_direction direction)1462a2dc1f3fSmrg   rewrite_dom_walker (cdi_direction direction)
1463a2dc1f3fSmrg     : dom_walker (direction, ALL_BLOCKS, NULL) {}
14641debfc3dSmrg 
14651debfc3dSmrg   virtual edge before_dom_children (basic_block);
14661debfc3dSmrg   virtual void after_dom_children (basic_block);
14671debfc3dSmrg };
14681debfc3dSmrg 
14691debfc3dSmrg /* SSA Rewriting Step 1.  Initialization, create a block local stack
14701debfc3dSmrg    of reaching definitions for new SSA names produced in this block
14711debfc3dSmrg    (BLOCK_DEFS).  Register new definitions for every PHI node in the
14721debfc3dSmrg    block.  */
14731debfc3dSmrg 
14741debfc3dSmrg edge
before_dom_children(basic_block bb)14751debfc3dSmrg rewrite_dom_walker::before_dom_children (basic_block bb)
14761debfc3dSmrg {
14771debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
14781debfc3dSmrg     fprintf (dump_file, "\n\nRenaming block #%d\n\n", bb->index);
14791debfc3dSmrg 
14801debfc3dSmrg   /* Mark the unwind point for this block.  */
14811debfc3dSmrg   block_defs_stack.safe_push (NULL_TREE);
14821debfc3dSmrg 
14831debfc3dSmrg   /* Step 1.  Register new definitions for every PHI node in the block.
14841debfc3dSmrg      Conceptually, all the PHI nodes are executed in parallel and each PHI
14851debfc3dSmrg      node introduces a new version for the associated variable.  */
14861debfc3dSmrg   for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
14871debfc3dSmrg        gsi_next (&gsi))
14881debfc3dSmrg     {
14891debfc3dSmrg       tree result = gimple_phi_result (gsi_stmt (gsi));
14901debfc3dSmrg       register_new_def (result, SSA_NAME_VAR (result));
14911debfc3dSmrg     }
14921debfc3dSmrg 
14931debfc3dSmrg   /* Step 2.  Rewrite every variable used in each statement in the block
14941debfc3dSmrg      with its immediate reaching definitions.  Update the current definition
14951debfc3dSmrg      of a variable when a new real or virtual definition is found.  */
14961debfc3dSmrg   if (bitmap_bit_p (interesting_blocks, bb->index))
14971debfc3dSmrg     for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
14981debfc3dSmrg 	 gsi_next (&gsi))
14991debfc3dSmrg       rewrite_stmt (&gsi);
15001debfc3dSmrg 
15011debfc3dSmrg   /* Step 3.  Visit all the successor blocks of BB looking for PHI nodes.
15021debfc3dSmrg      For every PHI node found, add a new argument containing the current
15031debfc3dSmrg      reaching definition for the variable and the edge through which that
15041debfc3dSmrg      definition is reaching the PHI node.  */
15051debfc3dSmrg   rewrite_add_phi_arguments (bb);
15061debfc3dSmrg 
15071debfc3dSmrg   return NULL;
15081debfc3dSmrg }
15091debfc3dSmrg 
15101debfc3dSmrg 
15111debfc3dSmrg 
15121debfc3dSmrg /* Called after visiting all the statements in basic block BB and all
15131debfc3dSmrg    of its dominator children.  Restore CURRDEFS to its original value.  */
15141debfc3dSmrg 
15151debfc3dSmrg void
after_dom_children(basic_block bb ATTRIBUTE_UNUSED)15161debfc3dSmrg rewrite_dom_walker::after_dom_children (basic_block bb ATTRIBUTE_UNUSED)
15171debfc3dSmrg {
15181debfc3dSmrg   /* Restore CURRDEFS to its original state.  */
15191debfc3dSmrg   while (block_defs_stack.length () > 0)
15201debfc3dSmrg     {
15211debfc3dSmrg       tree tmp = block_defs_stack.pop ();
15221debfc3dSmrg       tree saved_def, var;
15231debfc3dSmrg 
15241debfc3dSmrg       if (tmp == NULL_TREE)
15251debfc3dSmrg 	break;
15261debfc3dSmrg 
15271debfc3dSmrg       if (TREE_CODE (tmp) == SSA_NAME)
15281debfc3dSmrg 	{
15291debfc3dSmrg 	  /* If we recorded an SSA_NAME, then make the SSA_NAME the
15301debfc3dSmrg 	     current definition of its underlying variable.  Note that
15311debfc3dSmrg 	     if the SSA_NAME is not for a GIMPLE register, the symbol
15321debfc3dSmrg 	     being defined is stored in the next slot in the stack.
15331debfc3dSmrg 	     This mechanism is needed because an SSA name for a
15341debfc3dSmrg 	     non-register symbol may be the definition for more than
15351debfc3dSmrg 	     one symbol (e.g., SFTs, aliased variables, etc).  */
15361debfc3dSmrg 	  saved_def = tmp;
15371debfc3dSmrg 	  var = SSA_NAME_VAR (saved_def);
15381debfc3dSmrg 	  if (!is_gimple_reg (var))
15391debfc3dSmrg 	    var = block_defs_stack.pop ();
15401debfc3dSmrg 	}
15411debfc3dSmrg       else
15421debfc3dSmrg 	{
15431debfc3dSmrg 	  /* If we recorded anything else, it must have been a _DECL
15441debfc3dSmrg 	     node and its current reaching definition must have been
15451debfc3dSmrg 	     NULL.  */
15461debfc3dSmrg 	  saved_def = NULL;
15471debfc3dSmrg 	  var = tmp;
15481debfc3dSmrg 	}
15491debfc3dSmrg 
15501debfc3dSmrg       get_common_info (var)->current_def = saved_def;
15511debfc3dSmrg     }
15521debfc3dSmrg }
15531debfc3dSmrg 
15541debfc3dSmrg 
15551debfc3dSmrg /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE.  */
15561debfc3dSmrg 
15571debfc3dSmrg DEBUG_FUNCTION void
debug_decl_set(bitmap set)15581debfc3dSmrg debug_decl_set (bitmap set)
15591debfc3dSmrg {
15601debfc3dSmrg   dump_decl_set (stderr, set);
15611debfc3dSmrg   fprintf (stderr, "\n");
15621debfc3dSmrg }
15631debfc3dSmrg 
15641debfc3dSmrg 
15651debfc3dSmrg /* Dump the renaming stack (block_defs_stack) to FILE.  Traverse the
15661debfc3dSmrg    stack up to a maximum of N levels.  If N is -1, the whole stack is
15671debfc3dSmrg    dumped.  New levels are created when the dominator tree traversal
15681debfc3dSmrg    used for renaming enters a new sub-tree.  */
15691debfc3dSmrg 
15701debfc3dSmrg void
dump_defs_stack(FILE * file,int n)15711debfc3dSmrg dump_defs_stack (FILE *file, int n)
15721debfc3dSmrg {
15731debfc3dSmrg   int i, j;
15741debfc3dSmrg 
15751debfc3dSmrg   fprintf (file, "\n\nRenaming stack");
15761debfc3dSmrg   if (n > 0)
15771debfc3dSmrg     fprintf (file, " (up to %d levels)", n);
15781debfc3dSmrg   fprintf (file, "\n\n");
15791debfc3dSmrg 
15801debfc3dSmrg   i = 1;
15811debfc3dSmrg   fprintf (file, "Level %d (current level)\n", i);
15821debfc3dSmrg   for (j = (int) block_defs_stack.length () - 1; j >= 0; j--)
15831debfc3dSmrg     {
15841debfc3dSmrg       tree name, var;
15851debfc3dSmrg 
15861debfc3dSmrg       name = block_defs_stack[j];
15871debfc3dSmrg       if (name == NULL_TREE)
15881debfc3dSmrg 	{
15891debfc3dSmrg 	  i++;
15901debfc3dSmrg 	  if (n > 0 && i > n)
15911debfc3dSmrg 	    break;
15921debfc3dSmrg 	  fprintf (file, "\nLevel %d\n", i);
15931debfc3dSmrg 	  continue;
15941debfc3dSmrg 	}
15951debfc3dSmrg 
15961debfc3dSmrg       if (DECL_P (name))
15971debfc3dSmrg 	{
15981debfc3dSmrg 	  var = name;
15991debfc3dSmrg 	  name = NULL_TREE;
16001debfc3dSmrg 	}
16011debfc3dSmrg       else
16021debfc3dSmrg 	{
16031debfc3dSmrg 	  var = SSA_NAME_VAR (name);
16041debfc3dSmrg 	  if (!is_gimple_reg (var))
16051debfc3dSmrg 	    {
16061debfc3dSmrg 	      j--;
16071debfc3dSmrg 	      var = block_defs_stack[j];
16081debfc3dSmrg 	    }
16091debfc3dSmrg 	}
16101debfc3dSmrg 
16111debfc3dSmrg       fprintf (file, "    Previous CURRDEF (");
1612a2dc1f3fSmrg       print_generic_expr (file, var);
16131debfc3dSmrg       fprintf (file, ") = ");
16141debfc3dSmrg       if (name)
1615a2dc1f3fSmrg 	print_generic_expr (file, name);
16161debfc3dSmrg       else
16171debfc3dSmrg 	fprintf (file, "<NIL>");
16181debfc3dSmrg       fprintf (file, "\n");
16191debfc3dSmrg     }
16201debfc3dSmrg }
16211debfc3dSmrg 
16221debfc3dSmrg 
16231debfc3dSmrg /* Dump the renaming stack (block_defs_stack) to stderr.  Traverse the
16241debfc3dSmrg    stack up to a maximum of N levels.  If N is -1, the whole stack is
16251debfc3dSmrg    dumped.  New levels are created when the dominator tree traversal
16261debfc3dSmrg    used for renaming enters a new sub-tree.  */
16271debfc3dSmrg 
16281debfc3dSmrg DEBUG_FUNCTION void
debug_defs_stack(int n)16291debfc3dSmrg debug_defs_stack (int n)
16301debfc3dSmrg {
16311debfc3dSmrg   dump_defs_stack (stderr, n);
16321debfc3dSmrg }
16331debfc3dSmrg 
16341debfc3dSmrg 
16351debfc3dSmrg /* Dump the current reaching definition of every symbol to FILE.  */
16361debfc3dSmrg 
16371debfc3dSmrg void
dump_currdefs(FILE * file)16381debfc3dSmrg dump_currdefs (FILE *file)
16391debfc3dSmrg {
16401debfc3dSmrg   unsigned i;
16411debfc3dSmrg   tree var;
16421debfc3dSmrg 
16431debfc3dSmrg   if (symbols_to_rename.is_empty ())
16441debfc3dSmrg     return;
16451debfc3dSmrg 
16461debfc3dSmrg   fprintf (file, "\n\nCurrent reaching definitions\n\n");
16471debfc3dSmrg   FOR_EACH_VEC_ELT (symbols_to_rename, i, var)
16481debfc3dSmrg     {
16491debfc3dSmrg       common_info *info = get_common_info (var);
16501debfc3dSmrg       fprintf (file, "CURRDEF (");
1651a2dc1f3fSmrg       print_generic_expr (file, var);
16521debfc3dSmrg       fprintf (file, ") = ");
16531debfc3dSmrg       if (info->current_def)
1654a2dc1f3fSmrg 	print_generic_expr (file, info->current_def);
16551debfc3dSmrg       else
16561debfc3dSmrg 	fprintf (file, "<NIL>");
16571debfc3dSmrg       fprintf (file, "\n");
16581debfc3dSmrg     }
16591debfc3dSmrg }
16601debfc3dSmrg 
16611debfc3dSmrg 
16621debfc3dSmrg /* Dump the current reaching definition of every symbol to stderr.  */
16631debfc3dSmrg 
16641debfc3dSmrg DEBUG_FUNCTION void
debug_currdefs(void)16651debfc3dSmrg debug_currdefs (void)
16661debfc3dSmrg {
16671debfc3dSmrg   dump_currdefs (stderr);
16681debfc3dSmrg }
16691debfc3dSmrg 
16701debfc3dSmrg 
16711debfc3dSmrg /* Dump SSA information to FILE.  */
16721debfc3dSmrg 
16731debfc3dSmrg void
dump_tree_ssa(FILE * file)16741debfc3dSmrg dump_tree_ssa (FILE *file)
16751debfc3dSmrg {
16761debfc3dSmrg   const char *funcname
16771debfc3dSmrg     = lang_hooks.decl_printable_name (current_function_decl, 2);
16781debfc3dSmrg 
16791debfc3dSmrg   fprintf (file, "SSA renaming information for %s\n\n", funcname);
16801debfc3dSmrg 
16811debfc3dSmrg   dump_var_infos (file);
16821debfc3dSmrg   dump_defs_stack (file, -1);
16831debfc3dSmrg   dump_currdefs (file);
16841debfc3dSmrg   dump_tree_ssa_stats (file);
16851debfc3dSmrg }
16861debfc3dSmrg 
16871debfc3dSmrg 
16881debfc3dSmrg /* Dump SSA information to stderr.  */
16891debfc3dSmrg 
16901debfc3dSmrg DEBUG_FUNCTION void
debug_tree_ssa(void)16911debfc3dSmrg debug_tree_ssa (void)
16921debfc3dSmrg {
16931debfc3dSmrg   dump_tree_ssa (stderr);
16941debfc3dSmrg }
16951debfc3dSmrg 
16961debfc3dSmrg 
16971debfc3dSmrg /* Dump statistics for the hash table HTAB.  */
16981debfc3dSmrg 
16991debfc3dSmrg static void
htab_statistics(FILE * file,const hash_table<var_info_hasher> & htab)17001debfc3dSmrg htab_statistics (FILE *file, const hash_table<var_info_hasher> &htab)
17011debfc3dSmrg {
17021debfc3dSmrg   fprintf (file, "size %ld, %ld elements, %f collision/search ratio\n",
17031debfc3dSmrg 	   (long) htab.size (),
17041debfc3dSmrg 	   (long) htab.elements (),
17051debfc3dSmrg 	   htab.collisions ());
17061debfc3dSmrg }
17071debfc3dSmrg 
17081debfc3dSmrg 
17091debfc3dSmrg /* Dump SSA statistics on FILE.  */
17101debfc3dSmrg 
17111debfc3dSmrg void
dump_tree_ssa_stats(FILE * file)17121debfc3dSmrg dump_tree_ssa_stats (FILE *file)
17131debfc3dSmrg {
17141debfc3dSmrg   if (var_infos)
17151debfc3dSmrg     {
17161debfc3dSmrg       fprintf (file, "\nHash table statistics:\n");
17171debfc3dSmrg       fprintf (file, "    var_infos:   ");
17181debfc3dSmrg       htab_statistics (file, *var_infos);
17191debfc3dSmrg       fprintf (file, "\n");
17201debfc3dSmrg     }
17211debfc3dSmrg }
17221debfc3dSmrg 
17231debfc3dSmrg 
17241debfc3dSmrg /* Dump SSA statistics on stderr.  */
17251debfc3dSmrg 
17261debfc3dSmrg DEBUG_FUNCTION void
debug_tree_ssa_stats(void)17271debfc3dSmrg debug_tree_ssa_stats (void)
17281debfc3dSmrg {
17291debfc3dSmrg   dump_tree_ssa_stats (stderr);
17301debfc3dSmrg }
17311debfc3dSmrg 
17321debfc3dSmrg 
17331debfc3dSmrg /* Callback for htab_traverse to dump the VAR_INFOS hash table.  */
17341debfc3dSmrg 
17351debfc3dSmrg int
debug_var_infos_r(var_info ** slot,FILE * file)17361debfc3dSmrg debug_var_infos_r (var_info **slot, FILE *file)
17371debfc3dSmrg {
17381debfc3dSmrg   var_info *info = *slot;
17391debfc3dSmrg 
17401debfc3dSmrg   fprintf (file, "VAR: ");
17411debfc3dSmrg   print_generic_expr (file, info->var, dump_flags);
17421debfc3dSmrg   bitmap_print (file, info->info.def_blocks.def_blocks,
17431debfc3dSmrg 		", DEF_BLOCKS: { ", "}");
17441debfc3dSmrg   bitmap_print (file, info->info.def_blocks.livein_blocks,
17451debfc3dSmrg 		", LIVEIN_BLOCKS: { ", "}");
17461debfc3dSmrg   bitmap_print (file, info->info.def_blocks.phi_blocks,
17471debfc3dSmrg 		", PHI_BLOCKS: { ", "}\n");
17481debfc3dSmrg 
17491debfc3dSmrg   return 1;
17501debfc3dSmrg }
17511debfc3dSmrg 
17521debfc3dSmrg 
17531debfc3dSmrg /* Dump the VAR_INFOS hash table on FILE.  */
17541debfc3dSmrg 
17551debfc3dSmrg void
dump_var_infos(FILE * file)17561debfc3dSmrg dump_var_infos (FILE *file)
17571debfc3dSmrg {
17581debfc3dSmrg   fprintf (file, "\n\nDefinition and live-in blocks:\n\n");
17591debfc3dSmrg   if (var_infos)
17601debfc3dSmrg     var_infos->traverse <FILE *, debug_var_infos_r> (file);
17611debfc3dSmrg }
17621debfc3dSmrg 
17631debfc3dSmrg 
17641debfc3dSmrg /* Dump the VAR_INFOS hash table on stderr.  */
17651debfc3dSmrg 
17661debfc3dSmrg DEBUG_FUNCTION void
debug_var_infos(void)17671debfc3dSmrg debug_var_infos (void)
17681debfc3dSmrg {
17691debfc3dSmrg   dump_var_infos (stderr);
17701debfc3dSmrg }
17711debfc3dSmrg 
17721debfc3dSmrg 
17731debfc3dSmrg /* Register NEW_NAME to be the new reaching definition for OLD_NAME.  */
17741debfc3dSmrg 
17751debfc3dSmrg static inline void
register_new_update_single(tree new_name,tree old_name)17761debfc3dSmrg register_new_update_single (tree new_name, tree old_name)
17771debfc3dSmrg {
17781debfc3dSmrg   common_info *info = get_common_info (old_name);
17791debfc3dSmrg   tree currdef = info->current_def;
17801debfc3dSmrg 
17811debfc3dSmrg   /* Push the current reaching definition into BLOCK_DEFS_STACK.
17821debfc3dSmrg      This stack is later used by the dominator tree callbacks to
17831debfc3dSmrg      restore the reaching definitions for all the variables
17841debfc3dSmrg      defined in the block after a recursive visit to all its
17851debfc3dSmrg      immediately dominated blocks.  */
17861debfc3dSmrg   block_defs_stack.reserve (2);
17871debfc3dSmrg   block_defs_stack.quick_push (currdef);
17881debfc3dSmrg   block_defs_stack.quick_push (old_name);
17891debfc3dSmrg 
17901debfc3dSmrg   /* Set the current reaching definition for OLD_NAME to be
17911debfc3dSmrg      NEW_NAME.  */
17921debfc3dSmrg   info->current_def = new_name;
17931debfc3dSmrg }
17941debfc3dSmrg 
17951debfc3dSmrg 
17961debfc3dSmrg /* Register NEW_NAME to be the new reaching definition for all the
17971debfc3dSmrg    names in OLD_NAMES.  Used by the incremental SSA update routines to
17981debfc3dSmrg    replace old SSA names with new ones.  */
17991debfc3dSmrg 
18001debfc3dSmrg static inline void
register_new_update_set(tree new_name,bitmap old_names)18011debfc3dSmrg register_new_update_set (tree new_name, bitmap old_names)
18021debfc3dSmrg {
18031debfc3dSmrg   bitmap_iterator bi;
18041debfc3dSmrg   unsigned i;
18051debfc3dSmrg 
18061debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (old_names, 0, i, bi)
18071debfc3dSmrg     register_new_update_single (new_name, ssa_name (i));
18081debfc3dSmrg }
18091debfc3dSmrg 
18101debfc3dSmrg 
18111debfc3dSmrg 
18121debfc3dSmrg /* If the operand pointed to by USE_P is a name in OLD_SSA_NAMES or
18131debfc3dSmrg    it is a symbol marked for renaming, replace it with USE_P's current
18141debfc3dSmrg    reaching definition.  */
18151debfc3dSmrg 
18161debfc3dSmrg static inline void
maybe_replace_use(use_operand_p use_p)18171debfc3dSmrg maybe_replace_use (use_operand_p use_p)
18181debfc3dSmrg {
18191debfc3dSmrg   tree rdef = NULL_TREE;
18201debfc3dSmrg   tree use = USE_FROM_PTR (use_p);
18211debfc3dSmrg   tree sym = DECL_P (use) ? use : SSA_NAME_VAR (use);
18221debfc3dSmrg 
18231debfc3dSmrg   if (marked_for_renaming (sym))
18241debfc3dSmrg     rdef = get_reaching_def (sym);
18251debfc3dSmrg   else if (is_old_name (use))
18261debfc3dSmrg     rdef = get_reaching_def (use);
18271debfc3dSmrg 
18281debfc3dSmrg   if (rdef && rdef != use)
18291debfc3dSmrg     SET_USE (use_p, rdef);
18301debfc3dSmrg }
18311debfc3dSmrg 
18321debfc3dSmrg 
18331debfc3dSmrg /* Same as maybe_replace_use, but without introducing default stmts,
18341debfc3dSmrg    returning false to indicate a need to do so.  */
18351debfc3dSmrg 
18361debfc3dSmrg static inline bool
maybe_replace_use_in_debug_stmt(use_operand_p use_p)18371debfc3dSmrg maybe_replace_use_in_debug_stmt (use_operand_p use_p)
18381debfc3dSmrg {
18391debfc3dSmrg   tree rdef = NULL_TREE;
18401debfc3dSmrg   tree use = USE_FROM_PTR (use_p);
18411debfc3dSmrg   tree sym = DECL_P (use) ? use : SSA_NAME_VAR (use);
18421debfc3dSmrg 
18431debfc3dSmrg   if (marked_for_renaming (sym))
18441debfc3dSmrg     rdef = get_var_info (sym)->info.current_def;
18451debfc3dSmrg   else if (is_old_name (use))
18461debfc3dSmrg     {
18471debfc3dSmrg       rdef = get_ssa_name_ann (use)->info.current_def;
18481debfc3dSmrg       /* We can't assume that, if there's no current definition, the
18491debfc3dSmrg 	 default one should be used.  It could be the case that we've
18501debfc3dSmrg 	 rearranged blocks so that the earlier definition no longer
18511debfc3dSmrg 	 dominates the use.  */
18521debfc3dSmrg       if (!rdef && SSA_NAME_IS_DEFAULT_DEF (use))
18531debfc3dSmrg 	rdef = use;
18541debfc3dSmrg     }
18551debfc3dSmrg   else
18561debfc3dSmrg     rdef = use;
18571debfc3dSmrg 
18581debfc3dSmrg   if (rdef && rdef != use)
18591debfc3dSmrg     SET_USE (use_p, rdef);
18601debfc3dSmrg 
18611debfc3dSmrg   return rdef != NULL_TREE;
18621debfc3dSmrg }
18631debfc3dSmrg 
18641debfc3dSmrg 
18651debfc3dSmrg /* If DEF has x_5 = ASAN_POISON () as its current def, add
18661debfc3dSmrg    ASAN_POISON_USE (x_5) stmt before GSI to denote the stmt writes into
18671debfc3dSmrg    a poisoned (out of scope) variable.  */
18681debfc3dSmrg 
18691debfc3dSmrg static void
maybe_add_asan_poison_write(tree def,gimple_stmt_iterator * gsi)18701debfc3dSmrg maybe_add_asan_poison_write (tree def, gimple_stmt_iterator *gsi)
18711debfc3dSmrg {
18721debfc3dSmrg   tree cdef = get_current_def (def);
18731debfc3dSmrg   if (cdef != NULL
18741debfc3dSmrg       && TREE_CODE (cdef) == SSA_NAME
18751debfc3dSmrg       && gimple_call_internal_p (SSA_NAME_DEF_STMT (cdef), IFN_ASAN_POISON))
18761debfc3dSmrg     {
18771debfc3dSmrg       gcall *call
18781debfc3dSmrg 	= gimple_build_call_internal (IFN_ASAN_POISON_USE, 1, cdef);
18791debfc3dSmrg       gimple_set_location (call, gimple_location (gsi_stmt (*gsi)));
18801debfc3dSmrg       gsi_insert_before (gsi, call, GSI_SAME_STMT);
18811debfc3dSmrg     }
18821debfc3dSmrg }
18831debfc3dSmrg 
18841debfc3dSmrg 
18851debfc3dSmrg /* If the operand pointed to by DEF_P is an SSA name in NEW_SSA_NAMES
18861debfc3dSmrg    or OLD_SSA_NAMES, or if it is a symbol marked for renaming,
18871debfc3dSmrg    register it as the current definition for the names replaced by
18881debfc3dSmrg    DEF_P.  Returns whether the statement should be removed.  */
18891debfc3dSmrg 
18901debfc3dSmrg static inline bool
maybe_register_def(def_operand_p def_p,gimple * stmt,gimple_stmt_iterator gsi)18911debfc3dSmrg maybe_register_def (def_operand_p def_p, gimple *stmt,
18921debfc3dSmrg 		    gimple_stmt_iterator gsi)
18931debfc3dSmrg {
18941debfc3dSmrg   tree def = DEF_FROM_PTR (def_p);
18951debfc3dSmrg   tree sym = DECL_P (def) ? def : SSA_NAME_VAR (def);
18961debfc3dSmrg   bool to_delete = false;
18971debfc3dSmrg 
18981debfc3dSmrg   /* If DEF is a naked symbol that needs renaming, create a new
18991debfc3dSmrg      name for it.  */
19001debfc3dSmrg   if (marked_for_renaming (sym))
19011debfc3dSmrg     {
19021debfc3dSmrg       if (DECL_P (def))
19031debfc3dSmrg 	{
19041debfc3dSmrg 	  if (gimple_clobber_p (stmt) && is_gimple_reg (sym))
19051debfc3dSmrg 	    {
19061debfc3dSmrg 	      gcc_checking_assert (VAR_P (sym));
19071debfc3dSmrg 	      /* Replace clobber stmts with a default def. This new use of a
19081debfc3dSmrg 		 default definition may make it look like SSA_NAMEs have
19091debfc3dSmrg 		 conflicting lifetimes, so we need special code to let them
19101debfc3dSmrg 		 coalesce properly.  */
19111debfc3dSmrg 	      to_delete = true;
19121debfc3dSmrg 	      def = get_or_create_ssa_default_def (cfun, sym);
19131debfc3dSmrg 	    }
19141debfc3dSmrg 	  else
19151debfc3dSmrg 	    {
19161debfc3dSmrg 	      if (asan_sanitize_use_after_scope ())
19171debfc3dSmrg 		maybe_add_asan_poison_write (def, &gsi);
19181debfc3dSmrg 	      def = make_ssa_name (def, stmt);
19191debfc3dSmrg 	    }
19201debfc3dSmrg 	  SET_DEF (def_p, def);
19211debfc3dSmrg 
19221debfc3dSmrg 	  tree tracked_var = target_for_debug_bind (sym);
19231debfc3dSmrg 	  if (tracked_var)
19241debfc3dSmrg 	    {
19251debfc3dSmrg 	      gimple *note = gimple_build_debug_bind (tracked_var, def, stmt);
19261debfc3dSmrg 	      /* If stmt ends the bb, insert the debug stmt on the single
19271debfc3dSmrg 		 non-EH edge from the stmt.  */
19281debfc3dSmrg 	      if (gsi_one_before_end_p (gsi) && stmt_ends_bb_p (stmt))
19291debfc3dSmrg 		{
19301debfc3dSmrg 		  basic_block bb = gsi_bb (gsi);
19311debfc3dSmrg 		  edge_iterator ei;
19321debfc3dSmrg 		  edge e, ef = NULL;
19331debfc3dSmrg 		  FOR_EACH_EDGE (e, ei, bb->succs)
19341debfc3dSmrg 		    if (!(e->flags & EDGE_EH))
19351debfc3dSmrg 		      {
19361debfc3dSmrg 			gcc_checking_assert (!ef);
19371debfc3dSmrg 			ef = e;
19381debfc3dSmrg 		      }
19391debfc3dSmrg 		  /* If there are other predecessors to ef->dest, then
19401debfc3dSmrg 		     there must be PHI nodes for the modified
19411debfc3dSmrg 		     variable, and therefore there will be debug bind
19421debfc3dSmrg 		     stmts after the PHI nodes.  The debug bind notes
19431debfc3dSmrg 		     we'd insert would force the creation of a new
19441debfc3dSmrg 		     block (diverging codegen) and be redundant with
19451debfc3dSmrg 		     the post-PHI bind stmts, so don't add them.
19461debfc3dSmrg 
19471debfc3dSmrg 		     As for the exit edge, there wouldn't be redundant
19481debfc3dSmrg 		     bind stmts, but there wouldn't be a PC to bind
19491debfc3dSmrg 		     them to either, so avoid diverging the CFG.  */
19501debfc3dSmrg 		  if (ef && single_pred_p (ef->dest)
19511debfc3dSmrg 		      && ef->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
19521debfc3dSmrg 		    {
19531debfc3dSmrg 		      /* If there were PHI nodes in the node, we'd
19541debfc3dSmrg 			 have to make sure the value we're binding
19551debfc3dSmrg 			 doesn't need rewriting.  But there shouldn't
19561debfc3dSmrg 			 be PHI nodes in a single-predecessor block,
19571debfc3dSmrg 			 so we just add the note.  */
19581debfc3dSmrg 		      gsi_insert_on_edge_immediate (ef, note);
19591debfc3dSmrg 		    }
19601debfc3dSmrg 		}
19611debfc3dSmrg 	      else
19621debfc3dSmrg 		gsi_insert_after (&gsi, note, GSI_SAME_STMT);
19631debfc3dSmrg 	    }
19641debfc3dSmrg 	}
19651debfc3dSmrg 
19661debfc3dSmrg       register_new_update_single (def, sym);
19671debfc3dSmrg     }
19681debfc3dSmrg   else
19691debfc3dSmrg     {
19701debfc3dSmrg       /* If DEF is a new name, register it as a new definition
19711debfc3dSmrg 	 for all the names replaced by DEF.  */
19721debfc3dSmrg       if (is_new_name (def))
19731debfc3dSmrg 	register_new_update_set (def, names_replaced_by (def));
19741debfc3dSmrg 
19751debfc3dSmrg       /* If DEF is an old name, register DEF as a new
19761debfc3dSmrg 	 definition for itself.  */
19771debfc3dSmrg       if (is_old_name (def))
19781debfc3dSmrg 	register_new_update_single (def, def);
19791debfc3dSmrg     }
19801debfc3dSmrg 
19811debfc3dSmrg   return to_delete;
19821debfc3dSmrg }
19831debfc3dSmrg 
19841debfc3dSmrg 
19851debfc3dSmrg /* Update every variable used in the statement pointed-to by SI.  The
19861debfc3dSmrg    statement is assumed to be in SSA form already.  Names in
19871debfc3dSmrg    OLD_SSA_NAMES used by SI will be updated to their current reaching
19881debfc3dSmrg    definition.  Names in OLD_SSA_NAMES or NEW_SSA_NAMES defined by SI
19891debfc3dSmrg    will be registered as a new definition for their corresponding name
19901debfc3dSmrg    in OLD_SSA_NAMES.  Returns whether STMT should be removed.  */
19911debfc3dSmrg 
19921debfc3dSmrg static bool
rewrite_update_stmt(gimple * stmt,gimple_stmt_iterator gsi)19931debfc3dSmrg rewrite_update_stmt (gimple *stmt, gimple_stmt_iterator gsi)
19941debfc3dSmrg {
19951debfc3dSmrg   use_operand_p use_p;
19961debfc3dSmrg   def_operand_p def_p;
19971debfc3dSmrg   ssa_op_iter iter;
19981debfc3dSmrg 
19991debfc3dSmrg   /* Only update marked statements.  */
20001debfc3dSmrg   if (!rewrite_uses_p (stmt) && !register_defs_p (stmt))
20011debfc3dSmrg     return false;
20021debfc3dSmrg 
20031debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
20041debfc3dSmrg     {
20051debfc3dSmrg       fprintf (dump_file, "Updating SSA information for statement ");
20061debfc3dSmrg       print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM);
20071debfc3dSmrg     }
20081debfc3dSmrg 
20091debfc3dSmrg   /* Rewrite USES included in OLD_SSA_NAMES and USES whose underlying
20101debfc3dSmrg      symbol is marked for renaming.  */
20111debfc3dSmrg   if (rewrite_uses_p (stmt))
20121debfc3dSmrg     {
20131debfc3dSmrg       if (is_gimple_debug (stmt))
20141debfc3dSmrg 	{
20151debfc3dSmrg 	  bool failed = false;
20161debfc3dSmrg 
20171debfc3dSmrg 	  FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE)
20181debfc3dSmrg 	    if (!maybe_replace_use_in_debug_stmt (use_p))
20191debfc3dSmrg 	      {
20201debfc3dSmrg 		failed = true;
20211debfc3dSmrg 		break;
20221debfc3dSmrg 	      }
20231debfc3dSmrg 
20241debfc3dSmrg 	  if (failed)
20251debfc3dSmrg 	    {
20261debfc3dSmrg 	      /* DOM sometimes threads jumps in such a way that a
20271debfc3dSmrg 		 debug stmt ends up referencing a SSA variable that no
20281debfc3dSmrg 		 longer dominates the debug stmt, but such that all
20291debfc3dSmrg 		 incoming definitions refer to the same definition in
20301debfc3dSmrg 		 an earlier dominator.  We could try to recover that
20311debfc3dSmrg 		 definition somehow, but this will have to do for now.
20321debfc3dSmrg 
20331debfc3dSmrg 		 Introducing a default definition, which is what
20341debfc3dSmrg 		 maybe_replace_use() would do in such cases, may
20351debfc3dSmrg 		 modify code generation, for the otherwise-unused
20361debfc3dSmrg 		 default definition would never go away, modifying SSA
20371debfc3dSmrg 		 version numbers all over.  */
20381debfc3dSmrg 	      gimple_debug_bind_reset_value (stmt);
20391debfc3dSmrg 	      update_stmt (stmt);
20401debfc3dSmrg 	    }
20411debfc3dSmrg 	}
20421debfc3dSmrg       else
20431debfc3dSmrg 	{
20441debfc3dSmrg 	  FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES)
20451debfc3dSmrg 	    maybe_replace_use (use_p);
20461debfc3dSmrg 	}
20471debfc3dSmrg     }
20481debfc3dSmrg 
20491debfc3dSmrg   /* Register definitions of names in NEW_SSA_NAMES and OLD_SSA_NAMES.
20501debfc3dSmrg      Also register definitions for names whose underlying symbol is
20511debfc3dSmrg      marked for renaming.  */
20521debfc3dSmrg   bool to_delete = false;
20531debfc3dSmrg   if (register_defs_p (stmt))
20541debfc3dSmrg     FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, iter, SSA_OP_ALL_DEFS)
20551debfc3dSmrg       to_delete |= maybe_register_def (def_p, stmt, gsi);
20561debfc3dSmrg 
20571debfc3dSmrg   return to_delete;
20581debfc3dSmrg }
20591debfc3dSmrg 
20601debfc3dSmrg 
20611debfc3dSmrg /* Visit all the successor blocks of BB looking for PHI nodes.  For
20621debfc3dSmrg    every PHI node found, check if any of its arguments is in
20631debfc3dSmrg    OLD_SSA_NAMES.  If so, and if the argument has a current reaching
20641debfc3dSmrg    definition, replace it.  */
20651debfc3dSmrg 
20661debfc3dSmrg static void
rewrite_update_phi_arguments(basic_block bb)20671debfc3dSmrg rewrite_update_phi_arguments (basic_block bb)
20681debfc3dSmrg {
20691debfc3dSmrg   edge e;
20701debfc3dSmrg   edge_iterator ei;
20711debfc3dSmrg   unsigned i;
20721debfc3dSmrg 
20731debfc3dSmrg   FOR_EACH_EDGE (e, ei, bb->succs)
20741debfc3dSmrg     {
20751debfc3dSmrg       gphi *phi;
20761debfc3dSmrg       vec<gphi *> phis;
20771debfc3dSmrg 
20781debfc3dSmrg       if (!bitmap_bit_p (blocks_with_phis_to_rewrite, e->dest->index))
20791debfc3dSmrg 	continue;
20801debfc3dSmrg 
20811debfc3dSmrg       phis = phis_to_rewrite[e->dest->index];
20821debfc3dSmrg       FOR_EACH_VEC_ELT (phis, i, phi)
20831debfc3dSmrg 	{
20841debfc3dSmrg 	  tree arg, lhs_sym, reaching_def = NULL;
20851debfc3dSmrg 	  use_operand_p arg_p;
20861debfc3dSmrg 
20871debfc3dSmrg   	  gcc_checking_assert (rewrite_uses_p (phi));
20881debfc3dSmrg 
20891debfc3dSmrg 	  arg_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e);
20901debfc3dSmrg 	  arg = USE_FROM_PTR (arg_p);
20911debfc3dSmrg 
20921debfc3dSmrg 	  if (arg && !DECL_P (arg) && TREE_CODE (arg) != SSA_NAME)
20931debfc3dSmrg 	    continue;
20941debfc3dSmrg 
20951debfc3dSmrg 	  lhs_sym = SSA_NAME_VAR (gimple_phi_result (phi));
20961debfc3dSmrg 
20971debfc3dSmrg 	  if (arg == NULL_TREE)
20981debfc3dSmrg 	    {
20991debfc3dSmrg 	      /* When updating a PHI node for a recently introduced
21001debfc3dSmrg 		 symbol we may find NULL arguments.  That's why we
21011debfc3dSmrg 		 take the symbol from the LHS of the PHI node.  */
21021debfc3dSmrg 	      reaching_def = get_reaching_def (lhs_sym);
21031debfc3dSmrg 
21041debfc3dSmrg 	    }
21051debfc3dSmrg 	  else
21061debfc3dSmrg 	    {
21071debfc3dSmrg 	      tree sym = DECL_P (arg) ? arg : SSA_NAME_VAR (arg);
21081debfc3dSmrg 
21091debfc3dSmrg 	      if (marked_for_renaming (sym))
21101debfc3dSmrg 		reaching_def = get_reaching_def (sym);
21111debfc3dSmrg 	      else if (is_old_name (arg))
21121debfc3dSmrg 		reaching_def = get_reaching_def (arg);
21131debfc3dSmrg 	    }
21141debfc3dSmrg 
21151debfc3dSmrg           /* Update the argument if there is a reaching def.  */
21161debfc3dSmrg 	  if (reaching_def)
21171debfc3dSmrg 	    {
2118c0a68be4Smrg 	      location_t locus;
21191debfc3dSmrg 	      int arg_i = PHI_ARG_INDEX_FROM_USE (arg_p);
21201debfc3dSmrg 
21211debfc3dSmrg 	      SET_USE (arg_p, reaching_def);
21221debfc3dSmrg 
21231debfc3dSmrg 	      /* Virtual operands do not need a location.  */
21241debfc3dSmrg 	      if (virtual_operand_p (reaching_def))
21251debfc3dSmrg 		locus = UNKNOWN_LOCATION;
21261debfc3dSmrg 	      else
21271debfc3dSmrg 		{
21281debfc3dSmrg 		  gimple *stmt = SSA_NAME_DEF_STMT (reaching_def);
21291debfc3dSmrg 		  gphi *other_phi = dyn_cast <gphi *> (stmt);
21301debfc3dSmrg 
21311debfc3dSmrg 		  /* Single element PHI nodes  behave like copies, so get the
21321debfc3dSmrg 		     location from the phi argument.  */
21331debfc3dSmrg 		  if (other_phi
21341debfc3dSmrg 		      && gimple_phi_num_args (other_phi) == 1)
21351debfc3dSmrg 		    locus = gimple_phi_arg_location (other_phi, 0);
21361debfc3dSmrg 		  else
21371debfc3dSmrg 		    locus = gimple_location (stmt);
21381debfc3dSmrg 		}
21391debfc3dSmrg 
21401debfc3dSmrg 	      gimple_phi_arg_set_location (phi, arg_i, locus);
21411debfc3dSmrg 	    }
21421debfc3dSmrg 
21431debfc3dSmrg 
21441debfc3dSmrg 	  if (e->flags & EDGE_ABNORMAL)
21451debfc3dSmrg 	    SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (arg_p)) = 1;
21461debfc3dSmrg 	}
21471debfc3dSmrg     }
21481debfc3dSmrg }
21491debfc3dSmrg 
21501debfc3dSmrg class rewrite_update_dom_walker : public dom_walker
21511debfc3dSmrg {
21521debfc3dSmrg public:
rewrite_update_dom_walker(cdi_direction direction)2153a2dc1f3fSmrg   rewrite_update_dom_walker (cdi_direction direction)
2154a2dc1f3fSmrg     : dom_walker (direction, ALL_BLOCKS, NULL) {}
21551debfc3dSmrg 
21561debfc3dSmrg   virtual edge before_dom_children (basic_block);
21571debfc3dSmrg   virtual void after_dom_children (basic_block);
21581debfc3dSmrg };
21591debfc3dSmrg 
21601debfc3dSmrg /* Initialization of block data structures for the incremental SSA
21611debfc3dSmrg    update pass.  Create a block local stack of reaching definitions
21621debfc3dSmrg    for new SSA names produced in this block (BLOCK_DEFS).  Register
21631debfc3dSmrg    new definitions for every PHI node in the block.  */
21641debfc3dSmrg 
21651debfc3dSmrg edge
before_dom_children(basic_block bb)21661debfc3dSmrg rewrite_update_dom_walker::before_dom_children (basic_block bb)
21671debfc3dSmrg {
21681debfc3dSmrg   bool is_abnormal_phi;
21691debfc3dSmrg 
21701debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
21711debfc3dSmrg     fprintf (dump_file, "Registering new PHI nodes in block #%d\n",
21721debfc3dSmrg 	     bb->index);
21731debfc3dSmrg 
21741debfc3dSmrg   /* Mark the unwind point for this block.  */
21751debfc3dSmrg   block_defs_stack.safe_push (NULL_TREE);
21761debfc3dSmrg 
21771debfc3dSmrg   if (!bitmap_bit_p (blocks_to_update, bb->index))
21781debfc3dSmrg     return NULL;
21791debfc3dSmrg 
21801debfc3dSmrg   /* Mark the LHS if any of the arguments flows through an abnormal
21811debfc3dSmrg      edge.  */
21821debfc3dSmrg   is_abnormal_phi = bb_has_abnormal_pred (bb);
21831debfc3dSmrg 
21841debfc3dSmrg   /* If any of the PHI nodes is a replacement for a name in
21851debfc3dSmrg      OLD_SSA_NAMES or it's one of the names in NEW_SSA_NAMES, then
21861debfc3dSmrg      register it as a new definition for its corresponding name.  Also
21871debfc3dSmrg      register definitions for names whose underlying symbols are
21881debfc3dSmrg      marked for renaming.  */
21891debfc3dSmrg   for (gphi_iterator gsi = gsi_start_phis (bb); !gsi_end_p (gsi);
21901debfc3dSmrg        gsi_next (&gsi))
21911debfc3dSmrg     {
21921debfc3dSmrg       tree lhs, lhs_sym;
21931debfc3dSmrg       gphi *phi = gsi.phi ();
21941debfc3dSmrg 
21951debfc3dSmrg       if (!register_defs_p (phi))
21961debfc3dSmrg 	continue;
21971debfc3dSmrg 
21981debfc3dSmrg       lhs = gimple_phi_result (phi);
21991debfc3dSmrg       lhs_sym = SSA_NAME_VAR (lhs);
22001debfc3dSmrg 
22011debfc3dSmrg       if (marked_for_renaming (lhs_sym))
22021debfc3dSmrg 	register_new_update_single (lhs, lhs_sym);
22031debfc3dSmrg       else
22041debfc3dSmrg 	{
22051debfc3dSmrg 
22061debfc3dSmrg 	  /* If LHS is a new name, register a new definition for all
22071debfc3dSmrg 	     the names replaced by LHS.  */
22081debfc3dSmrg 	  if (is_new_name (lhs))
22091debfc3dSmrg 	    register_new_update_set (lhs, names_replaced_by (lhs));
22101debfc3dSmrg 
22111debfc3dSmrg 	  /* If LHS is an OLD name, register it as a new definition
22121debfc3dSmrg 	     for itself.  */
22131debfc3dSmrg 	  if (is_old_name (lhs))
22141debfc3dSmrg 	    register_new_update_single (lhs, lhs);
22151debfc3dSmrg 	}
22161debfc3dSmrg 
22171debfc3dSmrg       if (is_abnormal_phi)
22181debfc3dSmrg 	SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs) = 1;
22191debfc3dSmrg     }
22201debfc3dSmrg 
22211debfc3dSmrg   /* Step 2.  Rewrite every variable used in each statement in the block.  */
22221debfc3dSmrg   if (bitmap_bit_p (interesting_blocks, bb->index))
22231debfc3dSmrg     {
22241debfc3dSmrg       gcc_checking_assert (bitmap_bit_p (blocks_to_update, bb->index));
22251debfc3dSmrg       for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )
22261debfc3dSmrg 	if (rewrite_update_stmt (gsi_stmt (gsi), gsi))
22271debfc3dSmrg 	  gsi_remove (&gsi, true);
22281debfc3dSmrg 	else
22291debfc3dSmrg 	  gsi_next (&gsi);
22301debfc3dSmrg     }
22311debfc3dSmrg 
22321debfc3dSmrg   /* Step 3.  Update PHI nodes.  */
22331debfc3dSmrg   rewrite_update_phi_arguments (bb);
22341debfc3dSmrg 
22351debfc3dSmrg   return NULL;
22361debfc3dSmrg }
22371debfc3dSmrg 
22381debfc3dSmrg /* Called after visiting block BB.  Unwind BLOCK_DEFS_STACK to restore
22391debfc3dSmrg    the current reaching definition of every name re-written in BB to
22401debfc3dSmrg    the original reaching definition before visiting BB.  This
22411debfc3dSmrg    unwinding must be done in the opposite order to what is done in
22421debfc3dSmrg    register_new_update_set.  */
22431debfc3dSmrg 
22441debfc3dSmrg void
after_dom_children(basic_block bb ATTRIBUTE_UNUSED)22451debfc3dSmrg rewrite_update_dom_walker::after_dom_children (basic_block bb ATTRIBUTE_UNUSED)
22461debfc3dSmrg {
22471debfc3dSmrg   while (block_defs_stack.length () > 0)
22481debfc3dSmrg     {
22491debfc3dSmrg       tree var = block_defs_stack.pop ();
22501debfc3dSmrg       tree saved_def;
22511debfc3dSmrg 
22521debfc3dSmrg       /* NULL indicates the unwind stop point for this block (see
22531debfc3dSmrg 	 rewrite_update_enter_block).  */
22541debfc3dSmrg       if (var == NULL)
22551debfc3dSmrg 	return;
22561debfc3dSmrg 
22571debfc3dSmrg       saved_def = block_defs_stack.pop ();
22581debfc3dSmrg       get_common_info (var)->current_def = saved_def;
22591debfc3dSmrg     }
22601debfc3dSmrg }
22611debfc3dSmrg 
22621debfc3dSmrg 
22631debfc3dSmrg /* Rewrite the actual blocks, statements, and PHI arguments, to be in SSA
22641debfc3dSmrg    form.
22651debfc3dSmrg 
22661debfc3dSmrg    ENTRY indicates the block where to start.  Every block dominated by
22671debfc3dSmrg       ENTRY will be rewritten.
22681debfc3dSmrg 
22691debfc3dSmrg    WHAT indicates what actions will be taken by the renamer (see enum
22701debfc3dSmrg       rewrite_mode).
22711debfc3dSmrg 
22721debfc3dSmrg    BLOCKS are the set of interesting blocks for the dominator walker
22731debfc3dSmrg       to process.  If this set is NULL, then all the nodes dominated
22741debfc3dSmrg       by ENTRY are walked.  Otherwise, blocks dominated by ENTRY that
22751debfc3dSmrg       are not present in BLOCKS are ignored.  */
22761debfc3dSmrg 
22771debfc3dSmrg static void
rewrite_blocks(basic_block entry,enum rewrite_mode what)22781debfc3dSmrg rewrite_blocks (basic_block entry, enum rewrite_mode what)
22791debfc3dSmrg {
22801debfc3dSmrg   /* Rewrite all the basic blocks in the program.  */
22811debfc3dSmrg   timevar_push (TV_TREE_SSA_REWRITE_BLOCKS);
22821debfc3dSmrg 
22831debfc3dSmrg   block_defs_stack.create (10);
22841debfc3dSmrg 
22851debfc3dSmrg   /* Recursively walk the dominator tree rewriting each statement in
22861debfc3dSmrg      each basic block.  */
22871debfc3dSmrg   if (what == REWRITE_ALL)
22881debfc3dSmrg       rewrite_dom_walker (CDI_DOMINATORS).walk (entry);
22891debfc3dSmrg   else if (what == REWRITE_UPDATE)
22901debfc3dSmrg       rewrite_update_dom_walker (CDI_DOMINATORS).walk (entry);
22911debfc3dSmrg   else
22921debfc3dSmrg     gcc_unreachable ();
22931debfc3dSmrg 
22941debfc3dSmrg   /* Debugging dumps.  */
22951debfc3dSmrg   if (dump_file && (dump_flags & TDF_STATS))
22961debfc3dSmrg     {
22971debfc3dSmrg       dump_dfa_stats (dump_file);
22981debfc3dSmrg       if (var_infos)
22991debfc3dSmrg 	dump_tree_ssa_stats (dump_file);
23001debfc3dSmrg     }
23011debfc3dSmrg 
23021debfc3dSmrg   block_defs_stack.release ();
23031debfc3dSmrg 
23041debfc3dSmrg   timevar_pop (TV_TREE_SSA_REWRITE_BLOCKS);
23051debfc3dSmrg }
23061debfc3dSmrg 
23071debfc3dSmrg class mark_def_dom_walker : public dom_walker
23081debfc3dSmrg {
23091debfc3dSmrg public:
23101debfc3dSmrg   mark_def_dom_walker (cdi_direction direction);
23111debfc3dSmrg   ~mark_def_dom_walker ();
23121debfc3dSmrg 
23131debfc3dSmrg   virtual edge before_dom_children (basic_block);
23141debfc3dSmrg 
23151debfc3dSmrg private:
23161debfc3dSmrg   /* Notice that this bitmap is indexed using variable UIDs, so it must be
23171debfc3dSmrg      large enough to accommodate all the variables referenced in the
23181debfc3dSmrg      function, not just the ones we are renaming.  */
23191debfc3dSmrg   bitmap m_kills;
23201debfc3dSmrg };
23211debfc3dSmrg 
mark_def_dom_walker(cdi_direction direction)23221debfc3dSmrg mark_def_dom_walker::mark_def_dom_walker (cdi_direction direction)
2323a2dc1f3fSmrg   : dom_walker (direction, ALL_BLOCKS, NULL), m_kills (BITMAP_ALLOC (NULL))
23241debfc3dSmrg {
23251debfc3dSmrg }
23261debfc3dSmrg 
~mark_def_dom_walker()23271debfc3dSmrg mark_def_dom_walker::~mark_def_dom_walker ()
23281debfc3dSmrg {
23291debfc3dSmrg   BITMAP_FREE (m_kills);
23301debfc3dSmrg }
23311debfc3dSmrg 
23321debfc3dSmrg /* Block processing routine for mark_def_sites.  Clear the KILLS bitmap
23331debfc3dSmrg    at the start of each block, and call mark_def_sites for each statement.  */
23341debfc3dSmrg 
23351debfc3dSmrg edge
before_dom_children(basic_block bb)23361debfc3dSmrg mark_def_dom_walker::before_dom_children (basic_block bb)
23371debfc3dSmrg {
23381debfc3dSmrg   gimple_stmt_iterator gsi;
23391debfc3dSmrg 
23401debfc3dSmrg   bitmap_clear (m_kills);
23411debfc3dSmrg   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
23421debfc3dSmrg     mark_def_sites (bb, gsi_stmt (gsi), m_kills);
23431debfc3dSmrg   return NULL;
23441debfc3dSmrg }
23451debfc3dSmrg 
23461debfc3dSmrg /* Initialize internal data needed during renaming.  */
23471debfc3dSmrg 
23481debfc3dSmrg static void
init_ssa_renamer(void)23491debfc3dSmrg init_ssa_renamer (void)
23501debfc3dSmrg {
23511debfc3dSmrg   cfun->gimple_df->in_ssa_p = false;
23521debfc3dSmrg 
23531debfc3dSmrg   /* Allocate memory for the DEF_BLOCKS hash table.  */
23541debfc3dSmrg   gcc_assert (!var_infos);
23551debfc3dSmrg   var_infos = new hash_table<var_info_hasher>
23561debfc3dSmrg     (vec_safe_length (cfun->local_decls));
23571debfc3dSmrg 
23581debfc3dSmrg   bitmap_obstack_initialize (&update_ssa_obstack);
23591debfc3dSmrg }
23601debfc3dSmrg 
23611debfc3dSmrg 
23621debfc3dSmrg /* Deallocate internal data structures used by the renamer.  */
23631debfc3dSmrg 
23641debfc3dSmrg static void
fini_ssa_renamer(void)23651debfc3dSmrg fini_ssa_renamer (void)
23661debfc3dSmrg {
23671debfc3dSmrg   delete var_infos;
23681debfc3dSmrg     var_infos = NULL;
23691debfc3dSmrg 
23701debfc3dSmrg   bitmap_obstack_release (&update_ssa_obstack);
23711debfc3dSmrg 
23721debfc3dSmrg   cfun->gimple_df->ssa_renaming_needed = 0;
23731debfc3dSmrg   cfun->gimple_df->rename_vops = 0;
23741debfc3dSmrg   cfun->gimple_df->in_ssa_p = true;
23751debfc3dSmrg }
23761debfc3dSmrg 
23771debfc3dSmrg /* Main entry point into the SSA builder.  The renaming process
23781debfc3dSmrg    proceeds in four main phases:
23791debfc3dSmrg 
23801debfc3dSmrg    1- Compute dominance frontier and immediate dominators, needed to
23811debfc3dSmrg       insert PHI nodes and rename the function in dominator tree
23821debfc3dSmrg       order.
23831debfc3dSmrg 
23841debfc3dSmrg    2- Find and mark all the blocks that define variables.
23851debfc3dSmrg 
23861debfc3dSmrg    3- Insert PHI nodes at dominance frontiers (insert_phi_nodes).
23871debfc3dSmrg 
23881debfc3dSmrg    4- Rename all the blocks (rewrite_blocks) and statements in the program.
23891debfc3dSmrg 
23901debfc3dSmrg    Steps 3 and 4 are done using the dominator tree walker
23911debfc3dSmrg    (walk_dominator_tree).  */
23921debfc3dSmrg 
23931debfc3dSmrg namespace {
23941debfc3dSmrg 
23951debfc3dSmrg const pass_data pass_data_build_ssa =
23961debfc3dSmrg {
23971debfc3dSmrg   GIMPLE_PASS, /* type */
23981debfc3dSmrg   "ssa", /* name */
23991debfc3dSmrg   OPTGROUP_NONE, /* optinfo_flags */
24001debfc3dSmrg   TV_TREE_SSA_OTHER, /* tv_id */
24011debfc3dSmrg   PROP_cfg, /* properties_required */
24021debfc3dSmrg   PROP_ssa, /* properties_provided */
24031debfc3dSmrg   0, /* properties_destroyed */
24041debfc3dSmrg   0, /* todo_flags_start */
24051debfc3dSmrg   TODO_remove_unused_locals, /* todo_flags_finish */
24061debfc3dSmrg };
24071debfc3dSmrg 
24081debfc3dSmrg class pass_build_ssa : public gimple_opt_pass
24091debfc3dSmrg {
24101debfc3dSmrg public:
pass_build_ssa(gcc::context * ctxt)24111debfc3dSmrg   pass_build_ssa (gcc::context *ctxt)
24121debfc3dSmrg     : gimple_opt_pass (pass_data_build_ssa, ctxt)
24131debfc3dSmrg   {}
24141debfc3dSmrg 
24151debfc3dSmrg   /* opt_pass methods: */
gate(function * fun)24161debfc3dSmrg   virtual bool gate (function *fun)
24171debfc3dSmrg     {
24181debfc3dSmrg       /* Do nothing for funcions that was produced already in SSA form.  */
24191debfc3dSmrg       return !(fun->curr_properties & PROP_ssa);
24201debfc3dSmrg     }
24211debfc3dSmrg 
24221debfc3dSmrg   virtual unsigned int execute (function *);
24231debfc3dSmrg 
24241debfc3dSmrg }; // class pass_build_ssa
24251debfc3dSmrg 
24261debfc3dSmrg unsigned int
execute(function * fun)24271debfc3dSmrg pass_build_ssa::execute (function *fun)
24281debfc3dSmrg {
24291debfc3dSmrg   bitmap_head *dfs;
24301debfc3dSmrg   basic_block bb;
24311debfc3dSmrg 
2432*8feb0f0bSmrg   /* Increase the set of variables we can rewrite into SSA form
2433*8feb0f0bSmrg      by clearing TREE_ADDRESSABLE and setting DECL_GIMPLE_REG_P
2434*8feb0f0bSmrg      and transform the IL to support this.  */
2435*8feb0f0bSmrg   if (optimize)
2436*8feb0f0bSmrg     execute_update_addresses_taken ();
2437*8feb0f0bSmrg 
24381debfc3dSmrg   /* Initialize operand data structures.  */
24391debfc3dSmrg   init_ssa_operands (fun);
24401debfc3dSmrg 
24411debfc3dSmrg   /* Initialize internal data needed by the renamer.  */
24421debfc3dSmrg   init_ssa_renamer ();
24431debfc3dSmrg 
24441debfc3dSmrg   /* Initialize the set of interesting blocks.  The callback
24451debfc3dSmrg      mark_def_sites will add to this set those blocks that the renamer
24461debfc3dSmrg      should process.  */
24471debfc3dSmrg   interesting_blocks = sbitmap_alloc (last_basic_block_for_fn (fun));
24481debfc3dSmrg   bitmap_clear (interesting_blocks);
24491debfc3dSmrg 
24501debfc3dSmrg   /* Initialize dominance frontier.  */
24511debfc3dSmrg   dfs = XNEWVEC (bitmap_head, last_basic_block_for_fn (fun));
24521debfc3dSmrg   FOR_EACH_BB_FN (bb, fun)
24531debfc3dSmrg     bitmap_initialize (&dfs[bb->index], &bitmap_default_obstack);
24541debfc3dSmrg 
24551debfc3dSmrg   /* 1- Compute dominance frontiers.  */
24561debfc3dSmrg   calculate_dominance_info (CDI_DOMINATORS);
24571debfc3dSmrg   compute_dominance_frontiers (dfs);
24581debfc3dSmrg 
24591debfc3dSmrg   /* 2- Find and mark definition sites.  */
24601debfc3dSmrg   mark_def_dom_walker (CDI_DOMINATORS).walk (fun->cfg->x_entry_block_ptr);
24611debfc3dSmrg 
24621debfc3dSmrg   /* 3- Insert PHI nodes at dominance frontiers of definition blocks.  */
24631debfc3dSmrg   insert_phi_nodes (dfs);
24641debfc3dSmrg 
24651debfc3dSmrg   /* 4- Rename all the blocks.  */
24661debfc3dSmrg   rewrite_blocks (ENTRY_BLOCK_PTR_FOR_FN (fun), REWRITE_ALL);
24671debfc3dSmrg 
24681debfc3dSmrg   /* Free allocated memory.  */
24691debfc3dSmrg   FOR_EACH_BB_FN (bb, fun)
24701debfc3dSmrg     bitmap_clear (&dfs[bb->index]);
24711debfc3dSmrg   free (dfs);
24721debfc3dSmrg 
24731debfc3dSmrg   sbitmap_free (interesting_blocks);
24741debfc3dSmrg 
24751debfc3dSmrg   fini_ssa_renamer ();
24761debfc3dSmrg 
24771debfc3dSmrg   /* Try to get rid of all gimplifier generated temporaries by making
24781debfc3dSmrg      its SSA names anonymous.  This way we can garbage collect them
24791debfc3dSmrg      all after removing unused locals which we do in our TODO.  */
24801debfc3dSmrg   unsigned i;
24811debfc3dSmrg   tree name;
24821debfc3dSmrg 
24831debfc3dSmrg   FOR_EACH_SSA_NAME (i, name, cfun)
24841debfc3dSmrg     {
24851debfc3dSmrg       if (SSA_NAME_IS_DEFAULT_DEF (name))
24861debfc3dSmrg 	continue;
24871debfc3dSmrg       tree decl = SSA_NAME_VAR (name);
24881debfc3dSmrg       if (decl
24891debfc3dSmrg 	  && VAR_P (decl)
24901debfc3dSmrg 	  && !VAR_DECL_IS_VIRTUAL_OPERAND (decl)
24911debfc3dSmrg 	  && DECL_IGNORED_P (decl))
24921debfc3dSmrg 	SET_SSA_NAME_VAR_OR_IDENTIFIER (name, DECL_NAME (decl));
24931debfc3dSmrg     }
24941debfc3dSmrg 
2495c0a68be4Smrg   /* Initialize SSA_NAME_POINTS_TO_READONLY_MEMORY.  */
2496c0a68be4Smrg   tree fnspec = lookup_attribute ("fn spec",
2497c0a68be4Smrg 				  TYPE_ATTRIBUTES (TREE_TYPE (fun->decl)));
2498c0a68be4Smrg   if (fnspec)
2499c0a68be4Smrg     {
2500c0a68be4Smrg       fnspec = TREE_VALUE (TREE_VALUE (fnspec));
2501c0a68be4Smrg       unsigned i = 1;
2502c0a68be4Smrg       for (tree arg = DECL_ARGUMENTS (cfun->decl);
2503c0a68be4Smrg 	   arg; arg = DECL_CHAIN (arg), ++i)
2504c0a68be4Smrg 	{
2505c0a68be4Smrg 	  if (i >= (unsigned) TREE_STRING_LENGTH (fnspec))
2506c0a68be4Smrg 	    break;
2507c0a68be4Smrg 	  if (TREE_STRING_POINTER (fnspec)[i]  == 'R'
2508c0a68be4Smrg 	      || TREE_STRING_POINTER (fnspec)[i] == 'r')
2509c0a68be4Smrg 	    {
2510c0a68be4Smrg 	      tree name = ssa_default_def (fun, arg);
2511c0a68be4Smrg 	      if (name)
2512c0a68be4Smrg 		SSA_NAME_POINTS_TO_READONLY_MEMORY (name) = 1;
2513c0a68be4Smrg 	    }
2514c0a68be4Smrg 	}
2515c0a68be4Smrg     }
2516c0a68be4Smrg 
25171debfc3dSmrg   return 0;
25181debfc3dSmrg }
25191debfc3dSmrg 
25201debfc3dSmrg } // anon namespace
25211debfc3dSmrg 
25221debfc3dSmrg gimple_opt_pass *
make_pass_build_ssa(gcc::context * ctxt)25231debfc3dSmrg make_pass_build_ssa (gcc::context *ctxt)
25241debfc3dSmrg {
25251debfc3dSmrg   return new pass_build_ssa (ctxt);
25261debfc3dSmrg }
25271debfc3dSmrg 
25281debfc3dSmrg 
25291debfc3dSmrg /* Mark the definition of VAR at STMT and BB as interesting for the
25301debfc3dSmrg    renamer.  BLOCKS is the set of blocks that need updating.  */
25311debfc3dSmrg 
25321debfc3dSmrg static void
mark_def_interesting(tree var,gimple * stmt,basic_block bb,bool insert_phi_p)25331debfc3dSmrg mark_def_interesting (tree var, gimple *stmt, basic_block bb,
25341debfc3dSmrg 		      bool insert_phi_p)
25351debfc3dSmrg {
25361debfc3dSmrg   gcc_checking_assert (bitmap_bit_p (blocks_to_update, bb->index));
25371debfc3dSmrg   set_register_defs (stmt, true);
25381debfc3dSmrg 
25391debfc3dSmrg   if (insert_phi_p)
25401debfc3dSmrg     {
25411debfc3dSmrg       bool is_phi_p = gimple_code (stmt) == GIMPLE_PHI;
25421debfc3dSmrg 
25431debfc3dSmrg       set_def_block (var, bb, is_phi_p);
25441debfc3dSmrg 
25451debfc3dSmrg       /* If VAR is an SSA name in NEW_SSA_NAMES, this is a definition
25461debfc3dSmrg 	 site for both itself and all the old names replaced by it.  */
25471debfc3dSmrg       if (TREE_CODE (var) == SSA_NAME && is_new_name (var))
25481debfc3dSmrg 	{
25491debfc3dSmrg 	  bitmap_iterator bi;
25501debfc3dSmrg 	  unsigned i;
25511debfc3dSmrg 	  bitmap set = names_replaced_by (var);
25521debfc3dSmrg 	  if (set)
25531debfc3dSmrg 	    EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
25541debfc3dSmrg 	      set_def_block (ssa_name (i), bb, is_phi_p);
25551debfc3dSmrg 	}
25561debfc3dSmrg     }
25571debfc3dSmrg }
25581debfc3dSmrg 
25591debfc3dSmrg 
25601debfc3dSmrg /* Mark the use of VAR at STMT and BB as interesting for the
25611debfc3dSmrg    renamer.  INSERT_PHI_P is true if we are going to insert new PHI
25621debfc3dSmrg    nodes.  */
25631debfc3dSmrg 
25641debfc3dSmrg static inline void
mark_use_interesting(tree var,gimple * stmt,basic_block bb,bool insert_phi_p)25651debfc3dSmrg mark_use_interesting (tree var, gimple *stmt, basic_block bb,
25661debfc3dSmrg 		      bool insert_phi_p)
25671debfc3dSmrg {
25681debfc3dSmrg   basic_block def_bb = gimple_bb (stmt);
25691debfc3dSmrg 
25701debfc3dSmrg   mark_block_for_update (def_bb);
25711debfc3dSmrg   mark_block_for_update (bb);
25721debfc3dSmrg 
25731debfc3dSmrg   if (gimple_code (stmt) == GIMPLE_PHI)
25741debfc3dSmrg     mark_phi_for_rewrite (def_bb, as_a <gphi *> (stmt));
25751debfc3dSmrg   else
25761debfc3dSmrg     {
25771debfc3dSmrg       set_rewrite_uses (stmt, true);
25781debfc3dSmrg 
25791debfc3dSmrg       if (is_gimple_debug (stmt))
25801debfc3dSmrg 	return;
25811debfc3dSmrg     }
25821debfc3dSmrg 
25831debfc3dSmrg   /* If VAR has not been defined in BB, then it is live-on-entry
25841debfc3dSmrg      to BB.  Note that we cannot just use the block holding VAR's
25851debfc3dSmrg      definition because if VAR is one of the names in OLD_SSA_NAMES,
25861debfc3dSmrg      it will have several definitions (itself and all the names that
25871debfc3dSmrg      replace it).  */
25881debfc3dSmrg   if (insert_phi_p)
25891debfc3dSmrg     {
25901debfc3dSmrg       def_blocks *db_p = get_def_blocks_for (get_common_info (var));
25911debfc3dSmrg       if (!bitmap_bit_p (db_p->def_blocks, bb->index))
25921debfc3dSmrg 	set_livein_block (var, bb);
25931debfc3dSmrg     }
25941debfc3dSmrg }
25951debfc3dSmrg 
2596*8feb0f0bSmrg /* Processing statements in BB that reference symbols in SSA operands.
2597*8feb0f0bSmrg    This is very similar to mark_def_sites, but the scan handles
2598*8feb0f0bSmrg    statements whose operands may already be SSA names.
25991debfc3dSmrg 
26001debfc3dSmrg    If INSERT_PHI_P is true, mark those uses as live in the
26011debfc3dSmrg    corresponding block.  This is later used by the PHI placement
26021debfc3dSmrg    algorithm to make PHI pruning decisions.
26031debfc3dSmrg 
26041debfc3dSmrg    FIXME.  Most of this would be unnecessary if we could associate a
26051debfc3dSmrg 	   symbol to all the SSA names that reference it.  But that
26061debfc3dSmrg 	   sounds like it would be expensive to maintain.  Still, it
26071debfc3dSmrg 	   would be interesting to see if it makes better sense to do
26081debfc3dSmrg 	   that.  */
26091debfc3dSmrg 
26101debfc3dSmrg static void
prepare_block_for_update_1(basic_block bb,bool insert_phi_p)2611*8feb0f0bSmrg prepare_block_for_update_1 (basic_block bb, bool insert_phi_p)
26121debfc3dSmrg {
26131debfc3dSmrg   edge e;
26141debfc3dSmrg   edge_iterator ei;
26151debfc3dSmrg 
26161debfc3dSmrg   mark_block_for_update (bb);
26171debfc3dSmrg 
26181debfc3dSmrg   /* Process PHI nodes marking interesting those that define or use
26191debfc3dSmrg      the symbols that we are interested in.  */
26201debfc3dSmrg   for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
26211debfc3dSmrg        gsi_next (&si))
26221debfc3dSmrg     {
26231debfc3dSmrg       gphi *phi = si.phi ();
26241debfc3dSmrg       tree lhs_sym, lhs = gimple_phi_result (phi);
26251debfc3dSmrg 
26261debfc3dSmrg       if (TREE_CODE (lhs) == SSA_NAME
26271debfc3dSmrg 	  && (! virtual_operand_p (lhs)
26281debfc3dSmrg 	      || ! cfun->gimple_df->rename_vops))
26291debfc3dSmrg 	continue;
26301debfc3dSmrg 
26311debfc3dSmrg       lhs_sym = DECL_P (lhs) ? lhs : SSA_NAME_VAR (lhs);
26321debfc3dSmrg       mark_for_renaming (lhs_sym);
26331debfc3dSmrg       mark_def_interesting (lhs_sym, phi, bb, insert_phi_p);
26341debfc3dSmrg 
26351debfc3dSmrg       /* Mark the uses in phi nodes as interesting.  It would be more correct
26361debfc3dSmrg 	 to process the arguments of the phi nodes of the successor edges of
26371debfc3dSmrg 	 BB at the end of prepare_block_for_update, however, that turns out
26381debfc3dSmrg 	 to be significantly more expensive.  Doing it here is conservatively
26391debfc3dSmrg 	 correct -- it may only cause us to believe a value to be live in a
26401debfc3dSmrg 	 block that also contains its definition, and thus insert a few more
26411debfc3dSmrg 	 phi nodes for it.  */
26421debfc3dSmrg       FOR_EACH_EDGE (e, ei, bb->preds)
26431debfc3dSmrg 	mark_use_interesting (lhs_sym, phi, e->src, insert_phi_p);
26441debfc3dSmrg     }
26451debfc3dSmrg 
26461debfc3dSmrg   /* Process the statements.  */
26471debfc3dSmrg   for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si);
26481debfc3dSmrg        gsi_next (&si))
26491debfc3dSmrg     {
26501debfc3dSmrg       gimple *stmt;
26511debfc3dSmrg       ssa_op_iter i;
26521debfc3dSmrg       use_operand_p use_p;
26531debfc3dSmrg       def_operand_p def_p;
26541debfc3dSmrg 
26551debfc3dSmrg       stmt = gsi_stmt (si);
26561debfc3dSmrg 
26571debfc3dSmrg       if (cfun->gimple_df->rename_vops
26581debfc3dSmrg 	  && gimple_vuse (stmt))
26591debfc3dSmrg 	{
26601debfc3dSmrg 	  tree use = gimple_vuse (stmt);
26611debfc3dSmrg 	  tree sym = DECL_P (use) ? use : SSA_NAME_VAR (use);
26621debfc3dSmrg 	  mark_for_renaming (sym);
26631debfc3dSmrg 	  mark_use_interesting (sym, stmt, bb, insert_phi_p);
26641debfc3dSmrg 	}
26651debfc3dSmrg 
26661debfc3dSmrg       FOR_EACH_SSA_USE_OPERAND (use_p, stmt, i, SSA_OP_USE)
26671debfc3dSmrg 	{
26681debfc3dSmrg 	  tree use = USE_FROM_PTR (use_p);
26691debfc3dSmrg 	  if (!DECL_P (use))
26701debfc3dSmrg 	    continue;
26711debfc3dSmrg 	  mark_for_renaming (use);
26721debfc3dSmrg 	  mark_use_interesting (use, stmt, bb, insert_phi_p);
26731debfc3dSmrg 	}
26741debfc3dSmrg 
26751debfc3dSmrg       if (cfun->gimple_df->rename_vops
26761debfc3dSmrg 	  && gimple_vdef (stmt))
26771debfc3dSmrg 	{
26781debfc3dSmrg 	  tree def = gimple_vdef (stmt);
26791debfc3dSmrg 	  tree sym = DECL_P (def) ? def : SSA_NAME_VAR (def);
26801debfc3dSmrg 	  mark_for_renaming (sym);
26811debfc3dSmrg 	  mark_def_interesting (sym, stmt, bb, insert_phi_p);
26821debfc3dSmrg 	}
26831debfc3dSmrg 
26841debfc3dSmrg       FOR_EACH_SSA_DEF_OPERAND (def_p, stmt, i, SSA_OP_DEF)
26851debfc3dSmrg 	{
26861debfc3dSmrg 	  tree def = DEF_FROM_PTR (def_p);
26871debfc3dSmrg 	  if (!DECL_P (def))
26881debfc3dSmrg 	    continue;
26891debfc3dSmrg 	  mark_for_renaming (def);
26901debfc3dSmrg 	  mark_def_interesting (def, stmt, bb, insert_phi_p);
26911debfc3dSmrg 	}
26921debfc3dSmrg     }
26931debfc3dSmrg 
2694*8feb0f0bSmrg }
2695*8feb0f0bSmrg 
2696*8feb0f0bSmrg /* Do a dominator walk starting at BB processing statements that
2697*8feb0f0bSmrg    reference symbols in SSA operands.  This is very similar to
2698*8feb0f0bSmrg    mark_def_sites, but the scan handles statements whose operands may
2699*8feb0f0bSmrg    already be SSA names.
2700*8feb0f0bSmrg 
2701*8feb0f0bSmrg    If INSERT_PHI_P is true, mark those uses as live in the
2702*8feb0f0bSmrg    corresponding block.  This is later used by the PHI placement
2703*8feb0f0bSmrg    algorithm to make PHI pruning decisions.
2704*8feb0f0bSmrg 
2705*8feb0f0bSmrg    FIXME.  Most of this would be unnecessary if we could associate a
2706*8feb0f0bSmrg 	   symbol to all the SSA names that reference it.  But that
2707*8feb0f0bSmrg 	   sounds like it would be expensive to maintain.  Still, it
2708*8feb0f0bSmrg 	   would be interesting to see if it makes better sense to do
2709*8feb0f0bSmrg 	   that.  */
2710*8feb0f0bSmrg static void
prepare_block_for_update(basic_block bb,bool insert_phi_p)2711*8feb0f0bSmrg prepare_block_for_update (basic_block bb, bool insert_phi_p)
2712*8feb0f0bSmrg {
2713*8feb0f0bSmrg   size_t sp = 0;
2714*8feb0f0bSmrg   basic_block *worklist;
2715*8feb0f0bSmrg 
2716*8feb0f0bSmrg   /* Allocate the worklist.  */
2717*8feb0f0bSmrg   worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
2718*8feb0f0bSmrg   /* Add the BB to the worklist.  */
2719*8feb0f0bSmrg   worklist[sp++] = bb;
2720*8feb0f0bSmrg 
2721*8feb0f0bSmrg   while (sp)
2722*8feb0f0bSmrg     {
2723*8feb0f0bSmrg       basic_block bb;
2724*8feb0f0bSmrg       basic_block son;
2725*8feb0f0bSmrg 
2726*8feb0f0bSmrg       /* Pick a block from the worklist.  */
2727*8feb0f0bSmrg       bb = worklist[--sp];
2728*8feb0f0bSmrg 
2729*8feb0f0bSmrg       prepare_block_for_update_1 (bb, insert_phi_p);
2730*8feb0f0bSmrg 
2731*8feb0f0bSmrg       /* Now add all the blocks dominated by BB to the worklist.  */
27321debfc3dSmrg       for (son = first_dom_son (CDI_DOMINATORS, bb);
27331debfc3dSmrg 	   son;
27341debfc3dSmrg 	   son = next_dom_son (CDI_DOMINATORS, son))
2735*8feb0f0bSmrg 	worklist[sp++] = son;
27361debfc3dSmrg     }
2737*8feb0f0bSmrg   free (worklist);
2738*8feb0f0bSmrg }
27391debfc3dSmrg 
27401debfc3dSmrg /* Helper for prepare_names_to_update.  Mark all the use sites for
27411debfc3dSmrg    NAME as interesting.  BLOCKS and INSERT_PHI_P are as in
27421debfc3dSmrg    prepare_names_to_update.  */
27431debfc3dSmrg 
27441debfc3dSmrg static void
prepare_use_sites_for(tree name,bool insert_phi_p)27451debfc3dSmrg prepare_use_sites_for (tree name, bool insert_phi_p)
27461debfc3dSmrg {
27471debfc3dSmrg   use_operand_p use_p;
27481debfc3dSmrg   imm_use_iterator iter;
27491debfc3dSmrg 
27501debfc3dSmrg   /* If we rename virtual operands do not update them.  */
27511debfc3dSmrg   if (virtual_operand_p (name)
27521debfc3dSmrg       && cfun->gimple_df->rename_vops)
27531debfc3dSmrg     return;
27541debfc3dSmrg 
27551debfc3dSmrg   FOR_EACH_IMM_USE_FAST (use_p, iter, name)
27561debfc3dSmrg     {
27571debfc3dSmrg       gimple *stmt = USE_STMT (use_p);
27581debfc3dSmrg       basic_block bb = gimple_bb (stmt);
27591debfc3dSmrg 
27601debfc3dSmrg       if (gimple_code (stmt) == GIMPLE_PHI)
27611debfc3dSmrg 	{
27621debfc3dSmrg 	  int ix = PHI_ARG_INDEX_FROM_USE (use_p);
27631debfc3dSmrg 	  edge e = gimple_phi_arg_edge (as_a <gphi *> (stmt), ix);
27641debfc3dSmrg 	  mark_use_interesting (name, stmt, e->src, insert_phi_p);
27651debfc3dSmrg 	}
27661debfc3dSmrg       else
27671debfc3dSmrg 	{
27681debfc3dSmrg 	  /* For regular statements, mark this as an interesting use
27691debfc3dSmrg 	     for NAME.  */
27701debfc3dSmrg 	  mark_use_interesting (name, stmt, bb, insert_phi_p);
27711debfc3dSmrg 	}
27721debfc3dSmrg     }
27731debfc3dSmrg }
27741debfc3dSmrg 
27751debfc3dSmrg 
27761debfc3dSmrg /* Helper for prepare_names_to_update.  Mark the definition site for
27771debfc3dSmrg    NAME as interesting.  BLOCKS and INSERT_PHI_P are as in
27781debfc3dSmrg    prepare_names_to_update.  */
27791debfc3dSmrg 
27801debfc3dSmrg static void
prepare_def_site_for(tree name,bool insert_phi_p)27811debfc3dSmrg prepare_def_site_for (tree name, bool insert_phi_p)
27821debfc3dSmrg {
27831debfc3dSmrg   gimple *stmt;
27841debfc3dSmrg   basic_block bb;
27851debfc3dSmrg 
27861debfc3dSmrg   gcc_checking_assert (names_to_release == NULL
27871debfc3dSmrg 		       || !bitmap_bit_p (names_to_release,
27881debfc3dSmrg 					 SSA_NAME_VERSION (name)));
27891debfc3dSmrg 
27901debfc3dSmrg   /* If we rename virtual operands do not update them.  */
27911debfc3dSmrg   if (virtual_operand_p (name)
27921debfc3dSmrg       && cfun->gimple_df->rename_vops)
27931debfc3dSmrg     return;
27941debfc3dSmrg 
27951debfc3dSmrg   stmt = SSA_NAME_DEF_STMT (name);
27961debfc3dSmrg   bb = gimple_bb (stmt);
27971debfc3dSmrg   if (bb)
27981debfc3dSmrg     {
27991debfc3dSmrg       gcc_checking_assert (bb->index < last_basic_block_for_fn (cfun));
28001debfc3dSmrg       mark_block_for_update (bb);
28011debfc3dSmrg       mark_def_interesting (name, stmt, bb, insert_phi_p);
28021debfc3dSmrg     }
28031debfc3dSmrg }
28041debfc3dSmrg 
28051debfc3dSmrg 
28061debfc3dSmrg /* Mark definition and use sites of names in NEW_SSA_NAMES and
28071debfc3dSmrg    OLD_SSA_NAMES.  INSERT_PHI_P is true if the caller wants to insert
28081debfc3dSmrg    PHI nodes for newly created names.  */
28091debfc3dSmrg 
28101debfc3dSmrg static void
prepare_names_to_update(bool insert_phi_p)28111debfc3dSmrg prepare_names_to_update (bool insert_phi_p)
28121debfc3dSmrg {
28131debfc3dSmrg   unsigned i = 0;
28141debfc3dSmrg   bitmap_iterator bi;
28151debfc3dSmrg   sbitmap_iterator sbi;
28161debfc3dSmrg 
28171debfc3dSmrg   /* If a name N from NEW_SSA_NAMES is also marked to be released,
28181debfc3dSmrg      remove it from NEW_SSA_NAMES so that we don't try to visit its
28191debfc3dSmrg      defining basic block (which most likely doesn't exist).  Notice
28201debfc3dSmrg      that we cannot do the same with names in OLD_SSA_NAMES because we
28211debfc3dSmrg      want to replace existing instances.  */
28221debfc3dSmrg   if (names_to_release)
28231debfc3dSmrg     EXECUTE_IF_SET_IN_BITMAP (names_to_release, 0, i, bi)
28241debfc3dSmrg       bitmap_clear_bit (new_ssa_names, i);
28251debfc3dSmrg 
28261debfc3dSmrg   /* First process names in NEW_SSA_NAMES.  Otherwise, uses of old
28271debfc3dSmrg      names may be considered to be live-in on blocks that contain
28281debfc3dSmrg      definitions for their replacements.  */
28291debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (new_ssa_names, 0, i, sbi)
28301debfc3dSmrg     prepare_def_site_for (ssa_name (i), insert_phi_p);
28311debfc3dSmrg 
28321debfc3dSmrg   /* If an old name is in NAMES_TO_RELEASE, we cannot remove it from
28331debfc3dSmrg      OLD_SSA_NAMES, but we have to ignore its definition site.  */
28341debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (old_ssa_names, 0, i, sbi)
28351debfc3dSmrg     {
28361debfc3dSmrg       if (names_to_release == NULL || !bitmap_bit_p (names_to_release, i))
28371debfc3dSmrg 	prepare_def_site_for (ssa_name (i), insert_phi_p);
28381debfc3dSmrg       prepare_use_sites_for (ssa_name (i), insert_phi_p);
28391debfc3dSmrg     }
28401debfc3dSmrg }
28411debfc3dSmrg 
28421debfc3dSmrg 
28431debfc3dSmrg /* Dump all the names replaced by NAME to FILE.  */
28441debfc3dSmrg 
28451debfc3dSmrg void
dump_names_replaced_by(FILE * file,tree name)28461debfc3dSmrg dump_names_replaced_by (FILE *file, tree name)
28471debfc3dSmrg {
28481debfc3dSmrg   unsigned i;
28491debfc3dSmrg   bitmap old_set;
28501debfc3dSmrg   bitmap_iterator bi;
28511debfc3dSmrg 
2852a2dc1f3fSmrg   print_generic_expr (file, name);
28531debfc3dSmrg   fprintf (file, " -> { ");
28541debfc3dSmrg 
28551debfc3dSmrg   old_set = names_replaced_by (name);
28561debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (old_set, 0, i, bi)
28571debfc3dSmrg     {
2858a2dc1f3fSmrg       print_generic_expr (file, ssa_name (i));
28591debfc3dSmrg       fprintf (file, " ");
28601debfc3dSmrg     }
28611debfc3dSmrg 
28621debfc3dSmrg   fprintf (file, "}\n");
28631debfc3dSmrg }
28641debfc3dSmrg 
28651debfc3dSmrg 
28661debfc3dSmrg /* Dump all the names replaced by NAME to stderr.  */
28671debfc3dSmrg 
28681debfc3dSmrg DEBUG_FUNCTION void
debug_names_replaced_by(tree name)28691debfc3dSmrg debug_names_replaced_by (tree name)
28701debfc3dSmrg {
28711debfc3dSmrg   dump_names_replaced_by (stderr, name);
28721debfc3dSmrg }
28731debfc3dSmrg 
28741debfc3dSmrg 
28751debfc3dSmrg /* Dump SSA update information to FILE.  */
28761debfc3dSmrg 
28771debfc3dSmrg void
dump_update_ssa(FILE * file)28781debfc3dSmrg dump_update_ssa (FILE *file)
28791debfc3dSmrg {
28801debfc3dSmrg   unsigned i = 0;
28811debfc3dSmrg   bitmap_iterator bi;
28821debfc3dSmrg 
28831debfc3dSmrg   if (!need_ssa_update_p (cfun))
28841debfc3dSmrg     return;
28851debfc3dSmrg 
28861debfc3dSmrg   if (new_ssa_names && bitmap_first_set_bit (new_ssa_names) >= 0)
28871debfc3dSmrg     {
28881debfc3dSmrg       sbitmap_iterator sbi;
28891debfc3dSmrg 
28901debfc3dSmrg       fprintf (file, "\nSSA replacement table\n");
28911debfc3dSmrg       fprintf (file, "N_i -> { O_1 ... O_j } means that N_i replaces "
28921debfc3dSmrg 	             "O_1, ..., O_j\n\n");
28931debfc3dSmrg 
28941debfc3dSmrg       EXECUTE_IF_SET_IN_BITMAP (new_ssa_names, 0, i, sbi)
28951debfc3dSmrg 	dump_names_replaced_by (file, ssa_name (i));
28961debfc3dSmrg     }
28971debfc3dSmrg 
28981debfc3dSmrg   if (symbols_to_rename_set && !bitmap_empty_p (symbols_to_rename_set))
28991debfc3dSmrg     {
29001debfc3dSmrg       fprintf (file, "\nSymbols to be put in SSA form\n");
29011debfc3dSmrg       dump_decl_set (file, symbols_to_rename_set);
29021debfc3dSmrg       fprintf (file, "\n");
29031debfc3dSmrg     }
29041debfc3dSmrg 
29051debfc3dSmrg   if (names_to_release && !bitmap_empty_p (names_to_release))
29061debfc3dSmrg     {
29071debfc3dSmrg       fprintf (file, "\nSSA names to release after updating the SSA web\n\n");
29081debfc3dSmrg       EXECUTE_IF_SET_IN_BITMAP (names_to_release, 0, i, bi)
29091debfc3dSmrg 	{
2910a2dc1f3fSmrg 	  print_generic_expr (file, ssa_name (i));
29111debfc3dSmrg 	  fprintf (file, " ");
29121debfc3dSmrg 	}
29131debfc3dSmrg       fprintf (file, "\n");
29141debfc3dSmrg     }
29151debfc3dSmrg }
29161debfc3dSmrg 
29171debfc3dSmrg 
29181debfc3dSmrg /* Dump SSA update information to stderr.  */
29191debfc3dSmrg 
29201debfc3dSmrg DEBUG_FUNCTION void
debug_update_ssa(void)29211debfc3dSmrg debug_update_ssa (void)
29221debfc3dSmrg {
29231debfc3dSmrg   dump_update_ssa (stderr);
29241debfc3dSmrg }
29251debfc3dSmrg 
29261debfc3dSmrg 
29271debfc3dSmrg /* Initialize data structures used for incremental SSA updates.  */
29281debfc3dSmrg 
29291debfc3dSmrg static void
init_update_ssa(struct function * fn)29301debfc3dSmrg init_update_ssa (struct function *fn)
29311debfc3dSmrg {
29321debfc3dSmrg   /* Reserve more space than the current number of names.  The calls to
29331debfc3dSmrg      add_new_name_mapping are typically done after creating new SSA
29341debfc3dSmrg      names, so we'll need to reallocate these arrays.  */
29351debfc3dSmrg   old_ssa_names = sbitmap_alloc (num_ssa_names + NAME_SETS_GROWTH_FACTOR);
29361debfc3dSmrg   bitmap_clear (old_ssa_names);
29371debfc3dSmrg 
29381debfc3dSmrg   new_ssa_names = sbitmap_alloc (num_ssa_names + NAME_SETS_GROWTH_FACTOR);
29391debfc3dSmrg   bitmap_clear (new_ssa_names);
29401debfc3dSmrg 
29411debfc3dSmrg   bitmap_obstack_initialize (&update_ssa_obstack);
29421debfc3dSmrg 
29431debfc3dSmrg   names_to_release = NULL;
29441debfc3dSmrg   update_ssa_initialized_fn = fn;
29451debfc3dSmrg }
29461debfc3dSmrg 
29471debfc3dSmrg 
29481debfc3dSmrg /* Deallocate data structures used for incremental SSA updates.  */
29491debfc3dSmrg 
29501debfc3dSmrg void
delete_update_ssa(void)29511debfc3dSmrg delete_update_ssa (void)
29521debfc3dSmrg {
29531debfc3dSmrg   unsigned i;
29541debfc3dSmrg   bitmap_iterator bi;
29551debfc3dSmrg 
29561debfc3dSmrg   sbitmap_free (old_ssa_names);
29571debfc3dSmrg   old_ssa_names = NULL;
29581debfc3dSmrg 
29591debfc3dSmrg   sbitmap_free (new_ssa_names);
29601debfc3dSmrg   new_ssa_names = NULL;
29611debfc3dSmrg 
29621debfc3dSmrg   BITMAP_FREE (symbols_to_rename_set);
29631debfc3dSmrg   symbols_to_rename_set = NULL;
29641debfc3dSmrg   symbols_to_rename.release ();
29651debfc3dSmrg 
29661debfc3dSmrg   if (names_to_release)
29671debfc3dSmrg     {
29681debfc3dSmrg       EXECUTE_IF_SET_IN_BITMAP (names_to_release, 0, i, bi)
29691debfc3dSmrg 	release_ssa_name (ssa_name (i));
29701debfc3dSmrg       BITMAP_FREE (names_to_release);
29711debfc3dSmrg     }
29721debfc3dSmrg 
29731debfc3dSmrg   clear_ssa_name_info ();
29741debfc3dSmrg 
29751debfc3dSmrg   fini_ssa_renamer ();
29761debfc3dSmrg 
29771debfc3dSmrg   if (blocks_with_phis_to_rewrite)
29781debfc3dSmrg     EXECUTE_IF_SET_IN_BITMAP (blocks_with_phis_to_rewrite, 0, i, bi)
2979*8feb0f0bSmrg       phis_to_rewrite[i].release ();
29801debfc3dSmrg 
29811debfc3dSmrg   BITMAP_FREE (blocks_with_phis_to_rewrite);
29821debfc3dSmrg   BITMAP_FREE (blocks_to_update);
29831debfc3dSmrg 
29841debfc3dSmrg   update_ssa_initialized_fn = NULL;
29851debfc3dSmrg }
29861debfc3dSmrg 
29871debfc3dSmrg 
29881debfc3dSmrg /* Create a new name for OLD_NAME in statement STMT and replace the
29891debfc3dSmrg    operand pointed to by DEF_P with the newly created name.  If DEF_P
29901debfc3dSmrg    is NULL then STMT should be a GIMPLE assignment.
29911debfc3dSmrg    Return the new name and register the replacement mapping <NEW, OLD> in
29921debfc3dSmrg    update_ssa's tables.  */
29931debfc3dSmrg 
29941debfc3dSmrg tree
create_new_def_for(tree old_name,gimple * stmt,def_operand_p def)29951debfc3dSmrg create_new_def_for (tree old_name, gimple *stmt, def_operand_p def)
29961debfc3dSmrg {
29971debfc3dSmrg   tree new_name;
29981debfc3dSmrg 
29991debfc3dSmrg   timevar_push (TV_TREE_SSA_INCREMENTAL);
30001debfc3dSmrg 
30011debfc3dSmrg   if (!update_ssa_initialized_fn)
30021debfc3dSmrg     init_update_ssa (cfun);
30031debfc3dSmrg 
30041debfc3dSmrg   gcc_assert (update_ssa_initialized_fn == cfun);
30051debfc3dSmrg 
30061debfc3dSmrg   new_name = duplicate_ssa_name (old_name, stmt);
30071debfc3dSmrg   if (def)
30081debfc3dSmrg     SET_DEF (def, new_name);
30091debfc3dSmrg   else
30101debfc3dSmrg     gimple_assign_set_lhs (stmt, new_name);
30111debfc3dSmrg 
30121debfc3dSmrg   if (gimple_code (stmt) == GIMPLE_PHI)
30131debfc3dSmrg     {
30141debfc3dSmrg       basic_block bb = gimple_bb (stmt);
30151debfc3dSmrg 
30161debfc3dSmrg       /* If needed, mark NEW_NAME as occurring in an abnormal PHI node. */
30171debfc3dSmrg       SSA_NAME_OCCURS_IN_ABNORMAL_PHI (new_name) = bb_has_abnormal_pred (bb);
30181debfc3dSmrg     }
30191debfc3dSmrg 
30201debfc3dSmrg   add_new_name_mapping (new_name, old_name);
30211debfc3dSmrg 
30221debfc3dSmrg   /* For the benefit of passes that will be updating the SSA form on
30231debfc3dSmrg      their own, set the current reaching definition of OLD_NAME to be
30241debfc3dSmrg      NEW_NAME.  */
30251debfc3dSmrg   get_ssa_name_ann (old_name)->info.current_def = new_name;
30261debfc3dSmrg 
30271debfc3dSmrg   timevar_pop (TV_TREE_SSA_INCREMENTAL);
30281debfc3dSmrg 
30291debfc3dSmrg   return new_name;
30301debfc3dSmrg }
30311debfc3dSmrg 
30321debfc3dSmrg 
30331debfc3dSmrg /* Mark virtual operands of FN for renaming by update_ssa.  */
30341debfc3dSmrg 
30351debfc3dSmrg void
mark_virtual_operands_for_renaming(struct function * fn)30361debfc3dSmrg mark_virtual_operands_for_renaming (struct function *fn)
30371debfc3dSmrg {
30381debfc3dSmrg   fn->gimple_df->ssa_renaming_needed = 1;
30391debfc3dSmrg   fn->gimple_df->rename_vops = 1;
30401debfc3dSmrg }
30411debfc3dSmrg 
30421debfc3dSmrg /* Replace all uses of NAME by underlying variable and mark it
30431debfc3dSmrg    for renaming.  This assumes the defining statement of NAME is
30441debfc3dSmrg    going to be removed.  */
30451debfc3dSmrg 
30461debfc3dSmrg void
mark_virtual_operand_for_renaming(tree name)30471debfc3dSmrg mark_virtual_operand_for_renaming (tree name)
30481debfc3dSmrg {
30491debfc3dSmrg   tree name_var = SSA_NAME_VAR (name);
30501debfc3dSmrg   bool used = false;
30511debfc3dSmrg   imm_use_iterator iter;
30521debfc3dSmrg   use_operand_p use_p;
30531debfc3dSmrg   gimple *stmt;
30541debfc3dSmrg 
30551debfc3dSmrg   gcc_assert (VAR_DECL_IS_VIRTUAL_OPERAND (name_var));
30561debfc3dSmrg   FOR_EACH_IMM_USE_STMT (stmt, iter, name)
30571debfc3dSmrg     {
30581debfc3dSmrg       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
30591debfc3dSmrg         SET_USE (use_p, name_var);
30601debfc3dSmrg       used = true;
30611debfc3dSmrg     }
30621debfc3dSmrg   if (used)
30631debfc3dSmrg     mark_virtual_operands_for_renaming (cfun);
30641debfc3dSmrg }
30651debfc3dSmrg 
30661debfc3dSmrg /* Replace all uses of the virtual PHI result by its underlying variable
30671debfc3dSmrg    and mark it for renaming.  This assumes the PHI node is going to be
30681debfc3dSmrg    removed.  */
30691debfc3dSmrg 
30701debfc3dSmrg void
mark_virtual_phi_result_for_renaming(gphi * phi)30711debfc3dSmrg mark_virtual_phi_result_for_renaming (gphi *phi)
30721debfc3dSmrg {
30731debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
30741debfc3dSmrg     {
30751debfc3dSmrg       fprintf (dump_file, "Marking result for renaming : ");
30761debfc3dSmrg       print_gimple_stmt (dump_file, phi, 0, TDF_SLIM);
30771debfc3dSmrg       fprintf (dump_file, "\n");
30781debfc3dSmrg     }
30791debfc3dSmrg 
30801debfc3dSmrg   mark_virtual_operand_for_renaming (gimple_phi_result (phi));
30811debfc3dSmrg }
30821debfc3dSmrg 
30831debfc3dSmrg /* Return true if there is any work to be done by update_ssa
30841debfc3dSmrg    for function FN.  */
30851debfc3dSmrg 
30861debfc3dSmrg bool
need_ssa_update_p(struct function * fn)30871debfc3dSmrg need_ssa_update_p (struct function *fn)
30881debfc3dSmrg {
30891debfc3dSmrg   gcc_assert (fn != NULL);
30901debfc3dSmrg   return (update_ssa_initialized_fn == fn
30911debfc3dSmrg 	  || (fn->gimple_df && fn->gimple_df->ssa_renaming_needed));
30921debfc3dSmrg }
30931debfc3dSmrg 
30941debfc3dSmrg /* Return true if name N has been registered in the replacement table.  */
30951debfc3dSmrg 
30961debfc3dSmrg bool
name_registered_for_update_p(tree n ATTRIBUTE_UNUSED)30971debfc3dSmrg name_registered_for_update_p (tree n ATTRIBUTE_UNUSED)
30981debfc3dSmrg {
30991debfc3dSmrg   if (!update_ssa_initialized_fn)
31001debfc3dSmrg     return false;
31011debfc3dSmrg 
31021debfc3dSmrg   gcc_assert (update_ssa_initialized_fn == cfun);
31031debfc3dSmrg 
31041debfc3dSmrg   return is_new_name (n) || is_old_name (n);
31051debfc3dSmrg }
31061debfc3dSmrg 
31071debfc3dSmrg 
31081debfc3dSmrg /* Mark NAME to be released after update_ssa has finished.  */
31091debfc3dSmrg 
31101debfc3dSmrg void
release_ssa_name_after_update_ssa(tree name)31111debfc3dSmrg release_ssa_name_after_update_ssa (tree name)
31121debfc3dSmrg {
31131debfc3dSmrg   gcc_assert (cfun && update_ssa_initialized_fn == cfun);
31141debfc3dSmrg 
31151debfc3dSmrg   if (names_to_release == NULL)
31161debfc3dSmrg     names_to_release = BITMAP_ALLOC (NULL);
31171debfc3dSmrg 
31181debfc3dSmrg   bitmap_set_bit (names_to_release, SSA_NAME_VERSION (name));
31191debfc3dSmrg }
31201debfc3dSmrg 
31211debfc3dSmrg 
31221debfc3dSmrg /* Insert new PHI nodes to replace VAR.  DFS contains dominance
31231debfc3dSmrg    frontier information.  BLOCKS is the set of blocks to be updated.
31241debfc3dSmrg 
31251debfc3dSmrg    This is slightly different than the regular PHI insertion
31261debfc3dSmrg    algorithm.  The value of UPDATE_FLAGS controls how PHI nodes for
31271debfc3dSmrg    real names (i.e., GIMPLE registers) are inserted:
31281debfc3dSmrg 
31291debfc3dSmrg    - If UPDATE_FLAGS == TODO_update_ssa, we are only interested in PHI
31301debfc3dSmrg      nodes inside the region affected by the block that defines VAR
31311debfc3dSmrg      and the blocks that define all its replacements.  All these
31321debfc3dSmrg      definition blocks are stored in DEF_BLOCKS[VAR]->DEF_BLOCKS.
31331debfc3dSmrg 
31341debfc3dSmrg      First, we compute the entry point to the region (ENTRY).  This is
31351debfc3dSmrg      given by the nearest common dominator to all the definition
31361debfc3dSmrg      blocks. When computing the iterated dominance frontier (IDF), any
31371debfc3dSmrg      block not strictly dominated by ENTRY is ignored.
31381debfc3dSmrg 
31391debfc3dSmrg      We then call the standard PHI insertion algorithm with the pruned
31401debfc3dSmrg      IDF.
31411debfc3dSmrg 
31421debfc3dSmrg    - If UPDATE_FLAGS == TODO_update_ssa_full_phi, the IDF for real
31431debfc3dSmrg      names is not pruned.  PHI nodes are inserted at every IDF block.  */
31441debfc3dSmrg 
31451debfc3dSmrg static void
insert_updated_phi_nodes_for(tree var,bitmap_head * dfs,bitmap blocks,unsigned update_flags)31461debfc3dSmrg insert_updated_phi_nodes_for (tree var, bitmap_head *dfs, bitmap blocks,
31471debfc3dSmrg                               unsigned update_flags)
31481debfc3dSmrg {
31491debfc3dSmrg   basic_block entry;
31501debfc3dSmrg   def_blocks *db;
31511debfc3dSmrg   bitmap idf, pruned_idf;
31521debfc3dSmrg   bitmap_iterator bi;
31531debfc3dSmrg   unsigned i;
31541debfc3dSmrg 
31551debfc3dSmrg   if (TREE_CODE (var) == SSA_NAME)
31561debfc3dSmrg     gcc_checking_assert (is_old_name (var));
31571debfc3dSmrg   else
31581debfc3dSmrg     gcc_checking_assert (marked_for_renaming (var));
31591debfc3dSmrg 
31601debfc3dSmrg   /* Get all the definition sites for VAR.  */
31611debfc3dSmrg   db = find_def_blocks_for (var);
31621debfc3dSmrg 
31631debfc3dSmrg   /* No need to do anything if there were no definitions to VAR.  */
31641debfc3dSmrg   if (db == NULL || bitmap_empty_p (db->def_blocks))
31651debfc3dSmrg     return;
31661debfc3dSmrg 
31671debfc3dSmrg   /* Compute the initial iterated dominance frontier.  */
31681debfc3dSmrg   idf = compute_idf (db->def_blocks, dfs);
31691debfc3dSmrg   pruned_idf = BITMAP_ALLOC (NULL);
31701debfc3dSmrg 
31711debfc3dSmrg   if (TREE_CODE (var) == SSA_NAME)
31721debfc3dSmrg     {
31731debfc3dSmrg       if (update_flags == TODO_update_ssa)
31741debfc3dSmrg 	{
31751debfc3dSmrg 	  /* If doing regular SSA updates for GIMPLE registers, we are
31761debfc3dSmrg 	     only interested in IDF blocks dominated by the nearest
31771debfc3dSmrg 	     common dominator of all the definition blocks.  */
31781debfc3dSmrg 	  entry = nearest_common_dominator_for_set (CDI_DOMINATORS,
31791debfc3dSmrg 						    db->def_blocks);
31801debfc3dSmrg 	  if (entry != ENTRY_BLOCK_PTR_FOR_FN (cfun))
31811debfc3dSmrg 	    EXECUTE_IF_SET_IN_BITMAP (idf, 0, i, bi)
31821debfc3dSmrg 	      if (BASIC_BLOCK_FOR_FN (cfun, i) != entry
31831debfc3dSmrg 		  && dominated_by_p (CDI_DOMINATORS,
31841debfc3dSmrg 				     BASIC_BLOCK_FOR_FN (cfun, i), entry))
31851debfc3dSmrg 		bitmap_set_bit (pruned_idf, i);
31861debfc3dSmrg 	}
31871debfc3dSmrg       else
31881debfc3dSmrg 	{
31891debfc3dSmrg 	  /* Otherwise, do not prune the IDF for VAR.  */
31901debfc3dSmrg 	  gcc_checking_assert (update_flags == TODO_update_ssa_full_phi);
31911debfc3dSmrg 	  bitmap_copy (pruned_idf, idf);
31921debfc3dSmrg 	}
31931debfc3dSmrg     }
31941debfc3dSmrg   else
31951debfc3dSmrg     {
31961debfc3dSmrg       /* Otherwise, VAR is a symbol that needs to be put into SSA form
31971debfc3dSmrg 	 for the first time, so we need to compute the full IDF for
31981debfc3dSmrg 	 it.  */
31991debfc3dSmrg       bitmap_copy (pruned_idf, idf);
32001debfc3dSmrg     }
32011debfc3dSmrg 
32021debfc3dSmrg   if (!bitmap_empty_p (pruned_idf))
32031debfc3dSmrg     {
32041debfc3dSmrg       /* Make sure that PRUNED_IDF blocks and all their feeding blocks
32051debfc3dSmrg 	 are included in the region to be updated.  The feeding blocks
32061debfc3dSmrg 	 are important to guarantee that the PHI arguments are renamed
32071debfc3dSmrg 	 properly.  */
32081debfc3dSmrg 
32091debfc3dSmrg       /* FIXME, this is not needed if we are updating symbols.  We are
32101debfc3dSmrg 	 already starting at the ENTRY block anyway.  */
32111debfc3dSmrg       bitmap_ior_into (blocks, pruned_idf);
32121debfc3dSmrg       EXECUTE_IF_SET_IN_BITMAP (pruned_idf, 0, i, bi)
32131debfc3dSmrg 	{
32141debfc3dSmrg 	  edge e;
32151debfc3dSmrg 	  edge_iterator ei;
32161debfc3dSmrg 	  basic_block bb = BASIC_BLOCK_FOR_FN (cfun, i);
32171debfc3dSmrg 
32181debfc3dSmrg 	  FOR_EACH_EDGE (e, ei, bb->preds)
32191debfc3dSmrg 	    if (e->src->index >= 0)
32201debfc3dSmrg 	      bitmap_set_bit (blocks, e->src->index);
32211debfc3dSmrg 	}
32221debfc3dSmrg 
32231debfc3dSmrg       insert_phi_nodes_for (var, pruned_idf, true);
32241debfc3dSmrg     }
32251debfc3dSmrg 
32261debfc3dSmrg   BITMAP_FREE (pruned_idf);
32271debfc3dSmrg   BITMAP_FREE (idf);
32281debfc3dSmrg }
32291debfc3dSmrg 
32301debfc3dSmrg /* Sort symbols_to_rename after their DECL_UID.  */
32311debfc3dSmrg 
32321debfc3dSmrg static int
insert_updated_phi_nodes_compare_uids(const void * a,const void * b)32331debfc3dSmrg insert_updated_phi_nodes_compare_uids (const void *a, const void *b)
32341debfc3dSmrg {
32351debfc3dSmrg   const_tree syma = *(const const_tree *)a;
32361debfc3dSmrg   const_tree symb = *(const const_tree *)b;
32371debfc3dSmrg   if (DECL_UID (syma) == DECL_UID (symb))
32381debfc3dSmrg     return 0;
32391debfc3dSmrg   return DECL_UID (syma) < DECL_UID (symb) ? -1 : 1;
32401debfc3dSmrg }
32411debfc3dSmrg 
32421debfc3dSmrg /* Given a set of newly created SSA names (NEW_SSA_NAMES) and a set of
32431debfc3dSmrg    existing SSA names (OLD_SSA_NAMES), update the SSA form so that:
32441debfc3dSmrg 
32451debfc3dSmrg    1- The names in OLD_SSA_NAMES dominated by the definitions of
32461debfc3dSmrg       NEW_SSA_NAMES are all re-written to be reached by the
32471debfc3dSmrg       appropriate definition from NEW_SSA_NAMES.
32481debfc3dSmrg 
32491debfc3dSmrg    2- If needed, new PHI nodes are added to the iterated dominance
32501debfc3dSmrg       frontier of the blocks where each of NEW_SSA_NAMES are defined.
32511debfc3dSmrg 
32521debfc3dSmrg    The mapping between OLD_SSA_NAMES and NEW_SSA_NAMES is setup by
32531debfc3dSmrg    calling create_new_def_for to create new defs for names that the
32541debfc3dSmrg    caller wants to replace.
32551debfc3dSmrg 
32561debfc3dSmrg    The caller cretaes the new names to be inserted and the names that need
32571debfc3dSmrg    to be replaced by calling create_new_def_for for each old definition
32581debfc3dSmrg    to be replaced.  Note that the function assumes that the
32591debfc3dSmrg    new defining statement has already been inserted in the IL.
32601debfc3dSmrg 
32611debfc3dSmrg    For instance, given the following code:
32621debfc3dSmrg 
32631debfc3dSmrg      1	L0:
32641debfc3dSmrg      2	x_1 = PHI (0, x_5)
32651debfc3dSmrg      3	if (x_1 < 10)
32661debfc3dSmrg      4	  if (x_1 > 7)
32671debfc3dSmrg      5	    y_2 = 0
32681debfc3dSmrg      6	  else
32691debfc3dSmrg      7	    y_3 = x_1 + x_7
32701debfc3dSmrg      8	  endif
32711debfc3dSmrg      9	  x_5 = x_1 + 1
32721debfc3dSmrg      10   goto L0;
32731debfc3dSmrg      11	endif
32741debfc3dSmrg 
32751debfc3dSmrg    Suppose that we insert new names x_10 and x_11 (lines 4 and 8).
32761debfc3dSmrg 
32771debfc3dSmrg      1	L0:
32781debfc3dSmrg      2	x_1 = PHI (0, x_5)
32791debfc3dSmrg      3	if (x_1 < 10)
32801debfc3dSmrg      4	  x_10 = ...
32811debfc3dSmrg      5	  if (x_1 > 7)
32821debfc3dSmrg      6	    y_2 = 0
32831debfc3dSmrg      7	  else
32841debfc3dSmrg      8	    x_11 = ...
32851debfc3dSmrg      9	    y_3 = x_1 + x_7
32861debfc3dSmrg      10	  endif
32871debfc3dSmrg      11	  x_5 = x_1 + 1
32881debfc3dSmrg      12	  goto L0;
32891debfc3dSmrg      13	endif
32901debfc3dSmrg 
32911debfc3dSmrg    We want to replace all the uses of x_1 with the new definitions of
32921debfc3dSmrg    x_10 and x_11.  Note that the only uses that should be replaced are
32931debfc3dSmrg    those at lines 5, 9 and 11.  Also, the use of x_7 at line 9 should
32941debfc3dSmrg    *not* be replaced (this is why we cannot just mark symbol 'x' for
32951debfc3dSmrg    renaming).
32961debfc3dSmrg 
32971debfc3dSmrg    Additionally, we may need to insert a PHI node at line 11 because
32981debfc3dSmrg    that is a merge point for x_10 and x_11.  So the use of x_1 at line
32991debfc3dSmrg    11 will be replaced with the new PHI node.  The insertion of PHI
33001debfc3dSmrg    nodes is optional.  They are not strictly necessary to preserve the
33011debfc3dSmrg    SSA form, and depending on what the caller inserted, they may not
33021debfc3dSmrg    even be useful for the optimizers.  UPDATE_FLAGS controls various
33031debfc3dSmrg    aspects of how update_ssa operates, see the documentation for
33041debfc3dSmrg    TODO_update_ssa*.  */
33051debfc3dSmrg 
33061debfc3dSmrg void
update_ssa(unsigned update_flags)33071debfc3dSmrg update_ssa (unsigned update_flags)
33081debfc3dSmrg {
33091debfc3dSmrg   basic_block bb, start_bb;
33101debfc3dSmrg   bitmap_iterator bi;
33111debfc3dSmrg   unsigned i = 0;
33121debfc3dSmrg   bool insert_phi_p;
33131debfc3dSmrg   sbitmap_iterator sbi;
33141debfc3dSmrg   tree sym;
33151debfc3dSmrg 
33161debfc3dSmrg   /* Only one update flag should be set.  */
33171debfc3dSmrg   gcc_assert (update_flags == TODO_update_ssa
33181debfc3dSmrg               || update_flags == TODO_update_ssa_no_phi
33191debfc3dSmrg 	      || update_flags == TODO_update_ssa_full_phi
33201debfc3dSmrg 	      || update_flags == TODO_update_ssa_only_virtuals);
33211debfc3dSmrg 
33221debfc3dSmrg   if (!need_ssa_update_p (cfun))
33231debfc3dSmrg     return;
33241debfc3dSmrg 
33251debfc3dSmrg   if (flag_checking)
33261debfc3dSmrg     {
33271debfc3dSmrg       timevar_push (TV_TREE_STMT_VERIFY);
33281debfc3dSmrg 
33291debfc3dSmrg       bool err = false;
33301debfc3dSmrg 
33311debfc3dSmrg       FOR_EACH_BB_FN (bb, cfun)
33321debfc3dSmrg 	{
33331debfc3dSmrg 	  gimple_stmt_iterator gsi;
33341debfc3dSmrg 	  for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
33351debfc3dSmrg 	    {
33361debfc3dSmrg 	      gimple *stmt = gsi_stmt (gsi);
33371debfc3dSmrg 
33381debfc3dSmrg 	      ssa_op_iter i;
33391debfc3dSmrg 	      use_operand_p use_p;
33401debfc3dSmrg 	      FOR_EACH_SSA_USE_OPERAND (use_p, stmt, i, SSA_OP_ALL_USES)
33411debfc3dSmrg 		{
33421debfc3dSmrg 		  tree use = USE_FROM_PTR (use_p);
33431debfc3dSmrg 		  if (TREE_CODE (use) != SSA_NAME)
33441debfc3dSmrg 		    continue;
33451debfc3dSmrg 
33461debfc3dSmrg 		  if (SSA_NAME_IN_FREE_LIST (use))
33471debfc3dSmrg 		    {
3348*8feb0f0bSmrg 		      error ("statement uses released SSA name");
33491debfc3dSmrg 		      debug_gimple_stmt (stmt);
33501debfc3dSmrg 		      fprintf (stderr, "The use of ");
3351a2dc1f3fSmrg 		      print_generic_expr (stderr, use);
33521debfc3dSmrg 		      fprintf (stderr," should have been replaced\n");
33531debfc3dSmrg 		      err = true;
33541debfc3dSmrg 		    }
33551debfc3dSmrg 		}
33561debfc3dSmrg 	    }
33571debfc3dSmrg 	}
33581debfc3dSmrg 
33591debfc3dSmrg       if (err)
33601debfc3dSmrg 	internal_error ("cannot update SSA form");
33611debfc3dSmrg 
33621debfc3dSmrg       timevar_pop (TV_TREE_STMT_VERIFY);
33631debfc3dSmrg     }
33641debfc3dSmrg 
33651debfc3dSmrg   timevar_push (TV_TREE_SSA_INCREMENTAL);
33661debfc3dSmrg 
33671debfc3dSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
33681debfc3dSmrg     fprintf (dump_file, "\nUpdating SSA:\n");
33691debfc3dSmrg 
33701debfc3dSmrg   if (!update_ssa_initialized_fn)
33711debfc3dSmrg     init_update_ssa (cfun);
33721debfc3dSmrg   else if (update_flags == TODO_update_ssa_only_virtuals)
33731debfc3dSmrg     {
33741debfc3dSmrg       /* If we only need to update virtuals, remove all the mappings for
33751debfc3dSmrg 	 real names before proceeding.  The caller is responsible for
33761debfc3dSmrg 	 having dealt with the name mappings before calling update_ssa.  */
33771debfc3dSmrg       bitmap_clear (old_ssa_names);
33781debfc3dSmrg       bitmap_clear (new_ssa_names);
33791debfc3dSmrg     }
33801debfc3dSmrg 
33811debfc3dSmrg   gcc_assert (update_ssa_initialized_fn == cfun);
33821debfc3dSmrg 
33831debfc3dSmrg   blocks_with_phis_to_rewrite = BITMAP_ALLOC (NULL);
33841debfc3dSmrg   if (!phis_to_rewrite.exists ())
33851debfc3dSmrg     phis_to_rewrite.create (last_basic_block_for_fn (cfun) + 1);
33861debfc3dSmrg   blocks_to_update = BITMAP_ALLOC (NULL);
33871debfc3dSmrg 
33881debfc3dSmrg   /* Ensure that the dominance information is up-to-date.  */
33891debfc3dSmrg   calculate_dominance_info (CDI_DOMINATORS);
33901debfc3dSmrg 
33911debfc3dSmrg   insert_phi_p = (update_flags != TODO_update_ssa_no_phi);
33921debfc3dSmrg 
33931debfc3dSmrg   /* If there are names defined in the replacement table, prepare
33941debfc3dSmrg      definition and use sites for all the names in NEW_SSA_NAMES and
33951debfc3dSmrg      OLD_SSA_NAMES.  */
33961debfc3dSmrg   if (bitmap_first_set_bit (new_ssa_names) >= 0)
33971debfc3dSmrg     {
33981debfc3dSmrg       statistics_counter_event (cfun, "Incremental SSA update", 1);
33991debfc3dSmrg 
34001debfc3dSmrg       prepare_names_to_update (insert_phi_p);
34011debfc3dSmrg 
34021debfc3dSmrg       /* If all the names in NEW_SSA_NAMES had been marked for
34031debfc3dSmrg 	 removal, and there are no symbols to rename, then there's
34041debfc3dSmrg 	 nothing else to do.  */
34051debfc3dSmrg       if (bitmap_first_set_bit (new_ssa_names) < 0
34061debfc3dSmrg 	  && !cfun->gimple_df->ssa_renaming_needed)
34071debfc3dSmrg 	goto done;
34081debfc3dSmrg     }
34091debfc3dSmrg 
34101debfc3dSmrg   /* Next, determine the block at which to start the renaming process.  */
34111debfc3dSmrg   if (cfun->gimple_df->ssa_renaming_needed)
34121debfc3dSmrg     {
34131debfc3dSmrg       statistics_counter_event (cfun, "Symbol to SSA rewrite", 1);
34141debfc3dSmrg 
34151debfc3dSmrg       /* If we rename bare symbols initialize the mapping to
34161debfc3dSmrg          auxiliar info we need to keep track of.  */
34171debfc3dSmrg       var_infos = new hash_table<var_info_hasher> (47);
34181debfc3dSmrg 
34191debfc3dSmrg       /* If we have to rename some symbols from scratch, we need to
34201debfc3dSmrg 	 start the process at the root of the CFG.  FIXME, it should
34211debfc3dSmrg 	 be possible to determine the nearest block that had a
34221debfc3dSmrg 	 definition for each of the symbols that are marked for
34231debfc3dSmrg 	 updating.  For now this seems more work than it's worth.  */
34241debfc3dSmrg       start_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
34251debfc3dSmrg 
34261debfc3dSmrg       /* Traverse the CFG looking for existing definitions and uses of
34271debfc3dSmrg 	 symbols in SSA operands.  Mark interesting blocks and
34281debfc3dSmrg 	 statements and set local live-in information for the PHI
34291debfc3dSmrg 	 placement heuristics.  */
34301debfc3dSmrg       prepare_block_for_update (start_bb, insert_phi_p);
34311debfc3dSmrg 
34321debfc3dSmrg       tree name;
34331debfc3dSmrg 
34341debfc3dSmrg       if (flag_checking)
34351debfc3dSmrg 	FOR_EACH_SSA_NAME (i, name, cfun)
34361debfc3dSmrg 	  {
34371debfc3dSmrg 	    if (virtual_operand_p (name))
34381debfc3dSmrg 	      continue;
34391debfc3dSmrg 
34401debfc3dSmrg 	    /* For all but virtual operands, which do not have SSA names
34411debfc3dSmrg 	       with overlapping life ranges, ensure that symbols marked
34421debfc3dSmrg 	       for renaming do not have existing SSA names associated with
34431debfc3dSmrg 	       them as we do not re-write them out-of-SSA before going
34441debfc3dSmrg 	       into SSA for the remaining symbol uses.  */
34451debfc3dSmrg 	    if (marked_for_renaming (SSA_NAME_VAR (name)))
34461debfc3dSmrg 	      {
34471debfc3dSmrg 		fprintf (stderr, "Existing SSA name for symbol marked for "
34481debfc3dSmrg 			 "renaming: ");
34491debfc3dSmrg 		print_generic_expr (stderr, name, TDF_SLIM);
34501debfc3dSmrg 		fprintf (stderr, "\n");
34511debfc3dSmrg 		internal_error ("SSA corruption");
34521debfc3dSmrg 	      }
34531debfc3dSmrg 	  }
34541debfc3dSmrg     }
34551debfc3dSmrg   else
34561debfc3dSmrg     {
34571debfc3dSmrg       /* Otherwise, the entry block to the region is the nearest
34581debfc3dSmrg 	 common dominator for the blocks in BLOCKS.  */
34591debfc3dSmrg       start_bb = nearest_common_dominator_for_set (CDI_DOMINATORS,
34601debfc3dSmrg 						   blocks_to_update);
34611debfc3dSmrg     }
34621debfc3dSmrg 
34631debfc3dSmrg   /* If requested, insert PHI nodes at the iterated dominance frontier
34641debfc3dSmrg      of every block, creating new definitions for names in OLD_SSA_NAMES
34651debfc3dSmrg      and for symbols found.  */
34661debfc3dSmrg   if (insert_phi_p)
34671debfc3dSmrg     {
34681debfc3dSmrg       bitmap_head *dfs;
34691debfc3dSmrg 
34701debfc3dSmrg       /* If the caller requested PHI nodes to be added, compute
34711debfc3dSmrg 	 dominance frontiers.  */
34721debfc3dSmrg       dfs = XNEWVEC (bitmap_head, last_basic_block_for_fn (cfun));
34731debfc3dSmrg       FOR_EACH_BB_FN (bb, cfun)
34741debfc3dSmrg 	bitmap_initialize (&dfs[bb->index], &bitmap_default_obstack);
34751debfc3dSmrg       compute_dominance_frontiers (dfs);
34761debfc3dSmrg 
34771debfc3dSmrg       if (bitmap_first_set_bit (old_ssa_names) >= 0)
34781debfc3dSmrg 	{
34791debfc3dSmrg 	  sbitmap_iterator sbi;
34801debfc3dSmrg 
34811debfc3dSmrg 	  /* insert_update_phi_nodes_for will call add_new_name_mapping
34821debfc3dSmrg 	     when inserting new PHI nodes, so the set OLD_SSA_NAMES
34831debfc3dSmrg 	     will grow while we are traversing it (but it will not
34841debfc3dSmrg 	     gain any new members).  Copy OLD_SSA_NAMES to a temporary
34851debfc3dSmrg 	     for traversal.  */
34861debfc3dSmrg 	  auto_sbitmap tmp (SBITMAP_SIZE (old_ssa_names));
34871debfc3dSmrg 	  bitmap_copy (tmp, old_ssa_names);
34881debfc3dSmrg 	  EXECUTE_IF_SET_IN_BITMAP (tmp, 0, i, sbi)
34891debfc3dSmrg 	    insert_updated_phi_nodes_for (ssa_name (i), dfs, blocks_to_update,
34901debfc3dSmrg 	                                  update_flags);
34911debfc3dSmrg 	}
34921debfc3dSmrg 
34931debfc3dSmrg       symbols_to_rename.qsort (insert_updated_phi_nodes_compare_uids);
34941debfc3dSmrg       FOR_EACH_VEC_ELT (symbols_to_rename, i, sym)
34951debfc3dSmrg 	insert_updated_phi_nodes_for (sym, dfs, blocks_to_update,
34961debfc3dSmrg 	                              update_flags);
34971debfc3dSmrg 
34981debfc3dSmrg       FOR_EACH_BB_FN (bb, cfun)
34991debfc3dSmrg 	bitmap_clear (&dfs[bb->index]);
35001debfc3dSmrg       free (dfs);
35011debfc3dSmrg 
35021debfc3dSmrg       /* Insertion of PHI nodes may have added blocks to the region.
35031debfc3dSmrg 	 We need to re-compute START_BB to include the newly added
35041debfc3dSmrg 	 blocks.  */
35051debfc3dSmrg       if (start_bb != ENTRY_BLOCK_PTR_FOR_FN (cfun))
35061debfc3dSmrg 	start_bb = nearest_common_dominator_for_set (CDI_DOMINATORS,
35071debfc3dSmrg 						     blocks_to_update);
35081debfc3dSmrg     }
35091debfc3dSmrg 
35101debfc3dSmrg   /* Reset the current definition for name and symbol before renaming
35111debfc3dSmrg      the sub-graph.  */
35121debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (old_ssa_names, 0, i, sbi)
35131debfc3dSmrg     get_ssa_name_ann (ssa_name (i))->info.current_def = NULL_TREE;
35141debfc3dSmrg 
35151debfc3dSmrg   FOR_EACH_VEC_ELT (symbols_to_rename, i, sym)
35161debfc3dSmrg     get_var_info (sym)->info.current_def = NULL_TREE;
35171debfc3dSmrg 
35181debfc3dSmrg   /* Now start the renaming process at START_BB.  */
35191debfc3dSmrg   interesting_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
35201debfc3dSmrg   bitmap_clear (interesting_blocks);
35211debfc3dSmrg   EXECUTE_IF_SET_IN_BITMAP (blocks_to_update, 0, i, bi)
35221debfc3dSmrg     bitmap_set_bit (interesting_blocks, i);
35231debfc3dSmrg 
35241debfc3dSmrg   rewrite_blocks (start_bb, REWRITE_UPDATE);
35251debfc3dSmrg 
35261debfc3dSmrg   sbitmap_free (interesting_blocks);
35271debfc3dSmrg 
35281debfc3dSmrg   /* Debugging dumps.  */
35291debfc3dSmrg   if (dump_file)
35301debfc3dSmrg     {
35311debfc3dSmrg       int c;
35321debfc3dSmrg       unsigned i;
35331debfc3dSmrg 
35341debfc3dSmrg       dump_update_ssa (dump_file);
35351debfc3dSmrg 
35361debfc3dSmrg       fprintf (dump_file, "Incremental SSA update started at block: %d\n",
35371debfc3dSmrg 	       start_bb->index);
35381debfc3dSmrg 
35391debfc3dSmrg       c = 0;
35401debfc3dSmrg       EXECUTE_IF_SET_IN_BITMAP (blocks_to_update, 0, i, bi)
35411debfc3dSmrg 	c++;
35421debfc3dSmrg       fprintf (dump_file, "Number of blocks in CFG: %d\n",
35431debfc3dSmrg 	       last_basic_block_for_fn (cfun));
35441debfc3dSmrg       fprintf (dump_file, "Number of blocks to update: %d (%3.0f%%)\n",
35451debfc3dSmrg 	       c, PERCENT (c, last_basic_block_for_fn (cfun)));
35461debfc3dSmrg 
35471debfc3dSmrg       if (dump_flags & TDF_DETAILS)
35481debfc3dSmrg 	{
35491debfc3dSmrg 	  fprintf (dump_file, "Affected blocks:");
35501debfc3dSmrg 	  EXECUTE_IF_SET_IN_BITMAP (blocks_to_update, 0, i, bi)
35511debfc3dSmrg 	    fprintf (dump_file, " %u", i);
35521debfc3dSmrg 	  fprintf (dump_file, "\n");
35531debfc3dSmrg 	}
35541debfc3dSmrg 
35551debfc3dSmrg       fprintf (dump_file, "\n\n");
35561debfc3dSmrg     }
35571debfc3dSmrg 
35581debfc3dSmrg   /* Free allocated memory.  */
35591debfc3dSmrg done:
35601debfc3dSmrg   delete_update_ssa ();
35611debfc3dSmrg 
35621debfc3dSmrg   timevar_pop (TV_TREE_SSA_INCREMENTAL);
35631debfc3dSmrg }
3564