diff mbox series

tree-optimization/101394 - fix PRE full redundancy wrt abnormals

Message ID qs25op1q-ro1r-rqop-q7sr-rrp3no99s723@fhfr.qr
State New
Headers show
Series tree-optimization/101394 - fix PRE full redundancy wrt abnormals | expand

Commit Message

Richard Biener July 12, 2021, 10:15 a.m. UTC
This avoids adding a copy from an abnormal picked up from PHI
translation much like we'd avoid inserting the translated
expression on pred edges.

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

2021-07-12  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/101394
	* tree-ssa-pre.c (do_pre_regular_insertion): Avoid inserting
	copies from abnormals for a full redundancy.

	* gcc.dg/torture/pr101394.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr101394.c | 18 ++++++++++++++++++
 gcc/tree-ssa-pre.c                      |  6 +++++-
 2 files changed, 23 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr101394.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr101394.c b/gcc/testsuite/gcc.dg/torture/pr101394.c
new file mode 100644
index 00000000000..87fbdadc152
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr101394.c
@@ -0,0 +1,18 @@ 
+/* { dg-do compile } */
+
+int a, b, c, d;
+void h();
+int e() __attribute__((returns_twice));
+void f() {
+  int *g = (int *)(__INTPTR_TYPE__)c;
+  if (b) {
+    h();
+    g--;
+    if (a)
+      if (d)
+        h();
+  }
+  if (g++)
+    e();
+  c = (__INTPTR_TYPE__)g;
+}
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index d86fe26bd07..69141c2f0c9 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -3412,7 +3412,11 @@  do_pre_regular_insertion (basic_block block, basic_block dom,
 	  /* If all edges produce the same value and that value is
 	     an invariant, then the PHI has the same value on all
 	     edges.  Note this.  */
-	  else if (!cant_insert && all_same)
+	  else if (!cant_insert
+		   && all_same
+		   && (edoubleprime->kind != NAME
+		       || !SSA_NAME_OCCURS_IN_ABNORMAL_PHI
+			     (PRE_EXPR_NAME (edoubleprime))))
 	    {
 	      gcc_assert (edoubleprime->kind == CONSTANT
 			  || edoubleprime->kind == NAME);