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  <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.
This commit is contained in:
Richard Biener 2020-11-13 11:31:22 +01:00
parent 3793ecc10f
commit dcfd302a79
2 changed files with 23 additions and 2 deletions

View file

@ -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;
}

View 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));
}