Files
clang-p2996/llvm/test/Transforms/JumpThreading/redundant-dbg-info.ll
Jeremy Morse e09758224b [DebugInfo][RemoveDIs] Instrument jump-threading to update DPValues (#73127)
This patch makes jump-threading handle non-instruction debug-info stored
in DPValues in the same way that it updates dbg.values nowadays. This
involves re-targetting their operands as with dbg.values getting moved
from one block to another, and manually cloning them when duplicating
blocks. The SSAUpdater class also grows some functions for SSA-updating
DPValues in the same way as dbg.values.

All of this is largely covered by existing debug-info tests, except for
the cloning of DPValues attached to elidable instructions and branches,
where I've added a test to thread-debug-info.ll. Where previously we
could rely on dbg.values being copied and cloned as normal instructions
are, as we need to explicitly perform that operation now I've added some
explicit testing for it.
2023-11-23 17:07:10 +00:00

80 lines
4.1 KiB
LLVM

; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
; RUN: opt -passes=jump-threading -S < %s --try-experimental-debuginfo-iterators | FileCheck %s
define dso_local i32 @_Z3fooi(i32 %a) !dbg !7 {
entry:
call void @llvm.dbg.value(metadata i32 %a, metadata !12, metadata !DIExpression()), !dbg !13
call void @llvm.dbg.value(metadata i32 1, metadata !14, metadata !DIExpression()), !dbg !13
%tobool = icmp ne i32 %a, 0, !dbg !15
br i1 %tobool, label %if.then, label %if.end, !dbg !17
if.then: ; preds = %entry
call void @_Z4callv(), !dbg !18
call void @llvm.dbg.value(metadata i32 0, metadata !14, metadata !DIExpression()), !dbg !13
br label %if.end, !dbg !20
if.end: ; preds = %if.then, %entry
%c.0 = phi i32 [ 0, %if.then ], [ 1, %entry ], !dbg !13
call void @llvm.dbg.value(metadata i32 %c.0, metadata !14, metadata !DIExpression()), !dbg !13
%tobool1 = icmp ne i32 %c.0, 0, !dbg !21
br i1 %tobool1, label %if.else, label %if.then2, !dbg !23
; CHECK-LABEL: if.then2:
; CHECK: call void @llvm.dbg.value({{.+}}, metadata ![[B:[0-9]+]], metadata !DIExpression())
; CHECK: call void @llvm.dbg.value({{.+}}, metadata ![[B:[0-9]+]], metadata !DIExpression())
; CHECK-NOT: call void @llvm.dbg.value({{.+}}, metadata ![[B]], metadata !DIExpression())
if.then2: ; preds = %if.end
call void @llvm.dbg.value(metadata i32 4, metadata !24, metadata !DIExpression()), !dbg !13
br label %if.end3, !dbg !25
; CHECK-LABEL: if.end3:
if.else: ; preds = %if.end
call void @llvm.dbg.value(metadata i32 6, metadata !24, metadata !DIExpression()), !dbg !13
br label %if.end3
if.end3: ; preds = %if.else, %if.then2
%b.0 = phi i32 [ 6, %if.else ], [ 4, %if.then2 ], !dbg !27
call void @llvm.dbg.value(metadata i32 %b.0, metadata !24, metadata !DIExpression()), !dbg !13
ret i32 %b.0, !dbg !28
}
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare dso_local void @_Z4callv()
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.value(metadata, metadata, metadata)
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!3, !4, !5}
!llvm.ident = !{!6}
; CHECK: ![[B]] = !DILocalVariable(name: "b"
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 10.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "test.cpp", directory: "/")
!2 = !{}
!3 = !{i32 7, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!"clang version 10.0.0"}
!7 = distinct !DISubprogram(name: "foo", linkageName: "_Z3fooi", scope: !8, file: !8, line: 3, type: !9, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
!8 = !DIFile(filename: "./test.cpp", directory: "/")
!9 = !DISubroutineType(types: !10)
!10 = !{!11, !11}
!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!12 = !DILocalVariable(name: "a", arg: 1, scope: !7, file: !8, line: 3, type: !11)
!13 = !DILocation(line: 0, scope: !7)
!14 = !DILocalVariable(name: "c", scope: !7, file: !8, line: 4, type: !11)
!15 = !DILocation(line: 5, column: 7, scope: !16)
!16 = distinct !DILexicalBlock(scope: !7, file: !8, line: 5, column: 7)
!17 = !DILocation(line: 5, column: 7, scope: !7)
!18 = !DILocation(line: 6, column: 5, scope: !19)
!19 = distinct !DILexicalBlock(scope: !16, file: !8, line: 5, column: 10)
!20 = !DILocation(line: 8, column: 3, scope: !19)
!21 = !DILocation(line: 9, column: 8, scope: !22)
!22 = distinct !DILexicalBlock(scope: !7, file: !8, line: 9, column: 7)
!23 = !DILocation(line: 9, column: 7, scope: !7)
!24 = !DILocalVariable(name: "b", scope: !7, file: !8, line: 4, type: !11)
!25 = !DILocation(line: 11, column: 3, scope: !26)
!26 = distinct !DILexicalBlock(scope: !22, file: !8, line: 9, column: 11)
!27 = !DILocation(line: 0, scope: !22)
!28 = !DILocation(line: 14, column: 3, scope: !7)