|
1 |
| -// RUN: %target-sil-opt -sil-print-types -opt-mode=none -enable-sil-verify-all %s -compute-side-effects -destroy-addr-hoisting | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEB --check-prefix=CHECK-DEB |
2 |
| -// RUN: %target-sil-opt -sil-print-types -opt-mode=speed -enable-sil-verify-all %s -compute-side-effects -destroy-addr-hoisting | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECKOPT --check-prefix=CHECK-OPT |
| 1 | +// RUN: %target-sil-opt -sil-print-types -enable-experimental-feature LifetimeDependence -opt-mode=none -enable-sil-verify-all %s -compute-side-effects -destroy-addr-hoisting | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECKDEB --check-prefix=CHECK-DEB |
| 2 | +// RUN: %target-sil-opt -sil-print-types -enable-experimental-feature LifetimeDependence -opt-mode=speed -enable-sil-verify-all %s -compute-side-effects -destroy-addr-hoisting | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECKOPT --check-prefix=CHECK-OPT |
3 | 3 | //
|
4 | 4 | // TODO: migrate the remaining tests from destroy_hoisting.sil.
|
5 | 5 |
|
6 | 6 | // REQUIRES: swift_in_compiler
|
| 7 | +// REQUIRES: swift_feature_LifetimeDependence |
7 | 8 |
|
8 | 9 | sil_stage canonical
|
9 | 10 |
|
@@ -1224,3 +1225,58 @@ bb0(%0 : @owned $Nontrivial):
|
1224 | 1225 | %14 = tuple ()
|
1225 | 1226 | return %14 : $()
|
1226 | 1227 | }
|
| 1228 | + |
| 1229 | +struct Regular { |
| 1230 | + var storage: Builtin.NativeObject |
| 1231 | +} |
| 1232 | +struct NEGutless: ~Escapable { |
| 1233 | + let ptr: UnsafeRawPointer? |
| 1234 | +} |
| 1235 | +struct NEMarker : ~Escapable {} |
| 1236 | +struct NEAggregate: ~Escapable { |
| 1237 | + var ne: NEGutless |
| 1238 | + let regular: Regular |
| 1239 | + |
| 1240 | + @lifetime(copy ne) init(ne: NEMarker) |
| 1241 | +} |
| 1242 | + |
| 1243 | +// CHECK-LABEL: sil [ossa] @no_destructure_nonescapable : {{.*}} { |
| 1244 | +// CHECK: bb0([[AGGREGATE:%[^,]+]] : |
| 1245 | +// CHECK: destroy_addr [[AGGREGATE]] |
| 1246 | +// CHECK-LABEL: } // end sil function 'no_destructure_nonescapable' |
| 1247 | +sil [ossa] @no_destructure_nonescapable : $@convention(method) (@in NEAggregate) -> () { |
| 1248 | +bb0(%aggregate : $*NEAggregate): |
| 1249 | + %regular = struct_element_addr %aggregate, #NEAggregate.regular |
| 1250 | + %regular_copy = alloc_stack $Regular |
| 1251 | + copy_addr %regular to [init] %regular_copy |
| 1252 | + destroy_addr %regular_copy |
| 1253 | + dealloc_stack %regular_copy |
| 1254 | + destroy_addr %aggregate |
| 1255 | + %retval = tuple () |
| 1256 | + return %retval |
| 1257 | +} |
| 1258 | + |
| 1259 | +struct NCGutless: ~Copyable { |
| 1260 | + let ptr: UnsafeRawPointer? |
| 1261 | +} |
| 1262 | +struct NCAggregate: ~Copyable { |
| 1263 | + var ne: NCGutless |
| 1264 | + let regular: Regular |
| 1265 | + deinit {} |
| 1266 | +} |
| 1267 | + |
| 1268 | +// CHECK-LABEL: sil [ossa] @no_destructure_noncopyable : {{.*}} { |
| 1269 | +// CHECK: bb0([[AGGREGATE:%[^,]+]] : |
| 1270 | +// CHECK: destroy_addr [[AGGREGATE]] |
| 1271 | +// CHECK-LABEL: } // end sil function 'no_destructure_noncopyable' |
| 1272 | +sil [ossa] @no_destructure_noncopyable : $@convention(method) (@in NCAggregate) -> () { |
| 1273 | +bb0(%aggregate : $*NCAggregate): |
| 1274 | + %regular = struct_element_addr %aggregate, #NCAggregate.regular |
| 1275 | + %regular_copy = alloc_stack $Regular |
| 1276 | + copy_addr %regular to [init] %regular_copy |
| 1277 | + destroy_addr %regular_copy |
| 1278 | + dealloc_stack %regular_copy |
| 1279 | + destroy_addr %aggregate |
| 1280 | + %retval = tuple () |
| 1281 | + return %retval |
| 1282 | +} |
0 commit comments