This makes sure to properly extend the input range before seeing
whether it fits the target.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

2020-11-13  Richard Biener  <rguent...@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 | 15 +++++++++++++++
 gcc/tree-vrp.c                         | 10 ++++++++--
 2 files changed, 23 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr97812.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr97812.c 
b/gcc/testsuite/gcc.dg/torture/pr97812.c
new file mode 100644
index 00000000000..4d468adf8fa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr97812.c
@@ -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;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 54ce017e8b2..d661866630e 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -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));
        }
-- 
2.26.2

Reply via email to