From 14cd91f923c6977d085287a91b26b32919754047 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 5 Dec 2011 14:31:44 +0000 Subject: [PATCH] tree-ssa-alias.h (struct ao_ref_s): Add volatile_p field. 2011-12-05 Richard Guenther * 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. From-SVN: r182009 --- gcc/ChangeLog | 11 +++++++++++ gcc/tree-ssa-alias.c | 17 +++++++++++++++++ gcc/tree-ssa-alias.h | 3 +++ gcc/tree-ssa-sccvn.c | 2 ++ 4 files changed, 33 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f36a0cac8d..d49646cd75a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-12-05 Richard Guenther + + * 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. + 2011-12-05 Richard Guenther * tree-ssa.c (verify_ssa): Verify SSA names in the loop 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) diff --git a/gcc/tree-ssa-alias.h b/gcc/tree-ssa-alias.h index 74921231045..59f0ebca953 100644 --- a/gcc/tree-ssa-alias.h +++ b/gcc/tree-ssa-alias.h @@ -86,6 +86,9 @@ typedef struct ao_ref_s /* The alias set of the base object or -1 if not yet computed. */ alias_set_type base_alias_set; + + /* Whether the memory is considered a volatile access. */ + bool volatile_p; } ao_ref; diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index fa268c2ef8b..274def32d5a 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -918,6 +918,8 @@ ao_ref_init_from_vn_reference (ao_ref *ref, ref->base_alias_set = base_alias_set; else ref->base_alias_set = get_alias_set (base); + /* We discount volatiles from value-numbering elsewhere. */ + ref->volatile_p = false; return true; } -- 2.30.2