summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Utils/SSI.cpp8
-rw-r--r--test/Transforms/SSI/2009-08-15-UnreachableBB.ll19
2 files changed, 25 insertions, 2 deletions
diff --git a/lib/Transforms/Utils/SSI.cpp b/lib/Transforms/Utils/SSI.cpp
index 63ca354793..7736f08768 100644
--- a/lib/Transforms/Utils/SSI.cpp
+++ b/lib/Transforms/Utils/SSI.cpp
@@ -39,7 +39,7 @@ STATISTIC(NumPhiInserted, "Number of phi functions inserted");
void SSI::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DominanceFrontier>();
AU.addRequired<DominatorTree>();
- AU.setPreservesAll();
+ AU.setPreservesCFG();
}
bool SSI::runOnFunction(Function &F) {
@@ -121,7 +121,7 @@ void SSI::insertPhiFunctions(SmallVectorImpl<Instruction *> &value) {
// Test if there were any sigmas for this variable
if (needConstruction[i]) {
- SmallPtrSet<BasicBlock *, 1> BB_visited;
+ SmallPtrSet<BasicBlock *, 16> BB_visited;
// Insert phi functions if there is any sigma function
while (!defsites[i].empty()) {
@@ -131,6 +131,10 @@ void SSI::insertPhiFunctions(SmallVectorImpl<Instruction *> &value) {
defsites[i].pop_back();
DominanceFrontier::iterator DF_BB = DF->find(BB);
+ // The BB is unreachable. Skip it.
+ if (DF_BB == DF->end())
+ continue;
+
// Iterates through all the dominance frontier of BB
for (std::set<BasicBlock *>::iterator DF_BB_begin =
DF_BB->second.begin(), DF_BB_end = DF_BB->second.end();
diff --git a/test/Transforms/SSI/2009-08-15-UnreachableBB.ll b/test/Transforms/SSI/2009-08-15-UnreachableBB.ll
new file mode 100644
index 0000000000..11a4f60b15
--- /dev/null
+++ b/test/Transforms/SSI/2009-08-15-UnreachableBB.ll
@@ -0,0 +1,19 @@
+; RUN: llvm-as < %s | opt -ssi-everything -disable-output
+
+declare fastcc i32 @ras_Empty(i8** nocapture) nounwind readonly
+
+define i32 @cc_Tautology() nounwind {
+entry:
+ unreachable
+
+cc_InitData.exit: ; No predecessors!
+ %0 = call fastcc i32 @ras_Empty(i8** undef) nounwind ; <i32> [#uses=1]
+ %1 = icmp eq i32 %0, 0 ; <i1> [#uses=1]
+ br i1 %1, label %bb2, label %bb6
+
+bb2: ; preds = %cc_InitData.exit
+ unreachable
+
+bb6: ; preds = %cc_InitData.exit
+ ret i32 undef
+}