diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h index b90be627041..036ca132d22 100644 --- a/include/llvm/CodeGen/LiveIntervalAnalysis.h +++ b/include/llvm/CodeGen/LiveIntervalAnalysis.h @@ -81,8 +81,10 @@ namespace llvm { return getBaseIndex(index) + InstrSlots::STORE; } - // FIXME: this should really be a const_iterator typedef Reg2IntervalMap::iterator iterator; + typedef Reg2IntervalMap::const_iterator const_iterator; + const_iterator begin() const { return r2iMap_.begin(); } + const_iterator end() const { return r2iMap_.end(); } iterator begin() { return r2iMap_.begin(); } iterator end() { return r2iMap_.end(); } unsigned getNumIntervals() const { return r2iMap_.size(); } @@ -125,6 +127,9 @@ namespace llvm { /// runOnMachineFunction - pass entry point virtual bool runOnMachineFunction(MachineFunction&); + /// print - Implement the dump method. + virtual void print(std::ostream &O) const; + private: /// computeIntervals - compute live intervals void computeIntervals(); diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 04978d62e82..d4269849cf8 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -164,29 +164,31 @@ bool LiveIntervals::runOnMachineFunction(MachineFunction &fn) { } } - DEBUG(std::cerr << "********** INTERVALS **********\n"); - DEBUG (for (iterator I = begin(), E = end(); I != E; ++I) - std::cerr << I->second << "\n"); - DEBUG(std::cerr << "********** MACHINEINSTRS **********\n"); - DEBUG( - for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end(); - mbbi != mbbe; ++mbbi) { - std::cerr << ((Value*)mbbi->getBasicBlock())->getName() << ":\n"; - for (MachineBasicBlock::iterator mii = mbbi->begin(), - mie = mbbi->end(); mii != mie; ++mii) { - std::cerr << getInstructionIndex(mii) << '\t'; - mii->print(std::cerr, tm_); - } - }); - + DEBUG(dump()); return true; } -std::vector LiveIntervals::addIntervalsForSpills( - const LiveInterval& li, - VirtRegMap& vrm, - int slot) -{ +/// print - Implement the dump method. +void LiveIntervals::print(std::ostream &O) const { + O << "********** INTERVALS **********\n"; + for (const_iterator I = begin(), E = end(); I != E; ++I) + O << I->second << "\n"; + + O << "********** MACHINEINSTRS **********\n"; + for (MachineFunction::iterator mbbi = mf_->begin(), mbbe = mf_->end(); + mbbi != mbbe; ++mbbi) { + 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_); + } + } +} + + +std::vector LiveIntervals:: +addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, int slot) { // since this is called after the analysis is done we don't know if // LiveVariables is available lv_ = getAnalysisToUpdate(); @@ -230,20 +232,18 @@ std::vector LiveIntervals::addIntervalsForSpills( goto for_operand; } 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. + // 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. // - // If we have a use we are going to have a load so - // we start the interval from the load slot - // onwards. Otherwise we start from the def slot. + // If we have a use we are going to have a load so we start the + // interval from the load slot onwards. Otherwise we start from the + // def slot. unsigned start = (mop.isUse() ? getLoadIndex(index) : getDefIndex(index)); - // If we have a def we are going to have a store - // right after it so we end the interval after the - // use of the next instruction. Otherwise we end - // after the use of this instruction. + // If we have a def we are going to have a store right after it so + // we end the interval after the use of the next + // instruction. Otherwise we end after the use of this instruction. unsigned end = 1 + (mop.isDef() ? getStoreIndex(index) : getUseIndex(index)); @@ -255,6 +255,7 @@ std::vector LiveIntervals::addIntervalsForSpills( vrm.assignVirt2StackSlot(nReg, slot); LiveInterval& nI = getOrCreateInterval(nReg); assert(nI.empty()); + // the spill weight is now infinity as it // cannot be spilled again nI.weight = HUGE_VAL; @@ -262,6 +263,7 @@ std::vector LiveIntervals::addIntervalsForSpills( DEBUG(std::cerr << " +" << LR); nI.addRange(LR); added.push_back(&nI); + // update live variables if it is available if (lv_) lv_->addVirtualRegisterKilled(nReg, mi); diff --git a/lib/CodeGen/LiveIntervalAnalysis.h b/lib/CodeGen/LiveIntervalAnalysis.h index b90be627041..036ca132d22 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.h +++ b/lib/CodeGen/LiveIntervalAnalysis.h @@ -81,8 +81,10 @@ namespace llvm { return getBaseIndex(index) + InstrSlots::STORE; } - // FIXME: this should really be a const_iterator typedef Reg2IntervalMap::iterator iterator; + typedef Reg2IntervalMap::const_iterator const_iterator; + const_iterator begin() const { return r2iMap_.begin(); } + const_iterator end() const { return r2iMap_.end(); } iterator begin() { return r2iMap_.begin(); } iterator end() { return r2iMap_.end(); } unsigned getNumIntervals() const { return r2iMap_.size(); } @@ -125,6 +127,9 @@ namespace llvm { /// runOnMachineFunction - pass entry point virtual bool runOnMachineFunction(MachineFunction&); + /// print - Implement the dump method. + virtual void print(std::ostream &O) const; + private: /// computeIntervals - compute live intervals void computeIntervals();