mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-30 00:24:00 +00:00
Remove ADCE's ability to delete loops. This ability is now implemented in a
safer manner by loop deletion. llvm-svn: 51182
This commit is contained in:
parent
55b78bc887
commit
6fbcec4778
@ -191,10 +191,18 @@ bool ADCE::doADCE() {
|
||||
// be eliminated later, along with the instructions inside.
|
||||
//
|
||||
std::set<BasicBlock*> ReachableBBs;
|
||||
for (df_ext_iterator<BasicBlock*>
|
||||
BBI = df_ext_begin(&Func->front(), ReachableBBs),
|
||||
BBE = df_ext_end(&Func->front(), ReachableBBs); BBI != BBE; ++BBI) {
|
||||
BasicBlock *BB = *BBI;
|
||||
std::vector<BasicBlock*> Stack;
|
||||
Stack.push_back(&Func->getEntryBlock());
|
||||
|
||||
while (!Stack.empty()) {
|
||||
BasicBlock* BB = Stack.back();
|
||||
if (ReachableBBs.count(BB)) {
|
||||
Stack.pop_back();
|
||||
continue;
|
||||
} else {
|
||||
ReachableBBs.insert(BB);
|
||||
}
|
||||
|
||||
for (BasicBlock::iterator II = BB->begin(), EI = BB->end(); II != EI; ) {
|
||||
Instruction *I = II++;
|
||||
if (CallInst *CI = dyn_cast<CallInst>(I)) {
|
||||
@ -217,6 +225,15 @@ bool ADCE::doADCE() {
|
||||
++NumInstRemoved;
|
||||
}
|
||||
}
|
||||
|
||||
for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI) {
|
||||
// Back edges (as opposed to cross edges) indicate loops, so implicitly
|
||||
// mark them live.
|
||||
if (std::find(Stack.begin(), Stack.end(), *SI) != Stack.end())
|
||||
markInstructionLive(BB->getTerminator());
|
||||
if (!ReachableBBs.count(*SI))
|
||||
Stack.push_back(*SI);
|
||||
}
|
||||
}
|
||||
|
||||
// Check to ensure we have an exit node for this CFG. If we don't, we won't
|
||||
|
Loading…
x
Reference in New Issue
Block a user