[llvm] [DebugInfo] Remove debug-intrinsic coroutine codepaths (PR #149068)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 16 03:43:31 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-debuginfo
Author: Jeremy Morse (jmorse)
<details>
<summary>Changes</summary>
There are a few duplicate paths/facilities in the coroutine code to deal with both intrinsics and debug-records; we can now delete the intrinsic version.
---
Full diff: https://github.com/llvm/llvm-project/pull/149068.diff
3 Files Affected:
- (modified) llvm/lib/Transforms/Coroutines/CoroFrame.cpp (+3-49)
- (modified) llvm/lib/Transforms/Coroutines/CoroInternal.h (+1-4)
- (modified) llvm/lib/Transforms/Coroutines/CoroSplit.cpp (+6-15)
``````````diff
diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
index fe30c6dc6abe4..42e7948afd63a 100644
--- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
@@ -1103,14 +1103,13 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
FrameTy->getElementType(FrameData.getFieldIndex(E.first)), GEP,
SpillAlignment, E.first->getName() + Twine(".reload"));
- TinyPtrVector<DbgDeclareInst *> DIs = findDbgDeclares(Def);
TinyPtrVector<DbgVariableRecord *> DVRs = findDVRDeclares(Def);
// Try best to find dbg.declare. If the spill is a temp, there may not
// be a direct dbg.declare. Walk up the load chain to find one from an
// alias.
if (F->getSubprogram()) {
auto *CurDef = Def;
- while (DIs.empty() && DVRs.empty() && isa<LoadInst>(CurDef)) {
+ while (DVRs.empty() && isa<LoadInst>(CurDef)) {
auto *LdInst = cast<LoadInst>(CurDef);
// Only consider ptr to ptr same type load.
if (LdInst->getPointerOperandType() != LdInst->getType())
@@ -1118,12 +1117,11 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
CurDef = LdInst->getPointerOperand();
if (!isa<AllocaInst, LoadInst>(CurDef))
break;
- DIs = findDbgDeclares(CurDef);
DVRs = findDVRDeclares(CurDef);
}
}
- auto SalvageOne = [&](auto *DDI) {
+ auto SalvageOne = [&](DbgVariableRecord *DDI) {
// This dbg.declare is preserved for all coro-split function
// fragments. It will be unreachable in the main function, and
// processed by coro::salvageDebugInfo() by the Cloner.
@@ -1137,7 +1135,6 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
// will be deleted in all coro-split functions.
coro::salvageDebugInfo(ArgToAllocaMap, *DDI, false /*UseEntryValue*/);
};
- for_each(DIs, SalvageOne);
for_each(DVRs, SalvageOne);
}
@@ -1218,8 +1215,7 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
SmallVector<DbgVariableIntrinsic *, 4> DIs;
SmallVector<DbgVariableRecord *> DbgVariableRecords;
findDbgUsers(DIs, Alloca, &DbgVariableRecords);
- for (auto *DVI : DIs)
- DVI->replaceUsesOfWith(Alloca, G);
+ assert(DIs.empty() && "Should never see debug-intrinsics");
for (auto *DVR : DbgVariableRecords)
DVR->replaceVariableLocationOp(Alloca, G);
@@ -1913,48 +1909,6 @@ salvageDebugInfoImpl(SmallDenseMap<Argument *, AllocaInst *, 4> &ArgToAllocaMap,
return {{*Storage, *Expr}};
}
-void coro::salvageDebugInfo(
- SmallDenseMap<Argument *, AllocaInst *, 4> &ArgToAllocaMap,
- DbgVariableIntrinsic &DVI, bool UseEntryValue) {
-
- Function *F = DVI.getFunction();
- // Follow the pointer arithmetic all the way to the incoming
- // function argument and convert into a DIExpression.
- bool SkipOutermostLoad = !isa<DbgValueInst>(DVI);
- Value *OriginalStorage = DVI.getVariableLocationOp(0);
-
- auto SalvagedInfo =
- ::salvageDebugInfoImpl(ArgToAllocaMap, UseEntryValue, F, OriginalStorage,
- DVI.getExpression(), SkipOutermostLoad);
- if (!SalvagedInfo)
- return;
-
- Value *Storage = &SalvagedInfo->first;
- DIExpression *Expr = &SalvagedInfo->second;
-
- DVI.replaceVariableLocationOp(OriginalStorage, Storage);
- DVI.setExpression(Expr);
- // We only hoist dbg.declare today since it doesn't make sense to hoist
- // dbg.value since it does not have the same function wide guarantees that
- // dbg.declare does.
- if (isa<DbgDeclareInst>(DVI)) {
- std::optional<BasicBlock::iterator> InsertPt;
- if (auto *I = dyn_cast<Instruction>(Storage)) {
- InsertPt = I->getInsertionPointAfterDef();
- // Update DILocation only if variable was not inlined.
- DebugLoc ILoc = I->getDebugLoc();
- DebugLoc DVILoc = DVI.getDebugLoc();
- if (ILoc && DVILoc &&
- DVILoc->getScope()->getSubprogram() ==
- ILoc->getScope()->getSubprogram())
- DVI.setDebugLoc(I->getDebugLoc());
- } else if (isa<Argument>(Storage))
- InsertPt = F->getEntryBlock().begin();
- if (InsertPt)
- DVI.moveBefore(*(*InsertPt)->getParent(), *InsertPt);
- }
-}
-
void coro::salvageDebugInfo(
SmallDenseMap<Argument *, AllocaInst *, 4> &ArgToAllocaMap,
DbgVariableRecord &DVR, bool UseEntryValue) {
diff --git a/llvm/lib/Transforms/Coroutines/CoroInternal.h b/llvm/lib/Transforms/Coroutines/CoroInternal.h
index b53c5a48eb10b..52f4ffe292dae 100644
--- a/llvm/lib/Transforms/Coroutines/CoroInternal.h
+++ b/llvm/lib/Transforms/Coroutines/CoroInternal.h
@@ -34,14 +34,11 @@ void suppressCoroAllocs(CoroIdInst *CoroId);
void suppressCoroAllocs(LLVMContext &Context,
ArrayRef<CoroAllocInst *> CoroAllocs);
-/// Attempts to rewrite the location operand of debug intrinsics in terms of
+/// Attempts to rewrite the location operand of debug records in terms of
/// the coroutine frame pointer, folding pointer offsets into the DIExpression
/// of the intrinsic.
/// If the frame pointer is an Argument, store it into an alloca to enhance the
/// debugability.
-void salvageDebugInfo(
- SmallDenseMap<Argument *, AllocaInst *, 4> &ArgToAllocaMap,
- DbgVariableIntrinsic &DVI, bool IsEntryPoint);
void salvageDebugInfo(
SmallDenseMap<Argument *, AllocaInst *, 4> &ArgToAllocaMap,
DbgVariableRecord &DVR, bool UseEntryValue);
diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
index 5a8a41f0dc432..a5353beaf57ab 100644
--- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -618,19 +618,15 @@ static void replaceSwiftErrorOps(Function &F, coro::Shape &Shape,
}
}
-/// Returns all DbgVariableIntrinsic in F.
-static std::pair<SmallVector<DbgVariableIntrinsic *, 8>,
- SmallVector<DbgVariableRecord *>>
+/// Returns all debug records in F.
+static SmallVector<DbgVariableRecord *>
collectDbgVariableIntrinsics(Function &F) {
- SmallVector<DbgVariableIntrinsic *, 8> Intrinsics;
SmallVector<DbgVariableRecord *> DbgVariableRecords;
for (auto &I : instructions(F)) {
for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange()))
DbgVariableRecords.push_back(&DVR);
- if (auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I))
- Intrinsics.push_back(DVI);
}
- return {Intrinsics, DbgVariableRecords};
+ return DbgVariableRecords;
}
void coro::BaseCloner::replaceSwiftErrorOps() {
@@ -638,13 +634,11 @@ void coro::BaseCloner::replaceSwiftErrorOps() {
}
void coro::BaseCloner::salvageDebugInfo() {
- auto [Worklist, DbgVariableRecords] = collectDbgVariableIntrinsics(*NewF);
+ auto DbgVariableRecords = collectDbgVariableIntrinsics(*NewF);
SmallDenseMap<Argument *, AllocaInst *, 4> ArgToAllocaMap;
// Only 64-bit ABIs have a register we can refer to with the entry value.
bool UseEntryValue = OrigF.getParent()->getTargetTriple().isArch64Bit();
- for (DbgVariableIntrinsic *DVI : Worklist)
- coro::salvageDebugInfo(ArgToAllocaMap, *DVI, UseEntryValue);
for (DbgVariableRecord *DVR : DbgVariableRecords)
coro::salvageDebugInfo(ArgToAllocaMap, *DVR, UseEntryValue);
@@ -655,7 +649,7 @@ void coro::BaseCloner::salvageDebugInfo() {
return !isPotentiallyReachable(&NewF->getEntryBlock(), BB, nullptr,
&DomTree);
};
- auto RemoveOne = [&](auto *DVI) {
+ auto RemoveOne = [&](DbgVariableRecord *DVI) {
if (IsUnreachableBlock(DVI->getParent()))
DVI->eraseFromParent();
else if (isa_and_nonnull<AllocaInst>(DVI->getVariableLocationOp(0))) {
@@ -669,7 +663,6 @@ void coro::BaseCloner::salvageDebugInfo() {
DVI->eraseFromParent();
}
};
- for_each(Worklist, RemoveOne);
for_each(DbgVariableRecords, RemoveOne);
}
@@ -2022,9 +2015,7 @@ static void doSplitCoroutine(Function &F, SmallVectorImpl<Function *> &Clones,
// original function. The Cloner has already salvaged debug info in the new
// coroutine funclets.
SmallDenseMap<Argument *, AllocaInst *, 4> ArgToAllocaMap;
- auto [DbgInsts, DbgVariableRecords] = collectDbgVariableIntrinsics(F);
- for (auto *DDI : DbgInsts)
- coro::salvageDebugInfo(ArgToAllocaMap, *DDI, false /*UseEntryValue*/);
+ auto DbgVariableRecords = collectDbgVariableIntrinsics(F);
for (DbgVariableRecord *DVR : DbgVariableRecords)
coro::salvageDebugInfo(ArgToAllocaMap, *DVR, false /*UseEntryValue*/);
``````````
</details>
https://github.com/llvm/llvm-project/pull/149068
More information about the llvm-commits
mailing list