xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/ExecutionDomainFix.cpp (revision ab71bbb75a92412f6327ff152ebe638568e9021c)
1  //===- ExecutionDomainFix.cpp - Fix execution domain issues ----*- C++ -*--===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  
9  #include "llvm/CodeGen/ExecutionDomainFix.h"
10  #include "llvm/CodeGen/MachineRegisterInfo.h"
11  #include "llvm/CodeGen/TargetInstrInfo.h"
12  #include "llvm/Support/Debug.h"
13  
14  using namespace llvm;
15  
16  #define DEBUG_TYPE "execution-deps-fix"
17  
18  iterator_range<SmallVectorImpl<int>::const_iterator>
19  ExecutionDomainFix::regIndices(unsigned Reg) const {
20    assert(Reg < AliasMap.size() && "Invalid register");
21    const auto &Entry = AliasMap[Reg];
22    return make_range(Entry.begin(), Entry.end());
23  }
24  
25  DomainValue *ExecutionDomainFix::alloc(int domain) {
26    DomainValue *dv = Avail.empty() ? new (Allocator.Allocate()) DomainValue
27                                    : Avail.pop_back_val();
28    if (domain >= 0)
29      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    return dv;
33  }
34  
35  void ExecutionDomainFix::release(DomainValue *DV) {
36    while (DV) {
37      assert(DV->Refs && "Bad DomainValue");
38      if (--DV->Refs)
39        return;
40  
41      // There are no more DV references. Collapse any contained instructions.
42      if (DV->AvailableDomains && !DV->isCollapsed())
43        collapse(DV, DV->getFirstDomain());
44  
45      DomainValue *Next = DV->Next;
46      DV->clear();
47      Avail.push_back(DV);
48      // Also release the next DomainValue in the chain.
49      DV = Next;
50    }
51  }
52  
53  DomainValue *ExecutionDomainFix::resolve(DomainValue *&DVRef) {
54    DomainValue *DV = DVRef;
55    if (!DV || !DV->Next)
56      return DV;
57  
58    // DV has a chain. Find the end.
59    do
60      DV = DV->Next;
61    while (DV->Next);
62  
63    // Update DVRef to point to DV.
64    retain(DV);
65    release(DVRef);
66    DVRef = DV;
67    return DV;
68  }
69  
70  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    if (LiveRegs[rx] == dv)
75      return;
76    if (LiveRegs[rx])
77      release(LiveRegs[rx]);
78    LiveRegs[rx] = retain(dv);
79  }
80  
81  void ExecutionDomainFix::kill(int rx) {
82    assert(unsigned(rx) < NumRegs && "Invalid index");
83    assert(!LiveRegs.empty() && "Must enter basic block first.");
84    if (!LiveRegs[rx])
85      return;
86  
87    release(LiveRegs[rx]);
88    LiveRegs[rx] = nullptr;
89  }
90  
91  void ExecutionDomainFix::force(int rx, unsigned domain) {
92    assert(unsigned(rx) < NumRegs && "Invalid index");
93    assert(!LiveRegs.empty() && "Must enter basic block first.");
94    if (DomainValue *dv = LiveRegs[rx]) {
95      if (dv->isCollapsed())
96        dv->addDomain(domain);
97      else if (dv->hasDomain(domain))
98        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        collapse(dv, dv->getFirstDomain());
103        assert(LiveRegs[rx] && "Not live after collapse?");
104        LiveRegs[rx]->addDomain(domain);
105      }
106    } else {
107      // Set up basic collapsed DomainValue.
108      setLiveReg(rx, alloc(domain));
109    }
110  }
111  
112  void ExecutionDomainFix::collapse(DomainValue *dv, unsigned domain) {
113    assert(dv->hasDomain(domain) && "Cannot collapse");
114  
115    // Collapse all the instructions.
116    while (!dv->Instrs.empty())
117      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    if (!LiveRegs.empty() && dv->Refs > 1)
122      for (unsigned rx = 0; rx != NumRegs; ++rx)
123        if (LiveRegs[rx] == dv)
124          setLiveReg(rx, alloc(domain));
125  }
126  
127  bool ExecutionDomainFix::merge(DomainValue *A, DomainValue *B) {
128    assert(!A->isCollapsed() && "Cannot merge into collapsed");
129    assert(!B->isCollapsed() && "Cannot merge from collapsed");
130    if (A == B)
131      return true;
132    // Restrict to the domains that A and B have in common.
133    unsigned common = A->getCommonDomains(B->AvailableDomains);
134    if (!common)
135      return false;
136    A->AvailableDomains = common;
137    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    B->Next = retain(A);
143  
144    for (unsigned rx = 0; rx != NumRegs; ++rx) {
145      assert(!LiveRegs.empty() && "no space allocated for live registers");
146      if (LiveRegs[rx] == B)
147        setLiveReg(rx, A);
148    }
149    return true;
150  }
151  
152  void ExecutionDomainFix::enterBasicBlock(
153      const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
154  
155    MachineBasicBlock *MBB = TraversedMBB.MBB;
156  
157    // Set up LiveRegs to represent registers entering MBB.
158    // Set default domain values to 'no domain' (nullptr)
159    if (LiveRegs.empty())
160      LiveRegs.assign(NumRegs, nullptr);
161  
162    // This is the entry block.
163    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    for (MachineBasicBlock *pred : MBB->predecessors()) {
170      assert(unsigned(pred->getNumber()) < MBBOutRegsInfos.size() &&
171             "Should have pre-allocated MBBInfos for all MBBs");
172      LiveRegsDVInfo &Incoming = MBBOutRegsInfos[pred->getNumber()];
173      // Incoming is null if this is a backedge from a BB
174      // we haven't processed yet
175      if (Incoming.empty())
176        continue;
177  
178      for (unsigned rx = 0; rx != NumRegs; ++rx) {
179        DomainValue *pdv = resolve(Incoming[rx]);
180        if (!pdv)
181          continue;
182        if (!LiveRegs[rx]) {
183          setLiveReg(rx, pdv);
184          continue;
185        }
186  
187        // We have a live DomainValue from more than one predecessor.
188        if (LiveRegs[rx]->isCollapsed()) {
189          // We are already collapsed, but predecessor is not. Force it.
190          unsigned Domain = LiveRegs[rx]->getFirstDomain();
191          if (!pdv->isCollapsed() && pdv->hasDomain(Domain))
192            collapse(pdv, Domain);
193          continue;
194        }
195  
196        // Currently open, merge in predecessor.
197        if (!pdv->isCollapsed())
198          merge(LiveRegs[rx], pdv);
199        else
200          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  void ExecutionDomainFix::leaveBasicBlock(
209      const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
210    assert(!LiveRegs.empty() && "Must enter basic block first.");
211    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    for (DomainValue *OldLiveReg : MBBOutRegsInfos[MBBNumber]) {
216      release(OldLiveReg);
217    }
218    MBBOutRegsInfos[MBBNumber] = LiveRegs;
219    LiveRegs.clear();
220  }
221  
222  bool ExecutionDomainFix::visitInstr(MachineInstr *MI) {
223    // Update instructions with explicit execution domains.
224    std::pair<uint16_t, uint16_t> DomP = TII->getExecutionDomain(*MI);
225    if (DomP.first) {
226      if (DomP.second)
227        visitSoftInstr(MI, DomP.second);
228      else
229        visitHardInstr(MI, DomP.first);
230    }
231  
232    return !DomP.first;
233  }
234  
235  void ExecutionDomainFix::processDefs(MachineInstr *MI, bool Kill) {
236    assert(!MI->isDebugInstr() && "Won't process debug values");
237    const MCInstrDesc &MCID = MI->getDesc();
238    for (unsigned i = 0,
239                  e = MI->isVariadic() ? MI->getNumOperands() : MCID.getNumDefs();
240         i != e; ++i) {
241      MachineOperand &MO = MI->getOperand(i);
242      if (!MO.isReg())
243        continue;
244      if (MO.isUse())
245        continue;
246      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        if (Kill)
252          kill(rx);
253      }
254    }
255  }
256  
257  void ExecutionDomainFix::visitHardInstr(MachineInstr *mi, unsigned domain) {
258    // Collapse all uses.
259    for (unsigned i = mi->getDesc().getNumDefs(),
260                  e = mi->getDesc().getNumOperands();
261         i != e; ++i) {
262      MachineOperand &mo = mi->getOperand(i);
263      if (!mo.isReg())
264        continue;
265      for (int rx : regIndices(mo.getReg())) {
266        force(rx, domain);
267      }
268    }
269  
270    // Kill all defs and force them.
271    for (unsigned i = 0, e = mi->getDesc().getNumDefs(); i != e; ++i) {
272      MachineOperand &mo = mi->getOperand(i);
273      if (!mo.isReg())
274        continue;
275      for (int rx : regIndices(mo.getReg())) {
276        kill(rx);
277        force(rx, domain);
278      }
279    }
280  }
281  
282  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    if (!LiveRegs.empty())
290      for (unsigned i = mi->getDesc().getNumDefs(),
291                    e = mi->getDesc().getNumOperands();
292           i != e; ++i) {
293        MachineOperand &mo = mi->getOperand(i);
294        if (!mo.isReg())
295          continue;
296        for (int rx : regIndices(mo.getReg())) {
297          DomainValue *dv = LiveRegs[rx];
298          if (dv == nullptr)
299            continue;
300          // Bitmask of domains that dv and available have in common.
301          unsigned common = dv->getCommonDomains(available);
302          // Is it possible to use this collapsed register for free?
303          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            if (common)
308              available = common;
309          } else if (common)
310            // Open DomainValue is compatible, save it for merging.
311            used.push_back(rx);
312          else
313            // Open DomainValue is not compatible with instruction. It is useless
314            // now.
315            kill(rx);
316        }
317      }
318  
319    // If the collapsed operands force a single domain, propagate the collapse.
320    if (isPowerOf2_32(available)) {
321      unsigned domain = countTrailingZeros(available);
322      TII->setExecutionDomain(*mi, domain);
323      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    for (int rx : used) {
331      assert(!LiveRegs.empty() && "no space allocated for live registers");
332      DomainValue *&LR = LiveRegs[rx];
333      // This useless DomainValue could have been missed above.
334      if (!LR->getCommonDomains(available)) {
335        kill(rx);
336        continue;
337      }
338      // Sorted insertion.
339      // Enables giving priority to the latest domains during merging.
340      const int Def = RDA->getReachingDef(mi, RC->getRegister(rx));
341      auto I = partition_point(Regs, [&](int I) {
342        return RDA->getReachingDef(mi, RC->getRegister(I)) <= Def;
343      });
344      Regs.insert(I, rx);
345    }
346  
347    // doms are now sorted in order of appearance. Try to merge them all, giving
348    // priority to the latest ones.
349    DomainValue *dv = nullptr;
350    while (!Regs.empty()) {
351      if (!dv) {
352        dv = LiveRegs[Regs.pop_back_val()];
353        // Force the first dv to match the current instruction.
354        dv->AvailableDomains = dv->getCommonDomains(available);
355        assert(dv->AvailableDomains && "Domain should have been filtered");
356        continue;
357      }
358  
359      DomainValue *Latest = LiveRegs[Regs.pop_back_val()];
360      // Skip already merged values.
361      if (Latest == dv || Latest->Next)
362        continue;
363      if (merge(dv, Latest))
364        continue;
365  
366      // If latest didn't merge, it is useless now. Kill all registers using it.
367      for (int i : used) {
368        assert(!LiveRegs.empty() && "no space allocated for live registers");
369        if (LiveRegs[i] == Latest)
370          kill(i);
371      }
372    }
373  
374    // dv is the DomainValue we are going to use for this instruction.
375    if (!dv) {
376      dv = alloc();
377      dv->AvailableDomains = available;
378    }
379    dv->Instrs.push_back(mi);
380  
381    // Finally set all defs and non-collapsed uses to dv. We must iterate through
382    // all the operators, including imp-def ones.
383    for (const MachineOperand &mo : mi->operands()) {
384      if (!mo.isReg())
385        continue;
386      for (int rx : regIndices(mo.getReg())) {
387        if (!LiveRegs[rx] || (mo.isDef() && LiveRegs[rx] != dv)) {
388          kill(rx);
389          setLiveReg(rx, dv);
390        }
391      }
392    }
393  }
394  
395  void ExecutionDomainFix::processBasicBlock(
396      const LoopTraversal::TraversedMBBInfo &TraversedMBB) {
397    enterBasicBlock(TraversedMBB);
398    // If this block is not done, it makes little sense to make any decisions
399    // based on clearance information. We need to make a second pass anyway,
400    // and by then we'll have better information, so we can avoid doing the work
401    // to try and break dependencies now.
402    for (MachineInstr &MI : *TraversedMBB.MBB) {
403      if (!MI.isDebugInstr()) {
404        bool Kill = false;
405        if (TraversedMBB.PrimaryPass)
406          Kill = visitInstr(&MI);
407        processDefs(&MI, Kill);
408      }
409    }
410    leaveBasicBlock(TraversedMBB);
411  }
412  
413  bool ExecutionDomainFix::runOnMachineFunction(MachineFunction &mf) {
414    if (skipFunction(mf.getFunction()))
415      return false;
416    MF = &mf;
417    TII = MF->getSubtarget().getInstrInfo();
418    TRI = MF->getSubtarget().getRegisterInfo();
419    LiveRegs.clear();
420    assert(NumRegs == RC->getNumRegs() && "Bad regclass");
421  
422    LLVM_DEBUG(dbgs() << "********** FIX EXECUTION DOMAIN: "
423                      << TRI->getRegClassName(RC) << " **********\n");
424  
425    // If no relevant registers are used in the function, we can skip it
426    // completely.
427    bool anyregs = false;
428    const MachineRegisterInfo &MRI = mf.getRegInfo();
429    for (unsigned Reg : *RC) {
430      if (MRI.isPhysRegUsed(Reg)) {
431        anyregs = true;
432        break;
433      }
434    }
435    if (!anyregs)
436      return false;
437  
438    RDA = &getAnalysis<ReachingDefAnalysis>();
439  
440    // Initialize the AliasMap on the first use.
441    if (AliasMap.empty()) {
442      // Given a PhysReg, AliasMap[PhysReg] returns a list of indices into RC and
443      // therefore the LiveRegs array.
444      AliasMap.resize(TRI->getNumRegs());
445      for (unsigned i = 0, e = RC->getNumRegs(); i != e; ++i)
446        for (MCRegAliasIterator AI(RC->getRegister(i), TRI, true); AI.isValid();
447             ++AI)
448          AliasMap[*AI].push_back(i);
449    }
450  
451    // Initialize the MBBOutRegsInfos
452    MBBOutRegsInfos.resize(mf.getNumBlockIDs());
453  
454    // Traverse the basic blocks.
455    LoopTraversal Traversal;
456    LoopTraversal::TraversalOrder TraversedMBBOrder = Traversal.traverse(mf);
457    for (const LoopTraversal::TraversedMBBInfo &TraversedMBB : TraversedMBBOrder)
458      processBasicBlock(TraversedMBB);
459  
460    for (const LiveRegsDVInfo &OutLiveRegs : MBBOutRegsInfos)
461      for (DomainValue *OutLiveReg : OutLiveRegs)
462        if (OutLiveReg)
463          release(OutLiveReg);
464  
465    MBBOutRegsInfos.clear();
466    Avail.clear();
467    Allocator.DestroyAll();
468  
469    return false;
470  }
471