| // RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s |
| |
| // REQUIRES: CPU=x86_64 |
| // XFAIL: linux |
| |
| 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 %swift.type* @_TMaC12typemetadata1C() |
| // CHECK: [[T0:%.*]] = load %swift.type*, %swift.type** @_TMLC12typemetadata1C, align 8 |
| // CHECK-NEXT: [[T1:%.*]] = icmp eq %swift.type* [[T0]], null |
| // CHECK-NEXT: br i1 [[T1]] |
| // CHECK: [[T0:%.*]] = call %objc_class* @rt_swift_getInitializedObjCClass({{.*}} @_TMfC12typemetadata1C, {{.*}}) |
| // CHECK-NEXT: [[T1:%.*]] = bitcast %objc_class* [[T0]] to %swift.type* |
| // CHECK: store atomic %swift.type* [[T1]], %swift.type** @_TMLC12typemetadata1C release, align 8 |
| // CHECK-NEXT: br label |
| // CHECK: [[RES:%.*]] = phi |
| // CHECK-NEXT: ret %swift.type* [[RES]] |
| |
| // CHECK-LABEL: define linkonce_odr hidden %swift.type* @_TMaTV12typemetadata1SCS_1C_() |
| // CHECK: [[T0:%.*]] = load %swift.type*, %swift.type** @_TMLTV12typemetadata1SCS_1C_, align 8 |
| // CHECK-NEXT: [[T1:%.*]] = icmp eq %swift.type* [[T0]], null |
| // CHECK-NEXT: br i1 [[T1]] |
| // CHECK: [[T0:%.*]] = call %swift.type* @_TMaC12typemetadata1C() |
| // CHECK-NEXT: [[T1:%.*]] = call %swift.type* @swift_getTupleTypeMetadata2(%swift.type* {{.*}} @_TMfV12typemetadata1S, {{.*}} %swift.type* [[T0]], i8* null, i8** null) |
| // CHECK-NEXT: store atomic %swift.type* [[T1]], %swift.type** @_TMLTV12typemetadata1SCS_1C_ release, align 8 |
| // CHECK-NEXT: br label |
| // CHECK: [[RES:%.*]] = phi |
| // CHECK-NEXT: ret %swift.type* [[RES]] |
| |