diff options
author | Nikita Popov <npopov@redhat.com> | 2023-08-22 10:33:33 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2023-08-22 10:33:33 +0200 |
commit | d82f0b74dec133cb90767edb032f987930d53772 (patch) | |
tree | ec980cfd4ec03f175cd98d23e16bd80c2e578dbc /llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | |
parent | 1de568d129bc9b884b403a41ea4ae2ca15b1c504 (diff) | |
download | llvm-d82f0b74dec133cb90767edb032f987930d53772.zip llvm-d82f0b74dec133cb90767edb032f987930d53772.tar.gz llvm-d82f0b74dec133cb90767edb032f987930d53772.tar.bz2 |
[IndVars] Don't assume backedge value is instruction (PR64891)
In degenerate cases, the backedge value can be folded to poison.
Fixes https://github.com/llvm/llvm-project/issues/64891.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyIndVar.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyIndVar.cpp | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp index a28916b..14582c7 100644 --- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -1944,13 +1944,15 @@ PHINode *WidenIV::createWideIV(SCEVExpander &Rewriter) { // SCEVExpander. Henceforth, we produce 1-to-1 narrow to wide uses. if (BasicBlock *LatchBlock = L->getLoopLatch()) { WideInc = - cast<Instruction>(WidePhi->getIncomingValueForBlock(LatchBlock)); - WideIncExpr = SE->getSCEV(WideInc); - // Propagate the debug location associated with the original loop increment - // to the new (widened) increment. - auto *OrigInc = - cast<Instruction>(OrigPhi->getIncomingValueForBlock(LatchBlock)); - WideInc->setDebugLoc(OrigInc->getDebugLoc()); + dyn_cast<Instruction>(WidePhi->getIncomingValueForBlock(LatchBlock)); + if (WideInc) { + WideIncExpr = SE->getSCEV(WideInc); + // Propagate the debug location associated with the original loop + // increment to the new (widened) increment. + auto *OrigInc = + cast<Instruction>(OrigPhi->getIncomingValueForBlock(LatchBlock)); + WideInc->setDebugLoc(OrigInc->getDebugLoc()); + } } LLVM_DEBUG(dbgs() << "Wide IV: " << *WidePhi << "\n"); |