From 883b6d4e1b1c826007d12b4685b4e7b0fffc5347 Mon Sep 17 00:00:00 2001 From: Kugan Vivekanandarajah Date: Fri, 29 Jul 2016 00:35:23 +0000 Subject: [PATCH] re PR rtl-optimization/68217 (Wrong constant folding) gcc/ChangeLog: 2016-07-29 Kugan Vivekanandarajah 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 PR middle-end/68217 * gcc.dg/pr68217.c: New test. From-SVN: r238846 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr68217.c | 14 ++++++++++++++ gcc/tree-vrp.c | 18 ++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr68217.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e51cc011e53..b0da5b313d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-07-29 Kugan Vivekanandarajah + + 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]. + 2016-07-28 Michael Meissner * config/rs6000/rs6000-protos.h (rs6000_split_vec_extract_var): diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a588afecbef..ebb2c2fb7bd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-07-29 Kugan Vivekanandarajah + + PR middle-end/68217 + * gcc.dg/pr68217.c: New test. + 2016-07-28 Steven G. Kargl PR fortran/71067 diff --git a/gcc/testsuite/gcc.dg/pr68217.c b/gcc/testsuite/gcc.dg/pr68217.c new file mode 100644 index 00000000000..426a99a6b61 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr68217.c @@ -0,0 +1,14 @@ + +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-vrp1" } */ + +int foo (void) +{ + volatile int a = -1; + long long b = (1LL << (sizeof (b) * 8 - 1)); // LLONG_MIN + long long x = (a & b); // x == 0x8000000000000000 + if (x < 1LL) { ; } else { __builtin_abort(); } + return 0; +} + +/* { dg-final { scan-tree-dump "\\\[-INF, 0\\\]" "vrp1" } } */ diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 77c30144858..41c870f111c 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) { -- 2.30.2