blob: 18b31bce8cfdad0de70ffc320004031460f2ee2d [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all -sil-epilogue-arc-dumper %s | %FileCheck %s
import Builtin
import Swift
/////////////////////
// Data Structures //
/////////////////////
class foo {
var a: Int
deinit
init()
}
// CHECK-LABEL: START: single_release_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_release [[IN1]] : $foo
// CHECK: FINISH: single_release_foo
sil @single_release_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
strong_release %0 : $foo
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: multiblock_release_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_release [[IN1]] : $foo
// CHECK: strong_release [[IN1]] : $foo
// CHECK: FINISH: multiblock_release_foo
sil @multiblock_release_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
cond_br undef, bb1, bb2
bb1:
strong_release %0 : $foo
br bb3
bb2:
strong_release %0 : $foo
br bb3
bb3:
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: partial_multiblock_release_foo
// CHECK: FINISH: partial_multiblock_release_foo
sil @partial_multiblock_release_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
cond_br undef, bb1, bb2
bb1:
br bb3
bb2:
strong_release %0 : $foo
br bb3
bb3:
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: loop_multiblock_release_foo
// CHECK: FINISH: loop_multiblock_release_foo
sil @loop_multiblock_release_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
br bb1
bb1:
strong_release %0 : $foo
cond_br undef, bb1, bb2
bb2:
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: empty_loop_multiblock_release_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_release [[IN1]] : $foo
// CHECK: FINISH: empty_loop_multiblock_release_foo
sil @empty_loop_multiblock_release_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
strong_release %0 : $foo
br bb1
bb1:
cond_br undef, bb1, bb2
bb2:
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: uniqueness_check_release_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: FINISH: uniqueness_check_release_foo
sil @uniqueness_check_release_foo : $@convention(thin) (@owned foo, @inout foo) -> () {
bb0(%0 : $foo, %1 : $*foo):
strong_release %0 : $foo
is_unique %1 : $*foo
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: single_retain_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_retain [[IN1]] : $foo
// CHECK: FINISH: single_retain_foo
sil @single_retain_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
strong_retain %0 : $foo
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: blocked_retain_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: FINISH: blocked_retain_foo
sil @blocked_retain_foo : $@convention(thin) (@owned foo, @inout foo) -> () {
bb0(%0 : $foo, %1 : $*foo):
strong_retain %0 : $foo
%2 = load %1 : $*foo
strong_release %2 : $foo
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: multibb_retain_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_retain [[IN1]] : $foo
// CHECK: strong_retain [[IN1]] : $foo
// CHECK: FINISH: multibb_retain_foo
sil @multibb_retain_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
cond_br undef, bb1, bb2
bb1:
strong_retain %0 : $foo
br bb3
bb2:
strong_retain %0 : $foo
br bb3
bb3:
%3 = tuple ()
return %3 : $()
}
// Make sure only 1 retain is found in this case.
//
// CHECK-LABEL: START: multibb_dominating_retain_foo
// CHECK: [[IN1:%.*]] = argument of bb0 : $foo
// CHECK: strong_retain [[IN1]] : $foo
// CHECK: FINISH: multibb_dominating_retain_foo
sil @multibb_dominating_retain_foo : $@convention(thin) (@owned foo) -> () {
bb0(%0 : $foo):
cond_br undef, bb1, bb2
bb1:
strong_retain %0 : $foo
br bb3
bb2:
strong_retain %0 : $foo
br bb3
bb3:
strong_retain %0 : $foo
%3 = tuple ()
return %3 : $()
}
// CHECK-LABEL: START: epilogue_retains_in_diamond_top_and_left_split_block
// CHECK: apply
// CHECK: FINISH: epilogue_retains_in_diamond_top_and_left_split_block
sil @epilogue_retains_in_diamond_top_and_left_split_block : $@convention(thin) (@owned foo) -> @owned foo {
bb0(%0 : $foo):
cond_br undef, bb1, bb2
bb1:
strong_retain %0 : $foo
br bb3(%0 : $foo)
bb2:
%5 = function_ref @epilogue_retains_in_diamond_top_and_left_split_block : $@convention(thin) (@owned foo) -> @owned foo
%6 = apply %5(%0) : $@convention(thin) (@owned foo) -> @owned foo
br bb3( %6 : $foo)
bb3(%3 : $foo):
return %0 : $foo
}