]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/98513 - fix bug in range intersection code
authorRichard Biener <rguenther@suse.de>
Wed, 6 Jan 2021 08:26:55 +0000 (09:26 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 12 Jan 2021 14:52:22 +0000 (15:52 +0100)
This fixes a premature optimization in the range intersection code
which assumes earlier branches have to be taken, not taking into
account that for symbolic ranges we cannot always compare endpoints.
The fix is to instantiate the compare deemed redundant (which then
fails as undecidable for the testcase).

2021-01-06  Richard Biener  <rguenther@suse.de>

PR tree-optimization/98513
* value-range.cc (intersect_ranges): Compare the upper bounds
for the expected relation.

* gcc.dg/tree-ssa/pr98513.c: New testcase.

(cherry picked from commit a05cc70a6c1ae0e5b22e16f4d8d13995a38ea1f9)

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

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98513.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98513.c
new file mode 100644 (file)
index 0000000..c15d6bd
--- /dev/null
@@ -0,0 +1,47 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fgimple" } */
+
+__attribute__((noipa))
+void __GIMPLE (ssa,startwith("evrp"))
+foo (int x, int minus_1)
+{
+  int tem;
+  unsigned int _1;
+  unsigned int _2;
+
+  __BB(2):
+  tem_4 = minus_1_3(D);
+  tem_5 = tem_4 + 2;
+  _1 = (unsigned int) x_6(D);
+  _2 = _1 + 2147483647u;
+  if (_2 > 1u)
+    goto __BB3;
+  else
+    goto __BB6;
+
+  __BB(3):
+  if (x_6(D) <= tem_5)
+    goto __BB4;
+  else
+    goto __BB6;
+
+  __BB(4):
+  if (x_6(D) > 5)
+    goto __BB5;
+  else
+    goto __BB6;
+
+  __BB(5):
+  __builtin_exit (0);
+
+  __BB(6):
+  return;
+
+}
+
+int
+main()
+{
+  foo (10, 100);
+  __builtin_abort ();
+}
index 04820846fe0a4d717d0ff41efa315e8f6cac96fa..034d2e710a86fceda9337f005c34eade170682f7 100644 (file)
@@ -835,7 +835,8 @@ intersect_ranges (enum value_range_kind *vr0type,
     }
   else if ((operand_less_p (vr1min, *vr0max) == 1
            || operand_equal_p (vr1min, *vr0max, 0))
-          && operand_less_p (*vr0min, vr1min) == 1)
+          && operand_less_p (*vr0min, vr1min) == 1
+          && operand_less_p (*vr0max, vr1max) == 1)
     {
       /* [  (  ]  ) or [  ](  ) */
       if (*vr0type == VR_ANTI_RANGE
@@ -869,7 +870,8 @@ intersect_ranges (enum value_range_kind *vr0type,
     }
   else if ((operand_less_p (*vr0min, vr1max) == 1
            || operand_equal_p (*vr0min, vr1max, 0))
-          && operand_less_p (vr1min, *vr0min) == 1)
+          && operand_less_p (vr1min, *vr0min) == 1
+          && operand_less_p (vr1max, *vr0max) == 1)
     {
       /* (  [  )  ] or (  )[  ] */
       if (*vr0type == VR_ANTI_RANGE