xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- AggressiveAntiDepBreaker.cpp - Anti-dep breaker --------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric //
9*0b57cec5SDimitry Andric // This file implements the AggressiveAntiDepBreaker class, which
10*0b57cec5SDimitry Andric // implements register anti-dependence breaking during post-RA
11*0b57cec5SDimitry Andric // scheduling. It attempts to break all anti-dependencies within a
12*0b57cec5SDimitry Andric // block.
13*0b57cec5SDimitry Andric //
14*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
15*0b57cec5SDimitry Andric 
16*0b57cec5SDimitry Andric #include "AggressiveAntiDepBreaker.h"
17*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
18*0b57cec5SDimitry Andric #include "llvm/ADT/BitVector.h"
19*0b57cec5SDimitry Andric #include "llvm/ADT/SmallSet.h"
20*0b57cec5SDimitry Andric #include "llvm/ADT/iterator_range.h"
21*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
22*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h"
23*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
24*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstr.h"
25*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineOperand.h"
26*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
27*0b57cec5SDimitry Andric #include "llvm/CodeGen/RegisterClassInfo.h"
28*0b57cec5SDimitry Andric #include "llvm/CodeGen/ScheduleDAG.h"
29*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
30*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h"
31*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
32*0b57cec5SDimitry Andric #include "llvm/MC/MCInstrDesc.h"
33*0b57cec5SDimitry Andric #include "llvm/MC/MCRegisterInfo.h"
34*0b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
35*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
36*0b57cec5SDimitry Andric #include "llvm/Support/MachineValueType.h"
37*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
38*0b57cec5SDimitry Andric #include <cassert>
39*0b57cec5SDimitry Andric #include <map>
40*0b57cec5SDimitry Andric #include <set>
41*0b57cec5SDimitry Andric #include <utility>
42*0b57cec5SDimitry Andric #include <vector>
43*0b57cec5SDimitry Andric 
44*0b57cec5SDimitry Andric using namespace llvm;
45*0b57cec5SDimitry Andric 
46*0b57cec5SDimitry Andric #define DEBUG_TYPE "post-RA-sched"
47*0b57cec5SDimitry Andric 
48*0b57cec5SDimitry Andric // If DebugDiv > 0 then only break antidep with (ID % DebugDiv) == DebugMod
49*0b57cec5SDimitry Andric static cl::opt<int>
50*0b57cec5SDimitry Andric DebugDiv("agg-antidep-debugdiv",
51*0b57cec5SDimitry Andric          cl::desc("Debug control for aggressive anti-dep breaker"),
52*0b57cec5SDimitry Andric          cl::init(0), cl::Hidden);
53*0b57cec5SDimitry Andric 
54*0b57cec5SDimitry Andric static cl::opt<int>
55*0b57cec5SDimitry Andric DebugMod("agg-antidep-debugmod",
56*0b57cec5SDimitry Andric          cl::desc("Debug control for aggressive anti-dep breaker"),
57*0b57cec5SDimitry Andric          cl::init(0), cl::Hidden);
58*0b57cec5SDimitry Andric 
59*0b57cec5SDimitry Andric AggressiveAntiDepState::AggressiveAntiDepState(const unsigned TargetRegs,
60*0b57cec5SDimitry Andric                                                MachineBasicBlock *BB)
61*0b57cec5SDimitry Andric     : NumTargetRegs(TargetRegs), GroupNodes(TargetRegs, 0),
62*0b57cec5SDimitry Andric       GroupNodeIndices(TargetRegs, 0), KillIndices(TargetRegs, 0),
63*0b57cec5SDimitry Andric       DefIndices(TargetRegs, 0) {
64*0b57cec5SDimitry Andric   const unsigned BBSize = BB->size();
65*0b57cec5SDimitry Andric   for (unsigned i = 0; i < NumTargetRegs; ++i) {
66*0b57cec5SDimitry Andric     // Initialize all registers to be in their own group. Initially we
67*0b57cec5SDimitry Andric     // assign the register to the same-indexed GroupNode.
68*0b57cec5SDimitry Andric     GroupNodeIndices[i] = i;
69*0b57cec5SDimitry Andric     // Initialize the indices to indicate that no registers are live.
70*0b57cec5SDimitry Andric     KillIndices[i] = ~0u;
71*0b57cec5SDimitry Andric     DefIndices[i] = BBSize;
72*0b57cec5SDimitry Andric   }
73*0b57cec5SDimitry Andric }
74*0b57cec5SDimitry Andric 
75*0b57cec5SDimitry Andric unsigned AggressiveAntiDepState::GetGroup(unsigned Reg) {
76*0b57cec5SDimitry Andric   unsigned Node = GroupNodeIndices[Reg];
77*0b57cec5SDimitry Andric   while (GroupNodes[Node] != Node)
78*0b57cec5SDimitry Andric     Node = GroupNodes[Node];
79*0b57cec5SDimitry Andric 
80*0b57cec5SDimitry Andric   return Node;
81*0b57cec5SDimitry Andric }
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric void AggressiveAntiDepState::GetGroupRegs(
84*0b57cec5SDimitry Andric   unsigned Group,
85*0b57cec5SDimitry Andric   std::vector<unsigned> &Regs,
86*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference> *RegRefs)
87*0b57cec5SDimitry Andric {
88*0b57cec5SDimitry Andric   for (unsigned Reg = 0; Reg != NumTargetRegs; ++Reg) {
89*0b57cec5SDimitry Andric     if ((GetGroup(Reg) == Group) && (RegRefs->count(Reg) > 0))
90*0b57cec5SDimitry Andric       Regs.push_back(Reg);
91*0b57cec5SDimitry Andric   }
92*0b57cec5SDimitry Andric }
93*0b57cec5SDimitry Andric 
94*0b57cec5SDimitry Andric unsigned AggressiveAntiDepState::UnionGroups(unsigned Reg1, unsigned Reg2) {
95*0b57cec5SDimitry Andric   assert(GroupNodes[0] == 0 && "GroupNode 0 not parent!");
96*0b57cec5SDimitry Andric   assert(GroupNodeIndices[0] == 0 && "Reg 0 not in Group 0!");
97*0b57cec5SDimitry Andric 
98*0b57cec5SDimitry Andric   // find group for each register
99*0b57cec5SDimitry Andric   unsigned Group1 = GetGroup(Reg1);
100*0b57cec5SDimitry Andric   unsigned Group2 = GetGroup(Reg2);
101*0b57cec5SDimitry Andric 
102*0b57cec5SDimitry Andric   // if either group is 0, then that must become the parent
103*0b57cec5SDimitry Andric   unsigned Parent = (Group1 == 0) ? Group1 : Group2;
104*0b57cec5SDimitry Andric   unsigned Other = (Parent == Group1) ? Group2 : Group1;
105*0b57cec5SDimitry Andric   GroupNodes.at(Other) = Parent;
106*0b57cec5SDimitry Andric   return Parent;
107*0b57cec5SDimitry Andric }
108*0b57cec5SDimitry Andric 
109*0b57cec5SDimitry Andric unsigned AggressiveAntiDepState::LeaveGroup(unsigned Reg) {
110*0b57cec5SDimitry Andric   // Create a new GroupNode for Reg. Reg's existing GroupNode must
111*0b57cec5SDimitry Andric   // stay as is because there could be other GroupNodes referring to
112*0b57cec5SDimitry Andric   // it.
113*0b57cec5SDimitry Andric   unsigned idx = GroupNodes.size();
114*0b57cec5SDimitry Andric   GroupNodes.push_back(idx);
115*0b57cec5SDimitry Andric   GroupNodeIndices[Reg] = idx;
116*0b57cec5SDimitry Andric   return idx;
117*0b57cec5SDimitry Andric }
118*0b57cec5SDimitry Andric 
119*0b57cec5SDimitry Andric bool AggressiveAntiDepState::IsLive(unsigned Reg) {
120*0b57cec5SDimitry Andric   // KillIndex must be defined and DefIndex not defined for a register
121*0b57cec5SDimitry Andric   // to be live.
122*0b57cec5SDimitry Andric   return((KillIndices[Reg] != ~0u) && (DefIndices[Reg] == ~0u));
123*0b57cec5SDimitry Andric }
124*0b57cec5SDimitry Andric 
125*0b57cec5SDimitry Andric AggressiveAntiDepBreaker::AggressiveAntiDepBreaker(
126*0b57cec5SDimitry Andric     MachineFunction &MFi, const RegisterClassInfo &RCI,
127*0b57cec5SDimitry Andric     TargetSubtargetInfo::RegClassVector &CriticalPathRCs)
128*0b57cec5SDimitry Andric     : AntiDepBreaker(), MF(MFi), MRI(MF.getRegInfo()),
129*0b57cec5SDimitry Andric       TII(MF.getSubtarget().getInstrInfo()),
130*0b57cec5SDimitry Andric       TRI(MF.getSubtarget().getRegisterInfo()), RegClassInfo(RCI) {
131*0b57cec5SDimitry Andric   /* Collect a bitset of all registers that are only broken if they
132*0b57cec5SDimitry Andric      are on the critical path. */
133*0b57cec5SDimitry Andric   for (unsigned i = 0, e = CriticalPathRCs.size(); i < e; ++i) {
134*0b57cec5SDimitry Andric     BitVector CPSet = TRI->getAllocatableSet(MF, CriticalPathRCs[i]);
135*0b57cec5SDimitry Andric     if (CriticalPathSet.none())
136*0b57cec5SDimitry Andric       CriticalPathSet = CPSet;
137*0b57cec5SDimitry Andric     else
138*0b57cec5SDimitry Andric       CriticalPathSet |= CPSet;
139*0b57cec5SDimitry Andric    }
140*0b57cec5SDimitry Andric 
141*0b57cec5SDimitry Andric    LLVM_DEBUG(dbgs() << "AntiDep Critical-Path Registers:");
142*0b57cec5SDimitry Andric    LLVM_DEBUG(for (unsigned r
143*0b57cec5SDimitry Andric                    : CriticalPathSet.set_bits()) dbgs()
144*0b57cec5SDimitry Andric               << " " << printReg(r, TRI));
145*0b57cec5SDimitry Andric    LLVM_DEBUG(dbgs() << '\n');
146*0b57cec5SDimitry Andric }
147*0b57cec5SDimitry Andric 
148*0b57cec5SDimitry Andric AggressiveAntiDepBreaker::~AggressiveAntiDepBreaker() {
149*0b57cec5SDimitry Andric   delete State;
150*0b57cec5SDimitry Andric }
151*0b57cec5SDimitry Andric 
152*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::StartBlock(MachineBasicBlock *BB) {
153*0b57cec5SDimitry Andric   assert(!State);
154*0b57cec5SDimitry Andric   State = new AggressiveAntiDepState(TRI->getNumRegs(), BB);
155*0b57cec5SDimitry Andric 
156*0b57cec5SDimitry Andric   bool IsReturnBlock = BB->isReturnBlock();
157*0b57cec5SDimitry Andric   std::vector<unsigned> &KillIndices = State->GetKillIndices();
158*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
159*0b57cec5SDimitry Andric 
160*0b57cec5SDimitry Andric   // Examine the live-in regs of all successors.
161*0b57cec5SDimitry Andric   for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
162*0b57cec5SDimitry Andric          SE = BB->succ_end(); SI != SE; ++SI)
163*0b57cec5SDimitry Andric     for (const auto &LI : (*SI)->liveins()) {
164*0b57cec5SDimitry Andric       for (MCRegAliasIterator AI(LI.PhysReg, TRI, true); AI.isValid(); ++AI) {
165*0b57cec5SDimitry Andric         unsigned Reg = *AI;
166*0b57cec5SDimitry Andric         State->UnionGroups(Reg, 0);
167*0b57cec5SDimitry Andric         KillIndices[Reg] = BB->size();
168*0b57cec5SDimitry Andric         DefIndices[Reg] = ~0u;
169*0b57cec5SDimitry Andric       }
170*0b57cec5SDimitry Andric     }
171*0b57cec5SDimitry Andric 
172*0b57cec5SDimitry Andric   // Mark live-out callee-saved registers. In a return block this is
173*0b57cec5SDimitry Andric   // all callee-saved registers. In non-return this is any
174*0b57cec5SDimitry Andric   // callee-saved register that is not saved in the prolog.
175*0b57cec5SDimitry Andric   const MachineFrameInfo &MFI = MF.getFrameInfo();
176*0b57cec5SDimitry Andric   BitVector Pristine = MFI.getPristineRegs(MF);
177*0b57cec5SDimitry Andric   for (const MCPhysReg *I = MF.getRegInfo().getCalleeSavedRegs(); *I;
178*0b57cec5SDimitry Andric        ++I) {
179*0b57cec5SDimitry Andric     unsigned Reg = *I;
180*0b57cec5SDimitry Andric     if (!IsReturnBlock && !Pristine.test(Reg))
181*0b57cec5SDimitry Andric       continue;
182*0b57cec5SDimitry Andric     for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
183*0b57cec5SDimitry Andric       unsigned AliasReg = *AI;
184*0b57cec5SDimitry Andric       State->UnionGroups(AliasReg, 0);
185*0b57cec5SDimitry Andric       KillIndices[AliasReg] = BB->size();
186*0b57cec5SDimitry Andric       DefIndices[AliasReg] = ~0u;
187*0b57cec5SDimitry Andric     }
188*0b57cec5SDimitry Andric   }
189*0b57cec5SDimitry Andric }
190*0b57cec5SDimitry Andric 
191*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::FinishBlock() {
192*0b57cec5SDimitry Andric   delete State;
193*0b57cec5SDimitry Andric   State = nullptr;
194*0b57cec5SDimitry Andric }
195*0b57cec5SDimitry Andric 
196*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::Observe(MachineInstr &MI, unsigned Count,
197*0b57cec5SDimitry Andric                                        unsigned InsertPosIndex) {
198*0b57cec5SDimitry Andric   assert(Count < InsertPosIndex && "Instruction index out of expected range!");
199*0b57cec5SDimitry Andric 
200*0b57cec5SDimitry Andric   std::set<unsigned> PassthruRegs;
201*0b57cec5SDimitry Andric   GetPassthruRegs(MI, PassthruRegs);
202*0b57cec5SDimitry Andric   PrescanInstruction(MI, Count, PassthruRegs);
203*0b57cec5SDimitry Andric   ScanInstruction(MI, Count);
204*0b57cec5SDimitry Andric 
205*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "Observe: ");
206*0b57cec5SDimitry Andric   LLVM_DEBUG(MI.dump());
207*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\tRegs:");
208*0b57cec5SDimitry Andric 
209*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
210*0b57cec5SDimitry Andric   for (unsigned Reg = 0; Reg != TRI->getNumRegs(); ++Reg) {
211*0b57cec5SDimitry Andric     // If Reg is current live, then mark that it can't be renamed as
212*0b57cec5SDimitry Andric     // we don't know the extent of its live-range anymore (now that it
213*0b57cec5SDimitry Andric     // has been scheduled). If it is not live but was defined in the
214*0b57cec5SDimitry Andric     // previous schedule region, then set its def index to the most
215*0b57cec5SDimitry Andric     // conservative location (i.e. the beginning of the previous
216*0b57cec5SDimitry Andric     // schedule region).
217*0b57cec5SDimitry Andric     if (State->IsLive(Reg)) {
218*0b57cec5SDimitry Andric       LLVM_DEBUG(if (State->GetGroup(Reg) != 0) dbgs()
219*0b57cec5SDimitry Andric                  << " " << printReg(Reg, TRI) << "=g" << State->GetGroup(Reg)
220*0b57cec5SDimitry Andric                  << "->g0(region live-out)");
221*0b57cec5SDimitry Andric       State->UnionGroups(Reg, 0);
222*0b57cec5SDimitry Andric     } else if ((DefIndices[Reg] < InsertPosIndex)
223*0b57cec5SDimitry Andric                && (DefIndices[Reg] >= Count)) {
224*0b57cec5SDimitry Andric       DefIndices[Reg] = Count;
225*0b57cec5SDimitry Andric     }
226*0b57cec5SDimitry Andric   }
227*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << '\n');
228*0b57cec5SDimitry Andric }
229*0b57cec5SDimitry Andric 
230*0b57cec5SDimitry Andric bool AggressiveAntiDepBreaker::IsImplicitDefUse(MachineInstr &MI,
231*0b57cec5SDimitry Andric                                                 MachineOperand &MO) {
232*0b57cec5SDimitry Andric   if (!MO.isReg() || !MO.isImplicit())
233*0b57cec5SDimitry Andric     return false;
234*0b57cec5SDimitry Andric 
235*0b57cec5SDimitry Andric   unsigned Reg = MO.getReg();
236*0b57cec5SDimitry Andric   if (Reg == 0)
237*0b57cec5SDimitry Andric     return false;
238*0b57cec5SDimitry Andric 
239*0b57cec5SDimitry Andric   MachineOperand *Op = nullptr;
240*0b57cec5SDimitry Andric   if (MO.isDef())
241*0b57cec5SDimitry Andric     Op = MI.findRegisterUseOperand(Reg, true);
242*0b57cec5SDimitry Andric   else
243*0b57cec5SDimitry Andric     Op = MI.findRegisterDefOperand(Reg);
244*0b57cec5SDimitry Andric 
245*0b57cec5SDimitry Andric   return(Op && Op->isImplicit());
246*0b57cec5SDimitry Andric }
247*0b57cec5SDimitry Andric 
248*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::GetPassthruRegs(
249*0b57cec5SDimitry Andric     MachineInstr &MI, std::set<unsigned> &PassthruRegs) {
250*0b57cec5SDimitry Andric   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
251*0b57cec5SDimitry Andric     MachineOperand &MO = MI.getOperand(i);
252*0b57cec5SDimitry Andric     if (!MO.isReg()) continue;
253*0b57cec5SDimitry Andric     if ((MO.isDef() && MI.isRegTiedToUseOperand(i)) ||
254*0b57cec5SDimitry Andric         IsImplicitDefUse(MI, MO)) {
255*0b57cec5SDimitry Andric       const unsigned Reg = MO.getReg();
256*0b57cec5SDimitry Andric       for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
257*0b57cec5SDimitry Andric            SubRegs.isValid(); ++SubRegs)
258*0b57cec5SDimitry Andric         PassthruRegs.insert(*SubRegs);
259*0b57cec5SDimitry Andric     }
260*0b57cec5SDimitry Andric   }
261*0b57cec5SDimitry Andric }
262*0b57cec5SDimitry Andric 
263*0b57cec5SDimitry Andric /// AntiDepEdges - Return in Edges the anti- and output- dependencies
264*0b57cec5SDimitry Andric /// in SU that we want to consider for breaking.
265*0b57cec5SDimitry Andric static void AntiDepEdges(const SUnit *SU, std::vector<const SDep *> &Edges) {
266*0b57cec5SDimitry Andric   SmallSet<unsigned, 4> RegSet;
267*0b57cec5SDimitry Andric   for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end();
268*0b57cec5SDimitry Andric        P != PE; ++P) {
269*0b57cec5SDimitry Andric     if ((P->getKind() == SDep::Anti) || (P->getKind() == SDep::Output)) {
270*0b57cec5SDimitry Andric       if (RegSet.insert(P->getReg()).second)
271*0b57cec5SDimitry Andric         Edges.push_back(&*P);
272*0b57cec5SDimitry Andric     }
273*0b57cec5SDimitry Andric   }
274*0b57cec5SDimitry Andric }
275*0b57cec5SDimitry Andric 
276*0b57cec5SDimitry Andric /// CriticalPathStep - Return the next SUnit after SU on the bottom-up
277*0b57cec5SDimitry Andric /// critical path.
278*0b57cec5SDimitry Andric static const SUnit *CriticalPathStep(const SUnit *SU) {
279*0b57cec5SDimitry Andric   const SDep *Next = nullptr;
280*0b57cec5SDimitry Andric   unsigned NextDepth = 0;
281*0b57cec5SDimitry Andric   // Find the predecessor edge with the greatest depth.
282*0b57cec5SDimitry Andric   if (SU) {
283*0b57cec5SDimitry Andric     for (SUnit::const_pred_iterator P = SU->Preds.begin(), PE = SU->Preds.end();
284*0b57cec5SDimitry Andric          P != PE; ++P) {
285*0b57cec5SDimitry Andric       const SUnit *PredSU = P->getSUnit();
286*0b57cec5SDimitry Andric       unsigned PredLatency = P->getLatency();
287*0b57cec5SDimitry Andric       unsigned PredTotalLatency = PredSU->getDepth() + PredLatency;
288*0b57cec5SDimitry Andric       // In the case of a latency tie, prefer an anti-dependency edge over
289*0b57cec5SDimitry Andric       // other types of edges.
290*0b57cec5SDimitry Andric       if (NextDepth < PredTotalLatency ||
291*0b57cec5SDimitry Andric           (NextDepth == PredTotalLatency && P->getKind() == SDep::Anti)) {
292*0b57cec5SDimitry Andric         NextDepth = PredTotalLatency;
293*0b57cec5SDimitry Andric         Next = &*P;
294*0b57cec5SDimitry Andric       }
295*0b57cec5SDimitry Andric     }
296*0b57cec5SDimitry Andric   }
297*0b57cec5SDimitry Andric 
298*0b57cec5SDimitry Andric   return (Next) ? Next->getSUnit() : nullptr;
299*0b57cec5SDimitry Andric }
300*0b57cec5SDimitry Andric 
301*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::HandleLastUse(unsigned Reg, unsigned KillIdx,
302*0b57cec5SDimitry Andric                                              const char *tag,
303*0b57cec5SDimitry Andric                                              const char *header,
304*0b57cec5SDimitry Andric                                              const char *footer) {
305*0b57cec5SDimitry Andric   std::vector<unsigned> &KillIndices = State->GetKillIndices();
306*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
307*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>&
308*0b57cec5SDimitry Andric     RegRefs = State->GetRegRefs();
309*0b57cec5SDimitry Andric 
310*0b57cec5SDimitry Andric   // FIXME: We must leave subregisters of live super registers as live, so that
311*0b57cec5SDimitry Andric   // we don't clear out the register tracking information for subregisters of
312*0b57cec5SDimitry Andric   // super registers we're still tracking (and with which we're unioning
313*0b57cec5SDimitry Andric   // subregister definitions).
314*0b57cec5SDimitry Andric   for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI)
315*0b57cec5SDimitry Andric     if (TRI->isSuperRegister(Reg, *AI) && State->IsLive(*AI)) {
316*0b57cec5SDimitry Andric       LLVM_DEBUG(if (!header && footer) dbgs() << footer);
317*0b57cec5SDimitry Andric       return;
318*0b57cec5SDimitry Andric     }
319*0b57cec5SDimitry Andric 
320*0b57cec5SDimitry Andric   if (!State->IsLive(Reg)) {
321*0b57cec5SDimitry Andric     KillIndices[Reg] = KillIdx;
322*0b57cec5SDimitry Andric     DefIndices[Reg] = ~0u;
323*0b57cec5SDimitry Andric     RegRefs.erase(Reg);
324*0b57cec5SDimitry Andric     State->LeaveGroup(Reg);
325*0b57cec5SDimitry Andric     LLVM_DEBUG(if (header) {
326*0b57cec5SDimitry Andric       dbgs() << header << printReg(Reg, TRI);
327*0b57cec5SDimitry Andric       header = nullptr;
328*0b57cec5SDimitry Andric     });
329*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << tag);
330*0b57cec5SDimitry Andric     // Repeat for subregisters. Note that we only do this if the superregister
331*0b57cec5SDimitry Andric     // was not live because otherwise, regardless whether we have an explicit
332*0b57cec5SDimitry Andric     // use of the subregister, the subregister's contents are needed for the
333*0b57cec5SDimitry Andric     // uses of the superregister.
334*0b57cec5SDimitry Andric     for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) {
335*0b57cec5SDimitry Andric       unsigned SubregReg = *SubRegs;
336*0b57cec5SDimitry Andric       if (!State->IsLive(SubregReg)) {
337*0b57cec5SDimitry Andric         KillIndices[SubregReg] = KillIdx;
338*0b57cec5SDimitry Andric         DefIndices[SubregReg] = ~0u;
339*0b57cec5SDimitry Andric         RegRefs.erase(SubregReg);
340*0b57cec5SDimitry Andric         State->LeaveGroup(SubregReg);
341*0b57cec5SDimitry Andric         LLVM_DEBUG(if (header) {
342*0b57cec5SDimitry Andric           dbgs() << header << printReg(Reg, TRI);
343*0b57cec5SDimitry Andric           header = nullptr;
344*0b57cec5SDimitry Andric         });
345*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << " " << printReg(SubregReg, TRI) << "->g"
346*0b57cec5SDimitry Andric                           << State->GetGroup(SubregReg) << tag);
347*0b57cec5SDimitry Andric       }
348*0b57cec5SDimitry Andric     }
349*0b57cec5SDimitry Andric   }
350*0b57cec5SDimitry Andric 
351*0b57cec5SDimitry Andric   LLVM_DEBUG(if (!header && footer) dbgs() << footer);
352*0b57cec5SDimitry Andric }
353*0b57cec5SDimitry Andric 
354*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::PrescanInstruction(
355*0b57cec5SDimitry Andric     MachineInstr &MI, unsigned Count, std::set<unsigned> &PassthruRegs) {
356*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
357*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>&
358*0b57cec5SDimitry Andric     RegRefs = State->GetRegRefs();
359*0b57cec5SDimitry Andric 
360*0b57cec5SDimitry Andric   // Handle dead defs by simulating a last-use of the register just
361*0b57cec5SDimitry Andric   // after the def. A dead def can occur because the def is truly
362*0b57cec5SDimitry Andric   // dead, or because only a subregister is live at the def. If we
363*0b57cec5SDimitry Andric   // don't do this the dead def will be incorrectly merged into the
364*0b57cec5SDimitry Andric   // previous def.
365*0b57cec5SDimitry Andric   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
366*0b57cec5SDimitry Andric     MachineOperand &MO = MI.getOperand(i);
367*0b57cec5SDimitry Andric     if (!MO.isReg() || !MO.isDef()) continue;
368*0b57cec5SDimitry Andric     unsigned Reg = MO.getReg();
369*0b57cec5SDimitry Andric     if (Reg == 0) continue;
370*0b57cec5SDimitry Andric 
371*0b57cec5SDimitry Andric     HandleLastUse(Reg, Count + 1, "", "\tDead Def: ", "\n");
372*0b57cec5SDimitry Andric   }
373*0b57cec5SDimitry Andric 
374*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\tDef Groups:");
375*0b57cec5SDimitry Andric   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
376*0b57cec5SDimitry Andric     MachineOperand &MO = MI.getOperand(i);
377*0b57cec5SDimitry Andric     if (!MO.isReg() || !MO.isDef()) continue;
378*0b57cec5SDimitry Andric     unsigned Reg = MO.getReg();
379*0b57cec5SDimitry Andric     if (Reg == 0) continue;
380*0b57cec5SDimitry Andric 
381*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << " " << printReg(Reg, TRI) << "=g"
382*0b57cec5SDimitry Andric                       << State->GetGroup(Reg));
383*0b57cec5SDimitry Andric 
384*0b57cec5SDimitry Andric     // If MI's defs have a special allocation requirement, don't allow
385*0b57cec5SDimitry Andric     // any def registers to be changed. Also assume all registers
386*0b57cec5SDimitry Andric     // defined in a call must not be changed (ABI). Inline assembly may
387*0b57cec5SDimitry Andric     // reference either system calls or the register directly. Skip it until we
388*0b57cec5SDimitry Andric     // can tell user specified registers from compiler-specified.
389*0b57cec5SDimitry Andric     if (MI.isCall() || MI.hasExtraDefRegAllocReq() || TII->isPredicated(MI) ||
390*0b57cec5SDimitry Andric         MI.isInlineAsm()) {
391*0b57cec5SDimitry Andric       LLVM_DEBUG(if (State->GetGroup(Reg) != 0) dbgs() << "->g0(alloc-req)");
392*0b57cec5SDimitry Andric       State->UnionGroups(Reg, 0);
393*0b57cec5SDimitry Andric     }
394*0b57cec5SDimitry Andric 
395*0b57cec5SDimitry Andric     // Any aliased that are live at this point are completely or
396*0b57cec5SDimitry Andric     // partially defined here, so group those aliases with Reg.
397*0b57cec5SDimitry Andric     for (MCRegAliasIterator AI(Reg, TRI, false); AI.isValid(); ++AI) {
398*0b57cec5SDimitry Andric       unsigned AliasReg = *AI;
399*0b57cec5SDimitry Andric       if (State->IsLive(AliasReg)) {
400*0b57cec5SDimitry Andric         State->UnionGroups(Reg, AliasReg);
401*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << "->g" << State->GetGroup(Reg) << "(via "
402*0b57cec5SDimitry Andric                           << printReg(AliasReg, TRI) << ")");
403*0b57cec5SDimitry Andric       }
404*0b57cec5SDimitry Andric     }
405*0b57cec5SDimitry Andric 
406*0b57cec5SDimitry Andric     // Note register reference...
407*0b57cec5SDimitry Andric     const TargetRegisterClass *RC = nullptr;
408*0b57cec5SDimitry Andric     if (i < MI.getDesc().getNumOperands())
409*0b57cec5SDimitry Andric       RC = TII->getRegClass(MI.getDesc(), i, TRI, MF);
410*0b57cec5SDimitry Andric     AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
411*0b57cec5SDimitry Andric     RegRefs.insert(std::make_pair(Reg, RR));
412*0b57cec5SDimitry Andric   }
413*0b57cec5SDimitry Andric 
414*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << '\n');
415*0b57cec5SDimitry Andric 
416*0b57cec5SDimitry Andric   // Scan the register defs for this instruction and update
417*0b57cec5SDimitry Andric   // live-ranges.
418*0b57cec5SDimitry Andric   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
419*0b57cec5SDimitry Andric     MachineOperand &MO = MI.getOperand(i);
420*0b57cec5SDimitry Andric     if (!MO.isReg() || !MO.isDef()) continue;
421*0b57cec5SDimitry Andric     unsigned Reg = MO.getReg();
422*0b57cec5SDimitry Andric     if (Reg == 0) continue;
423*0b57cec5SDimitry Andric     // Ignore KILLs and passthru registers for liveness...
424*0b57cec5SDimitry Andric     if (MI.isKill() || (PassthruRegs.count(Reg) != 0))
425*0b57cec5SDimitry Andric       continue;
426*0b57cec5SDimitry Andric 
427*0b57cec5SDimitry Andric     // Update def for Reg and aliases.
428*0b57cec5SDimitry Andric     for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) {
429*0b57cec5SDimitry Andric       // We need to be careful here not to define already-live super registers.
430*0b57cec5SDimitry Andric       // If the super register is already live, then this definition is not
431*0b57cec5SDimitry Andric       // a definition of the whole super register (just a partial insertion
432*0b57cec5SDimitry Andric       // into it). Earlier subregister definitions (which we've not yet visited
433*0b57cec5SDimitry Andric       // because we're iterating bottom-up) need to be linked to the same group
434*0b57cec5SDimitry Andric       // as this definition.
435*0b57cec5SDimitry Andric       if (TRI->isSuperRegister(Reg, *AI) && State->IsLive(*AI))
436*0b57cec5SDimitry Andric         continue;
437*0b57cec5SDimitry Andric 
438*0b57cec5SDimitry Andric       DefIndices[*AI] = Count;
439*0b57cec5SDimitry Andric     }
440*0b57cec5SDimitry Andric   }
441*0b57cec5SDimitry Andric }
442*0b57cec5SDimitry Andric 
443*0b57cec5SDimitry Andric void AggressiveAntiDepBreaker::ScanInstruction(MachineInstr &MI,
444*0b57cec5SDimitry Andric                                                unsigned Count) {
445*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\tUse Groups:");
446*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>&
447*0b57cec5SDimitry Andric     RegRefs = State->GetRegRefs();
448*0b57cec5SDimitry Andric 
449*0b57cec5SDimitry Andric   // If MI's uses have special allocation requirement, don't allow
450*0b57cec5SDimitry Andric   // any use registers to be changed. Also assume all registers
451*0b57cec5SDimitry Andric   // used in a call must not be changed (ABI).
452*0b57cec5SDimitry Andric   // Inline Assembly register uses also cannot be safely changed.
453*0b57cec5SDimitry Andric   // FIXME: The issue with predicated instruction is more complex. We are being
454*0b57cec5SDimitry Andric   // conservatively here because the kill markers cannot be trusted after
455*0b57cec5SDimitry Andric   // if-conversion:
456*0b57cec5SDimitry Andric   // %r6 = LDR %sp, %reg0, 92, 14, %reg0; mem:LD4[FixedStack14]
457*0b57cec5SDimitry Andric   // ...
458*0b57cec5SDimitry Andric   // STR %r0, killed %r6, %reg0, 0, 0, %cpsr; mem:ST4[%395]
459*0b57cec5SDimitry Andric   // %r6 = LDR %sp, %reg0, 100, 0, %cpsr; mem:LD4[FixedStack12]
460*0b57cec5SDimitry Andric   // STR %r0, killed %r6, %reg0, 0, 14, %reg0; mem:ST4[%396](align=8)
461*0b57cec5SDimitry Andric   //
462*0b57cec5SDimitry Andric   // The first R6 kill is not really a kill since it's killed by a predicated
463*0b57cec5SDimitry Andric   // instruction which may not be executed. The second R6 def may or may not
464*0b57cec5SDimitry Andric   // re-define R6 so it's not safe to change it since the last R6 use cannot be
465*0b57cec5SDimitry Andric   // changed.
466*0b57cec5SDimitry Andric   bool Special = MI.isCall() || MI.hasExtraSrcRegAllocReq() ||
467*0b57cec5SDimitry Andric                  TII->isPredicated(MI) || MI.isInlineAsm();
468*0b57cec5SDimitry Andric 
469*0b57cec5SDimitry Andric   // Scan the register uses for this instruction and update
470*0b57cec5SDimitry Andric   // live-ranges, groups and RegRefs.
471*0b57cec5SDimitry Andric   for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
472*0b57cec5SDimitry Andric     MachineOperand &MO = MI.getOperand(i);
473*0b57cec5SDimitry Andric     if (!MO.isReg() || !MO.isUse()) continue;
474*0b57cec5SDimitry Andric     unsigned Reg = MO.getReg();
475*0b57cec5SDimitry Andric     if (Reg == 0) continue;
476*0b57cec5SDimitry Andric 
477*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << " " << printReg(Reg, TRI) << "=g"
478*0b57cec5SDimitry Andric                       << State->GetGroup(Reg));
479*0b57cec5SDimitry Andric 
480*0b57cec5SDimitry Andric     // It wasn't previously live but now it is, this is a kill. Forget
481*0b57cec5SDimitry Andric     // the previous live-range information and start a new live-range
482*0b57cec5SDimitry Andric     // for the register.
483*0b57cec5SDimitry Andric     HandleLastUse(Reg, Count, "(last-use)");
484*0b57cec5SDimitry Andric 
485*0b57cec5SDimitry Andric     if (Special) {
486*0b57cec5SDimitry Andric       LLVM_DEBUG(if (State->GetGroup(Reg) != 0) dbgs() << "->g0(alloc-req)");
487*0b57cec5SDimitry Andric       State->UnionGroups(Reg, 0);
488*0b57cec5SDimitry Andric     }
489*0b57cec5SDimitry Andric 
490*0b57cec5SDimitry Andric     // Note register reference...
491*0b57cec5SDimitry Andric     const TargetRegisterClass *RC = nullptr;
492*0b57cec5SDimitry Andric     if (i < MI.getDesc().getNumOperands())
493*0b57cec5SDimitry Andric       RC = TII->getRegClass(MI.getDesc(), i, TRI, MF);
494*0b57cec5SDimitry Andric     AggressiveAntiDepState::RegisterReference RR = { &MO, RC };
495*0b57cec5SDimitry Andric     RegRefs.insert(std::make_pair(Reg, RR));
496*0b57cec5SDimitry Andric   }
497*0b57cec5SDimitry Andric 
498*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << '\n');
499*0b57cec5SDimitry Andric 
500*0b57cec5SDimitry Andric   // Form a group of all defs and uses of a KILL instruction to ensure
501*0b57cec5SDimitry Andric   // that all registers are renamed as a group.
502*0b57cec5SDimitry Andric   if (MI.isKill()) {
503*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "\tKill Group:");
504*0b57cec5SDimitry Andric 
505*0b57cec5SDimitry Andric     unsigned FirstReg = 0;
506*0b57cec5SDimitry Andric     for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
507*0b57cec5SDimitry Andric       MachineOperand &MO = MI.getOperand(i);
508*0b57cec5SDimitry Andric       if (!MO.isReg()) continue;
509*0b57cec5SDimitry Andric       unsigned Reg = MO.getReg();
510*0b57cec5SDimitry Andric       if (Reg == 0) continue;
511*0b57cec5SDimitry Andric 
512*0b57cec5SDimitry Andric       if (FirstReg != 0) {
513*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << "=" << printReg(Reg, TRI));
514*0b57cec5SDimitry Andric         State->UnionGroups(FirstReg, Reg);
515*0b57cec5SDimitry Andric       } else {
516*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << " " << printReg(Reg, TRI));
517*0b57cec5SDimitry Andric         FirstReg = Reg;
518*0b57cec5SDimitry Andric       }
519*0b57cec5SDimitry Andric     }
520*0b57cec5SDimitry Andric 
521*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "->g" << State->GetGroup(FirstReg) << '\n');
522*0b57cec5SDimitry Andric   }
523*0b57cec5SDimitry Andric }
524*0b57cec5SDimitry Andric 
525*0b57cec5SDimitry Andric BitVector AggressiveAntiDepBreaker::GetRenameRegisters(unsigned Reg) {
526*0b57cec5SDimitry Andric   BitVector BV(TRI->getNumRegs(), false);
527*0b57cec5SDimitry Andric   bool first = true;
528*0b57cec5SDimitry Andric 
529*0b57cec5SDimitry Andric   // Check all references that need rewriting for Reg. For each, use
530*0b57cec5SDimitry Andric   // the corresponding register class to narrow the set of registers
531*0b57cec5SDimitry Andric   // that are appropriate for renaming.
532*0b57cec5SDimitry Andric   for (const auto &Q : make_range(State->GetRegRefs().equal_range(Reg))) {
533*0b57cec5SDimitry Andric     const TargetRegisterClass *RC = Q.second.RC;
534*0b57cec5SDimitry Andric     if (!RC) continue;
535*0b57cec5SDimitry Andric 
536*0b57cec5SDimitry Andric     BitVector RCBV = TRI->getAllocatableSet(MF, RC);
537*0b57cec5SDimitry Andric     if (first) {
538*0b57cec5SDimitry Andric       BV |= RCBV;
539*0b57cec5SDimitry Andric       first = false;
540*0b57cec5SDimitry Andric     } else {
541*0b57cec5SDimitry Andric       BV &= RCBV;
542*0b57cec5SDimitry Andric     }
543*0b57cec5SDimitry Andric 
544*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << " " << TRI->getRegClassName(RC));
545*0b57cec5SDimitry Andric   }
546*0b57cec5SDimitry Andric 
547*0b57cec5SDimitry Andric   return BV;
548*0b57cec5SDimitry Andric }
549*0b57cec5SDimitry Andric 
550*0b57cec5SDimitry Andric bool AggressiveAntiDepBreaker::FindSuitableFreeRegisters(
551*0b57cec5SDimitry Andric                                 unsigned AntiDepGroupIndex,
552*0b57cec5SDimitry Andric                                 RenameOrderType& RenameOrder,
553*0b57cec5SDimitry Andric                                 std::map<unsigned, unsigned> &RenameMap) {
554*0b57cec5SDimitry Andric   std::vector<unsigned> &KillIndices = State->GetKillIndices();
555*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
556*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>&
557*0b57cec5SDimitry Andric     RegRefs = State->GetRegRefs();
558*0b57cec5SDimitry Andric 
559*0b57cec5SDimitry Andric   // Collect all referenced registers in the same group as
560*0b57cec5SDimitry Andric   // AntiDepReg. These all need to be renamed together if we are to
561*0b57cec5SDimitry Andric   // break the anti-dependence.
562*0b57cec5SDimitry Andric   std::vector<unsigned> Regs;
563*0b57cec5SDimitry Andric   State->GetGroupRegs(AntiDepGroupIndex, Regs, &RegRefs);
564*0b57cec5SDimitry Andric   assert(!Regs.empty() && "Empty register group!");
565*0b57cec5SDimitry Andric   if (Regs.empty())
566*0b57cec5SDimitry Andric     return false;
567*0b57cec5SDimitry Andric 
568*0b57cec5SDimitry Andric   // Find the "superest" register in the group. At the same time,
569*0b57cec5SDimitry Andric   // collect the BitVector of registers that can be used to rename
570*0b57cec5SDimitry Andric   // each register.
571*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\tRename Candidates for Group g" << AntiDepGroupIndex
572*0b57cec5SDimitry Andric                     << ":\n");
573*0b57cec5SDimitry Andric   std::map<unsigned, BitVector> RenameRegisterMap;
574*0b57cec5SDimitry Andric   unsigned SuperReg = 0;
575*0b57cec5SDimitry Andric   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
576*0b57cec5SDimitry Andric     unsigned Reg = Regs[i];
577*0b57cec5SDimitry Andric     if ((SuperReg == 0) || TRI->isSuperRegister(SuperReg, Reg))
578*0b57cec5SDimitry Andric       SuperReg = Reg;
579*0b57cec5SDimitry Andric 
580*0b57cec5SDimitry Andric     // If Reg has any references, then collect possible rename regs
581*0b57cec5SDimitry Andric     if (RegRefs.count(Reg) > 0) {
582*0b57cec5SDimitry Andric       LLVM_DEBUG(dbgs() << "\t\t" << printReg(Reg, TRI) << ":");
583*0b57cec5SDimitry Andric 
584*0b57cec5SDimitry Andric       BitVector &BV = RenameRegisterMap[Reg];
585*0b57cec5SDimitry Andric       assert(BV.empty());
586*0b57cec5SDimitry Andric       BV = GetRenameRegisters(Reg);
587*0b57cec5SDimitry Andric 
588*0b57cec5SDimitry Andric       LLVM_DEBUG({
589*0b57cec5SDimitry Andric         dbgs() << " ::";
590*0b57cec5SDimitry Andric         for (unsigned r : BV.set_bits())
591*0b57cec5SDimitry Andric           dbgs() << " " << printReg(r, TRI);
592*0b57cec5SDimitry Andric         dbgs() << "\n";
593*0b57cec5SDimitry Andric       });
594*0b57cec5SDimitry Andric     }
595*0b57cec5SDimitry Andric   }
596*0b57cec5SDimitry Andric 
597*0b57cec5SDimitry Andric   // All group registers should be a subreg of SuperReg.
598*0b57cec5SDimitry Andric   for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
599*0b57cec5SDimitry Andric     unsigned Reg = Regs[i];
600*0b57cec5SDimitry Andric     if (Reg == SuperReg) continue;
601*0b57cec5SDimitry Andric     bool IsSub = TRI->isSubRegister(SuperReg, Reg);
602*0b57cec5SDimitry Andric     // FIXME: remove this once PR18663 has been properly fixed. For now,
603*0b57cec5SDimitry Andric     // return a conservative answer:
604*0b57cec5SDimitry Andric     // assert(IsSub && "Expecting group subregister");
605*0b57cec5SDimitry Andric     if (!IsSub)
606*0b57cec5SDimitry Andric       return false;
607*0b57cec5SDimitry Andric   }
608*0b57cec5SDimitry Andric 
609*0b57cec5SDimitry Andric #ifndef NDEBUG
610*0b57cec5SDimitry Andric   // If DebugDiv > 0 then only rename (renamecnt % DebugDiv) == DebugMod
611*0b57cec5SDimitry Andric   if (DebugDiv > 0) {
612*0b57cec5SDimitry Andric     static int renamecnt = 0;
613*0b57cec5SDimitry Andric     if (renamecnt++ % DebugDiv != DebugMod)
614*0b57cec5SDimitry Andric       return false;
615*0b57cec5SDimitry Andric 
616*0b57cec5SDimitry Andric     dbgs() << "*** Performing rename " << printReg(SuperReg, TRI)
617*0b57cec5SDimitry Andric            << " for debug ***\n";
618*0b57cec5SDimitry Andric   }
619*0b57cec5SDimitry Andric #endif
620*0b57cec5SDimitry Andric 
621*0b57cec5SDimitry Andric   // Check each possible rename register for SuperReg in round-robin
622*0b57cec5SDimitry Andric   // order. If that register is available, and the corresponding
623*0b57cec5SDimitry Andric   // registers are available for the other group subregisters, then we
624*0b57cec5SDimitry Andric   // can use those registers to rename.
625*0b57cec5SDimitry Andric 
626*0b57cec5SDimitry Andric   // FIXME: Using getMinimalPhysRegClass is very conservative. We should
627*0b57cec5SDimitry Andric   // check every use of the register and find the largest register class
628*0b57cec5SDimitry Andric   // that can be used in all of them.
629*0b57cec5SDimitry Andric   const TargetRegisterClass *SuperRC =
630*0b57cec5SDimitry Andric     TRI->getMinimalPhysRegClass(SuperReg, MVT::Other);
631*0b57cec5SDimitry Andric 
632*0b57cec5SDimitry Andric   ArrayRef<MCPhysReg> Order = RegClassInfo.getOrder(SuperRC);
633*0b57cec5SDimitry Andric   if (Order.empty()) {
634*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "\tEmpty Super Regclass!!\n");
635*0b57cec5SDimitry Andric     return false;
636*0b57cec5SDimitry Andric   }
637*0b57cec5SDimitry Andric 
638*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\tFind Registers:");
639*0b57cec5SDimitry Andric 
640*0b57cec5SDimitry Andric   RenameOrder.insert(RenameOrderType::value_type(SuperRC, Order.size()));
641*0b57cec5SDimitry Andric 
642*0b57cec5SDimitry Andric   unsigned OrigR = RenameOrder[SuperRC];
643*0b57cec5SDimitry Andric   unsigned EndR = ((OrigR == Order.size()) ? 0 : OrigR);
644*0b57cec5SDimitry Andric   unsigned R = OrigR;
645*0b57cec5SDimitry Andric   do {
646*0b57cec5SDimitry Andric     if (R == 0) R = Order.size();
647*0b57cec5SDimitry Andric     --R;
648*0b57cec5SDimitry Andric     const unsigned NewSuperReg = Order[R];
649*0b57cec5SDimitry Andric     // Don't consider non-allocatable registers
650*0b57cec5SDimitry Andric     if (!MRI.isAllocatable(NewSuperReg)) continue;
651*0b57cec5SDimitry Andric     // Don't replace a register with itself.
652*0b57cec5SDimitry Andric     if (NewSuperReg == SuperReg) continue;
653*0b57cec5SDimitry Andric 
654*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << " [" << printReg(NewSuperReg, TRI) << ':');
655*0b57cec5SDimitry Andric     RenameMap.clear();
656*0b57cec5SDimitry Andric 
657*0b57cec5SDimitry Andric     // For each referenced group register (which must be a SuperReg or
658*0b57cec5SDimitry Andric     // a subregister of SuperReg), find the corresponding subregister
659*0b57cec5SDimitry Andric     // of NewSuperReg and make sure it is free to be renamed.
660*0b57cec5SDimitry Andric     for (unsigned i = 0, e = Regs.size(); i != e; ++i) {
661*0b57cec5SDimitry Andric       unsigned Reg = Regs[i];
662*0b57cec5SDimitry Andric       unsigned NewReg = 0;
663*0b57cec5SDimitry Andric       if (Reg == SuperReg) {
664*0b57cec5SDimitry Andric         NewReg = NewSuperReg;
665*0b57cec5SDimitry Andric       } else {
666*0b57cec5SDimitry Andric         unsigned NewSubRegIdx = TRI->getSubRegIndex(SuperReg, Reg);
667*0b57cec5SDimitry Andric         if (NewSubRegIdx != 0)
668*0b57cec5SDimitry Andric           NewReg = TRI->getSubReg(NewSuperReg, NewSubRegIdx);
669*0b57cec5SDimitry Andric       }
670*0b57cec5SDimitry Andric 
671*0b57cec5SDimitry Andric       LLVM_DEBUG(dbgs() << " " << printReg(NewReg, TRI));
672*0b57cec5SDimitry Andric 
673*0b57cec5SDimitry Andric       // Check if Reg can be renamed to NewReg.
674*0b57cec5SDimitry Andric       if (!RenameRegisterMap[Reg].test(NewReg)) {
675*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << "(no rename)");
676*0b57cec5SDimitry Andric         goto next_super_reg;
677*0b57cec5SDimitry Andric       }
678*0b57cec5SDimitry Andric 
679*0b57cec5SDimitry Andric       // If NewReg is dead and NewReg's most recent def is not before
680*0b57cec5SDimitry Andric       // Regs's kill, it's safe to replace Reg with NewReg. We
681*0b57cec5SDimitry Andric       // must also check all aliases of NewReg, because we can't define a
682*0b57cec5SDimitry Andric       // register when any sub or super is already live.
683*0b57cec5SDimitry Andric       if (State->IsLive(NewReg) || (KillIndices[Reg] > DefIndices[NewReg])) {
684*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << "(live)");
685*0b57cec5SDimitry Andric         goto next_super_reg;
686*0b57cec5SDimitry Andric       } else {
687*0b57cec5SDimitry Andric         bool found = false;
688*0b57cec5SDimitry Andric         for (MCRegAliasIterator AI(NewReg, TRI, false); AI.isValid(); ++AI) {
689*0b57cec5SDimitry Andric           unsigned AliasReg = *AI;
690*0b57cec5SDimitry Andric           if (State->IsLive(AliasReg) ||
691*0b57cec5SDimitry Andric               (KillIndices[Reg] > DefIndices[AliasReg])) {
692*0b57cec5SDimitry Andric             LLVM_DEBUG(dbgs()
693*0b57cec5SDimitry Andric                        << "(alias " << printReg(AliasReg, TRI) << " live)");
694*0b57cec5SDimitry Andric             found = true;
695*0b57cec5SDimitry Andric             break;
696*0b57cec5SDimitry Andric           }
697*0b57cec5SDimitry Andric         }
698*0b57cec5SDimitry Andric         if (found)
699*0b57cec5SDimitry Andric           goto next_super_reg;
700*0b57cec5SDimitry Andric       }
701*0b57cec5SDimitry Andric 
702*0b57cec5SDimitry Andric       // We cannot rename 'Reg' to 'NewReg' if one of the uses of 'Reg' also
703*0b57cec5SDimitry Andric       // defines 'NewReg' via an early-clobber operand.
704*0b57cec5SDimitry Andric       for (const auto &Q : make_range(RegRefs.equal_range(Reg))) {
705*0b57cec5SDimitry Andric         MachineInstr *UseMI = Q.second.Operand->getParent();
706*0b57cec5SDimitry Andric         int Idx = UseMI->findRegisterDefOperandIdx(NewReg, false, true, TRI);
707*0b57cec5SDimitry Andric         if (Idx == -1)
708*0b57cec5SDimitry Andric           continue;
709*0b57cec5SDimitry Andric 
710*0b57cec5SDimitry Andric         if (UseMI->getOperand(Idx).isEarlyClobber()) {
711*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << "(ec)");
712*0b57cec5SDimitry Andric           goto next_super_reg;
713*0b57cec5SDimitry Andric         }
714*0b57cec5SDimitry Andric       }
715*0b57cec5SDimitry Andric 
716*0b57cec5SDimitry Andric       // Also, we cannot rename 'Reg' to 'NewReg' if the instruction defining
717*0b57cec5SDimitry Andric       // 'Reg' is an early-clobber define and that instruction also uses
718*0b57cec5SDimitry Andric       // 'NewReg'.
719*0b57cec5SDimitry Andric       for (const auto &Q : make_range(RegRefs.equal_range(Reg))) {
720*0b57cec5SDimitry Andric         if (!Q.second.Operand->isDef() || !Q.second.Operand->isEarlyClobber())
721*0b57cec5SDimitry Andric           continue;
722*0b57cec5SDimitry Andric 
723*0b57cec5SDimitry Andric         MachineInstr *DefMI = Q.second.Operand->getParent();
724*0b57cec5SDimitry Andric         if (DefMI->readsRegister(NewReg, TRI)) {
725*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << "(ec)");
726*0b57cec5SDimitry Andric           goto next_super_reg;
727*0b57cec5SDimitry Andric         }
728*0b57cec5SDimitry Andric       }
729*0b57cec5SDimitry Andric 
730*0b57cec5SDimitry Andric       // Record that 'Reg' can be renamed to 'NewReg'.
731*0b57cec5SDimitry Andric       RenameMap.insert(std::pair<unsigned, unsigned>(Reg, NewReg));
732*0b57cec5SDimitry Andric     }
733*0b57cec5SDimitry Andric 
734*0b57cec5SDimitry Andric     // If we fall-out here, then every register in the group can be
735*0b57cec5SDimitry Andric     // renamed, as recorded in RenameMap.
736*0b57cec5SDimitry Andric     RenameOrder.erase(SuperRC);
737*0b57cec5SDimitry Andric     RenameOrder.insert(RenameOrderType::value_type(SuperRC, R));
738*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "]\n");
739*0b57cec5SDimitry Andric     return true;
740*0b57cec5SDimitry Andric 
741*0b57cec5SDimitry Andric   next_super_reg:
742*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << ']');
743*0b57cec5SDimitry Andric   } while (R != EndR);
744*0b57cec5SDimitry Andric 
745*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << '\n');
746*0b57cec5SDimitry Andric 
747*0b57cec5SDimitry Andric   // No registers are free and available!
748*0b57cec5SDimitry Andric   return false;
749*0b57cec5SDimitry Andric }
750*0b57cec5SDimitry Andric 
751*0b57cec5SDimitry Andric /// BreakAntiDependencies - Identifiy anti-dependencies within the
752*0b57cec5SDimitry Andric /// ScheduleDAG and break them by renaming registers.
753*0b57cec5SDimitry Andric unsigned AggressiveAntiDepBreaker::BreakAntiDependencies(
754*0b57cec5SDimitry Andric                               const std::vector<SUnit> &SUnits,
755*0b57cec5SDimitry Andric                               MachineBasicBlock::iterator Begin,
756*0b57cec5SDimitry Andric                               MachineBasicBlock::iterator End,
757*0b57cec5SDimitry Andric                               unsigned InsertPosIndex,
758*0b57cec5SDimitry Andric                               DbgValueVector &DbgValues) {
759*0b57cec5SDimitry Andric   std::vector<unsigned> &KillIndices = State->GetKillIndices();
760*0b57cec5SDimitry Andric   std::vector<unsigned> &DefIndices = State->GetDefIndices();
761*0b57cec5SDimitry Andric   std::multimap<unsigned, AggressiveAntiDepState::RegisterReference>&
762*0b57cec5SDimitry Andric     RegRefs = State->GetRegRefs();
763*0b57cec5SDimitry Andric 
764*0b57cec5SDimitry Andric   // The code below assumes that there is at least one instruction,
765*0b57cec5SDimitry Andric   // so just duck out immediately if the block is empty.
766*0b57cec5SDimitry Andric   if (SUnits.empty()) return 0;
767*0b57cec5SDimitry Andric 
768*0b57cec5SDimitry Andric   // For each regclass the next register to use for renaming.
769*0b57cec5SDimitry Andric   RenameOrderType RenameOrder;
770*0b57cec5SDimitry Andric 
771*0b57cec5SDimitry Andric   // ...need a map from MI to SUnit.
772*0b57cec5SDimitry Andric   std::map<MachineInstr *, const SUnit *> MISUnitMap;
773*0b57cec5SDimitry Andric   for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
774*0b57cec5SDimitry Andric     const SUnit *SU = &SUnits[i];
775*0b57cec5SDimitry Andric     MISUnitMap.insert(std::pair<MachineInstr *, const SUnit *>(SU->getInstr(),
776*0b57cec5SDimitry Andric                                                                SU));
777*0b57cec5SDimitry Andric   }
778*0b57cec5SDimitry Andric 
779*0b57cec5SDimitry Andric   // Track progress along the critical path through the SUnit graph as
780*0b57cec5SDimitry Andric   // we walk the instructions. This is needed for regclasses that only
781*0b57cec5SDimitry Andric   // break critical-path anti-dependencies.
782*0b57cec5SDimitry Andric   const SUnit *CriticalPathSU = nullptr;
783*0b57cec5SDimitry Andric   MachineInstr *CriticalPathMI = nullptr;
784*0b57cec5SDimitry Andric   if (CriticalPathSet.any()) {
785*0b57cec5SDimitry Andric     for (unsigned i = 0, e = SUnits.size(); i != e; ++i) {
786*0b57cec5SDimitry Andric       const SUnit *SU = &SUnits[i];
787*0b57cec5SDimitry Andric       if (!CriticalPathSU ||
788*0b57cec5SDimitry Andric           ((SU->getDepth() + SU->Latency) >
789*0b57cec5SDimitry Andric            (CriticalPathSU->getDepth() + CriticalPathSU->Latency))) {
790*0b57cec5SDimitry Andric         CriticalPathSU = SU;
791*0b57cec5SDimitry Andric       }
792*0b57cec5SDimitry Andric     }
793*0b57cec5SDimitry Andric 
794*0b57cec5SDimitry Andric     CriticalPathMI = CriticalPathSU->getInstr();
795*0b57cec5SDimitry Andric   }
796*0b57cec5SDimitry Andric 
797*0b57cec5SDimitry Andric #ifndef NDEBUG
798*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "\n===== Aggressive anti-dependency breaking\n");
799*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << "Available regs:");
800*0b57cec5SDimitry Andric   for (unsigned Reg = 0; Reg < TRI->getNumRegs(); ++Reg) {
801*0b57cec5SDimitry Andric     if (!State->IsLive(Reg))
802*0b57cec5SDimitry Andric       LLVM_DEBUG(dbgs() << " " << printReg(Reg, TRI));
803*0b57cec5SDimitry Andric   }
804*0b57cec5SDimitry Andric   LLVM_DEBUG(dbgs() << '\n');
805*0b57cec5SDimitry Andric #endif
806*0b57cec5SDimitry Andric 
807*0b57cec5SDimitry Andric   BitVector RegAliases(TRI->getNumRegs());
808*0b57cec5SDimitry Andric 
809*0b57cec5SDimitry Andric   // Attempt to break anti-dependence edges. Walk the instructions
810*0b57cec5SDimitry Andric   // from the bottom up, tracking information about liveness as we go
811*0b57cec5SDimitry Andric   // to help determine which registers are available.
812*0b57cec5SDimitry Andric   unsigned Broken = 0;
813*0b57cec5SDimitry Andric   unsigned Count = InsertPosIndex - 1;
814*0b57cec5SDimitry Andric   for (MachineBasicBlock::iterator I = End, E = Begin;
815*0b57cec5SDimitry Andric        I != E; --Count) {
816*0b57cec5SDimitry Andric     MachineInstr &MI = *--I;
817*0b57cec5SDimitry Andric 
818*0b57cec5SDimitry Andric     if (MI.isDebugInstr())
819*0b57cec5SDimitry Andric       continue;
820*0b57cec5SDimitry Andric 
821*0b57cec5SDimitry Andric     LLVM_DEBUG(dbgs() << "Anti: ");
822*0b57cec5SDimitry Andric     LLVM_DEBUG(MI.dump());
823*0b57cec5SDimitry Andric 
824*0b57cec5SDimitry Andric     std::set<unsigned> PassthruRegs;
825*0b57cec5SDimitry Andric     GetPassthruRegs(MI, PassthruRegs);
826*0b57cec5SDimitry Andric 
827*0b57cec5SDimitry Andric     // Process the defs in MI...
828*0b57cec5SDimitry Andric     PrescanInstruction(MI, Count, PassthruRegs);
829*0b57cec5SDimitry Andric 
830*0b57cec5SDimitry Andric     // The dependence edges that represent anti- and output-
831*0b57cec5SDimitry Andric     // dependencies that are candidates for breaking.
832*0b57cec5SDimitry Andric     std::vector<const SDep *> Edges;
833*0b57cec5SDimitry Andric     const SUnit *PathSU = MISUnitMap[&MI];
834*0b57cec5SDimitry Andric     AntiDepEdges(PathSU, Edges);
835*0b57cec5SDimitry Andric 
836*0b57cec5SDimitry Andric     // If MI is not on the critical path, then we don't rename
837*0b57cec5SDimitry Andric     // registers in the CriticalPathSet.
838*0b57cec5SDimitry Andric     BitVector *ExcludeRegs = nullptr;
839*0b57cec5SDimitry Andric     if (&MI == CriticalPathMI) {
840*0b57cec5SDimitry Andric       CriticalPathSU = CriticalPathStep(CriticalPathSU);
841*0b57cec5SDimitry Andric       CriticalPathMI = (CriticalPathSU) ? CriticalPathSU->getInstr() : nullptr;
842*0b57cec5SDimitry Andric     } else if (CriticalPathSet.any()) {
843*0b57cec5SDimitry Andric       ExcludeRegs = &CriticalPathSet;
844*0b57cec5SDimitry Andric     }
845*0b57cec5SDimitry Andric 
846*0b57cec5SDimitry Andric     // Ignore KILL instructions (they form a group in ScanInstruction
847*0b57cec5SDimitry Andric     // but don't cause any anti-dependence breaking themselves)
848*0b57cec5SDimitry Andric     if (!MI.isKill()) {
849*0b57cec5SDimitry Andric       // Attempt to break each anti-dependency...
850*0b57cec5SDimitry Andric       for (unsigned i = 0, e = Edges.size(); i != e; ++i) {
851*0b57cec5SDimitry Andric         const SDep *Edge = Edges[i];
852*0b57cec5SDimitry Andric         SUnit *NextSU = Edge->getSUnit();
853*0b57cec5SDimitry Andric 
854*0b57cec5SDimitry Andric         if ((Edge->getKind() != SDep::Anti) &&
855*0b57cec5SDimitry Andric             (Edge->getKind() != SDep::Output)) continue;
856*0b57cec5SDimitry Andric 
857*0b57cec5SDimitry Andric         unsigned AntiDepReg = Edge->getReg();
858*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << "\tAntidep reg: " << printReg(AntiDepReg, TRI));
859*0b57cec5SDimitry Andric         assert(AntiDepReg != 0 && "Anti-dependence on reg0?");
860*0b57cec5SDimitry Andric 
861*0b57cec5SDimitry Andric         if (!MRI.isAllocatable(AntiDepReg)) {
862*0b57cec5SDimitry Andric           // Don't break anti-dependencies on non-allocatable registers.
863*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << " (non-allocatable)\n");
864*0b57cec5SDimitry Andric           continue;
865*0b57cec5SDimitry Andric         } else if (ExcludeRegs && ExcludeRegs->test(AntiDepReg)) {
866*0b57cec5SDimitry Andric           // Don't break anti-dependencies for critical path registers
867*0b57cec5SDimitry Andric           // if not on the critical path
868*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << " (not critical-path)\n");
869*0b57cec5SDimitry Andric           continue;
870*0b57cec5SDimitry Andric         } else if (PassthruRegs.count(AntiDepReg) != 0) {
871*0b57cec5SDimitry Andric           // If the anti-dep register liveness "passes-thru", then
872*0b57cec5SDimitry Andric           // don't try to change it. It will be changed along with
873*0b57cec5SDimitry Andric           // the use if required to break an earlier antidep.
874*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << " (passthru)\n");
875*0b57cec5SDimitry Andric           continue;
876*0b57cec5SDimitry Andric         } else {
877*0b57cec5SDimitry Andric           // No anti-dep breaking for implicit deps
878*0b57cec5SDimitry Andric           MachineOperand *AntiDepOp = MI.findRegisterDefOperand(AntiDepReg);
879*0b57cec5SDimitry Andric           assert(AntiDepOp && "Can't find index for defined register operand");
880*0b57cec5SDimitry Andric           if (!AntiDepOp || AntiDepOp->isImplicit()) {
881*0b57cec5SDimitry Andric             LLVM_DEBUG(dbgs() << " (implicit)\n");
882*0b57cec5SDimitry Andric             continue;
883*0b57cec5SDimitry Andric           }
884*0b57cec5SDimitry Andric 
885*0b57cec5SDimitry Andric           // If the SUnit has other dependencies on the SUnit that
886*0b57cec5SDimitry Andric           // it anti-depends on, don't bother breaking the
887*0b57cec5SDimitry Andric           // anti-dependency since those edges would prevent such
888*0b57cec5SDimitry Andric           // units from being scheduled past each other
889*0b57cec5SDimitry Andric           // regardless.
890*0b57cec5SDimitry Andric           //
891*0b57cec5SDimitry Andric           // Also, if there are dependencies on other SUnits with the
892*0b57cec5SDimitry Andric           // same register as the anti-dependency, don't attempt to
893*0b57cec5SDimitry Andric           // break it.
894*0b57cec5SDimitry Andric           for (SUnit::const_pred_iterator P = PathSU->Preds.begin(),
895*0b57cec5SDimitry Andric                  PE = PathSU->Preds.end(); P != PE; ++P) {
896*0b57cec5SDimitry Andric             if (P->getSUnit() == NextSU ?
897*0b57cec5SDimitry Andric                 (P->getKind() != SDep::Anti || P->getReg() != AntiDepReg) :
898*0b57cec5SDimitry Andric                 (P->getKind() == SDep::Data && P->getReg() == AntiDepReg)) {
899*0b57cec5SDimitry Andric               AntiDepReg = 0;
900*0b57cec5SDimitry Andric               break;
901*0b57cec5SDimitry Andric             }
902*0b57cec5SDimitry Andric           }
903*0b57cec5SDimitry Andric           for (SUnit::const_pred_iterator P = PathSU->Preds.begin(),
904*0b57cec5SDimitry Andric                  PE = PathSU->Preds.end(); P != PE; ++P) {
905*0b57cec5SDimitry Andric             if ((P->getSUnit() == NextSU) && (P->getKind() != SDep::Anti) &&
906*0b57cec5SDimitry Andric                 (P->getKind() != SDep::Output)) {
907*0b57cec5SDimitry Andric               LLVM_DEBUG(dbgs() << " (real dependency)\n");
908*0b57cec5SDimitry Andric               AntiDepReg = 0;
909*0b57cec5SDimitry Andric               break;
910*0b57cec5SDimitry Andric             } else if ((P->getSUnit() != NextSU) &&
911*0b57cec5SDimitry Andric                        (P->getKind() == SDep::Data) &&
912*0b57cec5SDimitry Andric                        (P->getReg() == AntiDepReg)) {
913*0b57cec5SDimitry Andric               LLVM_DEBUG(dbgs() << " (other dependency)\n");
914*0b57cec5SDimitry Andric               AntiDepReg = 0;
915*0b57cec5SDimitry Andric               break;
916*0b57cec5SDimitry Andric             }
917*0b57cec5SDimitry Andric           }
918*0b57cec5SDimitry Andric 
919*0b57cec5SDimitry Andric           if (AntiDepReg == 0) continue;
920*0b57cec5SDimitry Andric 
921*0b57cec5SDimitry Andric           // If the definition of the anti-dependency register does not start
922*0b57cec5SDimitry Andric           // a new live range, bail out. This can happen if the anti-dep
923*0b57cec5SDimitry Andric           // register is a sub-register of another register whose live range
924*0b57cec5SDimitry Andric           // spans over PathSU. In such case, PathSU defines only a part of
925*0b57cec5SDimitry Andric           // the larger register.
926*0b57cec5SDimitry Andric           RegAliases.reset();
927*0b57cec5SDimitry Andric           for (MCRegAliasIterator AI(AntiDepReg, TRI, true); AI.isValid(); ++AI)
928*0b57cec5SDimitry Andric             RegAliases.set(*AI);
929*0b57cec5SDimitry Andric           for (SDep S : PathSU->Succs) {
930*0b57cec5SDimitry Andric             SDep::Kind K = S.getKind();
931*0b57cec5SDimitry Andric             if (K != SDep::Data && K != SDep::Output && K != SDep::Anti)
932*0b57cec5SDimitry Andric               continue;
933*0b57cec5SDimitry Andric             unsigned R = S.getReg();
934*0b57cec5SDimitry Andric             if (!RegAliases[R])
935*0b57cec5SDimitry Andric               continue;
936*0b57cec5SDimitry Andric             if (R == AntiDepReg || TRI->isSubRegister(AntiDepReg, R))
937*0b57cec5SDimitry Andric               continue;
938*0b57cec5SDimitry Andric             AntiDepReg = 0;
939*0b57cec5SDimitry Andric             break;
940*0b57cec5SDimitry Andric           }
941*0b57cec5SDimitry Andric 
942*0b57cec5SDimitry Andric           if (AntiDepReg == 0) continue;
943*0b57cec5SDimitry Andric         }
944*0b57cec5SDimitry Andric 
945*0b57cec5SDimitry Andric         assert(AntiDepReg != 0);
946*0b57cec5SDimitry Andric         if (AntiDepReg == 0) continue;
947*0b57cec5SDimitry Andric 
948*0b57cec5SDimitry Andric         // Determine AntiDepReg's register group.
949*0b57cec5SDimitry Andric         const unsigned GroupIndex = State->GetGroup(AntiDepReg);
950*0b57cec5SDimitry Andric         if (GroupIndex == 0) {
951*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << " (zero group)\n");
952*0b57cec5SDimitry Andric           continue;
953*0b57cec5SDimitry Andric         }
954*0b57cec5SDimitry Andric 
955*0b57cec5SDimitry Andric         LLVM_DEBUG(dbgs() << '\n');
956*0b57cec5SDimitry Andric 
957*0b57cec5SDimitry Andric         // Look for a suitable register to use to break the anti-dependence.
958*0b57cec5SDimitry Andric         std::map<unsigned, unsigned> RenameMap;
959*0b57cec5SDimitry Andric         if (FindSuitableFreeRegisters(GroupIndex, RenameOrder, RenameMap)) {
960*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << "\tBreaking anti-dependence edge on "
961*0b57cec5SDimitry Andric                             << printReg(AntiDepReg, TRI) << ":");
962*0b57cec5SDimitry Andric 
963*0b57cec5SDimitry Andric           // Handle each group register...
964*0b57cec5SDimitry Andric           for (std::map<unsigned, unsigned>::iterator
965*0b57cec5SDimitry Andric                  S = RenameMap.begin(), E = RenameMap.end(); S != E; ++S) {
966*0b57cec5SDimitry Andric             unsigned CurrReg = S->first;
967*0b57cec5SDimitry Andric             unsigned NewReg = S->second;
968*0b57cec5SDimitry Andric 
969*0b57cec5SDimitry Andric             LLVM_DEBUG(dbgs() << " " << printReg(CurrReg, TRI) << "->"
970*0b57cec5SDimitry Andric                               << printReg(NewReg, TRI) << "("
971*0b57cec5SDimitry Andric                               << RegRefs.count(CurrReg) << " refs)");
972*0b57cec5SDimitry Andric 
973*0b57cec5SDimitry Andric             // Update the references to the old register CurrReg to
974*0b57cec5SDimitry Andric             // refer to the new register NewReg.
975*0b57cec5SDimitry Andric             for (const auto &Q : make_range(RegRefs.equal_range(CurrReg))) {
976*0b57cec5SDimitry Andric               Q.second.Operand->setReg(NewReg);
977*0b57cec5SDimitry Andric               // If the SU for the instruction being updated has debug
978*0b57cec5SDimitry Andric               // information related to the anti-dependency register, make
979*0b57cec5SDimitry Andric               // sure to update that as well.
980*0b57cec5SDimitry Andric               const SUnit *SU = MISUnitMap[Q.second.Operand->getParent()];
981*0b57cec5SDimitry Andric               if (!SU) continue;
982*0b57cec5SDimitry Andric               UpdateDbgValues(DbgValues, Q.second.Operand->getParent(),
983*0b57cec5SDimitry Andric                               AntiDepReg, NewReg);
984*0b57cec5SDimitry Andric             }
985*0b57cec5SDimitry Andric 
986*0b57cec5SDimitry Andric             // We just went back in time and modified history; the
987*0b57cec5SDimitry Andric             // liveness information for CurrReg is now inconsistent. Set
988*0b57cec5SDimitry Andric             // the state as if it were dead.
989*0b57cec5SDimitry Andric             State->UnionGroups(NewReg, 0);
990*0b57cec5SDimitry Andric             RegRefs.erase(NewReg);
991*0b57cec5SDimitry Andric             DefIndices[NewReg] = DefIndices[CurrReg];
992*0b57cec5SDimitry Andric             KillIndices[NewReg] = KillIndices[CurrReg];
993*0b57cec5SDimitry Andric 
994*0b57cec5SDimitry Andric             State->UnionGroups(CurrReg, 0);
995*0b57cec5SDimitry Andric             RegRefs.erase(CurrReg);
996*0b57cec5SDimitry Andric             DefIndices[CurrReg] = KillIndices[CurrReg];
997*0b57cec5SDimitry Andric             KillIndices[CurrReg] = ~0u;
998*0b57cec5SDimitry Andric             assert(((KillIndices[CurrReg] == ~0u) !=
999*0b57cec5SDimitry Andric                     (DefIndices[CurrReg] == ~0u)) &&
1000*0b57cec5SDimitry Andric                    "Kill and Def maps aren't consistent for AntiDepReg!");
1001*0b57cec5SDimitry Andric           }
1002*0b57cec5SDimitry Andric 
1003*0b57cec5SDimitry Andric           ++Broken;
1004*0b57cec5SDimitry Andric           LLVM_DEBUG(dbgs() << '\n');
1005*0b57cec5SDimitry Andric         }
1006*0b57cec5SDimitry Andric       }
1007*0b57cec5SDimitry Andric     }
1008*0b57cec5SDimitry Andric 
1009*0b57cec5SDimitry Andric     ScanInstruction(MI, Count);
1010*0b57cec5SDimitry Andric   }
1011*0b57cec5SDimitry Andric 
1012*0b57cec5SDimitry Andric   return Broken;
1013*0b57cec5SDimitry Andric }
1014