+2016-09-15 Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ * tree-ssanames.h (FOR_EACH_SSA_NAME): New.
+ * cfgexpand.c (update_alias_info_with_stack_vars): Use
+ FOR_EACH_SSA_NAME to iterate over SSA variables.
+ (pass_expand::execute): Likewise.
+ * omp-simd-clone.c (ipa_simd_modify_function_body): Likewise.
+ * tree-cfg.c (dump_function_to_file): Likewise.
+ * tree-into-ssa.c (pass_build_ssa::execute): Likewise.
+ (update_ssa): Likewise.
+ * tree-ssa-alias.c (dump_alias_info): Likewise.
+ * tree-ssa-ccp.c (ccp_finalize): Likewise.
+ * tree-ssa-coalesce.c (build_ssa_conflict_graph): Likewise.
+ (create_outofssa_var_map): Likewise.
+ (coalesce_ssa_name): Likewise.
+ * tree-ssa-operands.c (dump_immediate_uses): Likewise.
+ * tree-ssa-pre.c (compute_avail): Likewise.
+ * tree-ssa-sccvn.c (init_scc_vn): Likewise.
+ (scc_vn_restore_ssa_info): Likewise.
+ (free_scc_vn): Likwise.
+ (run_scc_vn): Likewise.
+ * tree-ssa-structalias.c (compute_points_to_sets): Likewise.
+ * tree-ssa-ter.c (new_temp_expr_table): Likewise.
+ * tree-ssa-copy.c (fini_copy_prop): Likewise.
+ * tree-ssa.c (verify_ssa): Likewise.
+
2016-09-14 Matthew Fortune <matthew.fortune@imgtec.com>
* config.gcc (mips*-mti-elf*, mips*-mti-linux*): Set mips32r2
if (decls_to_partitions)
{
unsigned i;
+ tree name;
hash_set<bitmap> visited;
bitmap temp = BITMAP_ALLOC (&stack_var_bitmap_obstack);
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
struct ptr_info_def *pi;
- if (name
- && POINTER_TYPE_P (TREE_TYPE (name))
+ if (POINTER_TYPE_P (TREE_TYPE (name))
&& ((pi = SSA_NAME_PTR_INFO (name)) != NULL))
add_partitioned_vars_to_ptset (&pi->pt, decls_to_partitions,
&visited, temp);
/* Now propagate the RTL assignment of each partition to the
underlying var of each SSA_NAME. */
- for (i = 1; i < num_ssa_names; i++)
- {
- tree name = ssa_name (i);
+ tree name;
- if (!name
- /* We might have generated new SSA names in
- update_alias_info_with_stack_vars. They will have a NULL
- defining statements, and won't be part of the partitioning,
- so ignore those. */
- || !SSA_NAME_DEF_STMT (name))
+ FOR_EACH_SSA_NAME (i, name, cfun)
+ {
+ /* We might have generated new SSA names in
+ update_alias_info_with_stack_vars. They will have a NULL
+ defining statements, and won't be part of the partitioning,
+ so ignore those. */
+ if (!SSA_NAME_DEF_STMT (name))
continue;
adjust_one_expanded_partition_var (name);
/* Clean up RTL of variables that straddle across multiple
partitions, and check that the rtl of any PARM_DECLs that are not
cleaned up is that of their default defs. */
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
int part;
- if (!name
- /* We might have generated new SSA names in
- update_alias_info_with_stack_vars. They will have a NULL
- defining statements, and won't be part of the partitioning,
- so ignore those. */
- || !SSA_NAME_DEF_STMT (name))
+ /* We might have generated new SSA names in
+ update_alias_info_with_stack_vars. They will have a NULL
+ defining statements, and won't be part of the partitioning,
+ so ignore those. */
+ if (!SSA_NAME_DEF_STMT (name))
continue;
part = var_to_partition (SA.map, name);
if (part == NO_PARTITION)
}
l = adjustments.length ();
- for (i = 1; i < num_ssa_names; i++)
+ tree name;
+
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (name
- && SSA_NAME_VAR (name)
+ if (SSA_NAME_VAR (name)
&& TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL)
{
for (j = 0; j < l; j++)
any_var = true;
}
+
+ tree name;
+
if (gimple_in_ssa_p (cfun))
- for (ix = 1; ix < num_ssa_names; ++ix)
+ FOR_EACH_SSA_NAME (ix, name, cfun)
{
- tree name = ssa_name (ix);
- if (name && !SSA_NAME_VAR (name))
+ if (!SSA_NAME_VAR (name))
{
fprintf (file, " ");
print_generic_expr (file, TREE_TYPE (name), flags);
{
bitmap_head *dfs;
basic_block bb;
- unsigned i;
/* Initialize operand data structures. */
init_ssa_operands (fun);
/* Try to get rid of all gimplifier generated temporaries by making
its SSA names anonymous. This way we can garbage collect them
all after removing unused locals which we do in our TODO. */
- for (i = 1; i < num_ssa_names; ++i)
+ unsigned i;
+ tree name;
+
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree decl, name = ssa_name (i);
- if (!name
- || SSA_NAME_IS_DEFAULT_DEF (name))
+ if (SSA_NAME_IS_DEFAULT_DEF (name))
continue;
- decl = SSA_NAME_VAR (name);
+ tree decl = SSA_NAME_VAR (name);
if (decl
&& TREE_CODE (decl) == VAR_DECL
&& !VAR_DECL_IS_VIRTUAL_OPERAND (decl)
placement heuristics. */
prepare_block_for_update (start_bb, insert_phi_p);
+ tree name;
+
if (flag_checking)
- for (i = 1; i < num_ssa_names; ++i)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (!name
- || virtual_operand_p (name))
+ if (virtual_operand_p (name))
continue;
/* For all but virtual operands, which do not have SSA names
dump_alias_info (FILE *file)
{
unsigned i;
+ tree ptr;
const char *funcname
= lang_hooks.decl_printable_name (current_function_decl, 2);
tree var;
fprintf (file, "\n\nFlow-insensitive points-to information\n\n");
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, ptr, cfun)
{
- tree ptr = ssa_name (i);
struct ptr_info_def *pi;
- if (ptr == NULL_TREE
- || !POINTER_TYPE_P (TREE_TYPE (ptr))
+ if (!POINTER_TYPE_P (TREE_TYPE (ptr))
|| SSA_NAME_IN_FREE_LIST (ptr))
continue;
{
bool something_changed;
unsigned i;
+ tree name;
do_dbg_cnt ();
/* Derive alignment and misalignment information from partially
constant pointers in the lattice or nonzero bits from partially
constant integers. */
- for (i = 1; i < num_ssa_names; ++i)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
ccp_prop_value_t *val;
unsigned int tem, align;
- if (!name
- || (!POINTER_TYPE_P (TREE_TYPE (name))
- && (!INTEGRAL_TYPE_P (TREE_TYPE (name))
- /* Don't record nonzero bits before IPA to avoid
- using too much memory. */
- || !nonzero_p)))
+ if (!POINTER_TYPE_P (TREE_TYPE (name))
+ && (!INTEGRAL_TYPE_P (TREE_TYPE (name))
+ /* Don't record nonzero bits before IPA to avoid
+ using too much memory. */
+ || !nonzero_p))
continue;
val = get_value (name);
if (bb == entry)
{
unsigned i;
- for (i = 1; i < num_ssa_names; i++)
- {
- tree var = ssa_name (i);
+ tree var;
- if (!var
- || !SSA_NAME_IS_DEFAULT_DEF (var)
+ FOR_EACH_SSA_NAME (i, var, cfun)
+ {
+ if (!SSA_NAME_IS_DEFAULT_DEF (var)
|| !SSA_NAME_VAR (var)
|| VAR_P (SSA_NAME_VAR (var)))
continue;
/* Now process result decls and live on entry variables for entry into
the coalesce list. */
first = NULL_TREE;
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, var, cfun)
{
- var = ssa_name (i);
- if (var != NULL_TREE && !virtual_operand_p (var))
+ if (!virtual_operand_p (var))
{
coalesce_with_default (var, cl, used_in_copy);
bitmap used_in_copies = BITMAP_ALLOC (NULL);
var_map map;
unsigned int i;
+ tree a;
cl = create_coalesce_list ();
map = create_outofssa_var_map (cl, used_in_copies);
{
hash_table<ssa_name_var_hash> ssa_name_hash (10);
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, a, cfun)
{
- tree a = ssa_name (i);
-
- if (a
- && SSA_NAME_VAR (a)
+ if (SSA_NAME_VAR (a)
&& !DECL_IGNORED_P (SSA_NAME_VAR (a))
&& (!has_zero_uses (a) || !SSA_NAME_IS_DEFAULT_DEF (a)
|| !VAR_P (SSA_NAME_VAR (a))))
fini_copy_prop (void)
{
unsigned i;
+ tree var;
/* Set the final copy-of value for each variable by traversing the
copy-of chains. */
- for (i = 1; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, var, cfun)
{
- tree var = ssa_name (i);
- if (!var
- || !copy_of[i].value
+ if (!copy_of[i].value
|| copy_of[i].value == var)
continue;
unsigned int x;
fprintf (file, "Immediate_uses: \n\n");
- for (x = 1; x < num_ssa_names; x++)
+ FOR_EACH_SSA_NAME (x, var, cfun)
{
- var = ssa_name (x);
- if (!var)
- continue;
dump_immediate_uses_for (file, var);
}
}
basic_block *worklist;
size_t sp = 0;
unsigned i;
+ tree name;
/* We pretend that default definitions are defined in the entry block.
This includes function arguments and the static chain decl. */
- for (i = 1; i < num_ssa_names; ++i)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
pre_expr e;
- if (!name
- || !SSA_NAME_IS_DEFAULT_DEF (name)
+ if (!SSA_NAME_IS_DEFAULT_DEF (name)
|| has_zero_uses (name)
|| virtual_operand_p (name))
continue;
static void
init_scc_vn (void)
{
- size_t i;
int j;
int *rpo_numbers_temp;
/* Create the VN_INFO structures, and initialize value numbers to
TOP or VARYING for parameters. */
- for (i = 1; i < num_ssa_names; i++)
- {
- tree name = ssa_name (i);
- if (!name)
- continue;
+ size_t i;
+ tree name;
+ FOR_EACH_SSA_NAME (i, name, cfun)
+ {
VN_INFO_GET (name)->valnum = VN_TOP;
VN_INFO (name)->needs_insertion = false;
VN_INFO (name)->expr = NULL;
void
scc_vn_restore_ssa_info (void)
{
- for (unsigned i = 0; i < num_ssa_names; i++)
+ unsigned i;
+ tree name;
+
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (name
- && has_VN_INFO (name))
+ if (has_VN_INFO (name))
{
if (VN_INFO (name)->needs_insertion)
;
free_scc_vn (void)
{
size_t i;
+ tree name;
delete constant_to_value_id;
constant_to_value_id = NULL;
shared_lookup_references.release ();
XDELETEVEC (rpo_numbers);
- for (i = 0; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (name
- && has_VN_INFO (name)
+ if (has_VN_INFO (name)
&& VN_INFO (name)->needs_insertion)
release_ssa_name (name);
}
/* Initialize the value ids and prune out remaining VN_TOPs
from dead code. */
- for (i = 1; i < num_ssa_names; ++i)
+ tree name;
+
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- vn_ssa_aux_t info;
- if (!name)
- continue;
- info = VN_INFO (name);
+ vn_ssa_aux_t info = VN_INFO (name);
if (!info->visited)
info->valnum = name;
if (info->valnum == name
}
/* Propagate. */
- for (i = 1; i < num_ssa_names; ++i)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- vn_ssa_aux_t info;
- if (!name)
- continue;
- info = VN_INFO (name);
+ vn_ssa_aux_t info = VN_INFO (name);
if (TREE_CODE (info->valnum) == SSA_NAME
&& info->valnum != name
&& info->value_id != VN_INFO (info->valnum)->value_id)
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "Value numbers:\n");
- for (i = 0; i < num_ssa_names; i++)
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (name
- && VN_INFO (name)->visited
+ if (VN_INFO (name)->visited
&& SSA_VAL (name) != name)
{
print_generic_expr (dump_file, name, 0);
compute_points_to_sets (void)
{
basic_block bb;
- unsigned i;
varinfo_t vi;
timevar_push (TV_TREE_PTA);
cfun->gimple_df->escaped.escaped = 0;
/* Compute the points-to sets for pointer SSA_NAMEs. */
- for (i = 0; i < num_ssa_names; ++i)
+ unsigned i;
+ tree ptr;
+
+ FOR_EACH_SSA_NAME (i, ptr, cfun)
{
- tree ptr = ssa_name (i);
- if (ptr
- && POINTER_TYPE_P (TREE_TYPE (ptr)))
+ if (POINTER_TYPE_P (TREE_TYPE (ptr)))
find_what_p_points_to (cfun->decl, ptr);
}
static temp_expr_table *
new_temp_expr_table (var_map map)
{
- unsigned x;
-
temp_expr_table *t = XNEW (struct temp_expr_table);
t->map = map;
t->replaceable_expressions = NULL;
t->num_in_part = XCNEWVEC (int, num_var_partitions (map));
- for (x = 1; x < num_ssa_names; x++)
+
+ unsigned x;
+ tree name;
+
+ FOR_EACH_SSA_NAME (x, name, cfun)
{
int p;
- tree name = ssa_name (x);
- if (!name)
- continue;
p = var_to_partition (map, name);
if (p != NO_PARTITION)
t->num_in_part[p]++;
DEBUG_FUNCTION void
verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
{
- size_t i;
basic_block bb;
basic_block *definition_block = XCNEWVEC (basic_block, num_ssa_names);
ssa_op_iter iter;
timevar_push (TV_TREE_SSA_VERIFY);
/* Keep track of SSA names present in the IL. */
- for (i = 1; i < num_ssa_names; i++)
+ size_t i;
+ tree name;
+
+ FOR_EACH_SSA_NAME (i, name, cfun)
{
- tree name = ssa_name (i);
- if (name)
- {
- gimple *stmt;
- TREE_VISITED (name) = 0;
+ gimple *stmt;
+ TREE_VISITED (name) = 0;
- verify_ssa_name (name, virtual_operand_p (name));
+ verify_ssa_name (name, virtual_operand_p (name));
- stmt = SSA_NAME_DEF_STMT (name);
- if (!gimple_nop_p (stmt))
- {
- basic_block bb = gimple_bb (stmt);
- if (verify_def (bb, definition_block,
- name, stmt, virtual_operand_p (name)))
- goto err;
- }
+ stmt = SSA_NAME_DEF_STMT (name);
+ if (!gimple_nop_p (stmt))
+ {
+ basic_block bb = gimple_bb (stmt);
+ if (verify_def (bb, definition_block,
+ name, stmt, virtual_operand_p (name)))
+ goto err;
}
}
#define num_ssa_names (vec_safe_length (cfun->gimple_df->ssa_names))
#define ssa_name(i) ((*cfun->gimple_df->ssa_names)[(i)])
+#define FOR_EACH_SSA_NAME(I, VAR, FN) \
+ for (I = 1; SSANAMES (FN)->iterate (I, &VAR); ++I) \
+ if (VAR)
+
/* Sets the value range to SSA. */
extern void set_range_info (tree, enum value_range_type, const wide_int_ref &,
const wide_int_ref &);