summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorMikael Holmen <mikael.holmen@ericsson.com>2018-06-21 07:02:46 +0000
committerMikael Holmen <mikael.holmen@ericsson.com>2018-06-21 07:02:46 +0000
commit57b33f6aac852d6f8d154d574b05b7689afc8e2b (patch)
tree727ba14af974501aee0c6922bc9fe7ec8c39f6bc /llvm/test
parent76df3d61a394d06549264b22e3015fcc52201a6f (diff)
downloadbcm5719-llvm-57b33f6aac852d6f8d154d574b05b7689afc8e2b.tar.gz
bcm5719-llvm-57b33f6aac852d6f8d154d574b05b7689afc8e2b.zip
[DebugInfo] Keep DBG_VALUE undef in LiveDebugVariables
Summary: Fixes PR36579. For cases where we had e.g. DBG_VALUE 42 [...] DBG_VALUE undef LiveDebugVariables would discard all undef DBG_VALUEs and then it would look like the variable had the value 42 throughout the rest of the function, which is incorrect. With this patch we don't remove all undef DBG_VALUEs in LiveDebugVariables so they will be kept after register allocation just like other DBG_VALUEs which will yield more correct debug information. Reviewers: aprantl Reviewed By: aprantl Subscribers: bjope, Ka-Ka, JDevlieghere, llvm-commits Differential Revision: https://reviews.llvm.org/D48277 llvm-svn: 335205
Diffstat (limited to 'llvm/test')
-rw-r--r--llvm/test/DebugInfo/X86/live-debug-vars-discard-invalid.mir12
-rw-r--r--llvm/test/DebugInfo/X86/live-debug-vars-keep-undef.ll65
2 files changed, 68 insertions, 9 deletions
diff --git a/llvm/test/DebugInfo/X86/live-debug-vars-discard-invalid.mir b/llvm/test/DebugInfo/X86/live-debug-vars-discard-invalid.mir
index 77a11fc21a4..c6d743171a5 100644
--- a/llvm/test/DebugInfo/X86/live-debug-vars-discard-invalid.mir
+++ b/llvm/test/DebugInfo/X86/live-debug-vars-discard-invalid.mir
@@ -106,17 +106,11 @@ body: |
# CHECK-LABEL: name: foobar
# CHECK-LABEL: bb.1:
-## After solving https://bugs.llvm.org/show_bug.cgi?id=36579 we expect to get a
-## DBG_VALUE debug-use $noreg
-## here.
-# CHECK-NOT: DBG_VALUE
+# CHECK: DBG_VALUE debug-use $noreg
# CHECK-LABEL: bb.2:
-## After solving https://bugs.llvm.org/show_bug.cgi?id=36579 we expect to get a
-## DBG_VALUE debug-use $noreg
-## here.
-# CHECK-NOT: DBG_VALUE
-# CHECK: dead renamable $rcx = IMPLICIT_DEF
+# CHECK: DBG_VALUE debug-use $noreg
+# CHECK-NEXT: dead renamable $rcx = IMPLICIT_DEF
# CHECK-NEXT: dead renamable $rcx = IMPLICIT_DEF
# CHECK-NEXT: dead renamable $rcx = IMPLICIT_DEF
# CHECK-NEXT: dead renamable $rcx = IMPLICIT_DEF
diff --git a/llvm/test/DebugInfo/X86/live-debug-vars-keep-undef.ll b/llvm/test/DebugInfo/X86/live-debug-vars-keep-undef.ll
new file mode 100644
index 00000000000..85909983730
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/live-debug-vars-keep-undef.ll
@@ -0,0 +1,65 @@
+; RUN: llc -O1 -o - %s | FileCheck %s
+
+; Check that dbg.value(undef) calls are not simply discarded.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @foo() !dbg !7 {
+entry:
+ call void @llvm.dbg.value(metadata i32 42, metadata !11, metadata !DIExpression()), !dbg !13
+ call void (...) @bar(), !dbg !14
+ call void @llvm.dbg.value(metadata i32 undef, metadata !11, metadata !DIExpression()), !dbg !13
+ call void (...) @bar(), !dbg !15
+ ret void, !dbg !16
+}
+
+declare void @bar(...)
+
+; Function Attrs: nounwind readnone speculatable
+declare void @llvm.dbg.value(metadata, metadata, metadata) #0
+
+attributes #0 = { nounwind readnone speculatable }
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4, !5}
+!llvm.ident = !{!6}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 7.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "test.c", directory: "/tmp")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{i32 1, !"wchar_size", i32 4}
+!6 = !{!"clang version 7.0.0"}
+!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, retainedNodes: !10)
+!8 = !DISubroutineType(types: !9)
+!9 = !{null}
+!10 = !{!11}
+!11 = !DILocalVariable(name: "x", scope: !7, file: !1, line: 4, type: !12)
+!12 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!13 = !DILocation(line: 4, column: 7, scope: !7)
+!14 = !DILocation(line: 5, column: 3, scope: !7)
+!15 = !DILocation(line: 7, column: 3, scope: !7)
+!16 = !DILocation(line: 8, column: 1, scope: !7)
+
+; Original C program:
+; void bar();
+;
+; void foo() {
+; int x = 42;
+; bar();
+; x = 23;
+; bar();
+; }
+;
+; Then the dbg.value for the x = 23 setting has been replaced with dbg.value(undef)
+; in this ll file to provoke the wanted behavior in LiveDebugVariables.
+
+; Variable 'x' should thus be updated two times, first to 42 and then to undef.
+
+; CHECK-LABEL: foo:
+; CHECK: #DEBUG_VALUE: foo:x <- 42
+; CHECK: callq bar
+; CHECK: #DEBUG_VALUE: foo:x <- undef
+; CHECK: callq bar
OpenPOWER on IntegriCloud