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
|
// RUN: %target-sil-opt -enable-objc-interop -enforce-exclusivity=none -enable-sil-verify-all %s -sil-combine -sil-combine-disable-alloc-stack-opts | %FileCheck %s
// This file tests routines in SILCombinerMiscVisitors.cpp
sil_stage canonical
import Builtin
//////////////////
// Declarations //
//////////////////
class Klass {}
sil @nativeobject_guaranteed_use : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
///////////
// Tests //
///////////
// We test both the ossa and non-ossa variants.
//
// CHECK-LABEL: sil [ossa] @fix_lifetime_promotion_ossa : $@convention(thin) (@owned Klass) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: [[STACK:%.*]] = alloc_stack $Klass
// CHECK: store [[ARG]] to [init] [[STACK]]
// CHECK: [[BORROW:%.*]] = load_borrow [[STACK]]
// CHECK: fix_lifetime [[BORROW]]
// CHECK: end_borrow [[BORROW]]
// CHECK: destroy_addr [[STACK]]
// CHECK: dealloc_stack [[STACK]]
// CHECK: } // end sil function 'fix_lifetime_promotion_ossa'
sil [ossa] @fix_lifetime_promotion_ossa : $@convention(thin) (@owned Klass) -> () {
bb0(%0 : @owned $Klass):
%1 = alloc_stack $Klass
store %0 to [init] %1 : $*Klass
fix_lifetime %1 : $*Klass
destroy_addr %1 : $*Klass
dealloc_stack %1 : $*Klass
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil @fix_lifetime_promotion : $@convention(thin) (@owned Klass) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: [[STACK:%.*]] = alloc_stack $Klass
// CHECK: store [[ARG]] to [[STACK]]
// CHECK: [[BORROW:%.*]] = load [[STACK]]
// CHECK: fix_lifetime [[BORROW]]
// CHECK: destroy_addr [[STACK]]
// CHECK: dealloc_stack [[STACK]]
// CHECK: } // end sil function 'fix_lifetime_promotion'
sil @fix_lifetime_promotion : $@convention(thin) (@owned Klass) -> () {
bb0(%0 : $Klass):
%1 = alloc_stack $Klass
store %0 to %1 : $*Klass
fix_lifetime %1 : $*Klass
destroy_addr %1 : $*Klass
dealloc_stack %1 : $*Klass
%9999 = tuple()
return %9999 : $()
}
// We should have a single load [copy] here.
//
// CHECK-LABEL: sil [ossa] @remove_loadcopy_with_only_destroy_users : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> () {
// CHECK: load [copy]
// CHECK-NOT: load [copy]
// CHECK: } // end sil function 'remove_loadcopy_with_only_destroy_users'
sil [ossa] @remove_loadcopy_with_only_destroy_users : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> () {
bb0(%0 : $*Builtin.NativeObject):
%1 = load [copy] %0 : $*Builtin.NativeObject
destroy_value %1 : $Builtin.NativeObject
%2 = load [copy] %0 : $*Builtin.NativeObject
%f = function_ref @nativeobject_guaranteed_use : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
apply %f(%2) : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
destroy_value %2 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// We should have a single load_borrow here.
//
// CHECK-LABEL: sil [ossa] @remove_loadborrow_with_only_destroy_users : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> () {
// CHECK: load_borrow
// CHECK-NOT: load_borrow
// CHECK: } // end sil function 'remove_loadborrow_with_only_destroy_users'
sil [ossa] @remove_loadborrow_with_only_destroy_users : $@convention(thin) (@in_guaranteed Builtin.NativeObject) -> () {
bb0(%0 : $*Builtin.NativeObject):
%1 = load_borrow %0 : $*Builtin.NativeObject
end_borrow %1 : $Builtin.NativeObject
%2 = load_borrow %0 : $*Builtin.NativeObject
%f = function_ref @nativeobject_guaranteed_use : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
apply %f(%2) : $@convention(thin) (@guaranteed Builtin.NativeObject) -> ()
end_borrow %2 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
|