xref: /llvm-project/llvm/test/DebugInfo/X86/dbg-prolog-end.ll (revision b468ed494acde4d1cc496a436ab9109660db5b80)
1; RUN: llc -O0 < %s | FileCheck %s
2target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
3target triple = "x86_64-apple-macosx10.6.7"
4
5;CHECK-LABEL: foo:
6;CHECK: .loc	1 2 11 prologue_end
7define i32 @foo(i32 %i) nounwind ssp !dbg !1 {
8entry:
9  %i.addr = alloca i32, align 4
10  %j = alloca i32, align 4
11  store i32 %i, ptr %i.addr, align 4
12  call void @llvm.dbg.declare(metadata ptr %i.addr, metadata !7, metadata !DIExpression()), !dbg !8
13  call void @llvm.dbg.declare(metadata ptr %j, metadata !9, metadata !DIExpression()), !dbg !11
14  store i32 2, ptr %j, align 4, !dbg !12
15  %tmp = load i32, ptr %j, align 4, !dbg !13
16  %inc = add nsw i32 %tmp, 1, !dbg !13
17  store i32 %inc, ptr %j, align 4, !dbg !13
18  %tmp1 = load i32, ptr %j, align 4, !dbg !14
19  %tmp2 = load i32, ptr %i.addr, align 4, !dbg !14
20  %add = add nsw i32 %tmp1, %tmp2, !dbg !14
21  store i32 %add, ptr %j, align 4, !dbg !14
22  %tmp3 = load i32, ptr %j, align 4, !dbg !15
23  ret i32 %tmp3, !dbg !15
24}
25
26declare void @llvm.dbg.declare(metadata, metadata, metadata) nounwind readnone
27
28;CHECK-LABEL: main:
29;CHECK: .loc 1 8 2 prologue_end
30
31define i32 @main() nounwind ssp !dbg !6 {
32entry:
33  %retval = alloca i32, align 4
34  store i32 0, ptr %retval, !dbg !22
35  %call = call i32 @foo(i32 21), !dbg !16
36  ret i32 %call, !dbg !16
37}
38
39;; int foo(int arg) {
40;;   while (arg)
41;;    arg--;
42;;  return 0;
43;; }
44;;
45;; In this function, the entry block will fall through to while.cond, with no
46;; instructions having source-locations. The expectations at -O0 is that we'll
47;; put prologue_end on the first instruction of the loop, after %arg.addr is
48;; initialized.
49
50; CHECK:      _bar:
51; CHECK-NEXT: Lfunc_begin2:
52; CHECK-NEXT:     .loc    1 11 0 is_stmt 1
53; CHECK-NEXT:     .cfi_startproc
54; CHECK-NEXT: ## %bb.0:
55; CHECK-NEXT:     movl    %edi, -4(%rsp)
56; CHECK-NEXT: LBB2_1:
57; CHECK-NEXT:                  ## =>This Inner Loop Header: Depth=1
58; CHECK-NEXT: Ltmp4:
59; CHECK-NEXT:     .loc    1 12 3 prologue_end
60; CHECK-NEXT:     cmpl    $0, -4(%rsp)
61
62define dso_local i32 @bar(i32 noundef %arg) !dbg !30 {
63entry:
64  %arg.addr = alloca i32, align 4
65  store i32 %arg, ptr %arg.addr, align 4
66  br label %while.cond, !dbg !37
67
68while.cond:                                       ; preds = %while.body, %entry
69  %0 = load i32, ptr %arg.addr, align 4, !dbg !38
70  %tobool = icmp ne i32 %0, 0, !dbg !37
71  br i1 %tobool, label %while.body, label %while.end, !dbg !37
72
73while.body:                                       ; preds = %while.cond
74  %1 = load i32, ptr %arg.addr, align 4, !dbg !39
75  %dec = add nsw i32 %1, -1, !dbg !39
76  store i32 %dec, ptr %arg.addr, align 4, !dbg !39
77  br label %while.cond, !dbg !37
78
79while.end:                                        ; preds = %while.cond
80  ret i32 0, !dbg !42
81}
82
83!llvm.dbg.cu = !{!0}
84!llvm.module.flags = !{!21}
85!18 = !{!1, !6}
86
87!0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.0 (trunk 131100)", isOptimized: false, emissionKind: FullDebug, file: !19, enums: !20, retainedTypes: !20, imports:  null)
88!1 = distinct !DISubprogram(name: "foo", line: 1, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 1, file: !19, scope: !2, type: !3)
89!2 = !DIFile(filename: "/tmp/a.c", directory: "/private/tmp")
90!3 = !DISubroutineType(types: !4)
91!4 = !{!5}
92!5 = !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
93!6 = distinct !DISubprogram(name: "main", line: 7, isLocal: false, isDefinition: true, virtualIndex: 6, isOptimized: false, unit: !0, scopeLine: 7, file: !19, scope: !2, type: !3)
94!7 = !DILocalVariable(name: "i", line: 1, arg: 1, scope: !1, file: !2, type: !5)
95!8 = !DILocation(line: 1, column: 13, scope: !1)
96!9 = !DILocalVariable(name: "j", line: 2, scope: !10, file: !2, type: !5)
97!10 = distinct !DILexicalBlock(line: 1, column: 16, file: !19, scope: !1)
98!11 = !DILocation(line: 2, column: 6, scope: !10)
99!12 = !DILocation(line: 2, column: 11, scope: !10)
100!13 = !DILocation(line: 3, column: 2, scope: !10)
101!14 = !DILocation(line: 4, column: 2, scope: !10)
102!15 = !DILocation(line: 5, column: 2, scope: !10)
103!16 = !DILocation(line: 8, column: 2, scope: !17)
104!17 = distinct !DILexicalBlock(line: 7, column: 12, file: !19, scope: !6)
105!19 = !DIFile(filename: "/tmp/a.c", directory: "/private/tmp")
106!20 = !{}
107!21 = !{i32 1, !"Debug Info Version", i32 3}
108!22 = !DILocation(line: 0, column: 0, scope: !17)
109!30 = distinct !DISubprogram(name: "bar", scope: !2, file: !2, line: 10, type: !3, scopeLine: 11, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !34)
110!34 = !{}
111!36 = !DILocation(line: 11, column: 13, scope: !30)
112!37 = !DILocation(line: 12, column: 3, scope: !30)
113!38 = !DILocation(line: 12, column: 10, scope: !30)
114!39 = !DILocation(line: 13, column: 8, scope: !30)
115!42 = !DILocation(line: 14, column: 3, scope: !30)
116