1*3d8efa4fSMarina Yatsina //===- ExecutionDepsFix.cpp - Fix execution domain issues ----*- C++ -*-===// 2*3d8efa4fSMarina Yatsina // 3*3d8efa4fSMarina Yatsina // The LLVM Compiler Infrastructure 4*3d8efa4fSMarina Yatsina // 5*3d8efa4fSMarina Yatsina // This file is distributed under the University of Illinois Open Source 6*3d8efa4fSMarina Yatsina // License. See LICENSE.TXT for details. 7*3d8efa4fSMarina Yatsina // 8*3d8efa4fSMarina Yatsina //===----------------------------------------------------------------------===// 9*3d8efa4fSMarina Yatsina 10*3d8efa4fSMarina Yatsina #include "llvm/CodeGen/ExecutionDomainFix.h" 11*3d8efa4fSMarina Yatsina #include "llvm/ADT/PostOrderIterator.h" 12*3d8efa4fSMarina Yatsina #include "llvm/CodeGen/MachineRegisterInfo.h" 13*3d8efa4fSMarina Yatsina #include "llvm/CodeGen/TargetInstrInfo.h" 14*3d8efa4fSMarina Yatsina 15*3d8efa4fSMarina Yatsina using namespace llvm; 16*3d8efa4fSMarina Yatsina 17*3d8efa4fSMarina Yatsina #define DEBUG_TYPE "execution-deps-fix" 18*3d8efa4fSMarina Yatsina 19*3d8efa4fSMarina Yatsina char ReachingDefAnalysis::ID = 0; 20*3d8efa4fSMarina Yatsina INITIALIZE_PASS(ReachingDefAnalysis, "reaching-deps-analysis", 21*3d8efa4fSMarina Yatsina "ReachingDefAnalysis", false, true) 22*3d8efa4fSMarina Yatsina 23*3d8efa4fSMarina Yatsina char BreakFalseDeps::ID = 0; 24*3d8efa4fSMarina Yatsina INITIALIZE_PASS_BEGIN(BreakFalseDeps, "break-false-deps", "BreakFalseDeps", 25*3d8efa4fSMarina Yatsina false, false) 26*3d8efa4fSMarina Yatsina INITIALIZE_PASS_DEPENDENCY(ReachingDefAnalysis) 27*3d8efa4fSMarina Yatsina INITIALIZE_PASS_END(BreakFalseDeps, "break-false-deps", "BreakFalseDeps", false, 28*3d8efa4fSMarina Yatsina false) 29*3d8efa4fSMarina Yatsina 30*3d8efa4fSMarina Yatsina iterator_range<SmallVectorImpl<int>::const_iterator> 31*3d8efa4fSMarina Yatsina ExecutionDomainFix::regIndices(unsigned Reg) const { 32*3d8efa4fSMarina Yatsina assert(Reg < AliasMap.size() && "Invalid register"); 33*3d8efa4fSMarina Yatsina const auto &Entry = AliasMap[Reg]; 34*3d8efa4fSMarina Yatsina return make_range(Entry.begin(), Entry.end()); 35*3d8efa4fSMarina Yatsina } 36*3d8efa4fSMarina Yatsina 37*3d8efa4fSMarina Yatsina DomainValue *ExecutionDomainFix::alloc(int domain) { 38*3d8efa4fSMarina Yatsina DomainValue *dv = Avail.empty() ? new (Allocator.Allocate()) DomainValue 39*3d8efa4fSMarina Yatsina : Avail.pop_back_val(); 40*3d8efa4fSMarina Yatsina if (domain >= 0) 41*3d8efa4fSMarina Yatsina dv->addDomain(domain); 42*3d8efa4fSMarina Yatsina assert(dv->Refs == 0 && "Reference count wasn't cleared"); 43*3d8efa4fSMarina Yatsina assert(!dv->Next && "Chained DomainValue shouldn't have been recycled"); 44*3d8efa4fSMarina Yatsina return dv; 45*3d8efa4fSMarina Yatsina } 46*3d8efa4fSMarina Yatsina 47*3d8efa4fSMarina Yatsina void ExecutionDomainFix::release(DomainValue *DV) { 48*3d8efa4fSMarina Yatsina while (DV) { 49*3d8efa4fSMarina Yatsina assert(DV->Refs && "Bad DomainValue"); 50*3d8efa4fSMarina Yatsina if (--DV->Refs) 51*3d8efa4fSMarina Yatsina return; 52*3d8efa4fSMarina Yatsina 53*3d8efa4fSMarina Yatsina // There are no more DV references. Collapse any contained instructions. 54*3d8efa4fSMarina Yatsina if (DV->AvailableDomains && !DV->isCollapsed()) 55*3d8efa4fSMarina Yatsina collapse(DV, DV->getFirstDomain()); 56*3d8efa4fSMarina Yatsina 57*3d8efa4fSMarina Yatsina DomainValue *Next = DV->Next; 58*3d8efa4fSMarina Yatsina DV->clear(); 59*3d8efa4fSMarina Yatsina Avail.push_back(DV); 60*3d8efa4fSMarina Yatsina // Also release the next DomainValue in the chain. 61*3d8efa4fSMarina Yatsina DV = Next; 62*3d8efa4fSMarina Yatsina } 63*3d8efa4fSMarina Yatsina } 64*3d8efa4fSMarina Yatsina 65*3d8efa4fSMarina Yatsina DomainValue *ExecutionDomainFix::resolve(DomainValue *&DVRef) { 66*3d8efa4fSMarina Yatsina DomainValue *DV = DVRef; 67*3d8efa4fSMarina Yatsina if (!DV || !DV->Next) 68*3d8efa4fSMarina Yatsina return DV; 69*3d8efa4fSMarina Yatsina 70*3d8efa4fSMarina Yatsina // DV has a chain. Find the end. 71*3d8efa4fSMarina Yatsina do 72*3d8efa4fSMarina Yatsina DV = DV->Next; 73*3d8efa4fSMarina Yatsina while (DV->Next); 74*3d8efa4fSMarina Yatsina 75*3d8efa4fSMarina Yatsina // Update DVRef to point to DV. 76*3d8efa4fSMarina Yatsina retain(DV); 77*3d8efa4fSMarina Yatsina release(DVRef); 78*3d8efa4fSMarina Yatsina DVRef = DV; 79*3d8efa4fSMarina Yatsina return DV; 80*3d8efa4fSMarina Yatsina } 81*3d8efa4fSMarina Yatsina 82*3d8efa4fSMarina Yatsina void ExecutionDomainFix::setLiveReg(int rx, DomainValue *dv) { 83*3d8efa4fSMarina Yatsina assert(unsigned(rx) < NumRegs && "Invalid index"); 84*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first."); 85*3d8efa4fSMarina Yatsina 86*3d8efa4fSMarina Yatsina if (LiveRegs[rx] == dv) 87*3d8efa4fSMarina Yatsina return; 88*3d8efa4fSMarina Yatsina if (LiveRegs[rx]) 89*3d8efa4fSMarina Yatsina release(LiveRegs[rx]); 90*3d8efa4fSMarina Yatsina LiveRegs[rx] = retain(dv); 91*3d8efa4fSMarina Yatsina } 92*3d8efa4fSMarina Yatsina 93*3d8efa4fSMarina Yatsina void ExecutionDomainFix::kill(int rx) { 94*3d8efa4fSMarina Yatsina assert(unsigned(rx) < NumRegs && "Invalid index"); 95*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first."); 96*3d8efa4fSMarina Yatsina if (!LiveRegs[rx]) 97*3d8efa4fSMarina Yatsina return; 98*3d8efa4fSMarina Yatsina 99*3d8efa4fSMarina Yatsina release(LiveRegs[rx]); 100*3d8efa4fSMarina Yatsina LiveRegs[rx] = nullptr; 101*3d8efa4fSMarina Yatsina } 102*3d8efa4fSMarina Yatsina 103*3d8efa4fSMarina Yatsina void ExecutionDomainFix::force(int rx, unsigned domain) { 104*3d8efa4fSMarina Yatsina assert(unsigned(rx) < NumRegs && "Invalid index"); 105*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first."); 106*3d8efa4fSMarina Yatsina if (DomainValue *dv = LiveRegs[rx]) { 107*3d8efa4fSMarina Yatsina if (dv->isCollapsed()) 108*3d8efa4fSMarina Yatsina dv->addDomain(domain); 109*3d8efa4fSMarina Yatsina else if (dv->hasDomain(domain)) 110*3d8efa4fSMarina Yatsina collapse(dv, domain); 111*3d8efa4fSMarina Yatsina else { 112*3d8efa4fSMarina Yatsina // This is an incompatible open DomainValue. Collapse it to whatever and 113*3d8efa4fSMarina Yatsina // force the new value into domain. This costs a domain crossing. 114*3d8efa4fSMarina Yatsina collapse(dv, dv->getFirstDomain()); 115*3d8efa4fSMarina Yatsina assert(LiveRegs[rx] && "Not live after collapse?"); 116*3d8efa4fSMarina Yatsina LiveRegs[rx]->addDomain(domain); 117*3d8efa4fSMarina Yatsina } 118*3d8efa4fSMarina Yatsina } else { 119*3d8efa4fSMarina Yatsina // Set up basic collapsed DomainValue. 120*3d8efa4fSMarina Yatsina setLiveReg(rx, alloc(domain)); 121*3d8efa4fSMarina Yatsina } 122*3d8efa4fSMarina Yatsina } 123*3d8efa4fSMarina Yatsina 124*3d8efa4fSMarina Yatsina void ExecutionDomainFix::collapse(DomainValue *dv, unsigned domain) { 125*3d8efa4fSMarina Yatsina assert(dv->hasDomain(domain) && "Cannot collapse"); 126*3d8efa4fSMarina Yatsina 127*3d8efa4fSMarina Yatsina // Collapse all the instructions. 128*3d8efa4fSMarina Yatsina while (!dv->Instrs.empty()) 129*3d8efa4fSMarina Yatsina TII->setExecutionDomain(*dv->Instrs.pop_back_val(), domain); 130*3d8efa4fSMarina Yatsina dv->setSingleDomain(domain); 131*3d8efa4fSMarina Yatsina 132*3d8efa4fSMarina Yatsina // If there are multiple users, give them new, unique DomainValues. 133*3d8efa4fSMarina Yatsina if (!LiveRegs.empty() && dv->Refs > 1) 134*3d8efa4fSMarina Yatsina for (unsigned rx = 0; rx != NumRegs; ++rx) 135*3d8efa4fSMarina Yatsina if (LiveRegs[rx] == dv) 136*3d8efa4fSMarina Yatsina setLiveReg(rx, alloc(domain)); 137*3d8efa4fSMarina Yatsina } 138*3d8efa4fSMarina Yatsina 139*3d8efa4fSMarina Yatsina bool ExecutionDomainFix::merge(DomainValue *A, DomainValue *B) { 140*3d8efa4fSMarina Yatsina assert(!A->isCollapsed() && "Cannot merge into collapsed"); 141*3d8efa4fSMarina Yatsina assert(!B->isCollapsed() && "Cannot merge from collapsed"); 142*3d8efa4fSMarina Yatsina if (A == B) 143*3d8efa4fSMarina Yatsina return true; 144*3d8efa4fSMarina Yatsina // Restrict to the domains that A and B have in common. 145*3d8efa4fSMarina Yatsina unsigned common = A->getCommonDomains(B->AvailableDomains); 146*3d8efa4fSMarina Yatsina if (!common) 147*3d8efa4fSMarina Yatsina return false; 148*3d8efa4fSMarina Yatsina A->AvailableDomains = common; 149*3d8efa4fSMarina Yatsina A->Instrs.append(B->Instrs.begin(), B->Instrs.end()); 150*3d8efa4fSMarina Yatsina 151*3d8efa4fSMarina Yatsina // Clear the old DomainValue so we won't try to swizzle instructions twice. 152*3d8efa4fSMarina Yatsina B->clear(); 153*3d8efa4fSMarina Yatsina // All uses of B are referred to A. 154*3d8efa4fSMarina Yatsina B->Next = retain(A); 155*3d8efa4fSMarina Yatsina 156*3d8efa4fSMarina Yatsina for (unsigned rx = 0; rx != NumRegs; ++rx) { 157*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "no space allocated for live registers"); 158*3d8efa4fSMarina Yatsina if (LiveRegs[rx] == B) 159*3d8efa4fSMarina Yatsina setLiveReg(rx, A); 160*3d8efa4fSMarina Yatsina } 161*3d8efa4fSMarina Yatsina return true; 162*3d8efa4fSMarina Yatsina } 163*3d8efa4fSMarina Yatsina 164*3d8efa4fSMarina Yatsina void ReachingDefAnalysis::enterBasicBlock( 165*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 166*3d8efa4fSMarina Yatsina 167*3d8efa4fSMarina Yatsina MachineBasicBlock *MBB = TraversedMBB.MBB; 168*3d8efa4fSMarina Yatsina int MBBNumber = MBB->getNumber(); 169*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() && 170*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 171*3d8efa4fSMarina Yatsina MBBReachingDefs[MBBNumber].resize(NumRegUnits); 172*3d8efa4fSMarina Yatsina 173*3d8efa4fSMarina Yatsina // Reset instruction counter in each basic block. 174*3d8efa4fSMarina Yatsina CurInstr = 0; 175*3d8efa4fSMarina Yatsina 176*3d8efa4fSMarina Yatsina // Set up LiveRegs to represent registers entering MBB. 177*3d8efa4fSMarina Yatsina // Default values are 'nothing happened a long time ago'. 178*3d8efa4fSMarina Yatsina if (LiveRegs.empty()) 179*3d8efa4fSMarina Yatsina LiveRegs.assign(NumRegUnits, ReachingDedDefaultVal); 180*3d8efa4fSMarina Yatsina 181*3d8efa4fSMarina Yatsina // This is the entry block. 182*3d8efa4fSMarina Yatsina if (MBB->pred_empty()) { 183*3d8efa4fSMarina Yatsina for (const auto &LI : MBB->liveins()) { 184*3d8efa4fSMarina Yatsina for (MCRegUnitIterator Unit(LI.PhysReg, TRI); Unit.isValid(); ++Unit) { 185*3d8efa4fSMarina Yatsina // Treat function live-ins as if they were defined just before the first 186*3d8efa4fSMarina Yatsina // instruction. Usually, function arguments are set up immediately 187*3d8efa4fSMarina Yatsina // before the call. 188*3d8efa4fSMarina Yatsina LiveRegs[*Unit] = -1; 189*3d8efa4fSMarina Yatsina MBBReachingDefs[MBBNumber][*Unit].push_back(LiveRegs[*Unit]); 190*3d8efa4fSMarina Yatsina } 191*3d8efa4fSMarina Yatsina } 192*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n"); 193*3d8efa4fSMarina Yatsina return; 194*3d8efa4fSMarina Yatsina } 195*3d8efa4fSMarina Yatsina 196*3d8efa4fSMarina Yatsina // Try to coalesce live-out registers from predecessors. 197*3d8efa4fSMarina Yatsina for (MachineBasicBlock *pred : MBB->predecessors()) { 198*3d8efa4fSMarina Yatsina assert(pred->getNumber() < MBBOutRegsInfos.size() && 199*3d8efa4fSMarina Yatsina "Should have pre-allocated MBBInfos for all MBBs"); 200*3d8efa4fSMarina Yatsina const LiveRegsDefInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 201*3d8efa4fSMarina Yatsina // Incoming is null if this is a backedge from a BB 202*3d8efa4fSMarina Yatsina // we haven't processed yet 203*3d8efa4fSMarina Yatsina if (Incoming.empty()) 204*3d8efa4fSMarina Yatsina continue; 205*3d8efa4fSMarina Yatsina 206*3d8efa4fSMarina Yatsina for (unsigned Unit = 0; Unit != NumRegUnits; ++Unit) { 207*3d8efa4fSMarina Yatsina // Use the most recent predecessor def for each register. 208*3d8efa4fSMarina Yatsina LiveRegs[Unit] = std::max(LiveRegs[Unit], Incoming[Unit]); 209*3d8efa4fSMarina Yatsina if ((LiveRegs[Unit] != ReachingDedDefaultVal)) 210*3d8efa4fSMarina Yatsina MBBReachingDefs[MBBNumber][Unit].push_back(LiveRegs[Unit]); 211*3d8efa4fSMarina Yatsina } 212*3d8efa4fSMarina Yatsina } 213*3d8efa4fSMarina Yatsina 214*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printMBBReference(*MBB) 215*3d8efa4fSMarina Yatsina << (!TraversedMBB.IsDone ? ": incomplete\n" 216*3d8efa4fSMarina Yatsina : ": all preds known\n")); 217*3d8efa4fSMarina Yatsina } 218*3d8efa4fSMarina Yatsina 219*3d8efa4fSMarina Yatsina void ExecutionDomainFix::enterBasicBlock( 220*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 221*3d8efa4fSMarina Yatsina 222*3d8efa4fSMarina Yatsina MachineBasicBlock *MBB = TraversedMBB.MBB; 223*3d8efa4fSMarina Yatsina 224*3d8efa4fSMarina Yatsina // Set up LiveRegs to represent registers entering MBB. 225*3d8efa4fSMarina Yatsina // Set default domain values to 'no domain' (nullptr) 226*3d8efa4fSMarina Yatsina if (LiveRegs.empty()) 227*3d8efa4fSMarina Yatsina LiveRegs.assign(NumRegs, nullptr); 228*3d8efa4fSMarina Yatsina 229*3d8efa4fSMarina Yatsina // This is the entry block. 230*3d8efa4fSMarina Yatsina if (MBB->pred_empty()) { 231*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n"); 232*3d8efa4fSMarina Yatsina return; 233*3d8efa4fSMarina Yatsina } 234*3d8efa4fSMarina Yatsina 235*3d8efa4fSMarina Yatsina // Try to coalesce live-out registers from predecessors. 236*3d8efa4fSMarina Yatsina for (MachineBasicBlock *pred : MBB->predecessors()) { 237*3d8efa4fSMarina Yatsina assert(pred->getNumber() < MBBOutRegsInfos.size() && 238*3d8efa4fSMarina Yatsina "Should have pre-allocated MBBInfos for all MBBs"); 239*3d8efa4fSMarina Yatsina LiveRegsDVInfo &Incoming = MBBOutRegsInfos[pred->getNumber()]; 240*3d8efa4fSMarina Yatsina // Incoming is null if this is a backedge from a BB 241*3d8efa4fSMarina Yatsina // we haven't processed yet 242*3d8efa4fSMarina Yatsina if (Incoming.empty()) 243*3d8efa4fSMarina Yatsina continue; 244*3d8efa4fSMarina Yatsina 245*3d8efa4fSMarina Yatsina for (unsigned rx = 0; rx != NumRegs; ++rx) { 246*3d8efa4fSMarina Yatsina DomainValue *pdv = resolve(Incoming[rx]); 247*3d8efa4fSMarina Yatsina if (!pdv) 248*3d8efa4fSMarina Yatsina continue; 249*3d8efa4fSMarina Yatsina if (!LiveRegs[rx]) { 250*3d8efa4fSMarina Yatsina setLiveReg(rx, pdv); 251*3d8efa4fSMarina Yatsina continue; 252*3d8efa4fSMarina Yatsina } 253*3d8efa4fSMarina Yatsina 254*3d8efa4fSMarina Yatsina // We have a live DomainValue from more than one predecessor. 255*3d8efa4fSMarina Yatsina if (LiveRegs[rx]->isCollapsed()) { 256*3d8efa4fSMarina Yatsina // We are already collapsed, but predecessor is not. Force it. 257*3d8efa4fSMarina Yatsina unsigned Domain = LiveRegs[rx]->getFirstDomain(); 258*3d8efa4fSMarina Yatsina if (!pdv->isCollapsed() && pdv->hasDomain(Domain)) 259*3d8efa4fSMarina Yatsina collapse(pdv, Domain); 260*3d8efa4fSMarina Yatsina continue; 261*3d8efa4fSMarina Yatsina } 262*3d8efa4fSMarina Yatsina 263*3d8efa4fSMarina Yatsina // Currently open, merge in predecessor. 264*3d8efa4fSMarina Yatsina if (!pdv->isCollapsed()) 265*3d8efa4fSMarina Yatsina merge(LiveRegs[rx], pdv); 266*3d8efa4fSMarina Yatsina else 267*3d8efa4fSMarina Yatsina force(rx, pdv->getFirstDomain()); 268*3d8efa4fSMarina Yatsina } 269*3d8efa4fSMarina Yatsina } 270*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printMBBReference(*MBB) 271*3d8efa4fSMarina Yatsina << (!TraversedMBB.IsDone ? ": incomplete\n" 272*3d8efa4fSMarina Yatsina : ": all preds known\n")); 273*3d8efa4fSMarina Yatsina } 274*3d8efa4fSMarina Yatsina 275*3d8efa4fSMarina Yatsina void ReachingDefAnalysis::leaveBasicBlock( 276*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 277*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first."); 278*3d8efa4fSMarina Yatsina int MBBNumber = TraversedMBB.MBB->getNumber(); 279*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBOutRegsInfos.size() && 280*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 281*3d8efa4fSMarina Yatsina // Save register clearances at end of MBB - used by enterBasicBlock(). 282*3d8efa4fSMarina Yatsina MBBOutRegsInfos[MBBNumber] = LiveRegs; 283*3d8efa4fSMarina Yatsina 284*3d8efa4fSMarina Yatsina // While processing the basic block, we kept `Def` relative to the start 285*3d8efa4fSMarina Yatsina // of the basic block for convenience. However, future use of this information 286*3d8efa4fSMarina Yatsina // only cares about the clearance from the end of the block, so adjust 287*3d8efa4fSMarina Yatsina // everything to be relative to the end of the basic block. 288*3d8efa4fSMarina Yatsina for (int &OutLiveReg : MBBOutRegsInfos[MBBNumber]) 289*3d8efa4fSMarina Yatsina OutLiveReg -= CurInstr; 290*3d8efa4fSMarina Yatsina LiveRegs.clear(); 291*3d8efa4fSMarina Yatsina } 292*3d8efa4fSMarina Yatsina 293*3d8efa4fSMarina Yatsina void ExecutionDomainFix::leaveBasicBlock( 294*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 295*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "Must enter basic block first."); 296*3d8efa4fSMarina Yatsina int MBBNumber = TraversedMBB.MBB->getNumber(); 297*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBOutRegsInfos.size() && 298*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 299*3d8efa4fSMarina Yatsina // Save register clearances at end of MBB - used by enterBasicBlock(). 300*3d8efa4fSMarina Yatsina for (DomainValue *OldLiveReg : MBBOutRegsInfos[MBBNumber]) { 301*3d8efa4fSMarina Yatsina release(OldLiveReg); 302*3d8efa4fSMarina Yatsina } 303*3d8efa4fSMarina Yatsina MBBOutRegsInfos[MBBNumber] = LiveRegs; 304*3d8efa4fSMarina Yatsina LiveRegs.clear(); 305*3d8efa4fSMarina Yatsina } 306*3d8efa4fSMarina Yatsina 307*3d8efa4fSMarina Yatsina bool ExecutionDomainFix::visitInstr(MachineInstr *MI) { 308*3d8efa4fSMarina Yatsina // Update instructions with explicit execution domains. 309*3d8efa4fSMarina Yatsina std::pair<uint16_t, uint16_t> DomP = TII->getExecutionDomain(*MI); 310*3d8efa4fSMarina Yatsina if (DomP.first) { 311*3d8efa4fSMarina Yatsina if (DomP.second) 312*3d8efa4fSMarina Yatsina visitSoftInstr(MI, DomP.second); 313*3d8efa4fSMarina Yatsina else 314*3d8efa4fSMarina Yatsina visitHardInstr(MI, DomP.first); 315*3d8efa4fSMarina Yatsina } 316*3d8efa4fSMarina Yatsina 317*3d8efa4fSMarina Yatsina return !DomP.first; 318*3d8efa4fSMarina Yatsina } 319*3d8efa4fSMarina Yatsina 320*3d8efa4fSMarina Yatsina bool BreakFalseDeps::pickBestRegisterForUndef(MachineInstr *MI, unsigned OpIdx, 321*3d8efa4fSMarina Yatsina unsigned Pref) { 322*3d8efa4fSMarina Yatsina MachineOperand &MO = MI->getOperand(OpIdx); 323*3d8efa4fSMarina Yatsina assert(MO.isUndef() && "Expected undef machine operand"); 324*3d8efa4fSMarina Yatsina 325*3d8efa4fSMarina Yatsina unsigned OriginalReg = MO.getReg(); 326*3d8efa4fSMarina Yatsina 327*3d8efa4fSMarina Yatsina // Update only undef operands that have reg units that are mapped to one root. 328*3d8efa4fSMarina Yatsina for (MCRegUnitIterator Unit(OriginalReg, TRI); Unit.isValid(); ++Unit) { 329*3d8efa4fSMarina Yatsina unsigned NumRoots = 0; 330*3d8efa4fSMarina Yatsina for (MCRegUnitRootIterator Root(*Unit, TRI); Root.isValid(); ++Root) { 331*3d8efa4fSMarina Yatsina NumRoots++; 332*3d8efa4fSMarina Yatsina if (NumRoots > 1) 333*3d8efa4fSMarina Yatsina return false; 334*3d8efa4fSMarina Yatsina } 335*3d8efa4fSMarina Yatsina } 336*3d8efa4fSMarina Yatsina 337*3d8efa4fSMarina Yatsina // Get the undef operand's register class 338*3d8efa4fSMarina Yatsina const TargetRegisterClass *OpRC = 339*3d8efa4fSMarina Yatsina TII->getRegClass(MI->getDesc(), OpIdx, TRI, *MF); 340*3d8efa4fSMarina Yatsina 341*3d8efa4fSMarina Yatsina // If the instruction has a true dependency, we can hide the false depdency 342*3d8efa4fSMarina Yatsina // behind it. 343*3d8efa4fSMarina Yatsina for (MachineOperand &CurrMO : MI->operands()) { 344*3d8efa4fSMarina Yatsina if (!CurrMO.isReg() || CurrMO.isDef() || CurrMO.isUndef() || 345*3d8efa4fSMarina Yatsina !OpRC->contains(CurrMO.getReg())) 346*3d8efa4fSMarina Yatsina continue; 347*3d8efa4fSMarina Yatsina // We found a true dependency - replace the undef register with the true 348*3d8efa4fSMarina Yatsina // dependency. 349*3d8efa4fSMarina Yatsina MO.setReg(CurrMO.getReg()); 350*3d8efa4fSMarina Yatsina return true; 351*3d8efa4fSMarina Yatsina } 352*3d8efa4fSMarina Yatsina 353*3d8efa4fSMarina Yatsina // Go over all registers in the register class and find the register with 354*3d8efa4fSMarina Yatsina // max clearance or clearance higher than Pref. 355*3d8efa4fSMarina Yatsina unsigned MaxClearance = 0; 356*3d8efa4fSMarina Yatsina unsigned MaxClearanceReg = OriginalReg; 357*3d8efa4fSMarina Yatsina ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(OpRC); 358*3d8efa4fSMarina Yatsina for (MCPhysReg Reg : Order) { 359*3d8efa4fSMarina Yatsina unsigned Clearance = RDA->getClearance(MI, Reg); 360*3d8efa4fSMarina Yatsina if (Clearance <= MaxClearance) 361*3d8efa4fSMarina Yatsina continue; 362*3d8efa4fSMarina Yatsina MaxClearance = Clearance; 363*3d8efa4fSMarina Yatsina MaxClearanceReg = Reg; 364*3d8efa4fSMarina Yatsina 365*3d8efa4fSMarina Yatsina if (MaxClearance > Pref) 366*3d8efa4fSMarina Yatsina break; 367*3d8efa4fSMarina Yatsina } 368*3d8efa4fSMarina Yatsina 369*3d8efa4fSMarina Yatsina // Update the operand if we found a register with better clearance. 370*3d8efa4fSMarina Yatsina if (MaxClearanceReg != OriginalReg) 371*3d8efa4fSMarina Yatsina MO.setReg(MaxClearanceReg); 372*3d8efa4fSMarina Yatsina 373*3d8efa4fSMarina Yatsina return false; 374*3d8efa4fSMarina Yatsina } 375*3d8efa4fSMarina Yatsina 376*3d8efa4fSMarina Yatsina bool BreakFalseDeps::shouldBreakDependence(MachineInstr *MI, unsigned OpIdx, 377*3d8efa4fSMarina Yatsina unsigned Pref) { 378*3d8efa4fSMarina Yatsina unsigned reg = MI->getOperand(OpIdx).getReg(); 379*3d8efa4fSMarina Yatsina unsigned Clearance = RDA->getClearance(MI, reg); 380*3d8efa4fSMarina Yatsina DEBUG(dbgs() << "Clearance: " << Clearance << ", want " << Pref); 381*3d8efa4fSMarina Yatsina 382*3d8efa4fSMarina Yatsina if (Pref > Clearance) { 383*3d8efa4fSMarina Yatsina DEBUG(dbgs() << ": Break dependency.\n"); 384*3d8efa4fSMarina Yatsina return true; 385*3d8efa4fSMarina Yatsina } 386*3d8efa4fSMarina Yatsina DEBUG(dbgs() << ": OK .\n"); 387*3d8efa4fSMarina Yatsina return false; 388*3d8efa4fSMarina Yatsina } 389*3d8efa4fSMarina Yatsina 390*3d8efa4fSMarina Yatsina void ExecutionDomainFix::processDefs(MachineInstr *MI, bool Kill) { 391*3d8efa4fSMarina Yatsina assert(!MI->isDebugValue() && "Won't process debug values"); 392*3d8efa4fSMarina Yatsina const MCInstrDesc &MCID = MI->getDesc(); 393*3d8efa4fSMarina Yatsina for (unsigned i = 0, 394*3d8efa4fSMarina Yatsina e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs(); 395*3d8efa4fSMarina Yatsina i != e; ++i) { 396*3d8efa4fSMarina Yatsina MachineOperand &MO = MI->getOperand(i); 397*3d8efa4fSMarina Yatsina if (!MO.isReg()) 398*3d8efa4fSMarina Yatsina continue; 399*3d8efa4fSMarina Yatsina if (MO.isUse()) 400*3d8efa4fSMarina Yatsina continue; 401*3d8efa4fSMarina Yatsina for (int rx : regIndices(MO.getReg())) { 402*3d8efa4fSMarina Yatsina // This instruction explicitly defines rx. 403*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printReg(RC->getRegister(rx), TRI) << ":\t" << *MI); 404*3d8efa4fSMarina Yatsina 405*3d8efa4fSMarina Yatsina // Kill off domains redefined by generic instructions. 406*3d8efa4fSMarina Yatsina if (Kill) 407*3d8efa4fSMarina Yatsina kill(rx); 408*3d8efa4fSMarina Yatsina } 409*3d8efa4fSMarina Yatsina } 410*3d8efa4fSMarina Yatsina } 411*3d8efa4fSMarina Yatsina 412*3d8efa4fSMarina Yatsina void ReachingDefAnalysis::processDefs(MachineInstr *MI) { 413*3d8efa4fSMarina Yatsina assert(!MI->isDebugValue() && "Won't process debug values"); 414*3d8efa4fSMarina Yatsina 415*3d8efa4fSMarina Yatsina int MBBNumber = MI->getParent()->getNumber(); 416*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() && 417*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 418*3d8efa4fSMarina Yatsina const MCInstrDesc &MCID = MI->getDesc(); 419*3d8efa4fSMarina Yatsina for (unsigned i = 0, 420*3d8efa4fSMarina Yatsina e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs(); 421*3d8efa4fSMarina Yatsina i != e; ++i) { 422*3d8efa4fSMarina Yatsina MachineOperand &MO = MI->getOperand(i); 423*3d8efa4fSMarina Yatsina if (!MO.isReg() || !MO.getReg()) 424*3d8efa4fSMarina Yatsina continue; 425*3d8efa4fSMarina Yatsina if (MO.isUse()) 426*3d8efa4fSMarina Yatsina continue; 427*3d8efa4fSMarina Yatsina for (MCRegUnitIterator Unit(MO.getReg(), TRI); Unit.isValid(); ++Unit) { 428*3d8efa4fSMarina Yatsina // This instruction explicitly defines the current reg unit. 429*3d8efa4fSMarina Yatsina DEBUG(dbgs() << printReg(MO.getReg(), TRI) << ":\t" << CurInstr << '\t' 430*3d8efa4fSMarina Yatsina << *MI); 431*3d8efa4fSMarina Yatsina 432*3d8efa4fSMarina Yatsina // How many instructions since this reg unit was last written? 433*3d8efa4fSMarina Yatsina LiveRegs[*Unit] = CurInstr; 434*3d8efa4fSMarina Yatsina MBBReachingDefs[MBBNumber][*Unit].push_back(CurInstr); 435*3d8efa4fSMarina Yatsina } 436*3d8efa4fSMarina Yatsina } 437*3d8efa4fSMarina Yatsina InstIds[MI] = CurInstr; 438*3d8efa4fSMarina Yatsina ++CurInstr; 439*3d8efa4fSMarina Yatsina } 440*3d8efa4fSMarina Yatsina 441*3d8efa4fSMarina Yatsina void BreakFalseDeps::processDefs(MachineInstr *MI) { 442*3d8efa4fSMarina Yatsina assert(!MI->isDebugValue() && "Won't process debug values"); 443*3d8efa4fSMarina Yatsina 444*3d8efa4fSMarina Yatsina // Break dependence on undef uses. Do this before updating LiveRegs below. 445*3d8efa4fSMarina Yatsina unsigned OpNum; 446*3d8efa4fSMarina Yatsina unsigned Pref = TII->getUndefRegClearance(*MI, OpNum, TRI); 447*3d8efa4fSMarina Yatsina if (Pref) { 448*3d8efa4fSMarina Yatsina bool HadTrueDependency = pickBestRegisterForUndef(MI, OpNum, Pref); 449*3d8efa4fSMarina Yatsina // We don't need to bother trying to break a dependency if this 450*3d8efa4fSMarina Yatsina // instruction has a true dependency on that register through another 451*3d8efa4fSMarina Yatsina // operand - we'll have to wait for it to be available regardless. 452*3d8efa4fSMarina Yatsina if (!HadTrueDependency && shouldBreakDependence(MI, OpNum, Pref)) 453*3d8efa4fSMarina Yatsina UndefReads.push_back(std::make_pair(MI, OpNum)); 454*3d8efa4fSMarina Yatsina } 455*3d8efa4fSMarina Yatsina 456*3d8efa4fSMarina Yatsina const MCInstrDesc &MCID = MI->getDesc(); 457*3d8efa4fSMarina Yatsina for (unsigned i = 0, 458*3d8efa4fSMarina Yatsina e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs(); 459*3d8efa4fSMarina Yatsina i != e; ++i) { 460*3d8efa4fSMarina Yatsina MachineOperand &MO = MI->getOperand(i); 461*3d8efa4fSMarina Yatsina if (!MO.isReg() || !MO.getReg()) 462*3d8efa4fSMarina Yatsina continue; 463*3d8efa4fSMarina Yatsina if (MO.isUse()) 464*3d8efa4fSMarina Yatsina continue; 465*3d8efa4fSMarina Yatsina // Check clearance before partial register updates. 466*3d8efa4fSMarina Yatsina unsigned Pref = TII->getPartialRegUpdateClearance(*MI, i, TRI); 467*3d8efa4fSMarina Yatsina if (Pref && shouldBreakDependence(MI, i, Pref)) 468*3d8efa4fSMarina Yatsina TII->breakPartialRegDependency(*MI, i, TRI); 469*3d8efa4fSMarina Yatsina } 470*3d8efa4fSMarina Yatsina } 471*3d8efa4fSMarina Yatsina 472*3d8efa4fSMarina Yatsina void BreakFalseDeps::processUndefReads(MachineBasicBlock *MBB) { 473*3d8efa4fSMarina Yatsina if (UndefReads.empty()) 474*3d8efa4fSMarina Yatsina return; 475*3d8efa4fSMarina Yatsina 476*3d8efa4fSMarina Yatsina // Collect this block's live out register units. 477*3d8efa4fSMarina Yatsina LiveRegSet.init(*TRI); 478*3d8efa4fSMarina Yatsina // We do not need to care about pristine registers as they are just preserved 479*3d8efa4fSMarina Yatsina // but not actually used in the function. 480*3d8efa4fSMarina Yatsina LiveRegSet.addLiveOutsNoPristines(*MBB); 481*3d8efa4fSMarina Yatsina 482*3d8efa4fSMarina Yatsina MachineInstr *UndefMI = UndefReads.back().first; 483*3d8efa4fSMarina Yatsina unsigned OpIdx = UndefReads.back().second; 484*3d8efa4fSMarina Yatsina 485*3d8efa4fSMarina Yatsina for (MachineInstr &I : make_range(MBB->rbegin(), MBB->rend())) { 486*3d8efa4fSMarina Yatsina // Update liveness, including the current instruction's defs. 487*3d8efa4fSMarina Yatsina LiveRegSet.stepBackward(I); 488*3d8efa4fSMarina Yatsina 489*3d8efa4fSMarina Yatsina if (UndefMI == &I) { 490*3d8efa4fSMarina Yatsina if (!LiveRegSet.contains(UndefMI->getOperand(OpIdx).getReg())) 491*3d8efa4fSMarina Yatsina TII->breakPartialRegDependency(*UndefMI, OpIdx, TRI); 492*3d8efa4fSMarina Yatsina 493*3d8efa4fSMarina Yatsina UndefReads.pop_back(); 494*3d8efa4fSMarina Yatsina if (UndefReads.empty()) 495*3d8efa4fSMarina Yatsina return; 496*3d8efa4fSMarina Yatsina 497*3d8efa4fSMarina Yatsina UndefMI = UndefReads.back().first; 498*3d8efa4fSMarina Yatsina OpIdx = UndefReads.back().second; 499*3d8efa4fSMarina Yatsina } 500*3d8efa4fSMarina Yatsina } 501*3d8efa4fSMarina Yatsina } 502*3d8efa4fSMarina Yatsina 503*3d8efa4fSMarina Yatsina void ExecutionDomainFix::visitHardInstr(MachineInstr *mi, unsigned domain) { 504*3d8efa4fSMarina Yatsina // Collapse all uses. 505*3d8efa4fSMarina Yatsina for (unsigned i = mi->getDesc().getNumDefs(), 506*3d8efa4fSMarina Yatsina e = mi->getDesc().getNumOperands(); 507*3d8efa4fSMarina Yatsina i != e; ++i) { 508*3d8efa4fSMarina Yatsina MachineOperand &mo = mi->getOperand(i); 509*3d8efa4fSMarina Yatsina if (!mo.isReg()) 510*3d8efa4fSMarina Yatsina continue; 511*3d8efa4fSMarina Yatsina for (int rx : regIndices(mo.getReg())) { 512*3d8efa4fSMarina Yatsina force(rx, domain); 513*3d8efa4fSMarina Yatsina } 514*3d8efa4fSMarina Yatsina } 515*3d8efa4fSMarina Yatsina 516*3d8efa4fSMarina Yatsina // Kill all defs and force them. 517*3d8efa4fSMarina Yatsina for (unsigned i = 0, e = mi->getDesc().getNumDefs(); i != e; ++i) { 518*3d8efa4fSMarina Yatsina MachineOperand &mo = mi->getOperand(i); 519*3d8efa4fSMarina Yatsina if (!mo.isReg()) 520*3d8efa4fSMarina Yatsina continue; 521*3d8efa4fSMarina Yatsina for (int rx : regIndices(mo.getReg())) { 522*3d8efa4fSMarina Yatsina kill(rx); 523*3d8efa4fSMarina Yatsina force(rx, domain); 524*3d8efa4fSMarina Yatsina } 525*3d8efa4fSMarina Yatsina } 526*3d8efa4fSMarina Yatsina } 527*3d8efa4fSMarina Yatsina 528*3d8efa4fSMarina Yatsina void ExecutionDomainFix::visitSoftInstr(MachineInstr *mi, unsigned mask) { 529*3d8efa4fSMarina Yatsina // Bitmask of available domains for this instruction after taking collapsed 530*3d8efa4fSMarina Yatsina // operands into account. 531*3d8efa4fSMarina Yatsina unsigned available = mask; 532*3d8efa4fSMarina Yatsina 533*3d8efa4fSMarina Yatsina // Scan the explicit use operands for incoming domains. 534*3d8efa4fSMarina Yatsina SmallVector<int, 4> used; 535*3d8efa4fSMarina Yatsina if (!LiveRegs.empty()) 536*3d8efa4fSMarina Yatsina for (unsigned i = mi->getDesc().getNumDefs(), 537*3d8efa4fSMarina Yatsina e = mi->getDesc().getNumOperands(); 538*3d8efa4fSMarina Yatsina i != e; ++i) { 539*3d8efa4fSMarina Yatsina MachineOperand &mo = mi->getOperand(i); 540*3d8efa4fSMarina Yatsina if (!mo.isReg()) 541*3d8efa4fSMarina Yatsina continue; 542*3d8efa4fSMarina Yatsina for (int rx : regIndices(mo.getReg())) { 543*3d8efa4fSMarina Yatsina DomainValue *dv = LiveRegs[rx]; 544*3d8efa4fSMarina Yatsina if (dv == nullptr) 545*3d8efa4fSMarina Yatsina continue; 546*3d8efa4fSMarina Yatsina // Bitmask of domains that dv and available have in common. 547*3d8efa4fSMarina Yatsina unsigned common = dv->getCommonDomains(available); 548*3d8efa4fSMarina Yatsina // Is it possible to use this collapsed register for free? 549*3d8efa4fSMarina Yatsina if (dv->isCollapsed()) { 550*3d8efa4fSMarina Yatsina // Restrict available domains to the ones in common with the operand. 551*3d8efa4fSMarina Yatsina // If there are no common domains, we must pay the cross-domain 552*3d8efa4fSMarina Yatsina // penalty for this operand. 553*3d8efa4fSMarina Yatsina if (common) 554*3d8efa4fSMarina Yatsina available = common; 555*3d8efa4fSMarina Yatsina } else if (common) 556*3d8efa4fSMarina Yatsina // Open DomainValue is compatible, save it for merging. 557*3d8efa4fSMarina Yatsina used.push_back(rx); 558*3d8efa4fSMarina Yatsina else 559*3d8efa4fSMarina Yatsina // Open DomainValue is not compatible with instruction. It is useless 560*3d8efa4fSMarina Yatsina // now. 561*3d8efa4fSMarina Yatsina kill(rx); 562*3d8efa4fSMarina Yatsina } 563*3d8efa4fSMarina Yatsina } 564*3d8efa4fSMarina Yatsina 565*3d8efa4fSMarina Yatsina // If the collapsed operands force a single domain, propagate the collapse. 566*3d8efa4fSMarina Yatsina if (isPowerOf2_32(available)) { 567*3d8efa4fSMarina Yatsina unsigned domain = countTrailingZeros(available); 568*3d8efa4fSMarina Yatsina TII->setExecutionDomain(*mi, domain); 569*3d8efa4fSMarina Yatsina visitHardInstr(mi, domain); 570*3d8efa4fSMarina Yatsina return; 571*3d8efa4fSMarina Yatsina } 572*3d8efa4fSMarina Yatsina 573*3d8efa4fSMarina Yatsina // Kill off any remaining uses that don't match available, and build a list of 574*3d8efa4fSMarina Yatsina // incoming DomainValues that we want to merge. 575*3d8efa4fSMarina Yatsina SmallVector<int, 4> Regs; 576*3d8efa4fSMarina Yatsina for (int rx : used) { 577*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "no space allocated for live registers"); 578*3d8efa4fSMarina Yatsina DomainValue *&LR = LiveRegs[rx]; 579*3d8efa4fSMarina Yatsina // This useless DomainValue could have been missed above. 580*3d8efa4fSMarina Yatsina if (!LR->getCommonDomains(available)) { 581*3d8efa4fSMarina Yatsina kill(rx); 582*3d8efa4fSMarina Yatsina continue; 583*3d8efa4fSMarina Yatsina } 584*3d8efa4fSMarina Yatsina // Sorted insertion. 585*3d8efa4fSMarina Yatsina // Enables giving priority to the latest domains during merging. 586*3d8efa4fSMarina Yatsina auto I = std::upper_bound( 587*3d8efa4fSMarina Yatsina Regs.begin(), Regs.end(), rx, [&](int LHS, const int RHS) { 588*3d8efa4fSMarina Yatsina return RDA->getReachingDef(mi, RC->getRegister(LHS)) < 589*3d8efa4fSMarina Yatsina RDA->getReachingDef(mi, RC->getRegister(RHS)); 590*3d8efa4fSMarina Yatsina }); 591*3d8efa4fSMarina Yatsina Regs.insert(I, rx); 592*3d8efa4fSMarina Yatsina } 593*3d8efa4fSMarina Yatsina 594*3d8efa4fSMarina Yatsina // doms are now sorted in order of appearance. Try to merge them all, giving 595*3d8efa4fSMarina Yatsina // priority to the latest ones. 596*3d8efa4fSMarina Yatsina DomainValue *dv = nullptr; 597*3d8efa4fSMarina Yatsina while (!Regs.empty()) { 598*3d8efa4fSMarina Yatsina if (!dv) { 599*3d8efa4fSMarina Yatsina dv = LiveRegs[Regs.pop_back_val()]; 600*3d8efa4fSMarina Yatsina // Force the first dv to match the current instruction. 601*3d8efa4fSMarina Yatsina dv->AvailableDomains = dv->getCommonDomains(available); 602*3d8efa4fSMarina Yatsina assert(dv->AvailableDomains && "Domain should have been filtered"); 603*3d8efa4fSMarina Yatsina continue; 604*3d8efa4fSMarina Yatsina } 605*3d8efa4fSMarina Yatsina 606*3d8efa4fSMarina Yatsina DomainValue *Latest = LiveRegs[Regs.pop_back_val()]; 607*3d8efa4fSMarina Yatsina // Skip already merged values. 608*3d8efa4fSMarina Yatsina if (Latest == dv || Latest->Next) 609*3d8efa4fSMarina Yatsina continue; 610*3d8efa4fSMarina Yatsina if (merge(dv, Latest)) 611*3d8efa4fSMarina Yatsina continue; 612*3d8efa4fSMarina Yatsina 613*3d8efa4fSMarina Yatsina // If latest didn't merge, it is useless now. Kill all registers using it. 614*3d8efa4fSMarina Yatsina for (int i : used) { 615*3d8efa4fSMarina Yatsina assert(!LiveRegs.empty() && "no space allocated for live registers"); 616*3d8efa4fSMarina Yatsina if (LiveRegs[i] == Latest) 617*3d8efa4fSMarina Yatsina kill(i); 618*3d8efa4fSMarina Yatsina } 619*3d8efa4fSMarina Yatsina } 620*3d8efa4fSMarina Yatsina 621*3d8efa4fSMarina Yatsina // dv is the DomainValue we are going to use for this instruction. 622*3d8efa4fSMarina Yatsina if (!dv) { 623*3d8efa4fSMarina Yatsina dv = alloc(); 624*3d8efa4fSMarina Yatsina dv->AvailableDomains = available; 625*3d8efa4fSMarina Yatsina } 626*3d8efa4fSMarina Yatsina dv->Instrs.push_back(mi); 627*3d8efa4fSMarina Yatsina 628*3d8efa4fSMarina Yatsina // Finally set all defs and non-collapsed uses to dv. We must iterate through 629*3d8efa4fSMarina Yatsina // all the operators, including imp-def ones. 630*3d8efa4fSMarina Yatsina for (MachineOperand &mo : mi->operands()) { 631*3d8efa4fSMarina Yatsina if (!mo.isReg()) 632*3d8efa4fSMarina Yatsina continue; 633*3d8efa4fSMarina Yatsina for (int rx : regIndices(mo.getReg())) { 634*3d8efa4fSMarina Yatsina if (!LiveRegs[rx] || (mo.isDef() && LiveRegs[rx] != dv)) { 635*3d8efa4fSMarina Yatsina kill(rx); 636*3d8efa4fSMarina Yatsina setLiveReg(rx, dv); 637*3d8efa4fSMarina Yatsina } 638*3d8efa4fSMarina Yatsina } 639*3d8efa4fSMarina Yatsina } 640*3d8efa4fSMarina Yatsina } 641*3d8efa4fSMarina Yatsina 642*3d8efa4fSMarina Yatsina void ExecutionDomainFix::processBasicBlock( 643*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 644*3d8efa4fSMarina Yatsina enterBasicBlock(TraversedMBB); 645*3d8efa4fSMarina Yatsina // If this block is not done, it makes little sense to make any decisions 646*3d8efa4fSMarina Yatsina // based on clearance information. We need to make a second pass anyway, 647*3d8efa4fSMarina Yatsina // and by then we'll have better information, so we can avoid doing the work 648*3d8efa4fSMarina Yatsina // to try and break dependencies now. 649*3d8efa4fSMarina Yatsina for (MachineInstr &MI : *TraversedMBB.MBB) { 650*3d8efa4fSMarina Yatsina if (!MI.isDebugValue()) { 651*3d8efa4fSMarina Yatsina bool Kill = false; 652*3d8efa4fSMarina Yatsina if (TraversedMBB.PrimaryPass) 653*3d8efa4fSMarina Yatsina Kill = visitInstr(&MI); 654*3d8efa4fSMarina Yatsina processDefs(&MI, Kill); 655*3d8efa4fSMarina Yatsina } 656*3d8efa4fSMarina Yatsina } 657*3d8efa4fSMarina Yatsina leaveBasicBlock(TraversedMBB); 658*3d8efa4fSMarina Yatsina } 659*3d8efa4fSMarina Yatsina 660*3d8efa4fSMarina Yatsina void ReachingDefAnalysis::processBasicBlock( 661*3d8efa4fSMarina Yatsina const LoopTraversal::TraversedMBBInfo &TraversedMBB) { 662*3d8efa4fSMarina Yatsina enterBasicBlock(TraversedMBB); 663*3d8efa4fSMarina Yatsina for (MachineInstr &MI : *TraversedMBB.MBB) { 664*3d8efa4fSMarina Yatsina if (!MI.isDebugValue()) 665*3d8efa4fSMarina Yatsina processDefs(&MI); 666*3d8efa4fSMarina Yatsina } 667*3d8efa4fSMarina Yatsina leaveBasicBlock(TraversedMBB); 668*3d8efa4fSMarina Yatsina } 669*3d8efa4fSMarina Yatsina 670*3d8efa4fSMarina Yatsina void BreakFalseDeps::processBasicBlock(MachineBasicBlock *MBB) { 671*3d8efa4fSMarina Yatsina UndefReads.clear(); 672*3d8efa4fSMarina Yatsina // If this block is not done, it makes little sense to make any decisions 673*3d8efa4fSMarina Yatsina // based on clearance information. We need to make a second pass anyway, 674*3d8efa4fSMarina Yatsina // and by then we'll have better information, so we can avoid doing the work 675*3d8efa4fSMarina Yatsina // to try and break dependencies now. 676*3d8efa4fSMarina Yatsina for (MachineInstr &MI : *MBB) { 677*3d8efa4fSMarina Yatsina if (!MI.isDebugValue()) 678*3d8efa4fSMarina Yatsina processDefs(&MI); 679*3d8efa4fSMarina Yatsina } 680*3d8efa4fSMarina Yatsina processUndefReads(MBB); 681*3d8efa4fSMarina Yatsina } 682*3d8efa4fSMarina Yatsina 683*3d8efa4fSMarina Yatsina bool LoopTraversal::isBlockDone(MachineBasicBlock *MBB) { 684*3d8efa4fSMarina Yatsina int MBBNumber = MBB->getNumber(); 685*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBInfos.size() && "Unexpected basic block number."); 686*3d8efa4fSMarina Yatsina return MBBInfos[MBBNumber].PrimaryCompleted && 687*3d8efa4fSMarina Yatsina MBBInfos[MBBNumber].IncomingCompleted == 688*3d8efa4fSMarina Yatsina MBBInfos[MBBNumber].PrimaryIncoming && 689*3d8efa4fSMarina Yatsina MBBInfos[MBBNumber].IncomingProcessed == MBB->pred_size(); 690*3d8efa4fSMarina Yatsina } 691*3d8efa4fSMarina Yatsina 692*3d8efa4fSMarina Yatsina LoopTraversal::TraversalOrder LoopTraversal::traverse(MachineFunction &MF) { 693*3d8efa4fSMarina Yatsina // Initialize the MMBInfos 694*3d8efa4fSMarina Yatsina MBBInfos.assign(MF.getNumBlockIDs(), MBBInfo()); 695*3d8efa4fSMarina Yatsina 696*3d8efa4fSMarina Yatsina MachineBasicBlock *Entry = &*MF.begin(); 697*3d8efa4fSMarina Yatsina ReversePostOrderTraversal<MachineBasicBlock *> RPOT(Entry); 698*3d8efa4fSMarina Yatsina SmallVector<MachineBasicBlock *, 4> Workqueue; 699*3d8efa4fSMarina Yatsina SmallVector<TraversedMBBInfo, 4> MBBTraversalOrder; 700*3d8efa4fSMarina Yatsina for (MachineBasicBlock *MBB : RPOT) { 701*3d8efa4fSMarina Yatsina // N.B: IncomingProcessed and IncomingCompleted were already updated while 702*3d8efa4fSMarina Yatsina // processing this block's predecessors. 703*3d8efa4fSMarina Yatsina int MBBNumber = MBB->getNumber(); 704*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBInfos.size() && "Unexpected basic block number."); 705*3d8efa4fSMarina Yatsina MBBInfos[MBBNumber].PrimaryCompleted = true; 706*3d8efa4fSMarina Yatsina MBBInfos[MBBNumber].PrimaryIncoming = MBBInfos[MBBNumber].IncomingProcessed; 707*3d8efa4fSMarina Yatsina bool Primary = true; 708*3d8efa4fSMarina Yatsina Workqueue.push_back(MBB); 709*3d8efa4fSMarina Yatsina while (!Workqueue.empty()) { 710*3d8efa4fSMarina Yatsina MachineBasicBlock *ActiveMBB = &*Workqueue.back(); 711*3d8efa4fSMarina Yatsina Workqueue.pop_back(); 712*3d8efa4fSMarina Yatsina bool Done = isBlockDone(ActiveMBB); 713*3d8efa4fSMarina Yatsina MBBTraversalOrder.push_back(TraversedMBBInfo(ActiveMBB, Primary, Done)); 714*3d8efa4fSMarina Yatsina for (MachineBasicBlock *Succ : ActiveMBB->successors()) { 715*3d8efa4fSMarina Yatsina int SuccNumber = Succ->getNumber(); 716*3d8efa4fSMarina Yatsina assert(SuccNumber < MBBInfos.size() && 717*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 718*3d8efa4fSMarina Yatsina if (!isBlockDone(Succ)) { 719*3d8efa4fSMarina Yatsina if (Primary) 720*3d8efa4fSMarina Yatsina MBBInfos[SuccNumber].IncomingProcessed++; 721*3d8efa4fSMarina Yatsina if (Done) 722*3d8efa4fSMarina Yatsina MBBInfos[SuccNumber].IncomingCompleted++; 723*3d8efa4fSMarina Yatsina if (isBlockDone(Succ)) 724*3d8efa4fSMarina Yatsina Workqueue.push_back(Succ); 725*3d8efa4fSMarina Yatsina } 726*3d8efa4fSMarina Yatsina } 727*3d8efa4fSMarina Yatsina Primary = false; 728*3d8efa4fSMarina Yatsina } 729*3d8efa4fSMarina Yatsina } 730*3d8efa4fSMarina Yatsina 731*3d8efa4fSMarina Yatsina // We need to go through again and finalize any blocks that are not done yet. 732*3d8efa4fSMarina Yatsina // This is possible if blocks have dead predecessors, so we didn't visit them 733*3d8efa4fSMarina Yatsina // above. 734*3d8efa4fSMarina Yatsina for (MachineBasicBlock *MBB : RPOT) { 735*3d8efa4fSMarina Yatsina if (!isBlockDone(MBB)) 736*3d8efa4fSMarina Yatsina MBBTraversalOrder.push_back(TraversedMBBInfo(MBB, false, true)); 737*3d8efa4fSMarina Yatsina // Don't update successors here. We'll get to them anyway through this 738*3d8efa4fSMarina Yatsina // loop. 739*3d8efa4fSMarina Yatsina } 740*3d8efa4fSMarina Yatsina 741*3d8efa4fSMarina Yatsina MBBInfos.clear(); 742*3d8efa4fSMarina Yatsina 743*3d8efa4fSMarina Yatsina return MBBTraversalOrder; 744*3d8efa4fSMarina Yatsina } 745*3d8efa4fSMarina Yatsina 746*3d8efa4fSMarina Yatsina bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) { 747*3d8efa4fSMarina Yatsina if (skipFunction(mf.getFunction())) 748*3d8efa4fSMarina Yatsina return false; 749*3d8efa4fSMarina Yatsina MF = &mf; 750*3d8efa4fSMarina Yatsina TII = MF->getSubtarget().getInstrInfo(); 751*3d8efa4fSMarina Yatsina TRI = MF->getSubtarget().getRegisterInfo(); 752*3d8efa4fSMarina Yatsina LiveRegs.clear(); 753*3d8efa4fSMarina Yatsina assert(NumRegs == RC->getNumRegs() && "Bad regclass"); 754*3d8efa4fSMarina Yatsina 755*3d8efa4fSMarina Yatsina DEBUG(dbgs() << "********** FIX EXECUTION DOMAIN: " 756*3d8efa4fSMarina Yatsina << TRI->getRegClassName(RC) << " **********\n"); 757*3d8efa4fSMarina Yatsina 758*3d8efa4fSMarina Yatsina // If no relevant registers are used in the function, we can skip it 759*3d8efa4fSMarina Yatsina // completely. 760*3d8efa4fSMarina Yatsina bool anyregs = false; 761*3d8efa4fSMarina Yatsina const MachineRegisterInfo &MRI = mf.getRegInfo(); 762*3d8efa4fSMarina Yatsina for (unsigned Reg : *RC) { 763*3d8efa4fSMarina Yatsina if (MRI.isPhysRegUsed(Reg)) { 764*3d8efa4fSMarina Yatsina anyregs = true; 765*3d8efa4fSMarina Yatsina break; 766*3d8efa4fSMarina Yatsina } 767*3d8efa4fSMarina Yatsina } 768*3d8efa4fSMarina Yatsina if (!anyregs) 769*3d8efa4fSMarina Yatsina return false; 770*3d8efa4fSMarina Yatsina 771*3d8efa4fSMarina Yatsina RDA = &getAnalysis<ReachingDefAnalysis>(); 772*3d8efa4fSMarina Yatsina 773*3d8efa4fSMarina Yatsina // Initialize the AliasMap on the first use. 774*3d8efa4fSMarina Yatsina if (AliasMap.empty()) { 775*3d8efa4fSMarina Yatsina // Given a PhysReg, AliasMap[PhysReg] returns a list of indices into RC and 776*3d8efa4fSMarina Yatsina // therefore the LiveRegs array. 777*3d8efa4fSMarina Yatsina AliasMap.resize(TRI->getNumRegs()); 778*3d8efa4fSMarina Yatsina for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i) 779*3d8efa4fSMarina Yatsina for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true); AI.isValid(); 780*3d8efa4fSMarina Yatsina ++AI) 781*3d8efa4fSMarina Yatsina AliasMap[*AI].push_back(i); 782*3d8efa4fSMarina Yatsina } 783*3d8efa4fSMarina Yatsina 784*3d8efa4fSMarina Yatsina // Initialize the MBBOutRegsInfos 785*3d8efa4fSMarina Yatsina MBBOutRegsInfos.resize(mf.getNumBlockIDs()); 786*3d8efa4fSMarina Yatsina 787*3d8efa4fSMarina Yatsina // Traverse the basic blocks. 788*3d8efa4fSMarina Yatsina LoopTraversal Traversal; 789*3d8efa4fSMarina Yatsina LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf); 790*3d8efa4fSMarina Yatsina for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) { 791*3d8efa4fSMarina Yatsina processBasicBlock(TraversedMBB); 792*3d8efa4fSMarina Yatsina } 793*3d8efa4fSMarina Yatsina 794*3d8efa4fSMarina Yatsina for (LiveRegsDVInfo OutLiveRegs : MBBOutRegsInfos) { 795*3d8efa4fSMarina Yatsina for (DomainValue *OutLiveReg : OutLiveRegs) { 796*3d8efa4fSMarina Yatsina if (OutLiveReg) 797*3d8efa4fSMarina Yatsina release(OutLiveReg); 798*3d8efa4fSMarina Yatsina } 799*3d8efa4fSMarina Yatsina } 800*3d8efa4fSMarina Yatsina MBBOutRegsInfos.clear(); 801*3d8efa4fSMarina Yatsina Avail.clear(); 802*3d8efa4fSMarina Yatsina Allocator.DestroyAll(); 803*3d8efa4fSMarina Yatsina 804*3d8efa4fSMarina Yatsina return false; 805*3d8efa4fSMarina Yatsina } 806*3d8efa4fSMarina Yatsina 807*3d8efa4fSMarina Yatsina bool ReachingDefAnalysis::runOnMachineFunction(MachineFunction &mf) { 808*3d8efa4fSMarina Yatsina if (skipFunction(mf.getFunction())) 809*3d8efa4fSMarina Yatsina return false; 810*3d8efa4fSMarina Yatsina MF = &mf; 811*3d8efa4fSMarina Yatsina TII = MF->getSubtarget().getInstrInfo(); 812*3d8efa4fSMarina Yatsina TRI = MF->getSubtarget().getRegisterInfo(); 813*3d8efa4fSMarina Yatsina 814*3d8efa4fSMarina Yatsina LiveRegs.clear(); 815*3d8efa4fSMarina Yatsina NumRegUnits = TRI->getNumRegUnits(); 816*3d8efa4fSMarina Yatsina 817*3d8efa4fSMarina Yatsina MBBReachingDefs.resize(mf.getNumBlockIDs()); 818*3d8efa4fSMarina Yatsina 819*3d8efa4fSMarina Yatsina DEBUG(dbgs() << "********** REACHING DEFINITION ANALYSIS **********\n"); 820*3d8efa4fSMarina Yatsina 821*3d8efa4fSMarina Yatsina // Initialize the MBBOutRegsInfos 822*3d8efa4fSMarina Yatsina MBBOutRegsInfos.resize(mf.getNumBlockIDs()); 823*3d8efa4fSMarina Yatsina 824*3d8efa4fSMarina Yatsina // Traverse the basic blocks. 825*3d8efa4fSMarina Yatsina LoopTraversal Traversal; 826*3d8efa4fSMarina Yatsina LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf); 827*3d8efa4fSMarina Yatsina for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) { 828*3d8efa4fSMarina Yatsina processBasicBlock(TraversedMBB); 829*3d8efa4fSMarina Yatsina } 830*3d8efa4fSMarina Yatsina 831*3d8efa4fSMarina Yatsina // Sorting all reaching defs found for a ceartin reg unit in a given BB. 832*3d8efa4fSMarina Yatsina for (MBBDefsInfo &MBBDefs : MBBReachingDefs) { 833*3d8efa4fSMarina Yatsina for (MBBRegUnitDefs &RegUnitDefs : MBBDefs) 834*3d8efa4fSMarina Yatsina std::sort(RegUnitDefs.begin(), RegUnitDefs.end()); 835*3d8efa4fSMarina Yatsina } 836*3d8efa4fSMarina Yatsina 837*3d8efa4fSMarina Yatsina return false; 838*3d8efa4fSMarina Yatsina } 839*3d8efa4fSMarina Yatsina 840*3d8efa4fSMarina Yatsina void ReachingDefAnalysis::releaseMemory() { 841*3d8efa4fSMarina Yatsina // Clear the internal vectors. 842*3d8efa4fSMarina Yatsina MBBOutRegsInfos.clear(); 843*3d8efa4fSMarina Yatsina MBBReachingDefs.clear(); 844*3d8efa4fSMarina Yatsina InstIds.clear(); 845*3d8efa4fSMarina Yatsina } 846*3d8efa4fSMarina Yatsina 847*3d8efa4fSMarina Yatsina bool BreakFalseDeps::runOnMachineFunction(MachineFunction &mf) { 848*3d8efa4fSMarina Yatsina if (skipFunction(mf.getFunction())) 849*3d8efa4fSMarina Yatsina return false; 850*3d8efa4fSMarina Yatsina MF = &mf; 851*3d8efa4fSMarina Yatsina TII = MF->getSubtarget().getInstrInfo(); 852*3d8efa4fSMarina Yatsina TRI = MF->getSubtarget().getRegisterInfo(); 853*3d8efa4fSMarina Yatsina RDA = &getAnalysis<ReachingDefAnalysis>(); 854*3d8efa4fSMarina Yatsina 855*3d8efa4fSMarina Yatsina RegClassInfo.runOnMachineFunction(mf); 856*3d8efa4fSMarina Yatsina 857*3d8efa4fSMarina Yatsina DEBUG(dbgs() << "********** BREAK FALSE DEPENDENCIES **********\n"); 858*3d8efa4fSMarina Yatsina 859*3d8efa4fSMarina Yatsina // Traverse the basic blocks. 860*3d8efa4fSMarina Yatsina for (MachineBasicBlock &MBB : mf) { 861*3d8efa4fSMarina Yatsina processBasicBlock(&MBB); 862*3d8efa4fSMarina Yatsina } 863*3d8efa4fSMarina Yatsina 864*3d8efa4fSMarina Yatsina return false; 865*3d8efa4fSMarina Yatsina } 866*3d8efa4fSMarina Yatsina 867*3d8efa4fSMarina Yatsina int ReachingDefAnalysis::getReachingDef(MachineInstr *MI, int PhysReg) { 868*3d8efa4fSMarina Yatsina assert(InstIds.count(MI) && "Unexpected machine instuction."); 869*3d8efa4fSMarina Yatsina int InstId = InstIds[MI]; 870*3d8efa4fSMarina Yatsina int DefRes = ReachingDedDefaultVal; 871*3d8efa4fSMarina Yatsina int MBBNumber = MI->getParent()->getNumber(); 872*3d8efa4fSMarina Yatsina assert(MBBNumber < MBBReachingDefs.size() && 873*3d8efa4fSMarina Yatsina "Unexpected basic block number."); 874*3d8efa4fSMarina Yatsina int LatestDef = ReachingDedDefaultVal; 875*3d8efa4fSMarina Yatsina for (MCRegUnitIterator Unit(PhysReg, TRI); Unit.isValid(); ++Unit) { 876*3d8efa4fSMarina Yatsina for (int Def : MBBReachingDefs[MBBNumber][*Unit]) { 877*3d8efa4fSMarina Yatsina if (Def >= InstId) 878*3d8efa4fSMarina Yatsina break; 879*3d8efa4fSMarina Yatsina DefRes = Def; 880*3d8efa4fSMarina Yatsina } 881*3d8efa4fSMarina Yatsina LatestDef = std::max(LatestDef, DefRes); 882*3d8efa4fSMarina Yatsina } 883*3d8efa4fSMarina Yatsina return LatestDef; 884*3d8efa4fSMarina Yatsina } 885*3d8efa4fSMarina Yatsina 886*3d8efa4fSMarina Yatsina int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCPhysReg PhysReg) { 887*3d8efa4fSMarina Yatsina assert(InstIds.count(MI) && "Unexpected machine instuction."); 888*3d8efa4fSMarina Yatsina return InstIds[MI] - getReachingDef(MI, PhysReg); 889*3d8efa4fSMarina Yatsina } 890