From: Bernd Schmidt Date: Tue, 10 Aug 2010 12:48:16 +0000 (+0000) Subject: re PR middle-end/45182 (Failed to build SPEC CPU 2000/2006) X-Git-Tag: releases/gcc-4.6.0~5139 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5466d63d2d89ccb46fbe2c0cd62d82c91c5d907b;p=thirdparty%2Fgcc.git re PR middle-end/45182 (Failed to build SPEC CPU 2000/2006) PR middle-end/45182 * combine.c (make_compound_operation): Don't try to convert shifts into multiplications for modes that aren't SCALAR_INT_MODE_P. PR middle-end/45182 * gcc.c-torture/compile/pr45182.c: New test. From-SVN: r163057 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49a95d0cd736..68a1c8c7b130 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-08-10 Bernd Schmidt + + PR middle-end/45182 + * combine.c (make_compound_operation): Don't try to convert + shifts into multiplications for modes that aren't SCALAR_INT_MODE_P. + 2010-08-10 Richard Guenther * tree.h (get_object_alignment): Adjust prototype. diff --git a/gcc/combine.c b/gcc/combine.c index 41a0ec1dcb6f..d336e5a56134 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -7093,7 +7093,9 @@ make_compound_operation (rtx x, enum rtx_code in_code) address, we stay there. If we have a comparison, set to COMPARE, but once inside, go back to our default of SET. */ - next_code = (code == MEM || code == PLUS || code == MINUS ? MEM + next_code = (code == MEM ? MEM + : ((code == PLUS || code == MINUS) + && SCALAR_INT_MODE_P (mode)) ? MEM : ((code == COMPARE || COMPARISON_P (x)) && XEXP (x, 1) == const0_rtx) ? COMPARE : in_code == COMPARE ? SET : in_code); @@ -7127,8 +7129,8 @@ make_compound_operation (rtx x, enum rtx_code in_code) case PLUS: lhs = XEXP (x, 0); rhs = XEXP (x, 1); - lhs = make_compound_operation (lhs, MEM); - rhs = make_compound_operation (rhs, MEM); + lhs = make_compound_operation (lhs, next_code); + rhs = make_compound_operation (rhs, next_code); if (GET_CODE (lhs) == MULT && GET_CODE (XEXP (lhs, 0)) == NEG && SCALAR_INT_MODE_P (mode)) { @@ -7157,8 +7159,8 @@ make_compound_operation (rtx x, enum rtx_code in_code) case MINUS: lhs = XEXP (x, 0); rhs = XEXP (x, 1); - lhs = make_compound_operation (lhs, MEM); - rhs = make_compound_operation (rhs, MEM); + lhs = make_compound_operation (lhs, next_code); + rhs = make_compound_operation (rhs, next_code); if (GET_CODE (rhs) == MULT && GET_CODE (XEXP (rhs, 0)) == NEG && SCALAR_INT_MODE_P (mode)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e73a3b7b22a..3f38faf0fbd4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-10 Bernd Schmidt + + PR middle-end/45182 + * gcc.c-torture/compile/pr45182.c: New test. + 2010-08-09 Jason Merrill PR c++/45236 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr45182.c b/gcc/testsuite/gcc.c-torture/compile/pr45182.c new file mode 100644 index 000000000000..ad27ff88651f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr45182.c @@ -0,0 +1,10 @@ +typedef struct TypHeader { + struct TypHeader ** ptr; +} *TypHandle; +void PlainRange (TypHandle hdList, long lenList, long low, long inc) +{ + long i; + for (i = 1; i <= lenList; i++ ) + (((TypHandle*)((hdList)->ptr))[i] = (((TypHandle) (((long)(low + (i-1) * +inc) << 2) + 1)))); +}