18 #define DEBUG_TYPE "ppc-branch-select"
29 STATISTIC(NumExpanded,
"Number of branches expanded to long format");
43 std::vector<unsigned> BlockSizes;
47 virtual const char *getPassName()
const {
48 return "PowerPC Branch Selector";
72 unsigned FuncSize = 0;
77 unsigned BlockSize = 0;
83 FuncSize += BlockSize;
89 if (FuncSize < (1 << 15)) {
103 bool MadeChange =
true;
104 bool EverMadeChange =
false;
112 unsigned MBBStartOffset = 0;
116 if (
I->getOpcode() == PPC::BCC && !
I->getOperand(2).isImm())
117 Dest =
I->getOperand(2).getMBB();
118 else if ((
I->getOpcode() == PPC::BDNZ8 ||
I->getOpcode() ==
PPC::BDNZ ||
119 I->getOpcode() == PPC::BDZ8 ||
I->getOpcode() ==
PPC::BDZ) &&
120 !
I->getOperand(0).isImm())
121 Dest =
I->getOperand(0).getMBB();
135 BranchSize = MBBStartOffset;
138 BranchSize += BlockSizes[i];
142 BranchSize = -MBBStartOffset;
145 BranchSize += BlockSizes[i];
158 if (
I->getOpcode() == PPC::BCC) {
164 unsigned CRReg =
I->getOperand(1).getReg();
167 BuildMI(MBB,
I, dl, TII->get(PPC::BCC))
171 }
else if (
I->getOpcode() == PPC::BDNZ8) {
172 BuildMI(MBB,
I, dl, TII->get(PPC::BDZ8)).addImm(2);
175 }
else if (
I->getOpcode() == PPC::BDZ8) {
176 BuildMI(MBB,
I, dl, TII->get(PPC::BDNZ8)).addImm(2);
182 I =
BuildMI(MBB,
I, dl, TII->get(PPC::B)).addMBB(Dest);
195 EverMadeChange |= MadeChange;
static PassRegistry * getPassRegistry()
unsigned getNumBlockIDs() const
const HexagonInstrInfo * TII
void initializePPCBSelPass(PassRegistry &)
#define llvm_unreachable(msg)
ID
LLVM Calling Convention Representation.
const MachineInstrBuilder & addImm(int64_t Val) const
void RenumberBlocks(MachineBasicBlock *MBBFrom=0)
FunctionPass * createPPCBranchSelectionPass()
bundle_iterator< MachineInstr, instr_iterator > iterator
INITIALIZE_PASS(PPCBSel,"ppc-branch-select","PowerPC Branch Selector", false, false) FunctionPass *llvm
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
STATISTIC(NumExpanded,"Number of branches expanded to long format")
virtual const TargetInstrInfo * getInstrInfo() const
Predicate
Predicate - These are "(BI << 5) | BO" for various predicates.
Predicate InvertPredicate(Predicate Opcode)
Invert the specified predicate. != -> ==, < -> >=.
const TargetMachine & getTarget() const
bool isInt< 16 >(int64_t x)
virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const
BasicBlockListType::iterator iterator
DebugLoc getDebugLoc() const