SSI construction should just go ahead and ignore instructions in unreachable
blocks.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@79132 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Utils/SSI.cpp b/lib/Transforms/Utils/SSI.cpp
index 63ca354..7736f08 100644
--- a/lib/Transforms/Utils/SSI.cpp
+++ b/lib/Transforms/Utils/SSI.cpp
@@ -39,7 +39,7 @@
 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 @@
     // 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 @@
         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();