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
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;
}
}
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();
}
}