47#define DEBUG_TYPE "ppc-ctrloops-verify"
70 char PPCCTRLoopsVerify::ID = 0;
74 "PowerPC CTR Loops Verify",
false,
false)
80 return new PPCCTRLoopsVerify();
86 if (MO.isDef() && (MO.getReg() == PPC::CTR || MO.getReg() == PPC::CTR8))
88 }
else if (MO.isRegMask()) {
89 if (MO.clobbersPhysReg(PPC::CTR) || MO.clobbersPhysReg(PPC::CTR8))
117 unsigned Opc =
I->getOpcode();
118 if (Opc == PPC::MTCTRloop || Opc == PPC::MTCTR8loop) {
125 <<
") instruction " << *
I
126 <<
" clobbers CTR, invalidating "
128 << BI->getParent()->getFullName() <<
") instruction "
137 if (!CheckPreds && Preds.
empty())
145 << BI->getParent()->getFullName() <<
") instruction "
159 }
while (!Preds.
empty());
165 MDT = &getAnalysis<MachineDominatorTree>();
170 if (!MDT->isReachableFromEntry(&
MBB))
174 MIIE =
MBB.
end(); MII != MIIE; ++MII) {
175 unsigned Opc = MII->getOpcode();
176 if (Opc == PPC::BDNZ8 || Opc == PPC::BDNZ ||
177 Opc == PPC::BDZ8 || Opc == PPC::BDZ)
Generic dominator tree construction - this file provides routines to construct immediate dominator in...
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()
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 a range to a container.
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.