diff options
Diffstat (limited to 'llvm/lib/CodeGen/SplitKit.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SplitKit.cpp | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/SplitKit.cpp b/llvm/lib/CodeGen/SplitKit.cpp index aaaa342b520..1467179b7a3 100644 --- a/llvm/lib/CodeGen/SplitKit.cpp +++ b/llvm/lib/CodeGen/SplitKit.cpp @@ -1,4 +1,4 @@ -//===---------- SplitKit.cpp - Toolkit for splitting live ranges ----------===// +//===- SplitKit.cpp - Toolkit for splitting live ranges -------------------===// // // The LLVM Compiler Infrastructure // @@ -13,20 +13,46 @@ //===----------------------------------------------------------------------===// #include "SplitKit.h" +#include "LiveRangeCalc.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/DenseSet.h" +#include "llvm/ADT/None.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" +#include "llvm/CodeGen/LiveInterval.h" #include "llvm/CodeGen/LiveIntervalAnalysis.h" #include "llvm/CodeGen/LiveRangeEdit.h" +#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" #include "llvm/CodeGen/MachineDominators.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineLoopInfo.h" +#include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/SlotIndexes.h" #include "llvm/CodeGen/VirtRegMap.h" +#include "llvm/IR/DebugLoc.h" +#include "llvm/MC/LaneBitmask.h" +#include "llvm/Support/Allocator.h" +#include "llvm/Support/BlockFrequency.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" -#include "llvm/Support/MathExtras.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetOpcodes.h" +#include "llvm/Target/TargetRegisterInfo.h" +#include "llvm/Target/TargetSubtargetInfo.h" +#include <algorithm> +#include <cassert> +#include <iterator> +#include <limits> +#include <tuple> +#include <utility> using namespace llvm; @@ -125,8 +151,7 @@ InsertPointAnalysis::getLastInsertPointIter(const LiveInterval &CurLI, SplitAnalysis::SplitAnalysis(const VirtRegMap &vrm, const LiveIntervals &lis, const MachineLoopInfo &mli) : MF(vrm.getMachineFunction()), VRM(vrm), LIS(lis), Loops(mli), - TII(*MF.getSubtarget().getInstrInfo()), CurLI(nullptr), - IPA(lis, MF.getNumBlockIDs()) {} + TII(*MF.getSubtarget().getInstrInfo()), IPA(lis, MF.getNumBlockIDs()) {} void SplitAnalysis::clear() { UseSlots.clear(); @@ -200,7 +225,7 @@ bool SplitAnalysis::calcLiveBlockInfo() { // Loop over basic blocks where CurLI is live. MachineFunction::iterator MFI = LIS.getMBBFromIndex(LVI->start)->getIterator(); - for (;;) { + while (true) { BlockInfo BI; BI.MBB = &*MFI; SlotIndex Start, Stop; @@ -301,7 +326,7 @@ unsigned SplitAnalysis::countLiveBlocks(const LiveInterval *cli) const { MachineFunction::const_iterator MFI = LIS.getMBBFromIndex(LVI->start)->getIterator(); SlotIndex Stop = LIS.getMBBEndIdx(&*MFI); - for (;;) { + while (true) { ++Count; LVI = li->advanceTo(LVI, Stop); if (LVI == LVE) @@ -333,7 +358,6 @@ void SplitAnalysis::analyze(const LiveInterval *li) { analyzeUses(); } - //===----------------------------------------------------------------------===// // Split Editor //===----------------------------------------------------------------------===// @@ -347,8 +371,7 @@ SplitEditor::SplitEditor(SplitAnalysis &sa, AliasAnalysis &aa, MRI(vrm.getMachineFunction().getRegInfo()), MDT(mdt), TII(*vrm.getMachineFunction().getSubtarget().getInstrInfo()), TRI(*vrm.getMachineFunction().getSubtarget().getRegisterInfo()), - MBFI(mbfi), Edit(nullptr), OpenIdx(0), SpillMode(SM_Partition), - RegAssign(Allocator) {} + MBFI(mbfi), RegAssign(Allocator) {} void SplitEditor::reset(LiveRangeEdit &LRE, ComplementSpillMode SM) { Edit = &LRE; @@ -572,7 +595,7 @@ SlotIndex SplitEditor::buildCopy(unsigned FromReg, unsigned ToReg, LaneBitmask LanesLeft = LaneMask & ~(TRI.getSubRegIndexLaneMask(BestIdx)); while (LanesLeft.any()) { unsigned BestIdx = 0; - int BestCover = INT_MIN; + int BestCover = std::numeric_limits<int>::min(); for (unsigned Idx : PossibleIndexes) { LaneBitmask SubRegMask = TRI.getSubRegIndexLaneMask(Idx); // Early exit if we found a perfect match. @@ -875,9 +898,9 @@ SplitEditor::findShallowDominator(MachineBasicBlock *MBB, // Best candidate so far. MachineBasicBlock *BestMBB = MBB; - unsigned BestDepth = UINT_MAX; + unsigned BestDepth = std::numeric_limits<unsigned>::max(); - for (;;) { + while (true) { const MachineLoop *Loop = Loops.getLoopFor(MBB); // MBB isn't in a loop, it doesn't get any better. All dominators have a @@ -978,7 +1001,7 @@ void SplitEditor::hoistCopies() { // Track the nearest common dominator for all back-copies for each ParentVNI, // indexed by ParentVNI->id. - typedef std::pair<MachineBasicBlock*, SlotIndex> DomPair; + using DomPair = std::pair<MachineBasicBlock *, SlotIndex>; SmallVector<DomPair, 8> NearestDom(Parent->getNumValNums()); // The total cost of all the back-copies for each ParentVNI. SmallVector<BlockFrequency, 8> Costs(Parent->getNumValNums()); @@ -1088,7 +1111,6 @@ void SplitEditor::hoistCopies() { removeBackCopies(BackCopies); } - /// transferValues - Transfer all possible values to the new live ranges. /// Values that were rematerialized are left alone, they need LRCalc.extend(). bool SplitEditor::transferValues() { @@ -1276,6 +1298,7 @@ void SplitEditor::rewriteAssigned(bool ExtendRanges) { struct ExtPoint { ExtPoint(const MachineOperand &O, unsigned R, SlotIndex N) : MO(O), RegIdx(R), Next(N) {} + MachineOperand MO; unsigned RegIdx; SlotIndex Next; @@ -1486,7 +1509,6 @@ void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) { assert(!LRMap || LRMap->size() == Edit->size()); } - //===----------------------------------------------------------------------===// // Single Block Splitting //===----------------------------------------------------------------------===// @@ -1524,7 +1546,6 @@ void SplitEditor::splitSingleBlock(const SplitAnalysis::BlockInfo &BI) { } } - //===----------------------------------------------------------------------===// // Global Live Range Splitting Support //===----------------------------------------------------------------------===// @@ -1639,7 +1660,6 @@ void SplitEditor::splitLiveThroughBlock(unsigned MBBNum, assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference"); } - void SplitEditor::splitRegInBlock(const SplitAnalysis::BlockInfo &BI, unsigned IntvIn, SlotIndex LeaveBefore) { SlotIndex Start, Stop; |