|
| 1 | +// RUN: %target-sil-opt -opt-mode=none -silgen-cleanup -enable-ossa-complete-lifetimes -parse-incomplete-ossa -sil-verify-all %s | %FileCheck %s --check-prefix=CHECK |
| 2 | + |
| 3 | +import Builtin |
| 4 | + |
| 5 | +sil_stage raw |
| 6 | + |
| 7 | +typealias AnyObject = Builtin.AnyObject |
| 8 | + |
| 9 | +class Klass { |
| 10 | + var property: Builtin.Int64 |
| 11 | +} |
| 12 | +class SubKlass : Klass {} |
| 13 | + |
| 14 | +enum FakeOptional<T> { |
| 15 | +case none |
| 16 | +case some(T) |
| 17 | +} |
| 18 | + |
| 19 | +struct Int { |
| 20 | + var _value : Builtin.Int32 |
| 21 | +} |
| 22 | + |
| 23 | +struct UInt8 { |
| 24 | + var _value : Builtin.Int8 |
| 25 | +} |
| 26 | + |
| 27 | +protocol P : AnyObject {} |
| 28 | + |
| 29 | +// ============================================================================= |
| 30 | +// Test complete OSSA lifetimes |
| 31 | +// ============================================================================= |
| 32 | + |
| 33 | +sil @unreachableHandler : $@convention(thin) () -> () |
| 34 | + |
| 35 | +// CHECK-LABEL: sil [ossa] @testCompleteOSSALifetimes : $@convention(thin) (@owned FakeOptional<Klass>) -> () { |
| 36 | +// CHECK: [[BOX:%.*]] = alloc_box ${ var FakeOptional<Klass> }, var, name "c" |
| 37 | +// CHECK: [[BORROW:%.,*]] = begin_borrow [lexical] [[BOX]] : ${ var FakeOptional<Klass> } |
| 38 | +// CHECK: bb2: |
| 39 | +// CHECK: apply |
| 40 | +// CHECK: end_borrow [[BORROW]] : ${ var FakeOptional<Klass> } |
| 41 | +// CHECK: destroy_value [[BOX]] : ${ var FakeOptional<Klass> } |
| 42 | +// CHECK: unreachable |
| 43 | +sil [ossa] @testCompleteOSSALifetimes : $@convention(thin) (@owned FakeOptional<Klass>) -> () { |
| 44 | +bb0(%0 : @owned $FakeOptional<Klass>): |
| 45 | + %box = alloc_box ${ var FakeOptional<Klass> }, var, name "c" |
| 46 | + %borrow = begin_borrow [lexical] %box : ${ var FakeOptional<Klass> } |
| 47 | + %project = project_box %borrow : ${ var FakeOptional<Klass> }, 0 |
| 48 | + store %0 to [init] %project : $*FakeOptional<Klass> |
| 49 | + cond_br undef, bb1, bb4 |
| 50 | + |
| 51 | +bb1: |
| 52 | + %access = begin_access [read] [unknown] %project : $*FakeOptional<Klass> |
| 53 | + %val = load [copy] %access : $*FakeOptional<Klass> |
| 54 | + end_access %access : $*FakeOptional<Klass> |
| 55 | + switch_enum %val : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb3, case #FakeOptional.none!enumelt: bb2 |
| 56 | + |
| 57 | +bb2: |
| 58 | + %21 = function_ref @unreachableHandler : $@convention(thin) () -> () |
| 59 | + %22 = apply %21() : $@convention(thin) () -> () |
| 60 | + unreachable |
| 61 | + |
| 62 | +bb3(%24 : @owned $Klass): |
| 63 | + destroy_value %24 : $Klass |
| 64 | + br bb5 |
| 65 | + |
| 66 | +bb4: |
| 67 | + br bb5 |
| 68 | + |
| 69 | +bb5: |
| 70 | + end_borrow %borrow : ${ var FakeOptional<Klass> } |
| 71 | + destroy_value %box : ${ var FakeOptional<Klass> } |
| 72 | + %36 = tuple () |
| 73 | + return %36 : $() |
| 74 | +} |
| 75 | + |
| 76 | +// CHECK-LABEL: sil [ossa] @testExistentialLifetime : $@convention(thin) (@owned any P) -> @owned AnyObject { |
| 77 | +// CHECK-NOT: destroy |
| 78 | +sil [ossa] @testExistentialLifetime : $@convention(thin) (@owned any P) -> @owned AnyObject { |
| 79 | +bb0(%0 : @owned $any P): |
| 80 | + %1 = open_existential_ref %0 : $any P to $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self |
| 81 | + %2 = init_existential_ref %1 : $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self : $@opened("34B79428-2E49-11ED-901A-8AC134504E1C", any P) Self, $AnyObject |
| 82 | + return %2 : $AnyObject |
| 83 | +} |
0 commit comments