diff options
author | Evan Cheng <evan.cheng@apple.com> | 2009-06-19 01:59:04 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2009-06-19 01:59:04 +0000 |
commit | e00db516add6190879718cee2dc7f822cc9bcafb (patch) | |
tree | 8a0dda4b162a4010e16381f8dced7f0f15b83212 /lib | |
parent | c43dcd4a8c9ca24510a07ca707e59d95a1090b27 (diff) | |
download | external_llvm-e00db516add6190879718cee2dc7f822cc9bcafb.zip external_llvm-e00db516add6190879718cee2dc7f822cc9bcafb.tar.gz external_llvm-e00db516add6190879718cee2dc7f822cc9bcafb.tar.bz2 |
Transfer dead markers when a ldrd is changed into a ldm or a pair of ldr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73749 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/ARM/ARMLoadStoreOptimizer.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp index f8de0ef..5cdb244 100644 --- a/lib/Target/ARM/ARMLoadStoreOptimizer.cpp +++ b/lib/Target/ARM/ARMLoadStoreOptimizer.cpp @@ -620,7 +620,7 @@ static void InsertLDR_STR(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, int OffImm, bool isDef, DebugLoc dl, unsigned NewOpc, - unsigned Reg, bool RegKill, + unsigned Reg, bool RegDeadKill, unsigned BaseReg, bool BaseKill, unsigned OffReg, bool OffKill, ARMCC::CondCodes Pred, unsigned PredReg, @@ -631,14 +631,15 @@ static void InsertLDR_STR(MachineBasicBlock &MBB, else Offset = ARM_AM::getAM2Opc(ARM_AM::add, OffImm, ARM_AM::no_shift); if (isDef) - BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(NewOpc), Reg) + BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(NewOpc)) + .addReg(Reg, getDefRegState(true) | getDeadRegState(RegDeadKill)) .addReg(BaseReg, getKillRegState(BaseKill)) .addReg(OffReg, getKillRegState(OffKill)) .addImm(Offset) .addImm(Pred).addReg(PredReg); else BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(NewOpc)) - .addReg(Reg, getKillRegState(RegKill)) + .addReg(Reg, getKillRegState(RegDeadKill)) .addReg(BaseReg, getKillRegState(BaseKill)) .addReg(OffReg, getKillRegState(OffKill)) .addImm(Offset) @@ -658,8 +659,10 @@ bool ARMLoadStoreOpt::FixInvalidRegPairOp(MachineBasicBlock &MBB, return false; bool isLd = Opcode == ARM::LDRD; - bool EvenKill = isLd ? false : MI->getOperand(0).isKill(); - bool OddKill = isLd ? false : MI->getOperand(1).isKill(); + bool EvenDeadKill = isLd ? + MI->getOperand(0).isDead() : MI->getOperand(0).isKill(); + bool OddDeadKill = isLd ? + MI->getOperand(1).isDead() : MI->getOperand(1).isKill(); const MachineOperand &BaseOp = MI->getOperand(2); unsigned BaseReg = BaseOp.getReg(); bool BaseKill = BaseOp.isKill(); @@ -679,16 +682,16 @@ bool ARMLoadStoreOpt::FixInvalidRegPairOp(MachineBasicBlock &MBB, .addReg(BaseReg, getKillRegState(BaseKill)) .addImm(ARM_AM::getAM4ModeImm(ARM_AM::ia)) .addImm(Pred).addReg(PredReg) - .addReg(EvenReg, getDefRegState(isLd)) - .addReg(OddReg, getDefRegState(isLd)); + .addReg(EvenReg, getDefRegState(isLd) | getDeadRegState(EvenDeadKill)) + .addReg(OddReg, getDefRegState(isLd) | getDeadRegState(OddDeadKill)); ++NumLDRD2LDM; } else { BuildMI(MBB, MBBI, MBBI->getDebugLoc(), TII->get(NewOpc)) .addReg(BaseReg, getKillRegState(BaseKill)) .addImm(ARM_AM::getAM4ModeImm(ARM_AM::ia)) .addImm(Pred).addReg(PredReg) - .addReg(EvenReg, getKillRegState(EvenKill)) - .addReg(OddReg, getKillRegState(OddKill)); + .addReg(EvenReg, getKillRegState(EvenDeadKill)) + .addReg(OddReg, getKillRegState(OddDeadKill)); ++NumSTRD2STM; } } else { @@ -703,15 +706,17 @@ bool ARMLoadStoreOpt::FixInvalidRegPairOp(MachineBasicBlock &MBB, (OffReg && TRI->regsOverlap(EvenReg, OffReg)))) { assert(!TRI->regsOverlap(OddReg, BaseReg) && (!OffReg || !TRI->regsOverlap(OddReg, OffReg))); - InsertLDR_STR(MBB, MBBI, OffImm+4, isLd, dl, NewOpc, OddReg, OddKill, + InsertLDR_STR(MBB, MBBI, OffImm+4, isLd, dl, NewOpc, OddReg, OddDeadKill, BaseReg, false, OffReg, false, Pred, PredReg, TII); - InsertLDR_STR(MBB, MBBI, OffImm, isLd, dl, NewOpc, EvenReg, EvenKill, + InsertLDR_STR(MBB, MBBI, OffImm, isLd, dl, NewOpc, EvenReg, EvenDeadKill, BaseReg, BaseKill, OffReg, OffKill, Pred, PredReg, TII); } else { - InsertLDR_STR(MBB, MBBI, OffImm, isLd, dl, NewOpc, EvenReg, EvenKill, - BaseReg, false, OffReg, false, Pred, PredReg, TII); - InsertLDR_STR(MBB, MBBI, OffImm+4, isLd, dl, NewOpc, OddReg, OddKill, - BaseReg, BaseKill, OffReg, OffKill, Pred, PredReg, TII); + InsertLDR_STR(MBB, MBBI, OffImm, isLd, dl, NewOpc, + EvenReg, EvenDeadKill, BaseReg, false, OffReg, false, + Pred, PredReg, TII); + InsertLDR_STR(MBB, MBBI, OffImm+4, isLd, dl, NewOpc, + OddReg, OddDeadKill, BaseReg, BaseKill, OffReg, OffKill, + Pred, PredReg, TII); } if (isLd) ++NumLDRD2LDR; |