diff --git a/llvm/lib/Transforms/Utils/LCSSA.cpp b/llvm/lib/Transforms/Utils/LCSSA.cpp index c36b0533580b97..5e0c312fe149e7 100644 --- a/llvm/lib/Transforms/Utils/LCSSA.cpp +++ b/llvm/lib/Transforms/Utils/LCSSA.cpp @@ -160,7 +160,8 @@ bool llvm::formLCSSAForInstructions(SmallVectorImpl &Worklist, if (SSAUpdate.HasValueForBlock(ExitBB)) continue; PHINode *PN = PHINode::Create(I->getType(), PredCache.size(ExitBB), - I->getName() + ".lcssa", &ExitBB->front()); + I->getName() + ".lcssa"); + PN->insertBefore(ExitBB->begin()); if (InsertedPHIs) InsertedPHIs->push_back(PN); // Get the debug location from the original instruction. @@ -241,7 +242,8 @@ bool llvm::formLCSSAForInstructions(SmallVectorImpl &Worklist, } SmallVector DbgValues; - llvm::findDbgValues(DbgValues, I); + SmallVector DPValues; + llvm::findDbgValues(DbgValues, I, &DPValues); // Update pre-existing debug value uses that reside outside the loop. for (auto *DVI : DbgValues) { @@ -257,6 +259,21 @@ bool llvm::formLCSSAForInstructions(SmallVectorImpl &Worklist, DVI->replaceVariableLocationOp(I, V); } + // RemoveDIs: copy-paste of block above, using non-instruction debug-info + // records. + for (DPValue *DPV : DPValues) { + BasicBlock *UserBB = DPV->getMarker()->getParent(); + if (InstBB == UserBB || L->contains(UserBB)) + continue; + // We currently only handle debug values residing in blocks that were + // traversed while rewriting the uses. If we inserted just a single PHI, + // we will handle all relevant debug values. + Value *V = AddedPHIs.size() == 1 ? AddedPHIs[0] + : SSAUpdate.FindValueForBlock(UserBB); + if (V) + DPV->replaceVariableLocationOp(I, V); + } + // SSAUpdater might have inserted phi-nodes inside other loops. We'll need // to post-process them to keep LCSSA form. for (PHINode *InsertedPN : LocalInsertedPHIs) { diff --git a/llvm/test/Transforms/LCSSA/rewrite-existing-dbg-values.ll b/llvm/test/Transforms/LCSSA/rewrite-existing-dbg-values.ll index afd19ec0780f09..f4b8fff5a0d738 100644 --- a/llvm/test/Transforms/LCSSA/rewrite-existing-dbg-values.ll +++ b/llvm/test/Transforms/LCSSA/rewrite-existing-dbg-values.ll @@ -1,4 +1,5 @@ ; RUN: opt -S -passes=lcssa < %s | FileCheck %s +; RUN: opt -S -passes=lcssa < %s --try-experimental-debuginfo-iterators | FileCheck %s ; Reproducer for PR39019. ;