summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-dfa.c19
2 files changed, 23 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2a77cf8a207..d036e0318ac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-05-24 Richard Guenther <rguenther@suse.de>
+
+ * tree-dfa.c (refs_may_alias_p): Re-instantiate case that
+ a scalar variable can be only accessed through a pointer
+ or a union.
+
2008-05-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtins.c (fold_builtin_fpclassify): Fix spelling of FP_INFINITE.
diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c
index 02d2139d3b3..7e4bb7681b7 100644
--- a/gcc/tree-dfa.c
+++ b/gcc/tree-dfa.c
@@ -1078,8 +1078,23 @@ refs_may_alias_p (tree ref1, tree ref2)
/* If one base is a ref-all pointer weird things are allowed. */
strict_aliasing_applies = (flag_strict_aliasing
- && get_alias_set (base1) != 0
- && get_alias_set (base2) != 0);
+ && (!INDIRECT_REF_P (base1)
+ || get_alias_set (base1) != 0)
+ && (!INDIRECT_REF_P (base2)
+ || get_alias_set (base2) != 0));
+
+ /* If strict aliasing applies the only way to access a scalar variable
+ is through a pointer dereference or through a union (gcc extension). */
+ if (strict_aliasing_applies
+ && ((SSA_VAR_P (ref2)
+ && !AGGREGATE_TYPE_P (TREE_TYPE (ref2))
+ && !INDIRECT_REF_P (ref1)
+ && TREE_CODE (TREE_TYPE (base1)) != UNION_TYPE)
+ || (SSA_VAR_P (ref1)
+ && !AGGREGATE_TYPE_P (TREE_TYPE (ref1))
+ && !INDIRECT_REF_P (ref2)
+ && TREE_CODE (TREE_TYPE (base2)) != UNION_TYPE)))
+ return false;
/* If both references are through the same type, or if strict aliasing
doesn't apply they are through two same pointers, they do not alias