Skip to content

Commit 352baa3

Browse files
authored
[RemoveDIs] Resolve RemoveRedundantDbgInstrs fwd scan FIXME (#144718)
These FIXMEs were added to keep the dbg_record implementation identical to the dbg intrinsic versions, which have since been removed. I don't think there's any reason for the old behaviour; my understanding is it was a minor bug no one got round to fixing. I've upgraded the test to be written with dbg_records while I'm here.
1 parent 825ad86 commit 352baa3

File tree

2 files changed

+33
-50
lines changed

2 files changed

+33
-50
lines changed

llvm/lib/Transforms/Utils/BasicBlockUtils.cpp

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -377,33 +377,14 @@ bool llvm::MergeBlockSuccessorsIntoGivenBlocks(
377377
///
378378
/// Possible improvements:
379379
/// - Check fully overlapping fragments and not only identical fragments.
380-
/// - Support dbg.declare. dbg.label, and possibly other meta instructions being
381-
/// part of the sequence of consecutive instructions.
382380
static bool
383381
DbgVariableRecordsRemoveRedundantDbgInstrsUsingBackwardScan(BasicBlock *BB) {
384382
SmallVector<DbgVariableRecord *, 8> ToBeRemoved;
385383
SmallDenseSet<DebugVariable> VariableSet;
386384
for (auto &I : reverse(*BB)) {
387-
for (DbgRecord &DR : reverse(I.getDbgRecordRange())) {
388-
if (isa<DbgLabelRecord>(DR)) {
389-
// Emulate existing behaviour (see comment below for dbg.declares).
390-
// FIXME: Don't do this.
391-
VariableSet.clear();
392-
continue;
393-
}
394-
385+
for (DbgVariableRecord &DR :
386+
reverse(filterDbgVars(I.getDbgRecordRange()))) {
395387
DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);
396-
// Skip declare-type records, as the debug intrinsic method only works
397-
// on dbg.value intrinsics.
398-
if (DVR.getType() == DbgVariableRecord::LocationType::Declare) {
399-
// The debug intrinsic method treats dbg.declares are "non-debug"
400-
// instructions (i.e., a break in a consecutive range of debug
401-
// intrinsics). Emulate that to create identical outputs. See
402-
// "Possible improvements" above.
403-
// FIXME: Delete the line below.
404-
VariableSet.clear();
405-
continue;
406-
}
407388

408389
DebugVariable Key(DVR.getVariable(), DVR.getExpression(),
409390
DVR.getDebugLoc()->getInlinedAt());

llvm/test/Transforms/DCE/dbg-value-removal.ll

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
; All dbg.value with location "!dbg !19" are redundant in the input.
55
; FIXME: We do not handle non-overlapping/overlapping fragments perfectly yet.
66

7-
define dso_local i16 @main(i16 %a1, i16 %a2) local_unnamed_addr #0 !dbg !7 {
7+
define dso_local i16 @main(i16 %a1, i16 %a2) local_unnamed_addr !dbg !7 {
88
; CHECK-LABEL: @main(
99
; CHECK-NEXT: entry:
1010
; CHECK-NEXT: br label [[BB0:%.*]]
@@ -23,6 +23,8 @@ define dso_local i16 @main(i16 %a1, i16 %a2) local_unnamed_addr #0 !dbg !7 {
2323
; CHECK-NEXT: #dbg_value(i16 [[A2]], [[META12]], !DIExpression(DW_OP_constu, 2, DW_OP_shr, DW_OP_stack_value), [[META18]])
2424
; CHECK-NEXT: br label [[BB2:%.*]]
2525
; CHECK: bb2:
26+
; CHECK-NEXT: #dbg_declare(i16 %a1, !19, !DIExpression(), [[META18]])
27+
; CHECK-NEXT: #dbg_label([[META21:![0-9]+]], [[META18]])
2628
; CHECK-NEXT: #dbg_value(i16 [[A1]], [[META13]], !DIExpression(DW_OP_LLVM_fragment, 0, 8), [[META18]])
2729
; CHECK-NEXT: #dbg_value(i16 [[A1]], [[META13]], !DIExpression(DW_OP_LLVM_fragment, 8, 8), [[META18]])
2830
; CHECK-NEXT: [[T2:%.*]] = call i16 @bar(i16 [[T1]])
@@ -40,51 +42,49 @@ entry:
4042
br label %bb0
4143

4244
bb0:
43-
call void @llvm.dbg.value(metadata i16 999, metadata !12, metadata !DIExpression()), !dbg !19
44-
call void @llvm.dbg.value(metadata i16 996, metadata !13, metadata !DIExpression()), !dbg !19
45-
call void @llvm.dbg.value(metadata i16 13, metadata !13, metadata !DIExpression()), !dbg !17
46-
call void @llvm.dbg.value(metadata i16 998, metadata !12, metadata !DIExpression(DW_OP_constu, 2, DW_OP_shr, DW_OP_stack_value)), !dbg !19
47-
call void @llvm.dbg.value(metadata i16 14, metadata !14, metadata !DIExpression()), !dbg !16
48-
call void @llvm.dbg.value(metadata i16 997, metadata !12, metadata !DIExpression()), !dbg !19
49-
call void @llvm.dbg.value(metadata i16 13, metadata !13, metadata !DIExpression()), !dbg !16
50-
call void @llvm.dbg.value(metadata i16 12, metadata !12, metadata !DIExpression()), !dbg !16
45+
#dbg_value(i16 999, !12, !DIExpression(), !19)
46+
#dbg_value(i16 996, !13, !DIExpression(), !19)
47+
#dbg_value(i16 13, !13, !DIExpression(), !17)
48+
#dbg_value(i16 998, !12, !DIExpression(DW_OP_constu, 2, DW_OP_shr, DW_OP_stack_value), !19)
49+
#dbg_value(i16 14, !14, !DIExpression(), !16)
50+
#dbg_value(i16 997, !12, !DIExpression(), !19)
51+
#dbg_value(i16 13, !13, !DIExpression(), !16)
52+
#dbg_value(i16 12, !12, !DIExpression(), !16)
5153
br label %bb1
5254

5355
bb1:
54-
call void @llvm.dbg.value(metadata i16 %a1, metadata !14, metadata !DIExpression()), !dbg !16
55-
call void @llvm.dbg.value(metadata i16 888, metadata !13, metadata !DIExpression()), !dbg !16
56-
call void @llvm.dbg.value(metadata i16 %a2, metadata !12, metadata !DIExpression()), !dbg !16
56+
#dbg_value(i16 %a1, !14, !DIExpression(), !16)
57+
#dbg_value(i16 888, !13, !DIExpression(), !16)
58+
#dbg_value(i16 %a2, !12, !DIExpression(), !16)
5759
%t1 = call i16 @bar(i16 0)
58-
call void @llvm.dbg.value(metadata i16 %a1, metadata !14, metadata !DIExpression()), !dbg !19
59-
call void @llvm.dbg.value(metadata i16 %t1, metadata !13, metadata !DIExpression()), !dbg !16
60-
call void @llvm.dbg.value(metadata i16 %a2, metadata !12, metadata !DIExpression(DW_OP_constu, 2, DW_OP_shr, DW_OP_stack_value)), !dbg !16
60+
#dbg_value(i16 %a1, !14, !DIExpression(), !19)
61+
#dbg_value(i16 %t1, !13, !DIExpression(), !16)
62+
#dbg_value(i16 %a2, !12, !DIExpression(DW_OP_constu, 2, DW_OP_shr, DW_OP_stack_value), !16)
6163
br label %bb2
6264

6365
bb2:
64-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 8)), !dbg !19
65-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 8, 8)), !dbg !19
66-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 8)), !dbg !16
67-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 8, 8)), !dbg !16
66+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 0, 8), !19)
67+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 8, 8), !19)
68+
; Check dbg_declare and dbg_label don't interfere with the backward scan.
69+
#dbg_declare(i16 %a1, !21, !DIExpression(), !16)
70+
#dbg_label(!20, !16)
71+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 0, 8), !16)
72+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 8, 8), !16)
6873
%t2 = call i16 @bar(i16 %t1)
69-
call void @llvm.dbg.value(metadata i16 %t2, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 8)), !dbg !16
70-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 8, 8)), !dbg !19
74+
#dbg_value(i16 %t2, !13, !DIExpression(DW_OP_LLVM_fragment, 0, 8), !16)
75+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 8, 8), !19)
7176
br label %bb3
7277

7378
bb3:
74-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression(DW_OP_LLVM_fragment, 0, 8)), !dbg !19
75-
call void @llvm.dbg.value(metadata i16 %a1, metadata !13, metadata !DIExpression()), !dbg !16
79+
#dbg_value(i16 %a1, !13, !DIExpression(DW_OP_LLVM_fragment, 0, 8), !19)
80+
#dbg_value(i16 %a1, !13, !DIExpression(), !16)
7681
br label %exit
7782

7883
exit:
7984
ret i16 %t2
8085
}
8186

82-
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
83-
declare i16 @bar(i16) #2
84-
85-
attributes #0 = { noinline nounwind }
86-
attributes #1 = { nounwind readnone speculatable willreturn }
87-
attributes #2 = { noinline nounwind readnone }
87+
declare i16 @bar(i16)
8888

8989
!llvm.dbg.cu = !{!0}
9090
!llvm.module.flags = !{!3, !4, !5}
@@ -110,3 +110,5 @@ attributes #2 = { noinline nounwind readnone }
110110
!17 = !DILocation(line: 0, scope: !7, inlinedAt: !18)
111111
!18 = !DILocation(line: 1, scope: !7)
112112
!19 = !DILocation(line: 77, scope: !7)
113+
!20 = !DILabel(scope: !7, name: "label", file: !1, line: 3)
114+
!21 = !DILocalVariable(name: "z", scope: !7, file: !1, line: 10, type: !10)

0 commit comments

Comments
 (0)