Commit eee717aa by Richard Guenther Committed by Richard Biener

tree-flow.h (subvar_t): Make it a VEC.

2007-10-28  Richard Guenther  <rguenther@suse.de>

	* tree-flow.h (subvar_t): Make it a VEC.
	(struct subvar): Remove.
	(struct var_ann_d): Use VEC(tree,gc) to store subvars.
	* tree-flow-inline.h (get_subvar_at): Adjust iterators over
	variable subvars.
	* tree-into-ssa.c (mark_sym_for_renaming): Likewise.
	* tree-nrv.c (dest_safe_for_nrv_p): Likewise.
	* tree-ssa-alias.c (mark_aliases_call_clobbered): Likewise.
	(set_initial_properties): Likewise.
	(setup_pointers_and_addressables): Likewise.
	(new_type_alias): Likewise.
	(create_overlap_variables_for): Likewise.
	* tree-dfa.c (dump_subvars_for): Likewise.
	* tree-ssa-operands.c (add_vars_for_offset): Likewise.
	(get_expr_operands): Likewise.
	(add_to_addressable_set): Likewise.
	* tree-ssa-structalias.c (set_uids_in_ptset): Likewise.

	* gcc.dg/tree-ssa/alias-15.c: Adjust pattern.

From-SVN: r129699
parent e85b4fa7
2007-10-28 Richard Guenther <rguenther@suse.de>
* tree-flow.h (subvar_t): Make it a VEC.
(struct subvar): Remove.
(struct var_ann_d): Use VEC(tree,gc) to store subvars.
* tree-flow-inline.h (get_subvar_at): Adjust iterators over
variable subvars.
* tree-into-ssa.c (mark_sym_for_renaming): Likewise.
* tree-nrv.c (dest_safe_for_nrv_p): Likewise.
* tree-ssa-alias.c (mark_aliases_call_clobbered): Likewise.
(set_initial_properties): Likewise.
(setup_pointers_and_addressables): Likewise.
(new_type_alias): Likewise.
(create_overlap_variables_for): Likewise.
* tree-dfa.c (dump_subvars_for): Likewise.
* tree-ssa-operands.c (add_vars_for_offset): Likewise.
(get_expr_operands): Likewise.
(add_to_addressable_set): Likewise.
* tree-ssa-structalias.c (set_uids_in_ptset): Likewise.
2007-10-28 Uros Bizjak <ubizjak@gmail.com> 2007-10-28 Uros Bizjak <ubizjak@gmail.com>
PR tree-optimization/33920 PR tree-optimization/33920
2007-10-28 Richard Guenther <rguenther@suse.de>
* gcc.dg/tree-ssa/alias-15.c: Adjust pattern.
2007-10-28 Martin Michlmayr <tbm@cyrius.com> 2007-10-28 Martin Michlmayr <tbm@cyrius.com>
Uros Bizjak <ubizjak@gmail.com> Uros Bizjak <ubizjak@gmail.com>
...@@ -15,6 +15,6 @@ int test2(void) ...@@ -15,6 +15,6 @@ int test2(void)
return p->b[3] - m.b.b[3]; return p->b[3] - m.b.b[3];
} }
/* { dg-final { scan-tree-dump "SFT.1 created for var m offset 128" "salias" } } */ /* { dg-final { scan-tree-dump "SFT.5 created for var m offset 128" "salias" } } */
/* { dg-final { scan-tree-dump-times "VUSE <SFT.1_" 2 "salias" } } */ /* { dg-final { scan-tree-dump-times "VUSE <SFT.5_" 2 "salias" } } */
/* { dg-final { cleanup-tree-dump "salias" } } */ /* { dg-final { cleanup-tree-dump "salias" } } */
...@@ -276,15 +276,17 @@ void ...@@ -276,15 +276,17 @@ void
dump_subvars_for (FILE *file, tree var) dump_subvars_for (FILE *file, tree var)
{ {
subvar_t sv = get_subvars_for_var (var); subvar_t sv = get_subvars_for_var (var);
tree subvar;
unsigned int i;
if (!sv) if (!sv)
return; return;
fprintf (file, "{ "); fprintf (file, "{ ");
for (; sv; sv = sv->next) for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
{ {
print_generic_expr (file, sv->var, dump_flags); print_generic_expr (file, subvar, dump_flags);
fprintf (file, " "); fprintf (file, " ");
} }
......
...@@ -1609,11 +1609,14 @@ get_subvars_for_var (tree var) ...@@ -1609,11 +1609,14 @@ get_subvars_for_var (tree var)
static inline tree static inline tree
get_subvar_at (tree var, unsigned HOST_WIDE_INT offset) get_subvar_at (tree var, unsigned HOST_WIDE_INT offset)
{ {
subvar_t sv; subvar_t sv = get_subvars_for_var (var);
unsigned int i;
for (sv = get_subvars_for_var (var); sv; sv = sv->next) tree subvar;
if (SFT_OFFSET (sv->var) == offset)
return sv->var; /* ??? Binary search would be possible here. */
for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
if (SFT_OFFSET (subvar) == offset)
return subvar;
return NULL_TREE; return NULL_TREE;
} }
......
...@@ -308,18 +308,7 @@ enum noalias_state { ...@@ -308,18 +308,7 @@ enum noalias_state {
}; };
struct subvar; typedef VEC(tree,gc) *subvar_t;
typedef struct subvar *subvar_t;
/* This structure represents a fake sub-variable for a structure field. */
struct subvar GTY(())
{
/* Fake variable. */
tree var;
/* Next subvar for this structure. */
subvar_t next;
};
struct var_ann_d GTY(()) struct var_ann_d GTY(())
{ {
...@@ -384,9 +373,9 @@ struct var_ann_d GTY(()) ...@@ -384,9 +373,9 @@ struct var_ann_d GTY(())
current version of this variable (an SSA_NAME). */ current version of this variable (an SSA_NAME). */
tree current_def; tree current_def;
/* If this variable is a structure, this fields holds a list of /* If this variable is a structure, this fields holds an array
symbols representing each of the fields of the structure. */ of symbols representing each of the fields of the structure. */
subvar_t subvars; VEC(tree,gc) *subvars;
/* Mask of values saying the reasons why this variable has escaped /* Mask of values saying the reasons why this variable has escaped
the function. */ the function. */
......
...@@ -2793,9 +2793,11 @@ mark_sym_for_renaming (tree sym) ...@@ -2793,9 +2793,11 @@ mark_sym_for_renaming (tree sym)
subvar_t svars; subvar_t svars;
if (var_can_have_subvars (sym) && (svars = get_subvars_for_var (sym))) if (var_can_have_subvars (sym) && (svars = get_subvars_for_var (sym)))
{ {
subvar_t sv; unsigned int i;
for (sv = svars; sv; sv = sv->next) tree subvar;
mark_sym_for_renaming (sv->var);
for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
mark_sym_for_renaming (subvar);
} }
} }
......
...@@ -249,7 +249,9 @@ struct tree_opt_pass pass_nrv = ...@@ -249,7 +249,9 @@ struct tree_opt_pass pass_nrv =
static bool static bool
dest_safe_for_nrv_p (tree dest) dest_safe_for_nrv_p (tree dest)
{ {
subvar_t subvar; subvar_t sv;
unsigned int i;
tree subvar;
while (handled_component_p (dest)) while (handled_component_p (dest))
dest = TREE_OPERAND (dest, 0); dest = TREE_OPERAND (dest, 0);
...@@ -262,9 +264,12 @@ dest_safe_for_nrv_p (tree dest) ...@@ -262,9 +264,12 @@ dest_safe_for_nrv_p (tree dest)
if (is_call_clobbered (dest)) if (is_call_clobbered (dest))
return false; return false;
for (subvar = get_subvars_for_var (dest); subvar; subvar = subvar->next)
if (is_call_clobbered (subvar->var)) sv = get_subvars_for_var (dest);
for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
if (is_call_clobbered (subvar))
return false; return false;
return true; return true;
} }
......
...@@ -422,11 +422,13 @@ mark_aliases_call_clobbered (tree tag, VEC (tree, heap) **worklist, ...@@ -422,11 +422,13 @@ mark_aliases_call_clobbered (tree tag, VEC (tree, heap) **worklist,
{ {
EXECUTE_IF_SET_IN_BITMAP (queued, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (queued, 0, i, bi)
{ {
subvar_t svars; subvar_t svars = get_subvars_for_var (referenced_var (i));
svars = get_subvars_for_var (referenced_var (i)); unsigned int i;
for (; svars; svars = svars->next) tree subvar;
if (!unmodifiable_var_p (svars->var))
mark_call_clobbered (svars->var, ta->escape_mask); for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
if (!unmodifiable_var_p (subvar))
mark_call_clobbered (subvar, ta->escape_mask);
} }
bitmap_clear (queued); bitmap_clear (queued);
} }
...@@ -600,11 +602,13 @@ set_initial_properties (struct alias_info *ai) ...@@ -600,11 +602,13 @@ set_initial_properties (struct alias_info *ai)
{ {
EXECUTE_IF_SET_IN_BITMAP (queued, 0, j, bi) EXECUTE_IF_SET_IN_BITMAP (queued, 0, j, bi)
{ {
subvar_t svars; subvar_t svars = get_subvars_for_var (referenced_var (j));
svars = get_subvars_for_var (referenced_var (j)); unsigned int i;
for (; svars; svars = svars->next) tree subvar;
if (!unmodifiable_var_p (svars->var))
mark_call_clobbered (svars->var, pi->escape_mask); for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
if (!unmodifiable_var_p (subvar))
mark_call_clobbered (subvar, pi->escape_mask);
} }
bitmap_clear (queued); bitmap_clear (queued);
} }
...@@ -2644,14 +2648,15 @@ setup_pointers_and_addressables (struct alias_info *ai) ...@@ -2644,14 +2648,15 @@ setup_pointers_and_addressables (struct alias_info *ai)
if (var_can_have_subvars (var) if (var_can_have_subvars (var)
&& (svars = get_subvars_for_var (var))) && (svars = get_subvars_for_var (var)))
{ {
subvar_t sv; unsigned int i;
tree subvar;
for (sv = svars; sv; sv = sv->next) for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
{ {
if (bitmap_bit_p (gimple_addressable_vars (cfun), if (bitmap_bit_p (gimple_addressable_vars (cfun),
DECL_UID (sv->var))) DECL_UID (subvar)))
okay_to_mark = false; okay_to_mark = false;
mark_sym_for_renaming (sv->var); mark_sym_for_renaming (subvar);
} }
} }
...@@ -3574,8 +3579,9 @@ new_type_alias (tree ptr, tree var, tree expr) ...@@ -3574,8 +3579,9 @@ new_type_alias (tree ptr, tree var, tree expr)
HOST_WIDE_INT offset, size, maxsize; HOST_WIDE_INT offset, size, maxsize;
tree ref; tree ref;
VEC (tree, heap) *overlaps = NULL; VEC (tree, heap) *overlaps = NULL;
subvar_t sv; unsigned int len, i;
unsigned int len; tree subvar;
gcc_assert (symbol_mem_tag (ptr) == NULL_TREE); gcc_assert (symbol_mem_tag (ptr) == NULL_TREE);
gcc_assert (!MTAG_P (var)); gcc_assert (!MTAG_P (var));
...@@ -3591,12 +3597,12 @@ new_type_alias (tree ptr, tree var, tree expr) ...@@ -3591,12 +3597,12 @@ new_type_alias (tree ptr, tree var, tree expr)
if (var_can_have_subvars (ref) if (var_can_have_subvars (ref)
&& (svars = get_subvars_for_var (ref))) && (svars = get_subvars_for_var (ref)))
{ {
for (sv = svars; sv; sv = sv->next) for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
{ {
bool exact; bool exact;
if (overlap_subvar (offset, maxsize, sv->var, &exact)) if (overlap_subvar (offset, maxsize, subvar, &exact))
VEC_safe_push (tree, heap, overlaps, sv->var); VEC_safe_push (tree, heap, overlaps, subvar);
} }
gcc_assert (overlaps != NULL); gcc_assert (overlaps != NULL);
} }
...@@ -3610,8 +3616,8 @@ new_type_alias (tree ptr, tree var, tree expr) ...@@ -3610,8 +3616,8 @@ new_type_alias (tree ptr, tree var, tree expr)
On mem-ssa branch, the scanning for virtual operands have been On mem-ssa branch, the scanning for virtual operands have been
split from the rest of tree-ssa-operands, so it should be much split from the rest of tree-ssa-operands, so it should be much
easier to fix this problem correctly once mem-ssa is merged. */ easier to fix this problem correctly once mem-ssa is merged. */
for (sv = svars; sv; sv = sv->next) for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
VEC_safe_push (tree, heap, overlaps, sv->var); VEC_safe_push (tree, heap, overlaps, subvar);
gcc_assert (overlaps != NULL); gcc_assert (overlaps != NULL);
} }
...@@ -3873,15 +3879,14 @@ create_overlap_variables_for (tree var) ...@@ -3873,15 +3879,14 @@ create_overlap_variables_for (tree var)
/* Otherwise, create the variables. */ /* Otherwise, create the variables. */
subvars = lookup_subvars_for_var (var); subvars = lookup_subvars_for_var (var);
*subvars = VEC_alloc (tree, gc, VEC_length (fieldoff_s, fieldstack));
sort_fieldstack (fieldstack); sort_fieldstack (fieldstack);
for (i = VEC_length (fieldoff_s, fieldstack); for (i = 0; VEC_iterate (fieldoff_s, fieldstack, i, fo); ++i)
VEC_iterate (fieldoff_s, fieldstack, --i, fo);)
{ {
subvar_t sv;
HOST_WIDE_INT fosize; HOST_WIDE_INT fosize;
tree currfotype; tree currfotype, subvar;
fosize = TREE_INT_CST_LOW (fo->size); fosize = TREE_INT_CST_LOW (fo->size);
currfotype = fo->type; currfotype = fo->type;
...@@ -3900,26 +3905,24 @@ create_overlap_variables_for (tree var) ...@@ -3900,26 +3905,24 @@ create_overlap_variables_for (tree var)
&& fosize == lastfosize && fosize == lastfosize
&& currfotype == lastfotype)) && currfotype == lastfotype))
continue; continue;
sv = GGC_NEW (struct subvar); subvar = create_sft (var, fo->type, fo->offset,
sv->next = *subvars; fosize, fo->alias_set);
sv->var = VEC_quick_push (tree, *subvars, subvar);
create_sft (var, fo->type, fo->offset, fosize, fo->alias_set);
if (dump_file) if (dump_file)
{ {
fprintf (dump_file, "structure field tag %s created for var %s", fprintf (dump_file, "structure field tag %s created for var %s",
get_name (sv->var), get_name (var)); get_name (subvar), get_name (var));
fprintf (dump_file, " offset " HOST_WIDE_INT_PRINT_DEC, fprintf (dump_file, " offset " HOST_WIDE_INT_PRINT_DEC,
SFT_OFFSET (sv->var)); SFT_OFFSET (subvar));
fprintf (dump_file, " size " HOST_WIDE_INT_PRINT_DEC, fprintf (dump_file, " size " HOST_WIDE_INT_PRINT_DEC,
SFT_SIZE (sv->var)); SFT_SIZE (subvar));
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
lastfotype = currfotype; lastfotype = currfotype;
lastfooffset = fo->offset; lastfooffset = fo->offset;
lastfosize = fosize; lastfosize = fosize;
*subvars = sv;
} }
/* Once we have created subvars, the original is no longer call /* Once we have created subvars, the original is no longer call
......
...@@ -1421,20 +1421,23 @@ add_vars_for_offset (tree full_ref, tree var, HOST_WIDE_INT offset, ...@@ -1421,20 +1421,23 @@ add_vars_for_offset (tree full_ref, tree var, HOST_WIDE_INT offset,
{ {
bool added = false; bool added = false;
subvar_t sv = get_subvars_for_var (SFT_PARENT_VAR (var)); subvar_t sv = get_subvars_for_var (SFT_PARENT_VAR (var));
for (; sv; sv = sv->next) unsigned int i;
tree subvar;
for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
{ {
/* Once we hit the end of the parts that could touch, /* Once we hit the end of the parts that could touch,
stop looking. */ stop looking. */
if (size != -1 if (size != -1
&& SFT_OFFSET (var) + offset + size <= SFT_OFFSET (sv->var)) && SFT_OFFSET (var) + offset + size <= SFT_OFFSET (subvar))
break; break;
if (overlap_subvar (SFT_OFFSET (var) + offset, size, sv->var, NULL)) if (overlap_subvar (SFT_OFFSET (var) + offset, size, subvar, NULL))
{ {
added = true; added = true;
if (is_def) if (is_def)
append_vdef (sv->var); append_vdef (subvar);
else else
append_vuse (sv->var); append_vuse (subvar);
} }
} }
return added; return added;
...@@ -2092,9 +2095,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) ...@@ -2092,9 +2095,10 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
if (var_can_have_subvars (expr) if (var_can_have_subvars (expr)
&& (svars = get_subvars_for_var (expr))) && (svars = get_subvars_for_var (expr)))
{ {
subvar_t sv; unsigned int i;
for (sv = svars; sv; sv = sv->next) tree subvar;
add_stmt_operand (&sv->var, s_ann, flags); for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
add_stmt_operand (&subvar, s_ann, flags);
} }
else else
add_stmt_operand (expr_p, s_ann, flags); add_stmt_operand (expr_p, s_ann, flags);
...@@ -2137,18 +2141,19 @@ get_expr_operands (tree stmt, tree *expr_p, int flags) ...@@ -2137,18 +2141,19 @@ get_expr_operands (tree stmt, tree *expr_p, int flags)
ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize); ref = get_ref_base_and_extent (expr, &offset, &size, &maxsize);
if (SSA_VAR_P (ref) && get_subvars_for_var (ref)) if (SSA_VAR_P (ref) && get_subvars_for_var (ref))
{ {
subvar_t sv;
subvar_t svars = get_subvars_for_var (ref); subvar_t svars = get_subvars_for_var (ref);
unsigned int i;
tree subvar;
for (sv = svars; sv; sv = sv->next) for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
{ {
bool exact; bool exact;
if (overlap_subvar (offset, maxsize, sv->var, &exact)) if (overlap_subvar (offset, maxsize, subvar, &exact))
{ {
int subvar_flags = flags; int subvar_flags = flags;
none = false; none = false;
add_stmt_operand (&sv->var, s_ann, subvar_flags); add_stmt_operand (&subvar, s_ann, subvar_flags);
} }
} }
...@@ -2710,11 +2715,12 @@ add_to_addressable_set (tree ref, bitmap *addresses_taken) ...@@ -2710,11 +2715,12 @@ add_to_addressable_set (tree ref, bitmap *addresses_taken)
if (var_can_have_subvars (var) if (var_can_have_subvars (var)
&& (svars = get_subvars_for_var (var))) && (svars = get_subvars_for_var (var)))
{ {
subvar_t sv; unsigned int i;
for (sv = svars; sv; sv = sv->next) tree subvar;
for (i = 0; VEC_iterate (tree, svars, i, subvar); ++i)
{ {
bitmap_set_bit (*addresses_taken, DECL_UID (sv->var)); bitmap_set_bit (*addresses_taken, DECL_UID (subvar));
TREE_ADDRESSABLE (sv->var) = 1; TREE_ADDRESSABLE (subvar) = 1;
} }
} }
else else
......
...@@ -4702,7 +4702,6 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed, ...@@ -4702,7 +4702,6 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed,
{ {
unsigned int i; unsigned int i;
bitmap_iterator bi; bitmap_iterator bi;
subvar_t sv;
alias_set_type ptr_alias_set = get_alias_set (TREE_TYPE (ptr)); alias_set_type ptr_alias_set = get_alias_set (TREE_TYPE (ptr));
EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (from, 0, i, bi)
...@@ -4717,10 +4716,14 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed, ...@@ -4717,10 +4716,14 @@ set_uids_in_ptset (tree ptr, bitmap into, bitmap from, bool is_derefed,
if (vi->has_union && get_subvars_for_var (vi->decl) != NULL) if (vi->has_union && get_subvars_for_var (vi->decl) != NULL)
{ {
unsigned int i;
tree subvar;
subvar_t sv = get_subvars_for_var (vi->decl);
/* Variables containing unions may need to be converted to /* Variables containing unions may need to be converted to
their SFT's, because SFT's can have unions and we cannot. */ their SFT's, because SFT's can have unions and we cannot. */
for (sv = get_subvars_for_var (vi->decl); sv; sv = sv->next) for (i = 0; VEC_iterate (tree, sv, i, subvar); ++i)
bitmap_set_bit (into, DECL_UID (sv->var)); bitmap_set_bit (into, DECL_UID (subvar));
} }
else if (TREE_CODE (vi->decl) == VAR_DECL else if (TREE_CODE (vi->decl) == VAR_DECL
|| TREE_CODE (vi->decl) == PARM_DECL || TREE_CODE (vi->decl) == PARM_DECL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment