[llvm] [DebugInfo][LoopLoadElim] Fix missing debug location updates (PR #91839)

Shan Huang via llvm-commits llvm-commits at lists.llvm.org
Mon May 13 07:51:30 PDT 2024


================
@@ -462,14 +466,20 @@ class LoadEliminationForLoop {
            "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());
----------------
Apochens wrote:

> I think in this case using the load's DebugLoc makes intuitive sense - we're just eliminating the load here after all

That's what I agree with. 

> When promoting store/loads I think we usually give phis a debugloc from the store (or if it's from stores, plural, it's a merged location).

I'd like to know why give the store'd debug location to an instruction that replaces a load instruction. Are there some conventions or something? 

https://github.com/llvm/llvm-project/pull/91839


More information about the llvm-commits mailing list