diff mbox series

Fix PR88069

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

Commit Message

Richard Biener Nov. 20, 2018, 10:26 a.m. UTC
The following fixes another case of region VN escaping the region.

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

Richard.

2018-11-20  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/88069
	* tree-ssa-sccvn.c (visit_phi): Do not value-number to unvisited
	virtual PHI arguments.

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

Patch

diff --git a/gcc/testsuite/gcc.dg/pr88069.c b/gcc/testsuite/gcc.dg/pr88069.c
new file mode 100644
index 00000000000..21485135016
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr88069.c
@@ -0,0 +1,23 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O -ftree-pre -ftree-vectorize -fno-tree-pta" } */
+
+void
+qf (void);
+
+void
+mr (short int db)
+{
+  int vq;
+  short int *lp = &db;
+
+  for (vq = 0; vq < 1; ++vq)
+    qf ();
+
+  while (*lp < 2)
+    {
+      *lp = db;
+      lp = (short int *) &vq;
+      ++*lp;
+    }
+}
+
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index 01bedf56662..941752e7887 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -4194,12 +4194,19 @@  visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p)
      value from the backedge as that confuses the alias-walking code.
      See gcc.dg/torture/pr87176.c.  If the value is the same on a
      non-backedge everything is OK though.  */
-  if (backedge_val
-      && !seen_non_backedge
-      && TREE_CODE (backedge_val) == SSA_NAME
-      && sameval == backedge_val
-      && (SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val)
-	  || SSA_VAL (backedge_val) != backedge_val))
+  bool visited_p;
+  if ((backedge_val
+       && !seen_non_backedge
+       && TREE_CODE (backedge_val) == SSA_NAME
+       && sameval == backedge_val
+       && (SSA_NAME_IS_VIRTUAL_OPERAND (backedge_val)
+	   || SSA_VAL (backedge_val) != backedge_val))
+      /* Do not value-number a virtual operand to sth not visited though
+	 given that allows us to escape a region in alias walking.  */
+      || (sameval
+	  && TREE_CODE (sameval) == SSA_NAME
+	  && SSA_NAME_IS_VIRTUAL_OPERAND (sameval)
+	  && (SSA_VAL (sameval, &visited_p), !visited_p)))
     /* Note this just drops to VARYING without inserting the PHI into
        the hashes.  */
     result = PHI_RESULT (phi);