[llvm-branch-commits] [llvm-branch] r100437 - in /llvm/branches/Apple/Morbo: include/llvm/BasicBlock.h lib/CodeGen/DwarfEHPrepare.cpp lib/VMCore/BasicBlock.cpp
Dale Johannesen
dalej at apple.com
Mon Apr 5 10:43:52 PDT 2010
Author: johannes
Date: Mon Apr 5 12:43:52 2010
New Revision: 100437
URL: http://llvm.org/viewvc/llvm-project?rev=100437&view=rev
Log:
Merge 100230.
Modified:
llvm/branches/Apple/Morbo/include/llvm/BasicBlock.h
llvm/branches/Apple/Morbo/lib/CodeGen/DwarfEHPrepare.cpp
llvm/branches/Apple/Morbo/lib/VMCore/BasicBlock.cpp
Modified: llvm/branches/Apple/Morbo/include/llvm/BasicBlock.h
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Morbo/include/llvm/BasicBlock.h?rev=100437&r1=100436&r2=100437&view=diff
==============================================================================
--- llvm/branches/Apple/Morbo/include/llvm/BasicBlock.h (original)
+++ llvm/branches/Apple/Morbo/include/llvm/BasicBlock.h Mon Apr 5 12:43:52 2010
@@ -131,6 +131,12 @@
const Instruction* getFirstNonPHI() const {
return const_cast<BasicBlock*>(this)->getFirstNonPHI();
}
+
+ // Same as above, but also skip debug intrinsics.
+ Instruction* getFirstNonPHIOrDbg();
+ const Instruction* getFirstNonPHIOrDbg() const {
+ return const_cast<BasicBlock*>(this)->getFirstNonPHIOrDbg();
+ }
/// removeFromParent - This method unlinks 'this' from the containing
/// function, but does not delete it.
Modified: llvm/branches/Apple/Morbo/lib/CodeGen/DwarfEHPrepare.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Morbo/lib/CodeGen/DwarfEHPrepare.cpp?rev=100437&r1=100436&r2=100437&view=diff
==============================================================================
--- llvm/branches/Apple/Morbo/lib/CodeGen/DwarfEHPrepare.cpp (original)
+++ llvm/branches/Apple/Morbo/lib/CodeGen/DwarfEHPrepare.cpp Mon Apr 5 12:43:52 2010
@@ -661,7 +661,7 @@
/// the start of the basic block (unless there already is one, in which case
/// the existing call is returned).
Instruction *DwarfEHPrepare::CreateExceptionValueCall(BasicBlock *BB) {
- Instruction *Start = BB->getFirstNonPHI();
+ Instruction *Start = BB->getFirstNonPHIOrDbg();
// Is this a call to eh.exception?
if (IntrinsicInst *CI = dyn_cast<IntrinsicInst>(Start))
if (CI->getIntrinsicID() == Intrinsic::eh_exception)
@@ -681,7 +681,7 @@
/// (creating it if necessary) at the start of the basic block (unless
/// there already is a load, in which case the existing load is returned).
Instruction *DwarfEHPrepare::CreateValueLoad(BasicBlock *BB) {
- Instruction *Start = BB->getFirstNonPHI();
+ Instruction *Start = BB->getFirstNonPHIOrDbg();
// Is this a load of the exception temporary?
if (ExceptionValueVar)
if (LoadInst* LI = dyn_cast<LoadInst>(Start))
Modified: llvm/branches/Apple/Morbo/lib/VMCore/BasicBlock.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Morbo/lib/VMCore/BasicBlock.cpp?rev=100437&r1=100436&r2=100437&view=diff
==============================================================================
--- llvm/branches/Apple/Morbo/lib/VMCore/BasicBlock.cpp (original)
+++ llvm/branches/Apple/Morbo/lib/VMCore/BasicBlock.cpp Mon Apr 5 12:43:52 2010
@@ -14,6 +14,7 @@
#include "llvm/BasicBlock.h"
#include "llvm/Constants.h"
#include "llvm/Instructions.h"
+#include "llvm/IntrinsicInst.h"
#include "llvm/LLVMContext.h"
#include "llvm/Type.h"
#include "llvm/ADT/STLExtras.h"
@@ -136,6 +137,16 @@
return &*i;
}
+Instruction* BasicBlock::getFirstNonPHIOrDbg() {
+ BasicBlock::iterator i = begin();
+ // All valid basic blocks should have a terminator,
+ // which is not a PHINode. If we have an invalid basic
+ // block we'll get an assertion failure when dereferencing
+ // a past-the-end iterator.
+ while (isa<PHINode>(i) || isa<DbgInfoIntrinsic>(i)) ++i;
+ return &*i;
+}
+
void BasicBlock::dropAllReferences() {
for(iterator I = begin(), E = end(); I != E; ++I)
I->dropAllReferences();
More information about the llvm-branch-commits
mailing list