mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-11 21:57:55 +00:00
BlockHasNoFallThrough() now returns true if block ends with a return instruction; AnalyzeBranch() should ignore predicated instructionsd.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37268 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7bf7a446a5
commit
5a18ebc70c
@ -298,6 +298,11 @@ ARMInstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
|
||||
return NewMIs[0];
|
||||
}
|
||||
|
||||
static bool isPredicated(MachineInstr *MI) {
|
||||
MachineOperand *PMO = MI->findFirstPredOperand();
|
||||
return PMO && PMO->getImmedValue() != ARMCC::AL;
|
||||
}
|
||||
|
||||
// Branch analysis.
|
||||
bool ARMInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
|
||||
MachineBasicBlock *&FBB,
|
||||
@ -312,7 +317,8 @@ bool ARMInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
|
||||
|
||||
// If there is only one terminator instruction, process it.
|
||||
unsigned LastOpc = LastInst->getOpcode();
|
||||
if (I == MBB.begin() || !isTerminatorInstr((--I)->getOpcode())) {
|
||||
if (I == MBB.begin() ||
|
||||
isPredicated(--I) || !isTerminatorInstr(I->getOpcode())) {
|
||||
if (LastOpc == ARM::B || LastOpc == ARM::tB) {
|
||||
TBB = LastInst->getOperand(0).getMachineBasicBlock();
|
||||
return false;
|
||||
@ -331,7 +337,7 @@ bool ARMInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
|
||||
|
||||
// If there are three terminators, we don't know what sort of block this is.
|
||||
if (SecondLastInst && I != MBB.begin() &&
|
||||
isTerminatorInstr((--I)->getOpcode()))
|
||||
!isPredicated(--I) && isTerminatorInstr(I->getOpcode()))
|
||||
return true;
|
||||
|
||||
// If the block ends with ARM::B/ARM::tB and a ARM::Bcc/ARM::tBcc, handle it.
|
||||
@ -407,6 +413,11 @@ bool ARMInstrInfo::BlockHasNoFallThrough(MachineBasicBlock &MBB) const {
|
||||
if (MBB.empty()) return false;
|
||||
|
||||
switch (MBB.back().getOpcode()) {
|
||||
case ARM::BX_RET: // Return.
|
||||
case ARM::LDM_RET:
|
||||
case ARM::tBX_RET:
|
||||
case ARM::tBX_RET_vararg:
|
||||
case ARM::tPOP_RET:
|
||||
case ARM::B:
|
||||
case ARM::tB: // Uncond branch.
|
||||
case ARM::tBR_JTr:
|
||||
|
Loading…
Reference in New Issue
Block a user