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