aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKugan Vivekanandarajah <kuganv@linaro.org>2015-06-29 00:15:41 +0000
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>2015-06-29 00:15:41 +0000
commitc44b2a4fb3522252f5aa044fb4c2ef6c7809c92b (patch)
tree6ddf08cb993b1fa6c3529b9a573caabf1b9ac656 /gcc
parent1d1fe91a75df474462fdb46b921e0d20ef655864 (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr64130.c18
-rw-r--r--gcc/tree-vrp.c23
4 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bc06140..239ea9e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2015-06-28 Chung-Lin Tang <cltang@codesourcery.com>
Sandra Loosemore <sandra@codesourcery.com>
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 610650ed..fda80dd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-29 Kugan Vivekanandarajah <kuganv@linaro.org>
+
+ PR middle-end/64130
+ * gcc.dg/tree-ssa/pr64130.c: New test.
+
2015-06-26 Jiong Wang <jiong.wang@arm.com>
* 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 0000000..0b25466
--- /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 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