aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-alias.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-12-05 14:31:44 +0000
committerRichard Guenther <rguenther@suse.de>2011-12-05 14:31:44 +0000
commit7c5066e7bbfcc6e0871ea34161e9cd871fbe4293 (patch)
tree337d4dd6961a88c69b24dda561d596121394e7e4 /gcc/tree-ssa-alias.c
parent170c1f10f7d32cc5cec5671a000ef4160a6b1ca8 (diff)
2011-12-05 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.h (struct ao_ref_s): Add volatile_p field. * tree-ssa-alias.c (ao_ref_init): Initialize it. (ao_ref_init_from_ptr_and_size): Likewise. (refs_may_alias_p_1): Two volatile accesses conflict. (ref_maybe_used_by_call_p_1): Likewise. (call_may_clobber_ref_p_1): Likewise. * tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Initialize volatile_p field. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@182009 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-alias.c')
-rw-r--r--gcc/tree-ssa-alias.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index cd222093579..21dc5fbcc51 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -456,6 +456,7 @@ ao_ref_init (ao_ref *r, tree ref)
r->max_size = -1;
r->ref_alias_set = -1;
r->base_alias_set = -1;
+ r->volatile_p = ref ? TREE_THIS_VOLATILE (ref) : false;
}
/* Returns the base object of the memory reference *REF. */
@@ -525,6 +526,7 @@ ao_ref_init_from_ptr_and_size (ao_ref *ref, tree ptr, tree size)
ref->max_size = ref->size = -1;
ref->ref_alias_set = 0;
ref->base_alias_set = 0;
+ ref->volatile_p = false;
}
/* Return 1 if TYPE1 and TYPE2 are to be considered equivalent for the
@@ -1021,6 +1023,11 @@ refs_may_alias_p_1 (ao_ref *ref1, ao_ref *ref2, bool tbaa_p)
|| TREE_CODE (base2) == LABEL_DECL)
return true;
+ /* Two volatile accesses always conflict. */
+ if (ref1->volatile_p
+ && ref2->volatile_p)
+ return true;
+
/* Defer to simple offset based disambiguation if we have
references based on two decls. Do this before defering to
TBAA to handle must-alias cases in conformance with the
@@ -1144,6 +1151,11 @@ ref_maybe_used_by_call_p_1 (gimple call, ao_ref *ref)
if (!base)
return true;
+ /* A call that is not without side-effects might involve volatile
+ accesses and thus conflicts with all other volatile accesses. */
+ if (ref->volatile_p)
+ return true;
+
/* If the reference is based on a decl that is not aliased the call
cannot possibly use it. */
if (DECL_P (base)
@@ -1477,6 +1489,11 @@ call_may_clobber_ref_p_1 (gimple call, ao_ref *ref)
|| CONSTANT_CLASS_P (base))
return false;
+ /* A call that is not without side-effects might involve volatile
+ accesses and thus conflicts with all other volatile accesses. */
+ if (ref->volatile_p)
+ return true;
+
/* If the reference is based on a decl that is not aliased the call
cannot possibly clobber it. */
if (DECL_P (base)