blob: 7dc2e6d1d7fa8470fdc99e9885a8bbf0e49d8d9b [file] [log] [blame]
// RUN: %target-sil-opt -guaranteed-arc-opts %s | %FileCheck %s
sil_stage raw
import Builtin
sil @kraken : $@convention(thin) () -> ()
// CHECK-LABEL: sil @retainvalue_test1 : $@convention(thin) (Builtin.NativeObject, Builtin.NativeObject) -> () {
// CHECK: bb0([[ARG1:%.*]] : $Builtin.NativeObject, [[ARG2:%.*]] : $Builtin.NativeObject):
// CHECK-NOT: retain_value [[ARG1]]
// CHECK: retain_value [[ARG2]]
// CHECK-NOT: release_value [[ARG1]]
sil @retainvalue_test1 : $@convention(thin) (Builtin.NativeObject, Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject):
retain_value %0 : $Builtin.NativeObject
retain_value %1 : $Builtin.NativeObject
release_value %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @retainvalue_test2 : $@convention(thin) (Builtin.NativeObject, @in Builtin.Int32) -> () {
// CHECK-NOT: retain_value
// CHECK-NOT: release_value
sil @retainvalue_test2 : $@convention(thin) (Builtin.NativeObject, @in Builtin.Int32) -> () {
bb0(%0 : $Builtin.NativeObject, %1 : $*Builtin.Int32):
retain_value %0 : $Builtin.NativeObject
%2 = integer_literal $Builtin.Int32, 0
store %2 to %1 : $*Builtin.Int32
release_value %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @retainvalue_test3 : $@convention(thin) (Builtin.NativeObject) -> () {
// CHECK: retain_value
// CHECK: release_value
sil @retainvalue_test3 : $@convention(thin) (Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
retain_value %0 : $Builtin.NativeObject
%1 = function_ref @kraken : $@convention(thin) () -> ()
apply %1() : $@convention(thin) () -> ()
release_value %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @retainvalue_test4 : $@convention(thin) (Builtin.NativeObject) -> () {
// CHECK: release_value
sil @retainvalue_test4 : $@convention(thin) (Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
release_value %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @strongretain_test1 : $@convention(thin) (Builtin.NativeObject, Builtin.NativeObject) -> () {
// CHECK: bb0([[ARG1:%.*]] : $Builtin.NativeObject, [[ARG2:%.*]] : $Builtin.NativeObject):
// CHECK-NOT: strong_retain [[ARG1]]
// CHECK: strong_retain [[ARG2]]
// CHECK-NOT: strong_release [[ARG1]]
sil @strongretain_test1 : $@convention(thin) (Builtin.NativeObject, Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject, %1 : $Builtin.NativeObject):
strong_retain %0 : $Builtin.NativeObject
strong_retain %1 : $Builtin.NativeObject
strong_release %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @strongretain_test2 : $@convention(thin) (Builtin.NativeObject, @in Builtin.Int32) -> () {
// CHECK-NOT: strong_retain
// CHECK-NOT: strong_release
sil @strongretain_test2 : $@convention(thin) (Builtin.NativeObject, @in Builtin.Int32) -> () {
bb0(%0 : $Builtin.NativeObject, %1 : $*Builtin.Int32):
strong_retain %0 : $Builtin.NativeObject
%2 = integer_literal $Builtin.Int32, 0
store %2 to %1 : $*Builtin.Int32
strong_release %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @strongretain_test3 : $@convention(thin) (Builtin.NativeObject) -> () {
// CHECK: strong_retain
// CHECK: strong_release
sil @strongretain_test3 : $@convention(thin) (Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
strong_retain %0 : $Builtin.NativeObject
%1 = function_ref @kraken : $@convention(thin) () -> ()
apply %1() : $@convention(thin) () -> ()
strong_release %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @strongretain_test4 : $@convention(thin) (Builtin.NativeObject) -> () {
// CHECK: strong_release
sil @strongretain_test4 : $@convention(thin) (Builtin.NativeObject) -> () {
bb0(%0 : $Builtin.NativeObject):
strong_release %0 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @copyaddr_test1 : $@convention(thin) (@in Builtin.NativeObject) -> @out Builtin.NativeObject {
// CHECK: bb0([[ARG1:%.*]] : $*Builtin.NativeObject, [[ARG2:%.*]] : $*Builtin.NativeObject):
// CHECK: copy_addr [take] {{%.*}} to {{%.*}}
// CHECK-NOT: destroy_addr [[ARG1]]
sil @copyaddr_test1 : $@convention(thin) (@in Builtin.NativeObject) -> @out Builtin.NativeObject {
bb0(%0 : $*Builtin.NativeObject, %1 : $*Builtin.NativeObject):
copy_addr %1 to %0 : $*Builtin.NativeObject
destroy_addr %1 : $*Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @copyaddr_test2 : $@convention(thin) (@in Builtin.NativeObject) -> @out Builtin.NativeObject {
// CHECK: copy_addr
// CHECK: destroy_addr
sil @copyaddr_test2 : $@convention(thin) (@in Builtin.NativeObject) -> @out Builtin.NativeObject {
bb0(%0 : $*Builtin.NativeObject, %1 : $*Builtin.NativeObject):
copy_addr %1 to %0 : $*Builtin.NativeObject
%2 = function_ref @kraken : $@convention(thin) () -> ()
apply %2() : $@convention(thin) () -> ()
destroy_addr %1 : $*Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @copyaddr_test3 : $@convention(thin) (@in Builtin.NativeObject) -> () {
// CHECK: destroy_addr
sil @copyaddr_test3 : $@convention(thin) (@in Builtin.NativeObject) -> () {
bb0(%0 : $*Builtin.NativeObject):
destroy_addr %0 : $*Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
class C {
var val: Builtin.Int32
init(i: Builtin.Int32)
deinit
}
// CHECK-LABEL: sil @access_test : $@convention(thin) (@owned C, Builtin.Int32) -> ()
// CHECK-NOT: strong_retain
// CHECK-NOT: strong_release
sil @access_test : $@convention(thin) (@owned C, Builtin.Int32) -> () {
bb0(%0 : $C, %1 : $Builtin.Int32):
strong_retain %0 : $C
%valadr = ref_element_addr %0 : $C, #C.val
%access = begin_access [modify] [dynamic] %valadr : $*Builtin.Int32
store %1 to %access : $*Builtin.Int32
end_access %access : $*Builtin.Int32
strong_release %0 : $C
%9999 = tuple()
return %9999 : $()
}