summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2018-09-11 11:44:17 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2018-09-11 11:44:17 +0000
commita58e9214ac6adc67e1a9229c7e8cea04819547a6 (patch)
tree8d5bf7b5bab1e90fc6e961377e1f5b1b7721b03f /llvm/lib
parent4f3c0e27b6f5ea2d512689768ece7e23e48c79a6 (diff)
downloadbcm5719-llvm-a58e9214ac6adc67e1a9229c7e8cea04819547a6.tar.gz
bcm5719-llvm-a58e9214ac6adc67e1a9229c7e8cea04819547a6.zip
[LoopInfo] Fix Loop::getLoopID() for loops with multiple latches
The previous implementation traversed all loop blocks and bailed if one was not a latch block. Since we are only interested in latch blocks, we should only traverse those. llvm-svn: 341926
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/LoopInfo.cpp17
1 files changed, 5 insertions, 12 deletions
diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp
index 0ee59131356..4664c78b8c0 100644
--- a/llvm/lib/Analysis/LoopInfo.cpp
+++ b/llvm/lib/Analysis/LoopInfo.cpp
@@ -218,20 +218,13 @@ MDNode *Loop::getLoopID() const {
} else {
assert(!getLoopLatch() &&
"The loop should have no single latch at this point");
- // Go through each predecessor of the loop header and check the
- // terminator for the metadata.
- BasicBlock *H = getHeader();
- for (BasicBlock *BB : this->blocks()) {
+ // Go through the latch blocks and check the terminator for the metadata.
+ SmallVector<BasicBlock *, 4> LatchesBlocks;
+ getLoopLatches(LatchesBlocks);
+ for (BasicBlock *BB : LatchesBlocks) {
TerminatorInst *TI = BB->getTerminator();
- MDNode *MD = nullptr;
+ MDNode *MD = TI->getMetadata(LLVMContext::MD_loop);
- // Check if this terminator branches to the loop header.
- for (BasicBlock *Successor : successors(TI)) {
- if (Successor == H) {
- MD = TI->getMetadata(LLVMContext::MD_loop);
- break;
- }
- }
if (!MD)
return nullptr;
OpenPOWER on IntegriCloud