1//===-- PPCCTRLoops.cpp - Verify CTR loops -----------------===// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7//===----------------------------------------------------------------------===// 9// This pass verifies that all bdnz/bdz instructions are dominated by a loop 10// mtctr before any other instructions that might clobber the ctr register. 12//===----------------------------------------------------------------------===// 14// CTR loops are produced by the HardwareLoops pass and this pass is simply a 15// verification that no invalid CTR loops are produced. As such, it isn't 16// something that needs to be run (or even defined) for Release builds so the 17// entire file is guarded by NDEBUG. 43#define DEBUG_TYPE "ppc-ctrloops-verify" 66char PPCCTRLoopsVerify::ID = 0;
67}
// end anonymous namespace 70"PowerPC CTR Loops Verify",
false,
false)
76returnnew PPCCTRLoopsVerify();
82if (MO.isDef() && (MO.getReg() == PPC::CTR || MO.getReg() == PPC::CTR8))
84 }
elseif (MO.isRegMask()) {
85if (MO.clobbersPhysReg(PPC::CTR) || MO.clobbersPhysReg(PPC::CTR8))
113unsigned Opc =
I->getOpcode();
114if (Opc == PPC::MTCTRloop || Opc == PPC::MTCTR8loop) {
121 <<
") instruction " << *
I 122 <<
" clobbers CTR, invalidating " 124 << BI->getParent()->getFullName() <<
") instruction " 133if (!CheckPreds && Preds.
empty())
141 << BI->getParent()->getFullName() <<
") instruction " 155 }
while (!Preds.
empty());
161 MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
163// Verify that all bdnz/bdz instructions are dominated by a loop mtctr before 164// any other instructions that might clobber the ctr register. 166if (!MDT->isReachableFromEntry(&
MBB))
170 MIIE =
MBB.
end(); MII != MIIE; ++MII) {
171unsigned Opc = MII->getOpcode();
172if (Opc == PPC::BDNZ8 || Opc == PPC::BDNZ ||
173 Opc == PPC::BDZ8 || Opc == PPC::BDZ)
static bool verifyCTRBranch(MachineBasicBlock *MBB, MachineBasicBlock::iterator I)
ppc ctr loops PowerPC CTR Loops Verify
static bool clobbersCTR(const MachineInstr &MI)
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
This file defines the SmallSet class.
This file defines the SmallVector class.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
FunctionPass class - This class is used to implement most global optimizations.
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
iterator getLastNonDebugInstr(bool SkipPseudoOp=true)
Returns an iterator to the last non-debug instruction in the basic block, or end().
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
std::string getFullName() const
Return a formatted string to identify this block and its parent function.
iterator_range< pred_iterator > predecessors()
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void initializePPCCTRLoopsVerifyPass(PassRegistry &)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createPPCCTRLoopsVerify()
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.