From 737f500a0bb2cfdf1e28975a27403e555ede633e Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Tue, 28 Mar 2017 10:10:01 +0000
Subject: [PATCH] re PR middle-end/80222 (may_alias folded away)

2017-03-28  Richard Biener  <rguenther@suse.de>

	PR middle-end/80222
	* gimple-fold.c (gimple_fold_indirect_ref): Do not touch
	TYPE_REF_CAN_ALIAS_ALL references.
	* fold-const.c (fold_indirect_ref_1): Likewise.

	* g++.dg/pr80222.C: New testcase.

From-SVN: r246527
---
 gcc/ChangeLog                  |  7 +++++++
 gcc/fold-const.c               |  3 ++-
 gcc/gimple-fold.c              |  7 ++++---
 gcc/testsuite/ChangeLog        |  5 +++++
 gcc/testsuite/g++.dg/pr80222.C | 13 +++++++++++++
 5 files changed, 31 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/pr80222.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 27e7b8f0a752..7274aa4e7a6e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-03-28  Richard Biener  <rguenther@suse.de>
+
+	PR middle-end/80222
+	* gimple-fold.c (gimple_fold_indirect_ref): Do not touch
+	TYPE_REF_CAN_ALIAS_ALL references.
+	* fold-const.c (fold_indirect_ref_1): Likewise.
+
 2017-03-28  Martin Liska  <mliska@suse.cz>
 
 	PR ipa/80104
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 6db16b514f1f..fb54ffa0e5e0 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -14006,7 +14006,8 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0)
 
   STRIP_NOPS (sub);
   subtype = TREE_TYPE (sub);
-  if (!POINTER_TYPE_P (subtype))
+  if (!POINTER_TYPE_P (subtype)
+      || TYPE_REF_CAN_ALIAS_ALL (TREE_TYPE (op0)))
     return NULL_TREE;
 
   if (TREE_CODE (sub) == ADDR_EXPR)
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 3094b54c109d..a6a958cefa4c 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -6539,8 +6539,8 @@ gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo,
   return gimple_get_virt_method_for_vtable (token, v, offset, can_refer);
 }
 
-/* Given a pointer value OP0, return a simplified version of an
-   indirection through OP0, or NULL_TREE if no simplification is
+/* Given a pointer value T, return a simplified version of an
+   indirection through T, or NULL_TREE if no simplification is
    possible.  Note that the resulting type may be different from
    the type pointed to in the sense that it is still compatible
    from the langhooks point of view. */
@@ -6554,7 +6554,8 @@ gimple_fold_indirect_ref (tree t)
 
   STRIP_NOPS (sub);
   subtype = TREE_TYPE (sub);
-  if (!POINTER_TYPE_P (subtype))
+  if (!POINTER_TYPE_P (subtype)
+      || TYPE_REF_CAN_ALIAS_ALL (ptype))
     return NULL_TREE;
 
   if (TREE_CODE (sub) == ADDR_EXPR)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a896f7537198..4abe1dc0cfaf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-28  Richard Biener  <rguenther@suse.de>
+
+	PR middle-end/80222
+	* g++.dg/pr80222.C: New testcase.
+
 2017-03-28  Martin Liska  <mliska@suse.cz>
 
 	PR ipa/80104
diff --git a/gcc/testsuite/g++.dg/pr80222.C b/gcc/testsuite/g++.dg/pr80222.C
new file mode 100644
index 000000000000..ed1b37f5e374
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr80222.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-optimized" } */
+
+struct C { int i; }__attribute__((may_alias)) ;
+
+C a, b;
+
+int main()
+{
+  a = static_cast <C&> (b);
+}
+
+// { dg-final { scan-tree-dump "{ref-all}\\\)&b\];" "optimized" } } */
-- 
GitLab