From 997ba49e23135bd7cfcf23b6166e6b2d747b1b88 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 18 Nov 2008 23:54:01 +0000 Subject: [PATCH] Make the same change to RegScavenger::backward. llvm-svn: 59566 --- lib/CodeGen/RegisterScavenging.cpp | 37 ++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/lib/CodeGen/RegisterScavenging.cpp b/lib/CodeGen/RegisterScavenging.cpp index e89b2a09c99..42577965009 100644 --- a/lib/CodeGen/RegisterScavenging.cpp +++ b/lib/CodeGen/RegisterScavenging.cpp @@ -282,15 +282,38 @@ void RegScavenger::backward() { MBBI = prior(MBBI); MachineInstr *MI = MBBI; - // Process defs first. const TargetInstrDesc &TID = MI->getDesc(); + + // Separate register operands into 3 classes: uses, defs, earlyclobbers. + SmallVector, 4> UseMOs; + SmallVector, 4> DefMOs; + SmallVector, 4> EarlyClobberMOs; for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { const MachineOperand &MO = MI->getOperand(i); - if (!MO.isReg() || !MO.isDef()) + if (!MO.isReg() || MO.getReg() == 0) continue; + if (MO.isUse()) + UseMOs.push_back(std::make_pair(&MO,i)); + else if (MO.isEarlyClobber()) + EarlyClobberMOs.push_back(std::make_pair(&MO,i)); + else + DefMOs.push_back(std::make_pair(&MO,i)); + } + + + // Process defs first. + unsigned NumECs = EarlyClobberMOs.size(); + unsigned NumDefs = DefMOs.size(); + for (unsigned i = 0, e = NumECs + NumDefs; i != e; ++i) { + const MachineOperand &MO = (i < NumDefs) + ? *DefMOs[i].first : *EarlyClobberMOs[i-NumDefs].first; + unsigned Idx = (i < NumECs) + ? DefMOs[i].second : EarlyClobberMOs[i-NumDefs].second; + // Skip two-address destination operand. - if (TID.findTiedToSrcOperand(i) != -1) + if (TID.findTiedToSrcOperand(Idx) != -1) continue; + unsigned Reg = MO.getReg(); assert(isUsed(Reg)); if (!isReserved(Reg)) @@ -299,13 +322,9 @@ void RegScavenger::backward() { // Process uses. BitVector UseRegs(NumPhysRegs); - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - const MachineOperand &MO = MI->getOperand(i); - if (!MO.isReg() || !MO.isUse()) - continue; + for (unsigned i = 0, e = UseMOs.size(); i != e; ++i) { + const MachineOperand MO = *UseMOs[i].first; unsigned Reg = MO.getReg(); - if (Reg == 0) - continue; assert(isUnused(Reg) || isReserved(Reg)); UseRegs.set(Reg);