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
|
# We do not support the call site info for the target now, so we use the experimental option (-emit-call-site-info -debug-entry-values).
# RUN: llc -emit-call-site-info -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s
# RUN: llc -emit-call-site-info -debug-entry-values -force-instr-ref-livedebugvalues=1 -run-pass=livedebugvalues -o - %s | FileCheck %s
# Verify that the entry values for the input parameters are inserted after the
# bundles which contains the registers' clobbering instructions (the calls to
# @clobber). Previously the insertions would thrash the bundles, later on
# triggering a crash in DebugHandlerBase.
--- |
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
target triple = "hexagon"
; Function Attrs: nounwind
define i32 @foo(i32 %arg) !dbg !12 {
entry:
call void @llvm.dbg.value(metadata i32 %arg, metadata !16, metadata !DIExpression()), !dbg !17
%call = tail call i32 @clobber(), !dbg !18
ret i32 1, !dbg !19
}
declare !dbg !4 i32 @clobber()
; Function Attrs: nounwind
define i32 @bar(i32 %b) !dbg !20 {
entry:
call void @llvm.dbg.value(metadata i32 %b, metadata !22, metadata !DIExpression()), !dbg !23
%tobool = icmp eq i32 %b, 0, !dbg !24
br i1 %tobool, label %land.end, label %land.rhs, !dbg !24
land.rhs: ; preds = %entry
%call = tail call i32 @clobber(), !dbg !25
br label %land.end
land.end: ; preds = %entry, %land.rhs
ret i32 undef, !dbg !27
}
; 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 = !{!8, !9, !10}
!llvm.ident = !{!11}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
!1 = !DIFile(filename: "foo.c", directory: "/")
!2 = !{}
!3 = !{!4}
!4 = !DISubprogram(name: "clobber", scope: !1, file: !1, line: 1, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{!7}
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!8 = !{i32 2, !"Dwarf Version", i32 4}
!9 = !{i32 2, !"Debug Info Version", i32 3}
!10 = !{i32 1, !"wchar_size", i32 4}
!11 = !{!"clang version 10.0.0"}
!12 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !13, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15)
!13 = !DISubroutineType(types: !14)
!14 = !{!7, !7}
!15 = !{!16}
!16 = !DILocalVariable(name: "arg", arg: 1, scope: !12, file: !1, line: 3, type: !7)
!17 = !DILocation(line: 0, scope: !12)
!18 = !DILocation(line: 4, scope: !12)
!19 = !DILocation(line: 5, scope: !12)
!20 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 8, type: !13, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !21)
!21 = !{!22}
!22 = !DILocalVariable(name: "arg", arg: 1, scope: !20, file: !1, line: 8, type: !7)
!23 = !DILocation(line: 0, scope: !20)
!24 = !DILocation(line: 9, scope: !20)
!25 = !DILocation(line: 9, scope: !26)
!26 = distinct !DILexicalBlock(scope: !20, file: !1, line: 9)
!27 = !DILocation(line: 10, scope: !20)
...
---
name: foo
tracksRegLiveness: true
body: |
bb.0.entry:
DBG_VALUE $r0, $noreg, !16, !DIExpression(), debug-location !17
CFI_INSTRUCTION def_cfa $r30, 8
CFI_INSTRUCTION offset $r31, -4
CFI_INSTRUCTION offset $r30, -8
BUNDLE implicit-def $r29, implicit-def $r30, implicit-def dead $pc, implicit-def dead $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 {
$r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 :: (store (s32) into stack)
J2_call @clobber, hexagoncsr, implicit-def dead $pc, implicit-def dead $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !18
}
BUNDLE implicit-def dead $r0, implicit-def $d15, implicit-def $r30, implicit-def $r31, implicit-def $pc, implicit-def $r29, implicit killed $r30, implicit killed $framekey, debug-location !19 {
$r0 = A2_tfrsi 1, debug-location !19
$d15 = L4_return killed $r30, implicit-def $pc, implicit-def $r29, implicit killed $framekey, implicit-def dead $pc, implicit internal killed $r0, debug-location !19
}
...
# CHECK-LABEL: name: foo
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !16, !DIExpression(DW_OP_LLVM_entry_value, 1)
---
name: bar
tracksRegLiveness: true
liveins:
- { reg: '$r0' }
body: |
bb.0.entry:
successors: %bb.1
liveins: $r0
DBG_VALUE $r0, $noreg, !22, !DIExpression(), debug-location !23
BUNDLE implicit-def dead $p0, implicit-def $pc, implicit killed $r0, implicit killed $r31, debug-location !24 {
renamable $p0 = C2_cmpeqi killed renamable $r0, 0, debug-location !24
PS_jmprettnew internal killed $p0, killed $r31, implicit-def $pc, implicit-def $pc, implicit killed undef $r0, debug-location !27
}
bb.1.land.rhs:
CFI_INSTRUCTION def_cfa $r30, 8
CFI_INSTRUCTION offset $r31, -4
CFI_INSTRUCTION offset $r30, -8
BUNDLE implicit-def $r29, implicit-def $r30, implicit-def $pc, implicit-def $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 {
$r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 :: (store (s32) into stack)
J2_call @clobber, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !25
}
$d15 = L2_deallocframe killed $r30, implicit-def $r29, implicit killed $framekey
PS_jmpret killed $r31, implicit-def $pc, implicit killed undef $r0, debug-location !27
...
# CHECK-LABEL: name: bar
# CHECK: BUNDLE
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !22, !DIExpression(DW_OP_LLVM_entry_value, 1)
|