The following fixes reassoc leaking abnormals into rewritten
conditon chains.

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

Richard.

2019-04-15  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/90071
        * tree-ssa-reassoc.c (init_range_entry): Do not pick up
        abnormal operands from def stmts.

        * gcc.dg/torture/pr90071.c: New testcase.

Index: gcc/tree-ssa-reassoc.c
===================================================================
--- gcc/tree-ssa-reassoc.c      (revision 270358)
+++ gcc/tree-ssa-reassoc.c      (working copy)
@@ -2143,7 +2143,8 @@ init_range_entry (struct range_entry *r,
          exp_type = boolean_type_node;
        }
 
-      if (TREE_CODE (arg0) != SSA_NAME)
+      if (TREE_CODE (arg0) != SSA_NAME
+         || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (arg0))
        break;
       loc = gimple_location (stmt);
       switch (code)
Index: gcc/testsuite/gcc.dg/torture/pr90071.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr90071.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr90071.c      (working copy)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+
+int a;
+static int b;
+
+void
+foo ()
+{
+  int d;
+  int e = (int) (__INTPTR_TYPE__) &&f;
+  void *g = &&h;
+h: ++e;
+   if (a)
+     i: goto *g;
+   for (;;)
+     {
+       e = 0;
+       if (b)
+        goto i;
+     }
+f:
+   goto *({ d || e < 0 || e >= 2; });
+   &e;
+}

Reply via email to