Skip to content

Commit 30d318a

Browse files
authored
Merge pull request #41490 from gottesmm/pr-69fa70aa45829cb5910c4dc41dba47feea4454a1
[move-function] Be more pedantic about ensuring that undef dbg value have same scope/loc as the original dbg value.
2 parents 4453571 + 80f598c commit 30d318a

File tree

2 files changed

+37
-15
lines changed

2 files changed

+37
-15
lines changed

lib/SILOptimizer/Mandatory/MoveKillsCopyableAddressesChecker.cpp

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1777,7 +1777,9 @@ bool DataflowState::process(
17771777
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
17781778
debug.markAsMoved();
17791779
if (auto varInfo = debug.getVarInfo()) {
1780-
builder.createDebugValue(
1780+
SILBuilderWithScope undefBuilder(builder);
1781+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
1782+
undefBuilder.createDebugValue(
17811783
debug.inst->getLoc(),
17821784
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
17831785
false /*poison*/, true /*was moved*/);
@@ -1923,7 +1925,9 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
19231925
// Also, mark the alloc_stack as being moved at some point.
19241926
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
19251927
if (auto varInfo = debug.getVarInfo()) {
1926-
builder.createDebugValue(
1928+
SILBuilderWithScope undefBuilder(builder);
1929+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
1930+
undefBuilder.createDebugValue(
19271931
debug.inst->getLoc(),
19281932
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
19291933
false,
@@ -2031,11 +2035,15 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
20312035
IsInitialization);
20322036
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
20332037
if (auto varInfo = debug.getVarInfo()) {
2034-
builder.createDebugValue(
2035-
debug.inst->getLoc(),
2036-
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
2037-
false,
2038+
{
2039+
SILBuilderWithScope undefBuilder(builder);
2040+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
2041+
undefBuilder.createDebugValue(
2042+
debug.inst->getLoc(),
2043+
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
2044+
false,
20382045
/*was moved*/ true);
2046+
}
20392047
{
20402048
// Make sure at the reinit point to create a new debug value after the
20412049
// reinit instruction so we reshow the variable.
@@ -2078,7 +2086,9 @@ static bool performSingleBasicBlockAnalysis(DataflowState &dataflowState,
20782086
dumpBitVector(llvm::dbgs(), bitVector); llvm::dbgs() << '\n');
20792087
if (auto debug = DebugVarCarryingInst::getFromValue(address)) {
20802088
if (auto varInfo = debug.getVarInfo()) {
2081-
builder.createDebugValue(
2089+
SILBuilderWithScope undefBuilder(builder);
2090+
undefBuilder.setCurrentDebugScope(debug.inst->getDebugScope());
2091+
undefBuilder.createDebugValue(
20822092
debug.inst->getLoc(),
20832093
SILUndef::get(address->getType(), builder.getModule()), *varInfo,
20842094
false,

test/DebugInfo/move_function_dbginfo.swift

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@ public protocol P {
3939
// CHECK: call void @llvm.dbg.declare(metadata {{.*}}** %m.debug, metadata ![[M_COPYABLE_VALUE_TEST:[0-9]*]],
4040
//
4141
// We should have a llvm.dbg.addr for k since we moved it.
42-
// CHECK: call void @llvm.dbg.addr(metadata {{.*}}** %k.debug, metadata ![[K_COPYABLE_VALUE_TEST:[0-9]*]],
42+
// CHECK: call void @llvm.dbg.addr(metadata {{.*}}** %k.debug, metadata ![[K_COPYABLE_VALUE_METADATA:[0-9]*]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
4343
//
4444
// Our undef should be an llvm.dbg.value. Counter-intuitively this works for
4545
// both llvm.dbg.addr /and/ llvm.dbg.value. Importantly though its metadata
4646
// should be for k since that is the variable that we are telling the debugger
4747
// is no longer defined.
48-
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC* undef, metadata ![[K_COPYABLE_VALUE_TEST]],
48+
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC* undef, metadata ![[K_COPYABLE_VALUE_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
4949
//
5050
// CHECK: ret void
5151
// CHECK-NEXT: }
@@ -82,8 +82,10 @@ public func copyableValueTest() {
8282

8383
// CHECK-LABEL: define swiftcc void @"$s21move_function_dbginfo15copyableVarTestyyF"()
8484
// CHECK: call void @llvm.dbg.declare(metadata %T21move_function_dbginfo5KlassC** %m.debug,
85-
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA:[0-9]+]],
86-
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]],
85+
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA:[0-9]+]], metadata !DIExpression()), !dbg ![[ADDR_LOC:[0-9]*]]
86+
// CHECK: call void @llvm.dbg.value(metadata %T21move_function_dbginfo5KlassC** undef, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
87+
// TODO: Should this be a deref like the original?
88+
// CHECK: call void @llvm.dbg.addr(metadata %T21move_function_dbginfo5KlassC** %k, metadata ![[K_COPYABLE_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
8789
// CHECK: ret void
8890
// CHECK-NEXT: }
8991
//
@@ -124,8 +126,8 @@ public func copyableVarTest() {
124126
// CHECK: @llvm.dbg.declare(metadata %swift.type** %T1,
125127
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
126128
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
127-
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDR_LET_METADATA:[0-9]+]],
128-
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]],
129+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDR_LET_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
130+
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDR_LET_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
129131
// CHECK: ret void
130132
// CHECK-NEXT: }
131133
//
@@ -174,8 +176,9 @@ public func addressOnlyValueTest<T : P>(_ x: T) {
174176
// CHECK: @llvm.dbg.declare(metadata %swift.type** %T1,
175177
// CHECK: @llvm.dbg.declare(metadata %swift.opaque** %x.debug,
176178
// CHECK: @llvm.dbg.declare(metadata i8** %m.debug,
177-
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA:[0-9]+]],
178-
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]],
179+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA:[0-9]+]], metadata !DIExpression(DW_OP_deref)), !dbg ![[ADDR_LOC:[0-9]*]]
180+
// CHECK: @llvm.dbg.value(metadata %swift.opaque* undef, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
181+
// CHECK: @llvm.dbg.addr(metadata i8** %k.debug, metadata ![[K_ADDRONLY_VAR_METADATA]], metadata !DIExpression()), !dbg ![[ADDR_LOC]]
179182
// CHECK: ret void
180183
// CHECK-NEXT: }
181184
//
@@ -222,3 +225,12 @@ public func addressOnlyVarTest<T : P>(_ x: T) {
222225
k = x
223226
k.doSomething()
224227
}
228+
229+
//////////////////////////
230+
// Late Metadata Checks //
231+
//////////////////////////
232+
233+
// CHECK-DAG: ![[K_COPYABLE_VALUE_METADATA]] = !DILocalVariable(name: "k",
234+
// CHECK-DAG: ![[K_COPYABLE_VAR_METADATA]] = !DILocalVariable(name: "k",
235+
// CHECK-DAG: ![[K_ADDR_LET_METADATA]] = !DILocalVariable(name: "k",
236+
// CHECK-DAG: ![[K_ADDRONLY_VAR_METADATA]] = !DILocalVariable(name: "k",

0 commit comments

Comments
 (0)