| // RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize |
| |
| // REQUIRES: CPU=i386 || CPU=x86_64 |
| |
| // We have to claim this is raw SIL because there are critical edges from non |
| // cond_br instructions. |
| sil_stage raw |
| |
| import Builtin |
| import Swift |
| |
| protocol P { |
| func f() -> Self |
| } |
| |
| struct S { |
| var v: Int |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testUnconditional0( |
| sil @testUnconditional0 : $@convention(thin) (@in P) -> () { |
| bb0(%0 : $*P): |
| // CHECK: [[T0:%.*]] = alloca [[S:%.*]], align |
| // CHECK: [[T1:%.*]] = bitcast [[S]]* [[T0]] to [[OPAQUE:%swift.opaque]]* |
| // CHECK: [[T2:%.*]] = bitcast [[P:%.*]]* {{%.*}} to [[OPAQUE]]* |
| // CHECK: [[T3:%.*]] = call swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"([[INT]] 0) |
| // CHECK: [[T4:%.*]] = extractvalue %swift.metadata_response [[T3]], 0 |
| // CHECK: call i1 @swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], %swift.type* [[T4]], %swift.type* {{.*}}, [[INT]] 7) |
| %1 = alloc_stack $S |
| unconditional_checked_cast_addr P in %0 : $*P to S in %1 : $*S |
| destroy_addr %1 : $*S |
| dealloc_stack %1 : $*S |
| %2 = tuple () |
| return %2 : $() |
| } |
| |
| // CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"( |
| // CHECK: call %swift.type* @swift_getExistentialTypeMetadata( |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testUnconditional1( |
| sil @testUnconditional1 : $@convention(thin) (@in P) -> () { |
| bb0(%0 : $*P): |
| // CHECK: [[T0:%.*]] = alloca [[S:%.*]], align |
| // CHECK: [[T1:%.*]] = bitcast [[S]]* [[T0]] to [[OPAQUE:%swift.opaque]]* |
| // CHECK: [[T2:%.*]] = bitcast [[P:%.*]]* {{%.*}} to [[OPAQUE]]* |
| // CHECK: [[T3:%.*]] = call swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"([[INT]] 0) |
| // CHECK: [[T4:%.*]] = extractvalue %swift.metadata_response [[T3]], 0 |
| // CHECK: call i1 @swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], %swift.type* [[T4]], %swift.type* {{.*}}, [[INT]] 7) |
| %1 = alloc_stack $S |
| unconditional_checked_cast_addr P in %0 : $*P to S in %1 : $*S |
| destroy_addr %1 : $*S |
| dealloc_stack %1 : $*S |
| %2 = tuple () |
| return %2 : $() |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testConditional0( |
| sil @testConditional0 : $@convention(thin) (@in P) -> () { |
| bb0(%0 : $*P): |
| // CHECK: [[T0:%.*]] = alloca [[S:%.*]], align |
| // CHECK: [[T1:%.*]] = bitcast [[S]]* [[T0]] to [[OPAQUE:%swift.opaque]]* |
| // CHECK: [[T2:%.*]] = bitcast [[P:%.*]]* {{%.*}} to [[OPAQUE]]* |
| // CHECK: [[T3:%.*]] = call swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"([[INT]] 0) |
| // CHECK: [[T4:%.*]] = extractvalue %swift.metadata_response [[T3]], 0 |
| // CHECK: [[T5:%.*]] = call i1 @swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], %swift.type* [[T4]], %swift.type* {{.*}}, [[INT]] 6) |
| // CHECK: br i1 [[T5]], |
| %1 = alloc_stack $S |
| checked_cast_addr_br take_always P in %0 : $*P to S in %1 : $*S, bb1, bb2 |
| bb1: |
| br bb2 |
| bb2: |
| destroy_addr %1 : $*S |
| dealloc_stack %1 : $*S |
| %2 = tuple () |
| return %2 : $() |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testConditional1( |
| sil @testConditional1 : $@convention(thin) (@in P) -> () { |
| bb0(%0 : $*P): |
| // CHECK: [[T0:%.*]] = alloca [[S:%.*]], align |
| // CHECK: [[T1:%.*]] = bitcast [[S]]* [[T0]] to [[OPAQUE:%swift.opaque]]* |
| // CHECK: [[T2:%.*]] = bitcast [[P:%.*]]* {{%.*}} to [[OPAQUE]]* |
| // CHECK: [[T3:%.*]] = call swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"([[INT]] 0) |
| // CHECK: [[T4:%.*]] = extractvalue %swift.metadata_response [[T3]], 0 |
| // CHECK: [[T5:%.*]] = call i1 @swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], %swift.type* [[T4]], %swift.type* {{.*}}, [[INT]] 2) |
| // CHECK: br i1 [[T5]], |
| %1 = alloc_stack $S |
| checked_cast_addr_br take_on_success P in %0 : $*P to S in %1 : $*S, bb1, bb2 |
| bb1: |
| br bb2 |
| bb2: |
| destroy_addr %1 : $*S |
| dealloc_stack %1 : $*S |
| %2 = tuple () |
| return %2 : $() |
| } |
| |
| // CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testConditional2( |
| sil @testConditional2 : $@convention(thin) (@in P) -> () { |
| bb0(%0 : $*P): |
| // CHECK: [[T0:%.*]] = alloca [[S:%.*]], align |
| // CHECK: [[T1:%.*]] = bitcast [[S]]* [[T0]] to [[OPAQUE:%swift.opaque]]* |
| // CHECK: [[T2:%.*]] = bitcast [[P:%.*]]* {{%.*}} to [[OPAQUE]]* |
| // CHECK: [[T3:%.*]] = call swiftcc %swift.metadata_response @"$S12dynamic_cast1P_pMa"([[INT]] 0) |
| // CHECK: [[T4:%.*]] = extractvalue %swift.metadata_response [[T3]], 0 |
| // CHECK: [[T5:%.*]] = call i1 @swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], %swift.type* [[T4]], %swift.type* {{.*}}, [[INT]] 0) |
| // CHECK: br i1 [[T5]], |
| %1 = alloc_stack $S |
| checked_cast_addr_br copy_on_success P in %0 : $*P to S in %1 : $*S, bb1, bb2 |
| bb1: |
| br bb2 |
| bb2: |
| destroy_addr %1 : $*S |
| dealloc_stack %1 : $*S |
| %2 = tuple () |
| return %2 : $() |
| } |