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
This commit is contained in:
Nick Lewycky 2009-08-15 20:12:18 +00:00
parent bf230bf5cc
commit 071d84e109
2 changed files with 25 additions and 2 deletions

View File

@ -39,7 +39,7 @@ STATISTIC(NumPhiInserted, "Number of phi functions inserted");
void SSI::getAnalysisUsage(AnalysisUsage &AU) const { void SSI::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DominanceFrontier>(); AU.addRequired<DominanceFrontier>();
AU.addRequired<DominatorTree>(); AU.addRequired<DominatorTree>();
AU.setPreservesAll(); AU.setPreservesCFG();
} }
bool SSI::runOnFunction(Function &F) { bool SSI::runOnFunction(Function &F) {
@ -121,7 +121,7 @@ void SSI::insertPhiFunctions(SmallVectorImpl<Instruction *> &value) {
// Test if there were any sigmas for this variable // Test if there were any sigmas for this variable
if (needConstruction[i]) { if (needConstruction[i]) {
SmallPtrSet<BasicBlock *, 1> BB_visited; SmallPtrSet<BasicBlock *, 16> BB_visited;
// Insert phi functions if there is any sigma function // Insert phi functions if there is any sigma function
while (!defsites[i].empty()) { while (!defsites[i].empty()) {
@ -131,6 +131,10 @@ void SSI::insertPhiFunctions(SmallVectorImpl<Instruction *> &value) {
defsites[i].pop_back(); defsites[i].pop_back();
DominanceFrontier::iterator DF_BB = DF->find(BB); 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 // Iterates through all the dominance frontier of BB
for (std::set<BasicBlock *>::iterator DF_BB_begin = for (std::set<BasicBlock *>::iterator DF_BB_begin =
DF_BB->second.begin(), DF_BB_end = DF_BB->second.end(); DF_BB->second.begin(), DF_BB_end = DF_BB->second.end();

View File

@ -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
}