[DebugInfo][RemoveDIs] Remove some debug intrinsic-only codepaths (#143451)
These are opportunistic deletions as more places that make use of the IsNewDbgInfoFormat flag are removed. It should (TM)(R) all be dead code now that `IsNewDbgInfoFormat` should be true everywhere. FastISel: we don't need to do debug-aware instruction counting any more, because there are no debug instructions, Autoupgrade: you can no-longer avoid autoupgrading of intrinsics to records DIBuilder: Delete the code for creating debug intrinsics (!) LoopUtils: No need to handle debug instructions, they don't exist
This commit is contained in:
parent
6b0cb762af
commit
c71a2e6888
@ -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
|
||||
|
@ -4490,7 +4490,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();
|
||||
|
||||
@ -4518,29 +4517,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 {
|
||||
|
@ -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.
|
||||
@ -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,
|
||||
@ -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,
|
||||
@ -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) {
|
||||
|
@ -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).
|
||||
|
@ -606,7 +606,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) {
|
||||
@ -633,29 +632,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
|
||||
@ -671,9 +660,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
|
||||
|
@ -1003,18 +1003,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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user