From e3625844fba13bd71af4adfd0f326875dc5d36b8 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 11 Oct 2006 16:05:37 +0000 Subject: [PATCH] 2006-10-11 Richard Guenther PR tree-optimization/28230 * tree-vrp.c (vrp_int_const_binop): Move flag_wrapv handling to the correct place. * gcc.dg/torture/pr28230.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117637 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr28230.c | 20 ++++++++++++++++++++ gcc/tree-vrp.c | 8 +++----- 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr28230.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8eca2504987..6fd39c76efd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2006-10-11 Richard Guenther + PR tree-optimization/28230 + * tree-vrp.c (vrp_int_const_binop): Move flag_wrapv handling + to the correct place. + +2006-10-11 Richard Guenther + PR inline-asm/29119 * gimplify.c (gimplify_asm_expr): Mark the gimplified lvalue addressable. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c9b7c54fd6d..aa9cd9ec134 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2006-10-11 Richard Guenther + PR tree-optimization/28230 + * gcc.dg/torture/pr28230.c: New testcase. + +2006-10-11 Richard Guenther + PR inline-asm/29119 * gcc.dg/torture/pr29119.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr28230.c b/gcc/testsuite/gcc.dg/torture/pr28230.c new file mode 100644 index 00000000000..5ecc0c716ba --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr28230.c @@ -0,0 +1,20 @@ +/* { dg-do run } */ +/* { dg-options "-fwrapv" } */ + +void foo( unsigned long long bb, unsigned short tn, unsigned e, unsigned* w ); +void foo( unsigned long long bb, unsigned short tn, unsigned e, unsigned* w ) +{ + unsigned n = tn + bb; + do { + e = (e > n) ? e : *w; + n -= (e > n) ? n : e; + if (*w) + *w = 0; + } while ( n ); +} +int main() +{ + unsigned w = 0; + foo( 0, 0, 0, &w ); + return 0; +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index a2127446a85..4a30e4ee8a5 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1235,14 +1235,12 @@ vrp_int_const_binop (enum tree_code code, tree val1, tree val2) { tree res; - if (flag_wrapv) - return int_const_binop (code, val1, val2, 0); + res = int_const_binop (code, val1, val2, 0); /* If we are not using wrapping arithmetic, operate symbolically on -INF and +INF. */ - res = int_const_binop (code, val1, val2, 0); - - if (TYPE_UNSIGNED (TREE_TYPE (val1))) + if (TYPE_UNSIGNED (TREE_TYPE (val1)) + || flag_wrapv) { int checkz = compare_values (res, val1); bool overflow = false; -- 2.11.0