Make sure ARM multi load / store pass copies memoperands when forming ldrd / strd...
authorEvan Cheng <evan.cheng@apple.com>
Mon, 15 Nov 2010 03:30:30 +0000 (03:30 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 15 Nov 2010 03:30:30 +0000 (03:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119109 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMLoadStoreOptimizer.cpp

index b1367883338d5f8381ec41157329b6082f8fa7c8..bda92e6e68c58144a1c5719ce0f10f4f61a2104d 100644 (file)
@@ -1380,6 +1380,14 @@ ARMPreAllocLoadStoreOpt::CanFormLdStDWord(MachineInstr *Op0, MachineInstr *Op1,
   return true;
 }
 
+static MachineMemOperand *CopyMMO(const MachineMemOperand *MMO,
+                                  unsigned NewSize, MachineFunction *MF) {
+  return MF->getMachineMemOperand(MachinePointerInfo(MMO->getValue(),
+                                                     MMO->getOffset()),
+                                  MMO->getFlags(), NewSize,
+                                  MMO->getAlignment(), MMO->getTBAAInfo());
+}
+
 bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
                                  SmallVector<MachineInstr*, 4> &Ops,
                                  unsigned Base, bool isLd,
@@ -1487,6 +1495,11 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
             if (!isT2)
               MIB.addReg(0);
             MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
+
+            // Copy memoperands bug change size to 8.
+            for (MachineInstr::mmo_iterator mmo = Op0->memoperands_begin();
+                 mmo != Op0->memoperands_end(); ++mmo)
+              MIB.addMemOperand(CopyMMO(*mmo, 8, MF));
             ++NumLDRDFormed;
           } else {
             MachineInstrBuilder MIB = BuildMI(*MBB, InsertPos,
@@ -1500,6 +1513,10 @@ bool ARMPreAllocLoadStoreOpt::RescheduleOps(MachineBasicBlock *MBB,
             if (!isT2)
               MIB.addReg(0);
             MIB.addImm(Offset).addImm(Pred).addReg(PredReg);
+             // Copy memoperands bug change size to 8.
+            for (MachineInstr::mmo_iterator mmo = Op0->memoperands_begin();
+                 mmo != Op0->memoperands_end(); ++mmo)
+              MIB.addMemOperand(CopyMMO(*mmo, 8, MF));
             ++NumSTRDFormed;
           }
           MBB->erase(Op0);