Files
swift-mirror/test/SILOptimizer/debuginfo_canonicalizer.sil
Michael Gottesman 4a309575d7 [sil] Rename [moved] flag on debug_value/alloc_stack to moveable_value_debuginfo.
This is in preparation for wiring up debug info support for noncopyable
values. Originally this flag name made sense since it was set when we performed
consume operator checking. Now I am going to use it for noncopyable types as
well. I think the new name uses_moveable_value_debuginfo actually describes what
the flag is supposed to do, tell IRGen that the value may be moved since it
needs to use moveable value debug info emission.
2023-03-19 15:38:42 -07:00

139 lines
4.7 KiB
Plaintext

// 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"
%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"
abort_apply %token
br bb3
bb3:
%9999 = tuple()
return %9999 : $()
}