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:
parent
3793ecc10f
commit
dcfd302a79
2 changed files with 23 additions and 2 deletions
15
gcc/testsuite/gcc.dg/torture/pr97812.c
Normal file
15
gcc/testsuite/gcc.dg/torture/pr97812.c
Normal 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;
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue