]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Another bogus range from .invert so don't use it.
authorRichard Biener <rguenther@suse.de>
Wed, 18 May 2022 12:18:10 +0000 (14:18 +0200)
committerRichard Biener <rguenther@suse.de>
Wed, 18 May 2022 12:23:24 +0000 (14:23 +0200)
From _1 < _2 we conclude [-INF, +INF - 1] and invert it as [+INF, +INF] -
oops.  Compute the other edge range explicitely.

gcc/testsuite/gcc.dg/torture/20220518-2.c [new file with mode: 0644]
gcc/tree-ssa-loop-unswitch.cc

diff --git a/gcc/testsuite/gcc.dg/torture/20220518-2.c b/gcc/testsuite/gcc.dg/torture/20220518-2.c
new file mode 100644 (file)
index 0000000..af70d7f
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-funswitch-loops" } */
+
+int Get_Spline_Val_sp_0, Get_Spline_Val_k;
+double Get_Spline_Val_p, Get_Spline_Val_se_0_0_0;
+double *Get_Spline_Val_v;
+void Get_Spline_Val() {
+  int i;
+  for (;;)
+    if (i > Get_Spline_Val_sp_0)
+      Get_Spline_Val_k = Get_Spline_Val_se_0_0_0;
+    else if (Get_Spline_Val_sp_0 == 1)
+      Get_Spline_Val_v[Get_Spline_Val_k] = Get_Spline_Val_p;
+}
index 2710c11f8ded1ce767904b9143c5a40eb69c5c43..d2898bdd63f39a93b6eaaf662a336a9c09635040 100644 (file)
@@ -143,22 +143,15 @@ struct unswitch_predicate
          rhs_range.set (rhs);
        if (!range_op->op1_range (true_range, TREE_TYPE (lhs),
                                  int_range<2> (boolean_true_node,
-                                               boolean_true_node), rhs_range))
+                                               boolean_true_node), rhs_range)
+           || !range_op->op1_range (false_range, TREE_TYPE (lhs),
+                                    int_range<2> (boolean_false_node,
+                                                  boolean_false_node),
+                                    rhs_range))
          {
            true_range.set_varying (TREE_TYPE (lhs));
            false_range.set_varying (TREE_TYPE (lhs));
          }
-       else
-         {
-           false_range = true_range;
-           if (!false_range.varying_p ()
-               && !false_range.undefined_p ())
-             false_range.invert ();
-           else
-             /* ???  Inversion of undefined is varying, of varying
-                is undefined but ranger asserts.  */
-             false_range.set_varying (TREE_TYPE (lhs));
-         }
       }
     num = predicates->length ();
     predicates->safe_push (this);