1; RUN: opt -passes=redundant-dbg-inst-elim -S %s -o - \ 2; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg" 3; RUN: opt --try-experimental-debuginfo-iterators -passes=redundant-dbg-inst-elim -S %s -o - \ 4; RUN: | FileCheck %s --implicit-check-not="call void @llvm.dbg" 5 6;; Hand-written. Test how RemoveRedundantDbgInstrs interacts with dbg.assign 7;; intrinsics. FileCehck directives are inline. 8 9define dso_local void @_Z1fv() !dbg !7 { 10entry: 11 %test = alloca i32, align 4, !DIAssignID !20 12; CHECK: alloca 13;; Forward scan: This dbg.assign for Local2 contains an undef value component 14;; in the entry block and is the first debug intrinsic for the variable, but is 15;; linked to an instruction so should not be deleted. 16; CHECK-NEXT: #dbg_assign(i1 undef, ![[Local2:[0-9]+]] 17 call void @llvm.dbg.assign(metadata i1 undef, metadata !19, metadata !DIExpression(), metadata !20, metadata ptr %test, metadata !DIExpression()), !dbg !14 18 19;; Forward scan: dbg.assign for Local unlinked with undef value component, in 20;; the enrty bock and seen before any non-undefs; delete it. 21; CHECK-NEXT: @step() 22 call void @llvm.dbg.assign(metadata i32 undef, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 23 call void @step() 24 25;; Forward scan: Repeat the previous test to check it works more than once. 26; CHECK-NEXT: @step() 27 call void @llvm.dbg.assign(metadata i32 undef, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 28 call void @step() 29 30;; Backward scan: Check that a dbg.value made redundant by a dbg.assign is 31;; removed. 32;; CHECK-NEXT: #dbg_assign(i32 1, ![[Local:[0-9]+]] 33;; CHECK-NEXT: @step() 34 call void @llvm.dbg.value(metadata i32 0, metadata !11, metadata !DIExpression()), !dbg !14 35 call void @llvm.dbg.assign(metadata i32 1, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 36 call void @step() 37 38;; Backward scan: Check that a dbg.assign made redundant by a dbg.value is 39;; removed. 40;; CHECK-NEXT: #dbg_value(i32 3, ![[Local:[0-9]+]] 41;; CHECK-NEXT: @step() 42 call void @llvm.dbg.assign(metadata i32 2, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 43 call void @llvm.dbg.value(metadata i32 3, metadata !11, metadata !DIExpression()), !dbg !14 44 call void @step() 45 46;; Forward scan: This unlinked dbg.assign(3, ...) is shadowed by the 47;; dbg.value(3,...) above. Check it is removed. 48;; CHECK-NEXT: @step() 49 call void @llvm.dbg.assign(metadata i32 3, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 50 call void @step() 51 52;; Forward scan: Same as above except this dbg.assign is shadowed by 53;; another dbg.assign rather than a dbg.value. Check it is removed. 54;; CHECK-NEXT: @step() 55 call void @llvm.dbg.assign(metadata i32 3, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 56 call void @step() 57 58;; Forward scan: We've seen non-undef dbg intrinsics for Local in the entry 59;; block so we shouldn't delete this undef. 60; CHECK-NEXT: #dbg_assign(i32 undef, ![[Local]] 61 call void @llvm.dbg.assign(metadata i32 undef, metadata !11, metadata !DIExpression(), metadata !15, metadata ptr undef, metadata !DIExpression()), !dbg !14 62 br label %next 63 64next: 65;; Forward scan: Do not delete undef dbg.assigns from non-entry blocks. 66; CHECK: #dbg_assign(i32 undef, ![[Local2]] 67; CHECK-NEXT: @step() 68 call void @llvm.dbg.assign(metadata i32 undef, metadata !19, metadata !DIExpression(), metadata !21, metadata ptr %test, metadata !DIExpression()), !dbg !14 69 call void @step() 70 71;; Forward scan: The next dbg.assign would be made redundant by this dbg.value 72;; if it were not for the fact that it is linked to an instruction. Ensure it 73;; isn't removed. 74;; Backward scan: It (the next dbg.assign) is also followed by another for the 75;; same variable - check it isn't remove (because it's linked). 76; CHECK-NEXT: #dbg_value(i32 0, ![[Local2]] 77; CHECK-NEXT: store 78; CHECK-NEXT: store 79; CHECK-NEXT: #dbg_assign(i32 0, ![[Local2]] 80; CHECK-NEXT: #dbg_assign(i32 1, ![[Local2]] 81 call void @llvm.dbg.value(metadata i32 0, metadata !19, metadata !DIExpression()), !dbg !14 82 store i32 0, ptr %test, !DIAssignID !17 83 store i32 1, ptr %test, !DIAssignID !16 84 call void @llvm.dbg.assign(metadata i32 0, metadata !19, metadata !DIExpression(), metadata !17, metadata ptr %test, metadata !DIExpression()), !dbg !14 85 call void @llvm.dbg.assign(metadata i32 1, metadata !19, metadata !DIExpression(), metadata !16, metadata ptr %test, metadata !DIExpression()), !dbg !14 86 ret void, !dbg !18 87} 88 89; CHECK-DAG: ![[Local2]] = !DILocalVariable(name: "Local2", 90; CHECK-DAG: ![[Local]] = !DILocalVariable(name: "Local", 91 92declare dso_local void @step() 93declare void @llvm.dbg.assign(metadata, metadata, metadata, metadata, metadata, metadata) 94declare void @llvm.dbg.value(metadata, metadata, metadata) 95 96!llvm.dbg.cu = !{!0} 97!llvm.module.flags = !{!2, !3, !4, !5, !1000} 98!llvm.ident = !{!6} 99 100!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 14.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) 101!1 = !DIFile(filename: "test.cpp", directory: "/") 102!2 = !{i32 7, !"Dwarf Version", i32 5} 103!3 = !{i32 2, !"Debug Info Version", i32 3} 104!4 = !{i32 1, !"wchar_size", i32 4} 105!5 = !{i32 7, !"uwtable", i32 1} 106!6 = !{!"clang version 14.0.0"} 107!7 = distinct !DISubprogram(name: "f", linkageName: "_Z1fv", scope: !1, file: !1, line: 1, type: !8, scopeLine: 1, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !10) 108!8 = !DISubroutineType(types: !9) 109!9 = !{null} 110!10 = !{!11, !19} 111!11 = !DILocalVariable(name: "Local", scope: !7, file: !1, line: 2, type: !12) 112!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 113!13 = distinct !DIAssignID() 114!14 = !DILocation(line: 0, scope: !7) 115!15 = distinct !DIAssignID() 116!16 = distinct !DIAssignID() 117!17 = distinct !DIAssignID() 118!18 = !DILocation(line: 6, column: 1, scope: !7) 119!19 = !DILocalVariable(name: "Local2", scope: !7, file: !1, line: 2, type: !12) 120!20 = distinct !DIAssignID() 121!21 = distinct !DIAssignID() 122!1000 = !{i32 7, !"debug-info-assignment-tracking", i1 true} 123