aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2004-08-26 01:20:25 +0000
committerAlan Modra <amodra@gcc.gnu.org>2004-08-26 10:50:25 +0930
commit0423421f6f73c7375200a3a59da5269b31c6af28 (patch)
treeb44be8bdd6d43905e67744d3cddf0ca5b88cb2f9
parent37d5a9a5ad9a7f43fa0331d993f4235576dd376d (diff)
downloadgcc-0423421f6f73c7375200a3a59da5269b31c6af28.zip
gcc-0423421f6f73c7375200a3a59da5269b31c6af28.tar.gz
gcc-0423421f6f73c7375200a3a59da5269b31c6af28.tar.bz2
re PR target/16480 (using -msdata causes internal compiler error)
PR target/16480 * config/rs6000/rs6000.c (rs6000_split_multireg_move): Don't abort on "(mem (symbol_ref ..))" rtl. Look at LO_SUM base regs as well as PLUS base regs. From-SVN: r86598
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/rs6000/rs6000.c20
2 files changed, 15 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5fa3d87..4af8f57 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-08-26 Alan Modra <amodra@bigpond.net.au>
+
+ PR target/16480
+ * config/rs6000/rs6000.c (rs6000_split_multireg_move): Don't abort
+ on "(mem (symbol_ref ..))" rtl. Look at LO_SUM base regs as well
+ as PLUS base regs.
+
2005-08-28 Paul Brook <paul@codesourcery.com>
* config/arm/symbian.h (SUBTARGET_ASM_FLOAT_SPEC): Default to
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index fd95f0b..745b475 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -11352,18 +11352,14 @@ rs6000_split_multireg_move (rtx dst, rtx src)
src = newsrc;
}
- /* We have now address involving an base register only.
- If we use one of the registers to address memory,
- we have change that register last. */
-
- breg = (GET_CODE (XEXP (src, 0)) == PLUS
- ? XEXP (XEXP (src, 0), 0)
- : XEXP (src, 0));
-
- if (!REG_P (breg))
- abort();
-
- if (REGNO (breg) >= REGNO (dst)
+ breg = XEXP (src, 0);
+ if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM)
+ breg = XEXP (breg, 0);
+
+ /* If the base register we are using to address memory is
+ also a destination reg, then change that register last. */
+ if (REG_P (breg)
+ && REGNO (breg) >= REGNO (dst)
&& REGNO (breg) < REGNO (dst) + nregs)
j = REGNO (breg) - REGNO (dst);
}