mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-01-07 06:22:32 +00:00
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
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user