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