xref: /aosp_15_r20/external/llvm/lib/CodeGen/TailDuplicator.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- TailDuplicator.cpp - Duplicate blocks into predecessors' tails ---===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This utility class duplicates basic blocks ending in unconditional branches
11*9880d681SAndroid Build Coastguard Worker // into the tails of their predecessors.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/TailDuplicator.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseSet.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SetVector.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallSet.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Statistic.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineFunctionPass.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineInstrBuilder.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/MachineModuleInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/CommandLine.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
30*9880d681SAndroid Build Coastguard Worker using namespace llvm;
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "tailduplication"
33*9880d681SAndroid Build Coastguard Worker 
34*9880d681SAndroid Build Coastguard Worker STATISTIC(NumTails, "Number of tails duplicated");
35*9880d681SAndroid Build Coastguard Worker STATISTIC(NumTailDups, "Number of tail duplicated blocks");
36*9880d681SAndroid Build Coastguard Worker STATISTIC(NumTailDupAdded,
37*9880d681SAndroid Build Coastguard Worker           "Number of instructions added due to tail duplication");
38*9880d681SAndroid Build Coastguard Worker STATISTIC(NumTailDupRemoved,
39*9880d681SAndroid Build Coastguard Worker           "Number of instructions removed due to tail duplication");
40*9880d681SAndroid Build Coastguard Worker STATISTIC(NumDeadBlocks, "Number of dead blocks removed");
41*9880d681SAndroid Build Coastguard Worker STATISTIC(NumAddedPHIs, "Number of phis added");
42*9880d681SAndroid Build Coastguard Worker 
43*9880d681SAndroid Build Coastguard Worker // Heuristic for tail duplication.
44*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned> TailDuplicateSize(
45*9880d681SAndroid Build Coastguard Worker     "tail-dup-size",
46*9880d681SAndroid Build Coastguard Worker     cl::desc("Maximum instructions to consider tail duplicating"), cl::init(2),
47*9880d681SAndroid Build Coastguard Worker     cl::Hidden);
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker static cl::opt<bool>
50*9880d681SAndroid Build Coastguard Worker     TailDupVerify("tail-dup-verify",
51*9880d681SAndroid Build Coastguard Worker                   cl::desc("Verify sanity of PHI instructions during taildup"),
52*9880d681SAndroid Build Coastguard Worker                   cl::init(false), cl::Hidden);
53*9880d681SAndroid Build Coastguard Worker 
54*9880d681SAndroid Build Coastguard Worker static cl::opt<unsigned> TailDupLimit("tail-dup-limit", cl::init(~0U),
55*9880d681SAndroid Build Coastguard Worker                                       cl::Hidden);
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker namespace llvm {
58*9880d681SAndroid Build Coastguard Worker 
initMF(MachineFunction & MF,const MachineModuleInfo * MMIin,const MachineBranchProbabilityInfo * MBPIin)59*9880d681SAndroid Build Coastguard Worker void TailDuplicator::initMF(MachineFunction &MF, const MachineModuleInfo *MMIin,
60*9880d681SAndroid Build Coastguard Worker                             const MachineBranchProbabilityInfo *MBPIin) {
61*9880d681SAndroid Build Coastguard Worker   TII = MF.getSubtarget().getInstrInfo();
62*9880d681SAndroid Build Coastguard Worker   TRI = MF.getSubtarget().getRegisterInfo();
63*9880d681SAndroid Build Coastguard Worker   MRI = &MF.getRegInfo();
64*9880d681SAndroid Build Coastguard Worker   MMI = MMIin;
65*9880d681SAndroid Build Coastguard Worker   MBPI = MBPIin;
66*9880d681SAndroid Build Coastguard Worker 
67*9880d681SAndroid Build Coastguard Worker   assert(MBPI != nullptr && "Machine Branch Probability Info required");
68*9880d681SAndroid Build Coastguard Worker 
69*9880d681SAndroid Build Coastguard Worker   PreRegAlloc = MRI->isSSA();
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker 
VerifyPHIs(MachineFunction & MF,bool CheckExtra)72*9880d681SAndroid Build Coastguard Worker static void VerifyPHIs(MachineFunction &MF, bool CheckExtra) {
73*9880d681SAndroid Build Coastguard Worker   for (MachineFunction::iterator I = ++MF.begin(), E = MF.end(); I != E; ++I) {
74*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *MBB = &*I;
75*9880d681SAndroid Build Coastguard Worker     SmallSetVector<MachineBasicBlock *, 8> Preds(MBB->pred_begin(),
76*9880d681SAndroid Build Coastguard Worker                                                  MBB->pred_end());
77*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock::iterator MI = MBB->begin();
78*9880d681SAndroid Build Coastguard Worker     while (MI != MBB->end()) {
79*9880d681SAndroid Build Coastguard Worker       if (!MI->isPHI())
80*9880d681SAndroid Build Coastguard Worker         break;
81*9880d681SAndroid Build Coastguard Worker       for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
82*9880d681SAndroid Build Coastguard Worker                                                             PE = Preds.end();
83*9880d681SAndroid Build Coastguard Worker            PI != PE; ++PI) {
84*9880d681SAndroid Build Coastguard Worker         MachineBasicBlock *PredBB = *PI;
85*9880d681SAndroid Build Coastguard Worker         bool Found = false;
86*9880d681SAndroid Build Coastguard Worker         for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
87*9880d681SAndroid Build Coastguard Worker           MachineBasicBlock *PHIBB = MI->getOperand(i + 1).getMBB();
88*9880d681SAndroid Build Coastguard Worker           if (PHIBB == PredBB) {
89*9880d681SAndroid Build Coastguard Worker             Found = true;
90*9880d681SAndroid Build Coastguard Worker             break;
91*9880d681SAndroid Build Coastguard Worker           }
92*9880d681SAndroid Build Coastguard Worker         }
93*9880d681SAndroid Build Coastguard Worker         if (!Found) {
94*9880d681SAndroid Build Coastguard Worker           dbgs() << "Malformed PHI in BB#" << MBB->getNumber() << ": " << *MI;
95*9880d681SAndroid Build Coastguard Worker           dbgs() << "  missing input from predecessor BB#"
96*9880d681SAndroid Build Coastguard Worker                  << PredBB->getNumber() << '\n';
97*9880d681SAndroid Build Coastguard Worker           llvm_unreachable(nullptr);
98*9880d681SAndroid Build Coastguard Worker         }
99*9880d681SAndroid Build Coastguard Worker       }
100*9880d681SAndroid Build Coastguard Worker 
101*9880d681SAndroid Build Coastguard Worker       for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2) {
102*9880d681SAndroid Build Coastguard Worker         MachineBasicBlock *PHIBB = MI->getOperand(i + 1).getMBB();
103*9880d681SAndroid Build Coastguard Worker         if (CheckExtra && !Preds.count(PHIBB)) {
104*9880d681SAndroid Build Coastguard Worker           dbgs() << "Warning: malformed PHI in BB#" << MBB->getNumber() << ": "
105*9880d681SAndroid Build Coastguard Worker                  << *MI;
106*9880d681SAndroid Build Coastguard Worker           dbgs() << "  extra input from predecessor BB#" << PHIBB->getNumber()
107*9880d681SAndroid Build Coastguard Worker                  << '\n';
108*9880d681SAndroid Build Coastguard Worker           llvm_unreachable(nullptr);
109*9880d681SAndroid Build Coastguard Worker         }
110*9880d681SAndroid Build Coastguard Worker         if (PHIBB->getNumber() < 0) {
111*9880d681SAndroid Build Coastguard Worker           dbgs() << "Malformed PHI in BB#" << MBB->getNumber() << ": " << *MI;
112*9880d681SAndroid Build Coastguard Worker           dbgs() << "  non-existing BB#" << PHIBB->getNumber() << '\n';
113*9880d681SAndroid Build Coastguard Worker           llvm_unreachable(nullptr);
114*9880d681SAndroid Build Coastguard Worker         }
115*9880d681SAndroid Build Coastguard Worker       }
116*9880d681SAndroid Build Coastguard Worker       ++MI;
117*9880d681SAndroid Build Coastguard Worker     }
118*9880d681SAndroid Build Coastguard Worker   }
119*9880d681SAndroid Build Coastguard Worker }
120*9880d681SAndroid Build Coastguard Worker 
121*9880d681SAndroid Build Coastguard Worker /// Tail duplicate the block and cleanup.
tailDuplicateAndUpdate(MachineFunction & MF,bool IsSimple,MachineBasicBlock * MBB)122*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::tailDuplicateAndUpdate(MachineFunction &MF, bool IsSimple,
123*9880d681SAndroid Build Coastguard Worker                                             MachineBasicBlock *MBB) {
124*9880d681SAndroid Build Coastguard Worker   // Save the successors list.
125*9880d681SAndroid Build Coastguard Worker   SmallSetVector<MachineBasicBlock *, 8> Succs(MBB->succ_begin(),
126*9880d681SAndroid Build Coastguard Worker                                                MBB->succ_end());
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker   SmallVector<MachineBasicBlock *, 8> TDBBs;
129*9880d681SAndroid Build Coastguard Worker   SmallVector<MachineInstr *, 16> Copies;
130*9880d681SAndroid Build Coastguard Worker   if (!tailDuplicate(MF, IsSimple, MBB, TDBBs, Copies))
131*9880d681SAndroid Build Coastguard Worker     return false;
132*9880d681SAndroid Build Coastguard Worker 
133*9880d681SAndroid Build Coastguard Worker   ++NumTails;
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker   SmallVector<MachineInstr *, 8> NewPHIs;
136*9880d681SAndroid Build Coastguard Worker   MachineSSAUpdater SSAUpdate(MF, &NewPHIs);
137*9880d681SAndroid Build Coastguard Worker 
138*9880d681SAndroid Build Coastguard Worker   // TailBB's immediate successors are now successors of those predecessors
139*9880d681SAndroid Build Coastguard Worker   // which duplicated TailBB. Add the predecessors as sources to the PHI
140*9880d681SAndroid Build Coastguard Worker   // instructions.
141*9880d681SAndroid Build Coastguard Worker   bool isDead = MBB->pred_empty() && !MBB->hasAddressTaken();
142*9880d681SAndroid Build Coastguard Worker   if (PreRegAlloc)
143*9880d681SAndroid Build Coastguard Worker     updateSuccessorsPHIs(MBB, isDead, TDBBs, Succs);
144*9880d681SAndroid Build Coastguard Worker 
145*9880d681SAndroid Build Coastguard Worker   // If it is dead, remove it.
146*9880d681SAndroid Build Coastguard Worker   if (isDead) {
147*9880d681SAndroid Build Coastguard Worker     NumTailDupRemoved += MBB->size();
148*9880d681SAndroid Build Coastguard Worker     removeDeadBlock(MBB);
149*9880d681SAndroid Build Coastguard Worker     ++NumDeadBlocks;
150*9880d681SAndroid Build Coastguard Worker   }
151*9880d681SAndroid Build Coastguard Worker 
152*9880d681SAndroid Build Coastguard Worker   // Update SSA form.
153*9880d681SAndroid Build Coastguard Worker   if (!SSAUpdateVRs.empty()) {
154*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, e = SSAUpdateVRs.size(); i != e; ++i) {
155*9880d681SAndroid Build Coastguard Worker       unsigned VReg = SSAUpdateVRs[i];
156*9880d681SAndroid Build Coastguard Worker       SSAUpdate.Initialize(VReg);
157*9880d681SAndroid Build Coastguard Worker 
158*9880d681SAndroid Build Coastguard Worker       // If the original definition is still around, add it as an available
159*9880d681SAndroid Build Coastguard Worker       // value.
160*9880d681SAndroid Build Coastguard Worker       MachineInstr *DefMI = MRI->getVRegDef(VReg);
161*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock *DefBB = nullptr;
162*9880d681SAndroid Build Coastguard Worker       if (DefMI) {
163*9880d681SAndroid Build Coastguard Worker         DefBB = DefMI->getParent();
164*9880d681SAndroid Build Coastguard Worker         SSAUpdate.AddAvailableValue(DefBB, VReg);
165*9880d681SAndroid Build Coastguard Worker       }
166*9880d681SAndroid Build Coastguard Worker 
167*9880d681SAndroid Build Coastguard Worker       // Add the new vregs as available values.
168*9880d681SAndroid Build Coastguard Worker       DenseMap<unsigned, AvailableValsTy>::iterator LI =
169*9880d681SAndroid Build Coastguard Worker           SSAUpdateVals.find(VReg);
170*9880d681SAndroid Build Coastguard Worker       for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
171*9880d681SAndroid Build Coastguard Worker         MachineBasicBlock *SrcBB = LI->second[j].first;
172*9880d681SAndroid Build Coastguard Worker         unsigned SrcReg = LI->second[j].second;
173*9880d681SAndroid Build Coastguard Worker         SSAUpdate.AddAvailableValue(SrcBB, SrcReg);
174*9880d681SAndroid Build Coastguard Worker       }
175*9880d681SAndroid Build Coastguard Worker 
176*9880d681SAndroid Build Coastguard Worker       // Rewrite uses that are outside of the original def's block.
177*9880d681SAndroid Build Coastguard Worker       MachineRegisterInfo::use_iterator UI = MRI->use_begin(VReg);
178*9880d681SAndroid Build Coastguard Worker       while (UI != MRI->use_end()) {
179*9880d681SAndroid Build Coastguard Worker         MachineOperand &UseMO = *UI;
180*9880d681SAndroid Build Coastguard Worker         MachineInstr *UseMI = UseMO.getParent();
181*9880d681SAndroid Build Coastguard Worker         ++UI;
182*9880d681SAndroid Build Coastguard Worker         if (UseMI->isDebugValue()) {
183*9880d681SAndroid Build Coastguard Worker           // SSAUpdate can replace the use with an undef. That creates
184*9880d681SAndroid Build Coastguard Worker           // a debug instruction that is a kill.
185*9880d681SAndroid Build Coastguard Worker           // FIXME: Should it SSAUpdate job to delete debug instructions
186*9880d681SAndroid Build Coastguard Worker           // instead of replacing the use with undef?
187*9880d681SAndroid Build Coastguard Worker           UseMI->eraseFromParent();
188*9880d681SAndroid Build Coastguard Worker           continue;
189*9880d681SAndroid Build Coastguard Worker         }
190*9880d681SAndroid Build Coastguard Worker         if (UseMI->getParent() == DefBB && !UseMI->isPHI())
191*9880d681SAndroid Build Coastguard Worker           continue;
192*9880d681SAndroid Build Coastguard Worker         SSAUpdate.RewriteUse(UseMO);
193*9880d681SAndroid Build Coastguard Worker       }
194*9880d681SAndroid Build Coastguard Worker     }
195*9880d681SAndroid Build Coastguard Worker 
196*9880d681SAndroid Build Coastguard Worker     SSAUpdateVRs.clear();
197*9880d681SAndroid Build Coastguard Worker     SSAUpdateVals.clear();
198*9880d681SAndroid Build Coastguard Worker   }
199*9880d681SAndroid Build Coastguard Worker 
200*9880d681SAndroid Build Coastguard Worker   // Eliminate some of the copies inserted by tail duplication to maintain
201*9880d681SAndroid Build Coastguard Worker   // SSA form.
202*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 0, e = Copies.size(); i != e; ++i) {
203*9880d681SAndroid Build Coastguard Worker     MachineInstr *Copy = Copies[i];
204*9880d681SAndroid Build Coastguard Worker     if (!Copy->isCopy())
205*9880d681SAndroid Build Coastguard Worker       continue;
206*9880d681SAndroid Build Coastguard Worker     unsigned Dst = Copy->getOperand(0).getReg();
207*9880d681SAndroid Build Coastguard Worker     unsigned Src = Copy->getOperand(1).getReg();
208*9880d681SAndroid Build Coastguard Worker     if (MRI->hasOneNonDBGUse(Src) &&
209*9880d681SAndroid Build Coastguard Worker         MRI->constrainRegClass(Src, MRI->getRegClass(Dst))) {
210*9880d681SAndroid Build Coastguard Worker       // Copy is the only use. Do trivial copy propagation here.
211*9880d681SAndroid Build Coastguard Worker       MRI->replaceRegWith(Dst, Src);
212*9880d681SAndroid Build Coastguard Worker       Copy->eraseFromParent();
213*9880d681SAndroid Build Coastguard Worker     }
214*9880d681SAndroid Build Coastguard Worker   }
215*9880d681SAndroid Build Coastguard Worker 
216*9880d681SAndroid Build Coastguard Worker   if (NewPHIs.size())
217*9880d681SAndroid Build Coastguard Worker     NumAddedPHIs += NewPHIs.size();
218*9880d681SAndroid Build Coastguard Worker 
219*9880d681SAndroid Build Coastguard Worker   return true;
220*9880d681SAndroid Build Coastguard Worker }
221*9880d681SAndroid Build Coastguard Worker 
222*9880d681SAndroid Build Coastguard Worker /// Look for small blocks that are unconditionally branched to and do not fall
223*9880d681SAndroid Build Coastguard Worker /// through. Tail-duplicate their instructions into their predecessors to
224*9880d681SAndroid Build Coastguard Worker /// eliminate (dynamic) branches.
tailDuplicateBlocks(MachineFunction & MF)225*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::tailDuplicateBlocks(MachineFunction &MF) {
226*9880d681SAndroid Build Coastguard Worker   bool MadeChange = false;
227*9880d681SAndroid Build Coastguard Worker 
228*9880d681SAndroid Build Coastguard Worker   if (PreRegAlloc && TailDupVerify) {
229*9880d681SAndroid Build Coastguard Worker     DEBUG(dbgs() << "\n*** Before tail-duplicating\n");
230*9880d681SAndroid Build Coastguard Worker     VerifyPHIs(MF, true);
231*9880d681SAndroid Build Coastguard Worker   }
232*9880d681SAndroid Build Coastguard Worker 
233*9880d681SAndroid Build Coastguard Worker   for (MachineFunction::iterator I = ++MF.begin(), E = MF.end(); I != E;) {
234*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *MBB = &*I++;
235*9880d681SAndroid Build Coastguard Worker 
236*9880d681SAndroid Build Coastguard Worker     if (NumTails == TailDupLimit)
237*9880d681SAndroid Build Coastguard Worker       break;
238*9880d681SAndroid Build Coastguard Worker 
239*9880d681SAndroid Build Coastguard Worker     bool IsSimple = isSimpleBB(MBB);
240*9880d681SAndroid Build Coastguard Worker 
241*9880d681SAndroid Build Coastguard Worker     if (!shouldTailDuplicate(MF, IsSimple, *MBB))
242*9880d681SAndroid Build Coastguard Worker       continue;
243*9880d681SAndroid Build Coastguard Worker 
244*9880d681SAndroid Build Coastguard Worker     MadeChange |= tailDuplicateAndUpdate(MF, IsSimple, MBB);
245*9880d681SAndroid Build Coastguard Worker   }
246*9880d681SAndroid Build Coastguard Worker 
247*9880d681SAndroid Build Coastguard Worker   if (PreRegAlloc && TailDupVerify)
248*9880d681SAndroid Build Coastguard Worker     VerifyPHIs(MF, false);
249*9880d681SAndroid Build Coastguard Worker 
250*9880d681SAndroid Build Coastguard Worker   return MadeChange;
251*9880d681SAndroid Build Coastguard Worker }
252*9880d681SAndroid Build Coastguard Worker 
isDefLiveOut(unsigned Reg,MachineBasicBlock * BB,const MachineRegisterInfo * MRI)253*9880d681SAndroid Build Coastguard Worker static bool isDefLiveOut(unsigned Reg, MachineBasicBlock *BB,
254*9880d681SAndroid Build Coastguard Worker                          const MachineRegisterInfo *MRI) {
255*9880d681SAndroid Build Coastguard Worker   for (MachineInstr &UseMI : MRI->use_instructions(Reg)) {
256*9880d681SAndroid Build Coastguard Worker     if (UseMI.isDebugValue())
257*9880d681SAndroid Build Coastguard Worker       continue;
258*9880d681SAndroid Build Coastguard Worker     if (UseMI.getParent() != BB)
259*9880d681SAndroid Build Coastguard Worker       return true;
260*9880d681SAndroid Build Coastguard Worker   }
261*9880d681SAndroid Build Coastguard Worker   return false;
262*9880d681SAndroid Build Coastguard Worker }
263*9880d681SAndroid Build Coastguard Worker 
getPHISrcRegOpIdx(MachineInstr * MI,MachineBasicBlock * SrcBB)264*9880d681SAndroid Build Coastguard Worker static unsigned getPHISrcRegOpIdx(MachineInstr *MI, MachineBasicBlock *SrcBB) {
265*9880d681SAndroid Build Coastguard Worker   for (unsigned i = 1, e = MI->getNumOperands(); i != e; i += 2)
266*9880d681SAndroid Build Coastguard Worker     if (MI->getOperand(i + 1).getMBB() == SrcBB)
267*9880d681SAndroid Build Coastguard Worker       return i;
268*9880d681SAndroid Build Coastguard Worker   return 0;
269*9880d681SAndroid Build Coastguard Worker }
270*9880d681SAndroid Build Coastguard Worker 
271*9880d681SAndroid Build Coastguard Worker // Remember which registers are used by phis in this block. This is
272*9880d681SAndroid Build Coastguard Worker // used to determine which registers are liveout while modifying the
273*9880d681SAndroid Build Coastguard Worker // block (which is why we need to copy the information).
getRegsUsedByPHIs(const MachineBasicBlock & BB,DenseSet<unsigned> * UsedByPhi)274*9880d681SAndroid Build Coastguard Worker static void getRegsUsedByPHIs(const MachineBasicBlock &BB,
275*9880d681SAndroid Build Coastguard Worker                               DenseSet<unsigned> *UsedByPhi) {
276*9880d681SAndroid Build Coastguard Worker   for (const auto &MI : BB) {
277*9880d681SAndroid Build Coastguard Worker     if (!MI.isPHI())
278*9880d681SAndroid Build Coastguard Worker       break;
279*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 1, e = MI.getNumOperands(); i != e; i += 2) {
280*9880d681SAndroid Build Coastguard Worker       unsigned SrcReg = MI.getOperand(i).getReg();
281*9880d681SAndroid Build Coastguard Worker       UsedByPhi->insert(SrcReg);
282*9880d681SAndroid Build Coastguard Worker     }
283*9880d681SAndroid Build Coastguard Worker   }
284*9880d681SAndroid Build Coastguard Worker }
285*9880d681SAndroid Build Coastguard Worker 
286*9880d681SAndroid Build Coastguard Worker /// Add a definition and source virtual registers pair for SSA update.
addSSAUpdateEntry(unsigned OrigReg,unsigned NewReg,MachineBasicBlock * BB)287*9880d681SAndroid Build Coastguard Worker void TailDuplicator::addSSAUpdateEntry(unsigned OrigReg, unsigned NewReg,
288*9880d681SAndroid Build Coastguard Worker                                        MachineBasicBlock *BB) {
289*9880d681SAndroid Build Coastguard Worker   DenseMap<unsigned, AvailableValsTy>::iterator LI =
290*9880d681SAndroid Build Coastguard Worker       SSAUpdateVals.find(OrigReg);
291*9880d681SAndroid Build Coastguard Worker   if (LI != SSAUpdateVals.end())
292*9880d681SAndroid Build Coastguard Worker     LI->second.push_back(std::make_pair(BB, NewReg));
293*9880d681SAndroid Build Coastguard Worker   else {
294*9880d681SAndroid Build Coastguard Worker     AvailableValsTy Vals;
295*9880d681SAndroid Build Coastguard Worker     Vals.push_back(std::make_pair(BB, NewReg));
296*9880d681SAndroid Build Coastguard Worker     SSAUpdateVals.insert(std::make_pair(OrigReg, Vals));
297*9880d681SAndroid Build Coastguard Worker     SSAUpdateVRs.push_back(OrigReg);
298*9880d681SAndroid Build Coastguard Worker   }
299*9880d681SAndroid Build Coastguard Worker }
300*9880d681SAndroid Build Coastguard Worker 
301*9880d681SAndroid Build Coastguard Worker /// Process PHI node in TailBB by turning it into a copy in PredBB. Remember the
302*9880d681SAndroid Build Coastguard Worker /// source register that's contributed by PredBB and update SSA update map.
processPHI(MachineInstr * MI,MachineBasicBlock * TailBB,MachineBasicBlock * PredBB,DenseMap<unsigned,RegSubRegPair> & LocalVRMap,SmallVectorImpl<std::pair<unsigned,RegSubRegPair>> & Copies,const DenseSet<unsigned> & RegsUsedByPhi,bool Remove)303*9880d681SAndroid Build Coastguard Worker void TailDuplicator::processPHI(
304*9880d681SAndroid Build Coastguard Worker     MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
305*9880d681SAndroid Build Coastguard Worker     DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
306*9880d681SAndroid Build Coastguard Worker     SmallVectorImpl<std::pair<unsigned, RegSubRegPair>> &Copies,
307*9880d681SAndroid Build Coastguard Worker     const DenseSet<unsigned> &RegsUsedByPhi, bool Remove) {
308*9880d681SAndroid Build Coastguard Worker   unsigned DefReg = MI->getOperand(0).getReg();
309*9880d681SAndroid Build Coastguard Worker   unsigned SrcOpIdx = getPHISrcRegOpIdx(MI, PredBB);
310*9880d681SAndroid Build Coastguard Worker   assert(SrcOpIdx && "Unable to find matching PHI source?");
311*9880d681SAndroid Build Coastguard Worker   unsigned SrcReg = MI->getOperand(SrcOpIdx).getReg();
312*9880d681SAndroid Build Coastguard Worker   unsigned SrcSubReg = MI->getOperand(SrcOpIdx).getSubReg();
313*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *RC = MRI->getRegClass(DefReg);
314*9880d681SAndroid Build Coastguard Worker   LocalVRMap.insert(std::make_pair(DefReg, RegSubRegPair(SrcReg, SrcSubReg)));
315*9880d681SAndroid Build Coastguard Worker 
316*9880d681SAndroid Build Coastguard Worker   // Insert a copy from source to the end of the block. The def register is the
317*9880d681SAndroid Build Coastguard Worker   // available value liveout of the block.
318*9880d681SAndroid Build Coastguard Worker   unsigned NewDef = MRI->createVirtualRegister(RC);
319*9880d681SAndroid Build Coastguard Worker   Copies.push_back(std::make_pair(NewDef, RegSubRegPair(SrcReg, SrcSubReg)));
320*9880d681SAndroid Build Coastguard Worker   if (isDefLiveOut(DefReg, TailBB, MRI) || RegsUsedByPhi.count(DefReg))
321*9880d681SAndroid Build Coastguard Worker     addSSAUpdateEntry(DefReg, NewDef, PredBB);
322*9880d681SAndroid Build Coastguard Worker 
323*9880d681SAndroid Build Coastguard Worker   if (!Remove)
324*9880d681SAndroid Build Coastguard Worker     return;
325*9880d681SAndroid Build Coastguard Worker 
326*9880d681SAndroid Build Coastguard Worker   // Remove PredBB from the PHI node.
327*9880d681SAndroid Build Coastguard Worker   MI->RemoveOperand(SrcOpIdx + 1);
328*9880d681SAndroid Build Coastguard Worker   MI->RemoveOperand(SrcOpIdx);
329*9880d681SAndroid Build Coastguard Worker   if (MI->getNumOperands() == 1)
330*9880d681SAndroid Build Coastguard Worker     MI->eraseFromParent();
331*9880d681SAndroid Build Coastguard Worker }
332*9880d681SAndroid Build Coastguard Worker 
333*9880d681SAndroid Build Coastguard Worker /// Duplicate a TailBB instruction to PredBB and update
334*9880d681SAndroid Build Coastguard Worker /// the source operands due to earlier PHI translation.
duplicateInstruction(MachineInstr * MI,MachineBasicBlock * TailBB,MachineBasicBlock * PredBB,MachineFunction & MF,DenseMap<unsigned,RegSubRegPair> & LocalVRMap,const DenseSet<unsigned> & UsedByPhi)335*9880d681SAndroid Build Coastguard Worker void TailDuplicator::duplicateInstruction(
336*9880d681SAndroid Build Coastguard Worker     MachineInstr *MI, MachineBasicBlock *TailBB, MachineBasicBlock *PredBB,
337*9880d681SAndroid Build Coastguard Worker     MachineFunction &MF,
338*9880d681SAndroid Build Coastguard Worker     DenseMap<unsigned, RegSubRegPair> &LocalVRMap,
339*9880d681SAndroid Build Coastguard Worker     const DenseSet<unsigned> &UsedByPhi) {
340*9880d681SAndroid Build Coastguard Worker   MachineInstr *NewMI = TII->duplicate(*MI, MF);
341*9880d681SAndroid Build Coastguard Worker   if (PreRegAlloc) {
342*9880d681SAndroid Build Coastguard Worker     for (unsigned i = 0, e = NewMI->getNumOperands(); i != e; ++i) {
343*9880d681SAndroid Build Coastguard Worker       MachineOperand &MO = NewMI->getOperand(i);
344*9880d681SAndroid Build Coastguard Worker       if (!MO.isReg())
345*9880d681SAndroid Build Coastguard Worker         continue;
346*9880d681SAndroid Build Coastguard Worker       unsigned Reg = MO.getReg();
347*9880d681SAndroid Build Coastguard Worker       if (!TargetRegisterInfo::isVirtualRegister(Reg))
348*9880d681SAndroid Build Coastguard Worker         continue;
349*9880d681SAndroid Build Coastguard Worker       if (MO.isDef()) {
350*9880d681SAndroid Build Coastguard Worker         const TargetRegisterClass *RC = MRI->getRegClass(Reg);
351*9880d681SAndroid Build Coastguard Worker         unsigned NewReg = MRI->createVirtualRegister(RC);
352*9880d681SAndroid Build Coastguard Worker         MO.setReg(NewReg);
353*9880d681SAndroid Build Coastguard Worker         LocalVRMap.insert(std::make_pair(Reg, RegSubRegPair(NewReg, 0)));
354*9880d681SAndroid Build Coastguard Worker         if (isDefLiveOut(Reg, TailBB, MRI) || UsedByPhi.count(Reg))
355*9880d681SAndroid Build Coastguard Worker           addSSAUpdateEntry(Reg, NewReg, PredBB);
356*9880d681SAndroid Build Coastguard Worker       } else {
357*9880d681SAndroid Build Coastguard Worker         auto VI = LocalVRMap.find(Reg);
358*9880d681SAndroid Build Coastguard Worker         if (VI != LocalVRMap.end()) {
359*9880d681SAndroid Build Coastguard Worker           // Need to make sure that the register class of the mapped register
360*9880d681SAndroid Build Coastguard Worker           // will satisfy the constraints of the class of the register being
361*9880d681SAndroid Build Coastguard Worker           // replaced.
362*9880d681SAndroid Build Coastguard Worker           auto *OrigRC = MRI->getRegClass(Reg);
363*9880d681SAndroid Build Coastguard Worker           auto *MappedRC = MRI->getRegClass(VI->second.Reg);
364*9880d681SAndroid Build Coastguard Worker           const TargetRegisterClass *ConstrRC;
365*9880d681SAndroid Build Coastguard Worker           if (VI->second.SubReg != 0) {
366*9880d681SAndroid Build Coastguard Worker             ConstrRC = TRI->getMatchingSuperRegClass(MappedRC, OrigRC,
367*9880d681SAndroid Build Coastguard Worker                                                      VI->second.SubReg);
368*9880d681SAndroid Build Coastguard Worker             if (ConstrRC) {
369*9880d681SAndroid Build Coastguard Worker               // The actual constraining (as in "find appropriate new class")
370*9880d681SAndroid Build Coastguard Worker               // is done by getMatchingSuperRegClass, so now we only need to
371*9880d681SAndroid Build Coastguard Worker               // change the class of the mapped register.
372*9880d681SAndroid Build Coastguard Worker               MRI->setRegClass(VI->second.Reg, ConstrRC);
373*9880d681SAndroid Build Coastguard Worker             }
374*9880d681SAndroid Build Coastguard Worker           } else {
375*9880d681SAndroid Build Coastguard Worker             // For mapped registers that do not have sub-registers, simply
376*9880d681SAndroid Build Coastguard Worker             // restrict their class to match the original one.
377*9880d681SAndroid Build Coastguard Worker             ConstrRC = MRI->constrainRegClass(VI->second.Reg, OrigRC);
378*9880d681SAndroid Build Coastguard Worker           }
379*9880d681SAndroid Build Coastguard Worker 
380*9880d681SAndroid Build Coastguard Worker           if (ConstrRC) {
381*9880d681SAndroid Build Coastguard Worker             // If the class constraining succeeded, we can simply replace
382*9880d681SAndroid Build Coastguard Worker             // the old register with the mapped one.
383*9880d681SAndroid Build Coastguard Worker             MO.setReg(VI->second.Reg);
384*9880d681SAndroid Build Coastguard Worker             // We have Reg -> VI.Reg:VI.SubReg, so if Reg is used with a
385*9880d681SAndroid Build Coastguard Worker             // sub-register, we need to compose the sub-register indices.
386*9880d681SAndroid Build Coastguard Worker             MO.setSubReg(TRI->composeSubRegIndices(MO.getSubReg(),
387*9880d681SAndroid Build Coastguard Worker                                                    VI->second.SubReg));
388*9880d681SAndroid Build Coastguard Worker           } else {
389*9880d681SAndroid Build Coastguard Worker             // The direct replacement is not possible, due to failing register
390*9880d681SAndroid Build Coastguard Worker             // class constraints. An explicit COPY is necessary. Create one
391*9880d681SAndroid Build Coastguard Worker             // that can be reused
392*9880d681SAndroid Build Coastguard Worker             auto *NewRC = MI->getRegClassConstraint(i, TII, TRI);
393*9880d681SAndroid Build Coastguard Worker             if (NewRC == nullptr)
394*9880d681SAndroid Build Coastguard Worker               NewRC = OrigRC;
395*9880d681SAndroid Build Coastguard Worker             unsigned NewReg = MRI->createVirtualRegister(NewRC);
396*9880d681SAndroid Build Coastguard Worker             BuildMI(*PredBB, MI, MI->getDebugLoc(),
397*9880d681SAndroid Build Coastguard Worker                     TII->get(TargetOpcode::COPY), NewReg)
398*9880d681SAndroid Build Coastguard Worker                 .addReg(VI->second.Reg, 0, VI->second.SubReg);
399*9880d681SAndroid Build Coastguard Worker             LocalVRMap.erase(VI);
400*9880d681SAndroid Build Coastguard Worker             LocalVRMap.insert(std::make_pair(Reg, RegSubRegPair(NewReg, 0)));
401*9880d681SAndroid Build Coastguard Worker             MO.setReg(NewReg);
402*9880d681SAndroid Build Coastguard Worker             // The composed VI.Reg:VI.SubReg is replaced with NewReg, which
403*9880d681SAndroid Build Coastguard Worker             // is equivalent to the whole register Reg. Hence, Reg:subreg
404*9880d681SAndroid Build Coastguard Worker             // is same as NewReg:subreg, so keep the sub-register index
405*9880d681SAndroid Build Coastguard Worker             // unchanged.
406*9880d681SAndroid Build Coastguard Worker           }
407*9880d681SAndroid Build Coastguard Worker           // Clear any kill flags from this operand.  The new register could
408*9880d681SAndroid Build Coastguard Worker           // have uses after this one, so kills are not valid here.
409*9880d681SAndroid Build Coastguard Worker           MO.setIsKill(false);
410*9880d681SAndroid Build Coastguard Worker         }
411*9880d681SAndroid Build Coastguard Worker       }
412*9880d681SAndroid Build Coastguard Worker     }
413*9880d681SAndroid Build Coastguard Worker   }
414*9880d681SAndroid Build Coastguard Worker   PredBB->insert(PredBB->instr_end(), NewMI);
415*9880d681SAndroid Build Coastguard Worker }
416*9880d681SAndroid Build Coastguard Worker 
417*9880d681SAndroid Build Coastguard Worker /// After FromBB is tail duplicated into its predecessor blocks, the successors
418*9880d681SAndroid Build Coastguard Worker /// have gained new predecessors. Update the PHI instructions in them
419*9880d681SAndroid Build Coastguard Worker /// accordingly.
updateSuccessorsPHIs(MachineBasicBlock * FromBB,bool isDead,SmallVectorImpl<MachineBasicBlock * > & TDBBs,SmallSetVector<MachineBasicBlock *,8> & Succs)420*9880d681SAndroid Build Coastguard Worker void TailDuplicator::updateSuccessorsPHIs(
421*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *FromBB, bool isDead,
422*9880d681SAndroid Build Coastguard Worker     SmallVectorImpl<MachineBasicBlock *> &TDBBs,
423*9880d681SAndroid Build Coastguard Worker     SmallSetVector<MachineBasicBlock *, 8> &Succs) {
424*9880d681SAndroid Build Coastguard Worker   for (SmallSetVector<MachineBasicBlock *, 8>::iterator SI = Succs.begin(),
425*9880d681SAndroid Build Coastguard Worker                                                         SE = Succs.end();
426*9880d681SAndroid Build Coastguard Worker        SI != SE; ++SI) {
427*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *SuccBB = *SI;
428*9880d681SAndroid Build Coastguard Worker     for (MachineBasicBlock::iterator II = SuccBB->begin(), EE = SuccBB->end();
429*9880d681SAndroid Build Coastguard Worker          II != EE; ++II) {
430*9880d681SAndroid Build Coastguard Worker       if (!II->isPHI())
431*9880d681SAndroid Build Coastguard Worker         break;
432*9880d681SAndroid Build Coastguard Worker       MachineInstrBuilder MIB(*FromBB->getParent(), II);
433*9880d681SAndroid Build Coastguard Worker       unsigned Idx = 0;
434*9880d681SAndroid Build Coastguard Worker       for (unsigned i = 1, e = II->getNumOperands(); i != e; i += 2) {
435*9880d681SAndroid Build Coastguard Worker         MachineOperand &MO = II->getOperand(i + 1);
436*9880d681SAndroid Build Coastguard Worker         if (MO.getMBB() == FromBB) {
437*9880d681SAndroid Build Coastguard Worker           Idx = i;
438*9880d681SAndroid Build Coastguard Worker           break;
439*9880d681SAndroid Build Coastguard Worker         }
440*9880d681SAndroid Build Coastguard Worker       }
441*9880d681SAndroid Build Coastguard Worker 
442*9880d681SAndroid Build Coastguard Worker       assert(Idx != 0);
443*9880d681SAndroid Build Coastguard Worker       MachineOperand &MO0 = II->getOperand(Idx);
444*9880d681SAndroid Build Coastguard Worker       unsigned Reg = MO0.getReg();
445*9880d681SAndroid Build Coastguard Worker       if (isDead) {
446*9880d681SAndroid Build Coastguard Worker         // Folded into the previous BB.
447*9880d681SAndroid Build Coastguard Worker         // There could be duplicate phi source entries. FIXME: Should sdisel
448*9880d681SAndroid Build Coastguard Worker         // or earlier pass fixed this?
449*9880d681SAndroid Build Coastguard Worker         for (unsigned i = II->getNumOperands() - 2; i != Idx; i -= 2) {
450*9880d681SAndroid Build Coastguard Worker           MachineOperand &MO = II->getOperand(i + 1);
451*9880d681SAndroid Build Coastguard Worker           if (MO.getMBB() == FromBB) {
452*9880d681SAndroid Build Coastguard Worker             II->RemoveOperand(i + 1);
453*9880d681SAndroid Build Coastguard Worker             II->RemoveOperand(i);
454*9880d681SAndroid Build Coastguard Worker           }
455*9880d681SAndroid Build Coastguard Worker         }
456*9880d681SAndroid Build Coastguard Worker       } else
457*9880d681SAndroid Build Coastguard Worker         Idx = 0;
458*9880d681SAndroid Build Coastguard Worker 
459*9880d681SAndroid Build Coastguard Worker       // If Idx is set, the operands at Idx and Idx+1 must be removed.
460*9880d681SAndroid Build Coastguard Worker       // We reuse the location to avoid expensive RemoveOperand calls.
461*9880d681SAndroid Build Coastguard Worker 
462*9880d681SAndroid Build Coastguard Worker       DenseMap<unsigned, AvailableValsTy>::iterator LI =
463*9880d681SAndroid Build Coastguard Worker           SSAUpdateVals.find(Reg);
464*9880d681SAndroid Build Coastguard Worker       if (LI != SSAUpdateVals.end()) {
465*9880d681SAndroid Build Coastguard Worker         // This register is defined in the tail block.
466*9880d681SAndroid Build Coastguard Worker         for (unsigned j = 0, ee = LI->second.size(); j != ee; ++j) {
467*9880d681SAndroid Build Coastguard Worker           MachineBasicBlock *SrcBB = LI->second[j].first;
468*9880d681SAndroid Build Coastguard Worker           // If we didn't duplicate a bb into a particular predecessor, we
469*9880d681SAndroid Build Coastguard Worker           // might still have added an entry to SSAUpdateVals to correcly
470*9880d681SAndroid Build Coastguard Worker           // recompute SSA. If that case, avoid adding a dummy extra argument
471*9880d681SAndroid Build Coastguard Worker           // this PHI.
472*9880d681SAndroid Build Coastguard Worker           if (!SrcBB->isSuccessor(SuccBB))
473*9880d681SAndroid Build Coastguard Worker             continue;
474*9880d681SAndroid Build Coastguard Worker 
475*9880d681SAndroid Build Coastguard Worker           unsigned SrcReg = LI->second[j].second;
476*9880d681SAndroid Build Coastguard Worker           if (Idx != 0) {
477*9880d681SAndroid Build Coastguard Worker             II->getOperand(Idx).setReg(SrcReg);
478*9880d681SAndroid Build Coastguard Worker             II->getOperand(Idx + 1).setMBB(SrcBB);
479*9880d681SAndroid Build Coastguard Worker             Idx = 0;
480*9880d681SAndroid Build Coastguard Worker           } else {
481*9880d681SAndroid Build Coastguard Worker             MIB.addReg(SrcReg).addMBB(SrcBB);
482*9880d681SAndroid Build Coastguard Worker           }
483*9880d681SAndroid Build Coastguard Worker         }
484*9880d681SAndroid Build Coastguard Worker       } else {
485*9880d681SAndroid Build Coastguard Worker         // Live in tail block, must also be live in predecessors.
486*9880d681SAndroid Build Coastguard Worker         for (unsigned j = 0, ee = TDBBs.size(); j != ee; ++j) {
487*9880d681SAndroid Build Coastguard Worker           MachineBasicBlock *SrcBB = TDBBs[j];
488*9880d681SAndroid Build Coastguard Worker           if (Idx != 0) {
489*9880d681SAndroid Build Coastguard Worker             II->getOperand(Idx).setReg(Reg);
490*9880d681SAndroid Build Coastguard Worker             II->getOperand(Idx + 1).setMBB(SrcBB);
491*9880d681SAndroid Build Coastguard Worker             Idx = 0;
492*9880d681SAndroid Build Coastguard Worker           } else {
493*9880d681SAndroid Build Coastguard Worker             MIB.addReg(Reg).addMBB(SrcBB);
494*9880d681SAndroid Build Coastguard Worker           }
495*9880d681SAndroid Build Coastguard Worker         }
496*9880d681SAndroid Build Coastguard Worker       }
497*9880d681SAndroid Build Coastguard Worker       if (Idx != 0) {
498*9880d681SAndroid Build Coastguard Worker         II->RemoveOperand(Idx + 1);
499*9880d681SAndroid Build Coastguard Worker         II->RemoveOperand(Idx);
500*9880d681SAndroid Build Coastguard Worker       }
501*9880d681SAndroid Build Coastguard Worker     }
502*9880d681SAndroid Build Coastguard Worker   }
503*9880d681SAndroid Build Coastguard Worker }
504*9880d681SAndroid Build Coastguard Worker 
505*9880d681SAndroid Build Coastguard Worker /// Determine if it is profitable to duplicate this block.
shouldTailDuplicate(const MachineFunction & MF,bool IsSimple,MachineBasicBlock & TailBB)506*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::shouldTailDuplicate(const MachineFunction &MF,
507*9880d681SAndroid Build Coastguard Worker                                          bool IsSimple,
508*9880d681SAndroid Build Coastguard Worker                                          MachineBasicBlock &TailBB) {
509*9880d681SAndroid Build Coastguard Worker   // Only duplicate blocks that end with unconditional branches.
510*9880d681SAndroid Build Coastguard Worker   if (TailBB.canFallThrough())
511*9880d681SAndroid Build Coastguard Worker     return false;
512*9880d681SAndroid Build Coastguard Worker 
513*9880d681SAndroid Build Coastguard Worker   // Don't try to tail-duplicate single-block loops.
514*9880d681SAndroid Build Coastguard Worker   if (TailBB.isSuccessor(&TailBB))
515*9880d681SAndroid Build Coastguard Worker     return false;
516*9880d681SAndroid Build Coastguard Worker 
517*9880d681SAndroid Build Coastguard Worker   // Set the limit on the cost to duplicate. When optimizing for size,
518*9880d681SAndroid Build Coastguard Worker   // duplicate only one, because one branch instruction can be eliminated to
519*9880d681SAndroid Build Coastguard Worker   // compensate for the duplication.
520*9880d681SAndroid Build Coastguard Worker   unsigned MaxDuplicateCount;
521*9880d681SAndroid Build Coastguard Worker   if (TailDuplicateSize.getNumOccurrences() == 0 &&
522*9880d681SAndroid Build Coastguard Worker       // FIXME: Use Function::optForSize().
523*9880d681SAndroid Build Coastguard Worker       MF.getFunction()->hasFnAttribute(Attribute::OptimizeForSize))
524*9880d681SAndroid Build Coastguard Worker     MaxDuplicateCount = 1;
525*9880d681SAndroid Build Coastguard Worker   else
526*9880d681SAndroid Build Coastguard Worker     MaxDuplicateCount = TailDuplicateSize;
527*9880d681SAndroid Build Coastguard Worker 
528*9880d681SAndroid Build Coastguard Worker   // If the target has hardware branch prediction that can handle indirect
529*9880d681SAndroid Build Coastguard Worker   // branches, duplicating them can often make them predictable when there
530*9880d681SAndroid Build Coastguard Worker   // are common paths through the code.  The limit needs to be high enough
531*9880d681SAndroid Build Coastguard Worker   // to allow undoing the effects of tail merging and other optimizations
532*9880d681SAndroid Build Coastguard Worker   // that rearrange the predecessors of the indirect branch.
533*9880d681SAndroid Build Coastguard Worker 
534*9880d681SAndroid Build Coastguard Worker   bool HasIndirectbr = false;
535*9880d681SAndroid Build Coastguard Worker   if (!TailBB.empty())
536*9880d681SAndroid Build Coastguard Worker     HasIndirectbr = TailBB.back().isIndirectBranch();
537*9880d681SAndroid Build Coastguard Worker 
538*9880d681SAndroid Build Coastguard Worker   if (HasIndirectbr && PreRegAlloc)
539*9880d681SAndroid Build Coastguard Worker     MaxDuplicateCount = 20;
540*9880d681SAndroid Build Coastguard Worker 
541*9880d681SAndroid Build Coastguard Worker   // Check the instructions in the block to determine whether tail-duplication
542*9880d681SAndroid Build Coastguard Worker   // is invalid or unlikely to be profitable.
543*9880d681SAndroid Build Coastguard Worker   unsigned InstrCount = 0;
544*9880d681SAndroid Build Coastguard Worker   for (MachineInstr &MI : TailBB) {
545*9880d681SAndroid Build Coastguard Worker     // Non-duplicable things shouldn't be tail-duplicated.
546*9880d681SAndroid Build Coastguard Worker     if (MI.isNotDuplicable())
547*9880d681SAndroid Build Coastguard Worker       return false;
548*9880d681SAndroid Build Coastguard Worker 
549*9880d681SAndroid Build Coastguard Worker     // Convergent instructions can be duplicated only if doing so doesn't add
550*9880d681SAndroid Build Coastguard Worker     // new control dependencies, which is what we're going to do here.
551*9880d681SAndroid Build Coastguard Worker     if (MI.isConvergent())
552*9880d681SAndroid Build Coastguard Worker       return false;
553*9880d681SAndroid Build Coastguard Worker 
554*9880d681SAndroid Build Coastguard Worker     // Do not duplicate 'return' instructions if this is a pre-regalloc run.
555*9880d681SAndroid Build Coastguard Worker     // A return may expand into a lot more instructions (e.g. reload of callee
556*9880d681SAndroid Build Coastguard Worker     // saved registers) after PEI.
557*9880d681SAndroid Build Coastguard Worker     if (PreRegAlloc && MI.isReturn())
558*9880d681SAndroid Build Coastguard Worker       return false;
559*9880d681SAndroid Build Coastguard Worker 
560*9880d681SAndroid Build Coastguard Worker     // Avoid duplicating calls before register allocation. Calls presents a
561*9880d681SAndroid Build Coastguard Worker     // barrier to register allocation so duplicating them may end up increasing
562*9880d681SAndroid Build Coastguard Worker     // spills.
563*9880d681SAndroid Build Coastguard Worker     if (PreRegAlloc && MI.isCall())
564*9880d681SAndroid Build Coastguard Worker       return false;
565*9880d681SAndroid Build Coastguard Worker 
566*9880d681SAndroid Build Coastguard Worker     if (!MI.isPHI() && !MI.isDebugValue())
567*9880d681SAndroid Build Coastguard Worker       InstrCount += 1;
568*9880d681SAndroid Build Coastguard Worker 
569*9880d681SAndroid Build Coastguard Worker     if (InstrCount > MaxDuplicateCount)
570*9880d681SAndroid Build Coastguard Worker       return false;
571*9880d681SAndroid Build Coastguard Worker   }
572*9880d681SAndroid Build Coastguard Worker 
573*9880d681SAndroid Build Coastguard Worker   // Check if any of the successors of TailBB has a PHI node in which the
574*9880d681SAndroid Build Coastguard Worker   // value corresponding to TailBB uses a subregister.
575*9880d681SAndroid Build Coastguard Worker   // If a phi node uses a register paired with a subregister, the actual
576*9880d681SAndroid Build Coastguard Worker   // "value type" of the phi may differ from the type of the register without
577*9880d681SAndroid Build Coastguard Worker   // any subregisters. Due to a bug, tail duplication may add a new operand
578*9880d681SAndroid Build Coastguard Worker   // without a necessary subregister, producing an invalid code. This is
579*9880d681SAndroid Build Coastguard Worker   // demonstrated by test/CodeGen/Hexagon/tail-dup-subreg-abort.ll.
580*9880d681SAndroid Build Coastguard Worker   // Disable tail duplication for this case for now, until the problem is
581*9880d681SAndroid Build Coastguard Worker   // fixed.
582*9880d681SAndroid Build Coastguard Worker   for (auto SB : TailBB.successors()) {
583*9880d681SAndroid Build Coastguard Worker     for (auto &I : *SB) {
584*9880d681SAndroid Build Coastguard Worker       if (!I.isPHI())
585*9880d681SAndroid Build Coastguard Worker         break;
586*9880d681SAndroid Build Coastguard Worker       unsigned Idx = getPHISrcRegOpIdx(&I, &TailBB);
587*9880d681SAndroid Build Coastguard Worker       assert(Idx != 0);
588*9880d681SAndroid Build Coastguard Worker       MachineOperand &PU = I.getOperand(Idx);
589*9880d681SAndroid Build Coastguard Worker       if (PU.getSubReg() != 0)
590*9880d681SAndroid Build Coastguard Worker         return false;
591*9880d681SAndroid Build Coastguard Worker     }
592*9880d681SAndroid Build Coastguard Worker   }
593*9880d681SAndroid Build Coastguard Worker 
594*9880d681SAndroid Build Coastguard Worker   if (HasIndirectbr && PreRegAlloc)
595*9880d681SAndroid Build Coastguard Worker     return true;
596*9880d681SAndroid Build Coastguard Worker 
597*9880d681SAndroid Build Coastguard Worker   if (IsSimple)
598*9880d681SAndroid Build Coastguard Worker     return true;
599*9880d681SAndroid Build Coastguard Worker 
600*9880d681SAndroid Build Coastguard Worker   if (!PreRegAlloc)
601*9880d681SAndroid Build Coastguard Worker     return true;
602*9880d681SAndroid Build Coastguard Worker 
603*9880d681SAndroid Build Coastguard Worker   return canCompletelyDuplicateBB(TailBB);
604*9880d681SAndroid Build Coastguard Worker }
605*9880d681SAndroid Build Coastguard Worker 
606*9880d681SAndroid Build Coastguard Worker /// True if this BB has only one unconditional jump.
isSimpleBB(MachineBasicBlock * TailBB)607*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::isSimpleBB(MachineBasicBlock *TailBB) {
608*9880d681SAndroid Build Coastguard Worker   if (TailBB->succ_size() != 1)
609*9880d681SAndroid Build Coastguard Worker     return false;
610*9880d681SAndroid Build Coastguard Worker   if (TailBB->pred_empty())
611*9880d681SAndroid Build Coastguard Worker     return false;
612*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock::iterator I = TailBB->getFirstNonDebugInstr();
613*9880d681SAndroid Build Coastguard Worker   if (I == TailBB->end())
614*9880d681SAndroid Build Coastguard Worker     return true;
615*9880d681SAndroid Build Coastguard Worker   return I->isUnconditionalBranch();
616*9880d681SAndroid Build Coastguard Worker }
617*9880d681SAndroid Build Coastguard Worker 
bothUsedInPHI(const MachineBasicBlock & A,const SmallPtrSet<MachineBasicBlock *,8> & SuccsB)618*9880d681SAndroid Build Coastguard Worker static bool bothUsedInPHI(const MachineBasicBlock &A,
619*9880d681SAndroid Build Coastguard Worker                           const SmallPtrSet<MachineBasicBlock *, 8> &SuccsB) {
620*9880d681SAndroid Build Coastguard Worker   for (MachineBasicBlock *BB : A.successors())
621*9880d681SAndroid Build Coastguard Worker     if (SuccsB.count(BB) && !BB->empty() && BB->begin()->isPHI())
622*9880d681SAndroid Build Coastguard Worker       return true;
623*9880d681SAndroid Build Coastguard Worker 
624*9880d681SAndroid Build Coastguard Worker   return false;
625*9880d681SAndroid Build Coastguard Worker }
626*9880d681SAndroid Build Coastguard Worker 
canCompletelyDuplicateBB(MachineBasicBlock & BB)627*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::canCompletelyDuplicateBB(MachineBasicBlock &BB) {
628*9880d681SAndroid Build Coastguard Worker   for (MachineBasicBlock *PredBB : BB.predecessors()) {
629*9880d681SAndroid Build Coastguard Worker     if (PredBB->succ_size() > 1)
630*9880d681SAndroid Build Coastguard Worker       return false;
631*9880d681SAndroid Build Coastguard Worker 
632*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
633*9880d681SAndroid Build Coastguard Worker     SmallVector<MachineOperand, 4> PredCond;
634*9880d681SAndroid Build Coastguard Worker     if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
635*9880d681SAndroid Build Coastguard Worker       return false;
636*9880d681SAndroid Build Coastguard Worker 
637*9880d681SAndroid Build Coastguard Worker     if (!PredCond.empty())
638*9880d681SAndroid Build Coastguard Worker       return false;
639*9880d681SAndroid Build Coastguard Worker   }
640*9880d681SAndroid Build Coastguard Worker   return true;
641*9880d681SAndroid Build Coastguard Worker }
642*9880d681SAndroid Build Coastguard Worker 
duplicateSimpleBB(MachineBasicBlock * TailBB,SmallVectorImpl<MachineBasicBlock * > & TDBBs,const DenseSet<unsigned> & UsedByPhi,SmallVectorImpl<MachineInstr * > & Copies)643*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::duplicateSimpleBB(
644*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *TailBB, SmallVectorImpl<MachineBasicBlock *> &TDBBs,
645*9880d681SAndroid Build Coastguard Worker     const DenseSet<unsigned> &UsedByPhi,
646*9880d681SAndroid Build Coastguard Worker     SmallVectorImpl<MachineInstr *> &Copies) {
647*9880d681SAndroid Build Coastguard Worker   SmallPtrSet<MachineBasicBlock *, 8> Succs(TailBB->succ_begin(),
648*9880d681SAndroid Build Coastguard Worker                                             TailBB->succ_end());
649*9880d681SAndroid Build Coastguard Worker   SmallVector<MachineBasicBlock *, 8> Preds(TailBB->pred_begin(),
650*9880d681SAndroid Build Coastguard Worker                                             TailBB->pred_end());
651*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
652*9880d681SAndroid Build Coastguard Worker   for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
653*9880d681SAndroid Build Coastguard Worker                                                         PE = Preds.end();
654*9880d681SAndroid Build Coastguard Worker        PI != PE; ++PI) {
655*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredBB = *PI;
656*9880d681SAndroid Build Coastguard Worker 
657*9880d681SAndroid Build Coastguard Worker     if (PredBB->hasEHPadSuccessor())
658*9880d681SAndroid Build Coastguard Worker       continue;
659*9880d681SAndroid Build Coastguard Worker 
660*9880d681SAndroid Build Coastguard Worker     if (bothUsedInPHI(*PredBB, Succs))
661*9880d681SAndroid Build Coastguard Worker       continue;
662*9880d681SAndroid Build Coastguard Worker 
663*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredTBB = nullptr, *PredFBB = nullptr;
664*9880d681SAndroid Build Coastguard Worker     SmallVector<MachineOperand, 4> PredCond;
665*9880d681SAndroid Build Coastguard Worker     if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
666*9880d681SAndroid Build Coastguard Worker       continue;
667*9880d681SAndroid Build Coastguard Worker 
668*9880d681SAndroid Build Coastguard Worker     Changed = true;
669*9880d681SAndroid Build Coastguard Worker     DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
670*9880d681SAndroid Build Coastguard Worker                  << "From simple Succ: " << *TailBB);
671*9880d681SAndroid Build Coastguard Worker 
672*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *NewTarget = *TailBB->succ_begin();
673*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *NextBB = &*std::next(PredBB->getIterator());
674*9880d681SAndroid Build Coastguard Worker 
675*9880d681SAndroid Build Coastguard Worker     // Make PredFBB explicit.
676*9880d681SAndroid Build Coastguard Worker     if (PredCond.empty())
677*9880d681SAndroid Build Coastguard Worker       PredFBB = PredTBB;
678*9880d681SAndroid Build Coastguard Worker 
679*9880d681SAndroid Build Coastguard Worker     // Make fall through explicit.
680*9880d681SAndroid Build Coastguard Worker     if (!PredTBB)
681*9880d681SAndroid Build Coastguard Worker       PredTBB = NextBB;
682*9880d681SAndroid Build Coastguard Worker     if (!PredFBB)
683*9880d681SAndroid Build Coastguard Worker       PredFBB = NextBB;
684*9880d681SAndroid Build Coastguard Worker 
685*9880d681SAndroid Build Coastguard Worker     // Redirect
686*9880d681SAndroid Build Coastguard Worker     if (PredFBB == TailBB)
687*9880d681SAndroid Build Coastguard Worker       PredFBB = NewTarget;
688*9880d681SAndroid Build Coastguard Worker     if (PredTBB == TailBB)
689*9880d681SAndroid Build Coastguard Worker       PredTBB = NewTarget;
690*9880d681SAndroid Build Coastguard Worker 
691*9880d681SAndroid Build Coastguard Worker     // Make the branch unconditional if possible
692*9880d681SAndroid Build Coastguard Worker     if (PredTBB == PredFBB) {
693*9880d681SAndroid Build Coastguard Worker       PredCond.clear();
694*9880d681SAndroid Build Coastguard Worker       PredFBB = nullptr;
695*9880d681SAndroid Build Coastguard Worker     }
696*9880d681SAndroid Build Coastguard Worker 
697*9880d681SAndroid Build Coastguard Worker     // Avoid adding fall through branches.
698*9880d681SAndroid Build Coastguard Worker     if (PredFBB == NextBB)
699*9880d681SAndroid Build Coastguard Worker       PredFBB = nullptr;
700*9880d681SAndroid Build Coastguard Worker     if (PredTBB == NextBB && PredFBB == nullptr)
701*9880d681SAndroid Build Coastguard Worker       PredTBB = nullptr;
702*9880d681SAndroid Build Coastguard Worker 
703*9880d681SAndroid Build Coastguard Worker     TII->RemoveBranch(*PredBB);
704*9880d681SAndroid Build Coastguard Worker 
705*9880d681SAndroid Build Coastguard Worker     if (!PredBB->isSuccessor(NewTarget))
706*9880d681SAndroid Build Coastguard Worker       PredBB->replaceSuccessor(TailBB, NewTarget);
707*9880d681SAndroid Build Coastguard Worker     else {
708*9880d681SAndroid Build Coastguard Worker       PredBB->removeSuccessor(TailBB, true);
709*9880d681SAndroid Build Coastguard Worker       assert(PredBB->succ_size() <= 1);
710*9880d681SAndroid Build Coastguard Worker     }
711*9880d681SAndroid Build Coastguard Worker 
712*9880d681SAndroid Build Coastguard Worker     if (PredTBB)
713*9880d681SAndroid Build Coastguard Worker       TII->InsertBranch(*PredBB, PredTBB, PredFBB, PredCond, DebugLoc());
714*9880d681SAndroid Build Coastguard Worker 
715*9880d681SAndroid Build Coastguard Worker     TDBBs.push_back(PredBB);
716*9880d681SAndroid Build Coastguard Worker   }
717*9880d681SAndroid Build Coastguard Worker   return Changed;
718*9880d681SAndroid Build Coastguard Worker }
719*9880d681SAndroid Build Coastguard Worker 
720*9880d681SAndroid Build Coastguard Worker /// If it is profitable, duplicate TailBB's contents in each
721*9880d681SAndroid Build Coastguard Worker /// of its predecessors.
tailDuplicate(MachineFunction & MF,bool IsSimple,MachineBasicBlock * TailBB,SmallVectorImpl<MachineBasicBlock * > & TDBBs,SmallVectorImpl<MachineInstr * > & Copies)722*9880d681SAndroid Build Coastguard Worker bool TailDuplicator::tailDuplicate(MachineFunction &MF, bool IsSimple,
723*9880d681SAndroid Build Coastguard Worker                                    MachineBasicBlock *TailBB,
724*9880d681SAndroid Build Coastguard Worker                                    SmallVectorImpl<MachineBasicBlock *> &TDBBs,
725*9880d681SAndroid Build Coastguard Worker                                    SmallVectorImpl<MachineInstr *> &Copies) {
726*9880d681SAndroid Build Coastguard Worker   DEBUG(dbgs() << "\n*** Tail-duplicating BB#" << TailBB->getNumber() << '\n');
727*9880d681SAndroid Build Coastguard Worker 
728*9880d681SAndroid Build Coastguard Worker   DenseSet<unsigned> UsedByPhi;
729*9880d681SAndroid Build Coastguard Worker   getRegsUsedByPHIs(*TailBB, &UsedByPhi);
730*9880d681SAndroid Build Coastguard Worker 
731*9880d681SAndroid Build Coastguard Worker   if (IsSimple)
732*9880d681SAndroid Build Coastguard Worker     return duplicateSimpleBB(TailBB, TDBBs, UsedByPhi, Copies);
733*9880d681SAndroid Build Coastguard Worker 
734*9880d681SAndroid Build Coastguard Worker   // Iterate through all the unique predecessors and tail-duplicate this
735*9880d681SAndroid Build Coastguard Worker   // block into them, if possible. Copying the list ahead of time also
736*9880d681SAndroid Build Coastguard Worker   // avoids trouble with the predecessor list reallocating.
737*9880d681SAndroid Build Coastguard Worker   bool Changed = false;
738*9880d681SAndroid Build Coastguard Worker   SmallSetVector<MachineBasicBlock *, 8> Preds(TailBB->pred_begin(),
739*9880d681SAndroid Build Coastguard Worker                                                TailBB->pred_end());
740*9880d681SAndroid Build Coastguard Worker   for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
741*9880d681SAndroid Build Coastguard Worker                                                         PE = Preds.end();
742*9880d681SAndroid Build Coastguard Worker        PI != PE; ++PI) {
743*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredBB = *PI;
744*9880d681SAndroid Build Coastguard Worker 
745*9880d681SAndroid Build Coastguard Worker     assert(TailBB != PredBB &&
746*9880d681SAndroid Build Coastguard Worker            "Single-block loop should have been rejected earlier!");
747*9880d681SAndroid Build Coastguard Worker     // EH edges are ignored by AnalyzeBranch.
748*9880d681SAndroid Build Coastguard Worker     if (PredBB->succ_size() > 1)
749*9880d681SAndroid Build Coastguard Worker       continue;
750*9880d681SAndroid Build Coastguard Worker 
751*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredTBB, *PredFBB;
752*9880d681SAndroid Build Coastguard Worker     SmallVector<MachineOperand, 4> PredCond;
753*9880d681SAndroid Build Coastguard Worker     if (TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true))
754*9880d681SAndroid Build Coastguard Worker       continue;
755*9880d681SAndroid Build Coastguard Worker     if (!PredCond.empty())
756*9880d681SAndroid Build Coastguard Worker       continue;
757*9880d681SAndroid Build Coastguard Worker     // Don't duplicate into a fall-through predecessor (at least for now).
758*9880d681SAndroid Build Coastguard Worker     if (PredBB->isLayoutSuccessor(TailBB) && PredBB->canFallThrough())
759*9880d681SAndroid Build Coastguard Worker       continue;
760*9880d681SAndroid Build Coastguard Worker 
761*9880d681SAndroid Build Coastguard Worker     DEBUG(dbgs() << "\nTail-duplicating into PredBB: " << *PredBB
762*9880d681SAndroid Build Coastguard Worker                  << "From Succ: " << *TailBB);
763*9880d681SAndroid Build Coastguard Worker 
764*9880d681SAndroid Build Coastguard Worker     TDBBs.push_back(PredBB);
765*9880d681SAndroid Build Coastguard Worker 
766*9880d681SAndroid Build Coastguard Worker     // Remove PredBB's unconditional branch.
767*9880d681SAndroid Build Coastguard Worker     TII->RemoveBranch(*PredBB);
768*9880d681SAndroid Build Coastguard Worker 
769*9880d681SAndroid Build Coastguard Worker     // Clone the contents of TailBB into PredBB.
770*9880d681SAndroid Build Coastguard Worker     DenseMap<unsigned, RegSubRegPair> LocalVRMap;
771*9880d681SAndroid Build Coastguard Worker     SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
772*9880d681SAndroid Build Coastguard Worker     // Use instr_iterator here to properly handle bundles, e.g.
773*9880d681SAndroid Build Coastguard Worker     // ARM Thumb2 IT block.
774*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock::instr_iterator I = TailBB->instr_begin();
775*9880d681SAndroid Build Coastguard Worker     while (I != TailBB->instr_end()) {
776*9880d681SAndroid Build Coastguard Worker       MachineInstr *MI = &*I;
777*9880d681SAndroid Build Coastguard Worker       ++I;
778*9880d681SAndroid Build Coastguard Worker       if (MI->isPHI()) {
779*9880d681SAndroid Build Coastguard Worker         // Replace the uses of the def of the PHI with the register coming
780*9880d681SAndroid Build Coastguard Worker         // from PredBB.
781*9880d681SAndroid Build Coastguard Worker         processPHI(MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, true);
782*9880d681SAndroid Build Coastguard Worker       } else {
783*9880d681SAndroid Build Coastguard Worker         // Replace def of virtual registers with new registers, and update
784*9880d681SAndroid Build Coastguard Worker         // uses with PHI source register or the new registers.
785*9880d681SAndroid Build Coastguard Worker         duplicateInstruction(MI, TailBB, PredBB, MF, LocalVRMap, UsedByPhi);
786*9880d681SAndroid Build Coastguard Worker       }
787*9880d681SAndroid Build Coastguard Worker     }
788*9880d681SAndroid Build Coastguard Worker     appendCopies(PredBB, CopyInfos, Copies);
789*9880d681SAndroid Build Coastguard Worker 
790*9880d681SAndroid Build Coastguard Worker     // Simplify
791*9880d681SAndroid Build Coastguard Worker     TII->analyzeBranch(*PredBB, PredTBB, PredFBB, PredCond, true);
792*9880d681SAndroid Build Coastguard Worker 
793*9880d681SAndroid Build Coastguard Worker     NumTailDupAdded += TailBB->size() - 1; // subtract one for removed branch
794*9880d681SAndroid Build Coastguard Worker 
795*9880d681SAndroid Build Coastguard Worker     // Update the CFG.
796*9880d681SAndroid Build Coastguard Worker     PredBB->removeSuccessor(PredBB->succ_begin());
797*9880d681SAndroid Build Coastguard Worker     assert(PredBB->succ_empty() &&
798*9880d681SAndroid Build Coastguard Worker            "TailDuplicate called on block with multiple successors!");
799*9880d681SAndroid Build Coastguard Worker     for (MachineBasicBlock::succ_iterator I = TailBB->succ_begin(),
800*9880d681SAndroid Build Coastguard Worker                                           E = TailBB->succ_end();
801*9880d681SAndroid Build Coastguard Worker          I != E; ++I)
802*9880d681SAndroid Build Coastguard Worker       PredBB->addSuccessor(*I, MBPI->getEdgeProbability(TailBB, I));
803*9880d681SAndroid Build Coastguard Worker 
804*9880d681SAndroid Build Coastguard Worker     Changed = true;
805*9880d681SAndroid Build Coastguard Worker     ++NumTailDups;
806*9880d681SAndroid Build Coastguard Worker   }
807*9880d681SAndroid Build Coastguard Worker 
808*9880d681SAndroid Build Coastguard Worker   // If TailBB was duplicated into all its predecessors except for the prior
809*9880d681SAndroid Build Coastguard Worker   // block, which falls through unconditionally, move the contents of this
810*9880d681SAndroid Build Coastguard Worker   // block into the prior block.
811*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock *PrevBB = &*std::prev(TailBB->getIterator());
812*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock *PriorTBB = nullptr, *PriorFBB = nullptr;
813*9880d681SAndroid Build Coastguard Worker   SmallVector<MachineOperand, 4> PriorCond;
814*9880d681SAndroid Build Coastguard Worker   // This has to check PrevBB->succ_size() because EH edges are ignored by
815*9880d681SAndroid Build Coastguard Worker   // AnalyzeBranch.
816*9880d681SAndroid Build Coastguard Worker   if (PrevBB->succ_size() == 1 &&
817*9880d681SAndroid Build Coastguard Worker       !TII->analyzeBranch(*PrevBB, PriorTBB, PriorFBB, PriorCond, true) &&
818*9880d681SAndroid Build Coastguard Worker       PriorCond.empty() && !PriorTBB && TailBB->pred_size() == 1 &&
819*9880d681SAndroid Build Coastguard Worker       !TailBB->hasAddressTaken()) {
820*9880d681SAndroid Build Coastguard Worker     DEBUG(dbgs() << "\nMerging into block: " << *PrevBB
821*9880d681SAndroid Build Coastguard Worker                  << "From MBB: " << *TailBB);
822*9880d681SAndroid Build Coastguard Worker     if (PreRegAlloc) {
823*9880d681SAndroid Build Coastguard Worker       DenseMap<unsigned, RegSubRegPair> LocalVRMap;
824*9880d681SAndroid Build Coastguard Worker       SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
825*9880d681SAndroid Build Coastguard Worker       MachineBasicBlock::iterator I = TailBB->begin();
826*9880d681SAndroid Build Coastguard Worker       // Process PHI instructions first.
827*9880d681SAndroid Build Coastguard Worker       while (I != TailBB->end() && I->isPHI()) {
828*9880d681SAndroid Build Coastguard Worker         // Replace the uses of the def of the PHI with the register coming
829*9880d681SAndroid Build Coastguard Worker         // from PredBB.
830*9880d681SAndroid Build Coastguard Worker         MachineInstr *MI = &*I++;
831*9880d681SAndroid Build Coastguard Worker         processPHI(MI, TailBB, PrevBB, LocalVRMap, CopyInfos, UsedByPhi, true);
832*9880d681SAndroid Build Coastguard Worker       }
833*9880d681SAndroid Build Coastguard Worker 
834*9880d681SAndroid Build Coastguard Worker       // Now copy the non-PHI instructions.
835*9880d681SAndroid Build Coastguard Worker       while (I != TailBB->end()) {
836*9880d681SAndroid Build Coastguard Worker         // Replace def of virtual registers with new registers, and update
837*9880d681SAndroid Build Coastguard Worker         // uses with PHI source register or the new registers.
838*9880d681SAndroid Build Coastguard Worker         MachineInstr *MI = &*I++;
839*9880d681SAndroid Build Coastguard Worker         assert(!MI->isBundle() && "Not expecting bundles before regalloc!");
840*9880d681SAndroid Build Coastguard Worker         duplicateInstruction(MI, TailBB, PrevBB, MF, LocalVRMap, UsedByPhi);
841*9880d681SAndroid Build Coastguard Worker         MI->eraseFromParent();
842*9880d681SAndroid Build Coastguard Worker       }
843*9880d681SAndroid Build Coastguard Worker       appendCopies(PrevBB, CopyInfos, Copies);
844*9880d681SAndroid Build Coastguard Worker     } else {
845*9880d681SAndroid Build Coastguard Worker       // No PHIs to worry about, just splice the instructions over.
846*9880d681SAndroid Build Coastguard Worker       PrevBB->splice(PrevBB->end(), TailBB, TailBB->begin(), TailBB->end());
847*9880d681SAndroid Build Coastguard Worker     }
848*9880d681SAndroid Build Coastguard Worker     PrevBB->removeSuccessor(PrevBB->succ_begin());
849*9880d681SAndroid Build Coastguard Worker     assert(PrevBB->succ_empty());
850*9880d681SAndroid Build Coastguard Worker     PrevBB->transferSuccessors(TailBB);
851*9880d681SAndroid Build Coastguard Worker     TDBBs.push_back(PrevBB);
852*9880d681SAndroid Build Coastguard Worker     Changed = true;
853*9880d681SAndroid Build Coastguard Worker   }
854*9880d681SAndroid Build Coastguard Worker 
855*9880d681SAndroid Build Coastguard Worker   // If this is after register allocation, there are no phis to fix.
856*9880d681SAndroid Build Coastguard Worker   if (!PreRegAlloc)
857*9880d681SAndroid Build Coastguard Worker     return Changed;
858*9880d681SAndroid Build Coastguard Worker 
859*9880d681SAndroid Build Coastguard Worker   // If we made no changes so far, we are safe.
860*9880d681SAndroid Build Coastguard Worker   if (!Changed)
861*9880d681SAndroid Build Coastguard Worker     return Changed;
862*9880d681SAndroid Build Coastguard Worker 
863*9880d681SAndroid Build Coastguard Worker   // Handle the nasty case in that we duplicated a block that is part of a loop
864*9880d681SAndroid Build Coastguard Worker   // into some but not all of its predecessors. For example:
865*9880d681SAndroid Build Coastguard Worker   //    1 -> 2 <-> 3                 |
866*9880d681SAndroid Build Coastguard Worker   //          \                      |
867*9880d681SAndroid Build Coastguard Worker   //           \---> rest            |
868*9880d681SAndroid Build Coastguard Worker   // if we duplicate 2 into 1 but not into 3, we end up with
869*9880d681SAndroid Build Coastguard Worker   // 12 -> 3 <-> 2 -> rest           |
870*9880d681SAndroid Build Coastguard Worker   //   \             /               |
871*9880d681SAndroid Build Coastguard Worker   //    \----->-----/                |
872*9880d681SAndroid Build Coastguard Worker   // If there was a "var = phi(1, 3)" in 2, it has to be ultimately replaced
873*9880d681SAndroid Build Coastguard Worker   // with a phi in 3 (which now dominates 2).
874*9880d681SAndroid Build Coastguard Worker   // What we do here is introduce a copy in 3 of the register defined by the
875*9880d681SAndroid Build Coastguard Worker   // phi, just like when we are duplicating 2 into 3, but we don't copy any
876*9880d681SAndroid Build Coastguard Worker   // real instructions or remove the 3 -> 2 edge from the phi in 2.
877*9880d681SAndroid Build Coastguard Worker   for (SmallSetVector<MachineBasicBlock *, 8>::iterator PI = Preds.begin(),
878*9880d681SAndroid Build Coastguard Worker                                                         PE = Preds.end();
879*9880d681SAndroid Build Coastguard Worker        PI != PE; ++PI) {
880*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock *PredBB = *PI;
881*9880d681SAndroid Build Coastguard Worker     if (std::find(TDBBs.begin(), TDBBs.end(), PredBB) != TDBBs.end())
882*9880d681SAndroid Build Coastguard Worker       continue;
883*9880d681SAndroid Build Coastguard Worker 
884*9880d681SAndroid Build Coastguard Worker     // EH edges
885*9880d681SAndroid Build Coastguard Worker     if (PredBB->succ_size() != 1)
886*9880d681SAndroid Build Coastguard Worker       continue;
887*9880d681SAndroid Build Coastguard Worker 
888*9880d681SAndroid Build Coastguard Worker     DenseMap<unsigned, RegSubRegPair> LocalVRMap;
889*9880d681SAndroid Build Coastguard Worker     SmallVector<std::pair<unsigned, RegSubRegPair>, 4> CopyInfos;
890*9880d681SAndroid Build Coastguard Worker     MachineBasicBlock::iterator I = TailBB->begin();
891*9880d681SAndroid Build Coastguard Worker     // Process PHI instructions first.
892*9880d681SAndroid Build Coastguard Worker     while (I != TailBB->end() && I->isPHI()) {
893*9880d681SAndroid Build Coastguard Worker       // Replace the uses of the def of the PHI with the register coming
894*9880d681SAndroid Build Coastguard Worker       // from PredBB.
895*9880d681SAndroid Build Coastguard Worker       MachineInstr *MI = &*I++;
896*9880d681SAndroid Build Coastguard Worker       processPHI(MI, TailBB, PredBB, LocalVRMap, CopyInfos, UsedByPhi, false);
897*9880d681SAndroid Build Coastguard Worker     }
898*9880d681SAndroid Build Coastguard Worker     appendCopies(PredBB, CopyInfos, Copies);
899*9880d681SAndroid Build Coastguard Worker   }
900*9880d681SAndroid Build Coastguard Worker 
901*9880d681SAndroid Build Coastguard Worker   return Changed;
902*9880d681SAndroid Build Coastguard Worker }
903*9880d681SAndroid Build Coastguard Worker 
904*9880d681SAndroid Build Coastguard Worker /// At the end of the block \p MBB generate COPY instructions between registers
905*9880d681SAndroid Build Coastguard Worker /// described by \p CopyInfos. Append resulting instructions to \p Copies.
appendCopies(MachineBasicBlock * MBB,SmallVectorImpl<std::pair<unsigned,RegSubRegPair>> & CopyInfos,SmallVectorImpl<MachineInstr * > & Copies)906*9880d681SAndroid Build Coastguard Worker void TailDuplicator::appendCopies(MachineBasicBlock *MBB,
907*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<std::pair<unsigned,RegSubRegPair>> &CopyInfos,
908*9880d681SAndroid Build Coastguard Worker       SmallVectorImpl<MachineInstr*> &Copies) {
909*9880d681SAndroid Build Coastguard Worker   MachineBasicBlock::iterator Loc = MBB->getFirstTerminator();
910*9880d681SAndroid Build Coastguard Worker   const MCInstrDesc &CopyD = TII->get(TargetOpcode::COPY);
911*9880d681SAndroid Build Coastguard Worker   for (auto &CI : CopyInfos) {
912*9880d681SAndroid Build Coastguard Worker     auto C = BuildMI(*MBB, Loc, DebugLoc(), CopyD, CI.first)
913*9880d681SAndroid Build Coastguard Worker                 .addReg(CI.second.Reg, 0, CI.second.SubReg);
914*9880d681SAndroid Build Coastguard Worker     Copies.push_back(C);
915*9880d681SAndroid Build Coastguard Worker   }
916*9880d681SAndroid Build Coastguard Worker }
917*9880d681SAndroid Build Coastguard Worker 
918*9880d681SAndroid Build Coastguard Worker /// Remove the specified dead machine basic block from the function, updating
919*9880d681SAndroid Build Coastguard Worker /// the CFG.
removeDeadBlock(MachineBasicBlock * MBB)920*9880d681SAndroid Build Coastguard Worker void TailDuplicator::removeDeadBlock(MachineBasicBlock *MBB) {
921*9880d681SAndroid Build Coastguard Worker   assert(MBB->pred_empty() && "MBB must be dead!");
922*9880d681SAndroid Build Coastguard Worker   DEBUG(dbgs() << "\nRemoving MBB: " << *MBB);
923*9880d681SAndroid Build Coastguard Worker 
924*9880d681SAndroid Build Coastguard Worker   // Remove all successors.
925*9880d681SAndroid Build Coastguard Worker   while (!MBB->succ_empty())
926*9880d681SAndroid Build Coastguard Worker     MBB->removeSuccessor(MBB->succ_end() - 1);
927*9880d681SAndroid Build Coastguard Worker 
928*9880d681SAndroid Build Coastguard Worker   // Remove the block.
929*9880d681SAndroid Build Coastguard Worker   MBB->eraseFromParent();
930*9880d681SAndroid Build Coastguard Worker }
931*9880d681SAndroid Build Coastguard Worker 
932*9880d681SAndroid Build Coastguard Worker } // End llvm namespace
933