Skip to content

Commit 60e1c83

Browse files
authored
[RemoveDIs][DebugInfo] Update SROA to handle DPVAssigns (#78475)
SROA needs to update llvm.dbg.assign intrinsics when it migrates debug info in response to alloca splitting; this patch updates the debug info migration code to handle DPVAssigns as well, making use of generic code to avoid duplication as much as possible.
1 parent ccf1e32 commit 60e1c83

23 files changed

+107
-20
lines changed

llvm/include/llvm/IR/DebugInfo.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,12 @@ inline SmallVector<DPValue *> getDPVAssignmentMarkers(const Instruction *Inst) {
236236
return {};
237237
}
238238

239+
inline SmallVector<DPValue *> getDPVAssignmentMarkers(const Instruction *Inst) {
240+
if (auto *ID = Inst->getMetadata(LLVMContext::MD_DIAssignID))
241+
return cast<DIAssignID>(ID)->getAllDPValueUsers();
242+
return {};
243+
}
244+
239245
/// Delete the llvm.dbg.assign intrinsics linked to \p Inst.
240246
void deleteAssignmentMarkers(const Instruction *Inst);
241247

llvm/lib/Transforms/Scalar/SROA.cpp

Lines changed: 68 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,29 @@ static DebugVariable getAggregateVariable(DbgVariableIntrinsic *DVI) {
319319
return DebugVariable(DVI->getVariable(), std::nullopt,
320320
DVI->getDebugLoc().getInlinedAt());
321321
}
322+
static DebugVariable getAggregateVariable(DPValue *DPV) {
323+
return DebugVariable(DPV->getVariable(), std::nullopt,
324+
DPV->getDebugLoc().getInlinedAt());
325+
}
326+
327+
static DPValue *createLinkedAssign(DPValue *, DIBuilder &DIB,
328+
Instruction *LinkedInstr, Value *NewValue,
329+
DILocalVariable *Variable,
330+
DIExpression *Expression, Value *Address,
331+
DIExpression *AddressExpression,
332+
const DILocation *DI) {
333+
(void)DIB;
334+
return DPValue::createLinkedDPVAssign(LinkedInstr, NewValue, Variable,
335+
Expression, Address, AddressExpression,
336+
DI);
337+
}
338+
static DbgAssignIntrinsic *createLinkedAssign(
339+
DbgAssignIntrinsic *, DIBuilder &DIB, Instruction *LinkedInstr,
340+
Value *NewValue, DILocalVariable *Variable, DIExpression *Expression,
341+
Value *Address, DIExpression *AddressExpression, const DILocation *DI) {
342+
return DIB.insertDbgAssign(LinkedInstr, NewValue, Variable, Expression,
343+
Address, AddressExpression, DI);
344+
}
322345

323346
/// Find linked dbg.assign and generate a new one with the correct
324347
/// FragmentInfo. Link Inst to the new dbg.assign. If Value is nullptr the
@@ -340,8 +363,9 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
340363
Instruction *Inst, Value *Dest, Value *Value,
341364
const DataLayout &DL) {
342365
auto MarkerRange = at::getAssignmentMarkers(OldInst);
366+
auto DPVAssignMarkerRange = at::getDPVAssignmentMarkers(OldInst);
343367
// Nothing to do if OldInst has no linked dbg.assign intrinsics.
344-
if (MarkerRange.empty())
368+
if (MarkerRange.empty() && DPVAssignMarkerRange.empty())
345369
return;
346370

347371
LLVM_DEBUG(dbgs() << " migrateDebugInfo\n");
@@ -362,6 +386,9 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
362386
for (auto *DAI : at::getAssignmentMarkers(OldAlloca))
363387
BaseFragments[getAggregateVariable(DAI)] =
364388
DAI->getExpression()->getFragmentInfo();
389+
for (auto *DPV : at::getDPVAssignmentMarkers(OldAlloca))
390+
BaseFragments[getAggregateVariable(DPV)] =
391+
DPV->getExpression()->getFragmentInfo();
365392

366393
// The new inst needs a DIAssignID unique metadata tag (if OldInst has
367394
// one). It shouldn't already have one: assert this assumption.
@@ -371,7 +398,7 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
371398
DIBuilder DIB(*OldInst->getModule(), /*AllowUnresolved*/ false);
372399
assert(OldAlloca->isStaticAlloca());
373400

374-
for (DbgAssignIntrinsic *DbgAssign : MarkerRange) {
401+
auto MigrateDbgAssign = [&](auto DbgAssign) {
375402
LLVM_DEBUG(dbgs() << " existing dbg.assign is: " << *DbgAssign
376403
<< "\n");
377404
auto *Expr = DbgAssign->getExpression();
@@ -382,7 +409,7 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
382409
{
383410
auto R = BaseFragments.find(getAggregateVariable(DbgAssign));
384411
if (R == BaseFragments.end())
385-
continue;
412+
return;
386413
BaseFragment = R->second;
387414
}
388415
std::optional<DIExpression::FragmentInfo> CurrentFragment =
@@ -393,7 +420,7 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
393420
BaseFragment, CurrentFragment, NewFragment);
394421

395422
if (Result == Skip)
396-
continue;
423+
return;
397424
if (Result == UseFrag && !(NewFragment == CurrentFragment)) {
398425
if (CurrentFragment) {
399426
// Rewrite NewFragment to be relative to the existing one (this is
@@ -425,9 +452,10 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
425452
}
426453

427454
::Value *NewValue = Value ? Value : DbgAssign->getValue();
428-
auto *NewAssign = DIB.insertDbgAssign(
429-
Inst, NewValue, DbgAssign->getVariable(), Expr, Dest,
430-
DIExpression::get(Ctx, std::nullopt), DbgAssign->getDebugLoc());
455+
auto *NewAssign = createLinkedAssign(
456+
DbgAssign, DIB, Inst, NewValue, DbgAssign->getVariable(), Expr, Dest,
457+
DIExpression::get(Expr->getContext(), std::nullopt),
458+
DbgAssign->getDebugLoc());
431459

432460
// If we've updated the value but the original dbg.assign has an arglist
433461
// then kill it now - we can't use the requested new value.
@@ -461,9 +489,11 @@ static void migrateDebugInfo(AllocaInst *OldAlloca, bool IsSplit,
461489
NewAssign->moveBefore(DbgAssign);
462490

463491
NewAssign->setDebugLoc(DbgAssign->getDebugLoc());
464-
LLVM_DEBUG(dbgs() << "Created new assign intrinsic: " << *NewAssign
465-
<< "\n");
466-
}
492+
LLVM_DEBUG(dbgs() << "Created new assign: " << *NewAssign << "\n");
493+
};
494+
495+
for_each(MarkerRange, MigrateDbgAssign);
496+
for_each(DPVAssignMarkerRange, MigrateDbgAssign);
467497
}
468498

469499
namespace {
@@ -3108,6 +3138,7 @@ class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
31083138
// emit dbg.assign intrinsics for mem intrinsics storing through non-
31093139
// constant geps, or storing a variable number of bytes.
31103140
assert(at::getAssignmentMarkers(&II).empty() &&
3141+
at::getDPVAssignmentMarkers(&II).empty() &&
31113142
"AT: Unexpected link to non-const GEP");
31123143
deleteIfTriviallyDead(OldPtr);
31133144
return false;
@@ -3254,11 +3285,13 @@ class AllocaSliceRewriter : public InstVisitor<AllocaSliceRewriter, bool> {
32543285
Value *AdjustedPtr = getNewAllocaSlicePtr(IRB, OldPtr->getType());
32553286
if (IsDest) {
32563287
// Update the address component of linked dbg.assigns.
3257-
for (auto *DAI : at::getAssignmentMarkers(&II)) {
3258-
if (llvm::is_contained(DAI->location_ops(), II.getDest()) ||
3259-
DAI->getAddress() == II.getDest())
3260-
DAI->replaceVariableLocationOp(II.getDest(), AdjustedPtr);
3261-
}
3288+
auto UpdateAssignAddress = [&](auto *DbgAssign) {
3289+
if (llvm::is_contained(DbgAssign->location_ops(), II.getDest()) ||
3290+
DbgAssign->getAddress() == II.getDest())
3291+
DbgAssign->replaceVariableLocationOp(II.getDest(), AdjustedPtr);
3292+
};
3293+
for_each(at::getAssignmentMarkers(&II), UpdateAssignAddress);
3294+
for_each(at::getDPVAssignmentMarkers(&II), UpdateAssignAddress);
32623295
II.setDest(AdjustedPtr);
32633296
II.setDestAlignment(SliceAlign);
32643297
} else {
@@ -3842,6 +3875,7 @@ class AggLoadStoreRewriter : public InstVisitor<AggLoadStoreRewriter, bool> {
38423875
DL);
38433876
} else {
38443877
assert(at::getAssignmentMarkers(Store).empty() &&
3878+
at::getDPVAssignmentMarkers(Store).empty() &&
38453879
"AT: unexpected debug.assign linked to store through "
38463880
"unbounded GEP");
38473881
}
@@ -4861,10 +4895,22 @@ static void insertNewDbgInst(DIBuilder &DIB, DPValue *Orig, AllocaInst *NewAddr,
48614895
DIExpression *NewFragmentExpr,
48624896
Instruction *BeforeInst) {
48634897
(void)DIB;
4864-
DPValue *New = new DPValue(ValueAsMetadata::get(NewAddr), Orig->getVariable(),
4865-
NewFragmentExpr, Orig->getDebugLoc(),
4866-
DPValue::LocationType::Declare);
4867-
BeforeInst->getParent()->insertDPValueBefore(New, BeforeInst->getIterator());
4898+
if (Orig->isDbgDeclare()) {
4899+
DPValue *DPV = DPValue::createDPVDeclare(
4900+
NewAddr, Orig->getVariable(), NewFragmentExpr, Orig->getDebugLoc());
4901+
BeforeInst->getParent()->insertDPValueBefore(DPV,
4902+
BeforeInst->getIterator());
4903+
return;
4904+
}
4905+
if (!NewAddr->hasMetadata(LLVMContext::MD_DIAssignID)) {
4906+
NewAddr->setMetadata(LLVMContext::MD_DIAssignID,
4907+
DIAssignID::getDistinct(NewAddr->getContext()));
4908+
}
4909+
auto *NewAssign = DPValue::createLinkedDPVAssign(
4910+
NewAddr, Orig->getValue(), Orig->getVariable(), NewFragmentExpr, NewAddr,
4911+
Orig->getAddressExpression(), Orig->getDebugLoc());
4912+
LLVM_DEBUG(dbgs() << "Created new DPVAssign: " << *NewAssign << "\n");
4913+
(void)NewAssign;
48684914
}
48694915

48704916
/// Walks the slices of an alloca and form partitions based on them,
@@ -5042,6 +5088,7 @@ bool SROA::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
50425088
for_each(findDbgDeclares(&AI), MigrateOne);
50435089
for_each(findDPVDeclares(&AI), MigrateOne);
50445090
for_each(at::getAssignmentMarkers(&AI), MigrateOne);
5091+
for_each(at::getDPVAssignmentMarkers(&AI), MigrateOne);
50455092

50465093
return Changed;
50475094
}
@@ -5262,8 +5309,9 @@ std::pair<bool /*Changed*/, bool /*CFGChanged*/> SROA::runSROA(Function &F) {
52625309
"Should not have modified the CFG when told to preserve it.");
52635310

52645311
if (Changed && isAssignmentTrackingEnabled(*F.getParent())) {
5265-
for (auto &BB : F)
5312+
for (auto &BB : F) {
52665313
RemoveRedundantDbgInstrs(&BB);
5314+
}
52675315
}
52685316

52695317
return {Changed, CFGChanged};

llvm/test/DebugInfo/Generic/assignment-tracking/instcombine/remove-redundant-dbg.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; Check that sroa removes redundant debug intrinsics after it makes a
57
;; change. This has a significant positive impact on peak memory and compiler

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/after-inlining.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt %s -S -passes=sroa -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators %s -S -passes=sroa -o - | FileCheck %s
23

34
;; Check that SROA preserves the InlinedAt status of new dbg.assign intriniscs
45
;; it inserts.

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/alloca-single-slice.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa,verify -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa,verify -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
; Check that single sliced allocas retain their assignment tracking debug info.
57

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/arglist.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -passes=sroa -S %s -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - | FileCheck %s
23

34
;; Check that a dbg.assign for a promoted variable becomes a kill location if
45
;; it used an arglist.

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/complex.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa -S -o - %s \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S -o - %s \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35
;
46
;; Based on llvm/test/DebugInfo/ARM/sroa-complex.ll
57
;; generated from:

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/fail-fragment.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; Check that a dbg.assign for a promoted variable becomes a kill location if
57
;; it used a fragment that can't be split (the first check directive below).

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/frag-2.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -passes=sroa -S %s -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - | FileCheck %s
23

34
;; $ cat test.cpp
45
;; class a {

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/frag.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt %s -S -passes=sroa -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators %s -S -passes=sroa -o - | FileCheck %s
23

34
;; $ cat test.cpp
45
;; class c {

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/id.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -passes=sroa -S %s -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - | FileCheck %s
23

34
;; Check that multiple dbg.assign intrinsics linked to a store that is getting
45
;; split (or at least that is touched by SROA, causing a replacement store to

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/memcpy.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa,verify -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa,verify -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; Check that the new slices of an alloca and memcpy intructions get dbg.assign
57
;; intrinsics with the correct fragment info.

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/memmove-to-from-same-alloca.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt %s -passes=sroa -o - -S \
22
; RUN: | FileCheck %s
3+
; RUN: opt --try-experimental-debuginfo-iterators %s -passes=sroa -o - -S \
4+
; RUN: | FileCheck %s
35

46
;; Generated from this C++ source:
57
;; __attribute__((nodebug)) struct Blob {int P[6];} Glob;

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/remove-redundant-dbg.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; Check that sroa removes redundant debug intrinsics after it makes a
57
;; change. This has a significant positive impact on peak memory and compiler

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/rewrite.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa,verify -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa,verify -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
; Check that the new slices of an alloca and memset intructions get dbg.assign
57
; intrinsics with the correct fragment info. Ensure that only the

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/split-pre-fragmented-store-2.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -S -passes=sroa -sroa-skip-mem2reg %s \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -S -passes=sroa -sroa-skip-mem2reg %s \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; NOTE: This is the same as split-pre-fragmented-store.ll except the base
57
;; alloca's dbg.assign has been altered to contain a fragment of the full

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/split-pre-fragmented-store.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -S -passes=sroa -sroa-skip-mem2reg %s \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -S -passes=sroa -sroa-skip-mem2reg %s \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; IR hand-modified, originally generated from:
57
;; struct Pair { int a; int b; };

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/store.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa,verify -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa,verify -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
; Check that the new slices of an alloca and memset intructions get dbg.assign
57
; intrinsics with the correct fragment info. Ensure that only the

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/unspecified-var-size.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -S %s -passes=sroa -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators -S %s -passes=sroa -o - | FileCheck %s
23

34
;; $ cat test.cpp
45
;; #include <cstddef>

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/user-memcpy.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
; RUN: opt -passes=sroa -S %s -o - \
22
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
3+
; RUN: opt --try-experimental-debuginfo-iterators -passes=sroa -S %s -o - \
4+
; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg"
35

46
;; Check that the fragments generated in SROA for a split alloca that has a
57
;; dbg.assign with non-zero-offset fragment are correct.

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/var-sized-fragment.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -S %s -o - -passes=sroa | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators -S %s -o - -passes=sroa | FileCheck %s
23

34
;; SROA splits the alloca into two. Each slice already has a 32-bit variable
45
;; associated with it (the structured binding variables). Check SROA doesn't

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/vec-1.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt %s -S -passes=sroa -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators %s -S -passes=sroa -o - | FileCheck %s
23

34
;; Ensure that only the value-expression gets fragment info; that the
45
;; address-expression remains untouched.

llvm/test/DebugInfo/Generic/assignment-tracking/sroa/vec-2.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt %s -S -passes=sroa -o - | FileCheck %s
2+
; RUN: opt --try-experimental-debuginfo-iterators %s -S -passes=sroa -o - | FileCheck %s
23

34
;; $ cat test.cpp
45
;; class a {

0 commit comments

Comments
 (0)