summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/CallSiteSplitting.cpp3
-rw-r--r--test/Transforms/CallSiteSplitting/callsite-no-splitting.ll24
2 files changed, 26 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/CallSiteSplitting.cpp b/lib/Transforms/Scalar/CallSiteSplitting.cpp
index caa73b2ff01..4edea7cc3c8 100644
--- a/lib/Transforms/Scalar/CallSiteSplitting.cpp
+++ b/lib/Transforms/Scalar/CallSiteSplitting.cpp
@@ -142,10 +142,11 @@ recordConditions(const CallSite &CS, BasicBlock *Pred,
recordCondition(CS, Pred, CS.getInstruction()->getParent(), Conditions);
BasicBlock *From = Pred;
BasicBlock *To = Pred;
- SmallPtrSet<BasicBlock *, 4> Visited = {From};
+ SmallPtrSet<BasicBlock *, 4> Visited;
while (!Visited.count(From->getSinglePredecessor()) &&
(From = From->getSinglePredecessor())) {
recordCondition(CS, From, To, Conditions);
+ Visited.insert(From);
To = From;
}
}
diff --git a/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll b/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll
index ca41bd6fc5e..25b4cb23be6 100644
--- a/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll
+++ b/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll
@@ -16,3 +16,27 @@ Tail:
%r = call i32 @callee(i32* %a, i32 %v, i32 %p)
ret i32 %r
}
+
+define void @fn1(i16 %p1) {
+entry:
+ ret void
+}
+
+define void @fn2() {
+ ret void
+
+; Unreachable code below
+
+for.inc: ; preds = %for.inc
+ br i1 undef, label %for.end6, label %for.inc
+
+for.end6: ; preds = %for.inc
+ br i1 undef, label %lor.rhs, label %lor.end
+
+lor.rhs: ; preds = %for.end6
+ br label %lor.end
+
+lor.end: ; preds = %for.end6, %lor.rhs
+ call void @fn1(i16 0)
+ ret void
+}