diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 60de22da4e9..bc469656054 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2003-01-28 Richard Sandiford + + * combine.c (nonzero_bits): Fix check for negative divide operands. + 2003-01-28 Richard Henderson * config/ia64/ia64.c (ia64_rwreloc_section_type_flags): New. diff --git a/gcc/combine.c b/gcc/combine.c index 4f03d008e7e..90c4482e33a 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -8369,14 +8369,15 @@ nonzero_bits (x, mode) { unsigned HOST_WIDE_INT nz0 = nonzero_bits (XEXP (x, 0), mode); unsigned HOST_WIDE_INT nz1 = nonzero_bits (XEXP (x, 1), mode); + int sign_index = GET_MODE_BITSIZE (GET_MODE (x)) - 1; int width0 = floor_log2 (nz0) + 1; int width1 = floor_log2 (nz1) + 1; int low0 = floor_log2 (nz0 & -nz0); int low1 = floor_log2 (nz1 & -nz1); HOST_WIDE_INT op0_maybe_minusp - = (nz0 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); + = (nz0 & ((HOST_WIDE_INT) 1 << sign_index)); HOST_WIDE_INT op1_maybe_minusp - = (nz1 & ((HOST_WIDE_INT) 1 << (mode_width - 1))); + = (nz1 & ((HOST_WIDE_INT) 1 << sign_index)); unsigned int result_width = mode_width; int result_low = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c2f60e6ede7..9e5ea48f89e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-01-28 Richard Sandiford + + * gcc.c-torture/execute/20030128-1.c: New test. + 2003-01-28 Jeffrey D. Oldham * g++.dg/lookup/nested1.C: Test moved from ... diff --git a/gcc/testsuite/gcc.c-torture/execute/20030128-1.c b/gcc/testsuite/gcc.c-torture/execute/20030128-1.c new file mode 100644 index 00000000000..ceca322ccaf --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20030128-1.c @@ -0,0 +1,10 @@ +unsigned char x = 50; +volatile short y = -5; + +int main () +{ + x /= y; + if (x != (unsigned char) -10) + abort (); + exit (0); +}