blob: eadc5ed488afe88913162082ca27a89254e89212 [file] [log] [blame]
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -Osize -enable-objc-interop -emit-ir %s | %FileCheck %s --check-prefix=OSIZE -DINT=i%target-ptrsize
// REQUIRES: CPU=x86_64
sil_stage canonical
import Builtin
struct S {}
class C {}
sil_vtable C {}
sil @_TFC12typemetadata1Cd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject
sil @_TFC12typemetadata1CD : $@convention(method) (@owned C) -> ()
sil @test0 : $@convention(thin) () -> () {
bb0:
%0 = metatype $@thin S.Type
%1 = metatype $@thick C.Type
%2 = metatype $@thick (S, C).Type
%100 = tuple ()
return %100 : $()
}
// CHECK-LABEL: define hidden swiftcc %swift.metadata_response @"$s12typemetadata1CCMa"
// CHECK-SAME: ([[INT]])
// CHECK: [[T0:%.*]] = load %swift.type*, %swift.type** @"$s12typemetadata1CCML", align 8
// CHECK-NEXT: [[T1:%.*]] = icmp eq %swift.type* [[T0]], null
// CHECK-NEXT: br i1 [[T1]]
// CHECK: [[T0:%.*]] = call %objc_class* @swift_getInitializedObjCClass({{.*}} @"$s12typemetadata1CCMf", {{.*}})
// CHECK-NEXT: [[T1:%.*]] = bitcast %objc_class* [[T0]] to %swift.type*
// CHECK: store atomic %swift.type* [[T1]], %swift.type** @"$s12typemetadata1CCML" release, align 8
// CHECK-NEXT: br label
// CHECK: [[RES:%.*]] = phi
// CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[RES]], 0
// CHECK-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], i64 0, 1
// CHECK-NEXT: ret %swift.metadata_response [[T1]]
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$s12typemetadata1SV_AA1CCtMa"
// CHECK-SAME: ([[INT]])
// CHECK: [[T0:%.*]] = load %swift.type*, %swift.type** @"$s12typemetadata1SV_AA1CCtML", align 8
// CHECK-NEXT: [[T1:%.*]] = icmp eq %swift.type* [[T0]], null
// CHECK-NEXT: br i1 [[T1]]
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s12typemetadata1CCMa"([[INT]] 255)
// CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK-NEXT: extractvalue %swift.metadata_response [[TMP]], 1
// CHECK-NEXT: [[T1:%.*]] = call swiftcc %swift.metadata_response @swift_getTupleTypeMetadata2([[INT]] %0, %swift.type* {{.*}} @"$s12typemetadata1SVMf", {{.*}} %swift.type* [[T0]], i8* null, i8** null)
// CHECK-NEXT: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T1]], 0
// CHECK-NEXT: [[STATE:%.*]] = extractvalue %swift.metadata_response [[T1]], 1
// CHECK-NEXT: [[T0:%.*]] = icmp eq [[INT]] [[STATE]], 0
// CHECK-NEXT: br i1 [[T0]],
// CHECK: store atomic %swift.type* [[METADATA]], %swift.type** @"$s12typemetadata1SV_AA1CCtML" release, align 8
// CHECK-NEXT: br label
// CHECK: [[RES:%.*]] = phi %swift.type*
// CHECK-NEXT: [[RES_STATE:%.*]] = phi [[INT]]
// CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[RES]], 0
// CHECK-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], [[INT]] [[RES_STATE]], 1
// CHECK-NEXT: ret %swift.metadata_response [[T1]]
// OSIZE: define hidden swiftcc %swift.metadata_response @"$s12typemetadata1CCMa"
// OSIZE-SAME: ([[INT]]) [[ATTR:#[0-9]+]] {
// OSIZE: [[ATTR]] = {{{.*}}noinline