diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp index eee54f09fbad..d6c0a782465e 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/SplitKit.cpp @@ -45,6 +45,11 @@ using namespace llvm; #define DEBUG_TYPE "regalloc" +static cl::opt<bool> + EnableLoopIVHeuristic("enable-split-loopiv-heuristic", + cl::desc("Enable loop iv regalloc heuristic"), + cl::init(true)); + STATISTIC(NumFinished, "Number of splits finished"); STATISTIC(NumSimple, "Number of splits that were simple"); STATISTIC(NumCopies, "Number of copies inserted for splitting"); @@ -126,7 +131,6 @@ InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI, // If the value leaving MBB was defined after the call in MBB, it can't // really be live-in to the landing pad. This can happen if the landing pad // has a PHI, and this register is undef on the exceptional edge. - // <rdar://problem/10664933> if (!SlotIndex::isEarlierInstr(VNI->def, LIP.second) && VNI->def < MBBEnd) return LIP.first; @@ -294,6 +298,13 @@ void SplitAnalysis::calcLiveBlockInfo() { MFI = LIS.getMBBFromIndex(LVI->start)->getIterator(); } + LooksLikeLoopIV = EnableLoopIVHeuristic && UseBlocks.size() == 2 && + any_of(UseBlocks, [this](BlockInfo &BI) { + MachineLoop *L = Loops.getLoopFor(BI.MBB); + return BI.LiveIn && BI.LiveOut && BI.FirstDef && L && + L->isLoopLatch(BI.MBB); + }); + assert(getNumLiveBlocks() == countLiveBlocks(CurLI) && "Bad block count"); } @@ -514,10 +525,10 @@ void SplitEditor::forceRecompute(unsigned RegIdx, const VNInfo &ParentVNI) { VFP = ValueForcePair(nullptr, true); } -SlotIndex SplitEditor::buildSingleSubRegCopy(Register FromReg, Register ToReg, - MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, - unsigned SubIdx, LiveInterval &DestLI, bool Late, SlotIndex Def) { - const MCInstrDesc &Desc = TII.get(TargetOpcode::COPY); +SlotIndex SplitEditor::buildSingleSubRegCopy( + Register FromReg, Register ToReg, MachineBasicBlock &MBB, + MachineBasicBlock::iterator InsertBefore, unsigned SubIdx, + LiveInterval &DestLI, bool Late, SlotIndex Def, const MCInstrDesc &Desc) { bool FirstCopy = !Def.isValid(); MachineInstr *CopyMI = BuildMI(MBB, InsertBefore, DebugLoc(), Desc) .addReg(ToReg, RegState::Define | getUndefRegState(FirstCopy) @@ -536,7 +547,8 @@ SlotIndex SplitEditor::buildSingleSubRegCopy(Register FromReg, Register ToReg, SlotIndex SplitEditor::buildCopy(Register FromReg, Register ToReg, LaneBitmask LaneMask, MachineBasicBlock &MBB, MachineBasicBlock::iterator InsertBefore, bool Late, unsigned RegIdx) { - const MCInstrDesc &Desc = TII.get(TargetOpcode::COPY); + const MCInstrDesc &Desc = + TII.get(TII.getLiveRangeSplitOpcode(FromReg, *MBB.getParent())); SlotIndexes &Indexes = *LIS.getSlotIndexes(); if (LaneMask.all() || LaneMask == MRI.getMaxLaneMaskForVReg(FromReg)) { // The full vreg is copied. @@ -564,7 +576,7 @@ SlotIndex SplitEditor::buildCopy(Register FromReg, Register ToReg, SlotIndex Def; for (unsigned BestIdx : SubIndexes) { Def = buildSingleSubRegCopy(FromReg, ToReg, MBB, InsertBefore, BestIdx, - DestLI, Late, Def); + DestLI, Late, Def, Desc); } BumpPtrAllocator &Allocator = LIS.getVNInfoAllocator(); @@ -795,8 +807,10 @@ SlotIndex SplitEditor::leaveIntvAtTop(MachineBasicBlock &MBB) { return Start; } - VNInfo *VNI = defFromParent(0, ParentVNI, Start, MBB, - MBB.SkipPHIsLabelsAndDebug(MBB.begin())); + unsigned RegIdx = 0; + Register Reg = LIS.getInterval(Edit->get(RegIdx)).reg(); + VNInfo *VNI = defFromParent(RegIdx, ParentVNI, Start, MBB, + MBB.SkipPHIsLabelsAndDebug(MBB.begin(), Reg)); RegAssign.insert(Start, VNI->def, OpenIdx); LLVM_DEBUG(dump()); return VNI->def; @@ -1584,7 +1598,9 @@ bool SplitAnalysis::shouldSplitSingleBlock(const BlockInfo &BI, if (BI.LiveIn && BI.LiveOut) return true; // No point in isolating a copy. It has no register class constraints. - if (LIS.getInstructionFromIndex(BI.FirstInstr)->isCopyLike()) + MachineInstr *MI = LIS.getInstructionFromIndex(BI.FirstInstr); + bool copyLike = TII.isCopyInstr(*MI) || MI->isSubregToReg(); + if (copyLike) return false; // Finally, don't isolate an end point that was created by earlier splits. return isOriginalEndpoint(BI.FirstInstr); |