From c44b2a4fb3522252f5aa044fb4c2ef6c7809c92b Mon Sep 17 00:00:00 2001 From: Kugan Vivekanandarajah Date: Mon, 29 Jun 2015 00:15:41 +0000 Subject: [PATCH] re PR tree-optimization/64130 (vrp: handle non zero constant divided by range cannot be zero.) gcc/ChangeLog: 2015-06-29 Kugan Vivekanandarajah 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 PR middle-end/64130 * gcc.dg/tree-ssa/pr64130.c: New test. From-SVN: r225108 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/pr64130.c | 18 ++++++++++++++++++ gcc/tree-vrp.c | 23 +++++++++++++++++++++-- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr64130.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc061407545..239ea9e66c7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2015-06-29 Kugan Vivekanandarajah + + 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. + 2015-06-28 Chung-Lin Tang Sandra Loosemore diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 610650edef7..fda80ddedbc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-06-29 Kugan Vivekanandarajah + + PR middle-end/64130 + * gcc.dg/tree-ssa/pr64130.c: New test. + 2015-06-26 Jiong Wang * gcc.target/aarch64/pic-small.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c new file mode 100644 index 00000000000..0b254660c99 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr64130.c @@ -0,0 +1,18 @@ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int funsigned (unsigned a) +{ + return 0x1ffffffffL / a == 0; +} + +int funsigned2 (unsigned a) +{ + if (a < 1) return 1; + return (-1 * 0x1ffffffffL) / a == 0; +} + +/* { dg-final { scan-tree-dump ": \\\[2, 8589934591\\\]" "vrp1" } } */ +/* { dg-final { scan-tree-dump ": \\\[-8589934591, -2\\\]" "vrp1" } } */ + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index fdaebe4c2fc..ec6d2c3e139 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 -- 2.30.2