1a71fe49bSChen Zheng //===-- PPCCTRLoops.cpp - Generate CTR loops ------------------------------===//
2a71fe49bSChen Zheng //
3a71fe49bSChen Zheng // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a71fe49bSChen Zheng // See https://llvm.org/LICENSE.txt for license information.
5a71fe49bSChen Zheng // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a71fe49bSChen Zheng //
7a71fe49bSChen Zheng //===----------------------------------------------------------------------===//
8a71fe49bSChen Zheng //
9a71fe49bSChen Zheng // This pass generates machine instructions for the CTR loops related pseudos:
10a71fe49bSChen Zheng // 1: MTCTRPseudo/DecreaseCTRPseudo
11a71fe49bSChen Zheng // 2: MTCTR8Pseudo/DecreaseCTR8Pseudo
12a71fe49bSChen Zheng //
13a71fe49bSChen Zheng // If a CTR loop can be generated:
14a71fe49bSChen Zheng // 1: MTCTRPseudo/MTCTR8Pseudo will be converted to "mtctr"
15a71fe49bSChen Zheng // 2: DecreaseCTRPseudo/DecreaseCTR8Pseudo will be converted to "bdnz/bdz" and
16a71fe49bSChen Zheng // its user branch instruction can be deleted.
17a71fe49bSChen Zheng //
18a71fe49bSChen Zheng // If a CTR loop can not be generated due to clobber of CTR:
19a71fe49bSChen Zheng // 1: MTCTRPseudo/MTCTR8Pseudo can be deleted.
20a71fe49bSChen Zheng // 2: DecreaseCTRPseudo/DecreaseCTR8Pseudo will be converted to "addi -1" and
21a71fe49bSChen Zheng // a "cmplwi/cmpldi".
22a71fe49bSChen Zheng //
23a71fe49bSChen Zheng // This pass runs just before register allocation, because we don't want
24a71fe49bSChen Zheng // register allocator to allocate register for DecreaseCTRPseudo if a CTR can be
25a71fe49bSChen Zheng // generated or if a CTR loop can not be generated, we don't have any condition
26a71fe49bSChen Zheng // register for the new added "cmplwi/cmpldi".
27a71fe49bSChen Zheng //
28a71fe49bSChen Zheng //===----------------------------------------------------------------------===//
29a71fe49bSChen Zheng
30a71fe49bSChen Zheng #include "PPC.h"
31a71fe49bSChen Zheng #include "PPCInstrInfo.h"
32a71fe49bSChen Zheng #include "PPCSubtarget.h"
33a71fe49bSChen Zheng #include "llvm/ADT/Statistic.h"
34a71fe49bSChen Zheng #include "llvm/CodeGen/MachineBasicBlock.h"
35a71fe49bSChen Zheng #include "llvm/CodeGen/MachineFunction.h"
36a71fe49bSChen Zheng #include "llvm/CodeGen/MachineFunctionPass.h"
37a71fe49bSChen Zheng #include "llvm/CodeGen/MachineInstr.h"
38a71fe49bSChen Zheng #include "llvm/CodeGen/MachineLoopInfo.h"
39a71fe49bSChen Zheng #include "llvm/CodeGen/MachineOperand.h"
40a71fe49bSChen Zheng #include "llvm/CodeGen/MachineRegisterInfo.h"
41a71fe49bSChen Zheng #include "llvm/CodeGen/Register.h"
42a71fe49bSChen Zheng #include "llvm/InitializePasses.h"
43a71fe49bSChen Zheng #include "llvm/Pass.h"
44a71fe49bSChen Zheng #include "llvm/PassRegistry.h"
45a71fe49bSChen Zheng #include "llvm/Support/CodeGen.h"
46a71fe49bSChen Zheng #include "llvm/Support/Debug.h"
47a71fe49bSChen Zheng #include "llvm/Support/ErrorHandling.h"
48a71fe49bSChen Zheng #include <cassert>
49a71fe49bSChen Zheng
50a71fe49bSChen Zheng using namespace llvm;
51a71fe49bSChen Zheng
52a71fe49bSChen Zheng #define DEBUG_TYPE "ppc-ctrloops"
53a71fe49bSChen Zheng
54a71fe49bSChen Zheng STATISTIC(NumCTRLoops, "Number of CTR loops generated");
55a71fe49bSChen Zheng STATISTIC(NumNormalLoops, "Number of normal compare + branch loops generated");
56a71fe49bSChen Zheng
57a71fe49bSChen Zheng namespace {
58a71fe49bSChen Zheng class PPCCTRLoops : public MachineFunctionPass {
59a71fe49bSChen Zheng public:
60a71fe49bSChen Zheng static char ID;
61a71fe49bSChen Zheng
PPCCTRLoops()62a71fe49bSChen Zheng PPCCTRLoops() : MachineFunctionPass(ID) {
63a71fe49bSChen Zheng initializePPCCTRLoopsPass(*PassRegistry::getPassRegistry());
64a71fe49bSChen Zheng }
65a71fe49bSChen Zheng
getAnalysisUsage(AnalysisUsage & AU) const66a71fe49bSChen Zheng void getAnalysisUsage(AnalysisUsage &AU) const override {
67a71fe49bSChen Zheng AU.addRequired<MachineLoopInfo>();
68a71fe49bSChen Zheng MachineFunctionPass::getAnalysisUsage(AU);
69a71fe49bSChen Zheng }
70a71fe49bSChen Zheng
71a71fe49bSChen Zheng bool runOnMachineFunction(MachineFunction &MF) override;
72a71fe49bSChen Zheng
73a71fe49bSChen Zheng private:
74a71fe49bSChen Zheng const PPCInstrInfo *TII = nullptr;
75a71fe49bSChen Zheng MachineRegisterInfo *MRI = nullptr;
76a71fe49bSChen Zheng
77a71fe49bSChen Zheng bool processLoop(MachineLoop *ML);
78a71fe49bSChen Zheng bool isCTRClobber(MachineInstr *MI, bool CheckReads) const;
79a71fe49bSChen Zheng void expandNormalLoops(MachineLoop *ML, MachineInstr *Start,
80a71fe49bSChen Zheng MachineInstr *Dec);
81a71fe49bSChen Zheng void expandCTRLoops(MachineLoop *ML, MachineInstr *Start, MachineInstr *Dec);
82a71fe49bSChen Zheng };
83a71fe49bSChen Zheng } // namespace
84a71fe49bSChen Zheng
85a71fe49bSChen Zheng char PPCCTRLoops::ID = 0;
86a71fe49bSChen Zheng
87a71fe49bSChen Zheng INITIALIZE_PASS_BEGIN(PPCCTRLoops, DEBUG_TYPE, "PowerPC CTR loops generation",
88a71fe49bSChen Zheng false, false)
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)89a71fe49bSChen Zheng INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
90a71fe49bSChen Zheng INITIALIZE_PASS_END(PPCCTRLoops, DEBUG_TYPE, "PowerPC CTR loops generation",
91a71fe49bSChen Zheng false, false)
92a71fe49bSChen Zheng
93a71fe49bSChen Zheng FunctionPass *llvm::createPPCCTRLoopsPass() { return new PPCCTRLoops(); }
94a71fe49bSChen Zheng
runOnMachineFunction(MachineFunction & MF)95a71fe49bSChen Zheng bool PPCCTRLoops::runOnMachineFunction(MachineFunction &MF) {
96a71fe49bSChen Zheng bool Changed = false;
97a71fe49bSChen Zheng
98a71fe49bSChen Zheng auto &MLI = getAnalysis<MachineLoopInfo>();
99a71fe49bSChen Zheng TII = static_cast<const PPCInstrInfo *>(MF.getSubtarget().getInstrInfo());
100a71fe49bSChen Zheng MRI = &MF.getRegInfo();
101a71fe49bSChen Zheng
102a71fe49bSChen Zheng for (auto ML : MLI) {
103a71fe49bSChen Zheng if (ML->isOutermost())
104a71fe49bSChen Zheng Changed |= processLoop(ML);
105a71fe49bSChen Zheng }
106a71fe49bSChen Zheng
107a71fe49bSChen Zheng return Changed;
108a71fe49bSChen Zheng }
109a71fe49bSChen Zheng
isCTRClobber(MachineInstr * MI,bool CheckReads) const110a71fe49bSChen Zheng bool PPCCTRLoops::isCTRClobber(MachineInstr *MI, bool CheckReads) const {
111*9cfbe7bbSChen Zheng if (!CheckReads) {
112*9cfbe7bbSChen Zheng // If we are only checking for defs, that is we are going to find
113*9cfbe7bbSChen Zheng // definitions before MTCTRloop, for this case:
114*9cfbe7bbSChen Zheng // CTR defination inside the callee of a call instruction will not impact
115*9cfbe7bbSChen Zheng // the defination of MTCTRloop, so we can use definesRegister() for the
116*9cfbe7bbSChen Zheng // check, no need to check the regmask.
117*9cfbe7bbSChen Zheng return (MI->definesRegister(PPC::CTR) &&
118*9cfbe7bbSChen Zheng !MI->registerDefIsDead(PPC::CTR)) ||
119*9cfbe7bbSChen Zheng (MI->definesRegister(PPC::CTR8) &&
120*9cfbe7bbSChen Zheng !MI->registerDefIsDead(PPC::CTR8));
121*9cfbe7bbSChen Zheng }
122*9cfbe7bbSChen Zheng
123a71fe49bSChen Zheng if ((MI->modifiesRegister(PPC::CTR) && !MI->registerDefIsDead(PPC::CTR)) ||
124a71fe49bSChen Zheng (MI->modifiesRegister(PPC::CTR8) && !MI->registerDefIsDead(PPC::CTR8)))
125a71fe49bSChen Zheng return true;
126a71fe49bSChen Zheng
127a71fe49bSChen Zheng if (MI->getDesc().isCall())
128a71fe49bSChen Zheng return true;
129a71fe49bSChen Zheng
130a71fe49bSChen Zheng // We define the CTR in the loop preheader, so if there is any CTR reader in
131a71fe49bSChen Zheng // the loop, we also can not use CTR loop form.
132a71fe49bSChen Zheng if (MI->readsRegister(PPC::CTR) || MI->readsRegister(PPC::CTR8))
133a71fe49bSChen Zheng return true;
134a71fe49bSChen Zheng
135a71fe49bSChen Zheng return false;
136a71fe49bSChen Zheng }
137a71fe49bSChen Zheng
processLoop(MachineLoop * ML)138a71fe49bSChen Zheng bool PPCCTRLoops::processLoop(MachineLoop *ML) {
139a71fe49bSChen Zheng bool Changed = false;
140a71fe49bSChen Zheng
141a71fe49bSChen Zheng // Align with HardwareLoop pass, process inner loops first.
142a71fe49bSChen Zheng for (auto I = ML->begin(), E = ML->end(); I != E; ++I)
143a71fe49bSChen Zheng Changed |= processLoop(*I);
144a71fe49bSChen Zheng
145a71fe49bSChen Zheng // If any inner loop is changed, outter loop must be without hardware loop
146a71fe49bSChen Zheng // intrinsics.
147a71fe49bSChen Zheng if (Changed)
148a71fe49bSChen Zheng return true;
149a71fe49bSChen Zheng
150a71fe49bSChen Zheng auto IsLoopStart = [](MachineInstr &MI) {
151a71fe49bSChen Zheng return MI.getOpcode() == PPC::MTCTRPseudo ||
152a71fe49bSChen Zheng MI.getOpcode() == PPC::MTCTR8Pseudo;
153a71fe49bSChen Zheng };
154a71fe49bSChen Zheng
155a71fe49bSChen Zheng auto SearchForStart =
156a71fe49bSChen Zheng [&IsLoopStart](MachineBasicBlock *MBB) -> MachineInstr * {
157a71fe49bSChen Zheng for (auto &MI : *MBB) {
158a71fe49bSChen Zheng if (IsLoopStart(MI))
159a71fe49bSChen Zheng return &MI;
160a71fe49bSChen Zheng }
161a71fe49bSChen Zheng return nullptr;
162a71fe49bSChen Zheng };
163a71fe49bSChen Zheng
164a71fe49bSChen Zheng MachineInstr *Start = nullptr;
165a71fe49bSChen Zheng MachineInstr *Dec = nullptr;
166a71fe49bSChen Zheng bool InvalidCTRLoop = false;
167a71fe49bSChen Zheng
168a71fe49bSChen Zheng MachineBasicBlock *Preheader = ML->getLoopPreheader();
169a71fe49bSChen Zheng // If there is no preheader for this loop, there must be no MTCTRPseudo
170a71fe49bSChen Zheng // either.
171a71fe49bSChen Zheng if (!Preheader)
172a71fe49bSChen Zheng return false;
173a71fe49bSChen Zheng
174a71fe49bSChen Zheng Start = SearchForStart(Preheader);
175a71fe49bSChen Zheng // This is not a CTR loop candidate.
176a71fe49bSChen Zheng if (!Start)
177a71fe49bSChen Zheng return false;
178a71fe49bSChen Zheng
179a71fe49bSChen Zheng // If CTR is live to the preheader, we can not redefine the CTR register.
180a71fe49bSChen Zheng if (Preheader->isLiveIn(PPC::CTR) || Preheader->isLiveIn(PPC::CTR8))
181a71fe49bSChen Zheng InvalidCTRLoop = true;
182a71fe49bSChen Zheng
183a71fe49bSChen Zheng // Make sure there is also no CTR clobber in the block preheader between the
184a71fe49bSChen Zheng // begin and MTCTR.
185a71fe49bSChen Zheng for (MachineBasicBlock::reverse_instr_iterator I =
186a71fe49bSChen Zheng std::next(Start->getReverseIterator());
187a71fe49bSChen Zheng I != Preheader->instr_rend(); ++I)
188a71fe49bSChen Zheng // Only check the definitions of CTR. If there is non-dead definition for
189a71fe49bSChen Zheng // the CTR, we conservatively don't generate a CTR loop.
190a71fe49bSChen Zheng if (isCTRClobber(&*I, /* CheckReads */ false)) {
191a71fe49bSChen Zheng InvalidCTRLoop = true;
192a71fe49bSChen Zheng break;
193a71fe49bSChen Zheng }
194a71fe49bSChen Zheng
195a71fe49bSChen Zheng // Make sure there is also no CTR clobber/user in the block preheader between
196a71fe49bSChen Zheng // MTCTR and the end.
197a71fe49bSChen Zheng for (MachineBasicBlock::instr_iterator I = std::next(Start->getIterator());
198a71fe49bSChen Zheng I != Preheader->instr_end(); ++I)
199a71fe49bSChen Zheng if (isCTRClobber(&*I, /* CheckReads */ true)) {
200a71fe49bSChen Zheng InvalidCTRLoop = true;
201a71fe49bSChen Zheng break;
202a71fe49bSChen Zheng }
203a71fe49bSChen Zheng
204a71fe49bSChen Zheng // Find the CTR loop components and decide whether or not to fall back to a
205a71fe49bSChen Zheng // normal loop.
206a71fe49bSChen Zheng for (auto *MBB : reverse(ML->getBlocks())) {
207a71fe49bSChen Zheng for (auto &MI : *MBB) {
208a71fe49bSChen Zheng if (MI.getOpcode() == PPC::DecreaseCTRPseudo ||
209a71fe49bSChen Zheng MI.getOpcode() == PPC::DecreaseCTR8Pseudo)
210a71fe49bSChen Zheng Dec = &MI;
211a71fe49bSChen Zheng else if (!InvalidCTRLoop)
212a71fe49bSChen Zheng // If any instruction clobber CTR, then we can not generate a CTR loop.
213a71fe49bSChen Zheng InvalidCTRLoop |= isCTRClobber(&MI, /* CheckReads */ true);
214a71fe49bSChen Zheng }
215a71fe49bSChen Zheng if (Dec && InvalidCTRLoop)
216a71fe49bSChen Zheng break;
217a71fe49bSChen Zheng }
218a71fe49bSChen Zheng
219a71fe49bSChen Zheng assert(Dec && "CTR loop is not complete!");
220a71fe49bSChen Zheng
221a71fe49bSChen Zheng if (InvalidCTRLoop) {
222a71fe49bSChen Zheng expandNormalLoops(ML, Start, Dec);
223a71fe49bSChen Zheng ++NumNormalLoops;
224a71fe49bSChen Zheng }
225a71fe49bSChen Zheng else {
226a71fe49bSChen Zheng expandCTRLoops(ML, Start, Dec);
227a71fe49bSChen Zheng ++NumCTRLoops;
228a71fe49bSChen Zheng }
229a71fe49bSChen Zheng return true;
230a71fe49bSChen Zheng }
231a71fe49bSChen Zheng
expandNormalLoops(MachineLoop * ML,MachineInstr * Start,MachineInstr * Dec)232a71fe49bSChen Zheng void PPCCTRLoops::expandNormalLoops(MachineLoop *ML, MachineInstr *Start,
233a71fe49bSChen Zheng MachineInstr *Dec) {
234a71fe49bSChen Zheng bool Is64Bit =
235a71fe49bSChen Zheng Start->getParent()->getParent()->getSubtarget<PPCSubtarget>().isPPC64();
236a71fe49bSChen Zheng
237a71fe49bSChen Zheng MachineBasicBlock *Preheader = Start->getParent();
238a71fe49bSChen Zheng MachineBasicBlock *Exiting = Dec->getParent();
239a71fe49bSChen Zheng assert((Preheader && Exiting) &&
240a71fe49bSChen Zheng "Preheader and exiting should exist for CTR loop!");
241a71fe49bSChen Zheng
242a71fe49bSChen Zheng assert(Dec->getOperand(1).getImm() == 1 &&
243a71fe49bSChen Zheng "Loop decrement stride must be 1");
244a71fe49bSChen Zheng
245a71fe49bSChen Zheng unsigned ADDIOpcode = Is64Bit ? PPC::ADDI8 : PPC::ADDI;
246a71fe49bSChen Zheng unsigned CMPOpcode = Is64Bit ? PPC::CMPLDI : PPC::CMPLWI;
247a71fe49bSChen Zheng
248a71fe49bSChen Zheng Register PHIDef =
249a71fe49bSChen Zheng MRI->createVirtualRegister(Is64Bit ? &PPC::G8RC_and_G8RC_NOX0RegClass
250a71fe49bSChen Zheng : &PPC::GPRC_and_GPRC_NOR0RegClass);
251a71fe49bSChen Zheng
252a71fe49bSChen Zheng Start->getParent()->getParent()->getProperties().reset(
253a71fe49bSChen Zheng MachineFunctionProperties::Property::NoPHIs);
254a71fe49bSChen Zheng
255a71fe49bSChen Zheng // Generate "PHI" in the header block.
256a71fe49bSChen Zheng auto PHIMIB = BuildMI(*ML->getHeader(), ML->getHeader()->getFirstNonPHI(),
257a71fe49bSChen Zheng DebugLoc(), TII->get(TargetOpcode::PHI), PHIDef);
258a71fe49bSChen Zheng PHIMIB.addReg(Start->getOperand(0).getReg()).addMBB(Preheader);
259a71fe49bSChen Zheng
260a71fe49bSChen Zheng Register ADDIDef =
261a71fe49bSChen Zheng MRI->createVirtualRegister(Is64Bit ? &PPC::G8RC_and_G8RC_NOX0RegClass
262a71fe49bSChen Zheng : &PPC::GPRC_and_GPRC_NOR0RegClass);
263a71fe49bSChen Zheng // Generate "addi -1" in the exiting block.
264a71fe49bSChen Zheng BuildMI(*Exiting, Dec, Dec->getDebugLoc(), TII->get(ADDIOpcode), ADDIDef)
265a71fe49bSChen Zheng .addReg(PHIDef)
266a71fe49bSChen Zheng .addImm(-1);
267a71fe49bSChen Zheng
268a71fe49bSChen Zheng // Add other inputs for the PHI node.
269a71fe49bSChen Zheng if (ML->isLoopLatch(Exiting)) {
270a71fe49bSChen Zheng // There must be only two predecessors for the loop header, one is the
271a71fe49bSChen Zheng // Preheader and the other one is loop latch Exiting. In hardware loop
272a71fe49bSChen Zheng // insertion pass, the block containing DecreaseCTRloop must dominate all
273a71fe49bSChen Zheng // loop latches. So there must be only one latch.
274a71fe49bSChen Zheng assert(ML->getHeader()->pred_size() == 2 &&
275a71fe49bSChen Zheng "Loop header predecessor is not right!");
276a71fe49bSChen Zheng PHIMIB.addReg(ADDIDef).addMBB(Exiting);
277a71fe49bSChen Zheng } else {
278a71fe49bSChen Zheng // If the block containing DecreaseCTRloop is not a loop latch, we can use
279a71fe49bSChen Zheng // ADDIDef as the value for all other blocks for the PHI. In hardware loop
280a71fe49bSChen Zheng // insertion pass, the block containing DecreaseCTRloop must dominate all
281a71fe49bSChen Zheng // loop latches.
282a71fe49bSChen Zheng for (MachineBasicBlock *P : ML->getHeader()->predecessors()) {
283a71fe49bSChen Zheng if (ML->contains(P)) {
284a71fe49bSChen Zheng assert(ML->isLoopLatch(P) &&
285a71fe49bSChen Zheng "Loop's header in-loop predecessor is not loop latch!");
286a71fe49bSChen Zheng PHIMIB.addReg(ADDIDef).addMBB(P);
287a71fe49bSChen Zheng } else
288a71fe49bSChen Zheng assert(P == Preheader &&
289a71fe49bSChen Zheng "CTR loop should not be generated for irreducible loop!");
290a71fe49bSChen Zheng }
291a71fe49bSChen Zheng }
292a71fe49bSChen Zheng
293a71fe49bSChen Zheng // Generate the compare in the exiting block.
294a71fe49bSChen Zheng Register CMPDef = MRI->createVirtualRegister(&PPC::CRRCRegClass);
295a71fe49bSChen Zheng auto CMPMIB =
296a71fe49bSChen Zheng BuildMI(*Exiting, Dec, Dec->getDebugLoc(), TII->get(CMPOpcode), CMPDef)
297a71fe49bSChen Zheng .addReg(ADDIDef)
298a71fe49bSChen Zheng .addImm(0);
299a71fe49bSChen Zheng
300a71fe49bSChen Zheng BuildMI(*Exiting, Dec, Dec->getDebugLoc(), TII->get(TargetOpcode::COPY),
301a71fe49bSChen Zheng Dec->getOperand(0).getReg())
302a71fe49bSChen Zheng .addReg(CMPMIB->getOperand(0).getReg(), 0, PPC::sub_gt);
303a71fe49bSChen Zheng
304a71fe49bSChen Zheng // Remove the pseudo instructions.
305a71fe49bSChen Zheng Start->eraseFromParent();
306a71fe49bSChen Zheng Dec->eraseFromParent();
307a71fe49bSChen Zheng }
308a71fe49bSChen Zheng
expandCTRLoops(MachineLoop * ML,MachineInstr * Start,MachineInstr * Dec)309a71fe49bSChen Zheng void PPCCTRLoops::expandCTRLoops(MachineLoop *ML, MachineInstr *Start,
310a71fe49bSChen Zheng MachineInstr *Dec) {
311a71fe49bSChen Zheng bool Is64Bit =
312a71fe49bSChen Zheng Start->getParent()->getParent()->getSubtarget<PPCSubtarget>().isPPC64();
313a71fe49bSChen Zheng
314a71fe49bSChen Zheng MachineBasicBlock *Preheader = Start->getParent();
315a71fe49bSChen Zheng MachineBasicBlock *Exiting = Dec->getParent();
316a71fe49bSChen Zheng assert((Preheader && Exiting) &&
317a71fe49bSChen Zheng "Preheader and exiting should exist for CTR loop!");
318a71fe49bSChen Zheng
319a71fe49bSChen Zheng assert(Dec->getOperand(1).getImm() == 1 && "Loop decrement must be 1!");
320a71fe49bSChen Zheng
321a71fe49bSChen Zheng unsigned BDNZOpcode = Is64Bit ? PPC::BDNZ8 : PPC::BDNZ;
322a71fe49bSChen Zheng unsigned BDZOpcode = Is64Bit ? PPC::BDZ8 : PPC::BDZ;
323a71fe49bSChen Zheng auto BrInstr = MRI->use_instr_begin(Dec->getOperand(0).getReg());
324a71fe49bSChen Zheng assert(MRI->hasOneUse(Dec->getOperand(0).getReg()) &&
325a71fe49bSChen Zheng "There should be only one user for loop decrement pseudo!");
326a71fe49bSChen Zheng
327a71fe49bSChen Zheng unsigned Opcode = 0;
328a71fe49bSChen Zheng switch (BrInstr->getOpcode()) {
329a71fe49bSChen Zheng case PPC::BC:
330a71fe49bSChen Zheng Opcode = BDNZOpcode;
331a71fe49bSChen Zheng (void) ML;
332a71fe49bSChen Zheng assert(ML->contains(BrInstr->getOperand(1).getMBB()) &&
333a71fe49bSChen Zheng "Invalid ctr loop!");
334a71fe49bSChen Zheng break;
335a71fe49bSChen Zheng case PPC::BCn:
336a71fe49bSChen Zheng Opcode = BDZOpcode;
337a71fe49bSChen Zheng assert(!ML->contains(BrInstr->getOperand(1).getMBB()) &&
338a71fe49bSChen Zheng "Invalid ctr loop!");
339a71fe49bSChen Zheng break;
340a71fe49bSChen Zheng default:
341a71fe49bSChen Zheng llvm_unreachable("Unhandled branch user for DecreaseCTRloop.");
342a71fe49bSChen Zheng }
343a71fe49bSChen Zheng
344a71fe49bSChen Zheng unsigned MTCTROpcode = Is64Bit ? PPC::MTCTR8 : PPC::MTCTR;
345a71fe49bSChen Zheng
346a71fe49bSChen Zheng // Generate "mtctr" in the loop preheader.
347a71fe49bSChen Zheng BuildMI(*Preheader, Start, Start->getDebugLoc(), TII->get(MTCTROpcode))
348a71fe49bSChen Zheng .addReg(Start->getOperand(0).getReg());
349a71fe49bSChen Zheng
350a71fe49bSChen Zheng // Generate "bdnz/bdz" in the exiting block just before the terminator.
351a71fe49bSChen Zheng BuildMI(*Exiting, &*BrInstr, BrInstr->getDebugLoc(), TII->get(Opcode))
352a71fe49bSChen Zheng .addMBB(BrInstr->getOperand(1).getMBB());
353a71fe49bSChen Zheng
354a71fe49bSChen Zheng // Remove the pseudo instructions.
355a71fe49bSChen Zheng Start->eraseFromParent();
356a71fe49bSChen Zheng BrInstr->eraseFromParent();
357a71fe49bSChen Zheng Dec->eraseFromParent();
358a71fe49bSChen Zheng }
359