[SimplifyCFG] Use the error checking provided by getPrevNode.
BasicBlock::size is O(insts), making this loop O(blocks*insts), which
can be really slow on generated code. getPrevNode already checks if
we're at the beginning of the block and returns nullptr if so, just use
that instead. No functionality change intended.
llvm-svn: 284303
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index a45a0c7..21bb87b 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -1584,12 +1584,15 @@
Fail = false;
Insts.clear();
for (auto *BB : Blocks) {
- if (BB->size() <= 1) {
- // Block wasn't big enough
- Fail = true;
- return;
+ if (Instruction *Terminator = BB->getTerminator()) {
+ if (Instruction *LastNonTerminator = Terminator->getPrevNode()) {
+ Insts.push_back(LastNonTerminator);
+ continue;
+ }
}
- Insts.push_back(BB->getTerminator()->getPrevNode());
+ // Block wasn't big enough.
+ Fail = true;
+ return;
}
}
@@ -1601,11 +1604,12 @@
if (Fail)
return;
for (auto *&Inst : Insts) {
- if (Inst == &Inst->getParent()->front()) {
+ Inst = Inst->getPrevNode();
+ // Already at beginning of block.
+ if (!Inst) {
Fail = true;
return;
}
- Inst = Inst->getPrevNode();
}
}