From 273967791e00d333e1e723c6470d8077dc1a3823 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 10 Nov 2004 03:14:33 +0000 Subject: [PATCH] re PR target/16480 (using -msdata causes internal compiler error) PR target/16480 2004-08-26 Alan Modra * 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. 2004-08-01 Geoffrey Keating * config/rs6000/rs6000.c (rs6000_split_multireg_move): Just abort if trying to *store* to a non-offsettable address. 2004-07-30 Geoffrey Keating * config/rs6000/rs6000.c (rs6000_split_multireg_move): Cope with non-offsettable addresses being moved into multiple GPRs. From-SVN: r90385 --- gcc/ChangeLog | 14 ++++++++++++++ gcc/config/rs6000/rs6000.c | 33 ++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 19aca05e6e05..ed3862f74fd3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2004-11-10 Alan Modra + + PR target/16480 + 2004-08-26 Alan Modra + * 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. + 2004-08-01 Geoffrey Keating + * config/rs6000/rs6000.c (rs6000_split_multireg_move): Just abort + if trying to *store* to a non-offsettable address. + 2004-07-30 Geoffrey Keating + * config/rs6000/rs6000.c (rs6000_split_multireg_move): Cope with + non-offsettable addresses being moved into multiple GPRs. + 2004-11-07 Richard Sandiford * config/mips/t-iris6 (tp-bit.c): Fix target filename. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 74fe8c9a42ec..a69da98cda3f 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -10526,22 +10526,27 @@ rs6000_split_multireg_move (rtx dst, rtx src) : gen_adddi3 (breg, breg, delta_rtx)); src = gen_rtx_MEM (mode, breg); } + else if (! offsettable_memref_p (src)) + { + rtx newsrc, basereg; + basereg = gen_rtx_REG (Pmode, reg); + emit_insn (gen_rtx_SET (VOIDmode, basereg, XEXP (src, 0))); + newsrc = gen_rtx_MEM (GET_MODE (src), basereg); + MEM_COPY_ATTRIBUTES (newsrc, 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(); + breg = XEXP (src, 0); + if (GET_CODE (breg) == PLUS || GET_CODE (breg) == LO_SUM) + breg = XEXP (breg, 0); - if (REGNO (breg) >= REGNO (dst) + /* 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); - } + } if (GET_CODE (dst) == MEM && INT_REGNO_P (reg)) { @@ -10573,6 +10578,8 @@ rs6000_split_multireg_move (rtx dst, rtx src) : gen_adddi3 (breg, breg, delta_rtx)); dst = gen_rtx_MEM (mode, breg); } + else if (! offsettable_memref_p (dst)) + abort (); } for (i = 0; i < nregs; i++) @@ -10582,7 +10589,7 @@ rs6000_split_multireg_move (rtx dst, rtx src) if (j == nregs) j = 0; - /* If compiler already emited move of first word by + /* If compiler already emitted move of first word by store with update, no need to do anything. */ if (j == 0 && used_update) continue; -- 2.47.2