diff options
author | Shan Huang <52285902006@stu.ecnu.edu.cn> | 2024-05-17 17:56:05 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-17 10:56:05 +0100 |
commit | d0e2808f806ece6d2aa8d359a700afab87ded16b (patch) | |
tree | 561792d7858c76de905a9ac752168a5c98d1cb0a /llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp | |
parent | 7c16e7d9cd37d7d1162866c5ac29fe4ab2e24a5a (diff) | |
download | llvm-d0e2808f806ece6d2aa8d359a700afab87ded16b.zip llvm-d0e2808f806ece6d2aa8d359a700afab87ded16b.tar.gz llvm-d0e2808f806ece6d2aa8d359a700afab87ded16b.tar.bz2 |
[DebugInfo][LoopLoadElim] Fix missing debug location updates (#91839)
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp index f611ef6..38aea13 100644 --- a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp +++ b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp @@ -448,6 +448,10 @@ public: new LoadInst(Cand.Load->getType(), InitialPtr, "load_initial", /* isVolatile */ false, Cand.Load->getAlign(), PH->getTerminator()->getIterator()); + // We don't give any debug location to Initial, because it is inserted + // into the loop's preheader. A debug location inside the loop will cause + // a misleading stepping when debugging. The test update-debugloc-store + // -forwarded.ll checks this. PHINode *PHI = PHINode::Create(Initial->getType(), 2, "store_forwarded"); PHI->insertBefore(L->getHeader()->begin()); @@ -462,14 +466,20 @@ public: "The type sizes should match!"); Value *StoreValue = Cand.Store->getValueOperand(); - if (LoadType != StoreType) + if (LoadType != StoreType) { StoreValue = CastInst::CreateBitOrPointerCast(StoreValue, LoadType, "store_forward_cast", Cand.Store->getIterator()); + // Because it casts the old `load` value and is used by the new `phi` + // which replaces the old `load`, we give the `load`'s debug location + // to it. + cast<Instruction>(StoreValue)->setDebugLoc(Cand.Load->getDebugLoc()); + } PHI->addIncoming(StoreValue, L->getLoopLatch()); Cand.Load->replaceAllUsesWith(PHI); + PHI->setDebugLoc(Cand.Load->getDebugLoc()); } /// Top-level driver for each loop: find store->load forwarding |