]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/16480 (using -msdata causes internal compiler error)
authorAlan Modra <amodra@bigpond.net.au>
Wed, 10 Nov 2004 03:14:33 +0000 (03:14 +0000)
committerAlan Modra <amodra@gcc.gnu.org>
Wed, 10 Nov 2004 03:14:33 +0000 (13:44 +1030)
PR target/16480
2004-08-26  Alan Modra  <amodra@bigpond.net.au>
* 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  <geoffk@apple.com>
* config/rs6000/rs6000.c (rs6000_split_multireg_move): Just abort
if trying to *store* to a non-offsettable address.
2004-07-30  Geoffrey Keating  <geoffk@apple.com>
* config/rs6000/rs6000.c (rs6000_split_multireg_move): Cope with
non-offsettable addresses being moved into multiple GPRs.

From-SVN: r90385

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 19aca05e6e05ad52a9a443c1193133524eaaf03b..ed3862f74fd3d53f8b8d2b6fe500c12e076cf59b 100644 (file)
@@ -1,3 +1,17 @@
+2004-11-10  Alan Modra  <amodra@bigpond.net.au>
+
+       PR target/16480
+       2004-08-26  Alan Modra  <amodra@bigpond.net.au>
+       * 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  <geoffk@apple.com>
+       * config/rs6000/rs6000.c (rs6000_split_multireg_move): Just abort
+       if trying to *store* to a non-offsettable address.
+       2004-07-30  Geoffrey Keating  <geoffk@apple.com>
+       * config/rs6000/rs6000.c (rs6000_split_multireg_move): Cope with
+       non-offsettable addresses being moved into multiple GPRs.
+
 2004-11-07  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/t-iris6 (tp-bit.c): Fix target filename.
index 74fe8c9a42ec51c91fbc2a9707f5af814df3d44c..a69da98cda3f5c176fcfa3316b128cf64f6c64bd 100644 (file)
@@ -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;