tree-optimization/97812 - fix range query in VRP assert discovery
authorRichard Biener <rguenther@suse.de>
Fri, 13 Nov 2020 10:31:22 +0000 (11:31 +0100)
committerRichard Biener <rguenther@suse.de>
Fri, 13 Nov 2020 11:24:54 +0000 (12:24 +0100)
This makes sure to properly extend the input range before seeing
whether it fits the target.

2020-11-13  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97812
* tree-vrp.c (register_edge_assert_for_2): Extend the range
according to its sign before seeing whether it fits.

* gcc.dg/torture/pr97812.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr97812.c [new file with mode: 0644]
gcc/tree-vrp.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr97812.c b/gcc/testsuite/gcc.dg/torture/pr97812.c
new file mode 100644 (file)
index 0000000..4d468ad
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fdisable-tree-evrp" } */
+
+unsigned char c;
+
+int main() {
+volatile short b = 4066;
+  unsigned short bp = b;
+  unsigned d = bp & 2305;
+  signed char e = d;
+  c = e ? : e;
+  if (!d)
+    __builtin_abort ();
+  return 0;
+}
index 54ce017e8b2d2c0fcbacc93046470707041f1ea6..d661866630ed926f27fb674ecd25fb267ccb703d 100644 (file)
@@ -1740,8 +1740,14 @@ register_edge_assert_for_2 (tree name, edge e,
              && ((TYPE_PRECISION (TREE_TYPE (name))
                   > TYPE_PRECISION (TREE_TYPE (rhs1)))
                  || (get_range_info (rhs1, &rmin, &rmax) == VR_RANGE
-                     && wi::fits_to_tree_p (rmin, TREE_TYPE (name))
-                     && wi::fits_to_tree_p (rmax, TREE_TYPE (name)))))
+                     && wi::fits_to_tree_p
+                          (widest_int::from (rmin,
+                                             TYPE_SIGN (TREE_TYPE (rhs1))),
+                           TREE_TYPE (name))
+                     && wi::fits_to_tree_p
+                          (widest_int::from (rmax,
+                                             TYPE_SIGN (TREE_TYPE (rhs1))),
+                           TREE_TYPE (name)))))
            add_assert_info (asserts, rhs1, rhs1,
                             comp_code, fold_convert (TREE_TYPE (rhs1), val));
        }