aboutsummaryrefslogtreecommitdiff
path: root/test/DebugInfo
diff options
context:
space:
mode:
Diffstat (limited to 'test/DebugInfo')
-rw-r--r--test/DebugInfo/Generic/simplifycfg_sink_last_inst.ll70
-rw-r--r--test/DebugInfo/X86/dbg-value-frame-index.ll39
2 files changed, 109 insertions, 0 deletions
diff --git a/test/DebugInfo/Generic/simplifycfg_sink_last_inst.ll b/test/DebugInfo/Generic/simplifycfg_sink_last_inst.ll
new file mode 100644
index 000000000000..a62def35acc5
--- /dev/null
+++ b/test/DebugInfo/Generic/simplifycfg_sink_last_inst.ll
@@ -0,0 +1,70 @@
+; RUN: opt -simplifycfg -S < %s | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; Simplify CFG will try to sink the last instruction in a series of basic
+; blocks, creating a "common" instruction in the successor block. If the
+; debug locations of the commoned instructions have different file/line
+; numbers the debug location of the common instruction should not be set.
+
+; Generated from source:
+
+; extern int foo(void);
+; extern int bar(void);
+;
+; int test(int a, int b) {
+; if(a)
+; b -= foo();
+; else
+; b -= bar();
+; return b;
+; }
+
+; CHECK: define i32 @test
+; CHECK-LABEL: if.end:
+; CHECK: %[[PHI:.*]] = phi i32 [ %call1, %if.else ], [ %call, %if.then ]
+; CHECK: sub nsw i32 %b, %[[PHI]]
+; CHECK-NOT: !dbg
+; CHECK: ret i32
+
+define i32 @test(i32 %a, i32 %b) !dbg !6 {
+entry:
+ %tobool = icmp ne i32 %a, 0, !dbg !8
+ br i1 %tobool, label %if.then, label %if.else, !dbg !8
+
+if.then: ; preds = %entry
+ %call = call i32 @foo(), !dbg !9
+ %sub = sub nsw i32 %b, %call, !dbg !10
+ br label %if.end, !dbg !11
+
+if.else: ; preds = %entry
+ %call1 = call i32 @bar(), !dbg !12
+ %sub2 = sub nsw i32 %b, %call1, !dbg !13
+ br label %if.end
+
+if.end: ; preds = %if.else, %if.then
+ %b.addr.0 = phi i32 [ %sub, %if.then ], [ %sub2, %if.else ]
+ ret i32 %b.addr.0, !dbg !14
+}
+
+declare i32 @foo()
+declare i32 @bar()
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "", isOptimized: false, runtimeVersion: 0, emissionKind: LineTablesOnly, enums: !2)
+!1 = !DIFile(filename: "test.c", directory: "")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!6 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 8, type: !7, isLocal: false, isDefinition: true, scopeLine: 8, flags: DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)
+!7 = !DISubroutineType(types: !2)
+!8 = !DILocation(line: 9, column: 6, scope: !6)
+!9 = !DILocation(line: 10, column: 10, scope: !6)
+!10 = !DILocation(line: 10, column: 7, scope: !6)
+!11 = !DILocation(line: 10, column: 5, scope: !6)
+!12 = !DILocation(line: 12, column: 10, scope: !6)
+!13 = !DILocation(line: 12, column: 7, scope: !6)
+!14 = !DILocation(line: 13, column: 3, scope: !6)
diff --git a/test/DebugInfo/X86/dbg-value-frame-index.ll b/test/DebugInfo/X86/dbg-value-frame-index.ll
new file mode 100644
index 000000000000..7b49aacfaefd
--- /dev/null
+++ b/test/DebugInfo/X86/dbg-value-frame-index.ll
@@ -0,0 +1,39 @@
+; RUN: llc -mtriple=x86_64-unknown-unknown -o - %s | FileCheck %s
+
+define i1 @test() !dbg !4 {
+entry:
+ %end = alloca i64, align 8
+ br label %while.cond
+
+while.cond:
+ call void @llvm.dbg.value(metadata i64* %end, i64 0, metadata !5, metadata !6), !dbg !7
+ %call = call i1 @fn(i64* %end, i64* %end, i64* null, i8* null, i64 0, i64* null, i32* null, i8* null), !dbg !7
+ br label %while.body
+
+while.body:
+ br i1 0, label %while.end, label %while.cond
+
+while.end:
+ ret i1 true
+}
+
+; CHECK-LABEL: test
+; CHECK: #DEBUG_VALUE: test:w <- [%RSP+8]
+
+declare i1 @fn(i64*, i64*, i64*, i8*, i64, i64*, i32*, i8*)
+declare void @llvm.dbg.value(metadata, i64, metadata, metadata)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2,!3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 4.0.0", emissionKind: FullDebug)
+!1 = !DIFile(filename: "test.c", directory: "/")
+!2 = !{i32 2, !"Dwarf Version", i32 4}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "test", type: !10, unit: !0)
+!5 = !DILocalVariable(name: "w", scope: !4, type: !9)
+!6 = !DIExpression(DW_OP_deref)
+!7 = !DILocation(line: 210, column: 12, scope: !4)
+!8 = !{!9}
+!9 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean)
+!10 = !DISubroutineType(types: !8)