42#define DEBUG_TYPE "ppc-ctrloops-verify"
65 char PPCCTRLoopsVerify::ID = 0;
69 "PowerPC CTR Loops Verify",
false,
false)
75 return new PPCCTRLoopsVerify();
81 if (MO.isDef() && (MO.getReg() == PPC::CTR || MO.getReg() == PPC::CTR8))
83 }
else if (MO.isRegMask()) {
84 if (MO.clobbersPhysReg(PPC::CTR) || MO.clobbersPhysReg(PPC::CTR8))
99 if (
I ==
MBB->begin()) {
112 unsigned Opc =
I->getOpcode();
113 if (
Opc == PPC::MTCTRloop ||
Opc == PPC::MTCTR8loop) {
120 <<
") instruction " << *
I
121 <<
" clobbers CTR, invalidating "
123 << BI->getParent()->getFullName() <<
") instruction "
132 if (!CheckPreds && Preds.
empty())
140 << BI->getParent()->getFullName() <<
") instruction "
151 I =
MBB->getLastNonDebugInstr();
154 }
while (!Preds.
empty());
160 MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
164 for (MachineBasicBlock &
MBB : MF) {
169 MIIE =
MBB.
end(); MII != MIIE; ++MII) {
170 unsigned Opc = MII->getOpcode();
171 if (
Opc == PPC::BDNZ8 ||
Opc == PPC::BDNZ ||
172 Opc == PPC::BDZ8 ||
Opc == PPC::BDZ)
static bool verifyCTRBranch(MachineBasicBlock *MBB, MachineBasicBlock::iterator I)
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 SmallVector class.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
bool isReachableFromEntry(const NodeT *A) const
isReachableFromEntry - Return true if A is dominated by the entry block of the function containing it...
FunctionPass class - This class is used to implement most global optimizations.
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
MachineInstrBundleIterator< MachineInstr > iterator
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.
BasicBlockListType::iterator iterator
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
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.
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 &)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionPass * createPPCCTRLoopsVerify()
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.