diff options
author | Evan Cheng <evan.cheng@apple.com> | 2007-11-29 10:12:14 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2007-11-29 10:12:14 +0000 |
commit | 1953d0cb7d6d27da3ad067468a7ad6dd7c4fa46e (patch) | |
tree | e4dd7a1283e526db8646d9a174576ea881b65740 /include/llvm/CodeGen | |
parent | 213ee902ccbe342abcc79695fac8514870ed4bab (diff) |
Fix a major performance issue with splitting. If there is a def (not def/use)
in the middle of a split basic block, create a new live interval starting at
the def. This avoid artifically extending the live interval over a number of
cycles where it is dead. e.g.
bb1:
= vr1204 (use / kill) <= new interval starts and ends here.
...
...
vr1204 = (new def) <= start a new interval here.
= vr1204 (use)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44436 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen')
-rw-r--r-- | include/llvm/CodeGen/LiveIntervalAnalysis.h | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h index a83d3deca4..0318def5a0 100644 --- a/include/llvm/CodeGen/LiveIntervalAnalysis.h +++ b/include/llvm/CodeGen/LiveIntervalAnalysis.h @@ -286,6 +286,21 @@ namespace llvm { /// within a single basic block. bool intervalIsInOneMBB(const LiveInterval &li) const; + /// SRInfo - Spill / restore info. + struct SRInfo { + int index; + unsigned vreg; + bool canFold; + SRInfo(int i, unsigned vr, bool f) : index(i), vreg(vr), canFold(f) {}; + }; + + bool alsoFoldARestore(int Id, int index, unsigned vr, + BitVector &RestoreMBBs, + std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes); + void eraseRestoreInfo(int Id, int index, unsigned vr, + BitVector &RestoreMBBs, + std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes); + /// rewriteInstructionForSpills, rewriteInstructionsForSpills - Helper functions /// for addIntervalsForSpills to rewrite uses / defs for the given live range. void rewriteInstructionForSpills(const LiveInterval &li, bool TrySplit, @@ -295,7 +310,7 @@ namespace llvm { VirtRegMap &vrm, SSARegMap *RegMap, const TargetRegisterClass* rc, SmallVector<int, 4> &ReMatIds, unsigned &NewVReg, bool &HasDef, bool &HasUse, const LoopInfo *loopInfo, - std::map<unsigned,unsigned> &NewVRegs, + std::map<unsigned,unsigned> &MBBVRegsMap, std::vector<LiveInterval*> &NewLIs); void rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit, LiveInterval::Ranges::const_iterator &I, @@ -304,10 +319,10 @@ namespace llvm { VirtRegMap &vrm, SSARegMap *RegMap, const TargetRegisterClass* rc, SmallVector<int, 4> &ReMatIds, const LoopInfo *loopInfo, BitVector &SpillMBBs, - std::map<unsigned, std::pair<int, bool> > &SpillIdxes, + std::map<unsigned,std::vector<SRInfo> > &SpillIdxes, BitVector &RestoreMBBs, - std::map<unsigned, std::pair<int, bool> > &RestoreIdxes, - std::map<unsigned,unsigned> &NewVRegs, + std::map<unsigned,std::vector<SRInfo> > &RestoreIdxes, + std::map<unsigned,unsigned> &MBBVRegsMap, std::vector<LiveInterval*> &NewLIs); static LiveInterval createInterval(unsigned Reg); |