123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869 |
- //===- TwoAddressInstructionPass.cpp - Two-Address instruction pass -------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is distributed under the University of Illinois Open Source
- // License. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- //
- // This file implements the TwoAddress instruction pass which is used
- // by most register allocators. Two-Address instructions are rewritten
- // from:
- //
- // A = B op C
- //
- // to:
- //
- // A = B
- // A op= C
- //
- // Note that if a register allocator chooses to use this pass, that it
- // has to be capable of handling the non-SSA nature of these rewritten
- // virtual registers.
- //
- // It is also worth noting that the duplicate operand of the two
- // address instruction is removed.
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/ADT/DenseMap.h"
- #include "llvm/ADT/SmallPtrSet.h"
- #include "llvm/ADT/SmallSet.h"
- #include "llvm/ADT/SmallVector.h"
- #include "llvm/ADT/Statistic.h"
- #include "llvm/ADT/iterator_range.h"
- #include "llvm/Analysis/AliasAnalysis.h"
- #include "llvm/CodeGen/LiveInterval.h"
- #include "llvm/CodeGen/LiveIntervals.h"
- #include "llvm/CodeGen/LiveVariables.h"
- #include "llvm/CodeGen/MachineBasicBlock.h"
- #include "llvm/CodeGen/MachineFunction.h"
- #include "llvm/CodeGen/MachineFunctionPass.h"
- #include "llvm/CodeGen/MachineInstr.h"
- #include "llvm/CodeGen/MachineInstrBuilder.h"
- #include "llvm/CodeGen/MachineOperand.h"
- #include "llvm/CodeGen/MachineRegisterInfo.h"
- #include "llvm/CodeGen/Passes.h"
- #include "llvm/CodeGen/SlotIndexes.h"
- #include "llvm/CodeGen/TargetInstrInfo.h"
- #include "llvm/CodeGen/TargetOpcodes.h"
- #include "llvm/CodeGen/TargetRegisterInfo.h"
- #include "llvm/CodeGen/TargetSubtargetInfo.h"
- #include "llvm/MC/MCInstrDesc.h"
- #include "llvm/MC/MCInstrItineraries.h"
- #include "llvm/Pass.h"
- #include "llvm/Support/CodeGen.h"
- #include "llvm/Support/CommandLine.h"
- #include "llvm/Support/Debug.h"
- #include "llvm/Support/ErrorHandling.h"
- #include "llvm/Support/raw_ostream.h"
- #include "llvm/Target/TargetMachine.h"
- #include <cassert>
- #include <iterator>
- #include <utility>
- using namespace llvm;
- #define DEBUG_TYPE "twoaddressinstruction"
- STATISTIC(NumTwoAddressInstrs, "Number of two-address instructions");
- STATISTIC(NumCommuted , "Number of instructions commuted to coalesce");
- STATISTIC(NumAggrCommuted , "Number of instructions aggressively commuted");
- STATISTIC(NumConvertedTo3Addr, "Number of instructions promoted to 3-address");
- STATISTIC(Num3AddrSunk, "Number of 3-address instructions sunk");
- STATISTIC(NumReSchedUps, "Number of instructions re-scheduled up");
- STATISTIC(NumReSchedDowns, "Number of instructions re-scheduled down");
- // Temporary flag to disable rescheduling.
- static cl::opt<bool>
- EnableRescheduling("twoaddr-reschedule",
- cl::desc("Coalesce copies by rescheduling (default=true)"),
- cl::init(true), cl::Hidden);
- // Limit the number of dataflow edges to traverse when evaluating the benefit
- // of commuting operands.
- static cl::opt<unsigned> MaxDataFlowEdge(
- "dataflow-edge-limit", cl::Hidden, cl::init(3),
- cl::desc("Maximum number of dataflow edges to traverse when evaluating "
- "the benefit of commuting operands"));
- namespace {
- class TwoAddressInstructionPass : public MachineFunctionPass {
- MachineFunction *MF;
- const TargetInstrInfo *TII;
- const TargetRegisterInfo *TRI;
- const InstrItineraryData *InstrItins;
- MachineRegisterInfo *MRI;
- LiveVariables *LV;
- LiveIntervals *LIS;
- AliasAnalysis *AA;
- CodeGenOpt::Level OptLevel;
- // The current basic block being processed.
- MachineBasicBlock *MBB;
- // Keep track the distance of a MI from the start of the current basic block.
- DenseMap<MachineInstr*, unsigned> DistanceMap;
- // Set of already processed instructions in the current block.
- SmallPtrSet<MachineInstr*, 8> Processed;
- // Set of instructions converted to three-address by target and then sunk
- // down current basic block.
- SmallPtrSet<MachineInstr*, 8> SunkInstrs;
- // A map from virtual registers to physical registers which are likely targets
- // to be coalesced to due to copies from physical registers to virtual
- // registers. e.g. v1024 = move r0.
- DenseMap<unsigned, unsigned> SrcRegMap;
- // A map from virtual registers to physical registers which are likely targets
- // to be coalesced to due to copies to physical registers from virtual
- // registers. e.g. r1 = move v1024.
- DenseMap<unsigned, unsigned> DstRegMap;
- bool sink3AddrInstruction(MachineInstr *MI, unsigned Reg,
- MachineBasicBlock::iterator OldPos);
- bool isRevCopyChain(unsigned FromReg, unsigned ToReg, int Maxlen);
- bool noUseAfterLastDef(unsigned Reg, unsigned Dist, unsigned &LastDef);
- bool isProfitableToCommute(unsigned regA, unsigned regB, unsigned regC,
- MachineInstr *MI, unsigned Dist);
- bool commuteInstruction(MachineInstr *MI, unsigned DstIdx,
- unsigned RegBIdx, unsigned RegCIdx, unsigned Dist);
- bool isProfitableToConv3Addr(unsigned RegA, unsigned RegB);
- bool convertInstTo3Addr(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned RegA, unsigned RegB, unsigned Dist);
- bool isDefTooClose(unsigned Reg, unsigned Dist, MachineInstr *MI);
- bool rescheduleMIBelowKill(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned Reg);
- bool rescheduleKillAboveMI(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned Reg);
- bool tryInstructionTransform(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned SrcIdx, unsigned DstIdx,
- unsigned Dist, bool shouldOnlyCommute);
- bool tryInstructionCommute(MachineInstr *MI,
- unsigned DstOpIdx,
- unsigned BaseOpIdx,
- bool BaseOpKilled,
- unsigned Dist);
- void scanUses(unsigned DstReg);
- void processCopy(MachineInstr *MI);
- using TiedPairList = SmallVector<std::pair<unsigned, unsigned>, 4>;
- using TiedOperandMap = SmallDenseMap<unsigned, TiedPairList>;
- bool collectTiedOperands(MachineInstr *MI, TiedOperandMap&);
- void processTiedPairs(MachineInstr *MI, TiedPairList&, unsigned &Dist);
- void eliminateRegSequence(MachineBasicBlock::iterator&);
- public:
- static char ID; // Pass identification, replacement for typeid
- TwoAddressInstructionPass() : MachineFunctionPass(ID) {
- initializeTwoAddressInstructionPassPass(*PassRegistry::getPassRegistry());
- }
- void getAnalysisUsage(AnalysisUsage &AU) const override {
- AU.setPreservesCFG();
- AU.addUsedIfAvailable<AAResultsWrapperPass>();
- AU.addUsedIfAvailable<LiveVariables>();
- AU.addPreserved<LiveVariables>();
- AU.addPreserved<SlotIndexes>();
- AU.addPreserved<LiveIntervals>();
- AU.addPreservedID(MachineLoopInfoID);
- AU.addPreservedID(MachineDominatorsID);
- MachineFunctionPass::getAnalysisUsage(AU);
- }
- /// Pass entry point.
- bool runOnMachineFunction(MachineFunction&) override;
- };
- } // end anonymous namespace
- char TwoAddressInstructionPass::ID = 0;
- char &llvm::TwoAddressInstructionPassID = TwoAddressInstructionPass::ID;
- INITIALIZE_PASS_BEGIN(TwoAddressInstructionPass, DEBUG_TYPE,
- "Two-Address instruction pass", false, false)
- INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
- INITIALIZE_PASS_END(TwoAddressInstructionPass, DEBUG_TYPE,
- "Two-Address instruction pass", false, false)
- static bool isPlainlyKilled(MachineInstr *MI, unsigned Reg, LiveIntervals *LIS);
- /// A two-address instruction has been converted to a three-address instruction
- /// to avoid clobbering a register. Try to sink it past the instruction that
- /// would kill the above mentioned register to reduce register pressure.
- bool TwoAddressInstructionPass::
- sink3AddrInstruction(MachineInstr *MI, unsigned SavedReg,
- MachineBasicBlock::iterator OldPos) {
- // FIXME: Shouldn't we be trying to do this before we three-addressify the
- // instruction? After this transformation is done, we no longer need
- // the instruction to be in three-address form.
- // Check if it's safe to move this instruction.
- bool SeenStore = true; // Be conservative.
- if (!MI->isSafeToMove(AA, SeenStore))
- return false;
- unsigned DefReg = 0;
- SmallSet<unsigned, 4> UseRegs;
- for (const MachineOperand &MO : MI->operands()) {
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (!MOReg)
- continue;
- if (MO.isUse() && MOReg != SavedReg)
- UseRegs.insert(MO.getReg());
- if (!MO.isDef())
- continue;
- if (MO.isImplicit())
- // Don't try to move it if it implicitly defines a register.
- return false;
- if (DefReg)
- // For now, don't move any instructions that define multiple registers.
- return false;
- DefReg = MO.getReg();
- }
- // Find the instruction that kills SavedReg.
- MachineInstr *KillMI = nullptr;
- if (LIS) {
- LiveInterval &LI = LIS->getInterval(SavedReg);
- assert(LI.end() != LI.begin() &&
- "Reg should not have empty live interval.");
- SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
- LiveInterval::const_iterator I = LI.find(MBBEndIdx);
- if (I != LI.end() && I->start < MBBEndIdx)
- return false;
- --I;
- KillMI = LIS->getInstructionFromIndex(I->end);
- }
- if (!KillMI) {
- for (MachineOperand &UseMO : MRI->use_nodbg_operands(SavedReg)) {
- if (!UseMO.isKill())
- continue;
- KillMI = UseMO.getParent();
- break;
- }
- }
- // If we find the instruction that kills SavedReg, and it is in an
- // appropriate location, we can try to sink the current instruction
- // past it.
- if (!KillMI || KillMI->getParent() != MBB || KillMI == MI ||
- MachineBasicBlock::iterator(KillMI) == OldPos || KillMI->isTerminator())
- return false;
- // If any of the definitions are used by another instruction between the
- // position and the kill use, then it's not safe to sink it.
- //
- // FIXME: This can be sped up if there is an easy way to query whether an
- // instruction is before or after another instruction. Then we can use
- // MachineRegisterInfo def / use instead.
- MachineOperand *KillMO = nullptr;
- MachineBasicBlock::iterator KillPos = KillMI;
- ++KillPos;
- unsigned NumVisited = 0;
- for (MachineInstr &OtherMI : make_range(std::next(OldPos), KillPos)) {
- // Debug instructions cannot be counted against the limit.
- if (OtherMI.isDebugInstr())
- continue;
- if (NumVisited > 30) // FIXME: Arbitrary limit to reduce compile time cost.
- return false;
- ++NumVisited;
- for (unsigned i = 0, e = OtherMI.getNumOperands(); i != e; ++i) {
- MachineOperand &MO = OtherMI.getOperand(i);
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (!MOReg)
- continue;
- if (DefReg == MOReg)
- return false;
- if (MO.isKill() || (LIS && isPlainlyKilled(&OtherMI, MOReg, LIS))) {
- if (&OtherMI == KillMI && MOReg == SavedReg)
- // Save the operand that kills the register. We want to unset the kill
- // marker if we can sink MI past it.
- KillMO = &MO;
- else if (UseRegs.count(MOReg))
- // One of the uses is killed before the destination.
- return false;
- }
- }
- }
- assert(KillMO && "Didn't find kill");
- if (!LIS) {
- // Update kill and LV information.
- KillMO->setIsKill(false);
- KillMO = MI->findRegisterUseOperand(SavedReg, false, TRI);
- KillMO->setIsKill(true);
- if (LV)
- LV->replaceKillInstruction(SavedReg, *KillMI, *MI);
- }
- // Move instruction to its destination.
- MBB->remove(MI);
- MBB->insert(KillPos, MI);
- if (LIS)
- LIS->handleMove(*MI);
- ++Num3AddrSunk;
- return true;
- }
- /// Return the MachineInstr* if it is the single def of the Reg in current BB.
- static MachineInstr *getSingleDef(unsigned Reg, MachineBasicBlock *BB,
- const MachineRegisterInfo *MRI) {
- MachineInstr *Ret = nullptr;
- for (MachineInstr &DefMI : MRI->def_instructions(Reg)) {
- if (DefMI.getParent() != BB || DefMI.isDebugValue())
- continue;
- if (!Ret)
- Ret = &DefMI;
- else if (Ret != &DefMI)
- return nullptr;
- }
- return Ret;
- }
- /// Check if there is a reversed copy chain from FromReg to ToReg:
- /// %Tmp1 = copy %Tmp2;
- /// %FromReg = copy %Tmp1;
- /// %ToReg = add %FromReg ...
- /// %Tmp2 = copy %ToReg;
- /// MaxLen specifies the maximum length of the copy chain the func
- /// can walk through.
- bool TwoAddressInstructionPass::isRevCopyChain(unsigned FromReg, unsigned ToReg,
- int Maxlen) {
- unsigned TmpReg = FromReg;
- for (int i = 0; i < Maxlen; i++) {
- MachineInstr *Def = getSingleDef(TmpReg, MBB, MRI);
- if (!Def || !Def->isCopy())
- return false;
- TmpReg = Def->getOperand(1).getReg();
- if (TmpReg == ToReg)
- return true;
- }
- return false;
- }
- /// Return true if there are no intervening uses between the last instruction
- /// in the MBB that defines the specified register and the two-address
- /// instruction which is being processed. It also returns the last def location
- /// by reference.
- bool TwoAddressInstructionPass::noUseAfterLastDef(unsigned Reg, unsigned Dist,
- unsigned &LastDef) {
- LastDef = 0;
- unsigned LastUse = Dist;
- for (MachineOperand &MO : MRI->reg_operands(Reg)) {
- MachineInstr *MI = MO.getParent();
- if (MI->getParent() != MBB || MI->isDebugValue())
- continue;
- DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
- if (DI == DistanceMap.end())
- continue;
- if (MO.isUse() && DI->second < LastUse)
- LastUse = DI->second;
- if (MO.isDef() && DI->second > LastDef)
- LastDef = DI->second;
- }
- return !(LastUse > LastDef && LastUse < Dist);
- }
- /// Return true if the specified MI is a copy instruction or an extract_subreg
- /// instruction. It also returns the source and destination registers and
- /// whether they are physical registers by reference.
- static bool isCopyToReg(MachineInstr &MI, const TargetInstrInfo *TII,
- unsigned &SrcReg, unsigned &DstReg,
- bool &IsSrcPhys, bool &IsDstPhys) {
- SrcReg = 0;
- DstReg = 0;
- if (MI.isCopy()) {
- DstReg = MI.getOperand(0).getReg();
- SrcReg = MI.getOperand(1).getReg();
- } else if (MI.isInsertSubreg() || MI.isSubregToReg()) {
- DstReg = MI.getOperand(0).getReg();
- SrcReg = MI.getOperand(2).getReg();
- } else
- return false;
- IsSrcPhys = TargetRegisterInfo::isPhysicalRegister(SrcReg);
- IsDstPhys = TargetRegisterInfo::isPhysicalRegister(DstReg);
- return true;
- }
- /// Test if the given register value, which is used by the
- /// given instruction, is killed by the given instruction.
- static bool isPlainlyKilled(MachineInstr *MI, unsigned Reg,
- LiveIntervals *LIS) {
- if (LIS && TargetRegisterInfo::isVirtualRegister(Reg) &&
- !LIS->isNotInMIMap(*MI)) {
- // FIXME: Sometimes tryInstructionTransform() will add instructions and
- // test whether they can be folded before keeping them. In this case it
- // sets a kill before recursively calling tryInstructionTransform() again.
- // If there is no interval available, we assume that this instruction is
- // one of those. A kill flag is manually inserted on the operand so the
- // check below will handle it.
- LiveInterval &LI = LIS->getInterval(Reg);
- // This is to match the kill flag version where undefs don't have kill
- // flags.
- if (!LI.hasAtLeastOneValue())
- return false;
- SlotIndex useIdx = LIS->getInstructionIndex(*MI);
- LiveInterval::const_iterator I = LI.find(useIdx);
- assert(I != LI.end() && "Reg must be live-in to use.");
- return !I->end.isBlock() && SlotIndex::isSameInstr(I->end, useIdx);
- }
- return MI->killsRegister(Reg);
- }
- /// Test if the given register value, which is used by the given
- /// instruction, is killed by the given instruction. This looks through
- /// coalescable copies to see if the original value is potentially not killed.
- ///
- /// For example, in this code:
- ///
- /// %reg1034 = copy %reg1024
- /// %reg1035 = copy killed %reg1025
- /// %reg1036 = add killed %reg1034, killed %reg1035
- ///
- /// %reg1034 is not considered to be killed, since it is copied from a
- /// register which is not killed. Treating it as not killed lets the
- /// normal heuristics commute the (two-address) add, which lets
- /// coalescing eliminate the extra copy.
- ///
- /// If allowFalsePositives is true then likely kills are treated as kills even
- /// if it can't be proven that they are kills.
- static bool isKilled(MachineInstr &MI, unsigned Reg,
- const MachineRegisterInfo *MRI,
- const TargetInstrInfo *TII,
- LiveIntervals *LIS,
- bool allowFalsePositives) {
- MachineInstr *DefMI = &MI;
- while (true) {
- // All uses of physical registers are likely to be kills.
- if (TargetRegisterInfo::isPhysicalRegister(Reg) &&
- (allowFalsePositives || MRI->hasOneUse(Reg)))
- return true;
- if (!isPlainlyKilled(DefMI, Reg, LIS))
- return false;
- if (TargetRegisterInfo::isPhysicalRegister(Reg))
- return true;
- MachineRegisterInfo::def_iterator Begin = MRI->def_begin(Reg);
- // If there are multiple defs, we can't do a simple analysis, so just
- // go with what the kill flag says.
- if (std::next(Begin) != MRI->def_end())
- return true;
- DefMI = Begin->getParent();
- bool IsSrcPhys, IsDstPhys;
- unsigned SrcReg, DstReg;
- // If the def is something other than a copy, then it isn't going to
- // be coalesced, so follow the kill flag.
- if (!isCopyToReg(*DefMI, TII, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
- return true;
- Reg = SrcReg;
- }
- }
- /// Return true if the specified MI uses the specified register as a two-address
- /// use. If so, return the destination register by reference.
- static bool isTwoAddrUse(MachineInstr &MI, unsigned Reg, unsigned &DstReg) {
- for (unsigned i = 0, NumOps = MI.getNumOperands(); i != NumOps; ++i) {
- const MachineOperand &MO = MI.getOperand(i);
- if (!MO.isReg() || !MO.isUse() || MO.getReg() != Reg)
- continue;
- unsigned ti;
- if (MI.isRegTiedToDefOperand(i, &ti)) {
- DstReg = MI.getOperand(ti).getReg();
- return true;
- }
- }
- return false;
- }
- /// Given a register, if has a single in-basic block use, return the use
- /// instruction if it's a copy or a two-address use.
- static
- MachineInstr *findOnlyInterestingUse(unsigned Reg, MachineBasicBlock *MBB,
- MachineRegisterInfo *MRI,
- const TargetInstrInfo *TII,
- bool &IsCopy,
- unsigned &DstReg, bool &IsDstPhys) {
- if (!MRI->hasOneNonDBGUse(Reg))
- // None or more than one use.
- return nullptr;
- MachineInstr &UseMI = *MRI->use_instr_nodbg_begin(Reg);
- if (UseMI.getParent() != MBB)
- return nullptr;
- unsigned SrcReg;
- bool IsSrcPhys;
- if (isCopyToReg(UseMI, TII, SrcReg, DstReg, IsSrcPhys, IsDstPhys)) {
- IsCopy = true;
- return &UseMI;
- }
- IsDstPhys = false;
- if (isTwoAddrUse(UseMI, Reg, DstReg)) {
- IsDstPhys = TargetRegisterInfo::isPhysicalRegister(DstReg);
- return &UseMI;
- }
- return nullptr;
- }
- /// Return the physical register the specified virtual register might be mapped
- /// to.
- static unsigned
- getMappedReg(unsigned Reg, DenseMap<unsigned, unsigned> &RegMap) {
- while (TargetRegisterInfo::isVirtualRegister(Reg)) {
- DenseMap<unsigned, unsigned>::iterator SI = RegMap.find(Reg);
- if (SI == RegMap.end())
- return 0;
- Reg = SI->second;
- }
- if (TargetRegisterInfo::isPhysicalRegister(Reg))
- return Reg;
- return 0;
- }
- /// Return true if the two registers are equal or aliased.
- static bool
- regsAreCompatible(unsigned RegA, unsigned RegB, const TargetRegisterInfo *TRI) {
- if (RegA == RegB)
- return true;
- if (!RegA || !RegB)
- return false;
- return TRI->regsOverlap(RegA, RegB);
- }
- // Returns true if Reg is equal or aliased to at least one register in Set.
- static bool regOverlapsSet(const SmallVectorImpl<unsigned> &Set, unsigned Reg,
- const TargetRegisterInfo *TRI) {
- for (unsigned R : Set)
- if (TRI->regsOverlap(R, Reg))
- return true;
- return false;
- }
- /// Return true if it's potentially profitable to commute the two-address
- /// instruction that's being processed.
- bool
- TwoAddressInstructionPass::
- isProfitableToCommute(unsigned regA, unsigned regB, unsigned regC,
- MachineInstr *MI, unsigned Dist) {
- if (OptLevel == CodeGenOpt::None)
- return false;
- // Determine if it's profitable to commute this two address instruction. In
- // general, we want no uses between this instruction and the definition of
- // the two-address register.
- // e.g.
- // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
- // %reg1029 = MOV8rr %reg1028
- // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
- // insert => %reg1030 = MOV8rr %reg1028
- // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
- // In this case, it might not be possible to coalesce the second MOV8rr
- // instruction if the first one is coalesced. So it would be profitable to
- // commute it:
- // %reg1028 = EXTRACT_SUBREG killed %reg1027, 1
- // %reg1029 = MOV8rr %reg1028
- // %reg1029 = SHR8ri %reg1029, 7, implicit dead %eflags
- // insert => %reg1030 = MOV8rr %reg1029
- // %reg1030 = ADD8rr killed %reg1029, killed %reg1028, implicit dead %eflags
- if (!isPlainlyKilled(MI, regC, LIS))
- return false;
- // Ok, we have something like:
- // %reg1030 = ADD8rr killed %reg1028, killed %reg1029, implicit dead %eflags
- // let's see if it's worth commuting it.
- // Look for situations like this:
- // %reg1024 = MOV r1
- // %reg1025 = MOV r0
- // %reg1026 = ADD %reg1024, %reg1025
- // r0 = MOV %reg1026
- // Commute the ADD to hopefully eliminate an otherwise unavoidable copy.
- unsigned ToRegA = getMappedReg(regA, DstRegMap);
- if (ToRegA) {
- unsigned FromRegB = getMappedReg(regB, SrcRegMap);
- unsigned FromRegC = getMappedReg(regC, SrcRegMap);
- bool CompB = FromRegB && regsAreCompatible(FromRegB, ToRegA, TRI);
- bool CompC = FromRegC && regsAreCompatible(FromRegC, ToRegA, TRI);
- // Compute if any of the following are true:
- // -RegB is not tied to a register and RegC is compatible with RegA.
- // -RegB is tied to the wrong physical register, but RegC is.
- // -RegB is tied to the wrong physical register, and RegC isn't tied.
- if ((!FromRegB && CompC) || (FromRegB && !CompB && (!FromRegC || CompC)))
- return true;
- // Don't compute if any of the following are true:
- // -RegC is not tied to a register and RegB is compatible with RegA.
- // -RegC is tied to the wrong physical register, but RegB is.
- // -RegC is tied to the wrong physical register, and RegB isn't tied.
- if ((!FromRegC && CompB) || (FromRegC && !CompC && (!FromRegB || CompB)))
- return false;
- }
- // If there is a use of regC between its last def (could be livein) and this
- // instruction, then bail.
- unsigned LastDefC = 0;
- if (!noUseAfterLastDef(regC, Dist, LastDefC))
- return false;
- // If there is a use of regB between its last def (could be livein) and this
- // instruction, then go ahead and make this transformation.
- unsigned LastDefB = 0;
- if (!noUseAfterLastDef(regB, Dist, LastDefB))
- return true;
- // Look for situation like this:
- // %reg101 = MOV %reg100
- // %reg102 = ...
- // %reg103 = ADD %reg102, %reg101
- // ... = %reg103 ...
- // %reg100 = MOV %reg103
- // If there is a reversed copy chain from reg101 to reg103, commute the ADD
- // to eliminate an otherwise unavoidable copy.
- // FIXME:
- // We can extend the logic further: If an pair of operands in an insn has
- // been merged, the insn could be regarded as a virtual copy, and the virtual
- // copy could also be used to construct a copy chain.
- // To more generally minimize register copies, ideally the logic of two addr
- // instruction pass should be integrated with register allocation pass where
- // interference graph is available.
- if (isRevCopyChain(regC, regA, MaxDataFlowEdge))
- return true;
- if (isRevCopyChain(regB, regA, MaxDataFlowEdge))
- return false;
- // Since there are no intervening uses for both registers, then commute
- // if the def of regC is closer. Its live interval is shorter.
- return LastDefB && LastDefC && LastDefC > LastDefB;
- }
- /// Commute a two-address instruction and update the basic block, distance map,
- /// and live variables if needed. Return true if it is successful.
- bool TwoAddressInstructionPass::commuteInstruction(MachineInstr *MI,
- unsigned DstIdx,
- unsigned RegBIdx,
- unsigned RegCIdx,
- unsigned Dist) {
- unsigned RegC = MI->getOperand(RegCIdx).getReg();
- DEBUG(dbgs() << "2addr: COMMUTING : " << *MI);
- MachineInstr *NewMI = TII->commuteInstruction(*MI, false, RegBIdx, RegCIdx);
- if (NewMI == nullptr) {
- DEBUG(dbgs() << "2addr: COMMUTING FAILED!\n");
- return false;
- }
- DEBUG(dbgs() << "2addr: COMMUTED TO: " << *NewMI);
- assert(NewMI == MI &&
- "TargetInstrInfo::commuteInstruction() should not return a new "
- "instruction unless it was requested.");
- // Update source register map.
- unsigned FromRegC = getMappedReg(RegC, SrcRegMap);
- if (FromRegC) {
- unsigned RegA = MI->getOperand(DstIdx).getReg();
- SrcRegMap[RegA] = FromRegC;
- }
- return true;
- }
- /// Return true if it is profitable to convert the given 2-address instruction
- /// to a 3-address one.
- bool
- TwoAddressInstructionPass::isProfitableToConv3Addr(unsigned RegA,unsigned RegB){
- // Look for situations like this:
- // %reg1024 = MOV r1
- // %reg1025 = MOV r0
- // %reg1026 = ADD %reg1024, %reg1025
- // r2 = MOV %reg1026
- // Turn ADD into a 3-address instruction to avoid a copy.
- unsigned FromRegB = getMappedReg(RegB, SrcRegMap);
- if (!FromRegB)
- return false;
- unsigned ToRegA = getMappedReg(RegA, DstRegMap);
- return (ToRegA && !regsAreCompatible(FromRegB, ToRegA, TRI));
- }
- /// Convert the specified two-address instruction into a three address one.
- /// Return true if this transformation was successful.
- bool
- TwoAddressInstructionPass::convertInstTo3Addr(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned RegA, unsigned RegB,
- unsigned Dist) {
- // FIXME: Why does convertToThreeAddress() need an iterator reference?
- MachineFunction::iterator MFI = MBB->getIterator();
- MachineInstr *NewMI = TII->convertToThreeAddress(MFI, *mi, LV);
- assert(MBB->getIterator() == MFI &&
- "convertToThreeAddress changed iterator reference");
- if (!NewMI)
- return false;
- DEBUG(dbgs() << "2addr: CONVERTING 2-ADDR: " << *mi);
- DEBUG(dbgs() << "2addr: TO 3-ADDR: " << *NewMI);
- bool Sunk = false;
- if (LIS)
- LIS->ReplaceMachineInstrInMaps(*mi, *NewMI);
- if (NewMI->findRegisterUseOperand(RegB, false, TRI))
- // FIXME: Temporary workaround. If the new instruction doesn't
- // uses RegB, convertToThreeAddress must have created more
- // then one instruction.
- Sunk = sink3AddrInstruction(NewMI, RegB, mi);
- MBB->erase(mi); // Nuke the old inst.
- if (!Sunk) {
- DistanceMap.insert(std::make_pair(NewMI, Dist));
- mi = NewMI;
- nmi = std::next(mi);
- }
- else
- SunkInstrs.insert(NewMI);
- // Update source and destination register maps.
- SrcRegMap.erase(RegA);
- DstRegMap.erase(RegB);
- return true;
- }
- /// Scan forward recursively for only uses, update maps if the use is a copy or
- /// a two-address instruction.
- void
- TwoAddressInstructionPass::scanUses(unsigned DstReg) {
- SmallVector<unsigned, 4> VirtRegPairs;
- bool IsDstPhys;
- bool IsCopy = false;
- unsigned NewReg = 0;
- unsigned Reg = DstReg;
- while (MachineInstr *UseMI = findOnlyInterestingUse(Reg, MBB, MRI, TII,IsCopy,
- NewReg, IsDstPhys)) {
- if (IsCopy && !Processed.insert(UseMI).second)
- break;
- DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(UseMI);
- if (DI != DistanceMap.end())
- // Earlier in the same MBB.Reached via a back edge.
- break;
- if (IsDstPhys) {
- VirtRegPairs.push_back(NewReg);
- break;
- }
- bool isNew = SrcRegMap.insert(std::make_pair(NewReg, Reg)).second;
- if (!isNew)
- assert(SrcRegMap[NewReg] == Reg && "Can't map to two src registers!");
- VirtRegPairs.push_back(NewReg);
- Reg = NewReg;
- }
- if (!VirtRegPairs.empty()) {
- unsigned ToReg = VirtRegPairs.back();
- VirtRegPairs.pop_back();
- while (!VirtRegPairs.empty()) {
- unsigned FromReg = VirtRegPairs.back();
- VirtRegPairs.pop_back();
- bool isNew = DstRegMap.insert(std::make_pair(FromReg, ToReg)).second;
- if (!isNew)
- assert(DstRegMap[FromReg] == ToReg &&"Can't map to two dst registers!");
- ToReg = FromReg;
- }
- bool isNew = DstRegMap.insert(std::make_pair(DstReg, ToReg)).second;
- if (!isNew)
- assert(DstRegMap[DstReg] == ToReg && "Can't map to two dst registers!");
- }
- }
- /// If the specified instruction is not yet processed, process it if it's a
- /// copy. For a copy instruction, we find the physical registers the
- /// source and destination registers might be mapped to. These are kept in
- /// point-to maps used to determine future optimizations. e.g.
- /// v1024 = mov r0
- /// v1025 = mov r1
- /// v1026 = add v1024, v1025
- /// r1 = mov r1026
- /// If 'add' is a two-address instruction, v1024, v1026 are both potentially
- /// coalesced to r0 (from the input side). v1025 is mapped to r1. v1026 is
- /// potentially joined with r1 on the output side. It's worthwhile to commute
- /// 'add' to eliminate a copy.
- void TwoAddressInstructionPass::processCopy(MachineInstr *MI) {
- if (Processed.count(MI))
- return;
- bool IsSrcPhys, IsDstPhys;
- unsigned SrcReg, DstReg;
- if (!isCopyToReg(*MI, TII, SrcReg, DstReg, IsSrcPhys, IsDstPhys))
- return;
- if (IsDstPhys && !IsSrcPhys)
- DstRegMap.insert(std::make_pair(SrcReg, DstReg));
- else if (!IsDstPhys && IsSrcPhys) {
- bool isNew = SrcRegMap.insert(std::make_pair(DstReg, SrcReg)).second;
- if (!isNew)
- assert(SrcRegMap[DstReg] == SrcReg &&
- "Can't map to two src physical registers!");
- scanUses(DstReg);
- }
- Processed.insert(MI);
- }
- /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
- /// consider moving the instruction below the kill instruction in order to
- /// eliminate the need for the copy.
- bool TwoAddressInstructionPass::
- rescheduleMIBelowKill(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned Reg) {
- // Bail immediately if we don't have LV or LIS available. We use them to find
- // kills efficiently.
- if (!LV && !LIS)
- return false;
- MachineInstr *MI = &*mi;
- DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
- if (DI == DistanceMap.end())
- // Must be created from unfolded load. Don't waste time trying this.
- return false;
- MachineInstr *KillMI = nullptr;
- if (LIS) {
- LiveInterval &LI = LIS->getInterval(Reg);
- assert(LI.end() != LI.begin() &&
- "Reg should not have empty live interval.");
- SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
- LiveInterval::const_iterator I = LI.find(MBBEndIdx);
- if (I != LI.end() && I->start < MBBEndIdx)
- return false;
- --I;
- KillMI = LIS->getInstructionFromIndex(I->end);
- } else {
- KillMI = LV->getVarInfo(Reg).findKill(MBB);
- }
- if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
- // Don't mess with copies, they may be coalesced later.
- return false;
- if (KillMI->hasUnmodeledSideEffects() || KillMI->isCall() ||
- KillMI->isBranch() || KillMI->isTerminator())
- // Don't move pass calls, etc.
- return false;
- unsigned DstReg;
- if (isTwoAddrUse(*KillMI, Reg, DstReg))
- return false;
- bool SeenStore = true;
- if (!MI->isSafeToMove(AA, SeenStore))
- return false;
- if (TII->getInstrLatency(InstrItins, *MI) > 1)
- // FIXME: Needs more sophisticated heuristics.
- return false;
- SmallVector<unsigned, 2> Uses;
- SmallVector<unsigned, 2> Kills;
- SmallVector<unsigned, 2> Defs;
- for (const MachineOperand &MO : MI->operands()) {
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (!MOReg)
- continue;
- if (MO.isDef())
- Defs.push_back(MOReg);
- else {
- Uses.push_back(MOReg);
- if (MOReg != Reg && (MO.isKill() ||
- (LIS && isPlainlyKilled(MI, MOReg, LIS))))
- Kills.push_back(MOReg);
- }
- }
- // Move the copies connected to MI down as well.
- MachineBasicBlock::iterator Begin = MI;
- MachineBasicBlock::iterator AfterMI = std::next(Begin);
- MachineBasicBlock::iterator End = AfterMI;
- while (End->isCopy() &&
- regOverlapsSet(Defs, End->getOperand(1).getReg(), TRI)) {
- Defs.push_back(End->getOperand(0).getReg());
- ++End;
- }
- // Check if the reschedule will not break dependencies.
- unsigned NumVisited = 0;
- MachineBasicBlock::iterator KillPos = KillMI;
- ++KillPos;
- for (MachineInstr &OtherMI : make_range(End, KillPos)) {
- // Debug instructions cannot be counted against the limit.
- if (OtherMI.isDebugInstr())
- continue;
- if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
- return false;
- ++NumVisited;
- if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
- OtherMI.isBranch() || OtherMI.isTerminator())
- // Don't move pass calls, etc.
- return false;
- for (const MachineOperand &MO : OtherMI.operands()) {
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (!MOReg)
- continue;
- if (MO.isDef()) {
- if (regOverlapsSet(Uses, MOReg, TRI))
- // Physical register use would be clobbered.
- return false;
- if (!MO.isDead() && regOverlapsSet(Defs, MOReg, TRI))
- // May clobber a physical register def.
- // FIXME: This may be too conservative. It's ok if the instruction
- // is sunken completely below the use.
- return false;
- } else {
- if (regOverlapsSet(Defs, MOReg, TRI))
- return false;
- bool isKill =
- MO.isKill() || (LIS && isPlainlyKilled(&OtherMI, MOReg, LIS));
- if (MOReg != Reg && ((isKill && regOverlapsSet(Uses, MOReg, TRI)) ||
- regOverlapsSet(Kills, MOReg, TRI)))
- // Don't want to extend other live ranges and update kills.
- return false;
- if (MOReg == Reg && !isKill)
- // We can't schedule across a use of the register in question.
- return false;
- // Ensure that if this is register in question, its the kill we expect.
- assert((MOReg != Reg || &OtherMI == KillMI) &&
- "Found multiple kills of a register in a basic block");
- }
- }
- }
- // Move debug info as well.
- while (Begin != MBB->begin() && std::prev(Begin)->isDebugInstr())
- --Begin;
- nmi = End;
- MachineBasicBlock::iterator InsertPos = KillPos;
- if (LIS) {
- // We have to move the copies first so that the MBB is still well-formed
- // when calling handleMove().
- for (MachineBasicBlock::iterator MBBI = AfterMI; MBBI != End;) {
- auto CopyMI = MBBI++;
- MBB->splice(InsertPos, MBB, CopyMI);
- LIS->handleMove(*CopyMI);
- InsertPos = CopyMI;
- }
- End = std::next(MachineBasicBlock::iterator(MI));
- }
- // Copies following MI may have been moved as well.
- MBB->splice(InsertPos, MBB, Begin, End);
- DistanceMap.erase(DI);
- // Update live variables
- if (LIS) {
- LIS->handleMove(*MI);
- } else {
- LV->removeVirtualRegisterKilled(Reg, *KillMI);
- LV->addVirtualRegisterKilled(Reg, *MI);
- }
- DEBUG(dbgs() << "\trescheduled below kill: " << *KillMI);
- return true;
- }
- /// Return true if the re-scheduling will put the given instruction too close
- /// to the defs of its register dependencies.
- bool TwoAddressInstructionPass::isDefTooClose(unsigned Reg, unsigned Dist,
- MachineInstr *MI) {
- for (MachineInstr &DefMI : MRI->def_instructions(Reg)) {
- if (DefMI.getParent() != MBB || DefMI.isCopy() || DefMI.isCopyLike())
- continue;
- if (&DefMI == MI)
- return true; // MI is defining something KillMI uses
- DenseMap<MachineInstr*, unsigned>::iterator DDI = DistanceMap.find(&DefMI);
- if (DDI == DistanceMap.end())
- return true; // Below MI
- unsigned DefDist = DDI->second;
- assert(Dist > DefDist && "Visited def already?");
- if (TII->getInstrLatency(InstrItins, DefMI) > (Dist - DefDist))
- return true;
- }
- return false;
- }
- /// If there is one more local instruction that reads 'Reg' and it kills 'Reg,
- /// consider moving the kill instruction above the current two-address
- /// instruction in order to eliminate the need for the copy.
- bool TwoAddressInstructionPass::
- rescheduleKillAboveMI(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned Reg) {
- // Bail immediately if we don't have LV or LIS available. We use them to find
- // kills efficiently.
- if (!LV && !LIS)
- return false;
- MachineInstr *MI = &*mi;
- DenseMap<MachineInstr*, unsigned>::iterator DI = DistanceMap.find(MI);
- if (DI == DistanceMap.end())
- // Must be created from unfolded load. Don't waste time trying this.
- return false;
- MachineInstr *KillMI = nullptr;
- if (LIS) {
- LiveInterval &LI = LIS->getInterval(Reg);
- assert(LI.end() != LI.begin() &&
- "Reg should not have empty live interval.");
- SlotIndex MBBEndIdx = LIS->getMBBEndIdx(MBB).getPrevSlot();
- LiveInterval::const_iterator I = LI.find(MBBEndIdx);
- if (I != LI.end() && I->start < MBBEndIdx)
- return false;
- --I;
- KillMI = LIS->getInstructionFromIndex(I->end);
- } else {
- KillMI = LV->getVarInfo(Reg).findKill(MBB);
- }
- if (!KillMI || MI == KillMI || KillMI->isCopy() || KillMI->isCopyLike())
- // Don't mess with copies, they may be coalesced later.
- return false;
- unsigned DstReg;
- if (isTwoAddrUse(*KillMI, Reg, DstReg))
- return false;
- bool SeenStore = true;
- if (!KillMI->isSafeToMove(AA, SeenStore))
- return false;
- SmallSet<unsigned, 2> Uses;
- SmallSet<unsigned, 2> Kills;
- SmallSet<unsigned, 2> Defs;
- SmallSet<unsigned, 2> LiveDefs;
- for (const MachineOperand &MO : KillMI->operands()) {
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (MO.isUse()) {
- if (!MOReg)
- continue;
- if (isDefTooClose(MOReg, DI->second, MI))
- return false;
- bool isKill = MO.isKill() || (LIS && isPlainlyKilled(KillMI, MOReg, LIS));
- if (MOReg == Reg && !isKill)
- return false;
- Uses.insert(MOReg);
- if (isKill && MOReg != Reg)
- Kills.insert(MOReg);
- } else if (TargetRegisterInfo::isPhysicalRegister(MOReg)) {
- Defs.insert(MOReg);
- if (!MO.isDead())
- LiveDefs.insert(MOReg);
- }
- }
- // Check if the reschedule will not break depedencies.
- unsigned NumVisited = 0;
- for (MachineInstr &OtherMI :
- make_range(mi, MachineBasicBlock::iterator(KillMI))) {
- // Debug instructions cannot be counted against the limit.
- if (OtherMI.isDebugInstr())
- continue;
- if (NumVisited > 10) // FIXME: Arbitrary limit to reduce compile time cost.
- return false;
- ++NumVisited;
- if (OtherMI.hasUnmodeledSideEffects() || OtherMI.isCall() ||
- OtherMI.isBranch() || OtherMI.isTerminator())
- // Don't move pass calls, etc.
- return false;
- SmallVector<unsigned, 2> OtherDefs;
- for (const MachineOperand &MO : OtherMI.operands()) {
- if (!MO.isReg())
- continue;
- unsigned MOReg = MO.getReg();
- if (!MOReg)
- continue;
- if (MO.isUse()) {
- if (Defs.count(MOReg))
- // Moving KillMI can clobber the physical register if the def has
- // not been seen.
- return false;
- if (Kills.count(MOReg))
- // Don't want to extend other live ranges and update kills.
- return false;
- if (&OtherMI != MI && MOReg == Reg &&
- !(MO.isKill() || (LIS && isPlainlyKilled(&OtherMI, MOReg, LIS))))
- // We can't schedule across a use of the register in question.
- return false;
- } else {
- OtherDefs.push_back(MOReg);
- }
- }
- for (unsigned i = 0, e = OtherDefs.size(); i != e; ++i) {
- unsigned MOReg = OtherDefs[i];
- if (Uses.count(MOReg))
- return false;
- if (TargetRegisterInfo::isPhysicalRegister(MOReg) &&
- LiveDefs.count(MOReg))
- return false;
- // Physical register def is seen.
- Defs.erase(MOReg);
- }
- }
- // Move the old kill above MI, don't forget to move debug info as well.
- MachineBasicBlock::iterator InsertPos = mi;
- while (InsertPos != MBB->begin() && std::prev(InsertPos)->isDebugInstr())
- --InsertPos;
- MachineBasicBlock::iterator From = KillMI;
- MachineBasicBlock::iterator To = std::next(From);
- while (std::prev(From)->isDebugInstr())
- --From;
- MBB->splice(InsertPos, MBB, From, To);
- nmi = std::prev(InsertPos); // Backtrack so we process the moved instr.
- DistanceMap.erase(DI);
- // Update live variables
- if (LIS) {
- LIS->handleMove(*KillMI);
- } else {
- LV->removeVirtualRegisterKilled(Reg, *KillMI);
- LV->addVirtualRegisterKilled(Reg, *MI);
- }
- DEBUG(dbgs() << "\trescheduled kill: " << *KillMI);
- return true;
- }
- /// Tries to commute the operand 'BaseOpIdx' and some other operand in the
- /// given machine instruction to improve opportunities for coalescing and
- /// elimination of a register to register copy.
- ///
- /// 'DstOpIdx' specifies the index of MI def operand.
- /// 'BaseOpKilled' specifies if the register associated with 'BaseOpIdx'
- /// operand is killed by the given instruction.
- /// The 'Dist' arguments provides the distance of MI from the start of the
- /// current basic block and it is used to determine if it is profitable
- /// to commute operands in the instruction.
- ///
- /// Returns true if the transformation happened. Otherwise, returns false.
- bool TwoAddressInstructionPass::tryInstructionCommute(MachineInstr *MI,
- unsigned DstOpIdx,
- unsigned BaseOpIdx,
- bool BaseOpKilled,
- unsigned Dist) {
- if (!MI->isCommutable())
- return false;
- bool MadeChange = false;
- unsigned DstOpReg = MI->getOperand(DstOpIdx).getReg();
- unsigned BaseOpReg = MI->getOperand(BaseOpIdx).getReg();
- unsigned OpsNum = MI->getDesc().getNumOperands();
- unsigned OtherOpIdx = MI->getDesc().getNumDefs();
- for (; OtherOpIdx < OpsNum; OtherOpIdx++) {
- // The call of findCommutedOpIndices below only checks if BaseOpIdx
- // and OtherOpIdx are commutable, it does not really search for
- // other commutable operands and does not change the values of passed
- // variables.
- if (OtherOpIdx == BaseOpIdx || !MI->getOperand(OtherOpIdx).isReg() ||
- !TII->findCommutedOpIndices(*MI, BaseOpIdx, OtherOpIdx))
- continue;
- unsigned OtherOpReg = MI->getOperand(OtherOpIdx).getReg();
- bool AggressiveCommute = false;
- // If OtherOp dies but BaseOp does not, swap the OtherOp and BaseOp
- // operands. This makes the live ranges of DstOp and OtherOp joinable.
- bool OtherOpKilled = isKilled(*MI, OtherOpReg, MRI, TII, LIS, false);
- bool DoCommute = !BaseOpKilled && OtherOpKilled;
- if (!DoCommute &&
- isProfitableToCommute(DstOpReg, BaseOpReg, OtherOpReg, MI, Dist)) {
- DoCommute = true;
- AggressiveCommute = true;
- }
- // If it's profitable to commute, try to do so.
- if (DoCommute && commuteInstruction(MI, DstOpIdx, BaseOpIdx, OtherOpIdx,
- Dist)) {
- MadeChange = true;
- ++NumCommuted;
- if (AggressiveCommute) {
- ++NumAggrCommuted;
- // There might be more than two commutable operands, update BaseOp and
- // continue scanning.
- BaseOpReg = OtherOpReg;
- BaseOpKilled = OtherOpKilled;
- continue;
- }
- // If this was a commute based on kill, we won't do better continuing.
- return MadeChange;
- }
- }
- return MadeChange;
- }
- /// For the case where an instruction has a single pair of tied register
- /// operands, attempt some transformations that may either eliminate the tied
- /// operands or improve the opportunities for coalescing away the register copy.
- /// Returns true if no copy needs to be inserted to untie mi's operands
- /// (either because they were untied, or because mi was rescheduled, and will
- /// be visited again later). If the shouldOnlyCommute flag is true, only
- /// instruction commutation is attempted.
- bool TwoAddressInstructionPass::
- tryInstructionTransform(MachineBasicBlock::iterator &mi,
- MachineBasicBlock::iterator &nmi,
- unsigned SrcIdx, unsigned DstIdx,
- unsigned Dist, bool shouldOnlyCommute) {
- if (OptLevel == CodeGenOpt::None)
- return false;
- MachineInstr &MI = *mi;
- unsigned regA = MI.getOperand(DstIdx).getReg();
- unsigned regB = MI.getOperand(SrcIdx).getReg();
- assert(TargetRegisterInfo::isVirtualRegister(regB) &&
- "cannot make instruction into two-address form");
- bool regBKilled = isKilled(MI, regB, MRI, TII, LIS, true);
- if (TargetRegisterInfo::isVirtualRegister(regA))
- scanUses(regA);
- bool Commuted = tryInstructionCommute(&MI, DstIdx, SrcIdx, regBKilled, Dist);
- // If the instruction is convertible to 3 Addr, instead
- // of returning try 3 Addr transformation aggresively and
- // use this variable to check later. Because it might be better.
- // For example, we can just use `leal (%rsi,%rdi), %eax` and `ret`
- // instead of the following code.
- // addl %esi, %edi
- // movl %edi, %eax
- // ret
- if (Commuted && !MI.isConvertibleTo3Addr())
- return false;
- if (shouldOnlyCommute)
- return false;
- // If there is one more use of regB later in the same MBB, consider
- // re-schedule this MI below it.
- if (!Commuted && EnableRescheduling && rescheduleMIBelowKill(mi, nmi, regB)) {
- ++NumReSchedDowns;
- return true;
- }
- // If we commuted, regB may have changed so we should re-sample it to avoid
- // confusing the three address conversion below.
- if (Commuted) {
- regB = MI.getOperand(SrcIdx).getReg();
- regBKilled = isKilled(MI, regB, MRI, TII, LIS, true);
- }
- if (MI.isConvertibleTo3Addr()) {
- // This instruction is potentially convertible to a true
- // three-address instruction. Check if it is profitable.
- if (!regBKilled || isProfitableToConv3Addr(regA, regB)) {
- // Try to convert it.
- if (convertInstTo3Addr(mi, nmi, regA, regB, Dist)) {
- ++NumConvertedTo3Addr;
- return true; // Done with this instruction.
- }
- }
- }
- // Return if it is commuted but 3 addr conversion is failed.
- if (Commuted)
- return false;
- // If there is one more use of regB later in the same MBB, consider
- // re-schedule it before this MI if it's legal.
- if (EnableRescheduling && rescheduleKillAboveMI(mi, nmi, regB)) {
- ++NumReSchedUps;
- return true;
- }
- // If this is an instruction with a load folded into it, try unfolding
- // the load, e.g. avoid this:
- // movq %rdx, %rcx
- // addq (%rax), %rcx
- // in favor of this:
- // movq (%rax), %rcx
- // addq %rdx, %rcx
- // because it's preferable to schedule a load than a register copy.
- if (MI.mayLoad() && !regBKilled) {
- // Determine if a load can be unfolded.
- unsigned LoadRegIndex;
- unsigned NewOpc =
- TII->getOpcodeAfterMemoryUnfold(MI.getOpcode(),
- /*UnfoldLoad=*/true,
- /*UnfoldStore=*/false,
- &LoadRegIndex);
- if (NewOpc != 0) {
- const MCInstrDesc &UnfoldMCID = TII->get(NewOpc);
- if (UnfoldMCID.getNumDefs() == 1) {
- // Unfold the load.
- DEBUG(dbgs() << "2addr: UNFOLDING: " << MI);
- const TargetRegisterClass *RC =
- TRI->getAllocatableClass(
- TII->getRegClass(UnfoldMCID, LoadRegIndex, TRI, *MF));
- unsigned Reg = MRI->createVirtualRegister(RC);
- SmallVector<MachineInstr *, 2> NewMIs;
- if (!TII->unfoldMemoryOperand(*MF, MI, Reg,
- /*UnfoldLoad=*/true,
- /*UnfoldStore=*/false, NewMIs)) {
- DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
- return false;
- }
- assert(NewMIs.size() == 2 &&
- "Unfolded a load into multiple instructions!");
- // The load was previously folded, so this is the only use.
- NewMIs[1]->addRegisterKilled(Reg, TRI);
- // Tentatively insert the instructions into the block so that they
- // look "normal" to the transformation logic.
- MBB->insert(mi, NewMIs[0]);
- MBB->insert(mi, NewMIs[1]);
- DEBUG(dbgs() << "2addr: NEW LOAD: " << *NewMIs[0]
- << "2addr: NEW INST: " << *NewMIs[1]);
- // Transform the instruction, now that it no longer has a load.
- unsigned NewDstIdx = NewMIs[1]->findRegisterDefOperandIdx(regA);
- unsigned NewSrcIdx = NewMIs[1]->findRegisterUseOperandIdx(regB);
- MachineBasicBlock::iterator NewMI = NewMIs[1];
- bool TransformResult =
- tryInstructionTransform(NewMI, mi, NewSrcIdx, NewDstIdx, Dist, true);
- (void)TransformResult;
- assert(!TransformResult &&
- "tryInstructionTransform() should return false.");
- if (NewMIs[1]->getOperand(NewSrcIdx).isKill()) {
- // Success, or at least we made an improvement. Keep the unfolded
- // instructions and discard the original.
- if (LV) {
- for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
- MachineOperand &MO = MI.getOperand(i);
- if (MO.isReg() &&
- TargetRegisterInfo::isVirtualRegister(MO.getReg())) {
- if (MO.isUse()) {
- if (MO.isKill()) {
- if (NewMIs[0]->killsRegister(MO.getReg()))
- LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[0]);
- else {
- assert(NewMIs[1]->killsRegister(MO.getReg()) &&
- "Kill missing after load unfold!");
- LV->replaceKillInstruction(MO.getReg(), MI, *NewMIs[1]);
- }
- }
- } else if (LV->removeVirtualRegisterDead(MO.getReg(), MI)) {
- if (NewMIs[1]->registerDefIsDead(MO.getReg()))
- LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[1]);
- else {
- assert(NewMIs[0]->registerDefIsDead(MO.getReg()) &&
- "Dead flag missing after load unfold!");
- LV->addVirtualRegisterDead(MO.getReg(), *NewMIs[0]);
- }
- }
- }
- }
- LV->addVirtualRegisterKilled(Reg, *NewMIs[1]);
- }
- SmallVector<unsigned, 4> OrigRegs;
- if (LIS) {
- for (const MachineOperand &MO : MI.operands()) {
- if (MO.isReg())
- OrigRegs.push_back(MO.getReg());
- }
- }
- MI.eraseFromParent();
- // Update LiveIntervals.
- if (LIS) {
- MachineBasicBlock::iterator Begin(NewMIs[0]);
- MachineBasicBlock::iterator End(NewMIs[1]);
- LIS->repairIntervalsInRange(MBB, Begin, End, OrigRegs);
- }
- mi = NewMIs[1];
- } else {
- // Transforming didn't eliminate the tie and didn't lead to an
- // improvement. Clean up the unfolded instructions and keep the
- // original.
- DEBUG(dbgs() << "2addr: ABANDONING UNFOLD\n");
- NewMIs[0]->eraseFromParent();
- NewMIs[1]->eraseFromParent();
- }
- }
- }
- }
- return false;
- }
- // Collect tied operands of MI that need to be handled.
- // Rewrite trivial cases immediately.
- // Return true if any tied operands where found, including the trivial ones.
- bool TwoAddressInstructionPass::
- collectTiedOperands(MachineInstr *MI, TiedOperandMap &TiedOperands) {
- const MCInstrDesc &MCID = MI->getDesc();
- bool AnyOps = false;
- unsigned NumOps = MI->getNumOperands();
- for (unsigned SrcIdx = 0; SrcIdx < NumOps; ++SrcIdx) {
- unsigned DstIdx = 0;
- if (!MI->isRegTiedToDefOperand(SrcIdx, &DstIdx))
- continue;
- AnyOps = true;
- MachineOperand &SrcMO = MI->getOperand(SrcIdx);
- MachineOperand &DstMO = MI->getOperand(DstIdx);
- unsigned SrcReg = SrcMO.getReg();
- unsigned DstReg = DstMO.getReg();
- // Tied constraint already satisfied?
- if (SrcReg == DstReg)
- continue;
- assert(SrcReg && SrcMO.isUse() && "two address instruction invalid");
- // Deal with undef uses immediately - simply rewrite the src operand.
- if (SrcMO.isUndef() && !DstMO.getSubReg()) {
- // Constrain the DstReg register class if required.
- if (TargetRegisterInfo::isVirtualRegister(DstReg))
- if (const TargetRegisterClass *RC = TII->getRegClass(MCID, SrcIdx,
- TRI, *MF))
- MRI->constrainRegClass(DstReg, RC);
- SrcMO.setReg(DstReg);
- SrcMO.setSubReg(0);
- DEBUG(dbgs() << "\t\trewrite undef:\t" << *MI);
- continue;
- }
- TiedOperands[SrcReg].push_back(std::make_pair(SrcIdx, DstIdx));
- }
- return AnyOps;
- }
- // Process a list of tied MI operands that all use the same source register.
- // The tied pairs are of the form (SrcIdx, DstIdx).
- void
- TwoAddressInstructionPass::processTiedPairs(MachineInstr *MI,
- TiedPairList &TiedPairs,
- unsigned &Dist) {
- bool IsEarlyClobber = false;
- for (unsigned tpi = 0, tpe = TiedPairs.size(); tpi != tpe; ++tpi) {
- const MachineOperand &DstMO = MI->getOperand(TiedPairs[tpi].second);
- IsEarlyClobber |= DstMO.isEarlyClobber();
- }
- bool RemovedKillFlag = false;
- bool AllUsesCopied = true;
- unsigned LastCopiedReg = 0;
- SlotIndex LastCopyIdx;
- unsigned RegB = 0;
- unsigned SubRegB = 0;
- for (unsigned tpi = 0, tpe = TiedPairs.size(); tpi != tpe; ++tpi) {
- unsigned SrcIdx = TiedPairs[tpi].first;
- unsigned DstIdx = TiedPairs[tpi].second;
- const MachineOperand &DstMO = MI->getOperand(DstIdx);
- unsigned RegA = DstMO.getReg();
- // Grab RegB from the instruction because it may have changed if the
- // instruction was commuted.
- RegB = MI->getOperand(SrcIdx).getReg();
- SubRegB = MI->getOperand(SrcIdx).getSubReg();
- if (RegA == RegB) {
- // The register is tied to multiple destinations (or else we would
- // not have continued this far), but this use of the register
- // already matches the tied destination. Leave it.
- AllUsesCopied = false;
- continue;
- }
- LastCopiedReg = RegA;
- assert(TargetRegisterInfo::isVirtualRegister(RegB) &&
- "cannot make instruction into two-address form");
- #ifndef NDEBUG
- // First, verify that we don't have a use of "a" in the instruction
- // (a = b + a for example) because our transformation will not
- // work. This should never occur because we are in SSA form.
- for (unsigned i = 0; i != MI->getNumOperands(); ++i)
- assert(i == DstIdx ||
- !MI->getOperand(i).isReg() ||
- MI->getOperand(i).getReg() != RegA);
- #endif
- // Emit a copy.
- MachineInstrBuilder MIB = BuildMI(*MI->getParent(), MI, MI->getDebugLoc(),
- TII->get(TargetOpcode::COPY), RegA);
- // If this operand is folding a truncation, the truncation now moves to the
- // copy so that the register classes remain valid for the operands.
- MIB.addReg(RegB, 0, SubRegB);
- const TargetRegisterClass *RC = MRI->getRegClass(RegB);
- if (SubRegB) {
- if (TargetRegisterInfo::isVirtualRegister(RegA)) {
- assert(TRI->getMatchingSuperRegClass(RC, MRI->getRegClass(RegA),
- SubRegB) &&
- "tied subregister must be a truncation");
- // The superreg class will not be used to constrain the subreg class.
- RC = nullptr;
- }
- else {
- assert(TRI->getMatchingSuperReg(RegA, SubRegB, MRI->getRegClass(RegB))
- && "tied subregister must be a truncation");
- }
- }
- // Update DistanceMap.
- MachineBasicBlock::iterator PrevMI = MI;
- --PrevMI;
- DistanceMap.insert(std::make_pair(&*PrevMI, Dist));
- DistanceMap[MI] = ++Dist;
- if (LIS) {
- LastCopyIdx = LIS->InsertMachineInstrInMaps(*PrevMI).getRegSlot();
- if (TargetRegisterInfo::isVirtualRegister(RegA)) {
- LiveInterval &LI = LIS->getInterval(RegA);
- VNInfo *VNI = LI.getNextValue(LastCopyIdx, LIS->getVNInfoAllocator());
- SlotIndex endIdx =
- LIS->getInstructionIndex(*MI).getRegSlot(IsEarlyClobber);
- LI.addSegment(LiveInterval::Segment(LastCopyIdx, endIdx, VNI));
- }
- }
- DEBUG(dbgs() << "\t\tprepend:\t" << *MIB);
- MachineOperand &MO = MI->getOperand(SrcIdx);
- assert(MO.isReg() && MO.getReg() == RegB && MO.isUse() &&
- "inconsistent operand info for 2-reg pass");
- if (MO.isKill()) {
- MO.setIsKill(false);
- RemovedKillFlag = true;
- }
- // Make sure regA is a legal regclass for the SrcIdx operand.
- if (TargetRegisterInfo::isVirtualRegister(RegA) &&
- TargetRegisterInfo::isVirtualRegister(RegB))
- MRI->constrainRegClass(RegA, RC);
- MO.setReg(RegA);
- // The getMatchingSuper asserts guarantee that the register class projected
- // by SubRegB is compatible with RegA with no subregister. So regardless of
- // whether the dest oper writes a subreg, the source oper should not.
- MO.setSubReg(0);
- // Propagate SrcRegMap.
- SrcRegMap[RegA] = RegB;
- }
- if (AllUsesCopied) {
- if (!IsEarlyClobber) {
- // Replace other (un-tied) uses of regB with LastCopiedReg.
- for (MachineOperand &MO : MI->operands()) {
- if (MO.isReg() && MO.getReg() == RegB &&
- MO.isUse()) {
- if (MO.isKill()) {
- MO.setIsKill(false);
- RemovedKillFlag = true;
- }
- MO.setReg(LastCopiedReg);
- MO.setSubReg(MO.getSubReg());
- }
- }
- }
- // Update live variables for regB.
- if (RemovedKillFlag && LV && LV->getVarInfo(RegB).removeKill(*MI)) {
- MachineBasicBlock::iterator PrevMI = MI;
- --PrevMI;
- LV->addVirtualRegisterKilled(RegB, *PrevMI);
- }
- // Update LiveIntervals.
- if (LIS) {
- LiveInterval &LI = LIS->getInterval(RegB);
- SlotIndex MIIdx = LIS->getInstructionIndex(*MI);
- LiveInterval::const_iterator I = LI.find(MIIdx);
- assert(I != LI.end() && "RegB must be live-in to use.");
- SlotIndex UseIdx = MIIdx.getRegSlot(IsEarlyClobber);
- if (I->end == UseIdx)
- LI.removeSegment(LastCopyIdx, UseIdx);
- }
- } else if (RemovedKillFlag) {
- // Some tied uses of regB matched their destination registers, so
- // regB is still used in this instruction, but a kill flag was
- // removed from a different tied use of regB, so now we need to add
- // a kill flag to one of the remaining uses of regB.
- for (MachineOperand &MO : MI->operands()) {
- if (MO.isReg() && MO.getReg() == RegB && MO.isUse()) {
- MO.setIsKill(true);
- break;
- }
- }
- }
- }
- /// Reduce two-address instructions to two operands.
- bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &Func) {
- MF = &Func;
- const TargetMachine &TM = MF->getTarget();
- MRI = &MF->getRegInfo();
- TII = MF->getSubtarget().getInstrInfo();
- TRI = MF->getSubtarget().getRegisterInfo();
- InstrItins = MF->getSubtarget().getInstrItineraryData();
- LV = getAnalysisIfAvailable<LiveVariables>();
- LIS = getAnalysisIfAvailable<LiveIntervals>();
- if (auto *AAPass = getAnalysisIfAvailable<AAResultsWrapperPass>())
- AA = &AAPass->getAAResults();
- else
- AA = nullptr;
- OptLevel = TM.getOptLevel();
- // Disable optimizations if requested. We cannot skip the whole pass as some
- // fixups are necessary for correctness.
- if (skipFunction(Func.getFunction()))
- OptLevel = CodeGenOpt::None;
- bool MadeChange = false;
- DEBUG(dbgs() << "********** REWRITING TWO-ADDR INSTRS **********\n");
- DEBUG(dbgs() << "********** Function: "
- << MF->getName() << '\n');
- // This pass takes the function out of SSA form.
- MRI->leaveSSA();
- TiedOperandMap TiedOperands;
- for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
- MBBI != MBBE; ++MBBI) {
- MBB = &*MBBI;
- unsigned Dist = 0;
- DistanceMap.clear();
- SrcRegMap.clear();
- DstRegMap.clear();
- Processed.clear();
- SunkInstrs.clear();
- for (MachineBasicBlock::iterator mi = MBB->begin(), me = MBB->end();
- mi != me; ) {
- MachineBasicBlock::iterator nmi = std::next(mi);
- // Don't revisit an instruction previously converted by target. It may
- // contain undef register operands (%noreg), which are not handled.
- if (mi->isDebugInstr() || SunkInstrs.count(&*mi)) {
- mi = nmi;
- continue;
- }
- // Expand REG_SEQUENCE instructions. This will position mi at the first
- // expanded instruction.
- if (mi->isRegSequence())
- eliminateRegSequence(mi);
- DistanceMap.insert(std::make_pair(&*mi, ++Dist));
- processCopy(&*mi);
- // First scan through all the tied register uses in this instruction
- // and record a list of pairs of tied operands for each register.
- if (!collectTiedOperands(&*mi, TiedOperands)) {
- mi = nmi;
- continue;
- }
- ++NumTwoAddressInstrs;
- MadeChange = true;
- DEBUG(dbgs() << '\t' << *mi);
- // If the instruction has a single pair of tied operands, try some
- // transformations that may either eliminate the tied operands or
- // improve the opportunities for coalescing away the register copy.
- if (TiedOperands.size() == 1) {
- SmallVectorImpl<std::pair<unsigned, unsigned>> &TiedPairs
- = TiedOperands.begin()->second;
- if (TiedPairs.size() == 1) {
- unsigned SrcIdx = TiedPairs[0].first;
- unsigned DstIdx = TiedPairs[0].second;
- unsigned SrcReg = mi->getOperand(SrcIdx).getReg();
- unsigned DstReg = mi->getOperand(DstIdx).getReg();
- if (SrcReg != DstReg &&
- tryInstructionTransform(mi, nmi, SrcIdx, DstIdx, Dist, false)) {
- // The tied operands have been eliminated or shifted further down
- // the block to ease elimination. Continue processing with 'nmi'.
- TiedOperands.clear();
- mi = nmi;
- continue;
- }
- }
- }
- // Now iterate over the information collected above.
- for (auto &TO : TiedOperands) {
- processTiedPairs(&*mi, TO.second, Dist);
- DEBUG(dbgs() << "\t\trewrite to:\t" << *mi);
- }
- // Rewrite INSERT_SUBREG as COPY now that we no longer need SSA form.
- if (mi->isInsertSubreg()) {
- // From %reg = INSERT_SUBREG %reg, %subreg, subidx
- // To %reg:subidx = COPY %subreg
- unsigned SubIdx = mi->getOperand(3).getImm();
- mi->RemoveOperand(3);
- assert(mi->getOperand(0).getSubReg() == 0 && "Unexpected subreg idx");
- mi->getOperand(0).setSubReg(SubIdx);
- mi->getOperand(0).setIsUndef(mi->getOperand(1).isUndef());
- mi->RemoveOperand(1);
- mi->setDesc(TII->get(TargetOpcode::COPY));
- DEBUG(dbgs() << "\t\tconvert to:\t" << *mi);
- }
- // Clear TiedOperands here instead of at the top of the loop
- // since most instructions do not have tied operands.
- TiedOperands.clear();
- mi = nmi;
- }
- }
- if (LIS)
- MF->verify(this, "After two-address instruction pass");
- return MadeChange;
- }
- /// Eliminate a REG_SEQUENCE instruction as part of the de-ssa process.
- ///
- /// The instruction is turned into a sequence of sub-register copies:
- ///
- /// %dst = REG_SEQUENCE %v1, ssub0, %v2, ssub1
- ///
- /// Becomes:
- ///
- /// undef %dst:ssub0 = COPY %v1
- /// %dst:ssub1 = COPY %v2
- void TwoAddressInstructionPass::
- eliminateRegSequence(MachineBasicBlock::iterator &MBBI) {
- MachineInstr &MI = *MBBI;
- unsigned DstReg = MI.getOperand(0).getReg();
- if (MI.getOperand(0).getSubReg() ||
- TargetRegisterInfo::isPhysicalRegister(DstReg) ||
- !(MI.getNumOperands() & 1)) {
- DEBUG(dbgs() << "Illegal REG_SEQUENCE instruction:" << MI);
- llvm_unreachable(nullptr);
- }
- SmallVector<unsigned, 4> OrigRegs;
- if (LIS) {
- OrigRegs.push_back(MI.getOperand(0).getReg());
- for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2)
- OrigRegs.push_back(MI.getOperand(i).getReg());
- }
- bool DefEmitted = false;
- for (unsigned i = 1, e = MI.getNumOperands(); i < e; i += 2) {
- MachineOperand &UseMO = MI.getOperand(i);
- unsigned SrcReg = UseMO.getReg();
- unsigned SubIdx = MI.getOperand(i+1).getImm();
- // Nothing needs to be inserted for undef operands.
- if (UseMO.isUndef())
- continue;
- // Defer any kill flag to the last operand using SrcReg. Otherwise, we
- // might insert a COPY that uses SrcReg after is was killed.
- bool isKill = UseMO.isKill();
- if (isKill)
- for (unsigned j = i + 2; j < e; j += 2)
- if (MI.getOperand(j).getReg() == SrcReg) {
- MI.getOperand(j).setIsKill();
- UseMO.setIsKill(false);
- isKill = false;
- break;
- }
- // Insert the sub-register copy.
- MachineInstr *CopyMI = BuildMI(*MI.getParent(), MI, MI.getDebugLoc(),
- TII->get(TargetOpcode::COPY))
- .addReg(DstReg, RegState::Define, SubIdx)
- .add(UseMO);
- // The first def needs an undef flag because there is no live register
- // before it.
- if (!DefEmitted) {
- CopyMI->getOperand(0).setIsUndef(true);
- // Return an iterator pointing to the first inserted instr.
- MBBI = CopyMI;
- }
- DefEmitted = true;
- // Update LiveVariables' kill info.
- if (LV && isKill && !TargetRegisterInfo::isPhysicalRegister(SrcReg))
- LV->replaceKillInstruction(SrcReg, MI, *CopyMI);
- DEBUG(dbgs() << "Inserted: " << *CopyMI);
- }
- MachineBasicBlock::iterator EndMBBI =
- std::next(MachineBasicBlock::iterator(MI));
- if (!DefEmitted) {
- DEBUG(dbgs() << "Turned: " << MI << " into an IMPLICIT_DEF");
- MI.setDesc(TII->get(TargetOpcode::IMPLICIT_DEF));
- for (int j = MI.getNumOperands() - 1, ee = 0; j > ee; --j)
- MI.RemoveOperand(j);
- } else {
- DEBUG(dbgs() << "Eliminated: " << MI);
- MI.eraseFromParent();
- }
- // Udpate LiveIntervals.
- if (LIS)
- LIS->repairIntervalsInRange(MBB, MBBI, EndMBBI, OrigRegs);
- }
|