diff mbox series

Fix PR90738

Message ID alpine.LSU.2.20.1906041005310.10704@zhemvz.fhfr.qr
State New
Headers show
Series Fix PR90738 | expand

Commit Message

Richard Biener June 4, 2019, 8:05 a.m. UTC
Committed to trunk.

Richard.

2019-06-04  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/90738
	Revert
	2019-06-03  Richard Biener  <rguenther@suse.de>

	* tree-ssa-sccvn.c (ao_ref_init_from_vn_reference): Get original
	full reference tree and record in ref->ref.
	(vn_reference_lookup_3): Pass in original ref to
	ao_ref_init_from_vn_reference.
	(vn_reference_lookup): Likewise.
	* tree-ssa-sccvn.h (ao_ref_init_from_vn_reference): Adjust prototype.
	* tree-ssa-alias.c (nonoverlapping_component_refs_of_decl_p):
	Handle non-decl bases in the original reference.

	* gcc.dg/tree-ssa/alias-access-path-1.c: Scan fre1.

	* gcc.dg/torture/pr90738.c: New testcase.
diff mbox series

Patch

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 271859)
+++ gcc/tree-ssa-sccvn.c	(revision 271860)
@@ -995,7 +995,7 @@  copy_reference_ops_from_ref (tree ref, v
 bool
 ao_ref_init_from_vn_reference (ao_ref *ref,
 			       alias_set_type set, tree type,
-			       vec<vn_reference_op_s> ops)
+			       vec<vn_reference_op_s> ops, tree orig_ref)
 {
   vn_reference_op_t op;
   unsigned i;
@@ -1149,7 +1149,7 @@  ao_ref_init_from_vn_reference (ao_ref *r
   if (base == NULL_TREE)
     return false;
 
-  ref->ref = NULL_TREE;
+  ref->ref = orig_ref;
   ref->base = base;
   ref->ref_alias_set = set;
   if (base_alias_set != -1)
@@ -1976,7 +1976,8 @@  vn_reference_lookup_3 (ao_ref *ref, tree
 	{
 	  lhs_ref_ok = ao_ref_init_from_vn_reference (&lhs_ref,
 						      get_alias_set (lhs),
-						      TREE_TYPE (lhs), lhs_ops);
+						      TREE_TYPE (lhs), lhs_ops,
+						      lhs);
 	  if (lhs_ref_ok
 	      && !refs_may_alias_p_1 (ref, &lhs_ref, true))
 	    {
@@ -2718,7 +2719,7 @@  vn_reference_lookup (tree op, tree vuse,
          Otherwise preserve the full reference for advanced TBAA.  */
       if (!valuezied_anything
 	  || !ao_ref_init_from_vn_reference (&r, vr1.set, vr1.type,
-					     vr1.operands))
+					     vr1.operands, op))
 	ao_ref_init (&r, op);
       if (! tbaa_p)
 	r.ref_alias_set = r.base_alias_set = 0;
Index: gcc/tree-ssa-sccvn.h
===================================================================
--- gcc/tree-ssa-sccvn.h	(revision 271859)
+++ gcc/tree-ssa-sccvn.h	(revision 271860)
@@ -229,7 +229,7 @@  vn_nary_op_t vn_nary_op_insert (tree, tr
 vn_nary_op_t vn_nary_op_insert_pieces (unsigned int, enum tree_code,
 				       tree, tree *, tree, unsigned int);
 bool ao_ref_init_from_vn_reference (ao_ref *, alias_set_type, tree,
-				    vec<vn_reference_op_s> );
+				    vec<vn_reference_op_s>, tree = NULL_TREE);
 vec<vn_reference_op_s> vn_reference_operands_for_lookup (tree);
 tree vn_reference_lookup_pieces (tree, alias_set_type, tree,
 				 vec<vn_reference_op_s> ,
Index: gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c	(revision 271859)
+++ gcc/testsuite/gcc.dg/tree-ssa/alias-access-path-1.c	(revision 271860)
@@ -1,5 +1,6 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-fre3 -fno-tree-sra" } */
+/* { dg-options "-O2 -fdump-tree-fre1 -fno-tree-sra" } */
+
 struct foo
 {
   int val;
@@ -18,4 +19,4 @@  test ()
   return barptr->val2;
 }
 
-/* { dg-final { scan-tree-dump-times "return 123" 1 "fre3"} } */
+/* { dg-final { scan-tree-dump-times "return 123" 1 "fre1"} } */
Index: gcc/tree-ssa-alias.c
===================================================================
--- gcc/tree-ssa-alias.c	(revision 271859)
+++ gcc/tree-ssa-alias.c	(revision 271860)
@@ -1013,7 +1013,8 @@  nonoverlapping_component_refs_of_decl_p
     }
   if (TREE_CODE (ref1) == MEM_REF)
     {
-      if (!integer_zerop (TREE_OPERAND (ref1, 1)))
+      if (!integer_zerop (TREE_OPERAND (ref1, 1))
+	  || TREE_CODE (TREE_OPERAND (ref1, 0)) != ADDR_EXPR)
 	return false;
       ref1 = TREE_OPERAND (TREE_OPERAND (ref1, 0), 0);
     }
@@ -1026,7 +1027,8 @@  nonoverlapping_component_refs_of_decl_p
     }
   if (TREE_CODE (ref2) == MEM_REF)
     {
-      if (!integer_zerop (TREE_OPERAND (ref2, 1)))
+      if (!integer_zerop (TREE_OPERAND (ref2, 1))
+	  || TREE_CODE (TREE_OPERAND (ref2, 0)) != ADDR_EXPR)
 	return false;
       ref2 = TREE_OPERAND (TREE_OPERAND (ref2, 0), 0);
     }
Index: gcc/testsuite/gcc.dg/torture/pr90738.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr90738.c	(nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr90738.c	(working copy)
@@ -0,0 +1,20 @@ 
+/* { dg-do run } */
+
+int __attribute__((noipa,noinline))
+foo (int i)
+{
+  int a[2];
+  a[1] = 1;
+  int j = a[1];
+  int *p = &a[0];
+  p[i] = 0;
+  return a[j];
+}
+
+int
+main()
+{
+  if (foo (1) != 0)
+    __builtin_abort ();
+  return 0;
+}