Skip to content

[DebugInfo][RemoveDIs] Remove some debug intrinsic-only codepaths #143451

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1671,9 +1671,6 @@ void FastISel::fastEmitBranch(MachineBasicBlock *MSucc,
const DebugLoc &DbgLoc) {
const BasicBlock *BB = FuncInfo.MBB->getBasicBlock();
bool BlockHasMultipleInstrs = &BB->front() != &BB->back();
// Handle legacy case of debug intrinsics
if (BlockHasMultipleInstrs && !BB->getModule()->IsNewDbgInfoFormat)
BlockHasMultipleInstrs = BB->sizeWithoutDebug() > 1;
if (BlockHasMultipleInstrs && FuncInfo.MBB->isLayoutSuccessor(MSucc)) {
// For more accurate line information if this is the only non-debug
// instruction in the block then emit it, otherwise we have the
Expand Down
25 changes: 5 additions & 20 deletions llvm/lib/IR/AutoUpgrade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4463,7 +4463,6 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
Builder.SetInsertPoint(CI->getParent(), CI->getIterator());

if (!NewFn) {
bool FallthroughToDefaultUpgrade = false;
// Get the Function's name.
StringRef Name = F->getName();

Expand Down Expand Up @@ -4491,29 +4490,15 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
} else if (IsAMDGCN) {
Rep = upgradeAMDGCNIntrinsicCall(Name, CI, F, Builder);
} else if (IsDbg) {
// We might have decided we don't want the new format after all between
// first requesting the upgrade and now; skip the conversion if that is
// the case, and check here to see if the intrinsic needs to be upgraded
// normally.
if (!CI->getModule()->IsNewDbgInfoFormat) {
bool NeedsUpgrade =
upgradeIntrinsicFunction1(CI->getCalledFunction(), NewFn, false);
if (!NeedsUpgrade)
return;
FallthroughToDefaultUpgrade = true;
} else {
upgradeDbgIntrinsicToDbgRecord(Name, CI);
}
upgradeDbgIntrinsicToDbgRecord(Name, CI);
} else {
llvm_unreachable("Unknown function for CallBase upgrade.");
}

if (!FallthroughToDefaultUpgrade) {
if (Rep)
CI->replaceAllUsesWith(Rep);
CI->eraseFromParent();
return;
}
if (Rep)
CI->replaceAllUsesWith(Rep);
CI->eraseFromParent();
return;
}

const auto &DefaultCase = [&]() -> void {
Expand Down
97 changes: 20 additions & 77 deletions llvm/lib/IR/DIBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1047,36 +1047,13 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
LinkedInstr->getMetadata(LLVMContext::MD_DIAssignID));
assert(Link && "Linked instruction must have DIAssign metadata attached");

if (M.IsNewDbgInfoFormat) {
DbgVariableRecord *DVR = DbgVariableRecord::createDVRAssign(
Val, SrcVar, ValExpr, Link, Addr, AddrExpr, DL);
// Insert after LinkedInstr.
BasicBlock::iterator NextIt = std::next(LinkedInstr->getIterator());
NextIt.setHeadBit(true);
insertDbgVariableRecord(DVR, NextIt);
return DVR;
}

LLVMContext &Ctx = LinkedInstr->getContext();
Module *M = LinkedInstr->getModule();
if (!AssignFn)
AssignFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_assign);

std::array<Value *, 6> Args = {
MetadataAsValue::get(Ctx, ValueAsMetadata::get(Val)),
MetadataAsValue::get(Ctx, SrcVar),
MetadataAsValue::get(Ctx, ValExpr),
MetadataAsValue::get(Ctx, Link),
MetadataAsValue::get(Ctx, ValueAsMetadata::get(Addr)),
MetadataAsValue::get(Ctx, AddrExpr),
};

IRBuilder<> B(Ctx);
B.SetCurrentDebugLocation(DL);

auto *DVI = cast<DbgAssignIntrinsic>(B.CreateCall(AssignFn, Args));
DVI->insertAfter(LinkedInstr->getIterator());
return DVI;
DbgVariableRecord *DVR = DbgVariableRecord::createDVRAssign(
Val, SrcVar, ValExpr, Link, Addr, AddrExpr, DL);
// Insert after LinkedInstr.
BasicBlock::iterator NextIt = std::next(LinkedInstr->getIterator());
NextIt.setHeadBit(true);
insertDbgVariableRecord(DVR, NextIt);
return DVR;
}

/// Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics.
Expand All @@ -1101,18 +1078,10 @@ DbgInstPtr DIBuilder::insertDbgValueIntrinsic(llvm::Value *Val,
DIExpression *Expr,
const DILocation *DL,
InsertPosition InsertPt) {
if (M.IsNewDbgInfoFormat) {
DbgVariableRecord *DVR =
DbgVariableRecord::createDbgVariableRecord(Val, VarInfo, Expr, DL);
insertDbgVariableRecord(DVR, InsertPt);
return DVR;
}

if (!ValueFn)
ValueFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_value);
auto *DVI = insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertPt);
cast<CallInst>(DVI)->setTailCall();
return DVI;
DbgVariableRecord *DVR =
DbgVariableRecord::createDbgVariableRecord(Val, VarInfo, Expr, DL);
insertDbgVariableRecord(DVR, InsertPt);
return DVR;
}

DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
Expand All @@ -1124,25 +1093,10 @@ DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
VarInfo->getScope()->getSubprogram() &&
"Expected matching subprograms");

if (M.IsNewDbgInfoFormat) {
DbgVariableRecord *DVR =
DbgVariableRecord::createDVRDeclare(Storage, VarInfo, Expr, DL);
insertDbgVariableRecord(DVR, InsertPt);
return DVR;
}

if (!DeclareFn)
DeclareFn = getDeclareIntrin(M);

trackIfUnresolved(VarInfo);
trackIfUnresolved(Expr);
Value *Args[] = {getDbgIntrinsicValueImpl(VMContext, Storage),
MetadataAsValue::get(VMContext, VarInfo),
MetadataAsValue::get(VMContext, Expr)};

IRBuilder<> B(DL->getContext());
initIRBuilder(B, DL, InsertPt);
return B.CreateCall(DeclareFn, Args);
DbgVariableRecord *DVR =
DbgVariableRecord::createDVRDeclare(Storage, VarInfo, Expr, DL);
insertDbgVariableRecord(DVR, InsertPt);
return DVR;
}

void DIBuilder::insertDbgVariableRecord(DbgVariableRecord *DVR,
Expand Down Expand Up @@ -1191,23 +1145,12 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
"Expected matching subprograms");

trackIfUnresolved(LabelInfo);
if (M.IsNewDbgInfoFormat) {
DbgLabelRecord *DLR = new DbgLabelRecord(LabelInfo, DL);
if (InsertPt.isValid()) {
auto *BB = InsertPt.getBasicBlock();
BB->insertDbgRecordBefore(DLR, InsertPt);
}
return DLR;
DbgLabelRecord *DLR = new DbgLabelRecord(LabelInfo, DL);
if (InsertPt.isValid()) {
auto *BB = InsertPt.getBasicBlock();
BB->insertDbgRecordBefore(DLR, InsertPt);
}

if (!LabelFn)
LabelFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_label);

Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)};

IRBuilder<> B(DL->getContext());
initIRBuilder(B, DL, InsertPt);
return B.CreateCall(LabelFn, Args);
return DLR;
}

void DIBuilder::replaceVTableHolder(DICompositeType *&T, DIType *VTableHolder) {
Expand Down
19 changes: 4 additions & 15 deletions llvm/lib/IR/DebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2123,22 +2123,11 @@ static void emitDbgAssign(AssignmentInfo Info, Value *Val, Value *Dest,
Expr = *R;
}
DIExpression *AddrExpr = DIExpression::get(StoreLikeInst.getContext(), {});
if (StoreLikeInst.getParent()->IsNewDbgInfoFormat) {
auto *Assign = DbgVariableRecord::createLinkedDVRAssign(
&StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
(void)Assign;
LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
return;
}
auto Assign = DIB.insertDbgAssign(&StoreLikeInst, Val, VarRec.Var, Expr, Dest,
AddrExpr, VarRec.DL);
auto *Assign = DbgVariableRecord::createLinkedDVRAssign(
&StoreLikeInst, Val, VarRec.Var, Expr, Dest, AddrExpr, VarRec.DL);
(void)Assign;
LLVM_DEBUG(if (!Assign.isNull()) {
if (const auto *Record = dyn_cast<DbgRecord *>(Assign))
errs() << " > INSERT: " << *Record << "\n";
else
errs() << " > INSERT: " << *cast<Instruction *>(Assign) << "\n";
});
LLVM_DEBUG(if (Assign) errs() << " > INSERT: " << *Assign << "\n");
return;
}

#undef DEBUG_TYPE // Silence redefinition warning (from ConstantsContext.h).
Expand Down
36 changes: 11 additions & 25 deletions llvm/lib/Transforms/Utils/LoopUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,6 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT, ScalarEvolution *SE,

// Use a map to unique and a vector to guarantee deterministic ordering.
llvm::SmallDenseSet<DebugVariable, 4> DeadDebugSet;
llvm::SmallVector<DbgVariableIntrinsic *, 4> DeadDebugInst;
llvm::SmallVector<DbgVariableRecord *, 4> DeadDbgVariableRecords;

if (ExitBlock) {
Expand All @@ -632,29 +631,19 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT, ScalarEvolution *SE,
U.set(Poison);
}

// RemoveDIs: do the same as below for DbgVariableRecords.
if (Block->IsNewDbgInfoFormat) {
for (DbgVariableRecord &DVR : llvm::make_early_inc_range(
filterDbgVars(I.getDbgRecordRange()))) {
DebugVariable Key(DVR.getVariable(), DVR.getExpression(),
DVR.getDebugLoc().get());
if (!DeadDebugSet.insert(Key).second)
continue;
// Unlinks the DVR from it's container, for later insertion.
DVR.removeFromParent();
DeadDbgVariableRecords.push_back(&DVR);
}
}

// For one of each variable encountered, preserve a debug intrinsic (set
// For one of each variable encountered, preserve a debug record (set
// to Poison) and transfer it to the loop exit. This terminates any
// variable locations that were set during the loop.
auto *DVI = dyn_cast<DbgVariableIntrinsic>(&I);
if (!DVI)
continue;
if (!DeadDebugSet.insert(DebugVariable(DVI)).second)
continue;
DeadDebugInst.push_back(DVI);
for (DbgVariableRecord &DVR :
llvm::make_early_inc_range(filterDbgVars(I.getDbgRecordRange()))) {
DebugVariable Key(DVR.getVariable(), DVR.getExpression(),
DVR.getDebugLoc().get());
if (!DeadDebugSet.insert(Key).second)
continue;
// Unlinks the DVR from it's container, for later insertion.
DVR.removeFromParent();
DeadDbgVariableRecords.push_back(&DVR);
}
}

// After the loop has been deleted all the values defined and modified
Expand All @@ -670,9 +659,6 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT, ScalarEvolution *SE,
"There should be a non-PHI instruction in exit block, else these "
"instructions will have no parent.");

for (auto *DVI : DeadDebugInst)
DVI->moveBefore(*ExitBlock, InsertDbgValueBefore);

// Due to the "head" bit in BasicBlock::iterator, we're going to insert
// each DbgVariableRecord right at the start of the block, wheras dbg.values
// would be repeatedly inserted before the first instruction. To replicate
Expand Down
10 changes: 0 additions & 10 deletions llvm/unittests/IR/IRBuilderTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1011,18 +1011,8 @@ TEST_F(IRBuilderTest, DIBuilder) {
EXPECT_TRUE(verifyModule(*M));
};

// Test in new-debug mode.
EXPECT_TRUE(M->IsNewDbgInfoFormat);
RunTest();

// Test in old-debug mode.
// Reset the test then call convertFromNewDbgValues to flip the flag
// on the test's Module, Function and BasicBlock.
TearDown();
SetUp();
M->convertFromNewDbgValues();
EXPECT_FALSE(M->IsNewDbgInfoFormat);
RunTest();
}

TEST_F(IRBuilderTest, createArtificialSubprogram) {
Expand Down
Loading