re PR tree-optimization/81003 (ICE: tree check: expected ssa_name, have integer_cst...
authorJakub Jelinek <jakub@redhat.com>
Mon, 12 Jun 2017 10:45:52 +0000 (12:45 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 12 Jun 2017 10:45:52 +0000 (12:45 +0200)
PR tree-optimization/81003
* tree-ssa-reassoc.c (force_into_ssa_name): New function.
(update_range_test): Use it instead of force_gimple_operand_gsi.

* gcc.c-torture/compile/pr81003.c: New test.

From-SVN: r249114

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr81003.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index 9a95c6ce5cb1423245411687388b45f5c8229afb..9dbcf02abf0f4a90954e633e300ee66800b17efb 100644 (file)
@@ -1,3 +1,9 @@
+2017-06-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/81003
+       * tree-ssa-reassoc.c (force_into_ssa_name): New function.
+       (update_range_test): Use it instead of force_gimple_operand_gsi.
+
 2017-06-12  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81053
index 71be107cae21d3efe9a6c4661d97ddbc46538253..84670eebf0f1a5992d68911060a1e32e21ca2a9f 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/81003
+       * gcc.c-torture/compile/pr81003.c: New test.
+
 2017-06-12  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/81053
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr81003.c b/gcc/testsuite/gcc.c-torture/compile/pr81003.c
new file mode 100644 (file)
index 0000000..26117b6
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR tree-optimization/81003 */
+
+unsigned int a, b;
+
+void
+foo (void)
+{
+  for (b = 0; b < 13; b += 2)
+    a &= !!b;
+}
index 6831f4474515a427839004a53f4685403800e551..35eb72ce31051ac79dfb1e2fd81d95e6626a599f 100644 (file)
@@ -2282,6 +2282,26 @@ range_entry_cmp (const void *a, const void *b)
     }
 }
 
+/* Helper function for update_range_test.  Force EXPR into an SSA_NAME,
+   insert needed statements BEFORE or after GSI.  */
+
+static tree
+force_into_ssa_name (gimple_stmt_iterator *gsi, tree expr, bool before)
+{
+  enum gsi_iterator_update m = before ? GSI_SAME_STMT : GSI_CONTINUE_LINKING;
+  tree ret = force_gimple_operand_gsi (gsi, expr, true, NULL_TREE, before, m);
+  if (TREE_CODE (ret) != SSA_NAME)
+    {
+      gimple *g = gimple_build_assign (make_ssa_name (TREE_TYPE (ret)), ret);
+      if (before)
+       gsi_insert_before (gsi, g, GSI_SAME_STMT);
+      else
+       gsi_insert_after (gsi, g, GSI_CONTINUE_LINKING);
+      ret = gimple_assign_lhs (g);
+    }
+  return ret;
+}
+
 /* Helper routine of optimize_range_test.
    [EXP, IN_P, LOW, HIGH, STRICT_OVERFLOW_P] is a merged range for
    RANGE and OTHERRANGE through OTHERRANGE + COUNT - 1 ranges,
@@ -2393,15 +2413,13 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange,
   else if (op != range->exp)
     {
       gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
-      tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
-                                     GSI_SAME_STMT);
+      tem = force_into_ssa_name (&gsi, tem, true);
       gsi_prev (&gsi);
     }
   else if (gimple_code (stmt) != GIMPLE_PHI)
     {
       gsi_insert_seq_after (&gsi, seq, GSI_CONTINUE_LINKING);
-      tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, false,
-                                     GSI_CONTINUE_LINKING);
+      tem = force_into_ssa_name (&gsi, tem, false);
     }
   else
     {
@@ -2419,8 +2437,7 @@ update_range_test (struct range_entry *range, struct range_entry *otherrange,
            }
        }
       gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
-      tem = force_gimple_operand_gsi (&gsi, tem, true, NULL_TREE, true,
-                                     GSI_SAME_STMT);
+      tem = force_into_ssa_name (&gsi, tem, true);
       if (gsi_end_p (gsi))
        gsi = gsi_last_bb (gimple_bb (stmt));
       else