1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
# RUN: llc %s -o - -mtriple=x86_64-unknown-unknown \
# RUN: -experimental-debug-variable-locations -run-pass=livedebugvalues\
# RUN: | FileCheck %s
#
# Test that a DBG_INSTR_REF that refers to a DBG_PHI, will be translated into a
# DBG_VALUE of the value read at that DBG_PHI. Same original code as
# phi-coalescing.mir.
#
--- |
; ModuleID = 'phi-coalescing.mir'
source_filename = "test.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define dso_local i32 @foo(i64 %bar, i64 %baz) !dbg !7 {
entry:
call void @llvm.dbg.value(metadata i64 %bar, metadata !12, metadata !DIExpression()), !dbg !13
call void @llvm.dbg.value(metadata i64 %baz, metadata !14, metadata !DIExpression()), !dbg !13
call void @ext(i64 %bar), !dbg !15
%add = add nsw i64 %bar, 12, !dbg !16
call void @llvm.dbg.value(metadata i64 %add, metadata !12, metadata !DIExpression()), !dbg !13
call void @ext(i64 %add), !dbg !17
%call = call i64 @getlong(), !dbg !18
%tobool = icmp ne i64 %call, 0, !dbg !18
br i1 %tobool, label %if.then, label %if.end, !dbg !20
if.then: ; preds = %entry
%add1 = add nsw i64 %add, 1, !dbg !21
call void @llvm.dbg.value(metadata i64 %add1, metadata !12, metadata !DIExpression()), !dbg !13
br label %if.end, !dbg !22
if.end: ; preds = %if.then, %entry
%bar.addr.0 = phi i64 [ %add1, %if.then ], [ %add, %entry ], !dbg !13
call void @llvm.dbg.value(metadata i64 %bar.addr.0, metadata !12, metadata !DIExpression()), !dbg !13
%add2 = add nsw i64 %bar.addr.0, %baz, !dbg !23
call void @llvm.dbg.value(metadata i64 %add2, metadata !12, metadata !DIExpression()), !dbg !13
call void @ext(i64 %add2), !dbg !24
%conv = trunc i64 %add2 to i32, !dbg !25
ret i32 %conv, !dbg !26
}
; Function Attrs: nounwind readnone speculatable willreturn
declare void @llvm.dbg.declare(metadata, metadata, metadata)
declare dso_local void @ext(i64)
declare dso_local i64 @getlong()
; 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}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "test.c", directory: "/tmp/out.c")
!2 = !{}
!3 = !{i32 7, !"Dwarf Version", i32 4}
!4 = !{i32 2, !"Debug Info Version", i32 3}
!5 = !{i32 1, !"wchar_size", i32 4}
!6 = !{!""}
!7 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !8, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
!8 = !DISubroutineType(types: !9)
!9 = !{!10, !11, !11}
!10 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!11 = !DIBasicType(name: "long int", size: 64, encoding: DW_ATE_signed)
!12 = !DILocalVariable(name: "bar", arg: 1, scope: !7, file: !1, line: 3, type: !11)
!13 = !DILocation(line: 0, scope: !7)
!14 = !DILocalVariable(name: "baz", arg: 2, scope: !7, file: !1, line: 3, type: !11)
!15 = !DILocation(line: 4, column: 3, scope: !7)
!16 = !DILocation(line: 5, column: 7, scope: !7)
!17 = !DILocation(line: 6, column: 3, scope: !7)
!18 = !DILocation(line: 8, column: 7, scope: !19)
!19 = distinct !DILexicalBlock(scope: !7, file: !1, line: 8, column: 7)
!20 = !DILocation(line: 8, column: 7, scope: !7)
!21 = !DILocation(line: 9, column: 9, scope: !19)
!22 = !DILocation(line: 9, column: 5, scope: !19)
!23 = !DILocation(line: 11, column: 7, scope: !7)
!24 = !DILocation(line: 12, column: 3, scope: !7)
!25 = !DILocation(line: 13, column: 10, scope: !7)
!26 = !DILocation(line: 13, column: 3, scope: !7)
...
---
name: foo
alignment: 16
tracksRegLiveness: true
liveins:
- { reg: '$rdi' }
- { reg: '$rsi' }
frameInfo:
stackSize: 24
offsetAdjustment: -24
maxAlignment: 1
adjustsStack: true
hasCalls: true
maxCallFrameSize: 0
cvBytesOfCalleeSavedRegisters: 16
fixedStack:
- { id: 0, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '$rbx' }
- { id: 1, type: spill-slot, offset: -16, size: 8, alignment: 16, callee-saved-register: '$r14' }
machineFunctionInfo: {}
body: |
bb.0.entry:
liveins: $rdi, $rsi, $r14, $rbx
frame-setup PUSH64r killed $r14, implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 16
frame-setup PUSH64r killed $rbx, implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 24
frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 32
CFI_INSTRUCTION offset $rbx, -24
CFI_INSTRUCTION offset $r14, -16
$r14 = MOV64rr $rsi
$rbx = MOV64rr $rdi
CALL64pcrel32 @ext, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, debug-location !15
renamable $rbx = ADD64ri32 killed renamable $rbx, 12, implicit-def $eflags, debug-location !16
$rdi = MOV64rr $rbx, debug-location !17
CALL64pcrel32 @ext, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, debug-location !17
CALL64pcrel32 @getlong, csr_64, implicit $rsp, implicit $ssp, implicit-def $rax, debug-location !18
CMP64ri8 killed renamable $rax, 0, implicit-def $eflags, debug-location !18
JCC_1 %bb.2, 4, implicit $eflags, debug-location !20
bb.1.if.then:
liveins: $rbx, $r14
renamable $rbx = ADD64ri32 killed renamable $rbx, 1, implicit-def $eflags, debug-location !21
bb.2.if.end:
liveins: $rbx, $r14
DBG_PHI $rbx, 1
$rax = COPY $rbx
$rbx = MOV64ri 0
DBG_INSTR_REF 1, 0, !12, !DIExpression(), debug-location !13
; This sequence should mark the contents of rbx on block entry as being the
; value for the variable at this DBG_INSTR_REF. We've force it to be in
; $rax now, so we should see a DBG_VALUE for rax:
; CHECK: DBG_PHI $rbx, 1
; CHECK-NEXT: $rax = COPY $rbx
; CHECK-NEXT: $rbx = MOV64ri 0
; CHECK-NEXT: DBG_INSTR_REF 1, 0
; CHECK-NEXT: DBG_VALUE $rax, $noreg
$rbx = COPY $rax
renamable $rbx = ADD64rr killed renamable $rbx, killed renamable $r14, implicit-def $eflags, debug-location !23
DBG_VALUE $rbx, $noreg, !12, !DIExpression(), debug-location !13
$rdi = MOV64rr $rbx, debug-location !24
CALL64pcrel32 @ext, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, debug-location !24
$eax = MOV32rr $ebx, implicit killed $rbx, debug-location !26
$rsp = frame-destroy ADD64ri8 $rsp, 8, implicit-def dead $eflags, debug-location !26
CFI_INSTRUCTION def_cfa_offset 24, debug-location !26
$rbx = frame-destroy POP64r implicit-def $rsp, implicit $rsp, debug-location !26
CFI_INSTRUCTION def_cfa_offset 16, debug-location !26
$r14 = frame-destroy POP64r implicit-def $rsp, implicit $rsp, debug-location !26
CFI_INSTRUCTION def_cfa_offset 8, debug-location !26
RET64 implicit $eax, debug-location !26
...
|