re PR tree-optimization/84178 (ICE in release_bb_predicate)
authorRichard Biener <rguenther@suse.de>
Thu, 8 Mar 2018 12:56:40 +0000 (12:56 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 8 Mar 2018 12:56:40 +0000 (12:56 +0000)
2018-03-08  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84178
* tree-if-conv.c (combine_blocks): Move insert_gimplified_predicates
to caller.
(version_loop_for_if_conversion): Delay update_ssa call.
(tree_if_conversion): Delay update_ssa until after predicate
insertion.

* gcc.dg/torture/pr84178-2.c: New testcase.

From-SVN: r258364

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr84178-2.c [new file with mode: 0644]
gcc/tree-if-conv.c

index e1c40c3..bfff935 100644 (file)
@@ -1,3 +1,12 @@
+2018-03-08  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84178
+       * tree-if-conv.c (combine_blocks): Move insert_gimplified_predicates
+       to caller.
+       (version_loop_for_if_conversion): Delay update_ssa call.
+       (tree_if_conversion): Delay update_ssa until after predicate
+       insertion.
+
 2018-03-08  David Malcolm  <dmalcolm@redhat.com>
 
        PR tree-optimization/84178
index eb8ade6..3abed3c 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-08  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84178
+       * gcc.dg/torture/pr84178-2.c: New testcase.
+
 2018-03-08  David Malcolm  <dmalcolm@redhat.com>
 
        PR tree-optimization/84178
diff --git a/gcc/testsuite/gcc.dg/torture/pr84178-2.c b/gcc/testsuite/gcc.dg/torture/pr84178-2.c
new file mode 100644 (file)
index 0000000..75f5b0a
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-forwprop" } */
+
+int zy, h4;
+
+void
+r8 (long int mu, int *jr, int *fi, short int dv)
+{
+  do
+    {
+      int tx;
+
+      tx = !!h4 ? (zy + h4) : 1;
+      mu = tx;
+      *jr = (((unsigned char) mu > (254 >> dv)) ? 0 : (unsigned char) tx) + *fi;
+    } while (*jr == 0);
+
+  r8 (mu, jr, fi, 1);
+}
+
index 5467f3f..59a0f1c 100644 (file)
@@ -2371,7 +2371,6 @@ combine_blocks (struct loop *loop)
   edge_iterator ei;
 
   remove_conditions_and_labels (loop);
-  insert_gimplified_predicates (loop);
   predicate_all_scalar_phis (loop);
 
   if (any_pred_load_store)
@@ -2593,7 +2592,6 @@ version_loop_for_if_conversion (struct loop *loop)
   gsi = gsi_last_bb (cond_bb);
   gimple_call_set_arg (g, 1, build_int_cst (integer_type_node, new_loop->num));
   gsi_insert_before (&gsi, g, GSI_SAME_STMT);
-  update_ssa (TODO_update_ssa);
   return new_loop;
 }
 
@@ -2811,6 +2809,7 @@ tree_if_conversion (struct loop *loop)
   unsigned int todo = 0;
   bool aggressive_if_conv;
   struct loop *rloop;
+  bool need_update_ssa = false;
 
  again:
   rloop = NULL;
@@ -2856,6 +2855,7 @@ tree_if_conversion (struct loop *loop)
       struct loop *nloop = version_loop_for_if_conversion (vloop);
       if (nloop == NULL)
        goto cleanup;
+      need_update_ssa = true;
       if (vloop != loop)
        {
          /* If versionable_outer_loop_p decided to version the
@@ -2880,6 +2880,13 @@ tree_if_conversion (struct loop *loop)
        }
     }
 
+  /* Due to hard to fix issues we end up with immediate uses recorded
+     for not yet inserted predicates which will confuse SSA update so
+     we delayed this from after versioning to after predicate insertion.  */
+  insert_gimplified_predicates (loop);
+  if (need_update_ssa)
+    update_ssa (TODO_update_ssa);
+
   /* Now all statements are if-convertible.  Combine all the basic
      blocks into one huge basic block doing the if-conversion
      on-the-fly.  */