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