From 24d179b4c7717ceeceef16166064bd4a3933cb11 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 3 Nov 2009 23:36:39 +0100 Subject: [PATCH] re PR rtl-optimization/41917 (Strange athrithmetic result with -O3) PR rtl-optimization/41917 * rtlanal.c (num_sign_bit_copies1) : If sign bit of second operand isn't known to be 0, return 1. * gcc.c-torture/execute/pr41917.c: New test. From-SVN: r153874 --- gcc/ChangeLog | 6 ++++++ gcc/rtlanal.c | 12 +++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/pr41917.c | 21 +++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr41917.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 90dcf62235d..0da48a4f5ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-11-03 Jakub Jelinek + + PR rtl-optimization/41917 + * rtlanal.c (num_sign_bit_copies1) : If sign bit of second + operand isn't known to be 0, return 1. + 2009-11-03 Richard Sandiford * config/mips/mips.md: Fix typos. diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index d14bbe58bf7..120d37a830c 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -4517,8 +4517,16 @@ num_sign_bit_copies1 (const_rtx x, enum machine_mode mode, const_rtx known_x, known_x, known_mode, known_ret); case UMOD: - /* The result must be <= the second operand. */ - return cached_num_sign_bit_copies (XEXP (x, 1), mode, + /* The result must be <= the second operand. If the second operand + has (or just might have) the high bit set, we know nothing about + the number of sign bit copies. */ + if (bitwidth > HOST_BITS_PER_WIDE_INT) + return 1; + else if ((nonzero_bits (XEXP (x, 1), mode) + & ((HOST_WIDE_INT) 1 << (bitwidth - 1))) != 0) + return 1; + else + return cached_num_sign_bit_copies (XEXP (x, 1), mode, known_x, known_mode, known_ret); case DIV: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0d09d06090..220a4c36f26 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-11-03 Jakub Jelinek + + PR rtl-optimization/41917 + * gcc.c-torture/execute/pr41917.c: New test. + 2009-11-03 Uros Bizjak * gcc.target/i386/pr41900.c: Make test compile only. Scan assembler diff --git a/gcc/testsuite/gcc.c-torture/execute/pr41917.c b/gcc/testsuite/gcc.c-torture/execute/pr41917.c new file mode 100644 index 00000000000..4a9ada921c4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr41917.c @@ -0,0 +1,21 @@ +/* PR rtl-optimization/41917 */ + +extern void abort (void); +unsigned int a = 1; + +int +main (void) +{ + unsigned int b, c, d; + + if (sizeof (int) != 4 || (int) 0xc7d24b5e > 0) + return 0; + + c = 0xc7d24b5e; + d = a | -2; + b = (d == 0) ? c : (c % d); + if (b != c) + abort (); + + return 0; +}