| // RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -DINT=i%target-ptrsize -check-prefix CHECK -check-prefix CHECK-%target-import-type |
| // 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-DIRECT: [[T0:%.*]] = load %swift.type*, %swift.type** @"$s12typemetadata1CCML", align 8 |
| // CHECK-INDIRECT: [[T0:%.*]] = load %swift.type*, %swift.type** getelementptr inbounds ({ %swift.type*, i8* }, { %swift.type*, i8* }* @"$s12typemetadata1CCMl", i32 0, i32 0), align 8 |
| // CHECK-NEXT: [[T1:%.*]] = icmp eq %swift.type* [[T0]], null |
| // CHECK-NEXT: br i1 [[T1]] |
| |
| // CHECK-DIRECT: [[T0:%.*]] = call %objc_class* @swift_getInitializedObjCClass({{.*}} @"$s12typemetadata1CCMf", {{.*}}) |
| // CHECK-DIRECT-NEXT: [[T1:%.*]] = bitcast %objc_class* [[T0]] to %swift.type* |
| // CHECK-DIRECT: store atomic %swift.type* [[T1]], %swift.type** @"$s12typemetadata1CCML" release, align 8 |
| // CHECK-DIRECT-NEXT: br label |
| |
| // CHECK-INDIRECT: [[T0:%.*]] = call swiftcc %swift.metadata_response |
| // @swift_getSingletonMetdata([[INT]] %0, %swift.type_descriptor* bitcast (<{ {{.*}} }>* @"$s12typemetadata1CCMn" to %swift.type_descriptor*)) |
| // CHECK-INDIRECT-NEXT: [[T1:%.*]] = extractvalue %swift.metadata_response [[T0]], 0 |
| // CHECK-INDIRECT-NEXT: [[T2:%.*]] = extractvalue %swift.metadata_response [[T0]], 1 |
| // CHECK-INDIRECT-NEXT: br label |
| |
| // CHECK: [[RES:%.*]] = phi |
| // CHECK-INDIRECT: [[T2:%.*]] = phi [[INT]] |
| // CHECK-NEXT: [[T0:%.*]] = insertvalue %swift.metadata_response undef, %swift.type* [[RES]], 0 |
| // CHECK-DIRECT-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], i64 0, 1 |
| // CHECK-INDIRECT-NEXT: [[T1:%.*]] = insertvalue %swift.metadata_response [[T0]], i64 [[T2]], 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 |
| |