24 changes: 23 additions & 1 deletion llvm/lib/IR/AutoUpgrade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,10 @@

#include "llvm/IR/AutoUpgrade.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
Expand All @@ -27,6 +29,7 @@
#include "llvm/IR/IntrinsicsARM.h"
#include "llvm/IR/IntrinsicsX86.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include "llvm/Support/ErrorHandling.h"
Expand Down Expand Up @@ -844,6 +847,11 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
break;
}
case 'd': {
if (Name == "dbg.addr") {
rename(F);
NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::dbg_value);
return true;
}
if (Name == "dbg.value" && F->arg_size() == 4) {
rename(F);
NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::dbg_value);
Expand Down Expand Up @@ -4128,7 +4136,20 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
NewCall = Builder.CreateCall(NewFn, {CI->getArgOperand(0)});
break;

case Intrinsic::dbg_value:
case Intrinsic::dbg_value: {
StringRef Name = F->getName();
Name = Name.substr(5); // Strip llvm.
// Upgrade `dbg.addr` to `dbg.value` with `DW_OP_deref`.
if (Name.startswith("dbg.addr")) {
DIExpression *Expr = cast<DIExpression>(
cast<MetadataAsValue>(CI->getArgOperand(2))->getMetadata());
Expr = DIExpression::append(Expr, dwarf::DW_OP_deref);
NewCall =
Builder.CreateCall(NewFn, {CI->getArgOperand(0), CI->getArgOperand(1),
MetadataAsValue::get(C, Expr)});
break;
}

// Upgrade from the old version that had an extra offset argument.
assert(CI->arg_size() == 4);
// Drop nonzero offsets instead of attempting to upgrade them.
Expand All @@ -4141,6 +4162,7 @@ void llvm::UpgradeIntrinsicCall(CallBase *CI, Function *NewFn) {
}
CI->eraseFromParent();
return;
}

case Intrinsic::ptr_annotation:
// Upgrade from versions that lacked the annotation attribute argument.
Expand Down
37 changes: 2 additions & 35 deletions llvm/lib/IR/DIBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,9 @@
using namespace llvm;
using namespace llvm::dwarf;

static cl::opt<bool>
UseDbgAddr("use-dbg-addr",
llvm::cl::desc("Use llvm.dbg.addr for all local variables"),
cl::init(false), cl::Hidden);

DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes, DICompileUnit *CU)
: M(m), VMContext(M.getContext()), CUNode(CU), DeclareFn(nullptr),
ValueFn(nullptr), LabelFn(nullptr), AddrFn(nullptr), AssignFn(nullptr),
ValueFn(nullptr), LabelFn(nullptr), AssignFn(nullptr),
AllowUnresolvedNodes(AllowUnresolvedNodes) {
if (CUNode) {
if (const auto &ETs = CUNode->getEnumTypes())
Expand Down Expand Up @@ -1022,24 +1017,6 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(Value *V,
return insertDbgValueIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr);
}

Instruction *DIBuilder::insertDbgAddrIntrinsic(Value *V,
DILocalVariable *VarInfo,
DIExpression *Expr,
const DILocation *DL,
Instruction *InsertBefore) {
return insertDbgAddrIntrinsic(
V, VarInfo, Expr, DL, InsertBefore ? InsertBefore->getParent() : nullptr,
InsertBefore);
}

Instruction *DIBuilder::insertDbgAddrIntrinsic(Value *V,
DILocalVariable *VarInfo,
DIExpression *Expr,
const DILocation *DL,
BasicBlock *InsertAtEnd) {
return insertDbgAddrIntrinsic(V, VarInfo, Expr, DL, InsertAtEnd, nullptr);
}

/// Initialize IRBuilder for inserting dbg.declare and dbg.value intrinsics.
/// This abstracts over the various ways to specify an insert position.
static void initIRBuilder(IRBuilder<> &Builder, const DILocation *DL,
Expand All @@ -1057,8 +1034,7 @@ static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) {
}

static Function *getDeclareIntrin(Module &M) {
return Intrinsic::getDeclaration(&M, UseDbgAddr ? Intrinsic::dbg_addr
: Intrinsic::dbg_declare);
return Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare);
}

Instruction *DIBuilder::insertDbgValueIntrinsic(
Expand All @@ -1070,15 +1046,6 @@ Instruction *DIBuilder::insertDbgValueIntrinsic(
InsertBefore);
}

Instruction *DIBuilder::insertDbgAddrIntrinsic(
llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) {
if (!AddrFn)
AddrFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_addr);
return insertDbgIntrinsic(AddrFn, Val, VarInfo, Expr, DL, InsertBB,
InsertBefore);
}

Instruction *DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
BasicBlock *InsertBB,
Expand Down
21 changes: 4 additions & 17 deletions llvm/lib/IR/DebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,7 @@ using namespace llvm;
using namespace llvm::at;
using namespace llvm::dwarf;

/// Finds all intrinsics declaring local variables as living in the memory that
/// 'V' points to. This may include a mix of dbg.declare and
/// dbg.addr intrinsics.
TinyPtrVector<DbgVariableIntrinsic *> llvm::FindDbgAddrUses(Value *V) {
TinyPtrVector<DbgDeclareInst *> llvm::FindDbgDeclareUses(Value *V) {
// This function is hot. Check whether the value has any metadata to avoid a
// DenseMap lookup.
if (!V->isUsedByMetadata())
Expand All @@ -58,24 +55,15 @@ TinyPtrVector<DbgVariableIntrinsic *> llvm::FindDbgAddrUses(Value *V) {
if (!MDV)
return {};

TinyPtrVector<DbgVariableIntrinsic *> Declares;
TinyPtrVector<DbgDeclareInst *> Declares;
for (User *U : MDV->users()) {
if (auto *DII = dyn_cast<DbgVariableIntrinsic>(U))
if (DII->isAddressOfVariable())
Declares.push_back(DII);
if (auto *DDI = dyn_cast<DbgDeclareInst>(U))
Declares.push_back(DDI);
}

return Declares;
}

TinyPtrVector<DbgDeclareInst *> llvm::FindDbgDeclareUses(Value *V) {
TinyPtrVector<DbgDeclareInst *> DDIs;
for (DbgVariableIntrinsic *DVI : FindDbgAddrUses(V))
if (auto *DDI = dyn_cast<DbgDeclareInst>(DVI))
DDIs.push_back(DDI);
return DDIs;
}

void llvm::findDbgValues(SmallVectorImpl<DbgValueInst *> &DbgValues, Value *V) {
// This function is hot. Check whether the value has any metadata to avoid a
// DenseMap lookup.
Expand Down Expand Up @@ -801,7 +789,6 @@ bool llvm::stripNonLineTableDebugInfo(Module &M) {
Changed = true;
}
};
RemoveUses("llvm.dbg.addr");
RemoveUses("llvm.dbg.declare");
RemoveUses("llvm.dbg.label");
RemoveUses("llvm.dbg.value");
Expand Down
3 changes: 0 additions & 3 deletions llvm/lib/IR/Verifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5116,9 +5116,6 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
"invalid llvm.dbg.declare intrinsic call 1", Call);
visitDbgIntrinsic("declare", cast<DbgVariableIntrinsic>(Call));
break;
case Intrinsic::dbg_addr: // llvm.dbg.addr
visitDbgIntrinsic("addr", cast<DbgVariableIntrinsic>(Call));
break;
case Intrinsic::dbg_value: // llvm.dbg.value
visitDbgIntrinsic("value", cast<DbgVariableIntrinsic>(Call));
break;
Expand Down
12 changes: 3 additions & 9 deletions llvm/lib/Transforms/Coroutines/CoroFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1861,12 +1861,6 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
}
}

// Salvage debug info on any dbg.addr that we see. We do not insert them
// into each block where we have a use though.
if (auto *DI = dyn_cast<DbgAddrIntrinsic>(U)) {
coro::salvageDebugInfo(DbgPtrAllocaCache, DI, Shape.OptimizeFrame);
}

// If we have a single edge PHINode, remove it and replace it with a
// reload from the coroutine frame. (We already took care of multi edge
// PHINodes by rewriting them in the rewritePHIs function).
Expand Down Expand Up @@ -2879,9 +2873,9 @@ void coro::salvageDebugInfo(
DVI->replaceVariableLocationOp(OriginalStorage, Storage);
DVI->setExpression(Expr);
// We only hoist dbg.declare today since it doesn't make sense to hoist
// dbg.value or dbg.addr since they do not have the same function wide
// guarantees that dbg.declare does.
if (!isa<DbgValueInst>(DVI) && !isa<DbgAddrIntrinsic>(DVI)) {
// dbg.value since it does not have the same function wide guarantees that
// dbg.declare does.
if (isa<DbgDeclareInst>(DVI)) {
Instruction *InsertPt = nullptr;
if (auto *I = dyn_cast<Instruction>(Storage))
InsertPt = I->getInsertionPointAfterDef();
Expand Down
10 changes: 3 additions & 7 deletions llvm/lib/Transforms/Coroutines/CoroSplit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1970,9 +1970,9 @@ splitCoroutine(Function &F, SmallVectorImpl<Function *> &Clones,
// This invalidates SwiftErrorOps in the Shape.
replaceSwiftErrorOps(F, Shape, nullptr);

// Finally, salvage the llvm.dbg.{declare,addr} in our original function that
// point into the coroutine frame. We only do this for the current function
// since the Cloner salvaged debug info for us in the new coroutine funclets.
// Finally, salvage the llvm.dbg.declare in our original function that point
// into the coroutine frame. We only do this for the current function since
// the Cloner salvaged debug info for us in the new coroutine funclets.
SmallVector<DbgVariableIntrinsic *, 8> Worklist;
SmallDenseMap<llvm::Value *, llvm::AllocaInst *, 4> DbgPtrAllocaCache;
for (auto &BB : F) {
Expand All @@ -1981,10 +1981,6 @@ splitCoroutine(Function &F, SmallVectorImpl<Function *> &Clones,
Worklist.push_back(DDI);
continue;
}
if (auto *DDI = dyn_cast<DbgAddrIntrinsic>(&I)) {
Worklist.push_back(DDI);
continue;
}
}
}
for (auto *DDI : Worklist)
Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -730,7 +730,7 @@ tryToMergePartialOverlappingStores(StoreInst *KillingI, StoreInst *DeadI,
}

namespace {
// Returns true if \p I is an intrisnic that does not read or write memory.
// Returns true if \p I is an intrinsic that does not read or write memory.
bool isNoopIntrinsic(Instruction *I) {
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
switch (II->getIntrinsicID()) {
Expand All @@ -740,7 +740,6 @@ bool isNoopIntrinsic(Instruction *I) {
case Intrinsic::launder_invariant_group:
case Intrinsic::assume:
return true;
case Intrinsic::dbg_addr:
case Intrinsic::dbg_declare:
case Intrinsic::dbg_label:
case Intrinsic::dbg_value:
Expand Down
24 changes: 13 additions & 11 deletions llvm/lib/Transforms/Scalar/SROA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4739,11 +4739,13 @@ bool SROAPass::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {

// Migrate debug information from the old alloca to the new alloca(s)
// and the individual partitions.
TinyPtrVector<DbgVariableIntrinsic *> DbgDeclares = FindDbgAddrUses(&AI);
TinyPtrVector<DbgVariableIntrinsic *> DbgVariables;
for (auto *DbgDeclare : FindDbgDeclareUses(&AI))
DbgVariables.push_back(DbgDeclare);
for (auto *DbgAssign : at::getAssignmentMarkers(&AI))
DbgDeclares.push_back(DbgAssign);
for (DbgVariableIntrinsic *DbgDeclare : DbgDeclares) {
auto *Expr = DbgDeclare->getExpression();
DbgVariables.push_back(DbgAssign);
for (DbgVariableIntrinsic *DbgVariable : DbgVariables) {
auto *Expr = DbgVariable->getExpression();
DIBuilder DIB(*AI.getModule(), /*AllowUnresolved*/ false);
uint64_t AllocaSize =
DL.getTypeSizeInBits(AI.getAllocatedType()).getFixedValue();
Expand Down Expand Up @@ -4775,7 +4777,7 @@ bool SROAPass::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
}

// The alloca may be larger than the variable.
auto VarSize = DbgDeclare->getVariable()->getSizeInBits();
auto VarSize = DbgVariable->getVariable()->getSizeInBits();
if (VarSize) {
if (Size > *VarSize)
Size = *VarSize;
Expand All @@ -4795,18 +4797,18 @@ bool SROAPass::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {

// Remove any existing intrinsics on the new alloca describing
// the variable fragment.
for (DbgVariableIntrinsic *OldDII : FindDbgAddrUses(Fragment.Alloca)) {
for (DbgDeclareInst *OldDII : FindDbgDeclareUses(Fragment.Alloca)) {
auto SameVariableFragment = [](const DbgVariableIntrinsic *LHS,
const DbgVariableIntrinsic *RHS) {
return LHS->getVariable() == RHS->getVariable() &&
LHS->getDebugLoc()->getInlinedAt() ==
RHS->getDebugLoc()->getInlinedAt();
};
if (SameVariableFragment(OldDII, DbgDeclare))
if (SameVariableFragment(OldDII, DbgVariable))
OldDII->eraseFromParent();
}

if (auto *DbgAssign = dyn_cast<DbgAssignIntrinsic>(DbgDeclare)) {
if (auto *DbgAssign = dyn_cast<DbgAssignIntrinsic>(DbgVariable)) {
if (!Fragment.Alloca->hasMetadata(LLVMContext::MD_DIAssignID)) {
Fragment.Alloca->setMetadata(
LLVMContext::MD_DIAssignID,
Expand All @@ -4820,8 +4822,8 @@ bool SROAPass::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
LLVM_DEBUG(dbgs() << "Created new assign intrinsic: " << *NewAssign
<< "\n");
} else {
DIB.insertDeclare(Fragment.Alloca, DbgDeclare->getVariable(),
FragmentExpr, DbgDeclare->getDebugLoc(), &AI);
DIB.insertDeclare(Fragment.Alloca, DbgVariable->getVariable(),
FragmentExpr, DbgVariable->getDebugLoc(), &AI);
}
}
}
Expand Down Expand Up @@ -4945,7 +4947,7 @@ bool SROAPass::deleteDeadInstructions(
// not be able to find it.
if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) {
DeletedAllocas.insert(AI);
for (DbgVariableIntrinsic *OldDII : FindDbgAddrUses(AI))
for (DbgDeclareInst *OldDII : FindDbgDeclareUses(AI))
OldDII->eraseFromParent();
}

Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,8 +379,8 @@ bool llvm::MergeBlockSuccessorsIntoGivenBlocks(
///
/// Possible improvements:
/// - Check fully overlapping fragments and not only identical fragments.
/// - Support dbg.addr, dbg.declare. dbg.label, and possibly other meta
/// instructions being part of the sequence of consecutive instructions.
/// - Support dbg.declare. dbg.label, and possibly other meta instructions being
/// part of the sequence of consecutive instructions.
static bool removeRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB) {
SmallVector<DbgValueInst *, 8> ToBeRemoved;
SmallDenseSet<DebugVariable> VariableSet;
Expand Down
32 changes: 15 additions & 17 deletions llvm/lib/Transforms/Utils/Local.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1486,11 +1486,10 @@ static bool PhiHasDebugValue(DILocalVariable *DIVar,
/// (or fragment of the variable) described by \p DII.
///
/// This is primarily intended as a helper for the different
/// ConvertDebugDeclareToDebugValue functions. The dbg.declare/dbg.addr that is
/// converted describes an alloca'd variable, so we need to use the
/// alloc size of the value when doing the comparison. E.g. an i1 value will be
/// identified as covering an n-bit fragment, if the store size of i1 is at
/// least n bits.
/// ConvertDebugDeclareToDebugValue functions. The dbg.declare that is converted
/// describes an alloca'd variable, so we need to use the alloc size of the
/// value when doing the comparison. E.g. an i1 value will be identified as
/// covering an n-bit fragment, if the store size of i1 is at least n bits.
static bool valueCoversEntireFragment(Type *ValTy, DbgVariableIntrinsic *DII) {
const DataLayout &DL = DII->getModule()->getDataLayout();
TypeSize ValueSize = DL.getTypeAllocSizeInBits(ValTy);
Expand Down Expand Up @@ -1519,7 +1518,7 @@ static bool valueCoversEntireFragment(Type *ValTy, DbgVariableIntrinsic *DII) {
}

/// Inserts a llvm.dbg.value intrinsic before a store to an alloca'd value
/// that has an associated llvm.dbg.declare or llvm.dbg.addr intrinsic.
/// that has an associated llvm.dbg.declare intrinsic.
void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII,
StoreInst *SI, DIBuilder &Builder) {
assert(DII->isAddressOfVariable() || isa<DbgAssignIntrinsic>(DII));
Expand Down Expand Up @@ -1562,7 +1561,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII,
}

/// Inserts a llvm.dbg.value intrinsic before a load of an alloca'd value
/// that has an associated llvm.dbg.declare or llvm.dbg.addr intrinsic.
/// that has an associated llvm.dbg.declare intrinsic.
void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII,
LoadInst *LI, DIBuilder &Builder) {
auto *DIVar = DII->getVariable();
Expand Down Expand Up @@ -1590,7 +1589,7 @@ void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII,
}

/// Inserts a llvm.dbg.value intrinsic after a phi that has an associated
/// llvm.dbg.declare or llvm.dbg.addr intrinsic.
/// llvm.dbg.declare intrinsic.
void llvm::ConvertDebugDeclareToDebugValue(DbgVariableIntrinsic *DII,
PHINode *APN, DIBuilder &Builder) {
auto *DIVar = DII->getVariable();
Expand Down Expand Up @@ -1773,8 +1772,8 @@ void llvm::insertDebugValuesForPHIs(BasicBlock *BB,
bool llvm::replaceDbgDeclare(Value *Address, Value *NewAddress,
DIBuilder &Builder, uint8_t DIExprFlags,
int Offset) {
auto DbgAddrs = FindDbgAddrUses(Address);
for (DbgVariableIntrinsic *DII : DbgAddrs) {
auto DbgDeclares = FindDbgDeclareUses(Address);
for (DbgVariableIntrinsic *DII : DbgDeclares) {
const DebugLoc &Loc = DII->getDebugLoc();
auto *DIVar = DII->getVariable();
auto *DIExpr = DII->getExpression();
Expand All @@ -1785,7 +1784,7 @@ bool llvm::replaceDbgDeclare(Value *Address, Value *NewAddress,
Builder.insertDeclare(NewAddress, DIVar, DIExpr, Loc, DII);
DII->eraseFromParent();
}
return !DbgAddrs.empty();
return !DbgDeclares.empty();
}

static void replaceOneDbgValueForAlloca(DbgValueInst *DVI, Value *NewAddress,
Expand Down Expand Up @@ -1881,9 +1880,8 @@ void llvm::salvageDebugInfoForDbgValues(
continue;
}

// Do not add DW_OP_stack_value for DbgDeclare and DbgAddr, because they
// are implicitly pointing out the value as a DWARF memory location
// description.
// Do not add DW_OP_stack_value for DbgDeclare, because they are implicitly
// pointing out the value as a DWARF memory location description.
bool StackValue = isa<DbgValueInst>(DII);
auto DIILocation = DII->location_ops();
assert(
Expand Down Expand Up @@ -1923,9 +1921,9 @@ void llvm::salvageDebugInfoForDbgValues(
MaxDebugArgs) {
DII->addVariableLocationOps(AdditionalValues, SalvagedExpr);
} else {
// Do not salvage using DIArgList for dbg.addr/dbg.declare, as it is
// not currently supported in those instructions. Do not salvage using
// DIArgList for dbg.assign yet. FIXME: support this.
// Do not salvage using DIArgList for dbg.declare, as it is not currently
// supported in those instructions. Do not salvage using DIArgList for
// dbg.assign yet. FIXME: support this.
// Also do not salvage if the resulting DIArgList would contain an
// unreasonably large number of values.
DII->setKillLocation();
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Utils/MemoryOpRemark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -321,7 +321,7 @@ void MemoryOpRemark::visitVariable(const Value *V,
// Try to get an llvm.dbg.declare, which has a DILocalVariable giving us the
// real debug info name and size of the variable.
for (const DbgVariableIntrinsic *DVI :
FindDbgAddrUses(const_cast<Value *>(V))) {
FindDbgDeclareUses(const_cast<Value *>(V))) {
if (DILocalVariable *DILV = DVI->getVariable()) {
std::optional<uint64_t> DISize = getSizeInBytes(DILV->getSizeInBits());
VariableInfo Var{DILV->getName(), DISize};
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/Bitcode/upgrade-dbg-addr.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
; Test upgrade of dbg.addr intrinsics into dbg.value with DW_OP_deref appended
;
; RUN: llvm-dis < %s.bc | FileCheck %s
; RUN: verify-uselistorder < %s.bc

define i32 @example(i32 %num) {
entry:
%num.addr = alloca i32, align 4
store i32 %num, ptr %num.addr, align 4
; CHECK-NOT: call void @llvm.dbg.addr
; CHECK: call void @llvm.dbg.value(metadata ptr %num.addr, metadata ![[#]], metadata !DIExpression(DW_OP_plus_uconst, 0, DW_OP_deref))
call void @llvm.dbg.addr(metadata ptr %num.addr, metadata !16, metadata !DIExpression(DW_OP_plus_uconst, 0)), !dbg !17
%0 = load i32, ptr %num.addr, align 4
ret i32 %0
}

; CHECK: declare void @llvm.dbg.value(metadata, metadata, metadata)
declare void @llvm.dbg.addr(metadata, metadata, metadata)

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2}

!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1)
!1 = !DIFile(filename: "/app/example.c", directory: "/app")
!2 = !{i32 2, !"Debug Info Version", i32 3}
!10 = distinct !DISubprogram(name: "example", scope: !11, file: !11, line: 1, type: !12, scopeLine: 1, unit: !0, retainedNodes: !15)
!11 = !DIFile(filename: "example.c", directory: "/app")
!12 = !DISubroutineType(types: !13)
!13 = !{!14}
!14 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!15 = !{}
!16 = !DILocalVariable(name: "num", arg: 1, scope: !10, file: !11, line: 1, type: !14)
!17 = !DILocation(line: 1, column: 17, scope: !10)
Binary file added llvm/test/Bitcode/upgrade-dbg-addr.ll.bc
Binary file not shown.
2 changes: 1 addition & 1 deletion llvm/test/Bitcode/upgrade-dbg-value.ll
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
; Test upgrade of dbg.dvalue intrinsics with offsets.
; Test upgrade of dbg.value intrinsics with offsets.
;
; RUN: llvm-dis < %s.bc | FileCheck %s
; RUN: verify-uselistorder < %s.bc
Expand Down
98 changes: 0 additions & 98 deletions llvm/test/DebugInfo/X86/dbg-addr-dse.ll

This file was deleted.

106 changes: 0 additions & 106 deletions llvm/test/DebugInfo/X86/dbg-addr.ll

This file was deleted.

9 changes: 0 additions & 9 deletions llvm/test/DebugInfo/X86/merge-equivalent-ranges.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,6 @@
;; single DW_AT_location instead of producing a loclist with identical locations
;; for each.

;; Checks that we can merge an indirect debug value with an equivalent direct
;; debug value that uses DW_OP_deref.
; CHECK: DW_AT_location
; CHECK-SAME: (DW_OP_fbreg +{{[0-9]+}})
; CHECK-NEXT: DW_AT_name ("Var1")

;; Checks that we can merge a non-variadic debug value with an equivalent
;; variadic debug value.
; CHECK: DW_AT_location
Expand All @@ -28,7 +22,6 @@ define i32 @_ZN4llvm9MCContext12GetDwarfFileENS_9StringRefES1_jj(ptr %this, ptr
entry:
%CUID.addr = alloca i32, align 4
store i32 %CUID, ptr %CUID.addr, align 4
call void @llvm.dbg.value(metadata ptr %CUID.addr, metadata !16, metadata !DIExpression(DW_OP_deref)), !dbg !17
call void @llvm.dbg.value(metadata ptr %CUID.addr, metadata !26, metadata !DIExpression(DW_OP_deref, DW_OP_stack_value)), !dbg !17
%0 = load ptr, ptr null, align 8, !dbg !18
call void @llvm.dbg.value(metadata !DIArgList(ptr %CUID.addr), metadata !26, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_deref, DW_OP_stack_value)), !dbg !18
Expand All @@ -37,13 +30,11 @@ entry:
while.body.i.i.i.i: ; preds = %while.body.i.i.i.i, %entry
%__x.addr.011.i.i.i.i = phi ptr [ %__x.addr.1.in.i.i.i.i, %while.body.i.i.i.i ], [ %0, %entry ]
%_M_right.i.i.i.i.i = getelementptr inbounds %"struct.std::_Rb_tree_node_base", ptr %__x.addr.011.i.i.i.i, i64 0, i32 3, !dbg !20
call void @llvm.dbg.addr(metadata ptr %CUID.addr, metadata !16, metadata !DIExpression()), !dbg !20
%__x.addr.1.in.i.i.i.i = select i1 %cmp.i.i.i.i.i, ptr %__x.addr.011.i.i.i.i, ptr null, !dbg !20
br label %while.body.i.i.i.i
}

declare void @llvm.dbg.value(metadata, metadata, metadata)
declare void @llvm.dbg.addr(metadata, metadata, metadata)

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2, !3, !4, !5, !6, !7, !8}
Expand Down
441 changes: 0 additions & 441 deletions llvm/test/Transforms/Coroutines/coro-debug-dbg.addr-swift.ll

This file was deleted.

257 changes: 0 additions & 257 deletions llvm/test/Transforms/Coroutines/coro-debug-dbg.addr.ll

This file was deleted.

94 changes: 0 additions & 94 deletions llvm/test/Transforms/Mem2Reg/dbg-addr-inline-dse.ll

This file was deleted.

91 changes: 0 additions & 91 deletions llvm/test/Transforms/Mem2Reg/dbg-addr.ll

This file was deleted.

133 changes: 0 additions & 133 deletions llvm/test/Transforms/SROA/dbg-addr-diamond.ll

This file was deleted.

5 changes: 0 additions & 5 deletions llvm/test/Transforms/SpeculativeExecution/PR46267.ll
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,11 @@ entry:
land.rhs: ; preds = %entry
; CHECK: land.rhs:
; CHECK-NEXT: call void @llvm.dbg.label
; CHECK-NEXT: %x = alloca i32, align 4
; CHECK-NEXT: call void @llvm.dbg.addr(metadata ptr %x
; CHECK-NEXT: %y = alloca i32, align 4
; CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr %y
; CHECK-NEXT: %a0 = load i32, ptr undef, align 1
; CHECK-NEXT: call void @llvm.dbg.value(metadata i32 %a0
call void @llvm.dbg.label(metadata !11), !dbg !10
%x = alloca i32, align 4
call void @llvm.dbg.addr(metadata ptr %x, metadata !12, metadata !DIExpression()), !dbg !10
%y = alloca i32, align 4
call void @llvm.dbg.declare(metadata ptr %y, metadata !14, metadata !DIExpression()), !dbg !10

Expand All @@ -64,7 +60,6 @@ land.end: ; preds = %land.rhs, %entry
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
declare void @llvm.dbg.label(metadata)
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare void @llvm.dbg.addr(metadata, metadata, metadata)

attributes #1 = { nounwind readnone speculatable willreturn }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@
define void @f() !dbg !4 {
entry:
%i = alloca i32, align 4
; CHECK-NOT: llvm.dbg.{{addr|declare|value}}
; CHECK-NOT: llvm.dbg.{{declare|value}}
call void @llvm.dbg.declare(metadata ptr %i, metadata !11, metadata !13), !dbg !14
call void @llvm.dbg.addr(metadata ptr %i, metadata !16, metadata !13), !dbg !14
store i32 42, ptr %i, align 4, !dbg !14
call void @llvm.dbg.value(metadata i32 0, metadata !16, metadata !13), !dbg !15
ret void, !dbg !15
}

; Function Attrs: nounwind readnone
declare void @llvm.dbg.addr(metadata, metadata, metadata)
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare void @llvm.dbg.value(metadata, metadata, metadata)

Expand Down
3 changes: 0 additions & 3 deletions llvm/test/tools/llvm-reduce/remove-args-dbg-intrinsics.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=arguments --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s --output %t
; RUN: FileCheck --check-prefix=CHECK-FINAL %s < %t

; CHECK-INTERESTINGNESS: declare void @llvm.dbg.addr
; CHECK-FINAL: declare void @llvm.dbg.addr(metadata, metadata, metadata)
declare void @llvm.dbg.addr(metadata, metadata, metadata)
; CHECK-INTERESTINGNESS: declare void @llvm.dbg.declare
; CHECK-FINAL: declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare void @llvm.dbg.declare(metadata, metadata, metadata)
Expand Down
2 changes: 0 additions & 2 deletions llvm/unittests/IR/BasicBlockTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,6 @@ TEST(BasicBlockTest, TestInstructionsWithoutDebug) {
Argument *V = new Argument(Type::getInt32Ty(Ctx));
Function *F = Function::Create(FT, Function::ExternalLinkage, "", M);

Function *DbgAddr = Intrinsic::getDeclaration(M, Intrinsic::dbg_addr);
Function *DbgDeclare = Intrinsic::getDeclaration(M, Intrinsic::dbg_declare);
Function *DbgValue = Intrinsic::getDeclaration(M, Intrinsic::dbg_value);
Value *DIV = MetadataAsValue::get(Ctx, (Metadata *)nullptr);
Expand All @@ -122,7 +121,6 @@ TEST(BasicBlockTest, TestInstructionsWithoutDebug) {
Instruction *MulInst = cast<Instruction>(Builder1.CreateMul(AddInst, V));
Builder1.CreateCall(DbgDeclare, Args);
Instruction *SubInst = cast<Instruction>(Builder1.CreateSub(MulInst, V));
Builder1.CreateCall(DbgAddr, Args);

SmallVector<Instruction *, 4> Exp = {Var, AddInst, MulInst, SubInst};
CHECK_ITERATORS(BB1->instructionsWithoutDebug(), Exp);
Expand Down
65 changes: 0 additions & 65 deletions llvm/unittests/IR/DebugInfoTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -321,71 +321,6 @@ TEST(DIBuilder, DIEnumerator) {
EXPECT_FALSE(E2);
}

TEST(DIBuilder, createDbgAddr) {
LLVMContext C;
std::unique_ptr<Module> M = parseIR(C, R"(
define void @f() !dbg !6 {
%a = alloca i16, align 8
;; It is important that we put the debug marker on the return.
;; We take advantage of that to conjure up a debug loc without
;; having to synthesize one programatically.
ret void, !dbg !11
}
declare void @llvm.dbg.value(metadata, metadata, metadata) #0
attributes #0 = { nounwind readnone speculatable willreturn }

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!5}

!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
!1 = !DIFile(filename: "t.ll", directory: "/")
!2 = !{}
!5 = !{i32 2, !"Debug Info Version", i32 3}
!6 = distinct !DISubprogram(name: "foo", linkageName: "foo", scope: null, file: !1, line: 1, type: !7, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
!7 = !DISubroutineType(types: !2)
!8 = !{!9}
!9 = !DILocalVariable(name: "1", scope: !6, file: !1, line: 1, type: !10)
!10 = !DIBasicType(name: "ty16", size: 16, encoding: DW_ATE_unsigned)
!11 = !DILocation(line: 1, column: 1, scope: !6)
)");
auto *F = M->getFunction("f");
auto *EntryBlock = &F->getEntryBlock();

auto *CU =
cast<DICompileUnit>(M->getNamedMetadata("llvm.dbg.cu")->getOperand(0));
auto *Alloca = &*EntryBlock->begin();
auto *Ret = EntryBlock->getTerminator();

auto *SP = cast<DISubprogram>(F->getMetadata(LLVMContext::MD_dbg));
auto *File = SP->getFile();
std::string Name = "myName";
const auto *Loc = Ret->getDebugLoc().get();

IRBuilder<> Builder(EntryBlock);
DIBuilder DIB(*M, true, CU);
DIType *DT = DIB.createBasicType("ty16", 16, dwarf::DW_ATE_unsigned);

DILocalVariable *LocalVar =
DIB.createAutoVariable(SP, Name, File, 5 /*line*/, DT,
/*AlwaysPreserve=*/true);

auto *Inst = DIB.insertDbgAddrIntrinsic(Alloca, LocalVar,
DIB.createExpression(), Loc, Ret);

DIB.finalize();

EXPECT_EQ(Inst->getDebugLoc().get(), Loc);

auto *MD0 = cast<MetadataAsValue>(Inst->getOperand(0))->getMetadata();
auto *MD0Local = cast<LocalAsMetadata>(MD0);
EXPECT_EQ(MD0Local->getValue(), Alloca);
auto *MD1 = cast<MetadataAsValue>(Inst->getOperand(1))->getMetadata();
EXPECT_EQ(MD1->getMetadataID(), Metadata::MetadataKind::DILocalVariableKind);
auto *MD2 = cast<MetadataAsValue>(Inst->getOperand(2))->getMetadata();
auto *MDExp = cast<DIExpression>(MD2);
EXPECT_EQ(MDExp->getNumElements(), 0u);
}

TEST(DbgAssignIntrinsicTest, replaceVariableLocationOp) {
LLVMContext C;
std::unique_ptr<Module> M = parseIR(C, R"(
Expand Down
13 changes: 3 additions & 10 deletions llvm/unittests/Transforms/Utils/LocalTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -679,7 +679,7 @@ TEST(Local, ReplaceAllDbgUsesWith) {
call void @llvm.dbg.declare(metadata i64* %c, metadata !13, metadata !DIExpression()), !dbg !17

%d = inttoptr i64 0 to i32*, !dbg !18
call void @llvm.dbg.addr(metadata i32* %d, metadata !20, metadata !DIExpression()), !dbg !18
call void @llvm.dbg.declare(metadata i32* %d, metadata !20, metadata !DIExpression()), !dbg !18

%e = add <2 x i16> zeroinitializer, zeroinitializer
call void @llvm.dbg.value(metadata <2 x i16> %e, metadata !14, metadata !DIExpression()), !dbg !18
Expand All @@ -695,7 +695,6 @@ TEST(Local, ReplaceAllDbgUsesWith) {
ret void, !dbg !19
}

declare void @llvm.dbg.addr(metadata, metadata, metadata)
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare void @llvm.dbg.value(metadata, metadata, metadata)

Expand Down Expand Up @@ -755,10 +754,7 @@ TEST(Local, ReplaceAllDbgUsesWith) {
SmallVector<DbgVariableIntrinsic *, 2> CDbgVals;
findDbgUsers(CDbgVals, &C);
EXPECT_EQ(2U, CDbgVals.size());
EXPECT_TRUE(any_of(CDbgVals, [](DbgVariableIntrinsic *DII) {
return isa<DbgAddrIntrinsic>(DII);
}));
EXPECT_TRUE(any_of(CDbgVals, [](DbgVariableIntrinsic *DII) {
EXPECT_TRUE(all_of(CDbgVals, [](DbgVariableIntrinsic *DII) {
return isa<DbgDeclareInst>(DII);
}));

Expand All @@ -767,10 +763,7 @@ TEST(Local, ReplaceAllDbgUsesWith) {
SmallVector<DbgVariableIntrinsic *, 2> DDbgVals;
findDbgUsers(DDbgVals, &D);
EXPECT_EQ(2U, DDbgVals.size());
EXPECT_TRUE(any_of(DDbgVals, [](DbgVariableIntrinsic *DII) {
return isa<DbgAddrIntrinsic>(DII);
}));
EXPECT_TRUE(any_of(DDbgVals, [](DbgVariableIntrinsic *DII) {
EXPECT_TRUE(all_of(DDbgVals, [](DbgVariableIntrinsic *DII) {
return isa<DbgDeclareInst>(DII);
}));

Expand Down
5 changes: 0 additions & 5 deletions mlir/include/mlir/Dialect/LLVMIR/LLVMIntrinsicOps.td
Original file line number Diff line number Diff line change
Expand Up @@ -322,11 +322,6 @@ class LLVM_DbgIntrOp<string name, string argName> : LLVM_IntrOp<name, [], [], []
}];
}

def LLVM_DbgAddrOp : LLVM_DbgIntrOp<"dbg.addr", "addr"> {
let summary = "Describe the current address of a local debug info variable.";
let arguments = (ins LLVM_AnyPointer:$addr, LLVM_DILocalVariableAttr:$varInfo);
}

def LLVM_DbgDeclareOp : LLVM_DbgIntrOp<"dbg.declare", "addr"> {
let summary = "Declare the address of a local debug info variable.";
let arguments = (ins LLVM_AnyPointer:$addr, LLVM_DILocalVariableAttr:$varInfo);
Expand Down
2 changes: 0 additions & 2 deletions mlir/test/Dialect/LLVMIR/debuginfo.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,7 @@ llvm.func @addr(%arg: i64) {
%allocCount = llvm.mlir.constant(1 : i32) : i32
%alloc = llvm.alloca %allocCount x i64 : (i32) -> !llvm.ptr<i64>

// CHECK: llvm.intr.dbg.addr #[[VAR0]] = %[[ALLOC]]
// CHECK: llvm.intr.dbg.declare #[[VAR0]] = %[[ALLOC]]
llvm.intr.dbg.addr #var0 = %alloc : !llvm.ptr<i64>
llvm.intr.dbg.declare #var0 = %alloc : !llvm.ptr<i64>
llvm.return
}
Expand Down
6 changes: 1 addition & 5 deletions mlir/test/Target/LLVMIR/Import/debug-info.ll
Original file line number Diff line number Diff line change
Expand Up @@ -243,19 +243,15 @@ source_filename = "debug-info.ll"
define void @intrinsic(i64 %0, ptr %1) {
; CHECK: llvm.intr.dbg.value #[[$VAR0]] = %[[ARG0]] : i64 loc(#[[LOC0:.+]])
call void @llvm.dbg.value(metadata i64 %0, metadata !5, metadata !DIExpression()), !dbg !7
; CHECK: llvm.intr.dbg.addr #[[$VAR1]] = %[[ARG1]] : !llvm.ptr loc(#[[LOC1:.+]])
call void @llvm.dbg.addr(metadata ptr %1, metadata !6, metadata !DIExpression()), !dbg !8
; CHECK: llvm.intr.dbg.declare #[[$VAR1]] = %[[ARG1]] : !llvm.ptr loc(#[[LOC2:.+]])
; CHECK: llvm.intr.dbg.declare #[[$VAR1]] = %[[ARG1]] : !llvm.ptr loc(#[[LOC1:.+]])
call void @llvm.dbg.declare(metadata ptr %1, metadata !6, metadata !DIExpression()), !dbg !9
ret void
}

; CHECK: #[[LOC0]] = loc(fused<#[[$SP]]>[{{.*}}])
; CHECK: #[[LOC1]] = loc(fused<#[[$SP]]>[{{.*}}])
; CHECK: #[[LOC2]] = loc(fused<#[[$SP]]>[{{.*}}])

declare void @llvm.dbg.value(metadata, metadata, metadata)
declare void @llvm.dbg.addr(metadata, metadata, metadata)
declare void @llvm.dbg.declare(metadata, metadata, metadata)

!llvm.dbg.cu = !{!1}
Expand Down
4 changes: 1 addition & 3 deletions mlir/test/Target/LLVMIR/llvmir-debug.mlir
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,9 @@ llvm.func @func_with_debug(%arg: i64) {
%alloc = llvm.alloca %allocCount x i64 : (i32) -> !llvm.ptr<i64>

// CHECK: call void @llvm.dbg.value(metadata i64 %[[ARG]], metadata ![[VAR_LOC:[0-9]+]], metadata !DIExpression())
// CHECK: call void @llvm.dbg.addr(metadata ptr %[[ALLOC]], metadata ![[ADDR_LOC:[0-9]+]], metadata !DIExpression())
// CHECK: call void @llvm.dbg.declare(metadata ptr %[[ALLOC]], metadata ![[ADDR_LOC]], metadata !DIExpression())
// CHECK: call void @llvm.dbg.declare(metadata ptr %[[ALLOC]], metadata ![[ADDR_LOC:[0-9]+]], metadata !DIExpression())
// CHECK: call void @llvm.dbg.value(metadata i64 %[[ARG]], metadata ![[NO_NAME_VAR:[0-9]+]], metadata !DIExpression())
llvm.intr.dbg.value #variable = %arg : i64
llvm.intr.dbg.addr #variableAddr = %alloc : !llvm.ptr<i64>
llvm.intr.dbg.declare #variableAddr = %alloc : !llvm.ptr<i64>
llvm.intr.dbg.value #noNameVariable= %arg : i64

Expand Down