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
|
// RUN: %target-sil-opt -sil-onone-debuginfo-canonicalizer -enable-sil-verify-all %s 2>&1 | %FileCheck %s
sil_stage canonical
import Builtin
struct Int64 {
var value: Builtin.Int64
}
class Klass {
var value: Int64
}
// Since we only take the last debug_value associated with a SILDebugVariable,
// we only should see someVar for debug_value %2.
//
// CHECK-LABEL: sil @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64 {
// CHECK: bb0([[ARG:%.*]] : $Klass):
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
// CHECK-NEXT: [[ADDR:%.*]] = ref_element_addr [[ARG]] : $Klass
// CHECK-NEXT: yield [[ADDR]] : $*Int64, resume bb1, unwind bb2
//
// CHECK: bb1:
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
// CHECK-NEXT: tuple
// CHECK-NEXT: return
//
// CHECK: bb2:
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]] : $Klass, let, name "someVar"
// CHECK-NEXT: unwind
// CHECK: } // end sil function 'yieldOnceCoroutine'
sil @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64 {
bb0(%0 : $Klass):
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "someVar"
%1 = ref_element_addr %0 : $Klass, #Klass.value
yield %1 : $*Int64, resume bb1, unwind bb2
bb1:
%9999 = tuple()
return %9999 : $()
bb2:
unwind
}
// CHECK-LABEL: sil @testSimple : $@convention(thin) (@guaranteed Klass) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: begin_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: end_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: } // end sil function 'testSimple'
sil @testSimple : $@convention(thin) (@guaranteed Klass) -> () {
bb0(%0 : $Klass):
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "arg"
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
(%3, %4) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
%9999 = tuple()
end_apply %4
return %9999 : $()
}
// CHECK-LABEL: sil @testDiamond : $@convention(thin) (@guaranteed Klass) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: begin_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK-NEXT: cond_br undef, [[BB_LHS:bb[0-9]+]], [[BB_RHS:bb[0-9]+]]
//
// CHECK: [[BB_LHS]]:
// CHECK: end_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK-NEXT: br [[BB_CONT:bb[0-9]+]]
//
// CHECK: [[BB_RHS]]:
// CHECK: abort_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: } // end sil function 'testDiamond'
sil @testDiamond : $@convention(thin) (@guaranteed Klass) -> () {
bb0(%0 : $Klass):
debug_value [moveable_value_debuginfo] %0 : $Klass, let, name "arg"
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
(%3, %token) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
cond_br undef, bb1, bb2
bb1:
end_apply %token
br bb3
bb2:
abort_apply %token
br bb3
bb3:
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @testUndefDiamond : $@convention(thin) (@guaranteed Klass) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: begin_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK-NEXT: cond_br undef, [[BB_LHS:bb[0-9]+]], [[BB_RHS:bb[0-9]+]]
//
// CHECK: [[BB_LHS]]:
// CHECK: end_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK-NEXT: br [[BB_CONT:bb[0-9]+]]
//
// CHECK: [[BB_RHS]]:
// CHECK-NEXT: debug_value [moveable_value_debuginfo] undef
// CHECK-NEXT: abort_apply
// CHECK-NEXT: debug_value [moveable_value_debuginfo] undef
// CHECK-NEXT: br [[BB_CONT]]
// CHECK: } // end sil function 'testUndefDiamond'
sil @testUndefDiamond : $@convention(thin) (@guaranteed Klass) -> () {
bb0(%0 : $Klass):
debug_value [moveable_value_debuginfo] %0 : $Klass, let, (name "arg", loc "debuginfo_canonicalizer.sil":121:3)
%f = function_ref @yieldOnceCoroutine : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
(%3, %token) = begin_apply %f(%0) : $@yield_once @convention(method) (@guaranteed Klass) -> @yields @inout Int64
cond_br undef, bb1, bb2
bb1:
end_apply %token
br bb3
bb2:
debug_value [moveable_value_debuginfo] undef : $Klass, let, (name "arg", loc "debuginfo_canonicalizer.sil":121:3)
abort_apply %token
br bb3
bb3:
%9999 = tuple()
return %9999 : $()
}
|