From: Richard Biener Date: Fri, 13 Nov 2020 10:31:22 +0000 (+0100) Subject: tree-optimization/97812 - fix range query in VRP assert discovery X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=dcfd302a79a5e2ea3bb16fc4fc45a5ee31cc0eab;p=gcc.git tree-optimization/97812 - fix range query in VRP assert discovery This makes sure to properly extend the input range before seeing whether it fits the target. 2020-11-13 Richard Biener 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. --- 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)); }