Commit c1b763fa by Diego Novillo Committed by Diego Novillo

tree-optimize.c (init_tree_optimization_passes): Schedule pass_may_alias right…

tree-optimize.c (init_tree_optimization_passes): Schedule pass_may_alias right after the program is renamed into SSA.


	* tree-optimize.c (init_tree_optimization_passes): Schedule
	pass_may_alias right after the program is renamed into SSA.
	* tree-pass.h (PROP_alias): Define.
	* tree-outof-ssa.c (pass_del_ssa): Require PROP_alias.
	* tree-sra.c (pass_sra): Likewise.
	* tree-ssa-ccp.c (pass_ccp): Likewise.
	* tree-ssa-copyrename.c (pass_rename_ssa_ccp): Likewise.
	* tree-ssa-dce.c (pass_dce): Likewise.
	* tree-ssa-dom.c (pass_dominator): Likewise.
	* tree-ssa-dse.c (pass_dse): Likewise.
	* tree-ssa-forwprop.c (pass_forwprop): Likewise.
	* tree-ssa-loop-ch.c (pass_ch): Likewise.
	* tree-ssa-phiopt.c (pass_phiopt): Likewise.
	* tree-ssa-pre.c (pass_pre): Likewise.
	* tree-tailcall.c (pass_tail_recursion): Likewise.
	* tree-ssa.c (pass_redundant_phi): Likewise.
	* tree-ssa-alias.c (aliases_computed_p): Remove.
	Update all users.
	(init_alias_info): Do not mark all type tags for renaming
	unconditionally.
	Clear may_aliases from every symbol.
	(setup_pointers_and_addressables): If a pointer has not been
	dereferenced and it had a type tag, clear it and mark the old
	tag for renaming.


testsuite/ChangeLog

	* gcc.dg/tree-ssa/20030714-2.c: Adjust number of expected
	conditionals.
	* gcc.dg/tree-ssa/20031022-1.c: Adjust number of expected
	loads.
	* gcc.dg/tree-ssa/ssa-dom-cse-1.c: Expect optimization in
	DOM1.

From-SVN: r85255
parent 58907cda
2004-07-28 Diego Novillo <dnovillo@redhat.com> 2004-07-28 Diego Novillo <dnovillo@redhat.com>
* tree-optimize.c (init_tree_optimization_passes): Schedule
pass_may_alias right after the program is renamed into SSA.
* tree-pass.h (PROP_alias): Define.
* tree-outof-ssa.c (pass_del_ssa): Require PROP_alias.
* tree-sra.c (pass_sra): Likewise.
* tree-ssa-ccp.c (pass_ccp): Likewise.
* tree-ssa-copyrename.c (pass_rename_ssa_ccp): Likewise.
* tree-ssa-dce.c (pass_dce): Likewise.
* tree-ssa-dom.c (pass_dominator): Likewise.
* tree-ssa-dse.c (pass_dse): Likewise.
* tree-ssa-forwprop.c (pass_forwprop): Likewise.
* tree-ssa-loop-ch.c (pass_ch): Likewise.
* tree-ssa-phiopt.c (pass_phiopt): Likewise.
* tree-ssa-pre.c (pass_pre): Likewise.
* tree-tailcall.c (pass_tail_recursion): Likewise.
* tree-ssa.c (pass_redundant_phi): Likewise.
* tree-ssa-alias.c (aliases_computed_p): Remove.
Update all users.
(init_alias_info): Do not mark all type tags for renaming
unconditionally.
Clear may_aliases from every symbol.
(setup_pointers_and_addressables): If a pointer has not been
dereferenced and it had a type tag, clear it and mark the old
tag for renaming.
2004-07-28 Diego Novillo <dnovillo@redhat.com>
PR tree-optimization/16705 PR tree-optimization/16705
* tree-ssa-alias.c (create_global_var): Set DECL_EXTERNAL on * tree-ssa-alias.c (create_global_var): Set DECL_EXTERNAL on
.GLOBAL_VAR. .GLOBAL_VAR.
......
2004-07-28 Diego Novillo <dnovillo@redhat.com>
* gcc.dg/tree-ssa/20030714-2.c: Adjust number of expected
conditionals.
* gcc.dg/tree-ssa/20031022-1.c: Adjust number of expected
loads.
* gcc.dg/tree-ssa/ssa-dom-cse-1.c: Expect optimization in
DOM1.
2004-07-27 Andrew Pinski <apinski@apple.com> 2004-07-27 Andrew Pinski <apinski@apple.com>
* g++.dg/rtti/tinfo1.C: Correct the xfail. * g++.dg/rtti/tinfo1.C: Correct the xfail.
......
...@@ -32,8 +32,8 @@ get_alias_set (t) ...@@ -32,8 +32,8 @@ get_alias_set (t)
} }
} }
/* There should be exactly four IF conditionals if we thread jumps /* There should be exactly three IF conditionals if we thread jumps
properly. */ properly. */
/* { dg-final { scan-tree-dump-times "if " 4 "dom3"} } */ /* { dg-final { scan-tree-dump-times "if " 3 "dom3"} } */
...@@ -23,5 +23,5 @@ blah (int arf) ...@@ -23,5 +23,5 @@ blah (int arf)
foo (e); foo (e);
} }
/* There should be two loads from entry_exit_blocks[1].pred. */ /* There should be one load from entry_exit_blocks[1].pred. */
/* { dg-final { scan-tree-dump-times "entry_exit_blocks.1..pred" 2 "dom1"} } */ /* { dg-final { scan-tree-dump-times "entry_exit_blocks.1..pred" 2 "dom1"} } */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dom2-details" } */ /* { dg-options "-O2 -fdump-tree-dom1-details" } */
int t(int a) __attribute__ ((const)); int t(int a) __attribute__ ((const));
void q (void); void q (void);
void void
...@@ -11,6 +11,5 @@ threading(int a,int b) ...@@ -11,6 +11,5 @@ threading(int a,int b)
q(); q();
} }
} }
/* We should thread the jump twice and eliminate it. Test this in /* We should thread the jump twice and eliminate it. */
DOM2, after aliases have been computed. */ /* { dg-final { scan-tree-dump-times "Replaced.* t " 1 "dom1"} } */
/* { dg-final { scan-tree-dump-times "Replaced.* t " 1 "dom2"} } */
...@@ -321,6 +321,7 @@ init_tree_optimization_passes (void) ...@@ -321,6 +321,7 @@ init_tree_optimization_passes (void)
NEXT_PASS (pass_referenced_vars); NEXT_PASS (pass_referenced_vars);
NEXT_PASS (pass_build_pta); NEXT_PASS (pass_build_pta);
NEXT_PASS (pass_build_ssa); NEXT_PASS (pass_build_ssa);
NEXT_PASS (pass_may_alias);
NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_early_warn_uninitialized); NEXT_PASS (pass_early_warn_uninitialized);
NEXT_PASS (pass_dce); NEXT_PASS (pass_dce);
......
...@@ -2213,7 +2213,7 @@ struct tree_opt_pass pass_del_ssa = ...@@ -2213,7 +2213,7 @@ struct tree_opt_pass pass_del_ssa =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_SSA_TO_NORMAL, /* tv_id */ TV_TREE_SSA_TO_NORMAL, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
/* ??? If TER is enabled, we also kill gimple. */ /* ??? If TER is enabled, we also kill gimple. */
PROP_ssa, /* properties_destroyed */ PROP_ssa, /* properties_destroyed */
......
...@@ -76,6 +76,7 @@ struct tree_opt_pass ...@@ -76,6 +76,7 @@ struct tree_opt_pass
#define PROP_ssa (1 << 6) #define PROP_ssa (1 << 6)
#define PROP_no_crit_edges (1 << 7) #define PROP_no_crit_edges (1 << 7)
#define PROP_rtl (1 << 8) #define PROP_rtl (1 << 8)
#define PROP_alias (1 << 9)
#define PROP_trees \ #define PROP_trees \
(PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh) (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh)
......
...@@ -2118,7 +2118,7 @@ struct tree_opt_pass pass_sra = ...@@ -2118,7 +2118,7 @@ struct tree_opt_pass pass_sra =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_SRA, /* tv_id */ TV_TREE_SRA, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -175,13 +175,6 @@ bitmap call_clobbered_vars; ...@@ -175,13 +175,6 @@ bitmap call_clobbered_vars;
variable). */ variable). */
bitmap addressable_vars; bitmap addressable_vars;
/* 'true' after aliases have been computed (see compute_may_aliases). This
is used by get_stmt_operands and its helpers to determine what to do
when scanning an operand for a variable that may be aliased. If
may-alias information is still not available, the statement is marked as
having volatile operands. */
bool aliases_computed_p;
/* When the program has too many call-clobbered variables and call-sites, /* When the program has too many call-clobbered variables and call-sites,
this variable is used to represent the clobbering effects of function this variable is used to represent the clobbering effects of function
calls. In these cases, all the call clobbered variables in the program calls. In these cases, all the call clobbered variables in the program
...@@ -350,9 +343,6 @@ compute_may_aliases (void) ...@@ -350,9 +343,6 @@ compute_may_aliases (void)
/* Deallocate memory used by aliasing data structures. */ /* Deallocate memory used by aliasing data structures. */
delete_alias_info (ai); delete_alias_info (ai);
/* Indicate that may-alias information is now available. */
aliases_computed_p = true;
} }
struct tree_opt_pass pass_may_alias = struct tree_opt_pass pass_may_alias =
...@@ -365,7 +355,7 @@ struct tree_opt_pass pass_may_alias = ...@@ -365,7 +355,7 @@ struct tree_opt_pass pass_may_alias =
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_MAY_ALIAS, /* tv_id */ TV_TREE_MAY_ALIAS, /* tv_id */
PROP_cfg | PROP_ssa | PROP_pta, /* properties_required */ PROP_cfg | PROP_ssa | PROP_pta, /* properties_required */
0, /* properties_provided */ PROP_alias, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
TODO_dump_func | TODO_rename_vars TODO_dump_func | TODO_rename_vars
...@@ -379,6 +369,7 @@ static struct alias_info * ...@@ -379,6 +369,7 @@ static struct alias_info *
init_alias_info (void) init_alias_info (void)
{ {
struct alias_info *ai; struct alias_info *ai;
static bool aliases_computed_p = false;
ai = xcalloc (1, sizeof (struct alias_info)); ai = xcalloc (1, sizeof (struct alias_info));
ai->ssa_names_visited = BITMAP_XMALLOC (); ai->ssa_names_visited = BITMAP_XMALLOC ();
...@@ -417,14 +408,8 @@ init_alias_info (void) ...@@ -417,14 +408,8 @@ init_alias_info (void)
for (i = 0; i < num_referenced_vars; i++) for (i = 0; i < num_referenced_vars; i++)
{ {
var_ann_t ann = var_ann (referenced_var (i)); var_ann_t ann = var_ann (referenced_var (i));
ann->is_alias_tag = 0; ann->is_alias_tag = 0;
if (ann->type_mem_tag) ann->may_aliases = NULL;
{
var_ann_t tag_ann = var_ann (ann->type_mem_tag);
tag_ann->may_aliases = NULL;
bitmap_set_bit (vars_to_rename, tag_ann->uid);
}
} }
/* Clear flow-sensitive points-to information from each SSA name. */ /* Clear flow-sensitive points-to information from each SSA name. */
...@@ -450,12 +435,13 @@ init_alias_info (void) ...@@ -450,12 +435,13 @@ init_alias_info (void)
pi->is_dereferenced = 0; pi->is_dereferenced = 0;
if (pi->pt_vars) if (pi->pt_vars)
bitmap_clear (pi->pt_vars); bitmap_clear (pi->pt_vars);
if (pi->name_mem_tag)
var_ann (pi->name_mem_tag)->may_aliases = NULL;
} }
} }
} }
/* Next time, we will need to reset alias information. */
aliases_computed_p = true;
return ai; return ai;
} }
...@@ -1375,48 +1361,65 @@ setup_pointers_and_addressables (struct alias_info *ai) ...@@ -1375,48 +1361,65 @@ setup_pointers_and_addressables (struct alias_info *ai)
/* Add pointer variables that have been dereferenced to the POINTERS /* Add pointer variables that have been dereferenced to the POINTERS
array and create a type memory tag for them. */ array and create a type memory tag for them. */
if (POINTER_TYPE_P (TREE_TYPE (var)) if (POINTER_TYPE_P (TREE_TYPE (var)))
&& (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid) {
if ((bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid)
|| bitmap_bit_p (ai->dereferenced_ptrs_load, v_ann->uid))) || bitmap_bit_p (ai->dereferenced_ptrs_load, v_ann->uid)))
{ {
tree tag; tree tag;
var_ann_t t_ann; var_ann_t t_ann;
/* If pointer VAR still doesn't have a memory tag associated /* If pointer VAR still doesn't have a memory tag
with it, create it now or re-use an existing one. */ associated with it, create it now or re-use an
existing one. */
tag = get_tmt_for (var, ai); tag = get_tmt_for (var, ai);
t_ann = var_ann (tag); t_ann = var_ann (tag);
/* The type tag will need to be renamed into SSA afterwards. /* The type tag will need to be renamed into SSA
Note that we cannot do this inside get_tmt_for because afterwards. Note that we cannot do this inside
aliasing may run multiple times and we only create type get_tmt_for because aliasing may run multiple times
tags the first time. */ and we only create type tags the first time. */
bitmap_set_bit (vars_to_rename, t_ann->uid); bitmap_set_bit (vars_to_rename, t_ann->uid);
/* Associate the tag with pointer VAR. */ /* Associate the tag with pointer VAR. */
v_ann->type_mem_tag = tag; v_ann->type_mem_tag = tag;
/* If pointer VAR has been used in a store operation, then its /* If pointer VAR has been used in a store operation,
memory tag must be marked as written-to. */ then its memory tag must be marked as written-to. */
if (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid)) if (bitmap_bit_p (ai->dereferenced_ptrs_store, v_ann->uid))
bitmap_set_bit (ai->written_vars, t_ann->uid); bitmap_set_bit (ai->written_vars, t_ann->uid);
/* If pointer VAR is a global variable or a PARM_DECL, then its /* If pointer VAR is a global variable or a PARM_DECL,
memory tag should be considered a global variable. */ then its memory tag should be considered a global
variable. */
if (TREE_CODE (var) == PARM_DECL || needs_to_live_in_memory (var)) if (TREE_CODE (var) == PARM_DECL || needs_to_live_in_memory (var))
mark_call_clobbered (tag); mark_call_clobbered (tag);
/* All the dereferences of pointer VAR count as references of /* All the dereferences of pointer VAR count as
TAG. Since TAG can be associated with several pointers, add references of TAG. Since TAG can be associated with
the dereferences of VAR to the TAG. We may need to grow several pointers, add the dereferences of VAR to the
AI->NUM_REFERENCES because we have been adding name and TAG. We may need to grow AI->NUM_REFERENCES because
type tags. */ we have been adding name and type tags. */
if (t_ann->uid >= VARRAY_SIZE (ai->num_references)) if (t_ann->uid >= VARRAY_SIZE (ai->num_references))
VARRAY_GROW (ai->num_references, t_ann->uid + 10); VARRAY_GROW (ai->num_references, t_ann->uid + 10);
VARRAY_UINT (ai->num_references, t_ann->uid) VARRAY_UINT (ai->num_references, t_ann->uid)
+= VARRAY_UINT (ai->num_references, v_ann->uid); += VARRAY_UINT (ai->num_references, v_ann->uid);
} }
else
{
/* The pointer has not been dereferenced. If it had a
type memory tag, remove it and mark the old tag for
renaming to remove it out of the IL. */
var_ann_t ann = var_ann (var);
tree tag = ann->type_mem_tag;
if (tag)
{
bitmap_set_bit (vars_to_rename, var_ann (tag)->uid);
ann->type_mem_tag = NULL_TREE;
}
}
}
} }
/* If we found no addressable variables, but we have more than one /* If we found no addressable variables, but we have more than one
......
...@@ -245,7 +245,7 @@ struct tree_opt_pass pass_ccp = ...@@ -245,7 +245,7 @@ struct tree_opt_pass pass_ccp =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_CCP, /* tv_id */ TV_TREE_CCP, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
...@@ -2704,7 +2704,7 @@ struct tree_opt_pass pass_fold_builtins = ...@@ -2704,7 +2704,7 @@ struct tree_opt_pass pass_fold_builtins =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
0, /* tv_id */ 0, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -391,7 +391,7 @@ struct tree_opt_pass pass_rename_ssa_copies = ...@@ -391,7 +391,7 @@ struct tree_opt_pass pass_rename_ssa_copies =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_COPY_RENAME, /* tv_id */ TV_TREE_COPY_RENAME, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -908,7 +908,7 @@ struct tree_opt_pass pass_dce = ...@@ -908,7 +908,7 @@ struct tree_opt_pass pass_dce =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_DCE, /* tv_id */ TV_TREE_DCE, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
...@@ -924,7 +924,7 @@ struct tree_opt_pass pass_cd_dce = ...@@ -924,7 +924,7 @@ struct tree_opt_pass pass_cd_dce =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_CD_DCE, /* tv_id */ TV_TREE_CD_DCE, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -692,7 +692,7 @@ struct tree_opt_pass pass_dominator = ...@@ -692,7 +692,7 @@ struct tree_opt_pass pass_dominator =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */ TV_TREE_SSA_DOMINATOR_OPTS, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -437,7 +437,8 @@ struct tree_opt_pass pass_dse = { ...@@ -437,7 +437,8 @@ struct tree_opt_pass pass_dse = {
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_DSE, /* tv_id */ TV_TREE_DSE, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa
| PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -517,7 +517,8 @@ struct tree_opt_pass pass_forwprop = { ...@@ -517,7 +517,8 @@ struct tree_opt_pass pass_forwprop = {
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_FORWPROP, /* tv_id */ TV_TREE_FORWPROP, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa
| PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -340,7 +340,7 @@ struct tree_opt_pass pass_ch = ...@@ -340,7 +340,7 @@ struct tree_opt_pass pass_ch =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_CH, /* tv_id */ TV_TREE_CH, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -1137,13 +1137,6 @@ get_asm_expr_operands (tree stmt, voperands_t prev_vops) ...@@ -1137,13 +1137,6 @@ get_asm_expr_operands (tree stmt, voperands_t prev_vops)
add_stmt_operand (&var, stmt, opf_is_def, prev_vops); add_stmt_operand (&var, stmt, opf_is_def, prev_vops);
}); });
/* If we don't have call-clobbered nor addressable vars and we
still have not computed aliasing information, just mark the
statement as having volatile operands. If the alias pass
finds some, we will add them at that point. */
if (!aliases_computed_p)
stmt_ann (stmt)->has_volatile_ops = true;
break; break;
} }
} }
...@@ -1159,20 +1152,9 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags, ...@@ -1159,20 +1152,9 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags,
if (SSA_VAR_P (ptr)) if (SSA_VAR_P (ptr))
{ {
if (!aliases_computed_p)
{
/* If the pointer does not have a memory tag and aliases have not
been computed yet, mark the statement as having volatile
operands to prevent DOM from entering it in equivalence tables
and DCE from killing it. */
stmt_ann (stmt)->has_volatile_ops = true;
}
else
{
struct ptr_info_def *pi = NULL; struct ptr_info_def *pi = NULL;
/* If we have computed aliasing already, check if PTR has /* If PTR has flow-sensitive points-to information, use it. */
flow-sensitive points-to information. */
if (TREE_CODE (ptr) == SSA_NAME if (TREE_CODE (ptr) == SSA_NAME
&& (pi = SSA_NAME_PTR_INFO (ptr)) != NULL && (pi = SSA_NAME_PTR_INFO (ptr)) != NULL
&& pi->name_mem_tag) && pi->name_mem_tag)
...@@ -1204,10 +1186,10 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags, ...@@ -1204,10 +1186,10 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags,
if (TREE_CODE (ptr) == SSA_NAME) if (TREE_CODE (ptr) == SSA_NAME)
ptr = SSA_NAME_VAR (ptr); ptr = SSA_NAME_VAR (ptr);
ann = var_ann (ptr); ann = var_ann (ptr);
if (ann->type_mem_tag)
add_stmt_operand (&ann->type_mem_tag, stmt, flags, prev_vops); add_stmt_operand (&ann->type_mem_tag, stmt, flags, prev_vops);
} }
} }
}
/* If a constant is used as a pointer, we can't generate a real /* If a constant is used as a pointer, we can't generate a real
operand for it but we mark the statement volatile to prevent operand for it but we mark the statement volatile to prevent
...@@ -1272,8 +1254,6 @@ get_call_expr_operands (tree stmt, tree expr, voperands_t prev_vops) ...@@ -1272,8 +1254,6 @@ get_call_expr_operands (tree stmt, tree expr, voperands_t prev_vops)
else if (!(call_flags & (ECF_CONST | ECF_NORETURN))) else if (!(call_flags & (ECF_CONST | ECF_NORETURN)))
add_call_read_ops (stmt, prev_vops); add_call_read_ops (stmt, prev_vops);
} }
else if (!aliases_computed_p)
stmt_ann (stmt)->has_volatile_ops = true;
} }
...@@ -1348,13 +1328,6 @@ add_stmt_operand (tree *var_p, tree stmt, int flags, voperands_t prev_vops) ...@@ -1348,13 +1328,6 @@ add_stmt_operand (tree *var_p, tree stmt, int flags, voperands_t prev_vops)
aliases = v_ann->may_aliases; aliases = v_ann->may_aliases;
/* If alias information hasn't been computed yet, then
addressable variables will not be an alias tag nor will they
have aliases. In this case, mark the statement as having
volatile operands. */
if (!aliases_computed_p && may_be_aliased (var))
s_ann->has_volatile_ops = true;
if (aliases == NULL) if (aliases == NULL)
{ {
/* The variable is not aliased or it is an alias tag. */ /* The variable is not aliased or it is an alias tag. */
......
...@@ -669,7 +669,7 @@ struct tree_opt_pass pass_phiopt = ...@@ -669,7 +669,7 @@ struct tree_opt_pass pass_phiopt =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_PHIOPT, /* tv_id */ TV_TREE_PHIOPT, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -2076,7 +2076,8 @@ struct tree_opt_pass pass_pre = ...@@ -2076,7 +2076,8 @@ struct tree_opt_pass pass_pre =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_PRE, /* tv_id */ TV_TREE_PRE, /* tv_id */
PROP_no_crit_edges | PROP_cfg | PROP_ssa,/* properties_required */ PROP_no_crit_edges | PROP_cfg
| PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
...@@ -2107,7 +2108,7 @@ struct tree_opt_pass pass_fre = ...@@ -2107,7 +2108,7 @@ struct tree_opt_pass pass_fre =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
TV_TREE_FRE, /* tv_id */ TV_TREE_FRE, /* tv_id */
PROP_no_crit_edges | PROP_cfg | PROP_ssa,/* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -505,11 +505,8 @@ err: ...@@ -505,11 +505,8 @@ err:
static void static void
verify_alias_info (void) verify_alias_info (void)
{ {
if (aliases_computed_p)
{
verify_flow_sensitive_alias_info (); verify_flow_sensitive_alias_info ();
verify_flow_insensitive_alias_info (); verify_flow_insensitive_alias_info ();
}
} }
...@@ -677,7 +674,6 @@ init_tree_ssa (void) ...@@ -677,7 +674,6 @@ init_tree_ssa (void)
init_ssanames (); init_ssanames ();
init_phinodes (); init_phinodes ();
global_var = NULL_TREE; global_var = NULL_TREE;
aliases_computed_p = false;
} }
...@@ -710,7 +706,6 @@ delete_tree_ssa (void) ...@@ -710,7 +706,6 @@ delete_tree_ssa (void)
global_var = NULL_TREE; global_var = NULL_TREE;
BITMAP_XFREE (call_clobbered_vars); BITMAP_XFREE (call_clobbered_vars);
call_clobbered_vars = NULL; call_clobbered_vars = NULL;
aliases_computed_p = false;
BITMAP_XFREE (addressable_vars); BITMAP_XFREE (addressable_vars);
addressable_vars = NULL; addressable_vars = NULL;
} }
...@@ -1211,7 +1206,7 @@ struct tree_opt_pass pass_redundant_phi = ...@@ -1211,7 +1206,7 @@ struct tree_opt_pass pass_redundant_phi =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
0, /* tv_id */ 0, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
...@@ -937,7 +937,7 @@ struct tree_opt_pass pass_tail_recursion = ...@@ -937,7 +937,7 @@ struct tree_opt_pass pass_tail_recursion =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
0, /* tv_id */ 0, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
...@@ -953,7 +953,7 @@ struct tree_opt_pass pass_tail_calls = ...@@ -953,7 +953,7 @@ struct tree_opt_pass pass_tail_calls =
NULL, /* next */ NULL, /* next */
0, /* static_pass_number */ 0, /* static_pass_number */
0, /* tv_id */ 0, /* tv_id */
PROP_cfg | PROP_ssa, /* properties_required */ PROP_cfg | PROP_ssa | PROP_alias, /* properties_required */
0, /* properties_provided */ 0, /* properties_provided */
0, /* properties_destroyed */ 0, /* properties_destroyed */
0, /* todo_flags_start */ 0, /* todo_flags_start */
......
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