tree-optimization/96349 - avoid abnormal coalescing issues in loop split

Message ID nycvar.YFH.7.76.2007280951040.9963@zhemvz.fhfr.qr
State New
Headers show
Series
  • tree-optimization/96349 - avoid abnormal coalescing issues in loop split
Related show

Commit Message

Richard Biener July 28, 2020, 7:51 a.m.
This avoids splitting a loop when the entry value of a loop PHI is
involved with abnormal coalescing.

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

Richard.

2020-07-28  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/96349
	* tree-ssa-loop-split.c (stmt_semi_invariant_p_1): When the
	condition runs into a loop PHI with an abnormal entry value give up.

	* gcc.dg/torture/pr96349.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr96349.c | 25 +++++++++++++++++++++++++
 gcc/tree-ssa-loop-split.c              | 10 ++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr96349.c

-- 
2.26.2

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr96349.c b/gcc/testsuite/gcc.dg/torture/pr96349.c
new file mode 100644
index 00000000000..4ce39498213
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr96349.c
@@ -0,0 +1,25 @@ 
+/* { dg-do compile } */
+
+void __attribute__ ((returns_twice))
+gr (void);
+
+void
+ib (void);
+
+void
+zg (void);
+
+void
+yw (int uz)
+{
+  gr ();
+
+  for (;;)
+    if (uz != 0)
+      {
+        uz = 0;
+        ib ();
+      }
+    else
+      zg ();
+}
diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index 7de95b58884..1eb6be5ddb2 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -1145,6 +1145,16 @@  stmt_semi_invariant_p_1 (struct loop *loop, gimple *stmt,
 
       if (gimple_bb (stmt) == loop->header)
 	{
+	  /* If the entry value is subject to abnormal coalescing
+	     avoid the transform since we're going to duplicate the
+	     loop header and thus likely introduce overlapping life-ranges
+	     between the PHI def and the entry on the path when the
+	     first loop is skipped.  */
+	  tree entry_def
+	    = PHI_ARG_DEF_FROM_EDGE (phi, loop_preheader_edge (loop));
+	  if (TREE_CODE (entry_def) == SSA_NAME
+	      && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (entry_def))
+	    return false;
 	  invar = loop_iter_phi_semi_invariant_p (loop, phi, skip_head);
 	  return invar;
 	}