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