diff options
author | Alan Modra <amodra@bigpond.net.au> | 2004-08-26 01:20:25 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2004-08-26 10:50:25 +0930 |
commit | 0423421f6f73c7375200a3a59da5269b31c6af28 (patch) | |
tree | b44be8bdd6d43905e67744d3cddf0ca5b88cb2f9 | |
parent | 37d5a9a5ad9a7f43fa0331d993f4235576dd376d (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 20 |
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); } |