aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@codesourcery.com>2010-08-10 12:48:16 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2010-08-10 12:48:16 +0000
commit5466d63d2d89ccb46fbe2c0cd62d82c91c5d907b (patch)
treef2218b048b74165afd589a8d755a1be51d4af7ba
parentfabe484df42f056ccd1dc0cd97f69779775c7e25 (diff)
downloadgcc-5466d63d2d89ccb46fbe2c0cd62d82c91c5d907b.zip
gcc-5466d63d2d89ccb46fbe2c0cd62d82c91c5d907b.tar.gz
gcc-5466d63d2d89ccb46fbe2c0cd62d82c91c5d907b.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr45182.c10
4 files changed, 28 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49a95d0..68a1c8c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-08-10 Bernd Schmidt <bernds@codesourcery.com>
+
+ 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 <rguenther@suse.de>
* tree.h (get_object_alignment): Adjust prototype.
diff --git a/gcc/combine.c b/gcc/combine.c
index 41a0ec1..d336e5a 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 8e73a3b..3f38faf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-10 Bernd Schmidt <bernds@codesourcery.com>
+
+ PR middle-end/45182
+ * gcc.c-torture/compile/pr45182.c: New test.
+
2010-08-09 Jason Merrill <jason@redhat.com>
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 0000000..ad27ff8
--- /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))));
+}