diff --git a/lib/Target/ARM/Thumb2ITBlockPass.cpp b/lib/Target/ARM/Thumb2ITBlockPass.cpp index 7bb226510a2..b62ae2e3429 100644 --- a/lib/Target/ARM/Thumb2ITBlockPass.cpp +++ b/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 &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; }