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