From: Richard Guenther Date: Wed, 22 Aug 2007 08:43:53 +0000 (+0000) Subject: re PR tree-optimization/33142 (wrong code with VRP through ABS_EXPR) X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7dcb868d0f7e253ddcc3f94e29f9a2dc26f0aea6;p=thirdparty%2Fgcc.git re PR tree-optimization/33142 (wrong code with VRP through ABS_EXPR) 2007-08-22 Richard Guenther PR tree-optimization/33142 * tree-vrp.c (extract_range_from_unary_expr): Compare with TYPE_MIN/MAX_VALUE using tree_int_cst_equal. * gcc.c-torture/execute/pr33142.c: New testcase. From-SVN: r127691 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 426528bc924b..a6caeb639e76 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-08-22 Richard Guenther + + PR tree-optimization/33142 + * tree-vrp.c (extract_range_from_unary_expr): Compare with + TYPE_MIN/MAX_VALUE using tree_int_cst_equal. + 2007-08-21 Adam Nemet * config/mips/predicates.md (const_call_insn_operand): Invoke diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a3c554d23219..68aec998e280 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-08-22 Richard Guenther + + PR tree-optimization/33142 + * gcc.c-torture/execute/pr33142.c: New testcase. + 2007-08-20 Jakub Jelinek PR c++/32992 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr33142.c b/gcc/testsuite/gcc.c-torture/execute/pr33142.c new file mode 100644 index 000000000000..7bfc5b584dbd --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr33142.c @@ -0,0 +1,16 @@ +int abs(int j); +extern void abort(void); + +__attribute__((noinline)) int lisp_atan2(long dy, long dx) { + if (dx <= 0) + if (dy > 0) + return abs(dx) <= abs(dy); + return 0; +} + +int main() { + volatile long dy = 63, dx = -77; + if (lisp_atan2(dy, dx)) + abort(); + return 0; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index f5b22eac0b7a..8d479c1eed33 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1523,11 +1523,11 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) -~[MIN, MIN] == ~[MIN, MIN] -[MIN, 0] == [0, MAX] for -fno-wrapv -[MIN, 0] == [0, MIN] for -fwrapv (will be set to varying later) */ - min = vr0.max == TYPE_MIN_VALUE (TREE_TYPE (expr)) + min = tree_int_cst_equal (vr0.max, TYPE_MIN_VALUE (TREE_TYPE (expr))) ? TYPE_MIN_VALUE (TREE_TYPE (expr)) : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max); - max = vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) + max = tree_int_cst_equal (vr0.min, TYPE_MIN_VALUE (TREE_TYPE (expr))) ? (vr0.type == VR_ANTI_RANGE || flag_wrapv ? TYPE_MIN_VALUE (TREE_TYPE (expr)) : TYPE_MAX_VALUE (TREE_TYPE (expr))) @@ -1540,9 +1540,9 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) useful range. */ if (flag_wrapv && ((vr0.type == VR_RANGE - && vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr))) + && tree_int_cst_equal (vr0.min, TYPE_MIN_VALUE (TREE_TYPE (expr)))) || (vr0.type == VR_ANTI_RANGE - && vr0.min != TYPE_MIN_VALUE (TREE_TYPE (expr)) + && !tree_int_cst_equal (vr0.min, TYPE_MIN_VALUE (TREE_TYPE (expr))) && !range_includes_zero_p (&vr0)))) { set_value_range_to_varying (vr); @@ -1551,7 +1551,7 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) /* ABS_EXPR may flip the range around, if the original range included negative values. */ - min = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr))) + min = (tree_int_cst_equal (vr0.min, TYPE_MIN_VALUE (TREE_TYPE (expr)))) ? TYPE_MAX_VALUE (TREE_TYPE (expr)) : fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min); @@ -1575,7 +1575,7 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr) or ~[-INF + 1, min (abs(MIN), abs(MAX))] when flag_wrapv is set and the original anti-range doesn't include TYPE_MIN_VALUE, remember -TYPE_MIN_VALUE = TYPE_MIN_VALUE. */ - min = (flag_wrapv && vr0.min != type_min_value + min = (flag_wrapv && !tree_int_cst_equal (vr0.min, type_min_value) ? int_const_binop (PLUS_EXPR, type_min_value, integer_one_node, 0)