[LoopInfo] Faster implementation of setLoopID. NFC.

Summary:
This change was part of D46460. However, in the meantime rL341926 fixed the
correctness issue here. What remained was the performance issue in setLoopID
where it would iterate through all blocks in the loop and their successors,
rather than just the predecessor of the header (the later presumably being
much faster). We already have the `getLoopLatches` to compute precisely these
basic blocks in an efficient manner, so just use it (as the original commit
did for `getLoopID`).

Reviewed By: jdoerfert
Differential Revision: https://reviews.llvm.org/D61215

llvm-svn: 359684
This commit is contained in:
Keno Fischer 2019-05-01 14:39:11 +00:00
parent 6e32dd6cfd
commit d8f856d265
1 changed files with 4 additions and 10 deletions

View File

@ -254,16 +254,10 @@ void Loop::setLoopID(MDNode *LoopID) const {
assert((!LoopID || LoopID->getOperand(0) == LoopID) &&
"Loop ID should refer to itself");
BasicBlock *H = getHeader();
for (BasicBlock *BB : this->blocks()) {
Instruction *TI = BB->getTerminator();
for (BasicBlock *Successor : successors(TI)) {
if (Successor == H) {
TI->setMetadata(LLVMContext::MD_loop, LoopID);
break;
}
}
}
SmallVector<BasicBlock *, 4> LoopLatches;
getLoopLatches(LoopLatches);
for (BasicBlock *BB : LoopLatches)
BB->getTerminator()->setMetadata(LLVMContext::MD_loop, LoopID);
}
void Loop::setLoopAlreadyUnrolled() {