LCOV - code coverage report
Current view: top level - lib/CodeGen - ExecutionDomainFix.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 197 202 97.5 %
Date: 2018-10-20 13:21:21 Functions: 17 17 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- ExecutionDomainFix.cpp - Fix execution domain issues ----*- C++ -*--===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm/CodeGen/ExecutionDomainFix.h"
      11             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      12             : #include "llvm/CodeGen/TargetInstrInfo.h"
      13             : 
      14             : using namespace llvm;
      15             : 
      16             : #define DEBUG_TYPE "execution-deps-fix"
      17             : 
      18             : iterator_range<SmallVectorImpl<int>::const_iterator>
      19     4593657 : ExecutionDomainFix::regIndices(unsigned Reg) const {
      20             :   assert(Reg < AliasMap.size() && "Invalid register");
      21     4593657 :   const auto &Entry = AliasMap[Reg];
      22     4593657 :   return make_range(Entry.begin(), Entry.end());
      23             : }
      24             : 
      25      603712 : DomainValue *ExecutionDomainFix::alloc(int domain) {
      26      603712 :   DomainValue *dv = Avail.empty() ? new (Allocator.Allocate()) DomainValue
      27             :                                   : Avail.pop_back_val();
      28      603712 :   if (domain >= 0)
      29      463335 :     dv->addDomain(domain);
      30             :   assert(dv->Refs == 0 && "Reference count wasn't cleared");
      31             :   assert(!dv->Next && "Chained DomainValue shouldn't have been recycled");
      32      603712 :   return dv;
      33             : }
      34             : 
      35     3463324 : void ExecutionDomainFix::release(DomainValue *DV) {
      36     4067000 :   while (DV) {
      37             :     assert(DV->Refs && "Bad DomainValue");
      38     1491054 :     if (--DV->Refs)
      39             :       return;
      40             : 
      41             :     // There are no more DV references. Collapse any contained instructions.
      42      603676 :     if (DV->AvailableDomains && !DV->isCollapsed())
      43       20865 :       collapse(DV, DV->getFirstDomain());
      44             : 
      45      603676 :     DomainValue *Next = DV->Next;
      46             :     DV->clear();
      47      603676 :     Avail.push_back(DV);
      48             :     // Also release the next DomainValue in the chain.
      49      603676 :     DV = Next;
      50             :   }
      51             : }
      52             : 
      53    13401280 : DomainValue *ExecutionDomainFix::resolve(DomainValue *&DVRef) {
      54    13401280 :   DomainValue *DV = DVRef;
      55    13401280 :   if (!DV || !DV->Next)
      56             :     return DV;
      57             : 
      58             :   // DV has a chain. Find the end.
      59             :   do
      60         821 :     DV = DV->Next;
      61         821 :   while (DV->Next);
      62             : 
      63             :   // Update DVRef to point to DV.
      64             :   retain(DV);
      65         666 :   release(DVRef);
      66         666 :   DVRef = DV;
      67         666 :   return DV;
      68             : }
      69             : 
      70     1487739 : void ExecutionDomainFix::setLiveReg(int rx, DomainValue *dv) {
      71             :   assert(unsigned(rx) < NumRegs && "Invalid index");
      72             :   assert(!LiveRegs.empty() && "Must enter basic block first.");
      73             : 
      74     2975478 :   if (LiveRegs[rx] == dv)
      75             :     return;
      76     1487739 :   if (LiveRegs[rx])
      77       23626 :     release(LiveRegs[rx]);
      78     2975478 :   LiveRegs[rx] = retain(dv);
      79             : }
      80             : 
      81      540008 : void ExecutionDomainFix::kill(int rx) {
      82             :   assert(unsigned(rx) < NumRegs && "Invalid index");
      83             :   assert(!LiveRegs.empty() && "Must enter basic block first.");
      84     1080016 :   if (!LiveRegs[rx])
      85             :     return;
      86             : 
      87      412768 :   release(LiveRegs[rx]);
      88      825536 :   LiveRegs[rx] = nullptr;
      89             : }
      90             : 
      91     1026337 : void ExecutionDomainFix::force(int rx, unsigned domain) {
      92             :   assert(unsigned(rx) < NumRegs && "Invalid index");
      93             :   assert(!LiveRegs.empty() && "Must enter basic block first.");
      94     2052674 :   if (DomainValue *dv = LiveRegs[rx]) {
      95      584358 :     if (dv->isCollapsed())
      96             :       dv->addDomain(domain);
      97      232336 :     else if (dv->hasDomain(domain))
      98      116017 :       collapse(dv, domain);
      99             :     else {
     100             :       // This is an incompatible open DomainValue. Collapse it to whatever and
     101             :       // force the new value into domain. This costs a domain crossing.
     102         151 :       collapse(dv, dv->getFirstDomain());
     103             :       assert(LiveRegs[rx] && "Not live after collapse?");
     104         302 :       LiveRegs[rx]->addDomain(domain);
     105             :     }
     106             :   } else {
     107             :     // Set up basic collapsed DomainValue.
     108      441979 :     setLiveReg(rx, alloc(domain));
     109             :   }
     110     1026337 : }
     111             : 
     112      137692 : void ExecutionDomainFix::collapse(DomainValue *dv, unsigned domain) {
     113             :   assert(dv->hasDomain(domain) && "Cannot collapse");
     114             : 
     115             :   // Collapse all the instructions.
     116      337783 :   while (!dv->Instrs.empty())
     117      400182 :     TII->setExecutionDomain(*dv->Instrs.pop_back_val(), domain);
     118             :   dv->setSingleDomain(domain);
     119             : 
     120             :   // If there are multiple users, give them new, unique DomainValues.
     121      137692 :   if (!LiveRegs.empty() && dv->Refs > 1)
     122      348744 :     for (unsigned rx = 0; rx != NumRegs; ++rx)
     123      676352 :       if (LiveRegs[rx] == dv)
     124       21356 :         setLiveReg(rx, alloc(domain));
     125      137692 : }
     126             : 
     127       15837 : bool ExecutionDomainFix::merge(DomainValue *A, DomainValue *B) {
     128             :   assert(!A->isCollapsed() && "Cannot merge into collapsed");
     129             :   assert(!B->isCollapsed() && "Cannot merge from collapsed");
     130       15837 :   if (A == B)
     131             :     return true;
     132             :   // Restrict to the domains that A and B have in common.
     133        2649 :   unsigned common = A->getCommonDomains(B->AvailableDomains);
     134        2649 :   if (!common)
     135             :     return false;
     136        2649 :   A->AvailableDomains = common;
     137        5298 :   A->Instrs.append(B->Instrs.begin(), B->Instrs.end());
     138             : 
     139             :   // Clear the old DomainValue so we won't try to swizzle instructions twice.
     140             :   B->clear();
     141             :   // All uses of B are referred to A.
     142        2649 :   B->Next = retain(A);
     143             : 
     144       87417 :   for (unsigned rx = 0; rx != NumRegs; ++rx) {
     145             :     assert(!LiveRegs.empty() && "no space allocated for live registers");
     146      169536 :     if (LiveRegs[rx] == B)
     147        2270 :       setLiveReg(rx, A);
     148             :   }
     149             :   return true;
     150             : }
     151             : 
     152      397162 : void ExecutionDomainFix::enterBasicBlock(
     153             :     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
     154             : 
     155      397162 :   MachineBasicBlock *MBB = TraversedMBB.MBB;
     156             : 
     157             :   // Set up LiveRegs to represent registers entering MBB.
     158             :   // Set default domain values to 'no domain' (nullptr)
     159      397162 :   if (LiveRegs.empty())
     160      397162 :     LiveRegs.assign(NumRegs, nullptr);
     161             : 
     162             :   // This is the entry block.
     163      397162 :   if (MBB->pred_empty()) {
     164             :     LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << ": entry\n");
     165             :     return;
     166             :   }
     167             : 
     168             :   // Try to coalesce live-out registers from predecessors.
     169      723016 :   for (MachineBasicBlock *pred : MBB->predecessors()) {
     170             :     assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
     171             :            "Should have pre-allocated MBBInfos for all MBBs");
     172      423418 :     LiveRegsDVInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
     173             :     // Incoming is null if this is a backedge from a BB
     174             :     // we haven't processed yet
     175      423418 :     if (Incoming.empty())
     176             :       continue;
     177             : 
     178    13820070 :     for (unsigned rx = 0; rx != NumRegs; ++rx) {
     179    26802560 :       DomainValue *pdv = resolve(Incoming[rx]);
     180    13401280 :       if (!pdv)
     181             :         continue;
     182     2401946 :       if (!LiveRegs[rx]) {
     183      866692 :         setLiveReg(rx, pdv);
     184      866692 :         continue;
     185             :       }
     186             : 
     187             :       // We have a live DomainValue from more than one predecessor.
     188      334281 :       if (LiveRegs[rx]->isCollapsed()) {
     189             :         // We are already collapsed, but predecessor is not. Force it.
     190      319127 :         unsigned Domain = LiveRegs[rx]->getFirstDomain();
     191      319127 :         if (!pdv->isCollapsed() && pdv->hasDomain(Domain))
     192         659 :           collapse(pdv, Domain);
     193      319127 :         continue;
     194             :       }
     195             : 
     196             :       // Currently open, merge in predecessor.
     197       15154 :       if (!pdv->isCollapsed())
     198       14314 :         merge(LiveRegs[rx], pdv);
     199             :       else
     200        1680 :         force(rx, pdv->getFirstDomain());
     201             :     }
     202             :   }
     203             :   LLVM_DEBUG(dbgs() << printMBBReference(*MBB)
     204             :                     << (!TraversedMBB.IsDone ? ": incomplete\n"
     205             :                                              : ": all preds known\n"));
     206             : }
     207             : 
     208      397162 : void ExecutionDomainFix::leaveBasicBlock(
     209             :     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
     210             :   assert(!LiveRegs.empty() && "Must enter basic block first.");
     211      397162 :   unsigned MBBNumber = TraversedMBB.MBB->getNumber();
     212             :   assert(MBBNumber < MBBOutRegsInfos.size() &&
     213             :          "Unexpected basic block number.");
     214             :   // Save register clearances at end of MBB - used by enterBasicBlock().
     215     2616618 :   for (DomainValue *OldLiveReg : MBBOutRegsInfos[MBBNumber]) {
     216     2219456 :     release(OldLiveReg);
     217             :   }
     218      794324 :   MBBOutRegsInfos[MBBNumber] = LiveRegs;
     219             :   LiveRegs.clear();
     220      397162 : }
     221             : 
     222     2327566 : bool ExecutionDomainFix::visitInstr(MachineInstr *MI) {
     223             :   // Update instructions with explicit execution domains.
     224     2327566 :   std::pair<uint16_t, uint16_t> DomP = TII->getExecutionDomain(*MI);
     225     2327566 :   if (DomP.first) {
     226      649661 :     if (DomP.second)
     227      335553 :       visitSoftInstr(MI, DomP.second);
     228             :     else
     229      314108 :       visitHardInstr(MI, DomP.first);
     230             :   }
     231             : 
     232     2327566 :   return !DomP.first;
     233             : }
     234             : 
     235     2781404 : void ExecutionDomainFix::processDefs(MachineInstr *MI, bool Kill) {
     236             :   assert(!MI->isDebugInstr() && "Won't process debug values");
     237     2781404 :   const MCInstrDesc &MCID = MI->getDesc();
     238     1469631 :   for (unsigned i = 0,
     239     2781404 :                 e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
     240     4251035 :        i != e; ++i) {
     241     1469631 :     MachineOperand &MO = MI->getOperand(i);
     242     1469631 :     if (!MO.isReg())
     243             :       continue;
     244     1408056 :     if (MO.isUse())
     245             :       continue;
     246     1877560 :     for (int rx : regIndices(MO.getReg())) {
     247             :       // This instruction explicitly defines rx.
     248             :       LLVM_DEBUG(dbgs() << printReg(RC->getRegister(rx), TRI) << ":\t" << *MI);
     249             : 
     250             :       // Kill off domains redefined by generic instructions.
     251      596080 :       if (Kill)
     252       51309 :         kill(rx);
     253             :     }
     254             :   }
     255     2781404 : }
     256             : 
     257      449534 : void ExecutionDomainFix::visitHardInstr(MachineInstr *mi, unsigned domain) {
     258             :   // Collapse all uses.
     259     1909209 :   for (unsigned i = mi->getDesc().getNumDefs(),
     260      449534 :                 e = mi->getDesc().getNumOperands();
     261     1909209 :        i != e; ++i) {
     262     1459675 :     MachineOperand &mo = mi->getOperand(i);
     263     1459675 :     if (!mo.isReg())
     264             :       continue;
     265     1813027 :     for (int rx : regIndices(mo.getReg())) {
     266      692257 :       force(rx, domain);
     267             :     }
     268             :   }
     269             : 
     270             :   // Kill all defs and force them.
     271      801120 :   for (unsigned i = 0, e = mi->getDesc().getNumDefs(); i != e; ++i) {
     272      351586 :     MachineOperand &mo = mi->getOperand(i);
     273      351586 :     if (!mo.isReg())
     274             :       continue;
     275      684826 :     for (int rx : regIndices(mo.getReg())) {
     276      333240 :       kill(rx);
     277      333240 :       force(rx, domain);
     278             :     }
     279             :   }
     280      449534 : }
     281             : 
     282      335553 : void ExecutionDomainFix::visitSoftInstr(MachineInstr *mi, unsigned mask) {
     283             :   // Bitmask of available domains for this instruction after taking collapsed
     284             :   // operands into account.
     285             :   unsigned available = mask;
     286             : 
     287             :   // Scan the explicit use operands for incoming domains.
     288             :   SmallVector<int, 4> used;
     289      335553 :   if (!LiveRegs.empty())
     290     1966119 :     for (unsigned i = mi->getDesc().getNumDefs(),
     291      335553 :                   e = mi->getDesc().getNumOperands();
     292     1966119 :          i != e; ++i) {
     293     1630566 :       MachineOperand &mo = mi->getOperand(i);
     294     1630566 :       if (!mo.isReg())
     295             :         continue;
     296     1324733 :       for (int rx : regIndices(mo.getReg())) {
     297      254124 :         DomainValue *dv = LiveRegs[rx];
     298      254124 :         if (dv == nullptr)
     299             :           continue;
     300             :         // Bitmask of domains that dv and available have in common.
     301      219766 :         unsigned common = dv->getCommonDomains(available);
     302             :         // Is it possible to use this collapsed register for free?
     303      219766 :         if (dv->isCollapsed()) {
     304             :           // Restrict available domains to the ones in common with the operand.
     305             :           // If there are no common domains, we must pay the cross-domain
     306             :           // penalty for this operand.
     307      153841 :           if (common)
     308             :             available = common;
     309       65925 :         } else if (common)
     310             :           // Open DomainValue is compatible, save it for merging.
     311       65908 :           used.push_back(rx);
     312             :         else
     313             :           // Open DomainValue is not compatible with instruction. It is useless
     314             :           // now.
     315          17 :           kill(rx);
     316             :       }
     317             :     }
     318             : 
     319             :   // If the collapsed operands force a single domain, propagate the collapse.
     320             :   if (isPowerOf2_32(available)) {
     321      135426 :     unsigned domain = countTrailingZeros(available);
     322      135426 :     TII->setExecutionDomain(*mi, domain);
     323      135426 :     visitHardInstr(mi, domain);
     324             :     return;
     325             :   }
     326             : 
     327             :   // Kill off any remaining uses that don't match available, and build a list of
     328             :   // incoming DomainValues that we want to merge.
     329             :   SmallVector<int, 4> Regs;
     330      263525 :   for (int rx : used) {
     331             :     assert(!LiveRegs.empty() && "no space allocated for live registers");
     332       63398 :     DomainValue *&LR = LiveRegs[rx];
     333             :     // This useless DomainValue could have been missed above.
     334      126796 :     if (!LR->getCommonDomains(available)) {
     335           0 :       kill(rx);
     336           0 :       continue;
     337             :     }
     338             :     // Sorted insertion.
     339             :     // Enables giving priority to the latest domains during merging.
     340             :     auto I = std::upper_bound(
     341             :         Regs.begin(), Regs.end(), rx, [&](int LHS, const int RHS) {
     342             :           return RDA->getReachingDef(mi, RC->getRegister(LHS)) <
     343             :                  RDA->getReachingDef(mi, RC->getRegister(RHS));
     344             :         });
     345       63398 :     Regs.insert(I, rx);
     346             :   }
     347             : 
     348             :   // doms are now sorted in order of appearance. Try to merge them all, giving
     349             :   // priority to the latest ones.
     350             :   DomainValue *dv = nullptr;
     351      263525 :   while (!Regs.empty()) {
     352       63398 :     if (!dv) {
     353       59750 :       dv = LiveRegs[Regs.pop_back_val()];
     354             :       // Force the first dv to match the current instruction.
     355       59750 :       dv->AvailableDomains = dv->getCommonDomains(available);
     356             :       assert(dv->AvailableDomains && "Domain should have been filtered");
     357       59750 :       continue;
     358             :     }
     359             : 
     360        3648 :     DomainValue *Latest = LiveRegs[Regs.pop_back_val()];
     361             :     // Skip already merged values.
     362        3648 :     if (Latest == dv || Latest->Next)
     363             :       continue;
     364        1523 :     if (merge(dv, Latest))
     365             :       continue;
     366             : 
     367             :     // If latest didn't merge, it is useless now. Kill all registers using it.
     368           0 :     for (int i : used) {
     369             :       assert(!LiveRegs.empty() && "no space allocated for live registers");
     370           0 :       if (LiveRegs[i] == Latest)
     371           0 :         kill(i);
     372             :     }
     373             :   }
     374             : 
     375             :   // dv is the DomainValue we are going to use for this instruction.
     376      200127 :   if (!dv) {
     377      140377 :     dv = alloc();
     378      140377 :     dv->AvailableDomains = available;
     379             :   }
     380      200127 :   dv->Instrs.push_back(mi);
     381             : 
     382             :   // Finally set all defs and non-collapsed uses to dv. We must iterate through
     383             :   // all the operators, including imp-def ones.
     384     1323976 :   for (MachineOperand &mo : mi->operands()) {
     385     1123849 :     if (!mo.isReg())
     386             :       continue;
     387     1017737 :     for (int rx : regIndices(mo.getReg())) {
     388      497050 :       if (!LiveRegs[rx] || (mo.isDef() && LiveRegs[rx] != dv)) {
     389      155442 :         kill(rx);
     390      155442 :         setLiveReg(rx, dv);
     391             :       }
     392             :     }
     393             :   }
     394             : }
     395             : 
     396      397162 : void ExecutionDomainFix::processBasicBlock(
     397             :     const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
     398      397162 :   enterBasicBlock(TraversedMBB);
     399             :   // If this block is not done, it makes little sense to make any decisions
     400             :   // based on clearance information. We need to make a second pass anyway,
     401             :   // and by then we'll have better information, so we can avoid doing the work
     402             :   // to try and break dependencies now.
     403     3313804 :   for (MachineInstr &MI : *TraversedMBB.MBB) {
     404             :     if (!MI.isDebugInstr()) {
     405             :       bool Kill = false;
     406     2781404 :       if (TraversedMBB.PrimaryPass)
     407     2327566 :         Kill = visitInstr(&MI);
     408     2781404 :       processDefs(&MI, Kill);
     409             :     }
     410             :   }
     411      397162 :   leaveBasicBlock(TraversedMBB);
     412      397162 : }
     413             : 
     414      125006 : bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) {
     415      125006 :   if (skipFunction(mf.getFunction()))
     416             :     return false;
     417      124864 :   MF = &mf;
     418      124864 :   TII = MF->getSubtarget().getInstrInfo();
     419      124864 :   TRI = MF->getSubtarget().getRegisterInfo();
     420             :   LiveRegs.clear();
     421             :   assert(NumRegs == RC->getNumRegs() && "Bad regclass");
     422             : 
     423             :   LLVM_DEBUG(dbgs() << "********** FIX EXECUTION DOMAIN: "
     424             :                     << TRI->getRegClassName(RC) << " **********\n");
     425             : 
     426             :   // If no relevant registers are used in the function, we can skip it
     427             :   // completely.
     428             :   bool anyregs = false;
     429      124864 :   const MachineRegisterInfo &MRI = mf.getRegInfo();
     430     1032152 :   for (unsigned Reg : *RC) {
     431     1004852 :     if (MRI.isPhysRegUsed(Reg)) {
     432             :       anyregs = true;
     433             :       break;
     434             :     }
     435             :   }
     436      124864 :   if (!anyregs)
     437             :     return false;
     438             : 
     439       97564 :   RDA = &getAnalysis<ReachingDefAnalysis>();
     440             : 
     441             :   // Initialize the AliasMap on the first use.
     442       97564 :   if (AliasMap.empty()) {
     443             :     // Given a PhysReg, AliasMap[PhysReg] returns a list of indices into RC and
     444             :     // therefore the LiveRegs array.
     445        6504 :     AliasMap.resize(TRI->getNumRegs());
     446      214632 :     for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
     447     2014314 :       for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true); AI.isValid();
     448     1806186 :            ++AI)
     449     3612372 :         AliasMap[*AI].push_back(i);
     450             :   }
     451             : 
     452             :   // Initialize the MBBOutRegsInfos
     453      195128 :   MBBOutRegsInfos.resize(mf.getNumBlockIDs());
     454             : 
     455             :   // Traverse the basic blocks.
     456             :   LoopTraversal Traversal;
     457       97564 :   LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
     458      494726 :   for (LoopTraversal::TraversedMBBInfo TraversedMBB : TraversedMBBOrder) {
     459      397162 :     processBasicBlock(TraversedMBB);
     460             :   }
     461             : 
     462      426890 :   for (LiveRegsDVInfo OutLiveRegs : MBBOutRegsInfos) {
     463    10819054 :     for (DomainValue *OutLiveReg : OutLiveRegs) {
     464    10489728 :       if (OutLiveReg)
     465      806808 :         release(OutLiveReg);
     466             :     }
     467             :   }
     468       97564 :   MBBOutRegsInfos.clear();
     469             :   Avail.clear();
     470       97564 :   Allocator.DestroyAll();
     471             : 
     472             :   return false;
     473             : }

Generated by: LCOV version 1.13