]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Check for undefined and varying first.
authorAndrew MacLeod <amacleod@redhat.com>
Mon, 15 Aug 2022 14:16:23 +0000 (10:16 -0400)
committerAndrew MacLeod <amacleod@redhat.com>
Mon, 15 Aug 2022 17:31:01 +0000 (13:31 -0400)
Rearrange order in irange:set to ensure all POLY_INTs map to varying.

PR tree-optimization/106621
gcc/
* value-range.cc (irange::set): Check for POLY_INT_CST early.

gcc/testsuite/
* gcc.dg/pr106621.c

gcc/testsuite/gcc.dg/pr106621.c [new file with mode: 0644]
gcc/value-range.cc

diff --git a/gcc/testsuite/gcc.dg/pr106621.c b/gcc/testsuite/gcc.dg/pr106621.c
new file mode 100644 (file)
index 0000000..0465de4
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile { target aarch64*-*-* } } */
+/* { dg-options "-mcpu=neoverse-v1 -O2 -fvect-cost-model=dynamic -fno-tree-scev-cprop" } */
+
+int m, n;
+
+void
+foo (unsigned int x, short int y)
+{
+  if (m)
+    for (;;)
+      {
+        ++m;
+        while (m < 1)
+          {
+            n += m + x;
+            ++m;
+          }
+      }
+
+  for (;;)
+    if (y)
+      {
+        ++x;
+        if (x)
+          for (y = 0; y < 75; y += 2)
+            {
+            }
+      }
+}
+
index a2273f540e8f117f181affaf256a6693e65645a5..d056f7356e1a370e0d5be3acde70ae70daf51fca 100644 (file)
@@ -716,25 +716,6 @@ irange::irange_set_anti_range (tree min, tree max)
 void
 irange::set (tree min, tree max, value_range_kind kind)
 {
-  if (kind != VR_UNDEFINED)
-    {
-      if (TREE_OVERFLOW_P (min))
-       min = drop_tree_overflow (min);
-      if (TREE_OVERFLOW_P (max))
-       max = drop_tree_overflow (max);
-    }
-
-  if (!legacy_mode_p ())
-    {
-      if (kind == VR_RANGE)
-       irange_set (min, max);
-      else
-       {
-         gcc_checking_assert (kind == VR_ANTI_RANGE);
-         irange_set_anti_range (min, max);
-       }
-      return;
-    }
   if (kind == VR_UNDEFINED)
     {
       irange::set_undefined ();
@@ -749,6 +730,22 @@ irange::set (tree min, tree max, value_range_kind kind)
       return;
     }
 
+  if (TREE_OVERFLOW_P (min))
+    min = drop_tree_overflow (min);
+  if (TREE_OVERFLOW_P (max))
+    max = drop_tree_overflow (max);
+
+  if (!legacy_mode_p ())
+    {
+      if (kind == VR_RANGE)
+       irange_set (min, max);
+      else
+       {
+         gcc_checking_assert (kind == VR_ANTI_RANGE);
+         irange_set_anti_range (min, max);
+       }
+      return;
+    }
   // Nothing to canonicalize for symbolic ranges.
   if (TREE_CODE (min) != INTEGER_CST
       || TREE_CODE (max) != INTEGER_CST)