X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FLiveIntervalAnalysis.h;h=47ba1ff0454289181c1ddfb45bc10bc466715c32;hb=0219a272ec3c1a3784bd85bd0dc2fa457743ffd6;hp=098262aa828a5415a29c1cfdef87d881050225a1;hpb=a955eabc7b080744e6af25a2c803aeafbf1940a4;p=oota-llvm.git diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h index 098262aa828..47ba1ff0454 100644 --- a/include/llvm/CodeGen/LiveIntervalAnalysis.h +++ b/include/llvm/CodeGen/LiveIntervalAnalysis.h @@ -27,12 +27,15 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/SlotIndexes.h" #include "llvm/Support/Allocator.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Target/TargetRegisterInfo.h" #include #include namespace llvm { +extern cl::opt UseSegmentSetForPhysRegs; + class AliasAnalysis; class BitVector; class BlockFrequency; @@ -97,7 +100,7 @@ namespace llvm { public: static char ID; // Pass identification, replacement for typeid LiveIntervals(); - virtual ~LiveIntervals(); + ~LiveIntervals() override; // Calculate the spill weight to assign to a single instruction. static float getSpillWeight(bool isDef, bool isUse, @@ -144,13 +147,12 @@ namespace llvm { LiveInterval::Segment addSegmentToEndOfBlock(unsigned reg, MachineInstr* startInst); - /// shrinkToUses - After removing some uses of a register, shrink its live - /// range to just the remaining uses. This method does not compute reaching - /// defs for new uses, and it doesn't remove dead defs. - /// Dead PHIDef values are marked as unused. - /// New dead machine instructions are added to the dead vector. - /// Return true if the interval may have been separated into multiple - /// connected components. + /// After removing some uses of a register, shrink its live range to just + /// the remaining uses. This method does not compute reaching defs for new + /// uses, and it doesn't remove dead defs. + /// Dead PHIDef values are marked as unused. New dead machine instructions + /// are added to the dead vector. Returns true if the interval may have been + /// separated into multiple connected components. bool shrinkToUses(LiveInterval *li, SmallVectorImpl *dead = nullptr); @@ -158,6 +160,8 @@ namespace llvm { /// shrinkToUses(LiveInterval *li, SmallVectorImpl *dead) /// that works on a subregister live range and only looks at uses matching /// the lane mask of the subregister range. + /// This may leave the subrange empty which needs to be cleaned up with + /// LiveInterval::removeEmptySubranges() afterwards. void shrinkToUses(LiveInterval::SubRange &SR, unsigned Reg); /// extendToIndices - Extend the live range of LI to reach all points in @@ -377,7 +381,8 @@ namespace llvm { LiveRange *LR = RegUnitRanges[Unit]; if (!LR) { // Compute missing ranges on demand. - RegUnitRanges[Unit] = LR = new LiveRange(); + // Use segment set to speed-up initial computation of the live range. + RegUnitRanges[Unit] = LR = new LiveRange(UseSegmentSetForPhysRegs); computeRegUnitRange(*LR, Unit); } return *LR; @@ -398,6 +403,10 @@ namespace llvm { /// of its subregisters. void removePhysRegDefAt(unsigned Reg, SlotIndex Pos); + /// Remove value number and related live segments of @p LI and its subranges + /// that start at position @p Pos. + void removeVRegDefAt(LiveInterval &LI, SlotIndex Pos); + private: /// Compute live intervals for all virtual registers. void computeVirtRegs();