diff options
author | Jakub Jelinek <jakub@redhat.com> | 2014-07-08 11:39:57 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2014-07-08 11:39:57 +0200 |
commit | b48e3948be3320071d3cd3a0894b04082eef8643 (patch) | |
tree | dee539372edbfbfbff7ec1bc9dc933297b8b1367 /gcc/tree-vrp.c | |
parent | a59d8e8eb67086eb6df936074ef6d8fb4834bcc2 (diff) | |
download | gcc-b48e3948be3320071d3cd3a0894b04082eef8643.zip gcc-b48e3948be3320071d3cd3a0894b04082eef8643.tar.gz gcc-b48e3948be3320071d3cd3a0894b04082eef8643.tar.bz2 |
re PR middle-end/61725 (__builtin_ffs(0) leads to wrong code generation)
PR tree-optimization/61725
* tree-vrp.c (extract_range_basic): Don't assume vr0 is unsigned
range, use range_includes_zerop_p instead of integer_zerop on
vr0->min, only use log2 of max if min is not negative.
* gcc.dg/tree-ssa/vrp93.c: New test.
* gcc.c-torture/execute/pr61725.c: New test.
From-SVN: r212353
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 3d0916d..5fc1351 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3536,15 +3536,18 @@ extract_range_basic (value_range_t *vr, gimple stmt) /* If arg is non-zero, then ffs or popcount are non-zero. */ if (((vr0->type == VR_RANGE - && integer_nonzerop (vr0->min)) + && range_includes_zero_p (vr0->min, vr0->max) == 0) || (vr0->type == VR_ANTI_RANGE - && integer_zerop (vr0->min))) - && !is_overflow_infinity (vr0->min)) + && range_includes_zero_p (vr0->min, vr0->max) == 1)) + && !is_overflow_infinity (vr0->min) + && !is_overflow_infinity (vr0->max)) mini = 1; /* If some high bits are known to be zero, we can decrease the maximum. */ if (vr0->type == VR_RANGE && TREE_CODE (vr0->max) == INTEGER_CST + && !operand_less_p (vr0->min, + build_zero_cst (TREE_TYPE (vr0->min))) && !is_overflow_infinity (vr0->max)) maxi = tree_floor_log2 (vr0->max) + 1; } |