OSDN Git Service

2011-12-05 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Dec 2011 14:31:44 +0000 (14:31 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 5 Dec 2011 14:31:44 +0000 (14:31 +0000)
* 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: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182009 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-ssa-alias.c
gcc/tree-ssa-alias.h
gcc/tree-ssa-sccvn.c

index 5f36a0c..d49646c 100644 (file)
@@ -1,5 +1,16 @@
 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.
+
+2011-12-05  Richard Guenther  <rguenther@suse.de>
+
        * tree-ssa.c (verify_ssa): Verify SSA names in the loop
        over all SSA names.  Remove SSA operand checking, call
        verify_ssa_operands.
index cd22209..21dc5fb 100644 (file)
@@ -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)
index 7492123..59f0ebc 100644 (file)
@@ -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;
 
 
index fa268c2..274def3 100644 (file)
@@ -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;
 }