Avoid de-referencing pass beginning of a basic block. No small test case possible. rdar://9216009

llvm-svn: 128743
This commit is contained in:
Evan Cheng 2011-04-01 22:09:28 +00:00
parent 3d9df607ba
commit 88530e6568
1 changed files with 21 additions and 18 deletions

View File

@ -1650,24 +1650,27 @@ bool ARMConstantIslands::OptimizeThumb2Branches(MachineFunction &MF) {
unsigned BrOffset = GetOffsetOf(Br.MI) + 4 - 2; unsigned BrOffset = GetOffsetOf(Br.MI) + 4 - 2;
unsigned DestOffset = BBOffsets[DestBB->getNumber()]; unsigned DestOffset = BBOffsets[DestBB->getNumber()];
if (BrOffset < DestOffset && (DestOffset - BrOffset) <= 126) { if (BrOffset < DestOffset && (DestOffset - BrOffset) <= 126) {
MachineBasicBlock::iterator CmpMI = Br.MI; --CmpMI; MachineBasicBlock::iterator CmpMI = Br.MI;
if (CmpMI->getOpcode() == ARM::tCMPi8) { if (CmpMI != Br.MI->getParent()->begin()) {
unsigned Reg = CmpMI->getOperand(0).getReg(); --CmpMI;
Pred = llvm::getInstrPredicate(CmpMI, PredReg); if (CmpMI->getOpcode() == ARM::tCMPi8) {
if (Pred == ARMCC::AL && unsigned Reg = CmpMI->getOperand(0).getReg();
CmpMI->getOperand(1).getImm() == 0 && Pred = llvm::getInstrPredicate(CmpMI, PredReg);
isARMLowRegister(Reg)) { if (Pred == ARMCC::AL &&
MachineBasicBlock *MBB = Br.MI->getParent(); CmpMI->getOperand(1).getImm() == 0 &&
MachineInstr *NewBR = isARMLowRegister(Reg)) {
BuildMI(*MBB, CmpMI, Br.MI->getDebugLoc(), TII->get(NewOpc)) MachineBasicBlock *MBB = Br.MI->getParent();
.addReg(Reg).addMBB(DestBB, Br.MI->getOperand(0).getTargetFlags()); MachineInstr *NewBR =
CmpMI->eraseFromParent(); BuildMI(*MBB, CmpMI, Br.MI->getDebugLoc(), TII->get(NewOpc))
Br.MI->eraseFromParent(); .addReg(Reg).addMBB(DestBB,Br.MI->getOperand(0).getTargetFlags());
Br.MI = NewBR; CmpMI->eraseFromParent();
BBSizes[MBB->getNumber()] -= 2; Br.MI->eraseFromParent();
AdjustBBOffsetsAfter(MBB, -2); Br.MI = NewBR;
++NumCBZ; BBSizes[MBB->getNumber()] -= 2;
MadeChange = true; AdjustBBOffsetsAfter(MBB, -2);
++NumCBZ;
MadeChange = true;
}
} }
} }
} }