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