diff options
Diffstat (limited to 'contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp b/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp index fdcb522..b62ae2e 100644 --- a/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/contrib/llvm/lib/Target/ARM/Thumb2ITBlockPass.cpp @@ -90,6 +90,19 @@ static void TrackDefUses(MachineInstr *MI, } } +/// Clear kill flags for any uses in the given set. This will likely +/// conservatively remove more kill flags than are necessary, but removing them +/// is safer than incorrect kill flags remaining on instructions. +static void ClearKillFlags(MachineInstr *MI, SmallSet<unsigned, 4> &Uses) { + for (MIOperands MO(MI); MO.isValid(); ++MO) { + if (!MO->isReg() || MO->isDef() || !MO->isKill()) + continue; + if (!Uses.count(MO->getReg())) + continue; + MO->setIsKill(false); + } +} + static bool isCopy(MachineInstr *MI) { switch (MI->getOpcode()) { default: @@ -222,6 +235,7 @@ bool Thumb2ITBlockPass::InsertITInstructions(MachineBasicBlock &MBB) { --MBBI; MBB.remove(NMI); MBB.insert(InsertPos, NMI); + ClearKillFlags(MI, Uses); ++NumMovedInsts; continue; } @@ -253,12 +267,14 @@ bool Thumb2ITBlockPass::InsertITInstructions(MachineBasicBlock &MBB) { } bool Thumb2ITBlockPass::runOnMachineFunction(MachineFunction &Fn) { - const TargetMachine &TM = Fn.getTarget(); + const ARMSubtarget &STI = + static_cast<const ARMSubtarget &>(Fn.getSubtarget()); + if (!STI.isThumb2()) + return false; AFI = Fn.getInfo<ARMFunctionInfo>(); - TII = static_cast<const Thumb2InstrInfo *>( - TM.getSubtargetImpl()->getInstrInfo()); - TRI = TM.getSubtargetImpl()->getRegisterInfo(); - restrictIT = TM.getSubtarget<ARMSubtarget>().restrictIT(); + TII = static_cast<const Thumb2InstrInfo *>(STI.getInstrInfo()); + TRI = STI.getRegisterInfo(); + restrictIT = STI.restrictIT(); if (!AFI->isThumbFunction()) return false; |