diff --git a/include/llvm/Transforms/Utils/Local.h b/include/llvm/Transforms/Utils/Local.h index 2032d548714..35d2c0ce7e0 100644 --- a/include/llvm/Transforms/Utils/Local.h +++ b/include/llvm/Transforms/Utils/Local.h @@ -39,14 +39,6 @@ template class SmallVectorImpl; /// bool ConstantFoldTerminator(BasicBlock *BB); -//===----------------------------------------------------------------------===// -// CFG Simplification -// - -/// isTerminatorFirstRelevantInsn - Return true if Term is very first -/// instruction ignoring Phi nodes and dbg intrinsics. -bool isTerminatorFirstRelevantInsn(BasicBlock *BB, Instruction *Term); - //===----------------------------------------------------------------------===// // Local dead code elimination. // diff --git a/lib/Transforms/Scalar/CondPropagate.cpp b/lib/Transforms/Scalar/CondPropagate.cpp index 000ef60a0db..c4e2b1a4017 100644 --- a/lib/Transforms/Scalar/CondPropagate.cpp +++ b/lib/Transforms/Scalar/CondPropagate.cpp @@ -148,7 +148,7 @@ void CondProp::SimplifyPredecessors(BranchInst *BI) { if (!PN->hasOneUse()) return; BasicBlock *BB = BI->getParent(); - if (!isTerminatorFirstRelevantInsn (BB, BI)) + if (&*BB->begin() != PN || &*next(BB->begin()) != BI) return; // Ok, we have this really simple case, walk the PHI operands, looking for @@ -182,7 +182,7 @@ void CondProp::SimplifyPredecessors(SwitchInst *SI) { if (!PN->hasOneUse()) return; BasicBlock *BB = SI->getParent(); - if (!isTerminatorFirstRelevantInsn (BB, SI)) + if (&*BB->begin() != PN || &*next(BB->begin()) != SI) return; bool RemovedPreds = false; diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index aa6efe80b32..c22485342e0 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -148,23 +148,6 @@ bool llvm::ConstantFoldTerminator(BasicBlock *BB) { return false; } -//===----------------------------------------------------------------------===// -// CFG Simplification -// - -/// isTerminatorFirstRelevantInsn - Return true if Term is very first -/// instruction ignoring Phi nodes and dbg intrinsics. -bool llvm::isTerminatorFirstRelevantInsn(BasicBlock *BB, Instruction *Term) { - BasicBlock::iterator BBI = Term; - while (BBI != BB->begin()) { - --BBI; - if (!isa(BBI)) - break; - } - if (isa(BBI) || &*BBI == Term) - return true; - return false; -} //===----------------------------------------------------------------------===// // Local dead code elimination... diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 0248d3d0ca0..d9c4b69e6de 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -1330,6 +1330,20 @@ static bool FoldTwoEntryPHINode(PHINode *PN) { return true; } +/// isTerminatorFirstRelevantInsn - Return true if Term is very first +/// instruction ignoring Phi nodes and dbg intrinsics. +static bool isTerminatorFirstRelevantInsn(BasicBlock *BB, Instruction *Term) { + BasicBlock::iterator BBI = Term; + while (BBI != BB->begin()) { + --BBI; + if (!isa(BBI)) + break; + } + if (isa(BBI) || &*BBI == Term) + return true; + return false; +} + /// SimplifyCondBranchToTwoReturns - If we found a conditional branch that goes /// to two returning blocks, try to merge them together into one return, /// introducing a select if the return values disagree. diff --git a/test/Transforms/CondProp/basictest-dbg.ll b/test/Transforms/CondProp/basictest-dbg.ll deleted file mode 100644 index d8a680b8984..00000000000 --- a/test/Transforms/CondProp/basictest-dbg.ll +++ /dev/null @@ -1,45 +0,0 @@ -; RUN: llvm-as < %s | opt -condprop | llvm-dis | \ -; RUN: not grep {br label} - - %llvm.dbg.anchor.type = type { i32, i32 } - %llvm.dbg.compile_unit.type = type { i32, { }*, i32, i8*, i8*, i8*, i1, i1, i8* } - -@llvm.dbg.compile_units = linkonce constant %llvm.dbg.anchor.type { i32 458752, i32 17 }, section "llvm.metadata" ; - -@.str = internal constant [4 x i8] c"a.c\00", section "llvm.metadata" ; <[4 x i8]*> [#uses=1] -@.str1 = internal constant [6 x i8] c"/tmp/\00", section "llvm.metadata" ; <[6 x i8]*> [#uses=1] -@.str2 = internal constant [55 x i8] c"4.2.1 (Based on Apple Inc. build 5636) (LLVM build 00)\00", section "llvm.metadata" ; <[55 x i8]*> [#uses=1] -@llvm.dbg.compile_unit = internal constant %llvm.dbg.compile_unit.type { i32 458769, { }* bitcast (%llvm.dbg.anchor.type* @llvm.dbg.compile_units to { }*), i32 1, i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), i8* getelementptr ([6 x i8]* @.str1, i32 0, i32 0), i8* getelementptr ([55 x i8]* @.str2, i32 0, i32 0), i1 true, i1 false, i8* null }, section "llvm.metadata" ; <%llvm.dbg.compile_unit.type*> [#uses=1] - -declare void @llvm.dbg.stoppoint(i32, i32, { }*) nounwind - - -define i32 @test(i1 %C) { - br i1 %C, label %T1, label %F1 - -T1: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - br label %Cont - -F1: ; preds = %0 -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - br label %Cont - -Cont: ; preds = %F1, %T1 - %C2 = phi i1 [ false, %F1 ], [ true, %T1 ] ; [#uses=1] -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - br i1 %C2, label %T2, label %F2 - -T2: ; preds = %Cont -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - call void @bar( ) -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 17 - -F2: ; preds = %Cont -call void @llvm.dbg.stoppoint(i32 5, i32 0, { }* bitcast (%llvm.dbg.compile_unit.type* @llvm.dbg.compile_unit to { }*)) - ret i32 1 -} - -declare void @bar() -