From 916c75b4739db757d1e820be5ba3699848505179 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 12 Nov 2007 14:16:05 +0000 Subject: [PATCH] re PR middle-end/34070 (Wrong code for (int)x%4) 2007-11-12 Richard Guenther PR middle-end/34070 * fold-const.c (fold_binary): If testing for non-negative operands with tree_expr_nonnegative_warnv_p make sure to use op0 which has all (sign) conversions retained. * gcc.c-torture/execute/pr34070-1.c: New testcase. * gcc.c-torture/execute/pr34070-2.c: Likewise. From-SVN: r130098 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 4 ++-- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.c-torture/execute/pr34070-1.c | 13 +++++++++++++ gcc/testsuite/gcc.c-torture/execute/pr34070-2.c | 13 +++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr34070-1.c create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr34070-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b95f35d9679..5b6c7306d57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-11-12 Richard Guenther + + PR middle-end/34070 + * fold-const.c (fold_binary): If testing for non-negative + operands with tree_expr_nonnegative_warnv_p make sure to + use op0 which has all (sign) conversions retained. + 2007-11-12 Richard Guenther PR middle-end/34027 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 5b81d88fd57..0d6524e7fd2 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -11230,7 +11230,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) strict_overflow_p = false; if (TREE_CODE (arg1) == LSHIFT_EXPR && (TYPE_UNSIGNED (type) - || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))) + || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p))) { tree sval = TREE_OPERAND (arg1, 0); if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0) @@ -11356,7 +11356,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1) strict_overflow_p = false; if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR) && (TYPE_UNSIGNED (type) - || tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))) + || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p))) { tree c = arg1; /* Also optimize A % (C << N) where C is a power of 2, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e22485905ac..15c5e93eeab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-11-12 Richard Guenther + + PR middle-end/34070 + * gcc.c-torture/execute/pr34070-1.c: New testcase. + * gcc.c-torture/execute/pr34070-2.c: Likewise. + 2007-11-12 Richard Guenther PR middle-end/34027 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34070-1.c b/gcc/testsuite/gcc.c-torture/execute/pr34070-1.c new file mode 100644 index 00000000000..6589bb0c095 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34070-1.c @@ -0,0 +1,13 @@ +extern void abort (void); + +int f(unsigned int x) +{ + return ((int)x) % 4; +} + +int main() +{ + if (f(-1) != -1) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34070-2.c b/gcc/testsuite/gcc.c-torture/execute/pr34070-2.c new file mode 100644 index 00000000000..4c1ce7b0231 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34070-2.c @@ -0,0 +1,13 @@ +extern void abort (void); + +int f(unsigned int x, int n) +{ + return ((int)x) / (1 << n); +} + +int main() +{ + if (f(-1, 1) != 0) + abort (); + return 0; +}