diff options
author | Kugan Vivekanandarajah <kuganv@linaro.org> | 2015-06-29 00:15:41 +0000 |
---|---|---|
committer | Kugan Vivekanandarajah <kugan@gcc.gnu.org> | 2015-06-29 00:15:41 +0000 |
commit | c44b2a4fb3522252f5aa044fb4c2ef6c7809c92b (patch) | |
tree | 6ddf08cb993b1fa6c3529b9a573caabf1b9ac656 /gcc/tree-vrp.c | |
parent | 1d1fe91a75df474462fdb46b921e0d20ef655864 (diff) | |
download | gcc-c44b2a4fb3522252f5aa044fb4c2ef6c7809c92b.zip gcc-c44b2a4fb3522252f5aa044fb4c2ef6c7809c92b.tar.gz gcc-c44b2a4fb3522252f5aa044fb4c2ef6c7809c92b.tar.bz2 |
re PR tree-optimization/64130 (vrp: handle non zero constant divided by range cannot be zero.)
gcc/ChangeLog:
2015-06-29 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/64130
* tree-vrp.c (extract_range_from_binary_expr_1): For unsigned
division, compute max and min when value ranges for dividend and
divisor are available.
gcc/testsuite/ChangeLog:
2015-06-29 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/64130
* gcc.dg/tree-ssa/pr64130.c: New test.
From-SVN: r225108
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index fdaebe4..ec6d2c3 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3133,14 +3133,33 @@ extract_range_from_binary_expr_1 (value_range_t *vr, and all numbers from min to 0 for negative min. */ cmp = compare_values (vr0.max, zero); if (cmp == -1) - max = zero; + { + /* When vr0.max < 0, vr1.min != 0 and value + ranges for dividend and divisor are available. */ + if (vr1.type == VR_RANGE + && !symbolic_range_p (&vr0) + && !symbolic_range_p (&vr1) + && !compare_values (vr1.min, zero)) + max = int_const_binop (code, vr0.max, vr1.min); + else + max = zero; + } else if (cmp == 0 || cmp == 1) max = vr0.max; else type = VR_VARYING; cmp = compare_values (vr0.min, zero); if (cmp == 1) - min = zero; + { + /* For unsigned division when value ranges for dividend + and divisor are available. */ + if (vr1.type == VR_RANGE + && !symbolic_range_p (&vr0) + && !symbolic_range_p (&vr1)) + min = int_const_binop (code, vr0.min, vr1.max); + else + min = zero; + } else if (cmp == 0 || cmp == -1) min = vr0.min; else |