diff mbox series

tree-optimization/111444 - avoid insertions when skipping defs

Message ID 20240131124902.82A5A3858D1E@sourceware.org
State New
Headers show
Series tree-optimization/111444 - avoid insertions when skipping defs | expand

Commit Message

Richard Biener Jan. 31, 2024, 12:43 p.m. UTC
The following avoids inserting expressions for IPA CP discovered
equivalences into the VN hashtables when we are optimistically
skipping may-defs in the attempt to prove it's redundant.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

	PR tree-optimization/111444
	* tree-ssa-sccvn.cc (vn_reference_lookup_3): Do not use
	vn_reference_lookup_2 when optimistically skipping may-defs.

	* gcc.dg/torture/pr111444.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr111444.c | 26 +++++++++++++++++++++++++
 gcc/tree-ssa-sccvn.cc                   | 22 ++++++++++++---------
 2 files changed, 39 insertions(+), 9 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr111444.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr111444.c b/gcc/testsuite/gcc.dg/torture/pr111444.c
new file mode 100644
index 00000000000..e613f255803
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr111444.c
@@ -0,0 +1,26 @@ 
+/* { dg-do run } */
+
+int a = 3, d, e;
+int *b = &a;
+char c;
+short f;
+const int **g;
+static long h(int **i, int **j)
+{
+  const int *k[46];
+  const int **l = &k[5];
+  *j = &e;
+  g = l;
+  for (; d; d = d + 1)
+    ;
+  **i = 0;
+  return f;
+}
+int main()
+{
+  int *m = &a;
+  h(&m, &m);
+  c = *b;
+  if (c != 3)
+    __builtin_abort ();
+}
diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
index f0fa718a723..9bed9b3cc69 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -2790,25 +2790,29 @@  vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
 	    }
 	  else
 	    {
-	      tree *saved_last_vuse_ptr = data->last_vuse_ptr;
-	      /* Do not update last_vuse_ptr in vn_reference_lookup_2.  */
-	      data->last_vuse_ptr = NULL;
 	      tree saved_vuse = vr->vuse;
 	      hashval_t saved_hashcode = vr->hashcode;
-	      void *res = vn_reference_lookup_2 (ref, gimple_vuse (def_stmt),
-						 data);
+	      if (vr->vuse)
+		vr->hashcode = vr->hashcode - SSA_NAME_VERSION (vr->vuse);
+	      vr->vuse = vuse_ssa_val (gimple_vuse (def_stmt));
+	      if (vr->vuse)
+		vr->hashcode = vr->hashcode + SSA_NAME_VERSION (vr->vuse);
+	      vn_reference_t vnresult = NULL;
+	      /* Do not use vn_reference_lookup_2 since that might perform
+		 expression hashtable insertion but this lookup crosses
+		 a possible may-alias making such insertion conditionally
+		 invalid.  */
+	      vn_reference_lookup_1 (vr, &vnresult);
 	      /* Need to restore vr->vuse and vr->hashcode.  */
 	      vr->vuse = saved_vuse;
 	      vr->hashcode = saved_hashcode;
-	      data->last_vuse_ptr = saved_last_vuse_ptr;
-	      if (res && res != (void *)-1)
+	      if (vnresult)
 		{
-		  vn_reference_t vnresult = (vn_reference_t) res;
 		  if (TREE_CODE (rhs) == SSA_NAME)
 		    rhs = SSA_VAL (rhs);
 		  if (vnresult->result
 		      && operand_equal_p (vnresult->result, rhs, 0))
-		    return res;
+		    return vnresult;
 		}
 	    }
 	}