[llvm-commits] [llvm] r128724 - /llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
Akira Hatanaka
ahatanak at gmail.com
Fri Apr 1 11:57:38 PDT 2011
Author: ahatanak
Date: Fri Apr 1 13:57:38 2011
New Revision: 128724
URL: http://llvm.org/viewvc/llvm-project?rev=128724&view=rev
Log:
Modifies MipsAsmPrinter::isBlockOnlyReachableByFallthrough so that it handles delay slots correctly.
Modified:
llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
Modified: llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp?rev=128724&r1=128723&r2=128724&view=diff
==============================================================================
--- llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/Mips/MipsAsmPrinter.cpp Fri Apr 1 13:57:38 2011
@@ -247,7 +247,32 @@
if (isa<SwitchInst>(bb->getTerminator()))
return false;
- return AsmPrinter::isBlockOnlyReachableByFallthrough(MBB);
+ // If this is a landing pad, it isn't a fall through. If it has no preds,
+ // then nothing falls through to it.
+ if (MBB->isLandingPad() || MBB->pred_empty())
+ return false;
+
+ // If there isn't exactly one predecessor, it can't be a fall through.
+ MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI;
+ ++PI2;
+
+ if (PI2 != MBB->pred_end())
+ return false;
+
+ // The predecessor has to be immediately before this block.
+ if (!Pred->isLayoutSuccessor(MBB))
+ return false;
+
+ // If the block is completely empty, then it definitely does fall through.
+ if (Pred->empty())
+ return true;
+
+ // Otherwise, check the last instruction.
+ // Check if the last terminator is an unconditional branch.
+ MachineBasicBlock::const_iterator I = Pred->end();
+ while (I != Pred->begin() && !(--I)->getDesc().isTerminator());
+
+ return !I->getDesc().isBarrier();
}
// Print out an operand for an inline asm expression.
More information about the llvm-commits
mailing list