X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FLiveIntervalAnalysis.h;h=f7f4569cb3518b05f08268bd8311d03642bf8014;hb=151c80be8180a7a0aa1594848699aa6b678b3998;hp=37b64571aa6748aa9bfb73d2c80a373960182139;hpb=706515727c6d024015fffded2b3109a4f0ac5299;p=oota-llvm.git diff --git a/lib/CodeGen/LiveIntervalAnalysis.h b/lib/CodeGen/LiveIntervalAnalysis.h index 37b64571aa6..f7f4569cb35 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.h +++ b/lib/CodeGen/LiveIntervalAnalysis.h @@ -20,6 +20,7 @@ #ifndef LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H #define LLVM_CODEGEN_LIVEINTERVAL_ANALYSIS_H +#include "llvm/ADT/DenseMap.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "LiveInterval.h" @@ -27,12 +28,14 @@ namespace llvm { class LiveVariables; class MRegisterInfo; + class TargetInstrInfo; class VirtRegMap; class LiveIntervals : public MachineFunctionPass { MachineFunction* mf_; const TargetMachine* tm_; const MRegisterInfo* mri_; + const TargetInstrInfo* tii_; LiveVariables* lv_; typedef std::map Mi2IndexMap; @@ -44,9 +47,11 @@ namespace llvm { typedef std::map Reg2IntervalMap; Reg2IntervalMap r2iMap_; - typedef std::map Reg2RegMap; + typedef DenseMap Reg2RegMap; Reg2RegMap r2rMap_; + std::vector allocatableRegs_; + public: struct InstrSlots { @@ -78,8 +83,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(); } @@ -122,6 +129,9 @@ namespace llvm { /// runOnMachineFunction - pass entry point virtual bool runOnMachineFunction(MachineFunction&); + /// print - Implement the dump method. + virtual void print(std::ostream &O, const Module* = 0) const; + private: /// computeIntervals - compute live intervals void computeIntervals(); @@ -146,11 +156,15 @@ namespace llvm { MachineBasicBlock::iterator mi, LiveInterval& interval); - /// handlePhysicalRegisterDef - update intervals for a - /// physical register def + /// handlePhysicalRegisterDef - update intervals for a physical register + /// def. If the defining instruction is a move instruction, SrcReg will be + /// the input register, and DestReg will be the result. Note that Interval + /// may not match DestReg (it might be an alias instead). + /// void handlePhysicalRegisterDef(MachineBasicBlock* mbb, MachineBasicBlock::iterator mi, - LiveInterval& interval); + LiveInterval& interval, + unsigned SrcReg, unsigned DestReg); /// Return true if the two specified registers belong to different /// register classes. The registers may be either phys or virt regs. @@ -169,11 +183,11 @@ namespace llvm { } /// rep - returns the representative of this register - unsigned rep(unsigned reg) { - Reg2RegMap::iterator it = r2rMap_.find(reg); - if (it != r2rMap_.end()) - return it->second = rep(it->second); - return reg; + unsigned rep(unsigned Reg) { + unsigned Rep = r2rMap_[Reg]; + if (Rep) + return r2rMap_[Reg] = rep(Rep); + return Reg; } void printRegName(unsigned reg) const;