diff --git a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp index d4269849cf8a..c3c6fee98311 100644 --- a/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/llvm/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -180,8 +180,7 @@ void LiveIntervals::print(std::ostream &O) const { O << ((Value*)mbbi->getBasicBlock())->getName() << ":\n"; for (MachineBasicBlock::iterator mii = mbbi->begin(), mie = mbbi->end(); mii != mie; ++mii) { - O << getInstructionIndex(mii) << '\t'; - mii->print(O, tm_); + O << getInstructionIndex(mii) << '\t' << *mii; } } } @@ -219,6 +218,9 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) { for (unsigned i = 0; i != mi->getNumOperands(); ++i) { MachineOperand& mop = mi->getOperand(i); if (mop.isRegister() && mop.getReg() == li.reg) { + // First thing, attempt to fold the memory reference into the + // instruction. If we can do this, we don't need to insert spill + // code. if (MachineInstr* fmi = mri_->foldMemoryOperand(mi, i, slot)) { if (lv_) lv_->instructionChanged(mi, fmi); @@ -226,12 +228,14 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) { mi2iMap_.erase(mi); i2miMap_[index/InstrSlots::NUM] = fmi; mi2iMap_[fmi] = index; - MachineBasicBlock& mbb = *mi->getParent(); - mi = mbb.insert(mbb.erase(mi), fmi); + MachineBasicBlock &MBB = *mi->getParent(); + mi = MBB.insert(MBB.erase(mi), fmi); ++numFolded; + + // Folding the load/store can completely change the instruction in + // unpredictable ways, rescan it from the beginning. goto for_operand; - } - else { + } else { // This is tricky. We need to add information in the interval about // the spill code so we have to use our extra load/store slots. // @@ -519,8 +523,7 @@ void LiveIntervals::computeIntervals() mi != miEnd; ++mi) { const TargetInstrDescriptor& tid = tm_->getInstrInfo()->get(mi->getOpcode()); - DEBUG(std::cerr << getInstructionIndex(mi) << "\t"; - mi->print(std::cerr, tm_)); + DEBUG(std::cerr << getInstructionIndex(mi) << "\t" << *mi); // handle implicit defs for (const unsigned* id = tid.ImplicitDefs; *id; ++id) diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index eb6553d53b58..4d7c826a8973 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -153,7 +153,7 @@ bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF, unsigned VirtReg = MOP.getReg(); unsigned PhysReg = VRM.getPhys(VirtReg); if (VRM.hasStackSlot(VirtReg)) { - int StackSlot = VRM.getStackSlot(VirtReg); + int StackSlot = VRM.getStackSlot(VirtReg); if (MOP.isUse() && std::find(LoadedRegs.begin(), LoadedRegs.end(), VirtReg) @@ -161,7 +161,7 @@ bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF, MRI.loadRegFromStackSlot(MBB, &MI, PhysReg, StackSlot); LoadedRegs.push_back(VirtReg); ++NumLoads; - DEBUG(std::cerr << '\t'; prior(MII)->print(std::cerr, &TM)); + DEBUG(std::cerr << '\t' << *prior(MII)); } if (MOP.isDef()) { @@ -173,7 +173,7 @@ bool SimpleSpiller::runOnMachineFunction(MachineFunction& MF, MI.SetMachineOperandReg(i, PhysReg); } } - DEBUG(std::cerr << '\t'; MI.print(std::cerr, &TM)); + DEBUG(std::cerr << '\t' << MI); LoadedRegs.clear(); } } @@ -228,8 +228,7 @@ namespace { MRI->loadRegFromStackSlot(MBB, MII, PhysReg, VRM->getStackSlot(VirtReg)); ++NumLoads; - DEBUG(std::cerr << "added: "; - prior(MII)->print(std::cerr, TM)); + DEBUG(std::cerr << "added: " << *prior(MII)); lastDef_[VirtReg] = MII; } } @@ -293,10 +292,8 @@ void LocalSpiller::vacateJustPhysReg(MachineBasicBlock& MBB, PhysReg, VRM->getStackSlot(VirtReg)); ++NumStores; - DEBUG(std::cerr << "added: "; - prior(nextLastRef)->print(std::cerr, TM); - std::cerr << "after: "; - lastDef->print(std::cerr, TM)); + DEBUG(std::cerr << "added: " << *prior(nextLastRef); + std::cerr << "after: " << *lastDef); lastDef_[VirtReg] = 0; } p2vMap_[PhysReg] = 0; @@ -360,7 +357,7 @@ void LocalSpiller::eliminateVirtRegsInMBB(MachineBasicBlock &MBB) { } } - DEBUG(std::cerr << '\t'; MI->print(std::cerr, TM)); + DEBUG(std::cerr << '\t' << *MI); } for (unsigned i = 1, e = p2vMap_.size(); i != e; ++i)