mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
132 lines
5.1 KiB
Plaintext
132 lines
5.1 KiB
Plaintext
// RUN: %target-swift-frontend -assume-parsing-unqualified-ownership-sil -emit-ir %s | %FileCheck %s
|
|
|
|
// REQUIRES: CPU=i386_or_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: [[INT:%TSi]] = type <{ [[LLVM_PTRSIZE_INT:i(32|64)]] }>
|
|
|
|
// CHECK-LABEL: define{{( 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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 7)
|
|
%1 = alloc_stack $S
|
|
unconditional_checked_cast_addr take_always 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 %swift.type* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: call %swift.type* @swift_rt_swift_getExistentialTypeMetadata(
|
|
|
|
// CHECK-LABEL: define{{( 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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 3)
|
|
%1 = alloc_stack $S
|
|
unconditional_checked_cast_addr take_on_success P in %0 : $*P to S in %1 : $*S
|
|
destroy_addr %1 : $*S
|
|
dealloc_stack %1 : $*S
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( protected)?}} swiftcc void @testUnconditional2(
|
|
sil @testUnconditional2 : $@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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 1)
|
|
%1 = alloc_stack $S
|
|
unconditional_checked_cast_addr copy_on_success P in %0 : $*P to S in %1 : $*S
|
|
destroy_addr %1 : $*S
|
|
dealloc_stack %1 : $*S
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( 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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: [[T4:%.*]] = call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 6)
|
|
// CHECK: br i1 [[T4]],
|
|
%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{{( 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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: [[T4:%.*]] = call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 2)
|
|
// CHECK: br i1 [[T4]],
|
|
%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{{( 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 [[TYPE:%.*]]* @_T012dynamic_cast1P_pMa()
|
|
// CHECK: [[T4:%.*]] = call i1 @swift_rt_swift_dynamicCast([[OPAQUE]]* [[T1]], [[OPAQUE]]* [[T2]], [[TYPE]]* [[T3]], [[TYPE]]* {{.*}}, [[LLVM_PTRSIZE_INT]] 0)
|
|
// CHECK: br i1 [[T4]],
|
|
%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 : $()
|
|
}
|