aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
diff options
context:
space:
mode:
authorKugan Vivekanandarajah <kuganv@linaro.org>2016-07-29 00:35:23 +0000
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>2016-07-29 00:35:23 +0000
commit883b6d4e1b1c826007d12b4685b4e7b0fffc5347 (patch)
tree19f8f9d123989dcab239ef62675ca3ca7bd10f0a /gcc/tree-vrp.c
parent257490974f36d660237ea0f6809b9c8b7f2b1461 (diff)
downloadgcc-883b6d4e1b1c826007d12b4685b4e7b0fffc5347.zip
gcc-883b6d4e1b1c826007d12b4685b4e7b0fffc5347.tar.gz
gcc-883b6d4e1b1c826007d12b4685b4e7b0fffc5347.tar.bz2
re PR rtl-optimization/68217 (Wrong constant folding)
gcc/ChangeLog: 2016-07-29 Kugan Vivekanandarajah <kuganv@linaro.org> PR middle-end/68217 * tree-vrp.c (extract_range_from_binary_expr_1): In case of signed & sign-bit-CST, generate [-INF, 0] instead of [-INF, INF]. gcc/testsuite/ChangeLog: 2016-07-29 Kugan Vivekanandarajah <kuganv@linaro.org> PR middle-end/68217 * gcc.dg/pr68217.c: New test. From-SVN: r238846
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 77c3014..41c870f 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3067,6 +3067,24 @@ extract_range_from_binary_expr_1 (value_range *vr,
if (int_cst_range1 && tree_int_cst_sgn (vr1.min) >= 0)
wmax = wi::min (wmax, vr1.max, TYPE_SIGN (expr_type));
max = wide_int_to_tree (expr_type, wmax);
+ cmp = compare_values (min, max);
+ /* PR68217: In case of signed & sign-bit-CST should
+ result in [-INF, 0] instead of [-INF, INF]. */
+ if (cmp == -2 || cmp == 1)
+ {
+ wide_int sign_bit
+ = wi::set_bit_in_zero (TYPE_PRECISION (expr_type) - 1,
+ TYPE_PRECISION (expr_type));
+ if (!TYPE_UNSIGNED (expr_type)
+ && ((value_range_constant_singleton (&vr0)
+ && !wi::cmps (vr0.min, sign_bit))
+ || (value_range_constant_singleton (&vr1)
+ && !wi::cmps (vr1.min, sign_bit))))
+ {
+ min = TYPE_MIN_VALUE (expr_type);
+ max = build_int_cst (expr_type, 0);
+ }
+ }
}
else if (code == BIT_IOR_EXPR)
{