mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 23:18:58 +00:00
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:
parent
bf230bf5cc
commit
071d84e109
@ -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();
|
||||||
|
19
test/Transforms/SSI/2009-08-15-UnreachableBB.ll
Normal file
19
test/Transforms/SSI/2009-08-15-UnreachableBB.ll
Normal 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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user