Skip to content

Commit aab3828

Browse files
committed
salvaging debug values outside the if condition and refine tests
1 parent 4625651 commit aab3828

File tree

3 files changed

+124
-47
lines changed

3 files changed

+124
-47
lines changed

llvm/lib/Transforms/Scalar/ConstraintElimination.cpp

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1455,20 +1455,29 @@ static bool checkAndReplaceCondition(
14551455
return ShouldReplace;
14561456
});
14571457
NumCondsRemoved++;
1458-
if (Cmp->use_empty()) {
1459-
SmallVector<DbgVariableIntrinsic *> DbgUsers;
1460-
SmallVector<DbgVariableRecord *> DVRUsers;
1461-
findDbgUsers(DbgUsers, Cmp, &DVRUsers);
1462-
1463-
for (auto *DVR : DVRUsers) {
1464-
auto *DTN = DT.getNode(DVR->getParent());
1465-
if (!DTN || DTN->getDFSNumIn() < NumIn || DTN->getDFSNumOut() > NumOut)
1466-
continue;
1467-
DVR->replaceVariableLocationOp(Cmp, ConstantC);
1468-
}
14691458

1470-
ToRemove.push_back(Cmp);
1459+
// Update the debug value records that satisfy the same condition used
1460+
// in replaceUsesWithIf.
1461+
SmallVector<DbgVariableIntrinsic *> DbgUsers;
1462+
SmallVector<DbgVariableRecord *> DVRUsers;
1463+
findDbgUsers(DbgUsers, Cmp, &DVRUsers);
1464+
1465+
for (auto *DVR : DVRUsers) {
1466+
auto *DTN = DT.getNode(DVR->getParent());
1467+
if (!DTN || DTN->getDFSNumIn() < NumIn || DTN->getDFSNumOut() > NumOut)
1468+
continue;
1469+
1470+
auto *MarkedI = DVR->getInstruction();
1471+
if (MarkedI->getParent() == ContextInst->getParent() &&
1472+
MarkedI->comesBefore(ContextInst))
1473+
continue;
1474+
1475+
DVR->replaceVariableLocationOp(Cmp, ConstantC);
14711476
}
1477+
1478+
if (Cmp->use_empty())
1479+
ToRemove.push_back(Cmp);
1480+
14721481
return Changed;
14731482
};
14741483

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
; RUN: opt < %s -passes=constraint-elimination -S | FileCheck %s
2+
3+
; Check that checkAndReplaceCondition() salvages the debug value information after replacing
4+
; the conditions (`%c.1` and `%t.2` in this test) with the speculated constants (GitHub Issue
5+
; #135736).
6+
; In particular, the debug value record uses should not be replaced if they comes before the
7+
; context instrtuction (e.g., `%t.2` in this example).
8+
9+
declare void @llvm.assume(i1 noundef) #0
10+
11+
declare void @may_unwind()
12+
13+
declare void @use(i1)
14+
15+
define i1 @assume_single_bb_conditions_after_assume(i8 %a, i8 %b, i1 %c) !dbg !5 {
16+
; CHECK-LABEL: define i1 @assume_single_bb_conditions_after_assume(
17+
; CHECK: [[CMP_1:%.*]] = icmp ule i8 [[ADD_1:%.*]], [[B:%.*]], !dbg [[DBG12:![0-9]+]]
18+
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i8 [[ADD_1]], [[B]], !dbg [[DBG13:![0-9]+]]
19+
; CHECK-NEXT: #dbg_value(i1 [[C_1]], [[META9:![0-9]+]], !DIExpression(), [[META14:![0-9]+]])
20+
; CHECK-NEXT: call void @use(i1 [[C_1]]), !dbg [[DBG15:![0-9]+]]
21+
; CHECK-NEXT: #dbg_value(i1 [[C_1]], [[META9]], !DIExpression(), [[META14]])
22+
; CHECK-NEXT: call void @may_unwind(), !dbg [[DBG16:![0-9]+]]
23+
; CHECK-NEXT: #dbg_value(i1 [[C_1]], [[META9]], !DIExpression(), [[META14]])
24+
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP_1]]), !dbg [[DBG17:![0-9]+]]
25+
; CHECK-NEXT: #dbg_value(i1 [[C_1]], [[META9]], !DIExpression(), [[META14]])
26+
; CHECK-NEXT: #dbg_value(i1 true, [[META9]], !DIExpression(), [[META14]])
27+
; CHECK-NEXT: [[RES_1:%.*]] = xor i1 true, true, !dbg [[DBG18:![0-9]+]]
28+
;
29+
%add.1 = add nuw nsw i8 %a, 1, !dbg !11
30+
%cmp.1 = icmp ule i8 %add.1, %b, !dbg !12
31+
%c.1 = icmp ule i8 %add.1, %b, !dbg !13
32+
#dbg_value(i1 %c.1, !9, !DIExpression(), !14)
33+
call void @use(i1 %c.1), !dbg !15
34+
#dbg_value(i1 %c.1, !9, !DIExpression(), !14)
35+
call void @may_unwind(), !dbg !16
36+
#dbg_value(i1 %c.1, !9, !DIExpression(), !14)
37+
call void @llvm.assume(i1 %cmp.1), !dbg !17
38+
#dbg_value(i1 %c.1, !9, !DIExpression(), !14)
39+
%t.2 = icmp ule i8 %a, %b, !dbg !14
40+
#dbg_value(i1 %c.1, !9, !DIExpression(), !14)
41+
%res.1 = xor i1 %c.1, %t.2, !dbg !18
42+
%add.2 = add nuw nsw i8 %a, 2, !dbg !19
43+
%c.2 = icmp ule i8 %add.2, %b, !dbg !20
44+
%res.2 = xor i1 %res.1, %c.2, !dbg !21
45+
ret i1 %res.2, !dbg !22
46+
}
47+
48+
attributes #0 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
49+
50+
!llvm.dbg.cu = !{!0}
51+
!llvm.debugify = !{!2, !3}
52+
!llvm.module.flags = !{!4}
53+
54+
!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
55+
!1 = !DIFile(filename: "/app/example.ll", directory: "/")
56+
!2 = !{i32 12}
57+
!3 = !{i32 8}
58+
!4 = !{i32 2, !"Debug Info Version", i32 3}
59+
!5 = distinct !DISubprogram(name: "assume_single_bb_conditions_after_assume", linkageName: "assume_single_bb_conditions_after_assume", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
60+
!6 = !DISubroutineType(types: !7)
61+
!7 = !{}
62+
!8 = !{!9}
63+
!9 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 7, type: !10)
64+
!10 = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned)
65+
!11 = !DILocation(line: 1, column: 1, scope: !5)
66+
!12 = !DILocation(line: 2, column: 1, scope: !5)
67+
!13 = !DILocation(line: 3, column: 1, scope: !5)
68+
!14 = !DILocation(line: 7, column: 1, scope: !5)
69+
!15 = !DILocation(line: 4, column: 1, scope: !5)
70+
!16 = !DILocation(line: 5, column: 1, scope: !5)
71+
!17 = !DILocation(line: 6, column: 1, scope: !5)
72+
!18 = !DILocation(line: 8, column: 1, scope: !5)
73+
!19 = !DILocation(line: 9, column: 1, scope: !5)
74+
!20 = !DILocation(line: 10, column: 1, scope: !5)
75+
!21 = !DILocation(line: 11, column: 1, scope: !5)
76+
!22 = !DILocation(line: 12, column: 1, scope: !5)
77+
78+
; CHECK: [[META9]] = !DILocalVariable(name: "4",
79+
; CHECK: [[DBG12]] = !DILocation(line: 2, column: 1,
80+
; CHECK: [[DBG13]] = !DILocation(line: 3, column: 1,
81+
; CHECK: [[META14]] = !DILocation(line: 7, column: 1,
82+
; CHECK: [[DBG18]] = !DILocation(line: 8, column: 1,
83+
;.
Lines changed: 20 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
21
; RUN: opt < %s -passes=constraint-elimination -S | FileCheck %s
32

43
; Check that checkAndReplaceCondition() salvages the debug value information after replacing
5-
; the conditions (%t.1 in this test) with the speculated constants (GitHub Issue #135736).
4+
; the conditions (`%t.1` in this test) with the speculated constants (GitHub Issue #135736).
5+
; In particular, the debug value record uses are replaced if their `DFSNumIn`s and `DFSNumOut`s
6+
; on `DominatorTree` satisfy the contraint.
67

78
define i1 @test_and_ule(i4 %x, i4 %y, i4 %z) !dbg !5 {
89
; CHECK-LABEL: define i1 @test_and_ule(
9-
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]) !dbg [[DBG5:![0-9]+]] {
10-
; CHECK-NEXT: [[ENTRY:.*:]]
11-
; CHECK-NEXT: [[C_1:%.*]] = icmp ule i4 [[X]], [[Y]], !dbg [[DBG11:![0-9]+]]
12-
; CHECK-NEXT: [[C_2:%.*]] = icmp ule i4 [[Y]], [[Z]], !dbg [[DBG12:![0-9]+]]
13-
; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_1]], [[C_2]], !dbg [[DBG13:![0-9]+]]
14-
; CHECK-NEXT: br i1 [[AND]], label %[[THEN:.*]], label %[[EXIT:.*]], !dbg [[DBG14:![0-9]+]]
15-
; CHECK: [[THEN]]:
16-
; CHECK-NEXT: #dbg_value(i1 true, [[META9:![0-9]+]], !DIExpression(), [[META15:![0-9]+]])
17-
; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true, !dbg [[DBG16:![0-9]+]]
18-
; CHECK-NEXT: br label %[[EXIT]]
19-
; CHECK: [[EXIT]]:
20-
; CHECK-NEXT: #dbg_value(i1 poison, [[META17:![0-9]+]], !DIExpression(), [[META15]])
21-
; CHECK-NEXT: ret i1 true, !dbg [[DBG18:![0-9]+]]
10+
; CHECK-SAME: i4 [[X:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]])
11+
; CHECK: [[T_1:%.*]] = icmp ule i4 [[X]], [[Z]], !dbg [[DBG13:![0-9]+]]
2212
;
2313
entry:
2414
%c.1 = icmp ule i4 %x, %y, !dbg !11
@@ -27,14 +17,20 @@ entry:
2717
%and = and i1 %c.1, %c.2, !dbg !14
2818
br i1 %and, label %then, label %exit, !dbg !15
2919

20+
; CHECK: [[THEN:.*]]:
21+
; CHECK-NEXT: #dbg_value(i1 true, [[META9:![0-9]+]], !DIExpression(), [[DBG13]])
22+
; CHECK-NEXT: [[R_1:%.*]] = xor i1 true, true, !dbg [[DBG16:![0-9]+]]
3023
then: ; preds = %entry
31-
#dbg_value(i1 %t.1, !9, !DIExpression(), !13)
24+
#dbg_value(i1 %t.1, !9, !DIExpression(), !13)
3225
%r.1 = xor i1 %t.1, %t.1, !dbg !16
3326
br label %exit
3427

28+
; CHECK: [[EXIT:.*]]:
29+
; CHECK-NEXT: #dbg_value(i1 [[T_1]], [[META17:![0-9]+]], !DIExpression(), [[DBG13]])
30+
; CHECK-NEXT: ret i1 [[T_1]], !dbg [[DBG18:![0-9]+]]
3531
exit: ; preds = %bb1, %entry
36-
#dbg_value(i1 %t.1, !17, !DIExpression(), !13)
37-
ret i1 true, !dbg !18
32+
#dbg_value(i1 %t.1, !17, !DIExpression(), !13)
33+
ret i1 %t.1, !dbg !18
3834
}
3935

4036
!llvm.dbg.cu = !{!0}
@@ -60,21 +56,10 @@ exit: ; preds = %bb1, %entry
6056
!16 = !DILocation(line: 7, column: 1, scope: !5)
6157
!17 = !DILocalVariable(name: "6", scope: !5, file: !1, line: 7, type: !10)
6258
!18 = !DILocation(line: 20, column: 1, scope: !5)
63-
;.
64-
; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C, file: [[META1:![0-9]+]], producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
65-
; CHECK: [[META1]] = !DIFile(filename: "temp.ll", directory: {{.*}})
66-
; CHECK: [[DBG5]] = distinct !DISubprogram(name: "test_and_ule", linkageName: "test_and_ule", scope: null, file: [[META1]], line: 1, type: [[META6:![0-9]+]], scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: [[META0]], retainedNodes: [[META8:![0-9]+]])
67-
; CHECK: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]])
68-
; CHECK: [[META7]] = !{}
69-
; CHECK: [[META8]] = !{[[META9]]}
70-
; CHECK: [[META9]] = !DILocalVariable(name: "4", scope: [[DBG5]], file: [[META1]], line: 5, type: [[META10:![0-9]+]])
71-
; CHECK: [[META10]] = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned)
72-
; CHECK: [[DBG11]] = !DILocation(line: 1, column: 1, scope: [[DBG5]])
73-
; CHECK: [[DBG12]] = !DILocation(line: 2, column: 1, scope: [[DBG5]])
74-
; CHECK: [[DBG13]] = !DILocation(line: 3, column: 1, scope: [[DBG5]])
75-
; CHECK: [[DBG14]] = !DILocation(line: 4, column: 1, scope: [[DBG5]])
76-
; CHECK: [[META15]] = !DILocation(line: 5, column: 1, scope: [[DBG5]])
77-
; CHECK: [[DBG16]] = !DILocation(line: 7, column: 1, scope: [[DBG5]])
78-
; CHECK: [[META17]] = !DILocalVariable(name: "6", scope: [[DBG5]], file: [[META1]], line: 7, type: [[META10]])
79-
; CHECK: [[DBG18]] = !DILocation(line: 20, column: 1, scope: [[DBG5]])
59+
60+
; CHECK: [[META9]] = !DILocalVariable(name: "4",
61+
; CHECK: [[DBG13]] = !DILocation(line: 5, column: 1,
62+
; CHECK: [[DBG16]] = !DILocation(line: 7, column: 1,
63+
; CHECK: [[META17]] = !DILocalVariable(name: "6",
64+
; CHECK: [[DBG18]] = !DILocation(line: 20, column: 1,
8065
;.

0 commit comments

Comments
 (0)