123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866 |
- //===- SplitKit.cpp - Toolkit for splitting live ranges -------------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file contains the SplitAnalysis class as well as mutator functions for
- // live range splitting.
- //
- //===----------------------------------------------------------------------===//
- #include "SplitKit.h"
- #include "llvm/ADT/None.h"
- #include "llvm/ADT/STLExtras.h"
- #include "llvm/ADT/Statistic.h"
- #include "llvm/Analysis/AliasAnalysis.h"
- #include "llvm/CodeGen/LiveRangeEdit.h"
- #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
- #include "llvm/CodeGen/MachineDominators.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/TargetInstrInfo.h"
- #include "llvm/CodeGen/TargetOpcodes.h"
- #include "llvm/CodeGen/TargetRegisterInfo.h"
- #include "llvm/CodeGen/TargetSubtargetInfo.h"
- #include "llvm/CodeGen/VirtRegMap.h"
- #include "llvm/Config/llvm-config.h"
- #include "llvm/IR/DebugLoc.h"
- #include "llvm/Support/Allocator.h"
- #include "llvm/Support/BlockFrequency.h"
- #include "llvm/Support/Debug.h"
- #include "llvm/Support/ErrorHandling.h"
- #include "llvm/Support/raw_ostream.h"
- #include <algorithm>
- #include <cassert>
- #include <iterator>
- #include <limits>
- #include <tuple>
- using namespace llvm;
- #define DEBUG_TYPE "regalloc"
- STATISTIC(NumFinished, "Number of splits finished");
- STATISTIC(NumSimple, "Number of splits that were simple");
- STATISTIC(NumCopies, "Number of copies inserted for splitting");
- STATISTIC(NumRemats, "Number of rematerialized defs for splitting");
- STATISTIC(NumRepairs, "Number of invalid live ranges repaired");
- //===----------------------------------------------------------------------===//
- // Last Insert Point Analysis
- //===----------------------------------------------------------------------===//
- InsertPointAnalysis::InsertPointAnalysis(const LiveIntervals &lis,
- unsigned BBNum)
- : LIS(lis), LastInsertPoint(BBNum) {}
- SlotIndex
- InsertPointAnalysis::computeLastInsertPoint(const LiveInterval &CurLI,
- const MachineBasicBlock &MBB) {
- unsigned Num = MBB.getNumber();
- std::pair<SlotIndex, SlotIndex> &LIP = LastInsertPoint[Num];
- SlotIndex MBBEnd = LIS.getMBBEndIdx(&MBB);
- SmallVector<const MachineBasicBlock *, 1> ExceptionalSuccessors;
- bool EHPadSuccessor = false;
- for (const MachineBasicBlock *SMBB : MBB.successors()) {
- if (SMBB->isEHPad()) {
- ExceptionalSuccessors.push_back(SMBB);
- EHPadSuccessor = true;
- } else if (SMBB->isInlineAsmBrIndirectTarget())
- ExceptionalSuccessors.push_back(SMBB);
- }
- // Compute insert points on the first call. The pair is independent of the
- // current live interval.
- if (!LIP.first.isValid()) {
- MachineBasicBlock::const_iterator FirstTerm = MBB.getFirstTerminator();
- if (FirstTerm == MBB.end())
- LIP.first = MBBEnd;
- else
- LIP.first = LIS.getInstructionIndex(*FirstTerm);
- // If there is a landing pad or inlineasm_br successor, also find the
- // instruction. If there is no such instruction, we don't need to do
- // anything special. We assume there cannot be multiple instructions that
- // are Calls with EHPad successors or INLINEASM_BR in a block. Further, we
- // assume that if there are any, they will be after any other call
- // instructions in the block.
- if (ExceptionalSuccessors.empty())
- return LIP.first;
- for (auto I = MBB.rbegin(), E = MBB.rend(); I != E; ++I) {
- if ((EHPadSuccessor && I->isCall()) ||
- I->getOpcode() == TargetOpcode::INLINEASM_BR) {
- LIP.second = LIS.getInstructionIndex(*I);
- break;
- }
- }
- }
- // If CurLI is live into a landing pad successor, move the last insert point
- // back to the call that may throw.
- if (!LIP.second)
- return LIP.first;
- if (none_of(ExceptionalSuccessors, [&](const MachineBasicBlock *EHPad) {
- return LIS.isLiveInToMBB(CurLI, EHPad);
- }))
- return LIP.first;
- // Find the value leaving MBB.
- const VNInfo *VNI = CurLI.getVNInfoBefore(MBBEnd);
- if (!VNI)
- return LIP.first;
- // 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;
- // Value is properly live-in to the landing pad.
- // Only allow inserts before the call.
- return LIP.second;
- }
- MachineBasicBlock::iterator
- InsertPointAnalysis::getLastInsertPointIter(const LiveInterval &CurLI,
- MachineBasicBlock &MBB) {
- SlotIndex LIP = getLastInsertPoint(CurLI, MBB);
- if (LIP == LIS.getMBBEndIdx(&MBB))
- return MBB.end();
- return LIS.getInstructionFromIndex(LIP);
- }
- //===----------------------------------------------------------------------===//
- // Split Analysis
- //===----------------------------------------------------------------------===//
- SplitAnalysis::SplitAnalysis(const VirtRegMap &vrm, const LiveIntervals &lis,
- const MachineLoopInfo &mli)
- : MF(vrm.getMachineFunction()), VRM(vrm), LIS(lis), Loops(mli),
- TII(*MF.getSubtarget().getInstrInfo()), IPA(lis, MF.getNumBlockIDs()) {}
- void SplitAnalysis::clear() {
- UseSlots.clear();
- UseBlocks.clear();
- ThroughBlocks.clear();
- CurLI = nullptr;
- DidRepairRange = false;
- }
- /// analyzeUses - Count instructions, basic blocks, and loops using CurLI.
- void SplitAnalysis::analyzeUses() {
- assert(UseSlots.empty() && "Call clear first");
- // First get all the defs from the interval values. This provides the correct
- // slots for early clobbers.
- for (const VNInfo *VNI : CurLI->valnos)
- if (!VNI->isPHIDef() && !VNI->isUnused())
- UseSlots.push_back(VNI->def);
- // Get use slots form the use-def chain.
- const MachineRegisterInfo &MRI = MF.getRegInfo();
- for (MachineOperand &MO : MRI.use_nodbg_operands(CurLI->reg()))
- if (!MO.isUndef())
- UseSlots.push_back(LIS.getInstructionIndex(*MO.getParent()).getRegSlot());
- array_pod_sort(UseSlots.begin(), UseSlots.end());
- // Remove duplicates, keeping the smaller slot for each instruction.
- // That is what we want for early clobbers.
- UseSlots.erase(std::unique(UseSlots.begin(), UseSlots.end(),
- SlotIndex::isSameInstr),
- UseSlots.end());
- // Compute per-live block info.
- if (!calcLiveBlockInfo()) {
- // FIXME: calcLiveBlockInfo found inconsistencies in the live range.
- // I am looking at you, RegisterCoalescer!
- DidRepairRange = true;
- ++NumRepairs;
- LLVM_DEBUG(dbgs() << "*** Fixing inconsistent live interval! ***\n");
- const_cast<LiveIntervals&>(LIS)
- .shrinkToUses(const_cast<LiveInterval*>(CurLI));
- UseBlocks.clear();
- ThroughBlocks.clear();
- bool fixed = calcLiveBlockInfo();
- (void)fixed;
- assert(fixed && "Couldn't fix broken live interval");
- }
- LLVM_DEBUG(dbgs() << "Analyze counted " << UseSlots.size() << " instrs in "
- << UseBlocks.size() << " blocks, through "
- << NumThroughBlocks << " blocks.\n");
- }
- /// calcLiveBlockInfo - Fill the LiveBlocks array with information about blocks
- /// where CurLI is live.
- bool SplitAnalysis::calcLiveBlockInfo() {
- ThroughBlocks.resize(MF.getNumBlockIDs());
- NumThroughBlocks = NumGapBlocks = 0;
- if (CurLI->empty())
- return true;
- LiveInterval::const_iterator LVI = CurLI->begin();
- LiveInterval::const_iterator LVE = CurLI->end();
- SmallVectorImpl<SlotIndex>::const_iterator UseI, UseE;
- UseI = UseSlots.begin();
- UseE = UseSlots.end();
- // Loop over basic blocks where CurLI is live.
- MachineFunction::iterator MFI =
- LIS.getMBBFromIndex(LVI->start)->getIterator();
- while (true) {
- BlockInfo BI;
- BI.MBB = &*MFI;
- SlotIndex Start, Stop;
- std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
- // If the block contains no uses, the range must be live through. At one
- // point, RegisterCoalescer could create dangling ranges that ended
- // mid-block.
- if (UseI == UseE || *UseI >= Stop) {
- ++NumThroughBlocks;
- ThroughBlocks.set(BI.MBB->getNumber());
- // The range shouldn't end mid-block if there are no uses. This shouldn't
- // happen.
- if (LVI->end < Stop)
- return false;
- } else {
- // This block has uses. Find the first and last uses in the block.
- BI.FirstInstr = *UseI;
- assert(BI.FirstInstr >= Start);
- do ++UseI;
- while (UseI != UseE && *UseI < Stop);
- BI.LastInstr = UseI[-1];
- assert(BI.LastInstr < Stop);
- // LVI is the first live segment overlapping MBB.
- BI.LiveIn = LVI->start <= Start;
- // When not live in, the first use should be a def.
- if (!BI.LiveIn) {
- assert(LVI->start == LVI->valno->def && "Dangling Segment start");
- assert(LVI->start == BI.FirstInstr && "First instr should be a def");
- BI.FirstDef = BI.FirstInstr;
- }
- // Look for gaps in the live range.
- BI.LiveOut = true;
- while (LVI->end < Stop) {
- SlotIndex LastStop = LVI->end;
- if (++LVI == LVE || LVI->start >= Stop) {
- BI.LiveOut = false;
- BI.LastInstr = LastStop;
- break;
- }
- if (LastStop < LVI->start) {
- // There is a gap in the live range. Create duplicate entries for the
- // live-in snippet and the live-out snippet.
- ++NumGapBlocks;
- // Push the Live-in part.
- BI.LiveOut = false;
- UseBlocks.push_back(BI);
- UseBlocks.back().LastInstr = LastStop;
- // Set up BI for the live-out part.
- BI.LiveIn = false;
- BI.LiveOut = true;
- BI.FirstInstr = BI.FirstDef = LVI->start;
- }
- // A Segment that starts in the middle of the block must be a def.
- assert(LVI->start == LVI->valno->def && "Dangling Segment start");
- if (!BI.FirstDef)
- BI.FirstDef = LVI->start;
- }
- UseBlocks.push_back(BI);
- // LVI is now at LVE or LVI->end >= Stop.
- if (LVI == LVE)
- break;
- }
- // Live segment ends exactly at Stop. Move to the next segment.
- if (LVI->end == Stop && ++LVI == LVE)
- break;
- // Pick the next basic block.
- if (LVI->start < Stop)
- ++MFI;
- else
- MFI = LIS.getMBBFromIndex(LVI->start)->getIterator();
- }
- assert(getNumLiveBlocks() == countLiveBlocks(CurLI) && "Bad block count");
- return true;
- }
- unsigned SplitAnalysis::countLiveBlocks(const LiveInterval *cli) const {
- if (cli->empty())
- return 0;
- LiveInterval *li = const_cast<LiveInterval*>(cli);
- LiveInterval::iterator LVI = li->begin();
- LiveInterval::iterator LVE = li->end();
- unsigned Count = 0;
- // Loop over basic blocks where li is live.
- MachineFunction::const_iterator MFI =
- LIS.getMBBFromIndex(LVI->start)->getIterator();
- SlotIndex Stop = LIS.getMBBEndIdx(&*MFI);
- while (true) {
- ++Count;
- LVI = li->advanceTo(LVI, Stop);
- if (LVI == LVE)
- return Count;
- do {
- ++MFI;
- Stop = LIS.getMBBEndIdx(&*MFI);
- } while (Stop <= LVI->start);
- }
- }
- bool SplitAnalysis::isOriginalEndpoint(SlotIndex Idx) const {
- unsigned OrigReg = VRM.getOriginal(CurLI->reg());
- const LiveInterval &Orig = LIS.getInterval(OrigReg);
- assert(!Orig.empty() && "Splitting empty interval?");
- LiveInterval::const_iterator I = Orig.find(Idx);
- // Range containing Idx should begin at Idx.
- if (I != Orig.end() && I->start <= Idx)
- return I->start == Idx;
- // Range does not contain Idx, previous must end at Idx.
- return I != Orig.begin() && (--I)->end == Idx;
- }
- void SplitAnalysis::analyze(const LiveInterval *li) {
- clear();
- CurLI = li;
- analyzeUses();
- }
- //===----------------------------------------------------------------------===//
- // Split Editor
- //===----------------------------------------------------------------------===//
- /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.
- SplitEditor::SplitEditor(SplitAnalysis &sa, AliasAnalysis &aa,
- LiveIntervals &lis, VirtRegMap &vrm,
- MachineDominatorTree &mdt,
- MachineBlockFrequencyInfo &mbfi)
- : SA(sa), AA(aa), LIS(lis), VRM(vrm),
- MRI(vrm.getMachineFunction().getRegInfo()), MDT(mdt),
- TII(*vrm.getMachineFunction().getSubtarget().getInstrInfo()),
- TRI(*vrm.getMachineFunction().getSubtarget().getRegisterInfo()),
- MBFI(mbfi), RegAssign(Allocator) {}
- void SplitEditor::reset(LiveRangeEdit &LRE, ComplementSpillMode SM) {
- Edit = &LRE;
- SpillMode = SM;
- OpenIdx = 0;
- RegAssign.clear();
- Values.clear();
- // Reset the LiveIntervalCalc instances needed for this spill mode.
- LICalc[0].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
- &LIS.getVNInfoAllocator());
- if (SpillMode)
- LICalc[1].reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
- &LIS.getVNInfoAllocator());
- // We don't need an AliasAnalysis since we will only be performing
- // cheap-as-a-copy remats anyway.
- Edit->anyRematerializable(nullptr);
- }
- #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- LLVM_DUMP_METHOD void SplitEditor::dump() const {
- if (RegAssign.empty()) {
- dbgs() << " empty\n";
- return;
- }
- for (RegAssignMap::const_iterator I = RegAssign.begin(); I.valid(); ++I)
- dbgs() << " [" << I.start() << ';' << I.stop() << "):" << I.value();
- dbgs() << '\n';
- }
- #endif
- LiveInterval::SubRange &SplitEditor::getSubRangeForMaskExact(LaneBitmask LM,
- LiveInterval &LI) {
- for (LiveInterval::SubRange &S : LI.subranges())
- if (S.LaneMask == LM)
- return S;
- llvm_unreachable("SubRange for this mask not found");
- }
- LiveInterval::SubRange &SplitEditor::getSubRangeForMask(LaneBitmask LM,
- LiveInterval &LI) {
- for (LiveInterval::SubRange &S : LI.subranges())
- if ((S.LaneMask & LM) == LM)
- return S;
- llvm_unreachable("SubRange for this mask not found");
- }
- void SplitEditor::addDeadDef(LiveInterval &LI, VNInfo *VNI, bool Original) {
- if (!LI.hasSubRanges()) {
- LI.createDeadDef(VNI);
- return;
- }
- SlotIndex Def = VNI->def;
- if (Original) {
- // If we are transferring a def from the original interval, make sure
- // to only update the subranges for which the original subranges had
- // a def at this location.
- for (LiveInterval::SubRange &S : LI.subranges()) {
- auto &PS = getSubRangeForMask(S.LaneMask, Edit->getParent());
- VNInfo *PV = PS.getVNInfoAt(Def);
- if (PV != nullptr && PV->def == Def)
- S.createDeadDef(Def, LIS.getVNInfoAllocator());
- }
- } else {
- // This is a new def: either from rematerialization, or from an inserted
- // copy. Since rematerialization can regenerate a definition of a sub-
- // register, we need to check which subranges need to be updated.
- const MachineInstr *DefMI = LIS.getInstructionFromIndex(Def);
- assert(DefMI != nullptr);
- LaneBitmask LM;
- for (const MachineOperand &DefOp : DefMI->defs()) {
- Register R = DefOp.getReg();
- if (R != LI.reg())
- continue;
- if (unsigned SR = DefOp.getSubReg())
- LM |= TRI.getSubRegIndexLaneMask(SR);
- else {
- LM = MRI.getMaxLaneMaskForVReg(R);
- break;
- }
- }
- for (LiveInterval::SubRange &S : LI.subranges())
- if ((S.LaneMask & LM).any())
- S.createDeadDef(Def, LIS.getVNInfoAllocator());
- }
- }
- VNInfo *SplitEditor::defValue(unsigned RegIdx,
- const VNInfo *ParentVNI,
- SlotIndex Idx,
- bool Original) {
- assert(ParentVNI && "Mapping NULL value");
- assert(Idx.isValid() && "Invalid SlotIndex");
- assert(Edit->getParent().getVNInfoAt(Idx) == ParentVNI && "Bad Parent VNI");
- LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
- // Create a new value.
- VNInfo *VNI = LI->getNextValue(Idx, LIS.getVNInfoAllocator());
- bool Force = LI->hasSubRanges();
- ValueForcePair FP(Force ? nullptr : VNI, Force);
- // Use insert for lookup, so we can add missing values with a second lookup.
- std::pair<ValueMap::iterator, bool> InsP =
- Values.insert(std::make_pair(std::make_pair(RegIdx, ParentVNI->id), FP));
- // This was the first time (RegIdx, ParentVNI) was mapped, and it is not
- // forced. Keep it as a simple def without any liveness.
- if (!Force && InsP.second)
- return VNI;
- // If the previous value was a simple mapping, add liveness for it now.
- if (VNInfo *OldVNI = InsP.first->second.getPointer()) {
- addDeadDef(*LI, OldVNI, Original);
- // No longer a simple mapping. Switch to a complex mapping. If the
- // interval has subranges, make it a forced mapping.
- InsP.first->second = ValueForcePair(nullptr, Force);
- }
- // This is a complex mapping, add liveness for VNI
- addDeadDef(*LI, VNI, Original);
- return VNI;
- }
- void SplitEditor::forceRecompute(unsigned RegIdx, const VNInfo &ParentVNI) {
- ValueForcePair &VFP = Values[std::make_pair(RegIdx, ParentVNI.id)];
- VNInfo *VNI = VFP.getPointer();
- // ParentVNI was either unmapped or already complex mapped. Either way, just
- // set the force bit.
- if (!VNI) {
- VFP.setInt(true);
- return;
- }
- // This was previously a single mapping. Make sure the old def is represented
- // by a trivial live range.
- addDeadDef(LIS.getInterval(Edit->get(RegIdx)), VNI, false);
- // Mark as complex mapped, forced.
- 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);
- bool FirstCopy = !Def.isValid();
- MachineInstr *CopyMI = BuildMI(MBB, InsertBefore, DebugLoc(), Desc)
- .addReg(ToReg, RegState::Define | getUndefRegState(FirstCopy)
- | getInternalReadRegState(!FirstCopy), SubIdx)
- .addReg(FromReg, 0, SubIdx);
- BumpPtrAllocator &Allocator = LIS.getVNInfoAllocator();
- SlotIndexes &Indexes = *LIS.getSlotIndexes();
- if (FirstCopy) {
- Def = Indexes.insertMachineInstrInMaps(*CopyMI, Late).getRegSlot();
- } else {
- CopyMI->bundleWithPred();
- }
- LaneBitmask LaneMask = TRI.getSubRegIndexLaneMask(SubIdx);
- DestLI.refineSubRanges(Allocator, LaneMask,
- [Def, &Allocator](LiveInterval::SubRange &SR) {
- SR.createDeadDef(Def, Allocator);
- },
- Indexes, TRI);
- return Def;
- }
- 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);
- if (LaneMask.all() || LaneMask == MRI.getMaxLaneMaskForVReg(FromReg)) {
- // The full vreg is copied.
- MachineInstr *CopyMI =
- BuildMI(MBB, InsertBefore, DebugLoc(), Desc, ToReg).addReg(FromReg);
- SlotIndexes &Indexes = *LIS.getSlotIndexes();
- return Indexes.insertMachineInstrInMaps(*CopyMI, Late).getRegSlot();
- }
- // Only a subset of lanes needs to be copied. The following is a simple
- // heuristic to construct a sequence of COPYs. We could add a target
- // specific callback if this turns out to be suboptimal.
- LiveInterval &DestLI = LIS.getInterval(Edit->get(RegIdx));
- // First pass: Try to find a perfectly matching subregister index. If none
- // exists find the one covering the most lanemask bits.
- SmallVector<unsigned, 8> PossibleIndexes;
- unsigned BestIdx = 0;
- unsigned BestCover = 0;
- const TargetRegisterClass *RC = MRI.getRegClass(FromReg);
- assert(RC == MRI.getRegClass(ToReg) && "Should have same reg class");
- for (unsigned Idx = 1, E = TRI.getNumSubRegIndices(); Idx < E; ++Idx) {
- // Is this index even compatible with the given class?
- if (TRI.getSubClassWithSubReg(RC, Idx) != RC)
- continue;
- LaneBitmask SubRegMask = TRI.getSubRegIndexLaneMask(Idx);
- // Early exit if we found a perfect match.
- if (SubRegMask == LaneMask) {
- BestIdx = Idx;
- break;
- }
- // The index must not cover any lanes outside \p LaneMask.
- if ((SubRegMask & ~LaneMask).any())
- continue;
- unsigned PopCount = SubRegMask.getNumLanes();
- PossibleIndexes.push_back(Idx);
- if (PopCount > BestCover) {
- BestCover = PopCount;
- BestIdx = Idx;
- }
- }
- // Abort if we cannot possibly implement the COPY with the given indexes.
- if (BestIdx == 0)
- report_fatal_error("Impossible to implement partial COPY");
- SlotIndex Def = buildSingleSubRegCopy(FromReg, ToReg, MBB, InsertBefore,
- BestIdx, DestLI, Late, SlotIndex());
- // Greedy heuristic: Keep iterating keeping the best covering subreg index
- // each time.
- LaneBitmask LanesLeft = LaneMask & ~(TRI.getSubRegIndexLaneMask(BestIdx));
- while (LanesLeft.any()) {
- unsigned BestIdx = 0;
- int BestCover = std::numeric_limits<int>::min();
- for (unsigned Idx : PossibleIndexes) {
- LaneBitmask SubRegMask = TRI.getSubRegIndexLaneMask(Idx);
- // Early exit if we found a perfect match.
- if (SubRegMask == LanesLeft) {
- BestIdx = Idx;
- break;
- }
- // Try to cover as much of the remaining lanes as possible but
- // as few of the already covered lanes as possible.
- int Cover = (SubRegMask & LanesLeft).getNumLanes()
- - (SubRegMask & ~LanesLeft).getNumLanes();
- if (Cover > BestCover) {
- BestCover = Cover;
- BestIdx = Idx;
- }
- }
- if (BestIdx == 0)
- report_fatal_error("Impossible to implement partial COPY");
- buildSingleSubRegCopy(FromReg, ToReg, MBB, InsertBefore, BestIdx,
- DestLI, Late, Def);
- LanesLeft &= ~TRI.getSubRegIndexLaneMask(BestIdx);
- }
- return Def;
- }
- VNInfo *SplitEditor::defFromParent(unsigned RegIdx,
- VNInfo *ParentVNI,
- SlotIndex UseIdx,
- MachineBasicBlock &MBB,
- MachineBasicBlock::iterator I) {
- SlotIndex Def;
- LiveInterval *LI = &LIS.getInterval(Edit->get(RegIdx));
- // We may be trying to avoid interference that ends at a deleted instruction,
- // so always begin RegIdx 0 early and all others late.
- bool Late = RegIdx != 0;
- // Attempt cheap-as-a-copy rematerialization.
- unsigned Original = VRM.getOriginal(Edit->get(RegIdx));
- LiveInterval &OrigLI = LIS.getInterval(Original);
- VNInfo *OrigVNI = OrigLI.getVNInfoAt(UseIdx);
- Register Reg = LI->reg();
- bool DidRemat = false;
- if (OrigVNI) {
- LiveRangeEdit::Remat RM(ParentVNI);
- RM.OrigMI = LIS.getInstructionFromIndex(OrigVNI->def);
- if (Edit->canRematerializeAt(RM, OrigVNI, UseIdx, true)) {
- Def = Edit->rematerializeAt(MBB, I, Reg, RM, TRI, Late);
- ++NumRemats;
- DidRemat = true;
- }
- }
- if (!DidRemat) {
- LaneBitmask LaneMask;
- if (OrigLI.hasSubRanges()) {
- LaneMask = LaneBitmask::getNone();
- for (LiveInterval::SubRange &S : OrigLI.subranges()) {
- if (S.liveAt(UseIdx))
- LaneMask |= S.LaneMask;
- }
- } else {
- LaneMask = LaneBitmask::getAll();
- }
- if (LaneMask.none()) {
- const MCInstrDesc &Desc = TII.get(TargetOpcode::IMPLICIT_DEF);
- MachineInstr *ImplicitDef = BuildMI(MBB, I, DebugLoc(), Desc, Reg);
- SlotIndexes &Indexes = *LIS.getSlotIndexes();
- Def = Indexes.insertMachineInstrInMaps(*ImplicitDef, Late).getRegSlot();
- } else {
- ++NumCopies;
- Def = buildCopy(Edit->getReg(), Reg, LaneMask, MBB, I, Late, RegIdx);
- }
- }
- // Define the value in Reg.
- return defValue(RegIdx, ParentVNI, Def, false);
- }
- /// Create a new virtual register and live interval.
- unsigned SplitEditor::openIntv() {
- // Create the complement as index 0.
- if (Edit->empty())
- Edit->createEmptyInterval();
- // Create the open interval.
- OpenIdx = Edit->size();
- Edit->createEmptyInterval();
- return OpenIdx;
- }
- void SplitEditor::selectIntv(unsigned Idx) {
- assert(Idx != 0 && "Cannot select the complement interval");
- assert(Idx < Edit->size() && "Can only select previously opened interval");
- LLVM_DEBUG(dbgs() << " selectIntv " << OpenIdx << " -> " << Idx << '\n');
- OpenIdx = Idx;
- }
- SlotIndex SplitEditor::enterIntvBefore(SlotIndex Idx) {
- assert(OpenIdx && "openIntv not called before enterIntvBefore");
- LLVM_DEBUG(dbgs() << " enterIntvBefore " << Idx);
- Idx = Idx.getBaseIndex();
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return Idx;
- }
- LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
- MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
- assert(MI && "enterIntvBefore called with invalid index");
- VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(), MI);
- return VNI->def;
- }
- SlotIndex SplitEditor::enterIntvAfter(SlotIndex Idx) {
- assert(OpenIdx && "openIntv not called before enterIntvAfter");
- LLVM_DEBUG(dbgs() << " enterIntvAfter " << Idx);
- Idx = Idx.getBoundaryIndex();
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return Idx;
- }
- LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
- MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
- assert(MI && "enterIntvAfter called with invalid index");
- VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Idx, *MI->getParent(),
- std::next(MachineBasicBlock::iterator(MI)));
- return VNI->def;
- }
- SlotIndex SplitEditor::enterIntvAtEnd(MachineBasicBlock &MBB) {
- assert(OpenIdx && "openIntv not called before enterIntvAtEnd");
- SlotIndex End = LIS.getMBBEndIdx(&MBB);
- SlotIndex Last = End.getPrevSlot();
- LLVM_DEBUG(dbgs() << " enterIntvAtEnd " << printMBBReference(MBB) << ", "
- << Last);
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Last);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return End;
- }
- LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id);
- VNInfo *VNI = defFromParent(OpenIdx, ParentVNI, Last, MBB,
- SA.getLastSplitPointIter(&MBB));
- RegAssign.insert(VNI->def, End, OpenIdx);
- LLVM_DEBUG(dump());
- return VNI->def;
- }
- /// useIntv - indicate that all instructions in MBB should use OpenLI.
- void SplitEditor::useIntv(const MachineBasicBlock &MBB) {
- useIntv(LIS.getMBBStartIdx(&MBB), LIS.getMBBEndIdx(&MBB));
- }
- void SplitEditor::useIntv(SlotIndex Start, SlotIndex End) {
- assert(OpenIdx && "openIntv not called before useIntv");
- LLVM_DEBUG(dbgs() << " useIntv [" << Start << ';' << End << "):");
- RegAssign.insert(Start, End, OpenIdx);
- LLVM_DEBUG(dump());
- }
- SlotIndex SplitEditor::leaveIntvAfter(SlotIndex Idx) {
- assert(OpenIdx && "openIntv not called before leaveIntvAfter");
- LLVM_DEBUG(dbgs() << " leaveIntvAfter " << Idx);
- // The interval must be live beyond the instruction at Idx.
- SlotIndex Boundary = Idx.getBoundaryIndex();
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Boundary);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return Boundary.getNextSlot();
- }
- LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
- MachineInstr *MI = LIS.getInstructionFromIndex(Boundary);
- assert(MI && "No instruction at index");
- // In spill mode, make live ranges as short as possible by inserting the copy
- // before MI. This is only possible if that instruction doesn't redefine the
- // value. The inserted COPY is not a kill, and we don't need to recompute
- // the source live range. The spiller also won't try to hoist this copy.
- if (SpillMode && !SlotIndex::isSameInstr(ParentVNI->def, Idx) &&
- MI->readsVirtualRegister(Edit->getReg())) {
- forceRecompute(0, *ParentVNI);
- defFromParent(0, ParentVNI, Idx, *MI->getParent(), MI);
- return Idx;
- }
- VNInfo *VNI = defFromParent(0, ParentVNI, Boundary, *MI->getParent(),
- std::next(MachineBasicBlock::iterator(MI)));
- return VNI->def;
- }
- SlotIndex SplitEditor::leaveIntvBefore(SlotIndex Idx) {
- assert(OpenIdx && "openIntv not called before leaveIntvBefore");
- LLVM_DEBUG(dbgs() << " leaveIntvBefore " << Idx);
- // The interval must be live into the instruction at Idx.
- Idx = Idx.getBaseIndex();
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Idx);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return Idx.getNextSlot();
- }
- LLVM_DEBUG(dbgs() << ": valno " << ParentVNI->id << '\n');
- MachineInstr *MI = LIS.getInstructionFromIndex(Idx);
- assert(MI && "No instruction at index");
- VNInfo *VNI = defFromParent(0, ParentVNI, Idx, *MI->getParent(), MI);
- return VNI->def;
- }
- SlotIndex SplitEditor::leaveIntvAtTop(MachineBasicBlock &MBB) {
- assert(OpenIdx && "openIntv not called before leaveIntvAtTop");
- SlotIndex Start = LIS.getMBBStartIdx(&MBB);
- LLVM_DEBUG(dbgs() << " leaveIntvAtTop " << printMBBReference(MBB) << ", "
- << Start);
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
- if (!ParentVNI) {
- LLVM_DEBUG(dbgs() << ": not live\n");
- return Start;
- }
- VNInfo *VNI = defFromParent(0, ParentVNI, Start, MBB,
- MBB.SkipPHIsLabelsAndDebug(MBB.begin()));
- RegAssign.insert(Start, VNI->def, OpenIdx);
- LLVM_DEBUG(dump());
- return VNI->def;
- }
- void SplitEditor::overlapIntv(SlotIndex Start, SlotIndex End) {
- assert(OpenIdx && "openIntv not called before overlapIntv");
- const VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(Start);
- assert(ParentVNI == Edit->getParent().getVNInfoBefore(End) &&
- "Parent changes value in extended range");
- assert(LIS.getMBBFromIndex(Start) == LIS.getMBBFromIndex(End) &&
- "Range cannot span basic blocks");
- // The complement interval will be extended as needed by LICalc.extend().
- if (ParentVNI)
- forceRecompute(0, *ParentVNI);
- LLVM_DEBUG(dbgs() << " overlapIntv [" << Start << ';' << End << "):");
- RegAssign.insert(Start, End, OpenIdx);
- LLVM_DEBUG(dump());
- }
- //===----------------------------------------------------------------------===//
- // Spill modes
- //===----------------------------------------------------------------------===//
- void SplitEditor::removeBackCopies(SmallVectorImpl<VNInfo*> &Copies) {
- LiveInterval *LI = &LIS.getInterval(Edit->get(0));
- LLVM_DEBUG(dbgs() << "Removing " << Copies.size() << " back-copies.\n");
- RegAssignMap::iterator AssignI;
- AssignI.setMap(RegAssign);
- for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
- SlotIndex Def = Copies[i]->def;
- MachineInstr *MI = LIS.getInstructionFromIndex(Def);
- assert(MI && "No instruction for back-copy");
- MachineBasicBlock *MBB = MI->getParent();
- MachineBasicBlock::iterator MBBI(MI);
- bool AtBegin;
- do AtBegin = MBBI == MBB->begin();
- while (!AtBegin && (--MBBI)->isDebugInstr());
- LLVM_DEBUG(dbgs() << "Removing " << Def << '\t' << *MI);
- LIS.removeVRegDefAt(*LI, Def);
- LIS.RemoveMachineInstrFromMaps(*MI);
- MI->eraseFromParent();
- // Adjust RegAssign if a register assignment is killed at Def. We want to
- // avoid calculating the live range of the source register if possible.
- AssignI.find(Def.getPrevSlot());
- if (!AssignI.valid() || AssignI.start() >= Def)
- continue;
- // If MI doesn't kill the assigned register, just leave it.
- if (AssignI.stop() != Def)
- continue;
- unsigned RegIdx = AssignI.value();
- if (AtBegin || !MBBI->readsVirtualRegister(Edit->getReg())) {
- LLVM_DEBUG(dbgs() << " cannot find simple kill of RegIdx " << RegIdx
- << '\n');
- forceRecompute(RegIdx, *Edit->getParent().getVNInfoAt(Def));
- } else {
- SlotIndex Kill = LIS.getInstructionIndex(*MBBI).getRegSlot();
- LLVM_DEBUG(dbgs() << " move kill to " << Kill << '\t' << *MBBI);
- AssignI.setStop(Kill);
- }
- }
- }
- MachineBasicBlock*
- SplitEditor::findShallowDominator(MachineBasicBlock *MBB,
- MachineBasicBlock *DefMBB) {
- if (MBB == DefMBB)
- return MBB;
- assert(MDT.dominates(DefMBB, MBB) && "MBB must be dominated by the def.");
- const MachineLoopInfo &Loops = SA.Loops;
- const MachineLoop *DefLoop = Loops.getLoopFor(DefMBB);
- MachineDomTreeNode *DefDomNode = MDT[DefMBB];
- // Best candidate so far.
- MachineBasicBlock *BestMBB = MBB;
- unsigned BestDepth = std::numeric_limits<unsigned>::max();
- while (true) {
- const MachineLoop *Loop = Loops.getLoopFor(MBB);
- // MBB isn't in a loop, it doesn't get any better. All dominators have a
- // higher frequency by definition.
- if (!Loop) {
- LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
- << " dominates " << printMBBReference(*MBB)
- << " at depth 0\n");
- return MBB;
- }
- // We'll never be able to exit the DefLoop.
- if (Loop == DefLoop) {
- LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
- << " dominates " << printMBBReference(*MBB)
- << " in the same loop\n");
- return MBB;
- }
- // Least busy dominator seen so far.
- unsigned Depth = Loop->getLoopDepth();
- if (Depth < BestDepth) {
- BestMBB = MBB;
- BestDepth = Depth;
- LLVM_DEBUG(dbgs() << "Def in " << printMBBReference(*DefMBB)
- << " dominates " << printMBBReference(*MBB)
- << " at depth " << Depth << '\n');
- }
- // Leave loop by going to the immediate dominator of the loop header.
- // This is a bigger stride than simply walking up the dominator tree.
- MachineDomTreeNode *IDom = MDT[Loop->getHeader()]->getIDom();
- // Too far up the dominator tree?
- if (!IDom || !MDT.dominates(DefDomNode, IDom))
- return BestMBB;
- MBB = IDom->getBlock();
- }
- }
- void SplitEditor::computeRedundantBackCopies(
- DenseSet<unsigned> &NotToHoistSet, SmallVectorImpl<VNInfo *> &BackCopies) {
- LiveInterval *LI = &LIS.getInterval(Edit->get(0));
- LiveInterval *Parent = &Edit->getParent();
- SmallVector<SmallPtrSet<VNInfo *, 8>, 8> EqualVNs(Parent->getNumValNums());
- SmallPtrSet<VNInfo *, 8> DominatedVNIs;
- // Aggregate VNIs having the same value as ParentVNI.
- for (VNInfo *VNI : LI->valnos) {
- if (VNI->isUnused())
- continue;
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
- EqualVNs[ParentVNI->id].insert(VNI);
- }
- // For VNI aggregation of each ParentVNI, collect dominated, i.e.,
- // redundant VNIs to BackCopies.
- for (unsigned i = 0, e = Parent->getNumValNums(); i != e; ++i) {
- VNInfo *ParentVNI = Parent->getValNumInfo(i);
- if (!NotToHoistSet.count(ParentVNI->id))
- continue;
- SmallPtrSetIterator<VNInfo *> It1 = EqualVNs[ParentVNI->id].begin();
- SmallPtrSetIterator<VNInfo *> It2 = It1;
- for (; It1 != EqualVNs[ParentVNI->id].end(); ++It1) {
- It2 = It1;
- for (++It2; It2 != EqualVNs[ParentVNI->id].end(); ++It2) {
- if (DominatedVNIs.count(*It1) || DominatedVNIs.count(*It2))
- continue;
- MachineBasicBlock *MBB1 = LIS.getMBBFromIndex((*It1)->def);
- MachineBasicBlock *MBB2 = LIS.getMBBFromIndex((*It2)->def);
- if (MBB1 == MBB2) {
- DominatedVNIs.insert((*It1)->def < (*It2)->def ? (*It2) : (*It1));
- } else if (MDT.dominates(MBB1, MBB2)) {
- DominatedVNIs.insert(*It2);
- } else if (MDT.dominates(MBB2, MBB1)) {
- DominatedVNIs.insert(*It1);
- }
- }
- }
- if (!DominatedVNIs.empty()) {
- forceRecompute(0, *ParentVNI);
- append_range(BackCopies, DominatedVNIs);
- DominatedVNIs.clear();
- }
- }
- }
- /// For SM_Size mode, find a common dominator for all the back-copies for
- /// the same ParentVNI and hoist the backcopies to the dominator BB.
- /// For SM_Speed mode, if the common dominator is hot and it is not beneficial
- /// to do the hoisting, simply remove the dominated backcopies for the same
- /// ParentVNI.
- void SplitEditor::hoistCopies() {
- // Get the complement interval, always RegIdx 0.
- LiveInterval *LI = &LIS.getInterval(Edit->get(0));
- LiveInterval *Parent = &Edit->getParent();
- // Track the nearest common dominator for all back-copies for each ParentVNI,
- // indexed by ParentVNI->id.
- 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());
- // The ParentVNI->id set for which hoisting back-copies are not beneficial
- // for Speed.
- DenseSet<unsigned> NotToHoistSet;
- // Find the nearest common dominator for parent values with multiple
- // back-copies. If a single back-copy dominates, put it in DomPair.second.
- for (VNInfo *VNI : LI->valnos) {
- if (VNI->isUnused())
- continue;
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
- assert(ParentVNI && "Parent not live at complement def");
- // Don't hoist remats. The complement is probably going to disappear
- // completely anyway.
- if (Edit->didRematerialize(ParentVNI))
- continue;
- MachineBasicBlock *ValMBB = LIS.getMBBFromIndex(VNI->def);
- DomPair &Dom = NearestDom[ParentVNI->id];
- // Keep directly defined parent values. This is either a PHI or an
- // instruction in the complement range. All other copies of ParentVNI
- // should be eliminated.
- if (VNI->def == ParentVNI->def) {
- LLVM_DEBUG(dbgs() << "Direct complement def at " << VNI->def << '\n');
- Dom = DomPair(ValMBB, VNI->def);
- continue;
- }
- // Skip the singly mapped values. There is nothing to gain from hoisting a
- // single back-copy.
- if (Values.lookup(std::make_pair(0, ParentVNI->id)).getPointer()) {
- LLVM_DEBUG(dbgs() << "Single complement def at " << VNI->def << '\n');
- continue;
- }
- if (!Dom.first) {
- // First time we see ParentVNI. VNI dominates itself.
- Dom = DomPair(ValMBB, VNI->def);
- } else if (Dom.first == ValMBB) {
- // Two defs in the same block. Pick the earlier def.
- if (!Dom.second.isValid() || VNI->def < Dom.second)
- Dom.second = VNI->def;
- } else {
- // Different basic blocks. Check if one dominates.
- MachineBasicBlock *Near =
- MDT.findNearestCommonDominator(Dom.first, ValMBB);
- if (Near == ValMBB)
- // Def ValMBB dominates.
- Dom = DomPair(ValMBB, VNI->def);
- else if (Near != Dom.first)
- // None dominate. Hoist to common dominator, need new def.
- Dom = DomPair(Near, SlotIndex());
- Costs[ParentVNI->id] += MBFI.getBlockFreq(ValMBB);
- }
- LLVM_DEBUG(dbgs() << "Multi-mapped complement " << VNI->id << '@'
- << VNI->def << " for parent " << ParentVNI->id << '@'
- << ParentVNI->def << " hoist to "
- << printMBBReference(*Dom.first) << ' ' << Dom.second
- << '\n');
- }
- // Insert the hoisted copies.
- for (unsigned i = 0, e = Parent->getNumValNums(); i != e; ++i) {
- DomPair &Dom = NearestDom[i];
- if (!Dom.first || Dom.second.isValid())
- continue;
- // This value needs a hoisted copy inserted at the end of Dom.first.
- VNInfo *ParentVNI = Parent->getValNumInfo(i);
- MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->def);
- // Get a less loopy dominator than Dom.first.
- Dom.first = findShallowDominator(Dom.first, DefMBB);
- if (SpillMode == SM_Speed &&
- MBFI.getBlockFreq(Dom.first) > Costs[ParentVNI->id]) {
- NotToHoistSet.insert(ParentVNI->id);
- continue;
- }
- SlotIndex Last = LIS.getMBBEndIdx(Dom.first).getPrevSlot();
- Dom.second =
- defFromParent(0, ParentVNI, Last, *Dom.first,
- SA.getLastSplitPointIter(Dom.first))->def;
- }
- // Remove redundant back-copies that are now known to be dominated by another
- // def with the same value.
- SmallVector<VNInfo*, 8> BackCopies;
- for (VNInfo *VNI : LI->valnos) {
- if (VNI->isUnused())
- continue;
- VNInfo *ParentVNI = Edit->getParent().getVNInfoAt(VNI->def);
- const DomPair &Dom = NearestDom[ParentVNI->id];
- if (!Dom.first || Dom.second == VNI->def ||
- NotToHoistSet.count(ParentVNI->id))
- continue;
- BackCopies.push_back(VNI);
- forceRecompute(0, *ParentVNI);
- }
- // If it is not beneficial to hoist all the BackCopies, simply remove
- // redundant BackCopies in speed mode.
- if (SpillMode == SM_Speed && !NotToHoistSet.empty())
- computeRedundantBackCopies(NotToHoistSet, BackCopies);
- removeBackCopies(BackCopies);
- }
- /// transferValues - Transfer all possible values to the new live ranges.
- /// Values that were rematerialized are left alone, they need LICalc.extend().
- bool SplitEditor::transferValues() {
- bool Skipped = false;
- RegAssignMap::const_iterator AssignI = RegAssign.begin();
- for (const LiveRange::Segment &S : Edit->getParent()) {
- LLVM_DEBUG(dbgs() << " blit " << S << ':');
- VNInfo *ParentVNI = S.valno;
- // RegAssign has holes where RegIdx 0 should be used.
- SlotIndex Start = S.start;
- AssignI.advanceTo(Start);
- do {
- unsigned RegIdx;
- SlotIndex End = S.end;
- if (!AssignI.valid()) {
- RegIdx = 0;
- } else if (AssignI.start() <= Start) {
- RegIdx = AssignI.value();
- if (AssignI.stop() < End) {
- End = AssignI.stop();
- ++AssignI;
- }
- } else {
- RegIdx = 0;
- End = std::min(End, AssignI.start());
- }
- // The interval [Start;End) is continuously mapped to RegIdx, ParentVNI.
- LLVM_DEBUG(dbgs() << " [" << Start << ';' << End << ")=" << RegIdx << '('
- << printReg(Edit->get(RegIdx)) << ')');
- LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
- // Check for a simply defined value that can be blitted directly.
- ValueForcePair VFP = Values.lookup(std::make_pair(RegIdx, ParentVNI->id));
- if (VNInfo *VNI = VFP.getPointer()) {
- LLVM_DEBUG(dbgs() << ':' << VNI->id);
- LI.addSegment(LiveInterval::Segment(Start, End, VNI));
- Start = End;
- continue;
- }
- // Skip values with forced recomputation.
- if (VFP.getInt()) {
- LLVM_DEBUG(dbgs() << "(recalc)");
- Skipped = true;
- Start = End;
- continue;
- }
- LiveIntervalCalc &LIC = getLICalc(RegIdx);
- // This value has multiple defs in RegIdx, but it wasn't rematerialized,
- // so the live range is accurate. Add live-in blocks in [Start;End) to the
- // LiveInBlocks.
- MachineFunction::iterator MBB = LIS.getMBBFromIndex(Start)->getIterator();
- SlotIndex BlockStart, BlockEnd;
- std::tie(BlockStart, BlockEnd) = LIS.getSlotIndexes()->getMBBRange(&*MBB);
- // The first block may be live-in, or it may have its own def.
- if (Start != BlockStart) {
- VNInfo *VNI = LI.extendInBlock(BlockStart, std::min(BlockEnd, End));
- assert(VNI && "Missing def for complex mapped value");
- LLVM_DEBUG(dbgs() << ':' << VNI->id << "*" << printMBBReference(*MBB));
- // MBB has its own def. Is it also live-out?
- if (BlockEnd <= End)
- LIC.setLiveOutValue(&*MBB, VNI);
- // Skip to the next block for live-in.
- ++MBB;
- BlockStart = BlockEnd;
- }
- // Handle the live-in blocks covered by [Start;End).
- assert(Start <= BlockStart && "Expected live-in block");
- while (BlockStart < End) {
- LLVM_DEBUG(dbgs() << ">" << printMBBReference(*MBB));
- BlockEnd = LIS.getMBBEndIdx(&*MBB);
- if (BlockStart == ParentVNI->def) {
- // This block has the def of a parent PHI, so it isn't live-in.
- assert(ParentVNI->isPHIDef() && "Non-phi defined at block start?");
- VNInfo *VNI = LI.extendInBlock(BlockStart, std::min(BlockEnd, End));
- assert(VNI && "Missing def for complex mapped parent PHI");
- if (End >= BlockEnd)
- LIC.setLiveOutValue(&*MBB, VNI); // Live-out as well.
- } else {
- // This block needs a live-in value. The last block covered may not
- // be live-out.
- if (End < BlockEnd)
- LIC.addLiveInBlock(LI, MDT[&*MBB], End);
- else {
- // Live-through, and we don't know the value.
- LIC.addLiveInBlock(LI, MDT[&*MBB]);
- LIC.setLiveOutValue(&*MBB, nullptr);
- }
- }
- BlockStart = BlockEnd;
- ++MBB;
- }
- Start = End;
- } while (Start != S.end);
- LLVM_DEBUG(dbgs() << '\n');
- }
- LICalc[0].calculateValues();
- if (SpillMode)
- LICalc[1].calculateValues();
- return Skipped;
- }
- static bool removeDeadSegment(SlotIndex Def, LiveRange &LR) {
- const LiveRange::Segment *Seg = LR.getSegmentContaining(Def);
- if (Seg == nullptr)
- return true;
- if (Seg->end != Def.getDeadSlot())
- return false;
- // This is a dead PHI. Remove it.
- LR.removeSegment(*Seg, true);
- return true;
- }
- void SplitEditor::extendPHIRange(MachineBasicBlock &B, LiveIntervalCalc &LIC,
- LiveRange &LR, LaneBitmask LM,
- ArrayRef<SlotIndex> Undefs) {
- for (MachineBasicBlock *P : B.predecessors()) {
- SlotIndex End = LIS.getMBBEndIdx(P);
- SlotIndex LastUse = End.getPrevSlot();
- // The predecessor may not have a live-out value. That is OK, like an
- // undef PHI operand.
- LiveInterval &PLI = Edit->getParent();
- // Need the cast because the inputs to ?: would otherwise be deemed
- // "incompatible": SubRange vs LiveInterval.
- LiveRange &PSR = !LM.all() ? getSubRangeForMaskExact(LM, PLI)
- : static_cast<LiveRange &>(PLI);
- if (PSR.liveAt(LastUse))
- LIC.extend(LR, End, /*PhysReg=*/0, Undefs);
- }
- }
- void SplitEditor::extendPHIKillRanges() {
- // Extend live ranges to be live-out for successor PHI values.
- // Visit each PHI def slot in the parent live interval. If the def is dead,
- // remove it. Otherwise, extend the live interval to reach the end indexes
- // of all predecessor blocks.
- LiveInterval &ParentLI = Edit->getParent();
- for (const VNInfo *V : ParentLI.valnos) {
- if (V->isUnused() || !V->isPHIDef())
- continue;
- unsigned RegIdx = RegAssign.lookup(V->def);
- LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
- LiveIntervalCalc &LIC = getLICalc(RegIdx);
- MachineBasicBlock &B = *LIS.getMBBFromIndex(V->def);
- if (!removeDeadSegment(V->def, LI))
- extendPHIRange(B, LIC, LI, LaneBitmask::getAll(), /*Undefs=*/{});
- }
- SmallVector<SlotIndex, 4> Undefs;
- LiveIntervalCalc SubLIC;
- for (LiveInterval::SubRange &PS : ParentLI.subranges()) {
- for (const VNInfo *V : PS.valnos) {
- if (V->isUnused() || !V->isPHIDef())
- continue;
- unsigned RegIdx = RegAssign.lookup(V->def);
- LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
- LiveInterval::SubRange &S = getSubRangeForMaskExact(PS.LaneMask, LI);
- if (removeDeadSegment(V->def, S))
- continue;
- MachineBasicBlock &B = *LIS.getMBBFromIndex(V->def);
- SubLIC.reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
- &LIS.getVNInfoAllocator());
- Undefs.clear();
- LI.computeSubRangeUndefs(Undefs, PS.LaneMask, MRI, *LIS.getSlotIndexes());
- extendPHIRange(B, SubLIC, S, PS.LaneMask, Undefs);
- }
- }
- }
- /// rewriteAssigned - Rewrite all uses of Edit->getReg().
- 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;
- };
- SmallVector<ExtPoint,4> ExtPoints;
- for (MachineRegisterInfo::reg_iterator RI = MRI.reg_begin(Edit->getReg()),
- RE = MRI.reg_end(); RI != RE;) {
- MachineOperand &MO = *RI;
- MachineInstr *MI = MO.getParent();
- ++RI;
- // LiveDebugVariables should have handled all DBG_VALUE instructions.
- if (MI->isDebugValue()) {
- LLVM_DEBUG(dbgs() << "Zapping " << *MI);
- MO.setReg(0);
- continue;
- }
- // <undef> operands don't really read the register, so it doesn't matter
- // which register we choose. When the use operand is tied to a def, we must
- // use the same register as the def, so just do that always.
- SlotIndex Idx = LIS.getInstructionIndex(*MI);
- if (MO.isDef() || MO.isUndef())
- Idx = Idx.getRegSlot(MO.isEarlyClobber());
- // Rewrite to the mapped register at Idx.
- unsigned RegIdx = RegAssign.lookup(Idx);
- LiveInterval &LI = LIS.getInterval(Edit->get(RegIdx));
- MO.setReg(LI.reg());
- LLVM_DEBUG(dbgs() << " rewr " << printMBBReference(*MI->getParent())
- << '\t' << Idx << ':' << RegIdx << '\t' << *MI);
- // Extend liveness to Idx if the instruction reads reg.
- if (!ExtendRanges || MO.isUndef())
- continue;
- // Skip instructions that don't read Reg.
- if (MO.isDef()) {
- if (!MO.getSubReg() && !MO.isEarlyClobber())
- continue;
- // We may want to extend a live range for a partial redef, or for a use
- // tied to an early clobber.
- Idx = Idx.getPrevSlot();
- if (!Edit->getParent().liveAt(Idx))
- continue;
- } else
- Idx = Idx.getRegSlot(true);
- SlotIndex Next = Idx.getNextSlot();
- if (LI.hasSubRanges()) {
- // We have to delay extending subranges until we have seen all operands
- // defining the register. This is because a <def,read-undef> operand
- // will create an "undef" point, and we cannot extend any subranges
- // until all of them have been accounted for.
- if (MO.isUse())
- ExtPoints.push_back(ExtPoint(MO, RegIdx, Next));
- } else {
- LiveIntervalCalc &LIC = getLICalc(RegIdx);
- LIC.extend(LI, Next, 0, ArrayRef<SlotIndex>());
- }
- }
- for (ExtPoint &EP : ExtPoints) {
- LiveInterval &LI = LIS.getInterval(Edit->get(EP.RegIdx));
- assert(LI.hasSubRanges());
- LiveIntervalCalc SubLIC;
- Register Reg = EP.MO.getReg(), Sub = EP.MO.getSubReg();
- LaneBitmask LM = Sub != 0 ? TRI.getSubRegIndexLaneMask(Sub)
- : MRI.getMaxLaneMaskForVReg(Reg);
- for (LiveInterval::SubRange &S : LI.subranges()) {
- if ((S.LaneMask & LM).none())
- continue;
- // The problem here can be that the new register may have been created
- // for a partially defined original register. For example:
- // %0:subreg_hireg<def,read-undef> = ...
- // ...
- // %1 = COPY %0
- if (S.empty())
- continue;
- SubLIC.reset(&VRM.getMachineFunction(), LIS.getSlotIndexes(), &MDT,
- &LIS.getVNInfoAllocator());
- SmallVector<SlotIndex, 4> Undefs;
- LI.computeSubRangeUndefs(Undefs, S.LaneMask, MRI, *LIS.getSlotIndexes());
- SubLIC.extend(S, EP.Next, 0, Undefs);
- }
- }
- for (Register R : *Edit) {
- LiveInterval &LI = LIS.getInterval(R);
- if (!LI.hasSubRanges())
- continue;
- LI.clear();
- LI.removeEmptySubRanges();
- LIS.constructMainRangeFromSubranges(LI);
- }
- }
- void SplitEditor::deleteRematVictims() {
- SmallVector<MachineInstr*, 8> Dead;
- for (LiveRangeEdit::iterator I = Edit->begin(), E = Edit->end(); I != E; ++I){
- LiveInterval *LI = &LIS.getInterval(*I);
- for (const LiveRange::Segment &S : LI->segments) {
- // Dead defs end at the dead slot.
- if (S.end != S.valno->def.getDeadSlot())
- continue;
- if (S.valno->isPHIDef())
- continue;
- MachineInstr *MI = LIS.getInstructionFromIndex(S.valno->def);
- assert(MI && "Missing instruction for dead def");
- MI->addRegisterDead(LI->reg(), &TRI);
- if (!MI->allDefsAreDead())
- continue;
- LLVM_DEBUG(dbgs() << "All defs dead: " << *MI);
- Dead.push_back(MI);
- }
- }
- if (Dead.empty())
- return;
- Edit->eliminateDeadDefs(Dead, None, &AA);
- }
- void SplitEditor::forceRecomputeVNI(const VNInfo &ParentVNI) {
- // Fast-path for common case.
- if (!ParentVNI.isPHIDef()) {
- for (unsigned I = 0, E = Edit->size(); I != E; ++I)
- forceRecompute(I, ParentVNI);
- return;
- }
- // Trace value through phis.
- SmallPtrSet<const VNInfo *, 8> Visited; ///< whether VNI was/is in worklist.
- SmallVector<const VNInfo *, 4> WorkList;
- Visited.insert(&ParentVNI);
- WorkList.push_back(&ParentVNI);
- const LiveInterval &ParentLI = Edit->getParent();
- const SlotIndexes &Indexes = *LIS.getSlotIndexes();
- do {
- const VNInfo &VNI = *WorkList.back();
- WorkList.pop_back();
- for (unsigned I = 0, E = Edit->size(); I != E; ++I)
- forceRecompute(I, VNI);
- if (!VNI.isPHIDef())
- continue;
- MachineBasicBlock &MBB = *Indexes.getMBBFromIndex(VNI.def);
- for (const MachineBasicBlock *Pred : MBB.predecessors()) {
- SlotIndex PredEnd = Indexes.getMBBEndIdx(Pred);
- VNInfo *PredVNI = ParentLI.getVNInfoBefore(PredEnd);
- assert(PredVNI && "Value available in PhiVNI predecessor");
- if (Visited.insert(PredVNI).second)
- WorkList.push_back(PredVNI);
- }
- } while(!WorkList.empty());
- }
- void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {
- ++NumFinished;
- // At this point, the live intervals in Edit contain VNInfos corresponding to
- // the inserted copies.
- // Add the original defs from the parent interval.
- for (const VNInfo *ParentVNI : Edit->getParent().valnos) {
- if (ParentVNI->isUnused())
- continue;
- unsigned RegIdx = RegAssign.lookup(ParentVNI->def);
- defValue(RegIdx, ParentVNI, ParentVNI->def, true);
- // Force rematted values to be recomputed everywhere.
- // The new live ranges may be truncated.
- if (Edit->didRematerialize(ParentVNI))
- forceRecomputeVNI(*ParentVNI);
- }
- // Hoist back-copies to the complement interval when in spill mode.
- switch (SpillMode) {
- case SM_Partition:
- // Leave all back-copies as is.
- break;
- case SM_Size:
- case SM_Speed:
- // hoistCopies will behave differently between size and speed.
- hoistCopies();
- }
- // Transfer the simply mapped values, check if any are skipped.
- bool Skipped = transferValues();
- // Rewrite virtual registers, possibly extending ranges.
- rewriteAssigned(Skipped);
- if (Skipped)
- extendPHIKillRanges();
- else
- ++NumSimple;
- // Delete defs that were rematted everywhere.
- if (Skipped)
- deleteRematVictims();
- // Get rid of unused values and set phi-kill flags.
- for (Register Reg : *Edit) {
- LiveInterval &LI = LIS.getInterval(Reg);
- LI.removeEmptySubRanges();
- LI.RenumberValues();
- }
- // Provide a reverse mapping from original indices to Edit ranges.
- if (LRMap) {
- LRMap->clear();
- for (unsigned i = 0, e = Edit->size(); i != e; ++i)
- LRMap->push_back(i);
- }
- // Now check if any registers were separated into multiple components.
- ConnectedVNInfoEqClasses ConEQ(LIS);
- for (unsigned i = 0, e = Edit->size(); i != e; ++i) {
- // Don't use iterators, they are invalidated by create() below.
- Register VReg = Edit->get(i);
- LiveInterval &LI = LIS.getInterval(VReg);
- SmallVector<LiveInterval*, 8> SplitLIs;
- LIS.splitSeparateComponents(LI, SplitLIs);
- Register Original = VRM.getOriginal(VReg);
- for (LiveInterval *SplitLI : SplitLIs)
- VRM.setIsSplitFromReg(SplitLI->reg(), Original);
- // The new intervals all map back to i.
- if (LRMap)
- LRMap->resize(Edit->size(), i);
- }
- // Calculate spill weight and allocation hints for new intervals.
- Edit->calculateRegClassAndHint(VRM.getMachineFunction(), SA.Loops, MBFI);
- assert(!LRMap || LRMap->size() == Edit->size());
- }
- //===----------------------------------------------------------------------===//
- // Single Block Splitting
- //===----------------------------------------------------------------------===//
- bool SplitAnalysis::shouldSplitSingleBlock(const BlockInfo &BI,
- bool SingleInstrs) const {
- // Always split for multiple instructions.
- if (!BI.isOneInstr())
- return true;
- // Don't split for single instructions unless explicitly requested.
- if (!SingleInstrs)
- return false;
- // Splitting a live-through range always makes progress.
- 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())
- return false;
- // Finally, don't isolate an end point that was created by earlier splits.
- return isOriginalEndpoint(BI.FirstInstr);
- }
- void SplitEditor::splitSingleBlock(const SplitAnalysis::BlockInfo &BI) {
- openIntv();
- SlotIndex LastSplitPoint = SA.getLastSplitPoint(BI.MBB->getNumber());
- SlotIndex SegStart = enterIntvBefore(std::min(BI.FirstInstr,
- LastSplitPoint));
- if (!BI.LiveOut || BI.LastInstr < LastSplitPoint) {
- useIntv(SegStart, leaveIntvAfter(BI.LastInstr));
- } else {
- // The last use is after the last valid split point.
- SlotIndex SegStop = leaveIntvBefore(LastSplitPoint);
- useIntv(SegStart, SegStop);
- overlapIntv(SegStop, BI.LastInstr);
- }
- }
- //===----------------------------------------------------------------------===//
- // Global Live Range Splitting Support
- //===----------------------------------------------------------------------===//
- // These methods support a method of global live range splitting that uses a
- // global algorithm to decide intervals for CFG edges. They will insert split
- // points and color intervals in basic blocks while avoiding interference.
- //
- // Note that splitSingleBlock is also useful for blocks where both CFG edges
- // are on the stack.
- void SplitEditor::splitLiveThroughBlock(unsigned MBBNum,
- unsigned IntvIn, SlotIndex LeaveBefore,
- unsigned IntvOut, SlotIndex EnterAfter){
- SlotIndex Start, Stop;
- std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(MBBNum);
- LLVM_DEBUG(dbgs() << "%bb." << MBBNum << " [" << Start << ';' << Stop
- << ") intf " << LeaveBefore << '-' << EnterAfter
- << ", live-through " << IntvIn << " -> " << IntvOut);
- assert((IntvIn || IntvOut) && "Use splitSingleBlock for isolated blocks");
- assert((!LeaveBefore || LeaveBefore < Stop) && "Interference after block");
- assert((!IntvIn || !LeaveBefore || LeaveBefore > Start) && "Impossible intf");
- assert((!EnterAfter || EnterAfter >= Start) && "Interference before block");
- MachineBasicBlock *MBB = VRM.getMachineFunction().getBlockNumbered(MBBNum);
- if (!IntvOut) {
- LLVM_DEBUG(dbgs() << ", spill on entry.\n");
- //
- // <<<<<<<<< Possible LeaveBefore interference.
- // |-----------| Live through.
- // -____________ Spill on entry.
- //
- selectIntv(IntvIn);
- SlotIndex Idx = leaveIntvAtTop(*MBB);
- assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
- (void)Idx;
- return;
- }
- if (!IntvIn) {
- LLVM_DEBUG(dbgs() << ", reload on exit.\n");
- //
- // >>>>>>> Possible EnterAfter interference.
- // |-----------| Live through.
- // ___________-- Reload on exit.
- //
- selectIntv(IntvOut);
- SlotIndex Idx = enterIntvAtEnd(*MBB);
- assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
- (void)Idx;
- return;
- }
- if (IntvIn == IntvOut && !LeaveBefore && !EnterAfter) {
- LLVM_DEBUG(dbgs() << ", straight through.\n");
- //
- // |-----------| Live through.
- // ------------- Straight through, same intv, no interference.
- //
- selectIntv(IntvOut);
- useIntv(Start, Stop);
- return;
- }
- // We cannot legally insert splits after LSP.
- SlotIndex LSP = SA.getLastSplitPoint(MBBNum);
- assert((!IntvOut || !EnterAfter || EnterAfter < LSP) && "Impossible intf");
- if (IntvIn != IntvOut && (!LeaveBefore || !EnterAfter ||
- LeaveBefore.getBaseIndex() > EnterAfter.getBoundaryIndex())) {
- LLVM_DEBUG(dbgs() << ", switch avoiding interference.\n");
- //
- // >>>> <<<< Non-overlapping EnterAfter/LeaveBefore interference.
- // |-----------| Live through.
- // ------======= Switch intervals between interference.
- //
- selectIntv(IntvOut);
- SlotIndex Idx;
- if (LeaveBefore && LeaveBefore < LSP) {
- Idx = enterIntvBefore(LeaveBefore);
- useIntv(Idx, Stop);
- } else {
- Idx = enterIntvAtEnd(*MBB);
- }
- selectIntv(IntvIn);
- useIntv(Start, Idx);
- assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
- assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
- return;
- }
- LLVM_DEBUG(dbgs() << ", create local intv for interference.\n");
- //
- // >>><><><><<<< Overlapping EnterAfter/LeaveBefore interference.
- // |-----------| Live through.
- // ==---------== Switch intervals before/after interference.
- //
- assert(LeaveBefore <= EnterAfter && "Missed case");
- selectIntv(IntvOut);
- SlotIndex Idx = enterIntvAfter(EnterAfter);
- useIntv(Idx, Stop);
- assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
- selectIntv(IntvIn);
- Idx = leaveIntvBefore(LeaveBefore);
- useIntv(Start, Idx);
- assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
- }
- void SplitEditor::splitRegInBlock(const SplitAnalysis::BlockInfo &BI,
- unsigned IntvIn, SlotIndex LeaveBefore) {
- SlotIndex Start, Stop;
- std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
- LLVM_DEBUG(dbgs() << printMBBReference(*BI.MBB) << " [" << Start << ';'
- << Stop << "), uses " << BI.FirstInstr << '-'
- << BI.LastInstr << ", reg-in " << IntvIn
- << ", leave before " << LeaveBefore
- << (BI.LiveOut ? ", stack-out" : ", killed in block"));
- assert(IntvIn && "Must have register in");
- assert(BI.LiveIn && "Must be live-in");
- assert((!LeaveBefore || LeaveBefore > Start) && "Bad interference");
- if (!BI.LiveOut && (!LeaveBefore || LeaveBefore >= BI.LastInstr)) {
- LLVM_DEBUG(dbgs() << " before interference.\n");
- //
- // <<< Interference after kill.
- // |---o---x | Killed in block.
- // ========= Use IntvIn everywhere.
- //
- selectIntv(IntvIn);
- useIntv(Start, BI.LastInstr);
- return;
- }
- SlotIndex LSP = SA.getLastSplitPoint(BI.MBB->getNumber());
- if (!LeaveBefore || LeaveBefore > BI.LastInstr.getBoundaryIndex()) {
- //
- // <<< Possible interference after last use.
- // |---o---o---| Live-out on stack.
- // =========____ Leave IntvIn after last use.
- //
- // < Interference after last use.
- // |---o---o--o| Live-out on stack, late last use.
- // ============ Copy to stack after LSP, overlap IntvIn.
- // \_____ Stack interval is live-out.
- //
- if (BI.LastInstr < LSP) {
- LLVM_DEBUG(dbgs() << ", spill after last use before interference.\n");
- selectIntv(IntvIn);
- SlotIndex Idx = leaveIntvAfter(BI.LastInstr);
- useIntv(Start, Idx);
- assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
- } else {
- LLVM_DEBUG(dbgs() << ", spill before last split point.\n");
- selectIntv(IntvIn);
- SlotIndex Idx = leaveIntvBefore(LSP);
- overlapIntv(Idx, BI.LastInstr);
- useIntv(Start, Idx);
- assert((!LeaveBefore || Idx <= LeaveBefore) && "Interference");
- }
- return;
- }
- // The interference is overlapping somewhere we wanted to use IntvIn. That
- // means we need to create a local interval that can be allocated a
- // different register.
- unsigned LocalIntv = openIntv();
- (void)LocalIntv;
- LLVM_DEBUG(dbgs() << ", creating local interval " << LocalIntv << ".\n");
- if (!BI.LiveOut || BI.LastInstr < LSP) {
- //
- // <<<<<<< Interference overlapping uses.
- // |---o---o---| Live-out on stack.
- // =====----____ Leave IntvIn before interference, then spill.
- //
- SlotIndex To = leaveIntvAfter(BI.LastInstr);
- SlotIndex From = enterIntvBefore(LeaveBefore);
- useIntv(From, To);
- selectIntv(IntvIn);
- useIntv(Start, From);
- assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
- return;
- }
- // <<<<<<< Interference overlapping uses.
- // |---o---o--o| Live-out on stack, late last use.
- // =====------- Copy to stack before LSP, overlap LocalIntv.
- // \_____ Stack interval is live-out.
- //
- SlotIndex To = leaveIntvBefore(LSP);
- overlapIntv(To, BI.LastInstr);
- SlotIndex From = enterIntvBefore(std::min(To, LeaveBefore));
- useIntv(From, To);
- selectIntv(IntvIn);
- useIntv(Start, From);
- assert((!LeaveBefore || From <= LeaveBefore) && "Interference");
- }
- void SplitEditor::splitRegOutBlock(const SplitAnalysis::BlockInfo &BI,
- unsigned IntvOut, SlotIndex EnterAfter) {
- SlotIndex Start, Stop;
- std::tie(Start, Stop) = LIS.getSlotIndexes()->getMBBRange(BI.MBB);
- LLVM_DEBUG(dbgs() << printMBBReference(*BI.MBB) << " [" << Start << ';'
- << Stop << "), uses " << BI.FirstInstr << '-'
- << BI.LastInstr << ", reg-out " << IntvOut
- << ", enter after " << EnterAfter
- << (BI.LiveIn ? ", stack-in" : ", defined in block"));
- SlotIndex LSP = SA.getLastSplitPoint(BI.MBB->getNumber());
- assert(IntvOut && "Must have register out");
- assert(BI.LiveOut && "Must be live-out");
- assert((!EnterAfter || EnterAfter < LSP) && "Bad interference");
- if (!BI.LiveIn && (!EnterAfter || EnterAfter <= BI.FirstInstr)) {
- LLVM_DEBUG(dbgs() << " after interference.\n");
- //
- // >>>> Interference before def.
- // | o---o---| Defined in block.
- // ========= Use IntvOut everywhere.
- //
- selectIntv(IntvOut);
- useIntv(BI.FirstInstr, Stop);
- return;
- }
- if (!EnterAfter || EnterAfter < BI.FirstInstr.getBaseIndex()) {
- LLVM_DEBUG(dbgs() << ", reload after interference.\n");
- //
- // >>>> Interference before def.
- // |---o---o---| Live-through, stack-in.
- // ____========= Enter IntvOut before first use.
- //
- selectIntv(IntvOut);
- SlotIndex Idx = enterIntvBefore(std::min(LSP, BI.FirstInstr));
- useIntv(Idx, Stop);
- assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
- return;
- }
- // The interference is overlapping somewhere we wanted to use IntvOut. That
- // means we need to create a local interval that can be allocated a
- // different register.
- LLVM_DEBUG(dbgs() << ", interference overlaps uses.\n");
- //
- // >>>>>>> Interference overlapping uses.
- // |---o---o---| Live-through, stack-in.
- // ____---====== Create local interval for interference range.
- //
- selectIntv(IntvOut);
- SlotIndex Idx = enterIntvAfter(EnterAfter);
- useIntv(Idx, Stop);
- assert((!EnterAfter || Idx >= EnterAfter) && "Interference");
- openIntv();
- SlotIndex From = enterIntvBefore(std::min(Idx, BI.FirstInstr));
- useIntv(From, Idx);
- }
|