Fix some more tests

This commit is contained in:
Arnold Schwaighofer
2023-06-23 09:20:22 -07:00
parent 83ccdbb5d3
commit fc766a39d3
123 changed files with 2852 additions and 3730 deletions

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-sil %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -parse-sil %s -emit-ir
// RUN: %target-swift-frontend -parse-sil %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
sil_stage canonical
@@ -74,9 +73,9 @@ sil_witness_table hidden DifferentiableConformance: DifferentiableRequirement mo
method #DifferentiableRequirement.f!vjp.SU.<Self where Self : DifferentiableRequirement>: <Self where Self : DifferentiableRequirement> (Self) -> (Float) -> Float : @AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_vjp_SU // AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_vjp_SU
}
// CHECK: @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementAAWP" = hidden constant [4 x i8*] [
// CHECK-SAME: i8* bitcast (%swift.protocol_conformance_descriptor* @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementAAMc" to i8*),
// CHECK-SAME: i8* bitcast (float (float, %T41witness_table_differentiable_requirements25DifferentiableConformanceV*, %swift.type*, i8**)* @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW" to i8*),
// CHECK-SAME: i8* bitcast ({ float, i8*, %swift.refcounted* } (float, %T41witness_table_differentiable_requirements25DifferentiableConformanceV*, %swift.type*, i8**)* @"AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_jvp_SU" to i8*),
// CHECK-SAME: i8* bitcast ({ float, i8*, %swift.refcounted* } (float, %T41witness_table_differentiable_requirements25DifferentiableConformanceV*, %swift.type*, i8**)* @"AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_vjp_SU" to i8*)
// CHECK: @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementAAWP" = hidden constant [4 x ptr] [
// CHECK-SAME: ptr @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementAAMc",
// CHECK-SAME: ptr @"$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW",
// CHECK-SAME: ptr @"AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_jvp_SU",
// CHECK-SAME: ptr @"AD__$s41witness_table_differentiable_requirements25DifferentiableConformanceVAA0E11RequirementA2aDP1fyS2fFTW_vjp_SU"
// CHECK-SAME: ]

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -module-name=cgtest -emit-ir -O %s | %FileCheck %s
// RUN: %target-swift-frontend -module-name=cgtest -emit-ir -O %s
// RUN: %target-swift-frontend -module-name=cgtest -emit-ir -O %s | %FileCheck %s
// Test some imported CG APIs
import CoreGraphics
@@ -26,8 +25,8 @@ public func testEnums(_ model: CGColorSpaceModel) -> Int {
default: return -1
}
// CHECK: [[GEP:%.+]] = getelementptr inbounds [8 x i64], [8 x i64]* [[SWITCHTABLE]], i64 0, i64 %{{.*}}
// CHECK: [[LOAD:%.+]] = load i64, i64* [[GEP]], align 8
// CHECK: [[GEP:%.+]] = getelementptr inbounds [8 x i64], ptr [[SWITCHTABLE]], i64 0, i64 %{{.*}}
// CHECK: [[LOAD:%.+]] = load i64, ptr [[GEP]], align 8
// CHECK: [[PHI:%.*]] = phi i64 [ [[LOAD]], %{{.*}} ], [ -1, %{{.*}} ]
// CHECK: ret i64 [[PHI]]
}
@@ -41,9 +40,9 @@ public func rotationAround(offset: CGPoint, angle: CGFloat,
.rotated(by: angle)
.translatedBy(x: -offset.x, y: -offset.y)
// CHECK: call void @CGAffineTransformTranslate(%{{.*}}.CGAffineTransform* {{.*}}, %{{.*}}.CGAffineTransform* {{.*}},{{.*}}, {{.*}})
// CHECK: call void @CGAffineTransformRotate(%{{.*}}.CGAffineTransform* {{.*}}, %{{.*}}.CGAffineTransform* {{.*}},{{.*}})
// CHECK: call void @CGAffineTransformTranslate(%{{.*}}.CGAffineTransform* {{.*}}, %{{.*}}.CGAffineTransform* {{.*}},{{.*}}, {{.*}})
// CHECK: call void @CGAffineTransformTranslate(ptr {{.*}}, ptr {{.*}},{{.*}}, {{.*}})
// CHECK: call void @CGAffineTransformRotate(ptr {{.*}}, ptr {{.*}},{{.*}})
// CHECK: call void @CGAffineTransformTranslate(ptr {{.*}}, ptr {{.*}},{{.*}}, {{.*}})
//
// CHECK: ret void
}
@@ -56,12 +55,12 @@ public func trace(in context: CGContext, path: CGPath) {
context.setStrokeColor(red)
context.strokePath()
context.restoreGState()
// CHECK: call %{{.*}}.CGColor* @CGColorCreateGenericRGB(double 1.000000e+00, double 0.000000e+00, double 0.000000e+00, double 1.000000e+00)
// CHECK: call void @CGContextSaveGState(%{{.*}}.CGContext* %{{.*}})
// CHECK: call void @CGContextAddPath(%{{.*}}.CGContext* %{{.*}}, %{{.*}}.CGPath* %{{.*}})
// CHECK: call void @CGContextSetStrokeColorWithColor(%{{.*}}.CGContext* %{{.*}}, %{{.*}}.CGColor* %{{.*}})
// CHECK: call void @CGContextStrokePath(%{{.*}}.CGContext* %{{.*}})
// CHECK: call void @CGContextRestoreGState(%{{.*}}.CGContext* %{{.*}})
// CHECK: call ptr @CGColorCreateGenericRGB(double 1.000000e+00, double 0.000000e+00, double 0.000000e+00, double 1.000000e+00)
// CHECK: call void @CGContextSaveGState(ptr %{{.*}})
// CHECK: call void @CGContextAddPath(ptr %{{.*}}, ptr %{{.*}})
// CHECK: call void @CGContextSetStrokeColorWithColor(ptr %{{.*}}, ptr %{{.*}})
// CHECK: call void @CGContextStrokePath(ptr %{{.*}})
// CHECK: call void @CGContextRestoreGState(ptr %{{.*}})
//
// CHECK: ret void
}
@@ -71,9 +70,9 @@ public func pdfOperations(_ context: CGContext) {
context.beginPDFPage(nil)
context.endPDFPage()
context.closePDF()
// CHECK: call void @CGPDFContextBeginPage(%{{.*}}.CGContext* %{{.*}}, %{{.*}}.__CFDictionary* {{.*}})
// CHECK: call void @CGPDFContextEndPage(%{{.*}}.CGContext* %{{.*}})
// CHECK: call void @CGPDFContextClose(%{{.*}}.CGContext* %{{.*}})
// CHECK: call void @CGPDFContextBeginPage(ptr %{{.*}}, ptr {{.*}})
// CHECK: call void @CGPDFContextEndPage(ptr %{{.*}})
// CHECK: call void @CGPDFContextClose(ptr %{{.*}})
//
// CHECK: ret void
}
@@ -85,11 +84,11 @@ public func pdfOperations(_ context: CGContext) {
public func testColorRenames(color: CGColor,
intent: CGColorRenderingIntent) {
let colorSpace = CGColorSpace(name: CGColorSpace.sRGB)!
// CHECK: %{{.*}} = load {{.*}}%struct.__CFString** @kCGColorSpaceSRGB{{.*}}, align 8
// CHECK: %{{.*}} = {{.*}} call %struct.CGColorSpace* @CGColorSpaceCreateWithName(%struct.__CFString* %{{.*}})
// CHECK: %{{.*}} = load {{.*}}ptr @kCGColorSpaceSRGB{{.*}}, align 8
// CHECK: %{{.*}} = {{.*}} call ptr @CGColorSpaceCreateWithName(ptr %{{.*}})
let _ = color.converted(to: colorSpace, intent: intent, options: nil)
// CHECK: %{{.*}} = {{.*}} call %struct.CGColor* @CGColorCreateCopyByMatchingToColorSpace(%struct.CGColorSpace* nonnull %{{.*}}, i32 %{{.*}}, %struct.CGColor* %{{.*}}, %struct.__CFDictionary* null)
// CHECK: %{{.*}} = {{.*}} call ptr @CGColorCreateCopyByMatchingToColorSpace(ptr nonnull %{{.*}}, i32 %{{.*}}, ptr %{{.*}}, ptr null)
//
// CHECK: ret void
}
@@ -100,29 +99,29 @@ public func testRenames(transform: CGAffineTransform, context: CGContext,
image: CGImage,
edge: CGRectEdge) {
let transform = transform.inverted().concatenating(transform)
// CHECK: call void @CGAffineTransformInvert(%struct.CGAffineTransform* {{.*}}, %struct.CGAffineTransform* {{.*}})
// CHECK: call void @CGAffineTransformConcat(%struct.CGAffineTransform* {{.*}}, %struct.CGAffineTransform* {{.*}}, %struct.CGAffineTransform* {{.*}})
// CHECK: call void @CGAffineTransformInvert(ptr {{.*}}, ptr {{.*}})
// CHECK: call void @CGAffineTransformConcat(ptr {{.*}}, ptr {{.*}}, ptr {{.*}})
blackHole(point.applying(transform))
var rect = rect.applying(transform)
blackHole(size.applying(transform))
// CHECK: %{{.*}} = {{(tail )?}}call { double, double } @CGPointApplyAffineTransform(double %{{.*}}, double %{{.*}}, %struct.CGAffineTransform* {{.*}})
// CHECK: call void @CGRectApplyAffineTransform(%struct.CGRect* {{.*}}, %struct.CGRect* {{.*}}, %struct.CGAffineTransform* {{.*}})
// CHECK: %{{.*}} = {{(tail )?}}call { double, double } @CGSizeApplyAffineTransform(double %{{.*}}, double %{{.*}}, %struct.CGAffineTransform* {{.*}})
// CHECK: %{{.*}} = {{(tail )?}}call { double, double } @CGPointApplyAffineTransform(double %{{.*}}, double %{{.*}}, ptr {{.*}})
// CHECK: call void @CGRectApplyAffineTransform(ptr {{.*}}, ptr {{.*}}, ptr {{.*}})
// CHECK: %{{.*}} = {{(tail )?}}call { double, double } @CGSizeApplyAffineTransform(double %{{.*}}, double %{{.*}}, ptr {{.*}})
context.concatenate(transform)
context.rotate(by: CGFloat.pi)
context.scaleBy(x: 1.0, y: 1.0)
context.translateBy(x: 1.0, y: 1.0)
// CHECK: call void @CGContextConcatCTM(%struct.CGContext* [[CONTEXT:%[0-9]+]], %struct.CGAffineTransform* {{.*}})
// CHECK: call void @CGContextRotateCTM(%struct.CGContext* [[CONTEXT]], double {{.*}})
// CHECK: call void @CGContextScaleCTM(%struct.CGContext* [[CONTEXT]], double {{1\.0+.*}}, double {{1\.0+.*}})
// CHECK: call void @CGContextTranslateCTM(%struct.CGContext* [[CONTEXT]], double {{1\.0+.*}}, double {{1\.0+.*}})
// CHECK: call void @CGContextConcatCTM(ptr [[CONTEXT:%[0-9]+]], ptr {{.*}})
// CHECK: call void @CGContextRotateCTM(ptr [[CONTEXT]], double {{.*}})
// CHECK: call void @CGContextScaleCTM(ptr [[CONTEXT]], double {{1\.0+.*}}, double {{1\.0+.*}})
// CHECK: call void @CGContextTranslateCTM(ptr [[CONTEXT]], double {{1\.0+.*}}, double {{1\.0+.*}})
context.clip(to: rect)
context.clip(to: rect, mask: image)
// CHECK: call void @CGContextClipToRect(%struct.CGContext* [[CONTEXT]], %struct.CGRect* nonnull byval({{.*}}) align 8 %{{.*}})
// CHECK: call void @CGContextClipToMask(%struct.CGContext* [[CONTEXT]], %struct.CGRect* nonnull byval({{.*}}) align 8 %{{.*}}, %struct.CGImage* %{{.*}})
// CHECK: call void @CGContextClipToRect(ptr [[CONTEXT]], ptr nonnull byval({{.*}}) align 8 %{{.*}})
// CHECK: call void @CGContextClipToMask(ptr [[CONTEXT]], ptr nonnull byval({{.*}}) align 8 %{{.*}}, ptr %{{.*}})
var slice = CGRect.zero
var remainder = CGRect.zero
@@ -130,7 +129,7 @@ public func testRenames(transform: CGAffineTransform, context: CGContext,
from: edge)
assert((slice, remainder) == rect.divided(atDistance: CGFloat(2.0),
from: edge))
// CHECK: call void @CGRectDivide(%struct.CGRect* nonnull byval({{.*}}) align 8 %{{.*}}, %struct.CGRect* nonnull %{{.*}}, %struct.CGRect* nonnull %{{.*}}, double {{2\.0+.*}}, i32 %{{.*}})
// CHECK: call void @CGRectDivide(ptr nonnull byval({{.*}}) align 8 %{{.*}}, ptr nonnull %{{.*}}, ptr nonnull %{{.*}}, double {{2\.0+.*}}, i32 %{{.*}})
//
// CHECK: ret void
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -module-name A -emit-ir -g -o - | %FileCheck %s
// RUN: %target-swift-frontend %s -module-name A -emit-ir -g -o -
// RUN: %target-swift-frontend %s -module-name A -emit-ir -g -o - | %FileCheck %s
// REQUIRES: CPU=x86_64
public struct Continuation<A> {
@@ -14,7 +13,7 @@ public struct Continuation<A> {
public typealias ContinuationU = Continuation<()>
// CHECK: %2 = alloca %T1A12ContinuationV, align 8
// CHECK-NEXT: call void @llvm.dbg.declare(metadata %T1A12ContinuationV* %2,
// CHECK-NEXT: call void @llvm.dbg.declare(metadata ptr %2,
// CHECK-SAME: metadata ![[X:.*]], metadata !DIExpression())
// CHECK: ![[X]] = !DILocalVariable(name: "x",

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend %s %use_no_opaque_pointers -emit-ir -g -o - | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir -g -o - | %FileCheck %s
// RUN: %target-swift-frontend %s -S -g -o - | %FileCheck %s --check-prefix ASM-CHECK
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -33,8 +33,7 @@ func main(_ x: Int64) -> Void
{
var result = my_class.do_something(x)
markUsed(result)
// CHECK: call {{.*}} @swift_release {{.*}}
// CHECK: bitcast
// CHECK: call {{.*}} @swift_release
// CHECK: llvm.lifetime.end
// CHECK: call {{.*}}llvm.lifetime.end{{.*}}, !dbg ![[CLOSURE_END:.*]]
// CHECK-NEXT: ret void, !dbg ![[CLOSURE_END]]

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend-emit-module -emit-module-path %t/FakeDistributedActorSystems.swiftmodule -module-name FakeDistributedActorSystems -disable-availability-checking %S/Inputs/FakeDistributedActorSystems.swift
// RUN: %target-swift-frontend %use_no_opaque_pointers -emit-irgen -module-name distributed_actor_accessors -disable-availability-checking -I %t 2>&1 %s | %IRGenFileCheck %s
// RUN: %target-swift-frontend -emit-irgen -module-name distributed_actor_accessors -disable-availability-checking -I %t 2>&1 %s
// RUN: %target-swift-frontend -emit-irgen -module-name distributed_actor_accessors -disable-availability-checking -I %t 2>&1 %s | %IRGenFileCheck %s
// UNSUPPORTED: back_deploy_concurrency
// REQUIRES: concurrency
@@ -93,52 +92,52 @@ public distributed actor MyOtherActor {
/// -> `MyActor.simple1`
// CHECK: @"$s27distributed_actor_accessors7MyActorC7simple1yySiYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic Si___________pIetMHygzo_ 27distributed_actor_accessors7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC7simple1yySiYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC7simple1yySiYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.simple2`
// CHECK: @"$s27distributed_actor_accessors7MyActorC7simple2ySSSiYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic Si_____SS______pIetMHygozo_ 27distributed_actor_accessors7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC7simple2ySSSiYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC7simple2ySSSiYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.simple3`
// CHECK: @"$s27distributed_actor_accessors7MyActorC7simple3ySiSSYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic SS_____Si______pIetMHggdzo_ 27distributed_actor_accessors7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC7simple3ySiSSYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC7simple3ySiSSYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.single_case_enum`
// CHECK: @"$s27distributed_actor_accessors7MyActorC16single_case_enumyAA7SimpleEOAFYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic __________AA______pIetMHygdzo_ 27distributed_actor_accessors7SimpleEO AA7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC16single_case_enumyAA7SimpleEOAFYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC16single_case_enumyAA7SimpleEOAFYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.with_indirect_enums`
// CHECK: @"$s27distributed_actor_accessors7MyActorC19with_indirect_enumsyAA9IndirectEOAF_SitYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic _____Si_____AA______pIetMHgygozo_ 27distributed_actor_accessors9IndirectEO AA7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC19with_indirect_enumsyAA9IndirectEOAF_SitYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC19with_indirect_enumsyAA9IndirectEOAF_SitYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.complex`
// CHECK: @"$s27distributed_actor_accessors7MyActorC7complexyAA11LargeStructVSaySiG_AA3ObjCSSSgAFtYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic SaySiG_____SSSg__________AD______pIetMHgggngrzo_ 27distributed_actor_accessors3ObjC AA11LargeStructV AA7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC7complexyAA11LargeStructVSaySiG_AA3ObjCSSSgAFtYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC7complexyAA11LargeStructVSaySiG_AA3ObjCSSSgAFtYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyActor.generic`
// CHECK: @"$s27distributed_actor_accessors7MyActorC7genericyyxYaKSeRzSERzlFTEHF" = private constant
// CHECK-SAME: @"symbolic x___________pSeRzSERzlIetMHngzo_ 27distributed_actor_accessors7MyActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors7MyActorC7genericyyxYaKSeRzSERzlFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors7MyActorC7genericyyxYaKSeRzSERzlFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
/// -> `MyOtherActor.empty`
// CHECK: @"$s27distributed_actor_accessors12MyOtherActorC5emptyyyYaKFTEHF" = private constant
// CHECK-SAME: @"symbolic ___________pIetMHgzo_ 27distributed_actor_accessors12MyOtherActorC s5ErrorP"
// CHECK-SAME: (%swift.async_func_pointer* @"$s27distributed_actor_accessors12MyOtherActorC5emptyyyYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: (ptr @"$s27distributed_actor_accessors12MyOtherActorC5emptyyyYaKFTETFTu" to i{{32|64}})
// CHECK-SAME: , section "swift5_accessible_functions", {{.*}}
// CHECK: @llvm.compiler.used = appending global [{{.*}} x i8*] [
// CHECK: @llvm.compiler.used = appending global [{{.*}} x ptr] [
// CHECK-SAME: @"$s27distributed_actor_accessors7MyActorC7simple1yySiYaKFTEHF"
// CHECK-SAME: @"$s27distributed_actor_accessors7MyActorC7simple2ySSSiYaKFTEHF"
// CHECK-SAME: @"$s27distributed_actor_accessors7MyActorC7simple3ySiSSYaKFTEHF"

View File

@@ -1,5 +1,4 @@
// RUN: %swiftc_driver %use_no_opaque_pointers -emit-ir %s -o - -Xfrontend -disable-implicit-concurrency-module-import -Xfrontend -disable-implicit-string-processing-module-import | %FileCheck %s -check-prefix ELF
// RUN: %swiftc_driver -emit-ir %s -o - -Xfrontend -disable-implicit-concurrency-module-import -Xfrontend -disable-implicit-string-processing-module-import
// RUN: %swiftc_driver -emit-ir %s -o - -Xfrontend -disable-implicit-concurrency-module-import -Xfrontend -disable-implicit-string-processing-module-import | %FileCheck %s -check-prefix ELF
// Check that the swift auto link section is available in the object file.
// RUN: %swiftc_driver -c %s -o %t -Xfrontend -disable-implicit-concurrency-module-import
@@ -13,7 +12,7 @@
print("Hi from Swift!")
// ELF: @llvm.compiler.used = {{.*}}[37 x i8]* @_swift1_autolink_entries
// ELF: @llvm.compiler.used = {{.*}}ptr @_swift1_autolink_entries
// SECTION: .swift1_autolink_entries
// NOSECTION-NOT: .swift1_autolink_entries

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -10,7 +9,7 @@ class Foobar {
}
// Make sure we are mis-initializing the alloca.
// CHECK-LABEL: define {{.*}}swiftcc %T11alloc_stack6FoobarC* @"$s11alloc_stack6FoobarCACycfc"(%T11alloc_stack6FoobarC* swiftself %0)
// CHECK-LABEL: define {{.*}}swiftcc ptr @"$s11alloc_stack6FoobarCACycfc"(ptr swiftself %0)
// CHECK: alloca %TSb, align 1
// CHECK-NOT: store{{.*}}opaque
// CHECK: ret {{.*}}%0

View File

@@ -4,8 +4,7 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_enum.swiftmodule -module-name=resilient_enum -I %t %S/../Inputs/resilient_enum.swift
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s
// RUN: %target-swift-frontend -disable-type-layout -I %t -emit-ir -enable-library-evolution %s
// RUN: %target-swift-frontend -disable-type-layout -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s
sil_stage canonical
@@ -17,8 +16,8 @@ public enum EnumWithClassArchetypeAndDynamicSize<T : AnyObject> {
case B(Size)
}
// CHECK-LABEL: define swiftcc void @copyDynamicMultiEnum(%swift.type* %"EnumWithClassArchetypeAndDynamicSize<T>", %swift.type* %U, %T20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeO* noalias nocapture swiftself %0)
// CHECK: call %T20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeO* @"$s20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeOyxGRlzCr0_lWOc"(%T20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeO* %0, %T20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeO* {{.*}}, %swift.type* %"EnumWithClassArchetypeAndDynamicSize<T>")
// CHECK-LABEL: define swiftcc void @copyDynamicMultiEnum(ptr %"EnumWithClassArchetypeAndDynamicSize<T>", ptr %U, ptr noalias nocapture swiftself %0)
// CHECK: call ptr @"$s20archetype_resilience36EnumWithClassArchetypeAndDynamicSizeOyxGRlzCr0_lWOc"(ptr %0, ptr {{.*}}, ptr %"EnumWithClassArchetypeAndDynamicSize<T>")
// CHECK: ret void
sil [ossa] @copyDynamicMultiEnum : $@convention(method) <T, U where T: AnyObject> (@in_guaranteed EnumWithClassArchetypeAndDynamicSize<T>) -> () {
bb0(%0 : $*EnumWithClassArchetypeAndDynamicSize<T>):

View File

@@ -1,10 +1,8 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir > %t.ll
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir > %t.ll
// RUN: %FileCheck %s -check-prefix=GLOBAL < %t.ll
// RUN: %FileCheck %s < %t.ll
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir -wmo -num-threads 1 > %t.ll.wmo
// RUN: %target-swift-frontend -primary-file %s -emit-ir -wmo -num-threads 1
// RUN: %target-swift-frontend -primary-file %s -emit-ir -wmo -num-threads 1 > %t.ll.wmo
// RUN: %FileCheck %s -check-prefix=GLOBAL < %t.ll.wmo
// RUN: %FileCheck %s < %t.ll.wmo
// REQUIRES: CPU=x86_64
@@ -39,7 +37,7 @@ protocol HasThreeAssocTypes {
}
// Witness table for WithUniversal : Assocked.
// GLOBAL-LABEL: @"$s23associated_type_witness13WithUniversalVAA8AssockedAAWP" = hidden global [4 x i8*] [
// GLOBAL-LABEL: @"$s23associated_type_witness13WithUniversalVAA8AssockedAAWP" = hidden global [4 x ptr] [
// GLOBAL-SAME: @"$s23associated_type_witness13WithUniversalVAA8AssockedAAMc"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness13WithUniversalVAA8AssockedAA5AssocAaDP_AA1P",
// GLOBAL-SAME: @"associated conformance 23associated_type_witness13WithUniversalVAA8AssockedAA5AssocAaDP_AA1Q"
@@ -50,7 +48,7 @@ struct WithUniversal : Assocked {
}
// Witness table for GenericWithUniversal : Assocked.
// GLOBAL-LABEL: @"$s23associated_type_witness20GenericWithUniversalVyxGAA8AssockedAAWP" = hidden global [4 x i8*] [
// GLOBAL-LABEL: @"$s23associated_type_witness20GenericWithUniversalVyxGAA8AssockedAAWP" = hidden global [4 x ptr] [
// GLOBAL-SAME: @"$s23associated_type_witness20GenericWithUniversalVyxGAA8AssockedAAMc"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness20GenericWithUniversalVyxGAA8AssockedAA5AssocAaEP_AA1P"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness20GenericWithUniversalVyxGAA8AssockedAA5AssocAaEP_AA1Q"
@@ -61,7 +59,7 @@ struct GenericWithUniversal<T> : Assocked {
}
// Witness table for Fulfilled : Assocked.
// GLOBAL-LABEL: @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAAWp" = internal global [4 x i8*] [
// GLOBAL-LABEL: @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAAWp" = internal global [4 x ptr] [
// GLOBAL-SAME: @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAAMc"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1P"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1Q"
@@ -72,23 +70,21 @@ struct Fulfilled<T : P & Q> : Assocked {
}
// Associated type witness table access function for Fulfilled.Assoc : P.
// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1PPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 3
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
// CHECK-NEXT: ret i8** [[T2]]
// CHECK-LABEL: define internal swiftcc ptr @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1PPWT"(ptr %"Fulfilled<T>.Assoc", ptr %"Fulfilled<T>", ptr %"Fulfilled<T>.Assocked")
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %"Fulfilled<T>", i64 3
// CHECK-NEXT: [[T2:%.*]] = load ptr, ptr [[T1]], align 8, !invariant.load
// CHECK-NEXT: ret ptr [[T2]]
// Associated type witness table access function for Fulfilled.Assoc : Q.
// CHECK-LABEL: define internal swiftcc i8** @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1QPWT"(%swift.type* %"Fulfilled<T>.Assoc", %swift.type* %"Fulfilled<T>", i8** %"Fulfilled<T>.Assocked")
// CHECK: [[T0:%.*]] = bitcast %swift.type* %"Fulfilled<T>" to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 4
// CHECK-NEXT: [[T2:%.*]] = load i8**, i8*** [[T1]], align 8, !invariant.load
// CHECK-NEXT: ret i8** [[T2]]
// CHECK-LABEL: define internal swiftcc ptr @"$s23associated_type_witness9FulfilledVyxGAA8AssockedAA5AssocAaEP_AA1QPWT"(ptr %"Fulfilled<T>.Assoc", ptr %"Fulfilled<T>", ptr %"Fulfilled<T>.Assocked")
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %"Fulfilled<T>", i64 4
// CHECK-NEXT: [[T2:%.*]] = load ptr, ptr [[T1]], align 8, !invariant.load
// CHECK-NEXT: ret ptr [[T2]]
struct Pair<T, U> : P, Q {}
// Generic witness table pattern for Computed : Assocked.
// GLOBAL-LABEL: @"$s23associated_type_witness8ComputedVyxq_GAA8AssockedAAWp" = internal global [4 x i8*] [
// GLOBAL-LABEL: @"$s23associated_type_witness8ComputedVyxq_GAA8AssockedAAWp" = internal global [4 x ptr] [
// GLOBAL-SAME: @"$s23associated_type_witness8ComputedVyxq_GAA8AssockedAAMc"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness8ComputedVyxq_GAA8AssockedAA5AssocAaEP_AA1P"
// GLOBAL-SAME: @"associated conformance 23associated_type_witness8ComputedVyxq_GAA8AssockedAA5AssocAaEP_AA1Q"
@@ -102,7 +98,7 @@ struct Pair<T, U> : P, Q {}
// No instantiator function
// GLOBAL-SAME: i32 0,
// GLOBAL-SAME: i32 trunc (i64 sub (i64 ptrtoint ([16 x i8*]* [[PRIVATE:@.*]] to i64), i64 ptrtoint
// GLOBAL-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr [[PRIVATE:@.*]] to i64), i64 ptrtoint
// GLOBAL-SAME: }
struct Computed<T, U> : Assocked {
@@ -110,11 +106,10 @@ struct Computed<T, U> : Assocked {
}
// Instantiation function for GenericComputed : DerivedFromSimpleAssoc.
// CHECK-LABEL: define internal void @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWI"(i8** %0, %swift.type* %"GenericComputed<T>", i8** %1)
// CHECK: [[T0:%.*]] = call i8** @swift_getWitnessTable({{.*}}@"$s23associated_type_witness15GenericComputedVyxGAA14HasSimpleAssocAAMc"
// CHECK-NEXT: [[T1:%.*]] = bitcast i8** [[T0]] to i8*
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds i8*, i8** %0, i32 1
// CHECK-NEXT: store i8* [[T1]], i8** [[T2]], align 8
// CHECK-LABEL: define internal void @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWI"(ptr %0, ptr %"GenericComputed<T>", ptr %1)
// CHECK: [[T0:%.*]] = call ptr @swift_getWitnessTable({{.*}}@"$s23associated_type_witness15GenericComputedVyxGAA14HasSimpleAssocAAMc"
// CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds ptr, ptr %0, i32 1
// CHECK-NEXT: store ptr [[T0]], ptr [[T2]], align 8
// CHECK-NEXT: ret void
@@ -125,9 +120,9 @@ protocol HasSimpleAssoc {
protocol DerivedFromSimpleAssoc : HasSimpleAssoc {}
// Generic witness table pattern for GenericComputed : DerivedFromSimpleAssoc.
// GLOBAL-LABEL: @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWp" = internal constant [2 x i8*]
// GLOBAL-LABEL: @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWp" = internal constant [2 x ptr]
// GLOBAL-SAME: @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAMc"
// GLOBAL-SAME: i8* null
// GLOBAL-SAME: ptr null
// Protocol conformance descriptor for GenericComputed : DerivedFromSimpleAssoc.
// GLOBAL-LABEL: @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAMc" = hidden constant
@@ -135,7 +130,7 @@ protocol DerivedFromSimpleAssoc : HasSimpleAssoc {}
// GLOBAL-SAME: i16 1,
// Relative reference to instantiator function
// GLOBAL-SAME: i32 trunc (i64 sub (i64 ptrtoint (void (i8**, %swift.type*, i8**)* @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWI" to i64),
// GLOBAL-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s23associated_type_witness15GenericComputedVyxGAA22DerivedFromSimpleAssocAAWI" to i64),
// Relative reference to private data
struct GenericComputed<T: P> : DerivedFromSimpleAssoc {

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -emit-ir -primary-file %s | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -emit-ir -primary-file %s
// RUN: %target-swift-frontend -emit-ir -primary-file %s | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -24,14 +23,14 @@ struct Spoon : Runcible {
}
struct Owl<T : Runcible, U> {
// CHECK: define hidden swiftcc void @"$s16associated_types3OwlV3eat{{[_0-9a-zA-Z]*}}F"(%swift.opaque*
// CHECK: define hidden swiftcc void @"$s16associated_types3OwlV3eat{{[_0-9a-zA-Z]*}}F"(ptr
func eat(_ what: T.RuncerType.Runcee, and: T.RuncerType, with: T) { }
}
class Pussycat<T : Runcible, U> {
init() {}
// CHECK: define hidden swiftcc void @"$s16associated_types8PussycatC3eat{{[_0-9a-zA-Z]*}}F"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %T16associated_types8PussycatC* swiftself %3)
// CHECK: define hidden swiftcc void @"$s16associated_types8PussycatC3eat{{[_0-9a-zA-Z]*}}F"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr swiftself %3)
func eat(_ what: T.RuncerType.Runcee, and: T.RuncerType, with: T) { }
}
@@ -72,26 +71,25 @@ func testFastRuncible<T: Runcible, U: FastRuncible>(_ t: T, u: U)
U.RuncerType.Runcee.accelerate()
}
// CHECK: define hidden swiftcc void @"$s16associated_types16testFastRuncible_1uyx_q_tAA0E0RzAA0dE0R_10RuncerTypeQy_AFRtzr0_lF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.type* %T, %swift.type* %U, i8** %T.Runcible, i8** %U.FastRuncible) {{.*}} {
// CHECK: define hidden swiftcc void @"$s16associated_types16testFastRuncible_1uyx_q_tAA0E0RzAA0dE0R_10RuncerTypeQy_AFRtzr0_lF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr %T, ptr %U, ptr %T.Runcible, ptr %U.FastRuncible) {{.*}} {
// 1. Get the type metadata for U.RuncerType.Runcee.
// 1a. Get the type metadata for U.RuncerType.
// Note that we actually look things up in T, which is going to prove unfortunate.
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness([[INT]] 255, i8** %U.FastRuncible, %swift.type* %U, %swift.protocol_requirement* getelementptr{{.*}}i32 9), i32 -1), %swift.protocol_requirement* getelementptr inbounds (<{{.*}}>, <{{.*}}>* @"$s16associated_types12FastRuncibleMp", i32 0, i32 10)) [[NOUNWIND_READNONE:#.*]]
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness([[INT]] 255, ptr %U.FastRuncible, ptr %U, ptr getelementptr{{.*}}i32 9), i32 -1), ptr getelementptr inbounds (<{{.*}}>, ptr @"$s16associated_types12FastRuncibleMp", i32 0, i32 10)) [[NOUNWIND_READNONE:#.*]]
// CHECK-NEXT: [[T3:%.*]] = extractvalue %swift.metadata_response [[T2]], 0
// CHECK-NEXT: extractvalue %swift.metadata_response [[T2]], 1
// 2. Get the witness table for U.RuncerType.Runcee : Speedy
// 2a. Get the protocol witness table for U.RuncerType : FastRuncer.
// CHECK-NEXT: %T.RuncerType.FastRuncer = call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** %U.FastRuncible, %swift.type* %U, %swift.type* [[T3]]
// CHECK-NEXT: %T.RuncerType.FastRuncer = call swiftcc ptr @swift_getAssociatedConformanceWitness(ptr %U.FastRuncible, ptr %U, ptr [[T3]]
// 1c. Get the type metadata for U.RuncerType.Runcee.
// CHECK-NEXT: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness([[INT]] 0, i8** %T.RuncerType.FastRuncer, %swift.type* [[T3]], {{.*}}, %swift.protocol_requirement* getelementptr inbounds (<{{.*}}>, <{{.*}}>* @"$s16associated_types10FastRuncerMp", i32 0, i32 10))
// CHECK-NEXT: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness([[INT]] 0, ptr %T.RuncerType.FastRuncer, ptr [[T3]], {{.*}}, ptr getelementptr inbounds (<{{.*}}>, ptr @"$s16associated_types10FastRuncerMp", i32 0, i32 10))
// CHECK-NEXT: %T.RuncerType.Runcee = extractvalue %swift.metadata_response [[T2]], 0
// 2b. Get the witness table for U.RuncerType.Runcee : Speedy.
// CHECK-NEXT: %T.RuncerType.Runcee.Speedy = call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** %T.RuncerType.FastRuncer, %swift.type* [[T3]], %swift.type* %T.RuncerType.Runcee
// CHECK-NEXT: %T.RuncerType.Runcee.Speedy = call swiftcc ptr @swift_getAssociatedConformanceWitness(ptr %T.RuncerType.FastRuncer, ptr [[T3]], ptr %T.RuncerType.Runcee
// 3. Perform the actual call.
// CHECK-NEXT: [[T0_GEP:%.*]] = getelementptr inbounds i8*, i8** %T.RuncerType.Runcee.Speedy, i32 1
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[T0_GEP]]
// CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to void (%swift.type*, %swift.type*, i8**)*
// CHECK-NEXT: call swiftcc void [[T1]](%swift.type* swiftself %T.RuncerType.Runcee, %swift.type* %T.RuncerType.Runcee, i8** %T.RuncerType.Runcee.Speedy)
// CHECK-NEXT: [[T0_GEP:%.*]] = getelementptr inbounds ptr, ptr %T.RuncerType.Runcee.Speedy, i32 1
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[T0_GEP]]
// CHECK-NEXT: call swiftcc void [[T0]](ptr swiftself %T.RuncerType.Runcee, ptr %T.RuncerType.Runcee, ptr %T.RuncerType.Runcee.Speedy)
public protocol P0 {
associatedtype ErrorType : Swift.Error
@@ -101,8 +99,8 @@ public struct P0Impl : P0 {
public typealias ErrorType = Swift.Error
}
// CHECK: define{{.*}} swiftcc i8** @"$s16associated_types6P0ImplVAA0C0AA9ErrorTypeAaDP_s0E0PWT"(%swift.type* %P0Impl.ErrorType, %swift.type* %P0Impl, i8** %P0Impl.P0)
// CHECK: ret i8** @"$ss5ErrorWS"
// CHECK: define{{.*}} swiftcc ptr @"$s16associated_types6P0ImplVAA0C0AA9ErrorTypeAaDP_s0E0PWT"(ptr %P0Impl.ErrorType, ptr %P0Impl, ptr %P0Impl.P0)
// CHECK: ret ptr @"$ss5ErrorWS"
// CHECK: attributes [[NOUNWIND_READNONE]] = { nounwind readnone willreturn }

View File

@@ -2,23 +2,19 @@
// RUN: %swift -target i686--windows-msvc -parse-stdlib -autolink-force-load -module-name swiftMSVCRT -module-link-name swiftMSVCRT -emit-module -o %t/swiftMSVCRT.swiftmodule %S/../Inputs/empty.swift
// RUN: %swift %use_no_opaque_pointers -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t | %FileCheck %s
// RUN: %swift %use_no_opaque_pointers -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t | %FileCheck %s -check-prefix CHECK-ASM-MSC
// RUN: %swift -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t
// RUN: %swift -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t
// RUN: %swift -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t | %FileCheck %s
// RUN: %swift -target i686--windows-msvc -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t | %FileCheck %s -check-prefix CHECK-ASM-MSC
// RUN: %swift -target i686--windows-itanium -parse-stdlib -autolink-force-load -module-name swiftMSVCRT -module-link-name swiftMSVCRT -emit-module -o %t/swiftMSVCRT.swiftmodule %S/../Inputs/empty.swift
// RUN: %swift %use_no_opaque_pointers -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t | %FileCheck %s
// RUN: %swift %use_no_opaque_pointers -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t | %FileCheck %s -check-prefix CHECK-ASM-GNU
// RUN: %swift -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t
// RUN: %swift -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t
// RUN: %swift -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -emit-ir -o - %s -I%t | %FileCheck %s
// RUN: %swift -target i686--windows-itanium -parse-as-library -parse-stdlib -autolink-force-load -module-name autolink -module-link-name autolink -S -o - %s -I%t | %FileCheck %s -check-prefix CHECK-ASM-GNU
// REQUIRES: OS=windows-msvc
import swiftMSVCRT
// CHECK: @"_swift_FORCE_LOAD_$_swiftMSVCRT_$_autolink" = weak_odr hidden constant void ()* @"_swift_FORCE_LOAD_$_swiftMSVCRT"
// CHECK: @"_swift_FORCE_LOAD_$_swiftMSVCRT_$_autolink" = weak_odr hidden constant ptr @"_swift_FORCE_LOAD_$_swiftMSVCRT"
// CHECK: define dllexport void @"_swift_FORCE_LOAD_$_autolink"()
// CHECK-ASM-GNU: .ascii " -export:\"__swift_FORCE_LOAD_$_autolink\""

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -I %S/Inputs/abi %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: OS=macosx
@@ -38,7 +37,7 @@ public struct BigBigStruct {
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testBitfieldInBlock
// CHECK: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret({{.*}}) {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* byval({{.*}}) align 8 {{%.*}})
// CHECK: call void {{%.*}}(ptr noalias nocapture sret({{.*}}) {{%.*}}, ptr {{%.*}}, ptr byval({{.*}}) align 8 {{%.*}})
sil @testBitfieldInBlock : $@convention(thin) (@owned @convention(block) (BitfieldOne) -> BitfieldOne, BitfieldOne) -> BitfieldOne {
entry(%b : $@convention(block) (BitfieldOne) -> BitfieldOne, %x : $BitfieldOne):
%r = apply %b(%x) : $@convention(block) (BitfieldOne) -> BitfieldOne
@@ -46,7 +45,7 @@ entry(%b : $@convention(block) (BitfieldOne) -> BitfieldOne, %x : $BitfieldOne):
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testTupleExtract
// CHECK: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret({{.*}}) {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* byval({{.*}}) align 8 {{%.*}})
// CHECK: call void {{%.*}}(ptr noalias nocapture sret({{.*}}) {{%.*}}, ptr {{%.*}}, ptr byval({{.*}}) align 8 {{%.*}})
sil @testTupleExtract : $@convention(thin) (@owned (BitfieldOne, @convention(block) (BitfieldOne) -> BitfieldOne), BitfieldOne) -> BitfieldOne {
entry(%b : $(BitfieldOne, @convention(block) (BitfieldOne) -> (BitfieldOne)), %x : $BitfieldOne):
%a = tuple_extract %b : $(BitfieldOne, @convention(block) (BitfieldOne) -> (BitfieldOne)), 1
@@ -54,9 +53,9 @@ entry(%b : $(BitfieldOne, @convention(block) (BitfieldOne) -> (BitfieldOne)), %x
return %r : $BitfieldOne
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testBigTempStruct(%T22big_types_corner_cases13BigTempStructV* noalias nocapture sret({{.*}}) %0, %swift.bridge* %1, %swift.type* %Element)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testBigTempStruct(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %Element)
// CHECK: [[ALLOC:%.*]] = alloca %T22big_types_corner_cases13BigTempStructV
// CHECK: call swiftcc void @testBigTempStruct(%T22big_types_corner_cases13BigTempStructV* noalias nocapture sret({{.*}}) [[ALLOC]], %swift.bridge* %1, %swift.type* %Element)
// CHECK: call swiftcc void @testBigTempStruct(ptr noalias nocapture sret({{.*}}) [[ALLOC]], ptr %1, ptr %Element)
// CHECK: ret void
sil @testBigTempStruct : $@convention(method) <Element> (@guaranteed _ArrayBuffer<Element>) -> @owned BigTempStruct<Element> {
bb0(%0 : $_ArrayBuffer<Element>):
@@ -66,9 +65,9 @@ bb0(%0 : $_ArrayBuffer<Element>):
return %9 : $BigTempStruct<Element>
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testTryApply(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) %0, i8* %1, %swift.refcounted* %2, %swift.refcounted* swiftself %3, %swift.error** noalias nocapture swifterror dereferenceable(8) %4)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testTryApply(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %2, ptr swiftself %3, ptr noalias nocapture swifterror dereferenceable(8) %4)
// CHECK: [[ALLOC:%.*]] = alloca %T22big_types_corner_cases9BigStructV
// CHECK: call swiftcc void {{.*}}(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) [[ALLOC]]
// CHECK: call swiftcc void {{.*}}(ptr noalias nocapture sret({{.*}}) [[ALLOC]]
// CHECK: ret void
sil @testTryApply : $@convention(thin)(() -> (@owned BigStruct, @error Error)) -> (@owned BigStruct, @error Error) {
bb0(%0 : $() -> (@owned BigStruct, @error Error)):
@@ -82,8 +81,8 @@ bb2(%err : $Error):
throw %err : $Error
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testFuncWithModBlockStorageApply({ %objc_block, %swift.function }* nocapture dereferenceable({{.*}}) %0, %T22big_types_corner_cases9BigStructV* noalias nocapture dereferenceable({{.*}})
// CHECK: call swiftcc void {{.*}}(%T22big_types_corner_cases9BigStructV* noalias nocapture dereferenceable({{.*}}) %1
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testFuncWithModBlockStorageApply(ptr nocapture dereferenceable({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}})
// CHECK: call swiftcc void {{.*}}(ptr noalias nocapture dereferenceable({{.*}}) %1
// CHECK: ret void
sil @testFuncWithModBlockStorageApply : $@convention(thin) (@inout_aliasable @block_storage @callee_owned (@owned BigStruct) -> (), BigStruct) -> () {
// %0 // user: %5
@@ -102,15 +101,14 @@ bb0(%0 : $*@block_storage @callee_owned (@owned BigStruct) -> (), %1 : $BigStruc
sil public_external @c_return_func : $@convention(thin) () -> () -> @owned BigStruct
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @part_apply_caller()
// CHECK: [[CALLEXT:%.*]] = call swiftcc { i8*, %swift.refcounted* } @c_return_func()
// CHECK: [[VALEXT:%.*]] = extractvalue { i8*, %swift.refcounted* } [[CALLEXT]], 1
// CHECK: store %swift.refcounted* [[VALEXT]], %swift.refcounted**
// CHECK: [[RET:%.*]] = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (void (%T22big_types_corner_cases9BigStructV*, i64, %swift.refcounted*)* @"$s17part_apply_calleeTA" to i8*), %swift.refcounted* undef }, %swift.refcounted*
// CHECK: ret { i8*, %swift.refcounted* } [[RET]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @part_apply_caller()
// CHECK: [[CALLEXT:%.*]] = call swiftcc { ptr, ptr } @c_return_func()
// CHECK: [[VALEXT:%.*]] = extractvalue { ptr, ptr } [[CALLEXT]], 1
// CHECK: store ptr [[VALEXT]], ptr
// CHECK: [[RET:%.*]] = insertvalue { ptr, ptr } { ptr @"$s17part_apply_calleeTA", ptr undef }, ptr
// CHECK: ret { ptr, ptr } [[RET]]
// CHECK-LABEL: define internal swiftcc void @"$s17part_apply_calleeTA"(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) %0, i64 %1, %swift.refcounted* swiftself %2)
// CHECK: bitcast %swift.refcounted* %2 to <{ %swift.refcounted, %swift.function }>*
// CHECK-LABEL: define internal swiftcc void @"$s17part_apply_calleeTA"(ptr noalias nocapture sret({{.*}}) %0, i64 %1, ptr swiftself %2)
// CHECK: ret void
sil @part_apply_caller : $@convention(thin) () -> @owned @callee_owned (@owned Builtin.Int64) -> @owned BigStruct {
@@ -127,11 +125,10 @@ bb0(%0 : $Builtin.Int64, %1 : $() -> @owned BigStruct):
return undef : $BigStruct
}
// CHECK-LABEL: define swiftcc void @poninter_to_mod_ret(i8* %0, %swift.refcounted* %1)
// CHECK: [[BITCAST:%.*]] = bitcast i8* %0 to { i8*, %swift.refcounted* } (%swift.refcounted*)*
// CHECK: [[CALL:%.*]] = call swiftcc { i8*, %swift.refcounted* } [[BITCAST]](%swift.refcounted* swiftself %1)
// CHECK: extractvalue { i8*, %swift.refcounted* } [[CALL]], 0
// CHECK: extractvalue { i8*, %swift.refcounted* } [[CALL]], 1
// CHECK-LABEL: define swiftcc void @poninter_to_mod_ret(ptr %0, ptr %1)
// CHECK: [[CALL:%.*]] = call swiftcc { ptr, ptr } %0(ptr swiftself %1)
// CHECK: extractvalue { ptr, ptr } [[CALL]], 0
// CHECK: extractvalue { ptr, ptr } [[CALL]], 1
// CHECK: ret void
sil @poninter_to_mod_ret : $@convention(thin) (@owned @callee_owned () -> @owned @callee_owned (@owned Builtin.Int64) -> @owned BigStruct) -> () {
bb0(%funcpointer : $@callee_owned () -> @owned @callee_owned (@owned Builtin.Int64) -> @owned BigStruct):
@@ -176,12 +173,12 @@ sil @get_optional_none : $@convention(method) <τ_0_0> (@thin Optional<τ_0_0>.T
sil @short_circuit_operation : $@convention(thin) <τ_0_0> (@in Optional<τ_0_0>, @owned @callee_owned () -> (@out τ_0_0, @error Error)) -> (@out τ_0_0, @error Error)
sil @autoclosure_partialapply : $@convention(thin) (@owned @callee_owned () -> (BigStruct, @error Error)) -> (@out BigStruct, @error Error)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @closure(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) %0, %T22big_types_corner_cases8SuperSubC* %1)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @closure(ptr noalias nocapture sret({{.*}}) %0, ptr %1)
// CHECK-64: [[ALLOC1:%.*]] = alloca %T22big_types_corner_cases9BigStructV
// CHECK-64: [[ALLOC2:%.*]] = alloca %T22big_types_corner_cases9BigStructV
// CHECK-64: [[ALLOC3:%.*]] = alloca %T22big_types_corner_cases9BigStructVSg
// CHECK-64: [[ALLOC4:%.*]] = alloca %T22big_types_corner_cases9BigStructVSg
// CHECK-64: call swiftcc void @"$s22big_types_corner_cases8SuperSubC1fyyFAA9BigStructVycfU_AFyKXKfu_TA"(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) [[ALLOC1]], %swift.refcounted* swiftself {{.*}}, %swift.error** nocapture swifterror %swifterror)
// CHECK-64: call swiftcc void @"$s22big_types_corner_cases8SuperSubC1fyyFAA9BigStructVycfU_AFyKXKfu_TA"(ptr noalias nocapture sret({{.*}}) [[ALLOC1]], ptr swiftself {{.*}}, ptr nocapture swifterror %swifterror)
// CHECK: ret void
sil @closure : $@convention(thin) (@owned SuperSub) -> BigStruct {
bb0(%0 : $SuperSub):
@@ -220,7 +217,7 @@ sil @returnBigStruct : $@convention(thin) () -> @owned BigStruct
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @closureToConvert()
// CHECK: entry:
// CHECK: [[ALLOC:%.*]] = alloca %T22big_types_corner_cases9BigStructV
// CHECK: call swiftcc void @returnBigStruct(%T22big_types_corner_cases9BigStructV* noalias nocapture sret({{.*}}) [[ALLOC]])
// CHECK: call swiftcc void @returnBigStruct(ptr noalias nocapture sret({{.*}}) [[ALLOC]])
// CHECK: ret void
// CHECK-LABEL: }
sil @closureToConvert : $@convention(thin) () -> () {
@@ -233,7 +230,7 @@ bb0:
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testConvertFunc()
// CHECK: entry:
// CHECK: call swiftcc void bitcast (void ()* @closureToConvert to void (%swift.refcounted*)*)(%swift.refcounted* swiftself null)
// CHECK: call swiftcc void @closureToConvert(ptr swiftself null)
// CHECK: ret void
// CHECK-LABEL: }
sil @testConvertFunc : $@convention(thin) () -> () {
@@ -248,11 +245,11 @@ bb0:
sil @convertToThickHelper : $@convention(thin) (@owned BigStruct) -> ()
// CHECK-LABAL: define {{.*}} swiftcc void @convertToThick(%T22big_types_corner_cases9BigStructV* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABAL: define {{.*}} swiftcc void @convertToThick(ptr noalias nocapture dereferenceable({{.*}}) %0)
// CHECK: entry:
// CHECK: [[ALLOC:%.*]] = alloca %T22big_types_corner_cases9BigStructV, align 4
// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64
// CHECK: call swiftcc void bitcast (void (%T22big_types_corner_cases9BigStructV*)* @convertToThickHelper to void (%T22big_types_corner_cases9BigStructV*, %swift.refcounted*)*)(%T22big_types_corner_cases9BigStructV* noalias nocapture dereferenceable({{.*}}) [[ALLOC]], %swift.refcounted* swiftself null)
// CHECK: call void @llvm.memcpy.p0.p0.i64
// CHECK: call swiftcc void @convertToThickHelper(ptr noalias nocapture dereferenceable({{.*}}) [[ALLOC]], ptr swiftself null)
// CHECK: ret void
// CHECK-LABEL: }
sil @convertToThick : $@convention(thin) (@in BigStruct) -> () {
@@ -295,11 +292,11 @@ bb0(%1 : $X):
sil @$getLargeObjCType : $@convention(thin) () -> BitfieldOne
// CHECK-LABAL: define {{.*}} swiftcc void @"$crash_on_objc_apply"(%objc_object* %0)
// CHECK-LABAL: define {{.*}} swiftcc void @"$crash_on_objc_apply"(ptr %0)
// CHECK: entry:
// CHECK: [[LOADS:%.*]] = load i8*, i8** @"\01L_selector(foo)"
// CHECK: [[RESS:%.*]] = load i8*, i8** @"\01L_selector(respondsToSelector:)"
// CHECK: call i1 bitcast (void ()* @objc_msgSend to i1 (%objc_object*, i8*, i8*)*)(%objc_object* %0, i8* [[RESS]], i8* [[LOADS]])
// CHECK: [[LOADS:%.*]] = load ptr, ptr @"\01L_selector(foo)"
// CHECK: [[RESS:%.*]] = load ptr, ptr @"\01L_selector(respondsToSelector:)"
// CHECK: call i1 @objc_msgSend(ptr %0, ptr [[RESS]], ptr [[LOADS]])
sil @$crash_on_objc_apply : $@convention(thin) (@guaranteed AnyObject) -> () {
// %0 // users: %2, %1
bb0(%0 : $AnyObject):
@@ -333,8 +330,8 @@ bb3: // Preds: bb2 bb1
sil @slowCallee : $@convention(thin) (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed Array<String>) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned BigStruct
// CHECK-LABAL: define {{.*}} swiftcc void @slowCaller(i64 %0, %swift.bridge* %1)
// CHECK: call swiftcc { i8*, %swift.refcounted* } @slowCallee(i64 %0, %swift.bridge* %1)
// CHECK-LABAL: define {{.*}} swiftcc void @slowCaller(i64 %0, ptr %1)
// CHECK: call swiftcc { ptr, ptr } @slowCallee(i64 %0, ptr %1)
sil @slowCaller : $@convention(thin) (@guaranteed String) -> () {
bb0(%0 : $String):
%1 = function_ref @slowCallee : $@convention(thin) (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed Array<String>) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned @callee_guaranteed (@guaranteed String) -> @owned BigStruct

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -I %S/Inputs/abi %s -emit-ir -sil-verify-all | %FileCheck %s
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir -sil-verify-all
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir -sil-verify-all | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: OS=macosx
@@ -20,9 +19,9 @@ public struct BigStruct {
var i8 : Int32 = 8
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testDestroyValue(%T15big_types_tests9BigStructV* noalias nocapture dereferenceable({{.*}}) #0 {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testDestroyValue(ptr noalias nocapture dereferenceable({{.*}}) #0 {
// CHECK-NEXT: entry
// CHECK-NEXT: call %T15big_types_tests9BigStructV* @"$s15big_types_tests9BigStructVWOs"(%T15big_types_tests9BigStructV* %0)
// CHECK-NEXT: call ptr @"$s15big_types_tests9BigStructVWOs"(ptr %0)
// CHECK-NEXT: ret void
sil @testDestroyValue : $@convention(thin) (@owned BigStruct) -> () {
entry(%x : $BigStruct):

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir| %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-cpu %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir| %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-cpu %s
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -17,21 +16,19 @@ sil_vtable C {}
protocol CP: class {}
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @bitcast_trivial(%T7bitcast1CC* %0) {{.*}} {
// CHECK-i386: [[BUF:%.*]] = alloca %T7bitcast1CC*, align 4
// CHECK-i386: store %T7bitcast1CC* %0, %T7bitcast1CC** [[BUF]]
// CHECK-i386: [[OUT_BUF:%.*]] = bitcast %T7bitcast1CC** [[BUF]] to %TSi*
// CHECK-i386: [[VALUE_BUF:%.*]] = getelementptr inbounds %TSi, %TSi* [[OUT_BUF]], i32 0, i32 0
// CHECK-i386: [[VALUE:%.*]] = load i32, i32* [[VALUE_BUF]], align 4
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @bitcast_trivial(ptr %0) {{.*}} {
// CHECK-i386: [[BUF:%.*]] = alloca ptr, align 4
// CHECK-i386: store ptr %0, ptr [[BUF]]
// CHECK-i386: [[VALUE_BUF:%.*]] = getelementptr inbounds %TSi, ptr [[BUF]], i32 0, i32 0
// CHECK-i386: [[VALUE:%.*]] = load i32, ptr [[VALUE_BUF]], align 4
// CHECK-i386: ret i32 [[VALUE]]
// CHECK-i386: }
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @bitcast_trivial(%T7bitcast1CC* %0) {{.*}} {
// CHECK-x86_64: [[BUF:%.*]] = alloca %T7bitcast1CC*, align 8
// CHECK-x86_64: store %T7bitcast1CC* %0, %T7bitcast1CC** [[BUF]]
// CHECK-x86_64: [[OUT_BUF:%.*]] = bitcast %T7bitcast1CC** [[BUF]] to %TSi*
// CHECK-x86_64: [[VALUE_BUF:%.*]] = getelementptr inbounds %TSi, %TSi* [[OUT_BUF]], i32 0, i32 0
// CHECK-x86_64: [[VALUE:%.*]] = load i64, i64* [[VALUE_BUF]], align 8
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @bitcast_trivial(ptr %0) {{.*}} {
// CHECK-x86_64: [[BUF:%.*]] = alloca ptr, align 8
// CHECK-x86_64: store ptr %0, ptr [[BUF]]
// CHECK-x86_64: [[VALUE_BUF:%.*]] = getelementptr inbounds %TSi, ptr [[BUF]], i32 0, i32 0
// CHECK-x86_64: [[VALUE:%.*]] = load i64, ptr [[VALUE_BUF]], align 8
// CHECK-x86_64: ret i64 [[VALUE]]
// CHECK-x86_64: }
sil @bitcast_trivial: $@convention(thin) (C) -> Int {
@@ -55,15 +52,15 @@ entry(%c : $Optional<Int>):
return %i : $Optional<Int>
}
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @bitcast_ref(%T7bitcast1CC* %0) {{.*}} {
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @bitcast_ref(ptr %0) {{.*}} {
// CHECK-i386-NEXT: entry:
// CHECK-i386-NEXT: [[VALUE:%.*]] = ptrtoint %T7bitcast1CC* %0 to i32
// CHECK-i386-NEXT: [[VALUE:%.*]] = ptrtoint ptr %0 to i32
// CHECK-i386-NEXT: ret i32 [[VALUE]]
// CHECK-i386-NEXT: }
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @bitcast_ref(%T7bitcast1CC* %0) {{.*}} {
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @bitcast_ref(ptr %0) {{.*}} {
// CHECK-x86_64-NEXT: entry:
// CHECK-x86_64-NEXT: [[VALUE:%.*]] = ptrtoint %T7bitcast1CC* %0 to i64
// CHECK-x86_64-NEXT: [[VALUE:%.*]] = ptrtoint ptr %0 to i64
// CHECK-x86_64-NEXT: ret i64 [[VALUE]]
// CHECK-x86_64-NEXT: }
sil @bitcast_ref: $@convention(thin) (C) -> Optional<C> {
@@ -91,11 +88,10 @@ bb0(%0 : $Optional<C>):
// CHECK-x86_64-NEXT: entry:
// CHECK-x86_64-NEXT: alloca <{ %TSi, %TSi }>, align 8
// A bunch of GEPs happen here to get from Int to int.
// CHECK-x86_64: store i64 %{{.*}}, i64* %bitcast.elt._value, align 8
// CHECK-x86_64: store i64 %{{.*}}, i64* %bitcast.elt1._value, align 8
// CHECK-x86_64-NEXT: %{{.*}} = bitcast <{ %TSi, %TSi }>* %bitcast to %TSi*
// CHECK-x86_64-NEXT: [[VAL:%.*]] = getelementptr inbounds %TSi, %TSi* %{{.*}}, i32 0, i32 0
// CHECK-x86_64-NEXT: [[RESULT:%.*]] = load i64, i64* [[VAL]], align 8
// CHECK-x86_64: store i64 %{{.*}}, ptr %bitcast.elt._value, align 8
// CHECK-x86_64: store i64 %{{.*}}, ptr %bitcast.elt1._value, align 8
// CHECK-x86_64-NEXT: [[VAL:%.*]] = getelementptr inbounds %TSi, ptr %bitcast, i32 0, i32 0
// CHECK-x86_64-NEXT: [[RESULT:%.*]] = load i64, ptr [[VAL]], align 8
// CHECK-x86_64: ret i64 [[RESULT]]
// CHECK-x86_64-NEXT: }
sil hidden @unchecked_bitwise_cast : $@convention(thin) (Int, Int) -> Int {
@@ -108,7 +104,6 @@ bb0(%0 : $Int, %1 : $Int):
// CHECK-x86_64-LABEL: define hidden swiftcc i64 @trivial_bitwise_cast(i64 %0, i64 %1) {{.*}} {
// CHECK-x86_64-NOT: trap
// CHECK-x86_64-NOT: unreachable
// CHECK-x86_64: bitcast <{ %TSi, %TSi }>* %bitcast to %TSi*
// CHECK-x86_64: ret
sil hidden [noinline] @trivial_bitwise_cast : $@convention(thin) (Int, Int) -> Int {
bb0(%0 : $Int, %1 : $Int):
@@ -118,8 +113,8 @@ bb0(%0 : $Int, %1 : $Int):
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @unchecked_ref_cast_addr
// CHECK-i386: call zeroext i1 @swift_dynamicCast(%swift.opaque* %0, %swift.opaque* %{{.*}}, %swift.type* %T, %swift.type* %U, i32 7)
// CHECK-x86_64: call zeroext i1 @swift_dynamicCast(%swift.opaque* %0, %swift.opaque* %{{.*}}, %swift.type* %T, %swift.type* %U, i64 7)
// CHECK-i386: call zeroext i1 @swift_dynamicCast(ptr %0, ptr %{{.*}}, ptr %T, ptr %U, i32 7)
// CHECK-x86_64: call zeroext i1 @swift_dynamicCast(ptr %0, ptr %{{.*}}, ptr %T, ptr %U, i64 7)
sil @unchecked_ref_cast_addr : $@convention(thin) <T, U> (@in T) -> @out U {
bb0(%0 : $*U, %1 : $*T):
%a = alloc_stack $T
@@ -132,11 +127,11 @@ bb0(%0 : $*U, %1 : $*T):
}
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @unchecked_ref_cast_class_optional
// CHECK-i386: ptrtoint %T7bitcast1AC* %0 to i32
// CHECK-i386: ptrtoint ptr %0 to i32
// CHECK-i386-NEXT: ret i32
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @unchecked_ref_cast_class_optional
// CHECK-x86_64: ptrtoint %T7bitcast1AC* %0 to i64
// CHECK-x86_64: ptrtoint ptr %0 to i64
// CHECK-x86_64-NEXT: ret i64
sil @unchecked_ref_cast_class_optional : $@convention(thin) (@owned A) -> @owned Optional<AnyObject> {
bb0(%0 : $A):
@@ -156,11 +151,11 @@ bb0(%0 : $Optional<A>):
}
// CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i32 @unchecked_ref_cast_proto_optional
// CHECK-i386: ptrtoint {{%objc_object|%swift.refcounted}}* %0 to i32
// CHECK-i386: ptrtoint ptr %0 to i32
// CHECK-i386-NEXT: ret i32
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @unchecked_ref_cast_proto_optional
// CHECK-x86_64: ptrtoint {{%objc_object|%swift.refcounted}}* %0 to i64
// CHECK-x86_64: ptrtoint ptr %0 to i64
// CHECK-x86_64-NEXT: ret i64
sil @unchecked_ref_cast_proto_optional : $@convention(thin) (@owned CP) -> @owned Optional<AnyObject> {
bb0(%0 : $CP):

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -emit-ir -parse-sil %s -parse-stdlib -Xllvm -sil-disable-pass=simplification | %FileCheck %s
// RUN: %target-swift-frontend -emit-ir -parse-sil %s -parse-stdlib -Xllvm -sil-disable-pass=simplification
// RUN: %target-swift-frontend -emit-ir -parse-sil %s -parse-stdlib -Xllvm -sil-disable-pass=simplification | %FileCheck %s
import Builtin
import Swift

View File

@@ -1,6 +1,5 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -disable-objc-attr-requires-foundation-module -import-objc-header %S/Inputs/c_functions.h -primary-file %s -emit-ir | %FileCheck %s -check-prefix CHECK -check-prefix %target-cpu -check-prefix %target-abi-%target-cpu
// RUN: %target-swift-frontend -enable-objc-interop -disable-objc-attr-requires-foundation-module -import-objc-header %S/Inputs/c_functions.h -primary-file %s -emit-ir
// RUN: %target-swift-frontend -enable-objc-interop -disable-objc-attr-requires-foundation-module -import-objc-header %S/Inputs/c_functions.h -primary-file %s -emit-ir | %FileCheck %s -check-prefix CHECK -check-prefix %target-cpu -check-prefix %target-abi-%target-cpu
// This is deliberately not a SIL test so that we can test SILGen too.
@@ -22,10 +21,9 @@ func test_indirect_by_val_alignment() {
// We only want to test x86_64.
// x86_64-LABEL: define hidden swiftcc void @"$s11c_functions30test_indirect_by_val_alignmentyyF"()
// x86_64: %indirect-temporary = alloca %TSo7a_thinga, align [[ALIGN:[0-9]+]]
// x86_64: [[CAST:%.*]] = bitcast %TSo7a_thinga* %indirect-temporary to %struct.a_thing*
// SYSV-x86_64: call void @log_a_thing(%struct.a_thing* byval({{.*}}) align [[ALIGN]] [[CAST]])
// WIN-x86_64: call void @log_a_thing(%struct.a_thing* [[CAST]])
// x86_64: define internal void @log_a_thing(%struct.a_thing* {{(byval(%struct.a_thing) align [[ALIGN]])?}}
// SYSV-x86_64: call void @log_a_thing(ptr byval({{.*}}) align [[ALIGN]] %indirect-temporary)
// WIN-x86_64: call void @log_a_thing(ptr %indirect-temporary)
// x86_64: define internal void @log_a_thing(ptr {{(byval(%struct.a_thing) align [[ALIGN]])?}}
// aarch64: define hidden swiftcc void @"$s11c_functions30test_indirect_by_val_alignmentyyF"()
// arm64_32: define hidden swiftcc void @"$s11c_functions30test_indirect_by_val_alignmentyyF"()

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -I %S/Inputs/abi %s -emit-ir | %FileCheck %s --check-prefix=CHECK-%target-cpu -check-prefix CHECK-%target-abi-%target-cpu -check-prefix CHECK-%target-sdk-name-%target-cpu
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir
// RUN: %target-swift-frontend -I %S/Inputs/abi %s -emit-ir | %FileCheck %s --check-prefix=CHECK-%target-cpu -check-prefix CHECK-%target-abi-%target-cpu -check-prefix CHECK-%target-sdk-name-%target-cpu
sil_stage canonical
import c_layout
@@ -33,66 +32,58 @@ bb0:
// CHECK-x86_64: [[RESULT:%.*]] = alloca %TSo11BitfieldOneV, align 8
// CHECK-x86_64: [[ARG:%.*]] = alloca %TSo11BitfieldOneV, align 8
// Make the first call and pull all the values out of the indirect result.
// CHECK-x86_64: call void @createBitfieldOne(%TSo11BitfieldOneV* noalias nocapture sret({{.*}}) [[RESULT]])
// CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_A]], i32 0, i32 0
// CHECK-x86_64: [[A:%.*]] = load i32, i32* [[ADDR_A_V]], align 8
// CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_B_X]], i32 0, i32 0
// CHECK-x86_64: [[B_X:%.*]] = load float, float* [[ADDR_B_X_V]], align 4
// CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_YZ_1:%.*]] = bitcast [3 x i8]* [[ADDR_B_YZ]] to i24*
// CHECK-x86_64: [[B_YZ:%.*]] = load i24, i24* [[ADDR_B_YZ_1]], align 4
// CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 2
// CHECK-x86_64: [[ADDR_CDE_1:%.*]] = bitcast [4 x i8]* [[ADDR_CDE]] to i32*
// CHECK-x86_64: [[CDE:%.*]] = load i32, i32* [[ADDR_CDE_1]], align 4
// CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 3
// CHECK-x86_64: [[ADDR_FGH_1:%.*]] = bitcast [4 x i8]* [[ADDR_FGH]] to i32*
// CHECK-x86_64: [[FGH:%.*]] = load i32, i32* [[ADDR_FGH_1]], align 8
// CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 4
// CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_I]], i32 0, i32 0
// CHECK-x86_64: [[I:%.*]] = load float, float* [[ADDR_I_V]], align 4
// CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 5
// CHECK-x86_64: [[ADDR_JK_1:%.*]] = bitcast [1 x i8]* [[ADDR_JK]] to i8*
// CHECK-x86_64: [[JK:%.*]] = load i8, i8* [[ADDR_JK_1]], align 8
// CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 7
// CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, %Ts6UInt64V* [[ADDR_L]], i32 0, i32 0
// CHECK-x86_64: [[L:%.*]] = load i64, i64* [[ADDR_L_V]], align 8
// CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[RESULT]], i32 0, i32 8
// CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_M]], i32 0, i32 0
// CHECK-x86_64: [[M:%.*]] = load i32, i32* [[ADDR_M_V]], align 8
// CHECK-x86_64: call void @createBitfieldOne(ptr noalias nocapture sret({{.*}}) [[RESULT]])
// CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, ptr [[ADDR_A]], i32 0, i32 0
// CHECK-x86_64: [[A:%.*]] = load i32, ptr [[ADDR_A_V]], align 8
// CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, ptr [[ADDR_B]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, ptr [[ADDR_B_X]], i32 0, i32 0
// CHECK-x86_64: [[B_X:%.*]] = load float, ptr [[ADDR_B_X_V]], align 4
// CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, ptr [[ADDR_B]], i32 0, i32 1
// CHECK-x86_64: [[B_YZ:%.*]] = load i24, ptr [[ADDR_B_YZ]], align 4
// CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 2
// CHECK-x86_64: [[CDE:%.*]] = load i32, ptr [[ADDR_CDE]], align 4
// CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 3
// CHECK-x86_64: [[FGH:%.*]] = load i32, ptr [[ADDR_FGH]], align 8
// CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 4
// CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, ptr [[ADDR_I]], i32 0, i32 0
// CHECK-x86_64: [[I:%.*]] = load float, ptr [[ADDR_I_V]], align 4
// CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 5
// CHECK-x86_64: [[JK:%.*]] = load i8, ptr [[ADDR_JK]], align 8
// CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 7
// CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, ptr [[ADDR_L]], i32 0, i32 0
// CHECK-x86_64: [[L:%.*]] = load i64, ptr [[ADDR_L_V]], align 8
// CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[RESULT]], i32 0, i32 8
// CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, ptr [[ADDR_M]], i32 0, i32 0
// CHECK-x86_64: [[M:%.*]] = load i32, ptr [[ADDR_M_V]], align 8
// Put all of the values into the indirect argument and make the second call.
// CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_A]], i32 0, i32 0
// CHECK-x86_64: store i32 [[A]], i32* [[ADDR_A_V]], align 8
// CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_B_X]], i32 0, i32 0
// CHECK-x86_64: store float [[B_X]], float* [[ADDR_B_X_V]], align 4
// CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, %TSo6NestedV* [[ADDR_B]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_YZ_1:%.*]] = bitcast [3 x i8]* [[ADDR_B_YZ]] to i24*
// CHECK-x86_64: store i24 [[B_YZ]], i24* [[ADDR_B_YZ_1]], align 4
// CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 2
// CHECK-x86_64: [[ADDR_CDE_1:%.*]] = bitcast [4 x i8]* [[ADDR_CDE]] to i32*
// CHECK-x86_64: store i32 [[CDE]], i32* [[ADDR_CDE_1]], align 4
// CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 3
// CHECK-x86_64: [[ADDR_FGH_1:%.*]] = bitcast [4 x i8]* [[ADDR_FGH]] to i32*
// CHECK-x86_64: store i32 [[FGH]], i32* [[ADDR_FGH_1]], align 8
// CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 4
// CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, %TSf* [[ADDR_I]], i32 0, i32 0
// CHECK-x86_64: store float [[I]], float* [[ADDR_I_V]], align 4
// CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 5
// CHECK-x86_64: [[ADDR_JK_1:%.*]] = bitcast [1 x i8]* [[ADDR_JK]] to i8*
// CHECK-x86_64: store i8 [[JK]], i8* [[ADDR_JK_1]], align 8
// CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 7
// CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, %Ts6UInt64V* [[ADDR_L]], i32 0, i32 0
// CHECK-x86_64: store i64 [[L]], i64* [[ADDR_L_V]], align 8
// CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, %TSo11BitfieldOneV* [[ARG]], i32 0, i32 8
// CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, %Ts6UInt32V* [[ADDR_M]], i32 0, i32 0
// CHECK-x86_64: store i32 [[M]], i32* [[ADDR_M_V]], align 8
// CHECK-SYSV-x86_64: call void @consumeBitfieldOne(%TSo11BitfieldOneV* byval({{.*}}) align 8 [[ARG]])
// CHECK-WIN-x86_64: call void @consumeBitfieldOne(%TSo11BitfieldOneV* [[ARG]])
// CHECK-x86_64: [[ADDR_A:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_A_V:%.*]] = getelementptr inbounds %Ts6UInt32V, ptr [[ADDR_A]], i32 0, i32 0
// CHECK-x86_64: store i32 [[A]], ptr [[ADDR_A_V]], align 8
// CHECK-x86_64: [[ADDR_B:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 1
// CHECK-x86_64: [[ADDR_B_X:%.*]] = getelementptr inbounds %TSo6NestedV, ptr [[ADDR_B]], i32 0, i32 0
// CHECK-x86_64: [[ADDR_B_X_V:%.*]] = getelementptr inbounds %TSf, ptr [[ADDR_B_X]], i32 0, i32 0
// CHECK-x86_64: store float [[B_X]], ptr [[ADDR_B_X_V]], align 4
// CHECK-x86_64: [[ADDR_B_YZ:%.*]] = getelementptr inbounds %TSo6NestedV, ptr [[ADDR_B]], i32 0, i32 1
// CHECK-x86_64: store i24 [[B_YZ]], ptr [[ADDR_B_YZ]], align 4
// CHECK-x86_64: [[ADDR_CDE:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 2
// CHECK-x86_64: store i32 [[CDE]], ptr [[ADDR_CDE]], align 4
// CHECK-x86_64: [[ADDR_FGH:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 3
// CHECK-x86_64: store i32 [[FGH]], ptr [[ADDR_FGH]], align 8
// CHECK-x86_64: [[ADDR_I:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 4
// CHECK-x86_64: [[ADDR_I_V:%.*]] = getelementptr inbounds %TSf, ptr [[ADDR_I]], i32 0, i32 0
// CHECK-x86_64: store float [[I]], ptr [[ADDR_I_V]], align 4
// CHECK-x86_64: [[ADDR_JK:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 5
// CHECK-x86_64: store i8 [[JK]], ptr [[ADDR_JK]], align 8
// CHECK-x86_64: [[ADDR_L:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 7
// CHECK-x86_64: [[ADDR_L_V:%.*]] = getelementptr inbounds %Ts6UInt64V, ptr [[ADDR_L]], i32 0, i32 0
// CHECK-x86_64: store i64 [[L]], ptr [[ADDR_L_V]], align 8
// CHECK-x86_64: [[ADDR_M:%.*]] = getelementptr inbounds %TSo11BitfieldOneV, ptr [[ARG]], i32 0, i32 8
// CHECK-x86_64: [[ADDR_M_V:%.*]] = getelementptr inbounds %Ts6UInt32V, ptr [[ADDR_M]], i32 0, i32 0
// CHECK-x86_64: store i32 [[M]], ptr [[ADDR_M_V]], align 8
// CHECK-SYSV-x86_64: call void @consumeBitfieldOne(ptr byval({{.*}}) align 8 [[ARG]])
// CHECK-WIN-x86_64: call void @consumeBitfieldOne(ptr [[ARG]])
// CHECK-x86_64: ret void
@@ -111,9 +102,9 @@ sil public_external @consumeSIMDStruct : $@convention(c) (SIMDStruct) -> ()
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testSIMDStruct()
// CHECK-SYSV-x86_64: call <3 x float> @createSIMDStruct
// CHECK-WIN-x86_64: call void @createSIMDStruct(%TSo10SIMDStructV* noalias nocapture sret({{.*}}) %
// CHECK-WIN-x86_64: call void @createSIMDStruct(ptr noalias nocapture sret({{.*}}) %
// CHECK-SYSV-x86_64: call void @consumeSIMDStruct(<3 x float>
// CHECK-WIN-x86_64: call void @consumeSIMDStruct(%TSo10SIMDStructV* %
// CHECK-WIN-x86_64: call void @consumeSIMDStruct(ptr %
sil @testSIMDStruct : $() -> () {
bb0:
%f = function_ref @createSIMDStruct : $@convention(c) () -> SIMDStruct
@@ -372,18 +363,18 @@ entry(%a : $CChar, %b : $CSignedChar, %c : $CUnsignedChar, %d : $CShort, %e : $C
return undef : $()
}
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @testIntegerExtensionInBlock(%objc_block* %0, i8 %1)
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @testIntegerExtensionInBlock(ptr %0, i8 %1)
sil @testIntegerExtensionInBlock : $@convention(thin) (@owned @convention(block) (CChar) -> CChar, CChar) -> CChar {
entry(%b : $@convention(block) (CChar) -> CChar, %c : $CChar):
// CHECK-SYSV-x86_64: call signext i8 {{%.*}}(%objc_block* {{%.*}}, i8 signext {{%.*}})
// CHECK-WIN-x86_64: call i8 {{%.*}}(%objc_block* {{%.*}}, i8 {{%.*}})
// CHECK-SYSV-x86_64: call signext i8 {{%.*}}(ptr {{%.*}}, i8 signext {{%.*}})
// CHECK-WIN-x86_64: call i8 {{%.*}}(ptr {{%.*}}, i8 {{%.*}})
%r = apply %b(%c) : $@convention(block) (CChar) -> CChar
return %r : $CChar
}
// CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testBitfieldInBlock
// CHECK-SYSV-x86_64: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret({{.*}}) {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* byval({{.*}}) align 8 {{%.*}})
// CHECK-WIN-x86_64: call void {{%.*}}(%TSo11BitfieldOneV* noalias nocapture sret({{.*}}) {{%.*}}, %objc_block* {{%.*}}, %TSo11BitfieldOneV* {{%.*}})
// CHECK-SYSV-x86_64: call void {{%.*}}(ptr noalias nocapture sret({{.*}}) {{%.*}}, ptr {{%.*}}, ptr byval({{.*}}) align 8 {{%.*}})
// CHECK-WIN-x86_64: call void {{%.*}}(ptr noalias nocapture sret({{.*}}) {{%.*}}, ptr {{%.*}}, ptr {{%.*}})
sil @testBitfieldInBlock : $@convention(thin) (@owned @convention(block) (BitfieldOne) -> BitfieldOne, BitfieldOne) -> BitfieldOne {
entry(%b : $@convention(block) (BitfieldOne) -> BitfieldOne, %x : $BitfieldOne):
%r = apply %b(%x) : $@convention(block) (BitfieldOne) -> BitfieldOne

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -16,8 +15,7 @@ class B: A {}
sil_vtable A {}
sil_vtable B {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5casts1BC* @unchecked_addr_cast(%T5casts1AC** noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: bitcast %T5casts1AC** %0 to %T5casts1BC**
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @unchecked_addr_cast(ptr noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
sil @unchecked_addr_cast : $(@in A) -> B {
entry(%a : $*A):
%b = unchecked_addr_cast %a : $*A to $*B
@@ -29,18 +27,16 @@ protocol CP: class {}
protocol CP2: class {}
@objc protocol OP: class {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @ref_to_raw_pointer_existential(%objc_object* %0, i8** %1) {{.*}} {
// CHECK: [[CAST:%.*]] = bitcast %objc_object* %0 to i8*
// CHECK: ret i8* [[CAST]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @ref_to_raw_pointer_existential(ptr %0, ptr %1) {{.*}} {
// CHECK: ret ptr %0
sil @ref_to_raw_pointer_existential : $@convention(thin) (@owned CP) -> Builtin.RawPointer {
entry(%p : $CP):
%r = ref_to_raw_pointer %p : $CP to $Builtin.RawPointer
return %r : $Builtin.RawPointer
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @raw_pointer_to_ref_existential(i8* %0) {{.*}} {
// CHECK: [[CAST:%.*]] = bitcast i8* %0 to %objc_object*
// CHECK: ret %objc_object* [[CAST]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @raw_pointer_to_ref_existential(ptr %0) {{.*}} {
// CHECK: ret ptr %0
sil @raw_pointer_to_ref_existential : $@convention(thin) (@owned Builtin.RawPointer) -> AnyObject {
entry(%p : $Builtin.RawPointer):
%r = raw_pointer_to_ref %p : $Builtin.RawPointer to $AnyObject
@@ -53,16 +49,16 @@ entry(%n : $Builtin.NativeObject):
return %r : $AnyObject
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8** } @u_cast_to_class_existential(%objc_object* %0)
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* {{%.*}}, %swift.type* {{%.*}}, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* %0, %swift.type* %1, %swift.protocol* %2) {{.*}} {
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @u_cast_to_class_existential(ptr %0)
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr {{%.*}}, ptr {{%.*}}, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr %1, ptr %2) {{.*}} {
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont
// CHECK: cont:
// CHECK: [[FIRST:%.*]] = insertvalue { i8*, i8** } undef, i8* %0, 0
// CHECK: [[SECOND:%.*]] = insertvalue { i8*, i8** } [[FIRST]], i8** [[WITNESS]], 1
// CHECK: ret { i8*, i8** } [[SECOND]]
// CHECK: [[FIRST:%.*]] = insertvalue { ptr, ptr } undef, ptr %0, 0
// CHECK: [[SECOND:%.*]] = insertvalue { ptr, ptr } [[FIRST]], ptr [[WITNESS]], 1
// CHECK: ret { ptr, ptr } [[SECOND]]
// CHECK: fail:
// CHECK: call void @llvm.trap()
sil @u_cast_to_class_existential : $@convention(thin) (@owned AnyObject) -> @owned CP {
@@ -71,26 +67,26 @@ entry(%a : $AnyObject):
return %p : $CP
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %swift.type*, i8** } @u_cast_to_existential_metatype(%swift.type* %0)
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_unconditional(i8* %1, %swift.type* %0, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @u_cast_to_existential_metatype(ptr %0)
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_unconditional(ptr %0, ptr %0, {{.*}} @"$s5casts2CPMp"
sil @u_cast_to_existential_metatype : $@convention(thin) (@owned @thick Any.Type) -> @owned @thick CP.Type {
entry(%a : $@thick Any.Type):
%p = unconditional_checked_cast %a : $@thick Any.Type to @thick CP.Type
return %p : $@thick CP.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8**, i8** } @u_cast_to_class_existential_2(%objc_object* %0)
// CHECK: call { i8*, i8**, i8** } @dynamic_cast_existential_2_unconditional(i8* {{%.*}}, %swift.type* {{%.*}}, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { i8*, i8**, i8** } @dynamic_cast_existential_2_unconditional(i8* %0, %swift.type* %1, %swift.protocol* %2, %swift.protocol* %3)
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @u_cast_to_class_existential_2(ptr %0)
// CHECK: call { ptr, ptr, ptr } @dynamic_cast_existential_2_unconditional(ptr {{%.*}}, ptr {{%.*}}, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { ptr, ptr, ptr } @dynamic_cast_existential_2_unconditional(ptr %0, ptr %1, ptr %2, ptr %3)
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont
// CHECK: cont:
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %3)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %3)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont1
// CHECK: cont1:
// CHECK: ret { i8*, i8**, i8** }
// CHECK: ret { ptr, ptr, ptr }
// CHECK: fail:
// CHECK: call void @llvm.trap()
sil @u_cast_to_class_existential_2 : $@convention(thin) (@owned AnyObject) -> @owned CP & CP2 {
@@ -99,21 +95,20 @@ entry(%a : $AnyObject):
return %p : $CP & CP2
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8**, i8** } @u_cast_to_class_existential_mixed(%objc_object* %0)
// CHECK: call %objc_object* @swift_dynamicCastObjCProtocolUnconditional
// CHECK: call { i8*, i8**, i8** } @dynamic_cast_existential_2_unconditional(i8* {{%.*}}, %swift.type* {{%.*}}, {{.*}} @"$s5casts2CPMp" {{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @u_cast_to_class_existential_mixed(ptr %0)
// CHECK: call ptr @swift_dynamicCastObjCProtocolUnconditional
// CHECK: call { ptr, ptr, ptr } @dynamic_cast_existential_2_unconditional(ptr {{%.*}}, ptr {{%.*}}, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
sil @u_cast_to_class_existential_mixed : $@convention(thin) (@owned AnyObject) -> @owned CP & OP & CP2 {
entry(%a : $AnyObject):
%p = unconditional_checked_cast %a : $AnyObject to CP & OP & CP2
return %p : $CP & OP & CP2
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %swift.type*, i8**, i8** } @u_cast_to_existential_metatype_mixed(%swift.type* %0)
// CHECK: call %swift.type* @swift_dynamicCastTypeToObjCProtocolUnconditional(%swift.type* %0, {{(i32|i64)}} 1, i8** {{%.*}})
// CHECK: [[CAST:%.*]] = call { i8*, i8**, i8** } @dynamic_cast_existential_2_unconditional(i8* {{.*}}, %swift.type* %0, {{.*}} @"$s5casts2CPMp" {{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK: [[OBJPTR:%.*]] = extractvalue { i8*, i8**, i8** } [[CAST]], 0
// CHECK: [[OBJ:%.*]] = bitcast i8* [[OBJPTR]] to %swift.type*
// CHECK: insertvalue {{.*}} [[OBJ]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @u_cast_to_existential_metatype_mixed(ptr %0)
// CHECK: call ptr @swift_dynamicCastTypeToObjCProtocolUnconditional(ptr %0, {{(i32|i64)}} 1, ptr {{%.*}})
// CHECK: [[CAST:%.*]] = call { ptr, ptr, ptr } @dynamic_cast_existential_2_unconditional(ptr {{.*}}, ptr %0, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK: [[OBJPTR:%.*]] = extractvalue { ptr, ptr, ptr } [[CAST]], 0
// CHECK: insertvalue {{.*}} [[OBJPTR]]
sil @u_cast_to_existential_metatype_mixed : $@convention(thin) (@owned @thick Any.Type) -> @owned @thick (CP & OP & CP2).Type {
entry(%a : $@thick Any.Type):
%p = unconditional_checked_cast %a : $@thick Any.Type to @thick (CP & OP & CP2).Type
@@ -121,16 +116,16 @@ entry(%a : $@thick Any.Type):
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8** } @c_cast_to_class_existential(%objc_object* %0)
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_conditional(i8* {{.*}}, %swift.type* %.Type, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { i8*, i8** } @dynamic_cast_existential_1_conditional(i8* %0, %swift.type* %1, %swift.protocol* %2)
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @c_cast_to_class_existential(ptr %0)
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_conditional(ptr {{.*}}, ptr %.Type, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { ptr, ptr } @dynamic_cast_existential_1_conditional(ptr %0, ptr %1, ptr %2)
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont
// CHECK: cont:
// CHECK: ret { i8*, i8** }
// CHECK: ret { ptr, ptr }
// CHECK: fail:
// CHECK: ret { i8*, i8** } zeroinitializer
// CHECK: ret { ptr, ptr } zeroinitializer
sil @c_cast_to_class_existential : $@convention(thin) (@owned AnyObject) -> @owned CP {
entry(%a : $AnyObject):
checked_cast_br %a : $AnyObject to CP, yea, nay
@@ -140,8 +135,8 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %swift.type*, i8** } @c_cast_to_existential_metatype(%swift.type* %0) {{.*}} {
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_conditional(i8* %1, %swift.type* %0, {{.*}} @"$s5casts2CPMp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @c_cast_to_existential_metatype(ptr %0) {{.*}} {
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_conditional(ptr %0, ptr %0, {{.*}} @"$s5casts2CPMp"
sil @c_cast_to_existential_metatype : $@convention(thin) (@owned @thick Any.Type) -> @owned @thick CP.Type {
entry(%a : $@thick Any.Type):
checked_cast_br %a : $@thick Any.Type to @thick CP.Type, yea, nay
@@ -151,20 +146,20 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8**, i8** } @c_cast_to_class_existential_2(%objc_object* %0)
// CHECK: call { i8*, i8**, i8** } @dynamic_cast_existential_2_conditional(i8* {{%.*}}, %swift.type* {{%.*}}, {{.*}} @"$s5casts2CPMp" {{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { i8*, i8**, i8** } @dynamic_cast_existential_2_conditional(i8* %0, %swift.type* %1, %swift.protocol* %2, %swift.protocol* %3)
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @c_cast_to_class_existential_2(ptr %0)
// CHECK: call { ptr, ptr, ptr } @dynamic_cast_existential_2_conditional(ptr {{%.*}}, ptr {{%.*}}, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} linkonce_odr hidden { ptr, ptr, ptr } @dynamic_cast_existential_2_conditional(ptr %0, ptr %1, ptr %2, ptr %3)
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %2)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont
// CHECK: cont:
// CHECK: [[WITNESS:%.*]] = call i8** @swift_conformsToProtocol(%swift.type* %1, %swift.protocol* %3)
// CHECK: [[IS_NULL:%.*]] = icmp eq i8** [[WITNESS]], null
// CHECK: [[WITNESS:%.*]] = call ptr @swift_conformsToProtocol(ptr %1, ptr %3)
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[WITNESS]], null
// CHECK: br i1 [[IS_NULL]], label %fail, label %cont1
// CHECK: cont1:
// CHECK: ret { i8*, i8**, i8** }
// CHECK: ret { ptr, ptr, ptr }
// CHECK: fail:
// CHECK: ret { i8*, i8**, i8** } zeroinitializer
// CHECK: ret { ptr, ptr, ptr } zeroinitializer
sil @c_cast_to_class_existential_2 : $@convention(thin) (@owned AnyObject) -> @owned CP & CP2 {
entry(%a : $AnyObject):
checked_cast_br %a : $AnyObject to CP & CP2, yea, nay
@@ -174,15 +169,15 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %objc_object*, i8**, i8** } @c_cast_to_class_existential_mixed(%objc_object* %0)
// CHECK: [[CAST:%.*]] = call %objc_object* @swift_dynamicCastObjCProtocolConditional
// CHECK: [[IS_NULL:%.*]] = icmp eq %objc_object* [[CAST]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @c_cast_to_class_existential_mixed(ptr %0)
// CHECK: [[CAST:%.*]] = call ptr @swift_dynamicCastObjCProtocolConditional
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[CAST]], null
// CHECK: br i1 [[IS_NULL]], label %cont, label %success
// CHECK: success:
// CHECK: call { i8*, i8**, i8** } @dynamic_cast_existential_2_conditional(i8* {{%.*}}, %swift.type* {{%.*}}, {{.*}} @"$s5casts2CPMp" {{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK: call { ptr, ptr, ptr } @dynamic_cast_existential_2_conditional(ptr {{%.*}}, ptr {{%.*}}, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK: br label %cont
// CHECK: cont:
// CHECK: phi %objc_object* [ [[CAST:%.*]], %success ], [ null, %entry ]
// CHECK: phi ptr [ [[CAST:%.*]], %success ], [ null, %entry ]
sil @c_cast_to_class_existential_mixed : $@convention(thin) (@owned AnyObject) -> @owned CP & OP & CP2 {
entry(%a : $AnyObject):
checked_cast_br %a : $AnyObject to CP & OP & CP2, yea, nay
@@ -192,12 +187,12 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { %swift.type*, i8**, i8** } @c_cast_to_existential_metatype_mixed(%swift.type* %0)
// CHECK: [[OBJC_CAST:%.*]] = call %swift.type* @swift_dynamicCastTypeToObjCProtocolConditional(%swift.type* %0, {{(i32|i64)}} 1, i8** {{%.*}})
// CHECK: [[IS_NULL:%.*]] = icmp eq %swift.type* [[OBJC_CAST]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr, ptr } @c_cast_to_existential_metatype_mixed(ptr %0)
// CHECK: [[OBJC_CAST:%.*]] = call ptr @swift_dynamicCastTypeToObjCProtocolConditional(ptr %0, {{(i32|i64)}} 1, ptr {{%.*}})
// CHECK: [[IS_NULL:%.*]] = icmp eq ptr [[OBJC_CAST]], null
// CHECK: br i1 [[IS_NULL]], label %cont, label %success
// CHECK: success:
// CHECK: call { i8*, i8**, i8** } @dynamic_cast_existential_2_conditional(i8* {{.*}}, %swift.type* %0, {{.*}} @"$s5casts2CPMp" {{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
// CHECK: call { ptr, ptr, ptr } @dynamic_cast_existential_2_conditional(ptr {{.*}}, ptr %0, {{.*}} @"$s5casts2CPMp"{{[^,]*}}, {{.*}} @"$s5casts3CP2Mp"
sil @c_cast_to_existential_metatype_mixed : $@convention(thin) (@owned @thick Any.Type) -> @owned @thick (CP & OP & CP2).Type {
entry(%a : $@thick Any.Type):
checked_cast_br %a : $@thick Any.Type to @thick (CP & OP & CP2).Type, yea, nay
@@ -207,10 +202,10 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @checked_upcast(%T5casts1AC* %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_upcast(ptr %0) {{.*}} {
// -- Don't need to check conformance of an object to AnyObject.
// CHECK-NOT: call %objc_object* @swift_dynamicCastObjCProtocolConditional
// CHECK: phi %objc_object*
// CHECK-NOT: call ptr @swift_dynamicCastObjCProtocolConditional
// CHECK: phi ptr
sil @checked_upcast : $@convention(thin) (@owned A) -> @owned AnyObject {
entry(%a : $A):
checked_cast_br %a : $A to AnyObject, yea, nay
@@ -220,15 +215,12 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5casts1AC* @checked_downcast_optional({{(i32|i64)}} %0) {{.*}} {
// CHECK: [[T0:%.*]] = inttoptr {{(i32|i64)}} %0 to %T5casts1AC*
// CHECK: [[OBJ_PTR:%.*]] = bitcast %T5casts1AC* [[T0]] to i8*
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1ACMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[METADATA_PTR:%.*]] = bitcast %swift.type* [[METADATA]] to i8*
// CHECK: [[RESULT_PTR:%.*]] = call i8* @swift_dynamicCastClass(i8* [[OBJ_PTR]], i8* [[METADATA_PTR]])
// CHECK: [[RESULT:%.*]] = bitcast i8* [[RESULT_PTR]] to %T5casts1AC*
// CHECK: [[COND:%.*]] = icmp ne %T5casts1AC* [[RESULT]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_downcast_optional({{(i32|i64)}} %0) {{.*}} {
// CHECK: [[T0:%.*]] = inttoptr {{(i32|i64)}} %0 to ptr
// CHECK: [[T1:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1ACMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T1]], 0
// CHECK: [[RESULT_PTR:%.*]] = call ptr @swift_dynamicCastClass(ptr [[T0]], ptr [[METADATA]])
// CHECK: [[COND:%.*]] = icmp ne ptr [[RESULT_PTR]], null
// CHECK: br i1 [[COND]]
sil @checked_downcast_optional : $@convention(thin) (Optional<A>) -> @owned A {
entry(%a : $Optional<A>):
@@ -239,12 +231,12 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_downcast_optional_metatype({{(i32|i64)}} %0) {{.*}} {
// CHECK: [[VALUE:%.*]] = inttoptr {{(i32|i64)}} %0 to %swift.type*
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_downcast_optional_metatype({{(i32|i64)}} %0) {{.*}} {
// CHECK: [[VALUE:%.*]] = inttoptr {{(i32|i64)}} %0 to ptr
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1BCMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[RESULT:%.*]] = call %swift.type* @swift_dynamicCastMetatype(%swift.type* [[VALUE]], %swift.type* [[METADATA]])
// CHECK: [[COND:%.*]] = icmp ne %swift.type* [[RESULT]], null
// CHECK: [[RESULT:%.*]] = call ptr @swift_dynamicCastMetatype(ptr [[VALUE]], ptr [[METADATA]])
// CHECK: [[COND:%.*]] = icmp ne ptr [[RESULT]], null
// CHECK: br i1 [[COND]]
sil @checked_downcast_optional_metatype : $@convention(thin) (Optional<@thick A.Type>) -> @thick B.Type {
entry(%a : $Optional<@thick A.Type>):
@@ -255,12 +247,12 @@ nay:
unreachable
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_downcast_optional_exmetatype({{(i32 %0, i32 %1|i64 %0, i64 %1)}}) {{.*}} {
// CHECK: [[VALUE:%.*]] = inttoptr {{(i32|i64)}} %0 to %swift.type*
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_downcast_optional_exmetatype({{(i32 %0, i32 %1|i64 %0, i64 %1)}}) {{.*}} {
// CHECK: [[VALUE:%.*]] = inttoptr {{(i32|i64)}} %0 to ptr
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1BCMa"([[INT]] 0)
// CHECK: [[METADATA:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[RESULT:%.*]] = call %swift.type* @swift_dynamicCastMetatype(%swift.type* [[VALUE]], %swift.type* [[METADATA]])
// CHECK: [[COND:%.*]] = icmp ne %swift.type* [[RESULT]], null
// CHECK: [[RESULT:%.*]] = call ptr @swift_dynamicCastMetatype(ptr [[VALUE]], ptr [[METADATA]])
// CHECK: [[COND:%.*]] = icmp ne ptr [[RESULT]], null
// CHECK: br i1 [[COND]]
sil @checked_downcast_optional_exmetatype : $@convention(thin) (Optional<@thick CP.Type>) -> @thick B.Type {
entry(%a : $Optional<@thick CP.Type>):
@@ -273,12 +265,11 @@ nay:
// CHECK: define {{(dllexport )?}}{{(protected )?}}swiftcc {{.*}} @checked_downcast_optional_class_to_ex([[INT]] %0)
// CHECK: entry:
// CHECK: [[V1:%.*]] = inttoptr [[INT]] %0 to %T5casts1AC*
// CHECK: [[V2:%.*]] = icmp ne %T5casts1AC* [[V1]], null
// CHECK: [[V1:%.*]] = inttoptr [[INT]] %0 to ptr
// CHECK: [[V2:%.*]] = icmp ne ptr [[V1]], null
// CHECK: br i1 [[V2]], label %[[LBL:.*]], label
// CHECK: [[LBL]]:
// CHECK: [[V4:%.*]] = bitcast %T5casts1AC* [[V1]] to %swift.type**
// CHECK: load %swift.type*, %swift.type** [[V4]]
// CHECK: load ptr, ptr [[V1]]
sil @checked_downcast_optional_class_to_ex : $@convention(thin) (@guaranteed Optional<A>) -> @owned Optional<CP> {
bb0(%0 : $Optional<A>):
checked_cast_br %0 : $Optional<A> to CP, bb1, bb2
@@ -304,18 +295,16 @@ entry(%e : $@thick Any.Type):
checked_cast_br %a : $@thick NotClass.Type to AnyObject, a_yea, a_nay
a_yea(%1 : $AnyObject):
%b = metatype $@thick A.Type
// CHECK: bitcast %swift.type* {{%.*}} to %objc_object*
checked_cast_br %b : $@thick A.Type to AnyObject, b_yea, b_nay
b_yea(%2 : $AnyObject):
%c = metatype $@objc_metatype A.Type
// CHECK: bitcast %objc_class* {{%.*}} to %objc_object*
checked_cast_br %c : $@objc_metatype A.Type to AnyObject, c_yea, c_nay
c_yea(%3 : $AnyObject):
%d = metatype $@thick T.Type
// CHECK: call %objc_object* @swift_dynamicCastMetatypeToObjectConditional(%swift.type* %T)
// CHECK: call ptr @swift_dynamicCastMetatypeToObjectConditional(ptr %T)
checked_cast_br %d : $@thick T.Type to AnyObject, d_yea, d_nay
d_yea(%4 : $AnyObject):
// CHECK: call %objc_object* @swift_dynamicCastMetatypeToObjectConditional(%swift.type* %0)
// CHECK: call ptr @swift_dynamicCastMetatypeToObjectConditional(ptr %0)
checked_cast_br %e : $@thick Any.Type to AnyObject, e_yea, e_nay
e_yea(%5 : $AnyObject):
return undef : $()
@@ -345,7 +334,7 @@ entry(%x : $OB):
return %x : $OB
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5casts1BC* @checked_object_to_object_casts(%T5casts1AC* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_object_to_object_casts(ptr %0)
// CHECK: @swift_dynamicCastClassUnconditional
sil @checked_object_to_object_casts : $@convention(thin) (A) -> B {
entry(%a : $A):
@@ -353,7 +342,7 @@ entry(%a : $A):
return %b : $B
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5casts2OBC* @checked_objc_object_to_object_casts(%T5casts2OAC* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_objc_object_to_object_casts(ptr %0)
// CHECK: @swift_dynamicCastClassUnconditional
sil @checked_objc_object_to_object_casts : $@convention(thin) (OA) -> OB {
entry(%a : $OA):
@@ -369,7 +358,7 @@ sil_vtable C {}
// CHECK-LABEL: define{{.*}} @cast_protocol_composition_with_anyobject
// CHECK: [[C:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1CCMa"
// CHECK: [[C_META:%.*]] = extractvalue %swift.metadata_response [[C]], 0
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_superclass_conditional({{.*}}, %swift.type* [[C_META]], %swift.protocol* {{.*}}@"$s5casts1PMp"
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_superclass_conditional({{.*}}, ptr [[C_META]], ptr {{.*}}@"$s5casts1PMp"
sil @cast_protocol_composition_with_anyobject : $@convention(thin) (@owned P & AnyObject ) -> @owned Optional<C & P> {
bb0(%0: $P & AnyObject):
@@ -391,7 +380,7 @@ bb3(%11 : $Optional<C & P>):
// CHECK-LABEL: define{{.*}} @cast_protocol_with_anyobject
// CHECK: [[C:%.*]] = call swiftcc %swift.metadata_response @"$s5casts1CCMa"
// CHECK: [[C_META:%.*]] = extractvalue %swift.metadata_response [[C]], 0
// CHECK: call { i8*, i8** } @dynamic_cast_existential_1_superclass_conditional({{.*}}, %swift.type* [[C_META]], %swift.protocol* {{.*}}@"$s5casts10PAnyObjectMp"
// CHECK: call { ptr, ptr } @dynamic_cast_existential_1_superclass_conditional({{.*}}, ptr [[C_META]], ptr {{.*}}@"$s5casts10PAnyObjectMp"
sil @cast_protocol_with_anyobject : $@convention(thin) (@owned PAnyObject ) -> @owned Optional<C & PAnyObject> {
bb0(%0: $PAnyObject):
checked_cast_br %0 : $PAnyObject to C & PAnyObject, bb1, bb2

View File

@@ -1,14 +1,10 @@
// RUN: %empty-directory(%t)
// RUN: %{python} %utils/chex.py < %s > %t/cf.sil
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -sdk %S/Inputs %t/cf.sil -emit-ir -import-cf-types | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %t/cf.sil -DINT=i%target-ptrsize -check-prefix CHECK-%target-import-type -check-prefix CHECK-%target-import-type-%target-ptrsize
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs %t/cf.sil -emit-ir -import-cf-types
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs %t/cf.sil -emit-ir -import-cf-types | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %t/cf.sil -DINT=i%target-ptrsize -check-prefix CHECK-%target-import-type -check-prefix CHECK-%target-import-type-%target-ptrsize
// REQUIRES: CPU=i386 || CPU=x86_64
// CHECK: [[TYPE:%swift.type]] = type
// CHECK: [[REFRIGERATOR:%TSo17CCRefrigeratorRefa]] = type
// CHECK: [[MUTABLE_REFRIGERATOR:%TSo24CCMutableRefrigeratorRefa]] = type
// CHECK: [[OBJC:%objc_object]] = type
// CHECK: [[MUTABLE_REFRIGERATOR_NAME:@.*]] = private constant [52 x i8] c"CCMutableRefrigerator\00NCCMutableRefrigeratorRef\00St\00\00"
@@ -21,18 +17,18 @@
// CHECK: @"$sSo24CCMutableRefrigeratorRefaMf" = linkonce_odr hidden global <{ {{.*}} }> <{
// -- value witness table
// CHECK-DIRECT-SAME: i8** @"$sBOWV",
// CHECK-INDIRECT-SAME: i8** null,
// CHECK-64-SAME: i64 515, {{.*}}"$sSo24CCMutableRefrigeratorRefaMn", %swift.type* null, i8* null }>
// CHECK-DIRECT-SAME: ptr @"$sBOWV",
// CHECK-INDIRECT-SAME: ptr null,
// CHECK-64-SAME: i64 515, {{.*}}"$sSo24CCMutableRefrigeratorRefaMn", ptr null, ptr null }>
// CHECK: @"$sSo17CCRefrigeratorRefaMf" = linkonce_odr hidden
// CHECK-DIRECT-SAME: constant
// CHECK-INDIRECT-SAME: global
// CHECK-SAME: <{ {{.*}} }> <{
// -- value witness table
// CHECK-DIRECT-SAME: i8** @"$sBOWV",
// CHECK-INDIRECT-SAME: i8** null,
// CHECK-SAME: [[INT]] 515, {{.*}}"$sSo17CCRefrigeratorRefaMn", [[TYPE]]* null, i8* null }>
// CHECK-DIRECT-SAME: ptr @"$sBOWV",
// CHECK-INDIRECT-SAME: ptr null,
// CHECK-SAME: [[INT]] 515, {{.*}}"$sSo17CCRefrigeratorRefaMn", ptr null, ptr null }>
sil_stage canonical
@@ -51,26 +47,23 @@ bb0(%0 : $CCRefrigerator, %1: $CCMutableRefrigerator):
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @call_generic
// CHECK-SAME: ([[REFRIGERATOR]]* %0, [[MUTABLE_REFRIGERATOR]]* %1) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast [[REFRIGERATOR]]* %0 to [[OBJC]]*
// CHECK-NEXT: [[T1:%.*]] = call swiftcc %swift.metadata_response @"$sSo17CCRefrigeratorRefaMa"([[INT]] 0)
// CHECK-SAME: (ptr %0, ptr %1) {{.*}} {
// CHECK: [[T1:%.*]] = call swiftcc %swift.metadata_response @"$sSo17CCRefrigeratorRefaMa"([[INT]] 0)
// CHECK-NEXT: [[T2:%.*]] = extractvalue %swift.metadata_response [[T1]], 0
// CHECK-NEXT: call swiftcc void @generic_function([[OBJC]]* [[T0]], [[TYPE]]* [[T2]])
// CHECK: [[T0:%.*]] = bitcast [[MUTABLE_REFRIGERATOR]]* %1 to [[OBJC]]*
// CHECK-NEXT: [[T1:%.*]] = call swiftcc %swift.metadata_response @"$sSo24CCMutableRefrigeratorRefaMa"([[INT]] 0)
// CHECK-NEXT: call swiftcc void @generic_function(ptr %0, ptr [[T2]])
// CHECK: [[T1:%.*]] = call swiftcc %swift.metadata_response @"$sSo24CCMutableRefrigeratorRefaMa"([[INT]] 0)
// CHECK-NEXT: [[T2:%.*]] = extractvalue %swift.metadata_response [[T1]], 0
// CHECK-NEXT: call swiftcc void @generic_function([[OBJC]]* [[T0]], [[TYPE]]* [[T2]])
// CHECK-NEXT: call swiftcc void @generic_function(ptr %1, ptr [[T2]])
// CHECK-NEXT: ret void
// CHECK-LABEL: define linkonce_odr hidden swiftcc %swift.metadata_response @"$sSo17CCRefrigeratorRefaMa"(
// CHECK: call swiftcc %swift.metadata_response @swift_getForeignTypeMetadata([[INT]] %0,
// CHECK-SAME: @"$sSo17CCRefrigeratorRefaMf"
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$sSo24CCMutableRefrigeratorRefaMr"(%swift.type* %0, i8* %1, i8** %2)
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$sSo24CCMutableRefrigeratorRefaMr"(ptr %0, ptr %1, ptr %2)
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$sSo17CCRefrigeratorRefaMa"([[INT]] 255)
// CHECK-NEXT: [[T1:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: extractvalue %swift.metadata_response [[T0]], 1
// CHECK-NEXT: [[T2:%.*]] = bitcast %swift.type* %0 to %swift.type**
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T2]], i32 2
// CHECK-NEXT: store %swift.type* [[T1]], %swift.type** [[T3]], align
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr %0, i32 2
// CHECK-NEXT: store ptr [[T1]], ptr [[T3]], align
// CHECK-NEXT: ret %swift.metadata_response zeroinitializer

View File

@@ -1,12 +1,10 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -sdk %S/Inputs -primary-file %s -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -I %t | %FileCheck %s
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs -primary-file %s -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -I %t
// RUN: %target-swift-frontend -enable-objc-interop -sdk %S/Inputs -primary-file %s -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -I %t | %FileCheck %s
// RUN: %empty-directory(%t/Empty.framework/Modules/Empty.swiftmodule)
// RUN: %target-swift-frontend -emit-module-path %t/Empty.framework/Modules/Empty.swiftmodule/%target-swiftmodule-name %S/../Inputs/empty.swift -module-name Empty -I %t
// RUN: %target-swift-frontend %use_no_opaque_pointers -sdk %S/Inputs -primary-file %s -I %t -F %t -DIMPORT_EMPTY -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -enable-objc-interop | %FileCheck %s
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -I %t -F %t -DIMPORT_EMPTY -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -enable-objc-interop
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -I %t -F %t -DIMPORT_EMPTY -O -disable-sil-perf-optzns -disable-llvm-optzns -emit-ir -Xcc -fstack-protector -enable-objc-interop | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: objc_interop
@@ -17,7 +15,7 @@
import gizmo
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline16CallStaticInlineC10ReturnZeros5Int64VyF"(%T12clang_inline16CallStaticInlineC* swiftself %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline16CallStaticInlineC10ReturnZeros5Int64VyF"(ptr swiftself %0) {{.*}} {
class CallStaticInline {
func ReturnZero() -> Int64 { return Int64(zero()) }
}
@@ -25,7 +23,7 @@ class CallStaticInline {
// CHECK-LABEL: define internal i32 @zero()
// CHECK-SAME: [[INLINEHINT_SSP_UWTABLE:#[0-9]+]] {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline17CallStaticInline2C10ReturnZeros5Int64VyF"(%T12clang_inline17CallStaticInline2C* swiftself %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline17CallStaticInline2C10ReturnZeros5Int64VyF"(ptr swiftself %0) {{.*}} {
class CallStaticInline2 {
func ReturnZero() -> Int64 { return Int64(wrappedZero()) }
}

View File

@@ -2,22 +2,21 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -sdk %S/Inputs -primary-file %s -enable-objc-interop -emit-ir -module-name clang_inline -I %t | %FileCheck %s
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -enable-objc-interop -emit-ir -module-name clang_inline -I %t
// RUN: %target-swift-frontend -sdk %S/Inputs -primary-file %s -enable-objc-interop -emit-ir -module-name clang_inline -I %t | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: objc_interop
import gizmo
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline16CallStaticInlineC10ReturnZeros5Int64VyF"(%T12clang_inline16CallStaticInlineC* swiftself %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline16CallStaticInlineC10ReturnZeros5Int64VyF"(ptr swiftself %0) {{.*}} {
class CallStaticInline {
func ReturnZero() -> Int64 { return Int64(wrappedZero()) }
}
// CHECK-LABEL: define internal i32 @wrappedZero() {{#[0-9]+}} {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline17CallStaticInline2C10ReturnZeros5Int64VyF"(%T12clang_inline17CallStaticInline2C* swiftself %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc i64 @"$s12clang_inline17CallStaticInline2C10ReturnZeros5Int64VyF"(ptr swiftself %0) {{.*}} {
class CallStaticInline2 {
func ReturnZero() -> Int64 { return Int64(zero()) }
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// REQUIRES: CPU=x86_64
@@ -10,8 +9,6 @@ import Swift
// CHECK-DAG: [[TYPE:%swift.type]] = type
// CHECK-DAG: [[OBJCCLASS:%objc_class]] = type
// CHECK-DAG: [[OPAQUE:%swift.opaque]] = type opaque
// CHECK-DAG: [[C_CLASS:%T5class1CC]] = type
// CHECK-DAG: [[OBJCOBJ:%objc_object]] = type
class C {}
sil_vtable C {}
@@ -24,32 +21,31 @@ sil_vtable C {}
// CHECK-SAME: i32 16,
// CHECK-SAME: i32 16,
// CHECK-SAME: i32 0,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* getelementptr inbounds ([13 x i8], [13 x i8]* [[C_NAME]], i64 0, i64 0),
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr [[C_NAME]],
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null
// CHECK-SAME: }
// CHECK: @"$s5class1CCMf" = internal global <{ {{.*}} }> <{
// CHECK-SAME: void ([[C_CLASS]]*)* @"$s5class1CCfD",
// CHECK-DIRECT-SAME: i8** @"$sBoWV",
// CHECK-INDIRECT-SAME: i8** null,
// CHECK-SAME: i64 ptrtoint ([[OBJCCLASS]]* @"$s5class1CCMm" to i64),
// CHECK-DIRECT-SAME: [[OBJCCLASS]]* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-INDIRECT-SAME: %swift.type* null,
// CHECK-SAME: [[OPAQUE]]* @_objc_empty_cache,
// CHECK-SAME: [[OPAQUE]]* null,
// CHECK-SAME: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC5class1C to i64), i64 [[IS_SWIFT_BIT:1|2]])
// CHECK-SAME: ptr @"$s5class1CCfD",
// CHECK-DIRECT-SAME: ptr @"$sBoWV",
// CHECK-INDIRECT-SAME: ptr null,
// CHECK-SAME: i64 ptrtoint (ptr @"$s5class1CCMm" to i64),
// CHECK-DIRECT-SAME: ptr @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-INDIRECT-SAME: ptr null,
// CHECK-SAME: ptr @_objc_empty_cache,
// CHECK-SAME: ptr null,
// CHECK-SAME: i64 add (i64 ptrtoint (ptr @_DATA__TtC5class1C to i64), i64 [[IS_SWIFT_BIT:1|2]])
// CHECK-SAME: }>
// Destroying destructor
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc [[REF]]* @"$s5class1CCfd"([[C_CLASS]]* swiftself %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @"$s5class1CCfd"(ptr swiftself %0) {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: [[OBJ_PTR:%[a-zA-Z0-9]+]] = bitcast [[C_CLASS]]* %0 to [[REF]]*
// CHECK-NEXT: ret [[REF]]* [[OBJ_PTR]]
// CHECK-NEXT: ret ptr %0
sil @$s5class1CCfd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject {
bb0(%0 : $C):
%1 = unchecked_ref_cast %0 : $C to $Builtin.NativeObject // user: %2
@@ -57,60 +53,52 @@ bb0(%0 : $C):
}
// Deallocating destructor
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s5class1CCfD"([[C_CLASS]]* swiftself %0)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @"$s5class1CCfD"(ptr swiftself %0)
sil @$s5class1CCfD : $@convention(method) (@owned C) -> () {
bb0(%0 : $C):
// CHECK-NEXT: entry
// CHECK-NEXT: [[SELF:%[a-zA-Z0-9]+]] = call swiftcc [[REF]]* @"$s5class1CCfd"([[C_CLASS]]* swiftself %0)
// CHECK-NEXT: [[SELF_OBJ:%[a-zA-Z0-9]+]] = bitcast [[REF]]* [[SELF]] to [[C_CLASS]]*
// CHECK-NEXT: [[SELF:%[a-zA-Z0-9]+]] = call swiftcc ptr @"$s5class1CCfd"(ptr swiftself %0)
%1 = function_ref @$s5class1CCfd : $@convention(method) (@owned C) -> @owned Builtin.NativeObject // user: %2
%2 = apply %1(%0) : $@convention(method) (@owned C) -> @owned Builtin.NativeObject // user: %3
%3 = unchecked_ref_cast %2 : $Builtin.NativeObject to $C // user: %4
// CHECK-NEXT: [[SELF:%[a-zA-Z0-9]+]] = bitcast [[C_CLASS]]* [[SELF_OBJ]] to [[REF]]*
// CHECK-NEXT: call void @swift_deallocClassInstance([[REF]]* [[SELF]], i64 16, i64 7)
// CHECK-NEXT: call void @swift_deallocClassInstance(ptr [[SELF]], i64 16, i64 7)
dealloc_ref %3 : $C // id: %4
// CHECK-NEXT: ret void
%5 = tuple () // user: %6
return %5 : $() // id: %6
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc [[REF]]* @unchecked_ref_cast_cast([[C_CLASS]]* %0)
// CHECK: bitcast [[C_CLASS]]* {{%.*}} to [[REF]]*
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @unchecked_ref_cast_cast(ptr %0)
sil @unchecked_ref_cast_cast : $@convention(thin) (C) -> Builtin.NativeObject {
entry(%c : $C):
%r = unchecked_ref_cast %c : $C to $Builtin.NativeObject
return %r : $Builtin.NativeObject
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc [[OBJCOBJ]]* @ref_to_objc_pointer_cast([[C_CLASS]]* %0)
// CHECK: bitcast [[C_CLASS]]* %0 to [[OBJCOBJ]]*
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @ref_to_objc_pointer_cast(ptr %0)
sil @ref_to_objc_pointer_cast : $@convention(thin) (C) -> Builtin.AnyObject {
entry(%c : $C):
%r = unchecked_ref_cast %c : $C to $Builtin.AnyObject
return %r : $Builtin.AnyObject
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5class1CC* @alloc_ref_dynamic(%swift.type* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @alloc_ref_dynamic(ptr %0)
sil @alloc_ref_dynamic : $@convention(thin) (@thick C.Type) -> @owned C {
bb0(%0 : $@thick C.Type):
// CHECK: [[META_PTR:%[0-9]+]] = bitcast %swift.type* %0 to i8*
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, i8* [[META_PTR]], i32 48
// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i32*
// CHECK: [[SIZE32:%.*]] = load i32, i32* [[T1]], align 8
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, ptr %0, i32 48
// CHECK: [[SIZE32:%.*]] = load i32, ptr [[T0]], align 8
// CHECK: [[SIZE:%.*]] = zext i32 [[SIZE32]] to i64
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, i8* [[META_PTR]], i32 52
// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i16*
// CHECK: [[ALIGN16:%.*]] = load i16, i16* [[T1]], align 4
// CHECK: [[T0:%.*]] = getelementptr inbounds i8, ptr %0, i32 52
// CHECK: [[ALIGN16:%.*]] = load i16, ptr [[T0]], align 4
// CHECK: [[ALIGN:%.*]] = zext i16 [[ALIGN16]] to i64
// CHECK: [[RESULT:%[0-9]+]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* %0, i64 [[SIZE]], i64 [[ALIGN]])
// CHECK: [[RESULT:%[0-9]+]] = call noalias ptr @swift_allocObject(ptr %0, i64 [[SIZE]], i64 [[ALIGN]])
%1 = alloc_ref_dynamic %0 : $@thick C.Type, $C
return %1 : $C
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5class1CC* @autorelease(%T5class1CC* %0) {{.*}} {
// CHECK: %1 = bitcast %T5class1CC* %0 to i8*
// CHECK: call i8* @llvm.objc.autorelease(i8* %1)
// CHECK: ret %T5class1CC* %0
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @autorelease(ptr %0) {{.*}} {
// CHECK: call ptr @llvm.objc.autorelease(ptr %0)
// CHECK: ret ptr %0
sil @autorelease : $@convention(thin) (@owned C) -> C {
entry(%c : $C):
autorelease_value %c : $C
@@ -118,8 +106,8 @@ entry(%c : $C):
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i64 @autorelease_optional(i64 %0) {{.*}} {
// CHECK: %1 = inttoptr i64 %0 to i8*
// CHECK: call i8* @llvm.objc.autorelease(i8* %1)
// CHECK: %1 = inttoptr i64 %0 to ptr
// CHECK: call ptr @llvm.objc.autorelease(ptr %1)
// CHECK: ret i64 %0
sil @autorelease_optional : $@convention(thin) (@owned C?) -> C? {
entry(%c : $C?):
@@ -165,7 +153,7 @@ entry(%x : $ClassConstrainedGenericField<ClassConstraintConformance>):
%b = load %a : $*ClassConstraintConformance
return %b : $ClassConstraintConformance
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %T5class26ClassConstraintConformanceC* @fixed_class_generic_field(%T5class28ClassConstrainedGenericFieldCyAA0B21ConstraintConformanceCG* %0)
// CHECK: [[FIELD_ADDR_GENERIC:%.*]] = getelementptr inbounds %T5class28ClassConstrainedGenericFieldCyAA0B21ConstraintConformanceCG, %T5class28ClassConstrainedGenericFieldCyAA0B21ConstraintConformanceCG* %0, i32 0, i32 1
// CHECK: load %T5class26ClassConstraintConformanceC*, %T5class26ClassConstraintConformanceC** [[FIELD_ADDR_GENERIC]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @fixed_class_generic_field(ptr %0)
// CHECK: [[FIELD_ADDR_GENERIC:%.*]] = getelementptr inbounds %T5class28ClassConstrainedGenericFieldCyAA0B21ConstraintConformanceCG, ptr %0, i32 0, i32 1
// CHECK: load ptr, ptr [[FIELD_ADDR_GENERIC]]

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -module-name class_bounded_generics -enable-objc-interop -emit-ir -primary-file %s -disable-objc-attr-requires-foundation-module | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -module-name class_bounded_generics -enable-objc-interop -emit-ir -primary-file %s -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend -module-name class_bounded_generics -enable-objc-interop -emit-ir -primary-file %s -disable-objc-attr-requires-foundation-module | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: CPU=x86_64
@@ -55,11 +54,11 @@ class ClassProtocolFieldClass {
}
}
// CHECK-DAG: %T22class_bounded_generics017ClassGenericFieldD0C = type <{ %swift.refcounted, %TSi, %objc_object*, %TSi }>
// CHECK-DAG: %T22class_bounded_generics23ClassGenericFieldStructV = type <{ %TSi, %objc_object*, %TSi }>
// CHECK-DAG: %T22class_bounded_generics017ClassGenericFieldD0C = type <{ %swift.refcounted, %TSi, ptr, %TSi }>
// CHECK-DAG: %T22class_bounded_generics23ClassGenericFieldStructV = type <{ %TSi, ptr, %TSi }>
// CHECK-DAG: %T22class_bounded_generics24ClassProtocolFieldStructV = type <{ %TSi, %T22class_bounded_generics10ClassBoundP, %TSi }>
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s22class_bounded_generics0a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, %swift.type* %T, i8** %T.ClassBound)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics0a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %T, ptr %T.ClassBound)
func class_bounded_archetype<T : ClassBound>(_ x: T) -> T {
return x
}
@@ -67,40 +66,35 @@ func class_bounded_archetype<T : ClassBound>(_ x: T) -> T {
class SomeClass {}
class SomeSubclass : SomeClass {}
// CHECK-LABEL: define hidden swiftcc %T22class_bounded_generics9SomeClassC* @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics9SomeClassC* %0, %swift.type* %T)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %T)
func superclass_bounded_archetype<T : SomeClass>(_ x: T) -> T {
return x
}
// CHECK-LABEL: define hidden swiftcc { %T22class_bounded_generics9SomeClassC*, %T22class_bounded_generics12SomeSubclassC* } @"$s22class_bounded_generics011superclass_B15_archetype_call{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics9SomeClassC* %0, %T22class_bounded_generics12SomeSubclassC* %1)
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics011superclass_B15_archetype_call{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %1)
func superclass_bounded_archetype_call(_ x: SomeClass, y: SomeSubclass) -> (SomeClass, SomeSubclass) {
return (superclass_bounded_archetype(x),
superclass_bounded_archetype(y));
// CHECK: [[SOMECLASS_RESULT:%.*]] = call swiftcc %T22class_bounded_generics9SomeClassC* @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics9SomeClassC* {{%.*}}, {{.*}})
// CHECK: [[SOMESUPERCLASS_IN:%.*]] = bitcast %T22class_bounded_generics12SomeSubclassC* {{%.*}} to %T22class_bounded_generics9SomeClassC*
// CHECK: [[SOMESUPERCLASS_RESULT:%.*]] = call swiftcc %T22class_bounded_generics9SomeClassC* @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics9SomeClassC* [[SOMESUPERCLASS_IN]], {{.*}})
// CHECK: bitcast %T22class_bounded_generics9SomeClassC* [[SOMESUPERCLASS_RESULT]] to %T22class_bounded_generics12SomeSubclassC*
// CHECK: [[SOMECLASS_RESULT:%.*]] = call swiftcc ptr @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr {{%.*}}, {{.*}})
// CHECK: [[SOMESUPERCLASS_RESULT:%.*]] = call swiftcc ptr @"$s22class_bounded_generics011superclass_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr {{%.*}}, {{.*}})
}
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics0a1_B17_archetype_method{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, %objc_object* %1, %swift.type* %T, i8** %T.ClassBoundBinary)
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics0a1_B17_archetype_method{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %1, ptr %T, ptr %T.ClassBoundBinary)
func class_bounded_archetype_method<T : ClassBoundBinary>(_ x: T, y: T) {
x.classBoundMethod()
// CHECK: [[INHERITED_GEP:%.*]] = getelementptr inbounds i8*, i8** %T.ClassBoundBinary, i32 1
// CHECK: [[INHERITED:%.*]] = load i8*, i8** [[INHERITED_GEP]]
// CHECK: [[INHERITED_WTBL:%.*]] = bitcast i8* [[INHERITED]] to i8**
// CHECK: [[WITNESS_GEP:%.*]] = getelementptr inbounds i8*, i8** [[INHERITED_WTBL]], i32 1
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_GEP]], align 8
// CHECK: [[WITNESS_FUNC:%.*]] = bitcast i8* [[WITNESS]] to void (%objc_object*, %swift.type*, i8**)
// CHECK: call swiftcc void [[WITNESS_FUNC]](%objc_object* swiftself %0, %swift.type* {{.*}}, i8** [[INHERITED_WTBL]])
// CHECK: [[INHERITED_GEP:%.*]] = getelementptr inbounds ptr, ptr %T.ClassBoundBinary, i32 1
// CHECK: [[INHERITED:%.*]] = load ptr, ptr [[INHERITED_GEP]]
// CHECK: [[WITNESS_GEP:%.*]] = getelementptr inbounds ptr, ptr [[INHERITED]], i32 1
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_GEP]], align 8
// CHECK: call swiftcc void [[WITNESS]](ptr swiftself %0, ptr {{.*}}, ptr [[INHERITED]])
x.classBoundBinaryMethod(y)
// CHECK-NOT: call %objc_object* @swift_unknownObjectRetain(%objc_object* returned [[Y:%.*]])
// CHECK: [[WITNESS_ENTRY:%.*]] = getelementptr inbounds i8*, i8** %T.ClassBoundBinary, i32 2
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ENTRY]], align 8
// CHECK: [[WITNESS_FUNC:%.*]] = bitcast i8* [[WITNESS]] to void (%objc_object*, %objc_object*, %swift.type*, i8**)
// CHECK: call swiftcc void [[WITNESS_FUNC]](%objc_object* %1, %objc_object* swiftself %0, %swift.type* %T, i8** %T.ClassBoundBinary)
// CHECK-NOT: call ptr @swift_unknownObjectRetain(ptr returned [[Y:%.*]])
// CHECK: [[WITNESS_ENTRY:%.*]] = getelementptr inbounds ptr, ptr %T.ClassBoundBinary, i32 2
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_ENTRY]], align 8
// CHECK: call swiftcc void [[WITNESS]](ptr %1, ptr swiftself %0, ptr %T, ptr %T.ClassBoundBinary)
}
// CHECK-LABEL: define hidden swiftcc { %objc_object*, %objc_object* } @"$s22class_bounded_generics0a1_B16_archetype_tuple{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, %swift.type* %T, i8** %T.ClassBound)
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics0a1_B16_archetype_tuple{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %T, ptr %T.ClassBound)
func class_bounded_archetype_tuple<T : ClassBound>(_ x: T) -> (T, T) {
return (x, x)
}
@@ -112,24 +106,22 @@ class ConcreteClass : ClassBoundBinary, NotClassBound {
func notClassBoundBinaryMethod(_ x: ConcreteClass) {}
}
// CHECK-LABEL: define hidden swiftcc %T22class_bounded_generics13ConcreteClassC* @"$s22class_bounded_generics05call_a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics13ConcreteClassC* %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics05call_a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr %0) {{.*}} {
func call_class_bounded_archetype(_ x: ConcreteClass) -> ConcreteClass {
return class_bounded_archetype(x)
// CHECK: [[IN:%.*]] = bitcast %T22class_bounded_generics13ConcreteClassC* {{%.*}} to %objc_object*
// CHECK: [[OUT_ORIG:%.*]] = call swiftcc %objc_object* @"$s22class_bounded_generics0a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(%objc_object* [[IN]], {{.*}})
// CHECK: [[OUT:%.*]] = bitcast %objc_object* [[OUT_ORIG]] to %T22class_bounded_generics13ConcreteClassC*
// CHECK: ret %T22class_bounded_generics13ConcreteClassC* [[OUT]]
// CHECK: [[OUT_ORIG:%.*]] = call swiftcc ptr @"$s22class_bounded_generics0a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr {{%.*}}, {{.*}})
// CHECK: ret ptr [[OUT_ORIG]]
}
// CHECK: define hidden swiftcc void @"$s22class_bounded_generics04not_a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.opaque* noalias nocapture %1, %swift.type* %T, i8** %T.NotClassBound)
// CHECK: define hidden swiftcc void @"$s22class_bounded_generics04not_a1_B10_archetype{{[_0-9a-zA-Z]*}}F"(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T, ptr %T.NotClassBound)
func not_class_bounded_archetype<T : NotClassBound>(_ x: T) -> T {
return x
}
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s22class_bounded_generics0a1_b18_archetype_to_not_a1_B0{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, %swift.type* %T, i8** %T.ClassBound, i8** %T.NotClassBound) {{.*}} {
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics0a1_b18_archetype_to_not_a1_B0{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %T, ptr %T.ClassBound, ptr %T.NotClassBound) {{.*}} {
func class_bounded_archetype_to_not_class_bounded
<T: ClassBound & NotClassBound>(_ x:T) -> T {
// CHECK: alloca %objc_object*, align 8
// CHECK: alloca ptr, align 8
return not_class_bounded_archetype(x)
}
@@ -143,108 +135,100 @@ func class_and_not_class_bounded_archetype_methods
}
*/
// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @"$s22class_bounded_generics0a1_B8_erasure{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics13ConcreteClassC* %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics0a1_B8_erasure{{[_0-9a-zA-Z]*}}F"(ptr %0) {{.*}} {
func class_bounded_erasure(_ x: ConcreteClass) -> ClassBound {
return x
// CHECK: [[INSTANCE_OPAQUE:%.*]] = bitcast %T22class_bounded_generics13ConcreteClassC* [[INSTANCE:%.*]] to %objc_object*
// CHECK: [[T0:%.*]] = insertvalue { %objc_object*, i8** } undef, %objc_object* [[INSTANCE_OPAQUE]], 0
// CHECK: [[T1:%.*]] = insertvalue { %objc_object*, i8** } [[T0]], i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @"$s22class_bounded_generics13ConcreteClassCAA0E5BoundAAWP", i32 0, i32 0), 1
// CHECK: ret { %objc_object*, i8** } [[T1]]
// CHECK: [[T0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[INSTANCE:%.*]], 0
// CHECK: [[T1:%.*]] = insertvalue { ptr, ptr } [[T0]], ptr @"$s22class_bounded_generics13ConcreteClassCAA0E5BoundAAWP", 1
// CHECK: ret { ptr, ptr } [[T1]]
}
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics0a1_B16_protocol_method{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, i8** %1) {{.*}} {
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics0a1_B16_protocol_method{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %1) {{.*}} {
func class_bounded_protocol_method(_ x: ClassBound) {
x.classBoundMethod()
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_getObjectType(%objc_object* %0)
// CHECK: [[WITNESS_GEP:%.*]] = getelementptr inbounds i8*, i8** [[WITNESS_TABLE:%.*]], i32 1
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_GEP]], align 8
// CHECK: [[WITNESS_FN:%.*]] = bitcast i8* [[WITNESS]] to void (%objc_object*, %swift.type*, i8**)
// CHECK: call swiftcc void [[WITNESS_FN]](%objc_object* swiftself %0, %swift.type* [[METADATA]], i8** [[WITNESS_TABLE]])
// CHECK: [[METADATA:%.*]] = call ptr @swift_getObjectType(ptr %0)
// CHECK: [[WITNESS_GEP:%.*]] = getelementptr inbounds ptr, ptr [[WITNESS_TABLE:%.*]], i32 1
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_GEP]], align 8
// CHECK: call swiftcc void [[WITNESS]](ptr swiftself %0, ptr [[METADATA]], ptr [[WITNESS_TABLE]])
}
// CHECK-LABEL: define hidden swiftcc %T22class_bounded_generics13ConcreteClassC* @"$s22class_bounded_generics0a1_B15_archetype_cast{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, %swift.type* %T, i8** %T.ClassBound)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics0a1_B15_archetype_cast{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %T, ptr %T.ClassBound)
func class_bounded_archetype_cast<T : ClassBound>(_ x: T) -> ConcreteClass {
return x as! ConcreteClass
// CHECK: [[IN_PTR:%.*]] = bitcast %objc_object* {{%.*}} to i8*
// CHECK: [[T0R:%.*]] = call swiftcc %swift.metadata_response @"$s22class_bounded_generics13ConcreteClassCMa"([[INT]] 0)
// CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[T0R]], 0
// CHECK: [[T1:%.*]] = bitcast %swift.type* [[T0]] to i8*
// CHECK: [[OUT_PTR:%.*]] = call i8* @swift_dynamicCastClassUnconditional(i8* [[IN_PTR]], i8* [[T1]], {{.*}})
// CHECK: [[OUT:%.*]] = bitcast i8* [[OUT_PTR]] to %T22class_bounded_generics13ConcreteClassC*
// CHECK: ret %T22class_bounded_generics13ConcreteClassC* [[OUT]]
// CHECK: [[OUT_PTR:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr {{%.*}}, ptr [[T0]], {{.*}})
// CHECK: ret ptr [[OUT_PTR]]
}
// CHECK-LABEL: define hidden swiftcc %T22class_bounded_generics13ConcreteClassC* @"$s22class_bounded_generics0a1_B14_protocol_cast{{[_0-9a-zA-Z]*}}F"(%objc_object* %0, i8** %1)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics0a1_B14_protocol_cast{{[_0-9a-zA-Z]*}}F"(ptr %0, ptr %1)
func class_bounded_protocol_cast(_ x: ClassBound) -> ConcreteClass {
return x as! ConcreteClass
// CHECK: [[IN_PTR:%.*]] = bitcast %objc_object* {{%.*}} to i8*
// CHECK: [[T0R:%.*]] = call swiftcc %swift.metadata_response @"$s22class_bounded_generics13ConcreteClassCMa"([[INT]] 0)
// CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[T0R]], 0
// CHECK: [[T1:%.*]] = bitcast %swift.type* [[T0]] to i8*
// CHECK: [[OUT_PTR:%.*]] = call i8* @swift_dynamicCastClassUnconditional(i8* [[IN_PTR]], i8* [[T1]], {{.*}})
// CHECK: [[OUT:%.*]] = bitcast i8* [[OUT_PTR]] to %T22class_bounded_generics13ConcreteClassC*
// CHECK: ret %T22class_bounded_generics13ConcreteClassC* [[OUT]]
// CHECK: [[OUT_PTR:%.*]] = call ptr @swift_dynamicCastClassUnconditional(ptr {{%.*}}, ptr [[T0]], {{.*}})
// CHECK: ret ptr [[OUT_PTR]]
}
// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @"$s22class_bounded_generics0a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0, i8** %1, i8** %2) {{.*}} {
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics0a1_B22_protocol_conversion_{{.*}}"(ptr %0, ptr %1, ptr %2) {{.*}} {
func class_bounded_protocol_conversion_1(_ x: ClassBound & ClassBound2)
-> ClassBound {
return x
}
// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @"$s22class_bounded_generics0a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0, i8** %1, i8** %2) {{.*}} {
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics0a1_B22_protocol_conversion_{{.*}}"(ptr %0, ptr %1, ptr %2) {{.*}} {
func class_bounded_protocol_conversion_2(_ x: ClassBound & ClassBound2)
-> ClassBound2 {
return x
}
// CHECK-LABEL: define hidden swiftcc { %objc_object*, i8** } @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0, i8** %1) {{.*}} {
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(ptr %0, ptr %1) {{.*}} {
func objc_class_bounded_protocol_conversion_1
(_ x: ClassBound & ObjCClassBound) -> ClassBound {
return x
}
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0, i8** %1) {{.*}} {
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(ptr %0, ptr %1) {{.*}} {
func objc_class_bounded_protocol_conversion_2
(_ x: ClassBound & ObjCClassBound) -> ObjCClassBound {
return x
}
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(ptr %0)
func objc_class_bounded_protocol_conversion_3
(_ x: ObjCClassBound & ObjCClassBound2) -> ObjCClassBound {
return x
}
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(%objc_object* %0)
// CHECK-LABEL: define hidden swiftcc ptr @"$s22class_bounded_generics05objc_a1_B22_protocol_conversion_{{.*}}"(ptr %0)
func objc_class_bounded_protocol_conversion_4
(_ x: ObjCClassBound & ObjCClassBound2) -> ObjCClassBound2 {
return x
}
// CHECK-LABEL: define hidden swiftcc { i64, %objc_object*, i64 } @"$s22class_bounded_generics0A28_generic_field_struct_fields{{[_0-9a-zA-Z]*}}F"(i64 %0, %objc_object* %1, i64 %2, %swift.type* %T, i8** %T.ClassBound)
// CHECK-LABEL: define hidden swiftcc { i64, ptr, i64 } @"$s22class_bounded_generics0A28_generic_field_struct_fields{{[_0-9a-zA-Z]*}}F"(i64 %0, ptr %1, i64 %2, ptr %T, ptr %T.ClassBound)
func class_generic_field_struct_fields<T>
(_ x:ClassGenericFieldStruct<T>) -> (Int, T, Int) {
return (x.x, x.y, x.z)
}
// CHECK-LABEL: define hidden swiftcc { i64, %objc_object*, i8**, i64 } @"$s22class_bounded_generics0A29_protocol_field_struct_fields{{[_0-9a-zA-Z]*}}F"(i64 %0, %objc_object* %1, i8** %2, i64 %3)
// CHECK-LABEL: define hidden swiftcc { i64, ptr, ptr, i64 } @"$s22class_bounded_generics0A29_protocol_field_struct_fields{{[_0-9a-zA-Z]*}}F"(i64 %0, ptr %1, ptr %2, i64 %3)
func class_protocol_field_struct_fields
(_ x:ClassProtocolFieldStruct) -> (Int, ClassBound, Int) {
return (x.x, x.y, x.z)
}
// CHECK-LABEL: define hidden swiftcc { i64, %objc_object*, i64 } @"$s22class_bounded_generics0a15_generic_field_A7_fields{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics017ClassGenericFieldD0C* %0)
// CHECK-LABEL: define hidden swiftcc { i64, ptr, i64 } @"$s22class_bounded_generics0a15_generic_field_A7_fields{{[_0-9a-zA-Z]*}}F"(ptr %0)
func class_generic_field_class_fields<T>
(_ x:ClassGenericFieldClass<T>) -> (Int, T, Int) {
return (x.x, x.y, x.z)
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, %T22class_bounded_generics017ClassGenericFieldD0C* %0, i32 0, i32 1
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, %T22class_bounded_generics017ClassGenericFieldD0C* %0, i32 0, i32 2
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, %T22class_bounded_generics017ClassGenericFieldD0C* %0, i32 0, i32 3
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, ptr %0, i32 0, i32 1
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, ptr %0, i32 0, i32 2
// CHECK: getelementptr inbounds %T22class_bounded_generics017ClassGenericFieldD0C, ptr %0, i32 0, i32 3
}
// CHECK-LABEL: define hidden swiftcc { i64, %objc_object*, i8**, i64 } @"$s22class_bounded_generics0a16_protocol_field_A7_fields{{[_0-9a-zA-Z]*}}F"(%T22class_bounded_generics018ClassProtocolFieldD0C* %0)
// CHECK-LABEL: define hidden swiftcc { i64, ptr, ptr, i64 } @"$s22class_bounded_generics0a16_protocol_field_A7_fields{{[_0-9a-zA-Z]*}}F"(ptr %0)
func class_protocol_field_class_fields(_ x: ClassProtocolFieldClass)
-> (Int, ClassBound, Int) {
return (x.x, x.y, x.z)
// CHECK: = call swiftcc i64 %{{[0-9]+}}
// CHECK: = call swiftcc { %objc_object*, i8** } %{{[0-9]+}}
// CHECK: = call swiftcc { ptr, ptr } %{{[0-9]+}}
// CHECK: = call swiftcc i64 %{{[0-9]+}}
}
@@ -254,11 +238,9 @@ class SomeSwiftClass {
// T must have a Swift layout, so we can load this metatype with a direct access.
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics0a1_B9_metatype{{[_0-9a-zA-Z]*}}F"
// CHECK: [[T0:%.*]] = bitcast %T22class_bounded_generics14SomeSwiftClassC* {{%.*}}
// CHECK-NEXT: [[T1:%.*]] = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK-NEXT: [[T2:%.*]] = bitcast %swift.type* [[T1]] to void (%swift.type*)**
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds void (%swift.type*)*, void (%swift.type*)** [[T2]], i64 10
// CHECK-NEXT: load void (%swift.type*)*, void (%swift.type*)** [[T3]], align 8
// CHECK: [[T1:%.*]] = load ptr, ptr
// CHECK-NEXT: [[T3:%.*]] = getelementptr inbounds ptr, ptr [[T1]], i64 10
// CHECK-NEXT: load ptr, ptr [[T3]], align 8
func class_bounded_metatype<T: SomeSwiftClass>(_ t : T) {
type(of: t).foo()
}
@@ -279,17 +261,15 @@ class M<T, S: A<T>> {
}
}
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(%swift.type* %0, %swift.type* %T)
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(ptr %0, ptr %T)
func takes_metatype<T>(_: T.Type) {}
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics023archetype_with_generic_A11_constraint1tyx_tAA1ACyq_GRbzr0_lF"(%T22class_bounded_generics1AC.1* %0, %swift.type* %T)
// CHECK: [[ISA_ADDR:%.*]] = bitcast %T22class_bounded_generics1AC.1* %0 to %swift.type**
// CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
// CHECK: call swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(%swift.type* %T, %swift.type* %T)
// CHECK-NEXT: [[T:%.*]] = bitcast %swift.type* %T to %swift.type**
// CHECK-NEXT: [[U_ADDR:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T]], i64 10
// CHECK-NEXT: [[U:%.*]] = load %swift.type*, %swift.type** [[U_ADDR]]
// CHECK: call swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(%swift.type* %U, %swift.type* %U)
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics023archetype_with_generic_A11_constraint1tyx_tAA1ACyq_GRbzr0_lF"(ptr %0, ptr %T)
// CHECK: [[ISA:%.*]] = load ptr, ptr %0
// CHECK: call swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(ptr %T, ptr %T)
// CHECK-NEXT: [[U_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, i64 10
// CHECK-NEXT: [[U:%.*]] = load ptr, ptr [[U_ADDR]]
// CHECK: call swiftcc void @"$s22class_bounded_generics14takes_metatypeyyxmlF"(ptr %U, ptr %U)
// CHECK: ret void
func archetype_with_generic_class_constraint<T, U>(t: T) where T : A<U> {
@@ -297,18 +277,15 @@ func archetype_with_generic_class_constraint<T, U>(t: T) where T : A<U> {
takes_metatype(U.self)
}
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics029calls_archetype_with_generic_A11_constraint1ayAA1ACyxG_tlF"(%T22class_bounded_generics1AC* %0) {{.*}} {
// CHECK-LABEL: define hidden swiftcc void @"$s22class_bounded_generics029calls_archetype_with_generic_A11_constraint1ayAA1ACyxG_tlF"(ptr %0) {{.*}} {
// CHECK: alloca
// CHECK: memset
// CHECK: [[ISA_ADDR:%.*]] = bitcast %T22class_bounded_generics1AC* %0
// CHECK-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_ADDR]]
// CHECK: [[ISA_PTR:%.*]] = bitcast %swift.type* [[ISA]] to %swift.type**
// CHECK-NEXT: [[T_ADDR:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[ISA_PTR]], i64 10
// CHECK-NEXT: [[T:%.*]] = load %swift.type*, %swift.type** [[T_ADDR]]
// CHECK: [[SELF:%.*]] = bitcast %T22class_bounded_generics1AC* %0 to %T22class_bounded_generics1AC.1*
// CHECK-NEXT: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s22class_bounded_generics1ACMa"([[INT]] 0, %swift.type* [[T]])
// CHECK: [[ISA:%.*]] = load ptr, ptr
// CHECK: [[T_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[ISA]], i64 10
// CHECK-NEXT: [[T:%.*]] = load ptr, ptr [[T_ADDR]]
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s22class_bounded_generics1ACMa"([[INT]] 0, ptr [[T]])
// CHECK-NEXT: [[A_OF_T:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: call swiftcc void @"$s22class_bounded_generics023archetype_with_generic_A11_constraint1tyx_tAA1ACyq_GRbzr0_lF"(%T22class_bounded_generics1AC.1* [[SELF]], %swift.type* [[A_OF_T]])
// CHECK-NEXT: call swiftcc void @"$s22class_bounded_generics023archetype_with_generic_A11_constraint1tyx_tAA1ACyq_GRbzr0_lF"(ptr %0, ptr [[A_OF_T]])
// CHECK: ret void
func calls_archetype_with_generic_class_constraint<T>(a: A<T>) {

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -18,11 +17,9 @@ class Purebred {
}
sil_vtable Purebred {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @purebred_method(%T18class_isa_pointers8PurebredC* %0) {{.*}} {
// CHECK: [[ISA_PTR:%.*]] = bitcast %T18class_isa_pointers8PurebredC* %0 to %swift.type**
// CHECK: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ISA_PTR]]
// CHECK: [[VTABLE:%.*]] = bitcast %swift.type* [[ISA]]
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @purebred_method(ptr %0) {{.*}} {
// CHECK: [[ISA:%.*]] = load ptr, ptr %0
// CHECK: getelementptr inbounds {{.*}} [[ISA]]
sil @purebred_method : $@convention(thin) (@owned Purebred) -> () {
entry(%0 : $Purebred):
%m = class_method %0 : $Purebred, #Purebred.method : (Purebred) -> () -> (), $@convention(method) (@guaranteed Purebred) -> ()
@@ -39,14 +36,12 @@ class Mongrel: Gizmo {
}
sil_vtable Mongrel {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @mongrel_method(%T18class_isa_pointers7MongrelC* %0) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast {{.*}} %0 to i64*
// CHECK-NEXT: [[T1:%.*]] = load i64, i64* [[T0]], align 8
// CHECK-NEXT: [[T2:%.*]] = load i64, i64* @swift_isaMask, align 8
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @mongrel_method(ptr %0) {{.*}} {
// CHECK: [[T1:%.*]] = load i64, ptr %0, align 8
// CHECK-NEXT: [[T2:%.*]] = load i64, ptr @swift_isaMask, align 8
// CHECK-NEXT: [[T3:%.*]] = and i64 [[T1]], [[T2]]
// CHECK: [[ISA:%.*]] = inttoptr i64 [[T3]] to %swift.type*
// CHECK: [[VTABLE:%.*]] = bitcast %swift.type* [[ISA]]
// CHECK: getelementptr inbounds {{.*}} [[VTABLE]]
// CHECK: [[ISA:%.*]] = inttoptr i64 [[T3]] to ptr
// CHECK: getelementptr inbounds {{.*}} [[ISA]]
sil @mongrel_method : $@convention(thin) (@owned Mongrel) -> () {
entry(%0 : $Mongrel):
%m = class_method %0 : $Mongrel, #Mongrel.method : (Mongrel) -> () -> (), $@convention(method) (@guaranteed Mongrel) -> ()

View File

@@ -1,10 +1,8 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_class.swiftmodule -module-name=resilient_class %S/../Inputs/resilient_class.swift -I %t
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// RUN: %target-swift-frontend -enable-objc-interop -I %t -emit-ir -enable-library-evolution %s
// RUN: %target-swift-frontend -disable-objc-interop -I %t -emit-ir -enable-library-evolution %s
// RUN: %target-swift-frontend -enable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend -disable-objc-interop -I %t -emit-ir -enable-library-evolution %s | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// RUN: %target-swift-frontend -I %t -emit-ir -enable-library-evolution -O %s
// REQUIRES: CPU=x86_64
@@ -26,18 +24,15 @@ import resilient_class
// CHECK-LABEL: define {{(dllexport )?}}{{(protected )?}}swiftcc void @allocResilientOutsideParent()
// CHECK: [[T0:%.*]] = call swiftcc %swift.metadata_response @"$s15resilient_class22ResilientOutsideParentCMa"(i64 0)
// CHECK-NEXT: [[META:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK-NEXT: [[META_ADDR:%.*]] = bitcast %swift.type* [[META]] to i8*
// CHECK-objc-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 48
// CHECK-native-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 24
// CHECK-NEXT: [[SIZE_PTR:%.*]] = bitcast i8* [[SIZE_ADDR]] to i32*
// CHECK-NEXT: [[SIZE_2:%.*]] = load i32, i32* [[SIZE_PTR]], align 8
// CHECK-objc-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, ptr [[META]], i32 48
// CHECK-native-NEXT: [[SIZE_ADDR:%.*]] = getelementptr inbounds i8, ptr [[META]], i32 24
// CHECK-NEXT: [[SIZE_2:%.*]] = load i32, ptr [[SIZE_ADDR]], align 8
// CHECK-NEXT: [[SIZE:%.*]] = zext i32 [[SIZE_2]] to i64
// CHECK-objc-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 52
// CHECK-native-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, i8* [[META_ADDR]], i32 28
// CHECK-NEXT: [[ALIGN_PTR:%.*]] = bitcast i8* [[ALIGN_ADDR]] to i16*
// CHECK-NEXT: [[ALIGN_2:%.*]] = load i16, i16* [[ALIGN_PTR]], align 4
// CHECK-objc-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, ptr [[META]], i32 52
// CHECK-native-NEXT: [[ALIGN_ADDR:%.*]] = getelementptr inbounds i8, ptr [[META]], i32 28
// CHECK-NEXT: [[ALIGN_2:%.*]] = load i16, ptr [[ALIGN_ADDR]], align 4
// CHECK-NEXT: [[ALIGN:%.*]] = zext i16 [[ALIGN_2]] to i64
// CHECK-NEXT: call noalias %swift.refcounted* @swift_allocObject(%swift.type* [[META]], i64 [[SIZE]], i64 [[ALIGN]])
// CHECK-NEXT: call noalias ptr @swift_allocObject(ptr [[META]], i64 [[SIZE]], i64 [[ALIGN]])
sil @allocResilientOutsideParent : $@convention(thin) () -> () {
bb0:

View File

@@ -1,8 +1,7 @@
// RUN: %empty-directory(%t)
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_struct.swiftmodule -module-name=resilient_struct %S/../Inputs/resilient_struct.swift
// RUN: %target-swift-frontend -emit-module -enable-library-evolution -emit-module-path=%t/resilient_objc_class.swiftmodule -module-name=resilient_objc_class %S/../Inputs/resilient_objc_class.swift -I %t
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %use_no_opaque_pointers -I %t -enable-library-evolution -emit-ir -o - -primary-file %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %t -enable-library-evolution -emit-ir -o - -primary-file %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -I %t -enable-library-evolution -emit-ir -o - -primary-file %s | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize -DINT=i%target-ptrsize
// This is XFAILed on these targets because they're 32-bit but support tagged pointers.
// The test is cloned as class_resilience_objc_armv7k.swift for them.
@@ -34,14 +33,12 @@ public class FixedLayoutObjCSubclass : NSObject {
public final var field: Int32 = 0
};
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc29testConstantDirectFieldAccessyyAA23FixedLayoutObjCSubclassCF"(%T21class_resilience_objc23FixedLayoutObjCSubclassC* %0)
// CHECK: [[OFFSET:%.*]] = load [[INT]], [[INT]]* @"$s21class_resilience_objc23FixedLayoutObjCSubclassC5fields5Int32VvpWvd"
// CHECK-NEXT: [[OBJECT:%.*]] = bitcast %T21class_resilience_objc23FixedLayoutObjCSubclassC* %0 to i8*
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, i8* [[OBJECT]], [[INT]] [[OFFSET]]
// CHECK-NEXT: [[FIELD_ADDR:%.*]] = bitcast i8* [[ADDR]] to %Ts5Int32V*
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc29testConstantDirectFieldAccessyyAA23FixedLayoutObjCSubclassCF"(ptr %0)
// CHECK: [[OFFSET:%.*]] = load [[INT]], ptr @"$s21class_resilience_objc23FixedLayoutObjCSubclassC5fields5Int32VvpWvd"
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, ptr %0, [[INT]] [[OFFSET]]
// CHECK: call void @swift_beginAccess
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, %Ts5Int32V* [[FIELD_ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, i32* [[PAYLOAD_ADDR]]
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, ptr [[ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, ptr [[PAYLOAD_ADDR]]
func testConstantDirectFieldAccess(_ o: FixedLayoutObjCSubclass) {
o.field = 10
@@ -53,14 +50,12 @@ public class NonFixedLayoutObjCSubclass : NSCoder {
public final var field: Int32 = 0
}
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc32testNonConstantDirectFieldAccessyyAA0E23FixedLayoutObjCSubclassCF"(%T21class_resilience_objc26NonFixedLayoutObjCSubclassC* %0)
// CHECK: [[OFFSET:%.*]] = load [[INT]], [[INT]]* @"$s21class_resilience_objc26NonFixedLayoutObjCSubclassC5fields5Int32VvpWvd"
// CHECK-NEXT: [[OBJECT:%.*]] = bitcast %T21class_resilience_objc26NonFixedLayoutObjCSubclassC* %0 to i8*
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, i8* [[OBJECT]], [[INT]] [[OFFSET]]
// CHECK-NEXT: [[FIELD_ADDR:%.*]] = bitcast i8* [[ADDR]] to %Ts5Int32V*
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc32testNonConstantDirectFieldAccessyyAA0E23FixedLayoutObjCSubclassCF"(ptr %0)
// CHECK: [[OFFSET:%.*]] = load [[INT]], ptr @"$s21class_resilience_objc26NonFixedLayoutObjCSubclassC5fields5Int32VvpWvd"
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, ptr %0, [[INT]] [[OFFSET]]
// CHECK: call void @swift_beginAccess
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, %Ts5Int32V* [[FIELD_ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, i32* [[PAYLOAD_ADDR]]
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, ptr [[ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, ptr [[PAYLOAD_ADDR]]
func testNonConstantDirectFieldAccess(_ o: NonFixedLayoutObjCSubclass) {
o.field = 10
@@ -75,35 +70,29 @@ public class GenericObjCSubclass<T> : NSCoder {
}
}
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc31testConstantIndirectFieldAccessyyAA19GenericObjCSubclassCyxGlF"(%T21class_resilience_objc19GenericObjCSubclassC* %0)
// CHECK-LABEL: define hidden swiftcc void @"$s21class_resilience_objc31testConstantIndirectFieldAccessyyAA19GenericObjCSubclassCyxGlF"(ptr %0)
// FIXME: we could eliminate the unnecessary isa load by lazily emitting
// metadata sources in EmitPolymorphicParameters
// CHECK: bitcast %T21class_resilience_objc19GenericObjCSubclassC* %0
// CHECK-32: [[ADDR:%.*]] = bitcast %T21class_resilience_objc19GenericObjCSubclassC* %0 to %swift.type**
// CHECK-32-NEXT: [[ISA:%.*]] = load %swift.type*, %swift.type** [[ADDR]]
// CHECK-32: [[ISA:%.*]] = load ptr, ptr %0
// CHECK-64: [[ADDR:%.*]] = bitcast %T21class_resilience_objc19GenericObjCSubclassC* %0 to [[INT]]*
// CHECK-64-NEXT: [[ISA:%.*]] = load [[INT]], [[INT]]* [[ADDR]]
// CHECK-64-NEXT: [[ISA_MASK:%.*]] = load [[INT]], [[INT]]* @swift_isaMask
// CHECK: inttoptr
// CHECK-64: [[ISA:%.*]] = load [[INT]], ptr %0
// CHECK-64-NEXT: [[ISA_MASK:%.*]] = load [[INT]], ptr @swift_isaMask
// CHECK-64-NEXT: [[ISA_VALUE:%.*]] = and [[INT]] [[ISA]], [[ISA_MASK]]
// CHECK-64-NEXT: [[ISA:%.*]] = inttoptr [[INT]] [[ISA_VALUE]] to %swift.type*
// CHECK-64-NEXT: [[ISA:%.*]] = inttoptr [[INT]] [[ISA_VALUE]] to ptr
// CHECK-NEXT: [[ISA_ADDR:%.*]] = bitcast %swift.type* [[ISA]] to [[INT]]*
// CHECK-32-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], ptr [[ISA]], [[INT]] 15
// CHECK-32-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 15
// CHECK-64-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], ptr [[ISA]], [[INT]] 12
// CHECK-64-NEXT: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds [[INT]], [[INT]]* [[ISA_ADDR]], [[INT]] 12
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], [[INT]]* [[FIELD_OFFSET_ADDR:%.*]]
// CHECK-NEXT: [[OBJECT:%.*]] = bitcast %T21class_resilience_objc19GenericObjCSubclassC* %0 to i8*
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, i8* [[OBJECT]], [[INT]] [[FIELD_OFFSET]]
// CHECK-NEXT: [[FIELD_ADDR:%.*]] = bitcast i8* [[ADDR]] to %Ts5Int32V*
// CHECK-NEXT: [[FIELD_OFFSET:%.*]] = load [[INT]], ptr [[FIELD_OFFSET_ADDR:%.*]]
// CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i8, ptr %0, [[INT]] [[FIELD_OFFSET]]
// CHECK: call void @swift_beginAccess
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, %Ts5Int32V* [[FIELD_ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, i32* [[PAYLOAD_ADDR]]
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = getelementptr inbounds %Ts5Int32V, ptr [[ADDR]], i32 0, i32 0
// CHECK-NEXT: store i32 10, ptr [[PAYLOAD_ADDR]]
func testConstantIndirectFieldAccess<T>(_ o: GenericObjCSubclass<T>) {
// This field uses constant indirect access because NSCoder has resilient

View File

@@ -1,7 +1,6 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// CHECK: @"$s10empty_enum6JamaisOMf" =
// CHECK-SAME: {{@"\$sytWV"|i8\*\* getelementptr inbounds \(%swift.enum_vwtable, %swift.enum_vwtable\* @"\$s10empty_enum6JamaisOWV", i32 0, i32 0\)}}
// CHECK-SAME: {{@"\$sytWV"|ptr @"\$s10empty_enum6JamaisOWV"}}
enum Jamais {}

View File

@@ -1,9 +1,7 @@
// #if directives don't work with SIL keywords, therefore please put ObjC tests
// in `enum_objc.sil`.
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -18,7 +16,7 @@ import Swift
// CHECK: %T4enum9SingletonO = type <{ <{ i64, i64 }> }>
// -- Singleton enum with heap object ref payload. <rdar://problem/15679353>
// CHECK: %T4enum12SingletonRefO = type <{ %swift.refcounted* }>
// CHECK: %T4enum12SingletonRefO = type <{ ptr }>
// -- No-payload enums. The representation is just an enum tag.
// CHECK: %T4enum10NoPayloadsO = type <{ i8 }>
@@ -93,15 +91,11 @@ import Swift
// -- Dynamic enums. The type layout is opaque; we dynamically bitcast to
// the element type.
// CHECK: %T4enum20DynamicSinglePayloadO = type <{}>
// CHECK: [[DYNAMIC_SINGLE_EMPTY_PAYLOAD:%T4enum20DynamicSinglePayloadOyytG]] = type <{ [1 x i8] }>
// -- Address-only multi-payload enums. We can't use spare bits.
// CHECK-64: %T4enum32MultiPayloadAddressOnlySpareBitsO = type <{ [16 x i8], [1 x i8] }>
// CHECK-32: %T4enum32MultiPayloadAddressOnlySpareBitsO = type <{ [8 x i8], [1 x i8] }>
// CHECK: [[DYNAMIC_SINGLETON:%T4enum16DynamicSingletonO.*]] = type <{}>
// CHECK: %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO = type <{ [1 x i8], [1 x i8] }>
// -- Dynamic metadata template carries a value witness table pattern
@@ -114,13 +108,13 @@ import Swift
// CHECK-SAME: i32 6291456,
// CHECK-SAME: i32 0,
// Enum witnesses.
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s4enum16DynamicSingletonOwug" to i8*)
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s4enum16DynamicSingletonOwup" to i8*)
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s4enum16DynamicSingletonOwui" to i8*)
// CHECK-SAME: ptr @"$s4enum16DynamicSingletonOwug"
// CHECK-SAME: ptr @"$s4enum16DynamicSingletonOwup"
// CHECK-SAME: ptr @"$s4enum16DynamicSingletonOwui"
// CHECK: [[DYNAMICSINGLETON_NAME:@.*]] = private constant [17 x i8] c"DynamicSingleton\00"
// CHECK: @"$s4enum16DynamicSingletonOMn" = hidden constant <{
// CHECK-SAME: [17 x i8]* [[DYNAMICSINGLETON_NAME]]
// CHECK-SAME: ptr [[DYNAMICSINGLETON_NAME]]
// -- One payload
// CHECK-SAME: i32 1,
// -- No empty cases
@@ -135,7 +129,7 @@ import Swift
// CHECK: @"$s4enum16DynamicSingletonOMP" = internal constant <{ {{.*}} }> <{
// CHECK-SAME: @"$s4enum16DynamicSingletonOMi"
// CHECK-SAME: %swift.enum_vwtable* @"$s4enum16DynamicSingletonOWV"
// CHECK-SAME: ptr @"$s4enum16DynamicSingletonOWV"
// -- No-payload enums have extra inhabitants in
// their value witness table.
@@ -173,7 +167,7 @@ import Swift
// CHECK: @"$s4enum20DynamicSinglePayloadOMP" = internal constant <{ {{.*}} }> <{
// CHECK-SAME: @"$s4enum20DynamicSinglePayloadOMi"
// CHECK-SAME: %swift.enum_vwtable* @"$s4enum20DynamicSinglePayloadOWV"
// CHECK-SAME: ptr @"$s4enum20DynamicSinglePayloadOWV"
// CHECK: @"$s4enum18MultiPayloadNestedOWV" = internal constant %swift.enum_vwtable {
// -- size
@@ -204,7 +198,7 @@ enum DynamicSingleton<T> {
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(i64 %0, i64 %1) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(%T4enum9SingletonO* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @singleton_switch : $(Singleton) -> () {
// CHECK-64: entry:
// CHECK-32: entry:
@@ -223,12 +217,12 @@ dest:
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(i64 %0, i64 %1) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(%T4enum9SingletonO* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @singleton_switch_arg : $(Singleton) -> () {
// CHECK-64: entry:
// CHECK-32: entry:
entry(%u : $Singleton):
// CHECK-32: call %T4enum9SingletonO* @"$s4enum9SingletonOWOb"
// CHECK-32: call ptr @"$s4enum9SingletonOWOb"
// CHECK-64: br label %[[PREDEST:[0-9]+]]
// CHECK-32: br label %[[PREDEST:[0-9]+]]
switch_enum %u : $Singleton, case #Singleton.value!enumelt: dest
@@ -244,11 +238,10 @@ dest(%u2 : $(Builtin.Int64, Builtin.Int64)):
return %x : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_indirect(%T4enum9SingletonO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: br label %[[DEST:[0-9]+]]
// CHECK: [[DEST]]:
// CHECK: [[ADDR:%.*]] = bitcast %T4enum9SingletonO* %0 to <{ i64, i64 }>*
// CHECK: ret void
// CHECK: }
sil @singleton_switch_indirect : $(@inout Singleton) -> () {
@@ -266,13 +259,12 @@ dest:
// CHECK-64: [[B:%.*]] = insertvalue { i64, i64 } [[A]], i64 %1, 1
// CHECK-64: ret { i64, i64 } [[B]]
// CHECK-64: }
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject(%T4enum9SingletonO* noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject(ptr noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2) {{.*}} {
// CHECK-32: entry:
// CHECK-32: [[CAST:%.*]] = bitcast %T4enum9SingletonO* %0 to <{ i64, i64 }>*
// CHECK-32: [[GEP1:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[CAST]], i32 0, i32 0
// CHECK-32: store i64 %1, i64* [[GEP1]]
// CHECK-32: [[GEP2:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[CAST]], i32 0, i32 1
// CHECK-32: store i64 %2, i64* [[GEP2]]
// CHECK-32: [[GEP1:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %0, i32 0, i32 0
// CHECK-32: store i64 %1, ptr [[GEP1]]
// CHECK-32: [[GEP2:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %0, i32 0, i32 1
// CHECK-32: store i64 %2, ptr [[GEP2]]
// CHECK-32: ret void
// CHECK-32: }
sil @singleton_inject : $(Builtin.Int64, Builtin.Int64) -> Singleton {
@@ -282,13 +274,12 @@ entry(%0 : $Builtin.Int64, %1 : $Builtin.Int64):
return %u : $Singleton
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject_indirect(i64 %0, i64 %1, %T4enum9SingletonO* nocapture dereferenceable({{.*}}) %2) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject_indirect(i64 %0, i64 %1, ptr nocapture dereferenceable({{.*}}) %2) {{.*}} {
// CHECK: entry:
// CHECK: [[DATA_ADDR:%.*]] = bitcast %T4enum9SingletonO* %2 to <{ i64, i64 }>*
// CHECK: [[DATA_0_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[DATA_ADDR]], i32 0, i32 0
// CHECK: store i64 %0, i64* [[DATA_0_ADDR]]
// CHECK: [[DATA_1_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[DATA_ADDR]], i32 0, i32 1
// CHECK: store i64 %1, i64* [[DATA_1_ADDR]]
// CHECK: [[DATA_0_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %2, i32 0, i32 0
// CHECK: store i64 %0, ptr [[DATA_0_ADDR]]
// CHECK: [[DATA_1_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %2, i32 0, i32 1
// CHECK: store i64 %1, ptr [[DATA_1_ADDR]]
// CHECK: ret void
// CHECK: }
sil @singleton_inject_indirect : $(Builtin.Int64, Builtin.Int64, @inout Singleton) -> () {
@@ -358,11 +349,11 @@ end:
return %x : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_switch_indirect(%T4enum10NoPayloadsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
sil @no_payload_switch_indirect : $@convention(thin) (@inout NoPayloads) -> () {
entry(%u : $*NoPayloads):
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T4enum10NoPayloadsO, %T4enum10NoPayloadsO* %0, i32 0, i32 0
// CHECK: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]]
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T4enum10NoPayloadsO, ptr %0, i32 0, i32 0
// CHECK: [[TAG:%.*]] = load i8, ptr [[TAG_ADDR]]
// CHECK: switch i8 [[TAG]]
switch_enum_addr %u : $*NoPayloads, case #NoPayloads.x!enumelt: x_dest, case #NoPayloads.y!enumelt: y_dest, case #NoPayloads.z!enumelt: z_dest
@@ -407,10 +398,10 @@ entry:
return %u : $NoPayloads
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_inject_z_indirect(%T4enum10NoPayloadsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_inject_z_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T4enum10NoPayloadsO, %T4enum10NoPayloadsO* %0, i32 0, i32 0
// CHECK: store i8 2, i8* [[TAG_ADDR]]
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T4enum10NoPayloadsO, ptr %0, i32 0, i32 0
// CHECK: store i8 2, ptr [[TAG_ADDR]]
// CHECK: ret void
// CHECK: }
sil @no_payload_inject_z_indirect : $(@inout NoPayloads) -> () {
@@ -638,13 +629,11 @@ entry(%0 : $Builtin.Word):
return %u : $SinglePayloadNoXI2
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_x_indirect([[WORD]] %0, %T4enum18SinglePayloadNoXI2O* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_x_indirect([[WORD]] %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: entry:
// CHECK: [[DATA_ADDR:%.*]] = bitcast %T4enum18SinglePayloadNoXI2O* %1 to [[WORD]]*
// CHECK: store [[WORD]] %0, [[WORD]]* [[DATA_ADDR]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, %T4enum18SinglePayloadNoXI2O* %1, i32 0, i32 1
// CHECK: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK: store i1 false, i1* [[TAG_ADDR]]
// CHECK: store [[WORD]] %0, ptr %1
// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, ptr %1, i32 0, i32 1
// CHECK: store i1 false, ptr [[T0]]
// CHECK: ret void
// CHECK: }
sil @single_payload_no_xi_inject_x_indirect : $(Builtin.Word, @inout SinglePayloadNoXI2) -> () {
@@ -666,13 +655,11 @@ entry:
return %u : $SinglePayloadNoXI2
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_y_indirect(%T4enum18SinglePayloadNoXI2O* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_y_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum18SinglePayloadNoXI2O* %0 to [[WORD]]*
// CHECK: store [[WORD]] 0, [[WORD]]* [[PAYLOAD_ADDR]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, %T4enum18SinglePayloadNoXI2O* %0, i32 0, i32 1
// CHECK: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK: store i1 true, i1* [[TAG_ADDR]]
// CHECK: store [[WORD]] 0, ptr %0
// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, ptr %0, i32 0, i32 1
// CHECK: store i1 true, ptr [[T0]]
// CHECK: ret void
// CHECK: }
sil @single_payload_no_xi_inject_y_indirect : $(@inout SinglePayloadNoXI2) -> () {
@@ -765,7 +752,7 @@ enum AggregateSinglePayload2 {
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2([[WORD]] %0, [[WORD]] %1, [[WORD]] %2, [[WORD]] %3) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2(%T4enum23AggregateSinglePayload2O* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @aggregate_single_payload_unpack_2 : $@convention(thin) (AggregateSinglePayload2) -> () {
entry(%u : $AggregateSinglePayload2):
switch_enum %u : $AggregateSinglePayload2, case #AggregateSinglePayload2.x!enumelt: x_dest, default default_dest
@@ -796,15 +783,14 @@ end:
// CHECK-64: %9 = insertvalue { [[WORD]], [[WORD]], [[WORD]], [[WORD]] } %8, [[WORD]] %3, 3
// CHECK-64: ret { [[WORD]], [[WORD]], [[WORD]], [[WORD]] } %9
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_2_inject(%T4enum23AggregateSinglePayload2O* noalias nocapture sret({{.*}}) %0, i32 %1, i32 %2, i32 %3, i32 %4) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_2_inject(ptr noalias nocapture sret({{.*}}) %0, i32 %1, i32 %2, i32 %3, i32 %4) {{.*}} {
// CHECK-32: [[TRUNC:%.*]] = trunc i32 %1 to i21
// CHECK-32: [[ZEXT:%.*]] = zext i21 [[TRUNC]] to i32
// CHECK-32: [[CAST:%.*]] = bitcast %T4enum23AggregateSinglePayload2O* %0 to { i32, i32, i32, i32 }*
// CHECK-32: [[GEP:%.*]] = getelementptr inbounds {{.*}} [[CAST]], i32 0, i32 0
// CHECK-32: store i32 [[ZEXT]], i32* [[GEP]]
// CHECK-32: store i32 %2, i32*
// CHECK-32: store i32 %3, i32*
// CHECK-32: store i32 %4, i32*
// CHECK-32: [[GEP:%.*]] = getelementptr inbounds {{.*}} %0, i32 0, i32 0
// CHECK-32: store i32 [[ZEXT]], ptr [[GEP]]
// CHECK-32: store i32 %2, ptr
// CHECK-32: store i32 %3, ptr
// CHECK-32: store i32 %4, ptr
// CHECK-32: ret void
sil @aggregate_single_payload_2_inject : $(CharLike, IntLike, RangeLike) -> AggregateSinglePayload2 {
entry(%0 : $CharLike, %1 : $IntLike, %2 : $RangeLike):
@@ -972,13 +958,11 @@ end:
sil @single_payload_spare_bit_switch_indirect : $@convention(thin) (@inout SinglePayloadSpareBit) -> () {
entry(%u : $*SinglePayloadSpareBit):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum21SinglePayloadSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: switch i64 [[PAYLOAD]], label %[[DFLT:[0-9]+]] [
switch_enum_addr %u : $*SinglePayloadSpareBit, case #SinglePayloadSpareBit.x!enumelt: x_dest, case #SinglePayloadSpareBit.y!enumelt: y_dest, case #SinglePayloadSpareBit.z!enumelt: z_dest
// CHECK-64: [[DFLT]]:
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum21SinglePayloadSpareBitO* %0 to i63*
x_dest:
%u2 = unchecked_take_enum_data_addr %u : $*SinglePayloadSpareBit, #SinglePayloadSpareBit.x!enumelt
%a = function_ref @a : $@convention(thin) () -> ()
@@ -1008,13 +992,11 @@ entry(%0 : $Builtin.Int63):
return %u : $SinglePayloadSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_x_indirect(i64 %0, %T4enum21SinglePayloadSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[T:%.*]] = trunc i64 %0 to i63
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum21SinglePayloadSpareBitO* %1 to i63*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i63* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i63 [[T]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @single_payload_spare_bit_inject_x_indirect : $(Builtin.Int63, @inout SinglePayloadSpareBit) -> () {
@@ -1037,11 +1019,10 @@ entry:
return %u : $SinglePayloadSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_y_indirect(%T4enum21SinglePayloadSpareBitO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_y_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum21SinglePayloadSpareBitO* %0 to i64*
// -- 0x8000_0000_0000_0000
// CHECK-64: store i64 -9223372036854775808, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 -9223372036854775808, ptr %0
// CHECK-64: ret void
// CHECK-64: }
sil @single_payload_spare_bit_inject_y_indirect : $(@inout SinglePayloadSpareBit) -> () {
@@ -1150,7 +1131,7 @@ enum SinglePayloadClass {
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-64: [[DFLT]]:
// CHECK-64: inttoptr [[WORD]] %0 to %T4enum1CC*
// CHECK-64: inttoptr [[WORD]] %0 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_switch(i32 %0) {{.*}} {
// CHECK-32: entry:
@@ -1160,7 +1141,7 @@ enum SinglePayloadClass {
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-32: [[DFLT]]:
// CHECK-32: inttoptr [[WORD]] %0 to %T4enum1CC*
// CHECK-32: inttoptr [[WORD]] %0 to ptr
sil @single_payload_class_switch : $(SinglePayloadClass) -> () {
entry(%c : $SinglePayloadClass):
@@ -1197,9 +1178,9 @@ enum SinglePayloadClassProtocol {
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-objc-64: inttoptr i64 %0 to %objc_object*
// CHECK-native-64: inttoptr i64 %0 to %swift.refcounted*
// CHECK-64: inttoptr i64 %1 to i8**
// CHECK-objc-64: inttoptr i64 %0 to ptr
// CHECK-native-64: inttoptr i64 %0 to ptr
// CHECK-64: inttoptr i64 %1 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i32 %0, i32 %1) {{.*}} {
// CHECK-32: switch i32 %0, label {{%.*}} [
@@ -1208,9 +1189,9 @@ enum SinglePayloadClassProtocol {
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-objc-32: inttoptr i32 %0 to %objc_object*
// CHECK-native-32: inttoptr i32 %0 to %swift.refcounted*
// CHECK-32: inttoptr i32 %1 to i8**
// CHECK-objc-32: inttoptr i32 %0 to ptr
// CHECK-native-32: inttoptr i32 %0 to ptr
// CHECK-32: inttoptr i32 %1 to ptr
sil @single_payload_class_protocol_switch : $(SinglePayloadClassProtocol) -> () {
entry(%c : $SinglePayloadClassProtocol):
@@ -1236,15 +1217,12 @@ enum DynamicSinglePayload<T> {
case w
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_switch(%T4enum20DynamicSinglePayloadO* noalias nocapture %0, %swift.type* %T) {{.*}} {
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T4enum20DynamicSinglePayloadO* %0 to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 6
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %getEnumTagSinglePayload = bitcast i8* [[WITNESS]] to i32 (%swift.opaque*, i32, %swift.type*)*
// CHECK: [[CASE_INDEX:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_switch(ptr noalias nocapture %0, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 6
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: [[CASE_INDEX:%.*]] = call i32 [[WITNESS]](ptr noalias %0, i32 3, ptr %T)
// CHECK: switch i32 [[CASE_INDEX]], label {{%.*}} [
// CHECK: i32 0, label {{%.*}}
// CHECK: i32 3, label {{%.*}}
@@ -1267,16 +1245,12 @@ end:
return %v : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_x(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.opaque* noalias nocapture %1, %swift.type* %T) {{.*}} {
// CHECK: [[ARG:%.*]] = bitcast %swift.opaque* %0 to %T4enum20DynamicSinglePayloadO*
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T4enum20DynamicSinglePayloadO* [[ARG]] to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %storeEnumTagSinglePayload = bitcast i8* [[WITNESS]] to void (%swift.opaque*, i32, i32, %swift.type*)*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 0, i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_x(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: call void [[WITNESS]](ptr noalias %0, i32 0, i32 3, ptr %T)
sil @dynamic_single_payload_inject_x : $<T> (@in T) -> @out DynamicSinglePayload<T> {
entry(%r : $*DynamicSinglePayload<T>, %t : $*T):
inject_enum_addr %r : $*DynamicSinglePayload<T>, #DynamicSinglePayload.x!enumelt
@@ -1284,16 +1258,12 @@ entry(%r : $*DynamicSinglePayload<T>, %t : $*T):
return %v : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_y(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.type* %T) {{.*}} {
// CHECK: [[ARG:%.*]] = bitcast %swift.opaque* %0 to %T4enum20DynamicSinglePayloadO*
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T4enum20DynamicSinglePayloadO* [[ARG]] to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %storeEnumTagSinglePayload = bitcast i8* [[WITNESS]] to void (%swift.opaque*, i32, i32, %swift.type*)*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 1, i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_y(ptr noalias nocapture sret({{.*}}) %0, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: call void [[WITNESS]](ptr noalias %0, i32 1, i32 3, ptr %T)
sil @dynamic_single_payload_inject_y : $<T> () -> @out DynamicSinglePayload<T> {
entry(%r : $*DynamicSinglePayload<T>):
inject_enum_addr %r : $*DynamicSinglePayload<T>, #DynamicSinglePayload.y!enumelt
@@ -1334,11 +1304,10 @@ end(%z : $()):
return %z : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @dynamic_single_payload_empty_payload_load([[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @dynamic_single_payload_empty_payload_load(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: %1 = bitcast [[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* %0 to i8*
// CHECK: %2 = load i8, i8* %1
// CHECK: ret i8 %2
// CHECK: %1 = load i8, ptr %0
// CHECK: ret i8 %1
// CHECK: }
sil @dynamic_single_payload_empty_payload_load : $(@inout DynamicSinglePayload<()>) -> DynamicSinglePayload<()> {
entry(%p : $*DynamicSinglePayload<()>):
@@ -1346,10 +1315,9 @@ entry(%p : $*DynamicSinglePayload<()>):
return %x : $DynamicSinglePayload<()>
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_empty_payload_store([[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* nocapture dereferenceable({{.*}}) %0, i8 %1) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_empty_payload_store(ptr nocapture dereferenceable({{.*}}) %0, i8 %1) {{.*}} {
// CHECK: entry:
// CHECK: %2 = bitcast [[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* %0 to i8*
// CHECK: store i8 %1, i8* %2
// CHECK: store i8 %1, ptr %0
// CHECK: ret void
// CHECK: }
sil @dynamic_single_payload_empty_payload_store : $(@inout DynamicSinglePayload<()>, DynamicSinglePayload<()>) -> () {
@@ -1382,7 +1350,7 @@ sil @dynamic_single_payload_empty_payload_inject_no_payload : $() -> DynamicSing
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_generic_destroy
// CHECK: br i1
// CHECK: {{[0-9]+}}:
// CHECK: call void %destroy
// CHECK: call void
// CHECK: {{[0-9]+}}:
sil @dynamic_single_payload_generic_destroy : $@convention(thin) <T> (@in DynamicSinglePayload<T>) -> () {
entry(%x : $*DynamicSinglePayload<T>):
@@ -1472,14 +1440,12 @@ end:
return %v : $()
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bits_switch_indirect(%T4enum23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bits_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
sil @multi_payload_no_spare_bits_switch_indirect : $(@inout MultiPayloadNoSpareBits) -> () {
entry(%u : $*MultiPayloadNoSpareBits):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, %T4enum23MultiPayloadNoSpareBitsO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, ptr %0, i32 0, i32 1
// CHECK-64: [[TAG:%.*]] = load i8, ptr [[T0]]
// CHECK-64: switch i8 [[TAG]]
// CHECK-64: switch i64 [[PAYLOAD]]
// CHECK-64: {{[0-9]+}}:
@@ -1487,11 +1453,8 @@ entry(%u : $*MultiPayloadNoSpareBits):
switch_enum_addr %u : $*MultiPayloadNoSpareBits, case #MultiPayloadNoSpareBits.x!enumelt: x_dest, case #MultiPayloadNoSpareBits.y!enumelt: y_dest, case #MultiPayloadNoSpareBits.z!enumelt: z_dest, case #MultiPayloadNoSpareBits.a!enumelt: a_dest, case #MultiPayloadNoSpareBits.b!enumelt: b_dest, case #MultiPayloadNoSpareBits.c!enumelt: c_dest
// CHECK-64: [[X_DEST:[0-9]+]]:
// CHECK-64: bitcast %T4enum23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: [[Y_DEST:[0-9]+]]:
// CHECK-64: bitcast %T4enum23MultiPayloadNoSpareBitsO* %0 to i32*
// CHECK-64: [[Z_DEST:[0-9]+]]:
// CHECK-64: bitcast %T4enum23MultiPayloadNoSpareBitsO* %0 to i63*
x_dest:
%x = unchecked_take_enum_data_addr %u : $*MultiPayloadNoSpareBits, #MultiPayloadNoSpareBits.x!enumelt
@@ -1531,13 +1494,11 @@ entry(%0 : $Builtin.Int64):
return %u : $MultiPayloadNoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_x_indirect(i64 %0, %T4enum23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum23MultiPayloadNoSpareBitsO* %1 to i64*
// CHECK-64: store i64 %0, i64* [[DATA_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, %T4enum23MultiPayloadNoSpareBitsO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: store i8 0, i8* [[TAG_ADDR]]
// CHECK-64: store i64 %0, ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, ptr %1, i32 0, i32 1
// CHECK-64: store i8 0, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_no_spare_bit_inject_x_indirect : $(Builtin.Int64, @inout MultiPayloadNoSpareBits) -> () {
@@ -1586,13 +1547,11 @@ entry:
return %u : $MultiPayloadNoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_a_indirect(%T4enum23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: store i64 0, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, %T4enum23MultiPayloadNoSpareBitsO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: store i8 3, i8* [[TAG_ADDR]]
// CHECK-64: store i64 0, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadNoSpareBitsO, ptr %0, i32 0, i32 1
// CHECK-64: store i8 3, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_no_spare_bit_inject_a_indirect : $(@inout MultiPayloadNoSpareBits) -> () {
@@ -1720,11 +1679,9 @@ end:
sil @multi_payload_one_spare_bit_switch_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
entry(%u : $*MultiPayloadOneSpareBit):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, %T4enum23MultiPayloadOneSpareBitO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: [[TAG:%.*]] = load i1, i1* [[TAG_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
// CHECK-64: [[TAG:%.*]] = load i1, ptr [[T0]]
// CHECK-64: switch i8 {{%.*}}
// CHECK-64: switch i64 [[PAYLOAD]]
// CHECK-64: {{[0-9]+}}:
@@ -1732,19 +1689,14 @@ entry(%u : $*MultiPayloadOneSpareBit):
switch_enum_addr %u : $*MultiPayloadOneSpareBit, case #MultiPayloadOneSpareBit.x!enumelt: x_dest, case #MultiPayloadOneSpareBit.y!enumelt: y_dest, case #MultiPayloadOneSpareBit.z!enumelt: z_dest, case #MultiPayloadOneSpareBit.a!enumelt: a_dest, case #MultiPayloadOneSpareBit.b!enumelt: b_dest, case #MultiPayloadOneSpareBit.c!enumelt: c_dest
// CHECK-64: [[X_PREDEST:[0-9]+]]:
// CHECK-64: bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i62*
// CHECK-64: [[Y_PREDEST:[0-9]+]]:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i63*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %0
// CHECK-64: [[Z_PREDEST:[0-9]+]]:
// CHECK-64: bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i61*
x_dest:
%x = unchecked_take_enum_data_addr %u : $*MultiPayloadOneSpareBit, #MultiPayloadOneSpareBit.x!enumelt
@@ -1786,22 +1738,17 @@ entry(%0 : $Builtin.Int62):
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_x_indirect(i64 %0, %T4enum23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i62
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i62*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i62* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i62 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, %T4enum23MultiPayloadOneSpareBitO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 false, i1* [[TAG_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
// CHECK-64: store i1 false, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_one_spare_bit_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadOneSpareBit) -> () {
@@ -1829,24 +1776,19 @@ entry(%0 : $Builtin.Int63):
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_y_indirect(i64 %0, %T4enum23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_y_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i63
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i63*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i63* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i63 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// -- 0x8000_0000_0000_0000
// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], -9223372036854775808
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, %T4enum23MultiPayloadOneSpareBitO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 false, i1* [[TAG_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
// CHECK-64: store i1 false, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
@@ -1884,14 +1826,12 @@ entry:
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_a_indirect(%T4enum23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum23MultiPayloadOneSpareBitO* %0 to i64*
// -- 0x8000_0000_0000_0000
// CHECK-64: store i64 -9223372036854775808, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, %T4enum23MultiPayloadOneSpareBitO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 true, i1* [[TAG_ADDR]]
// CHECK-64: store i64 -9223372036854775808, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
// CHECK-64: store i1 true, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_one_spare_bit_inject_a_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
@@ -2030,19 +1970,15 @@ entry(%0 : $Builtin.Int62):
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_x_indirect(i64 %0, %T4enum24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i62
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i62*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i62* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i62 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x3FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 4611686018427387903
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadTwoSpareBits) -> () {
@@ -2068,21 +2004,17 @@ entry(%0 : $Builtin.Int60):
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_y_indirect(i64 %0, %T4enum24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_y_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i60
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i60*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i60* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i60 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x3FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 4611686018427387903
// -- 0x4000_0000_0000_0000
// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], 4611686018427387904
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_y_indirect : $(Builtin.Int60, @inout MultiPayloadTwoSpareBits) -> () {
@@ -2119,11 +2051,10 @@ entry:
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_a_indirect(%T4enum24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T4enum24MultiPayloadTwoSpareBitsO* %0 to i64*
// -- 0xC000_0000_0000_0000
// CHECK-64: store i64 -4611686018427387904, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 -4611686018427387904, ptr %0
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_a_indirect : $(@inout MultiPayloadTwoSpareBits) -> () {
@@ -2183,11 +2114,11 @@ enum MultiPayloadClasses {
// CHECK-64: i64 -9223372036854775800, label {{%.*}}
// CHECK-64: ]
// -- Extract x(C)
// CHECK-64: inttoptr i64 %0 to %T4enum1CC*
// CHECK-64: inttoptr i64 %0 to ptr
// -- Extract y(D)
// -- 0x3fffffffffffffff
// CHECK-64: [[MASKED:%.*]] = and i64 %0, 4611686018427387903
// CHECK-64: inttoptr i64 [[MASKED]] to %T4enum1DC*
// CHECK-64: inttoptr i64 [[MASKED]] to ptr
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_classes_switch(i32 %0) {{.*}} {
// CHECK-32: %1 = trunc i32 %0 to i8
@@ -2202,10 +2133,10 @@ enum MultiPayloadClasses {
// CHECK-32: i32 6, label {{%.*}}
// CHECK-32: ]
// -- Extract x(C)
// CHECK-32: inttoptr i32 %0 to %T4enum1CC*
// CHECK-32: inttoptr i32 %0 to ptr
// -- Extract y(D)
// CHECK-32: [[MASKED:%.*]] = and i32 %0, -4
// CHECK-32: inttoptr i32 [[MASKED]] to %T4enum1DC*
// CHECK-32: inttoptr i32 [[MASKED]] to ptr
sil @multi_payload_classes_switch : $(MultiPayloadClasses) -> () {
entry(%c : $MultiPayloadClasses):
@@ -2255,8 +2186,8 @@ enum MultiPayloadSpareBitAggregates {
// CHECK-64: [[Y_DEST]]:
// -- 0x3fffffffffffffff
// CHECK-64: [[Y_MASKED:%.*]] = and i64 %0, 4611686018427387903
// CHECK-64: [[Y_0:%.*]] = inttoptr i64 [[Y_MASKED]] to %T4enum1CC*
// CHECK-64: [[Y_1:%.*]] = inttoptr i64 %1 to %T4enum1CC*
// CHECK-64: [[Y_0:%.*]] = inttoptr i64 [[Y_MASKED]] to ptr
// CHECK-64: [[Y_1:%.*]] = inttoptr i64 %1 to ptr
// CHECK-64: [[Z_DEST]]:
// -- 0x3fffffffffffffff
// CHECK-64: [[Z_MASKED:%.*]] = and i64 %0, 4611686018427387903
@@ -2291,14 +2222,13 @@ enum MultiPayloadNested {
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_switch
// CHECK: %1 = bitcast %T4enum18MultiPayloadNestedO* %0 to { [[WORD]], i8 }*
// CHECK: %2 = getelementptr
// CHECK: %3 = load [[WORD]], [[WORD]]* %2
// CHECK: %4 = getelementptr
// CHECK: %5 = load i8, i8* %4
// CHECK: %6 = lshr i8 %5, 7
// CHECK: %7 = trunc i8 %6 to i1
// CHECK: br i1 %7
// CHECK: %1 = getelementptr
// CHECK: %2 = load [[WORD]], ptr %1
// CHECK: %3 = getelementptr
// CHECK: %4 = load i8, ptr %3
// CHECK: %5 = lshr i8 %4, 7
// CHECK: %6 = trunc i8 %5 to i1
// CHECK: br i1 %6
sil @multi_payload_nested_switch : $(@in MultiPayloadNested) -> () {
entry(%c : $*MultiPayloadNested):
switch_enum_addr %c : $*MultiPayloadNested, case #MultiPayloadNested.A!enumelt: a_dest, case #MultiPayloadNested.B!enumelt: b_dest
@@ -2325,13 +2255,12 @@ enum MultiPayloadNestedSpareBits {
case B(MultiPayloadInnerSpareBits)
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_spare_bits_switch(%T4enum27MultiPayloadNestedSpareBitsO* noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_spare_bits_switch(ptr noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: %1 = bitcast %T4enum27MultiPayloadNestedSpareBitsO* %0 to [[WORD]]*
// CHECK-64: %2 = load [[WORD]], [[WORD]]* %1
// CHECK-64: %3 = lshr [[WORD]] %2, 61
// CHECK-64: %4 = trunc [[WORD]] %3 to i1
// CHECK-64: br i1 %4
// CHECK-64: %1 = load [[WORD]], ptr %0
// CHECK-64: %2 = lshr [[WORD]] %1, 61
// CHECK-64: %3 = trunc [[WORD]] %2 to i1
// CHECK-64: br i1 %3
sil @multi_payload_nested_spare_bits_switch : $(@in MultiPayloadNestedSpareBits) -> () {
entry(%c : $*MultiPayloadNestedSpareBits):
switch_enum_addr %c : $*MultiPayloadNestedSpareBits, case #MultiPayloadNestedSpareBits.A!enumelt: a_dest, case #MultiPayloadNestedSpareBits.B!enumelt: b_dest
@@ -2377,8 +2306,8 @@ enum MultiPayloadClassGeneric<T: AnyObject> {
case B(T)
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i64, i64, i8 } @multi_payload_class_generic_no_spare_bits(i64 %0, i64 %1, i8 %2, %swift.type* %T)
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i32, i32, i8 } @multi_payload_class_generic_no_spare_bits(i32 %0, i32 %1, i8 %2, %swift.type* %T)
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i64, i64, i8 } @multi_payload_class_generic_no_spare_bits(i64 %0, i64 %1, i8 %2, ptr %T)
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i32, i32, i8 } @multi_payload_class_generic_no_spare_bits(i32 %0, i32 %1, i8 %2, ptr %T)
sil @multi_payload_class_generic_no_spare_bits : $@convention(thin) <T: AnyObject> (@owned MultiPayloadClassGeneric<T>) -> MultiPayloadClassGeneric<T> {
entry(%e : $MultiPayloadClassGeneric<T>):
return %e : $MultiPayloadClassGeneric<T>
@@ -2396,7 +2325,7 @@ enum MultiPayloadAddressOnlyFixed {
case Y(Builtin.Int32)
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_destroy(%T4enum28MultiPayloadAddressOnlyFixedO* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_destroy(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @multi_payload_address_only_destroy : $@convention(thin) (@in MultiPayloadAddressOnlyFixed) -> () {
entry(%m : $*MultiPayloadAddressOnlyFixed):
destroy_addr %m : $*MultiPayloadAddressOnlyFixed
@@ -2416,7 +2345,7 @@ enum MultiPayloadAddressOnlySpareBits {
case Y(AddressOnlySpareBitsPayload)
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_spare_bits(%T4enum32MultiPayloadAddressOnlySpareBitsO* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_spare_bits(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @multi_payload_address_only_spare_bits : $@convention(thin) (@in MultiPayloadAddressOnlySpareBits) -> () {
entry(%m : $*MultiPayloadAddressOnlySpareBits):
destroy_addr %m : $*MultiPayloadAddressOnlySpareBits
@@ -2445,8 +2374,7 @@ typealias AllConcreteTestEnums = (
sil_global @x : $AllConcreteTestEnums
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_singleton_switch_indirect([[DYNAMIC_SINGLETON]]* noalias nocapture %0, %swift.type* %T) {{.*}} {
// CHECK: bitcast [[DYNAMIC_SINGLETON]]* %0 to %swift.opaque*
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_singleton_switch_indirect(ptr noalias nocapture %0, ptr %T) {{.*}} {
// CHECK: ret void
// CHECK: }
sil @dynamic_singleton_switch_indirect : $<T> (@in DynamicSingleton<T>) -> () {
@@ -2552,7 +2480,7 @@ struct StructWithWeakVar {
weak var delegate: delegateProtocol?
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(%T4enum17StructWithWeakVarVSg* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @weak_optional : $@convention(thin) (@in StructWithWeakVar?) -> () {
entry(%x : $*StructWithWeakVar?):
// CHECK-64: icmp eq [[WORD]] {{%.*}}, 0
@@ -2667,54 +2595,48 @@ entry(%x : $*MyOptional):
}
// -- Fill function for dynamic singleton.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s4enum16DynamicSingletonOMi"(%swift.type_descriptor* %0, i8** %1, i8* %2) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: [[T:%T]] = load %swift.type*, %swift.type** [[T0]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2, [[WORD]] {{4|8}})
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s4enum16DynamicSingletonOMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
// CHECK: [[T:%T]] = load ptr, ptr %1,
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata(ptr %0, ptr %1, ptr %2, [[WORD]] {{4|8}})
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s4enum16DynamicSingletonOMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, %swift.type* [[T]])
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, ptr [[T]])
// CHECK: [[T_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[T_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
// CHECK: [[T_OK:%.*]] = icmp ule [[WORD]] [[T_STATUS]], 63
// CHECK: br i1 [[T_OK]],
// CHECK: [[T_VWTS:%.*]] = bitcast %swift.type* [[T_CHECKED]] to i8***
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[T_VWTS]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load i8**, i8*** [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSingleCase(%swift.type* [[METADATA]], [[WORD]] 0, i8** [[T_LAYOUT]])
// CHECK: [[PAYLOAD_TYPELAYOUT:%.*]] = bitcast i8** [[T_LAYOUT]] to %swift.type_layout*
// CHECK: [[PAYLOAD_EXTRAINHABITANTCNT:%.*]] = getelementptr inbounds %swift.type_layout, %swift.type_layout* [[PAYLOAD_TYPELAYOUT]], i32 0, i32 3
// CHECK: [[CNT:%.*]] = load i32, i32* [[PAYLOAD_EXTRAINHABITANTCNT]]
// CHECK: [[METADATA2:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA2]], [[WORD]] -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[VWT2:%.*]] = bitcast i8** [[VWT]] to %swift.vwtable*
// CHECK: [[XIC_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, %swift.vwtable* [[VWT2]], i32 0, i32 11
// CHECK: store i32 [[CNT]], i32* [[XIC_ADDR]]
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load ptr, ptr [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSingleCase(ptr [[METADATA]], [[WORD]] 0, ptr [[T_LAYOUT]])
// CHECK: [[PAYLOAD_EXTRAINHABITANTCNT:%.*]] = getelementptr inbounds %swift.type_layout, ptr [[T_LAYOUT]], i32 0, i32 3
// CHECK: [[CNT:%.*]] = load i32, ptr [[PAYLOAD_EXTRAINHABITANTCNT]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[WORD]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK: [[XIC_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 11
// CHECK: store i32 [[CNT]], ptr [[XIC_ADDR]]
// CHECK: ret %swift.metadata_response
// -- Fill function for dynamic single-payload. Call into the runtime to
// calculate the size.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s4enum20DynamicSinglePayloadOMi"
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s4enum20DynamicSinglePayloadOMi"
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal swiftcc %swift.metadata_response @"$s4enum20DynamicSinglePayloadOMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, %swift.type* [[T]])
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, ptr [[T]])
// CHECK: [[T_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[T_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
// CHECK: [[T_OK:%.*]] = icmp ule [[WORD]] [[T_STATUS]], 63
// CHECK: br i1 [[T_OK]],
// CHECK: [[T_VWTS:%.*]] = bitcast %swift.type* [[T_CHECKED]] to i8***
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[T_VWTS]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load i8**, i8*** [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSinglePayload(%swift.type* [[METADATA]], [[WORD]] 0, i8** [[T_LAYOUT]], i32 3)
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load ptr, ptr [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSinglePayload(ptr [[METADATA]], [[WORD]] 0, ptr [[T_LAYOUT]], i32 3)
// CHECK-64-LABEL: define internal void @"$s4enum17StructWithWeakVarVwst"(%swift.opaque* noalias %value, i32 %whichCase, i32 %numEmptyCases, %swift.type* %StructWithWeakVar)
// CHECK-64-LABEL: define internal void @"$s4enum17StructWithWeakVarVwst"(ptr noalias %value, i32 %whichCase, i32 %numEmptyCases, ptr %StructWithWeakVar)
// -- TODO: some pointless masking here.
// -- TODO: should use EnumPayload word-chunking.
// CHECK-64: [[INDEX:%.*]] = sub i32 %whichCase, 1
@@ -2728,13 +2650,10 @@ entry(%x : $*MyOptional):
// -- 0x1__0000_0000_0000_0000
// CHECK-64: [[T5:%.*]] = or i128 [[T4]], 18446744073709551616
// CHECK-LABEL: define internal i32 @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(%swift.opaque* noalias %value
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value to %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO*
// CHECK: [[VAL01:%.*]] = bitcast %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO* [[VAL00]] to i8*
// CHECK: [[VAL02:%.*]] = load {{.*}} [[VAL01]]
// CHECK: [[VAL03:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL04:%.*]] = bitcast {{.*}} [[VAL03]] to i8*
// CHECK: [[VAL05:%.*]] = load {{.*}} [[VAL04]]
// CHECK-LABEL: define internal i32 @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(ptr noalias %value
// CHECK: [[VAL02:%.*]] = load {{.*}} %value
// CHECK: [[VAL03:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: [[VAL05:%.*]] = load {{.*}} [[VAL03]]
// CHECK: [[VAL06:%.*]] = zext i8 [[VAL05]] to i32
// CHECK: [[VAL07:%.*]] = zext i8 [[VAL02]] to i32
// CHECK: [[VAL08:%.*]] = and i32 [[VAL07]], 255
@@ -2743,27 +2662,23 @@ entry(%x : $*MyOptional):
// CHECK: [[VAL11:%.*]] = select i1 [[VAL10]], i32 [[VAL09]], i32 [[VAL06]]
// CHECK: ret i32 [[VAL11]]
// CHECK-LABEL: define internal void @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(%swift.opaque* noalias %value, i32 %tag
// CHECK-LABEL: define internal void @"$s4enum40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(ptr noalias %value, i32 %tag
// CHECK: entry:
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value
// CHECK: [[VAL01:%.*]] = icmp uge i32 %tag, 2
// CHECK: br i1 [[VAL01]], label %[[TLABEL:.*]], label %[[FLABEL:.*]]
// CHECK: [[TLABEL]]:
// CHECK: [[VAL02:%.*]] = sub i32 %tag, 2
// CHECK: [[VAL03:%.*]] = trunc i32 [[VAL02]] to i8
// CHECK: [[VAL04:%.*]] = bitcast %T4enum40MultiPayloadLessThan32BitsWithEmptyCasesO* [[VAL00]] to i8*
// CHECK: store i8 [[VAL03]], i8* [[VAL04]]
// CHECK: [[VAL05:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL06:%.*]] = bitcast [1 x i8]* [[VAL05]] to i8*
// CHECK: store i8 2, i8* [[VAL06]]
// CHECK: store i8 [[VAL03]], ptr %value
// CHECK: [[VAL05:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: store i8 2, ptr [[VAL05]]
// CHECK: br label %[[RLABEL:.*]]
// CHECK: [[FLABEL]]:
// CHECK: [[VAL09:%.*]] = trunc i32 %tag to i8
// CHECK: [[VAL10:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL11:%.*]] = bitcast [1 x i8]* [[VAL10]] to i8*
// CHECK: store i8 [[VAL09]], i8* [[VAL11]]
// CHECK: [[VAL10:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: store i8 [[VAL09]], ptr [[VAL10]]
// CHECK: br label %[[RLABEL]]
// CHECK: [[RLABEL]]:

View File

@@ -1,7 +1,5 @@
// RUN: %swift %use_no_opaque_pointers -disable-legacy-type-info -target i386-apple-ios7 %s -gnone -emit-ir | %FileCheck %s
// RUN: %swift %use_no_opaque_pointers -disable-legacy-type-info -target armv7-apple-ios7 %s -gnone -emit-ir | %FileCheck %s
// RUN: %swift -disable-legacy-type-info -target i386-apple-ios7 %s -gnone -emit-ir
// RUN: %swift -disable-legacy-type-info -target armv7-apple-ios7 %s -gnone -emit-ir
// RUN: %swift -disable-legacy-type-info -target i386-apple-ios7 %s -gnone -emit-ir | %FileCheck %s
// RUN: %swift -disable-legacy-type-info -target armv7-apple-ios7 %s -gnone -emit-ir | %FileCheck %s
// REQUIRES: CODEGENERATOR=X86
// REQUIRES: CODEGENERATOR=ARM

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -gnone -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
// RUN: %target-swift-frontend -primary-file %s -gnone -emit-ir
// RUN: %target-swift-frontend -primary-file %s -gnone -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
// REQUIRES: CPU=x86_64
@@ -23,15 +22,14 @@ bb0(%0 : $Optional<() -> ()>):
// CHECK: icmp eq i64 %0, 0
switch_enum %0 : $Optional<() -> ()>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
// CHECK: [[FNPTR:%.*]] = inttoptr [[WORD]] %0 to i8*
// CHECK: [[CTX:%.*]] = inttoptr [[WORD]] %1 to %swift.refcounted*
// CHECK: [[FNPTR:%.*]] = inttoptr [[WORD]] %0 to ptr
// CHECK: [[CTX:%.*]] = inttoptr [[WORD]] %1 to ptr
// CHECK: br label
// CHECK: [[FNPTR2:%.*]] = phi i8* [ [[FNPTR]], {{%.*}} ]
// CHECK: [[CTX2:%.*]] = phi %swift.refcounted* [ [[CTX]], {{%.*}} ]
// CHECK: [[FNPTR2:%.*]] = phi ptr [ [[FNPTR]], {{%.*}} ]
// CHECK: [[CTX2:%.*]] = phi ptr [ [[CTX]], {{%.*}} ]
bb1(%1 : $() -> ()):
// CHECK: [[FNPTR3:%.*]] = bitcast i8* [[FNPTR2]] to void (%swift.refcounted*)*
// CHECK: call swiftcc void [[FNPTR3]](%swift.refcounted* swiftself [[CTX2]])
// CHECK: call swiftcc void [[FNPTR2]](ptr swiftself [[CTX2]])
apply %1() : $() -> ()
// CHECK: br label [[CONT:%[0-9]+]]

View File

@@ -1,9 +1,7 @@
// #if directives don't work with SIL keywords, therefore please put ObjC tests
// in `enum_objc.sil`.
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-objc-%target-ptrsize-simulator-%target-is-simulator -DWORD=i%target-ptrsize
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -Xllvm -sil-disable-pass=simplification -target %module-target-future -gnone -emit-ir -disable-diagnostic-passes -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize -DWORD=i%target-ptrsize
// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: VENDOR=apple || OS=linux-gnu
@@ -22,7 +20,7 @@ import Swift
// CHECK: %T11enum_future9SingletonO = type <{ <{ i64, i64 }> }>
// -- Singleton enum with heap object ref payload. <rdar://problem/15679353>
// CHECK: %T11enum_future12SingletonRefO = type <{ %swift.refcounted* }>
// CHECK: %T11enum_future12SingletonRefO = type <{ ptr }>
// -- No-payload enums. The representation is just an enum tag.
// CHECK: %T11enum_future10NoPayloadsO = type <{ i8 }>
@@ -97,15 +95,11 @@ import Swift
// -- Dynamic enums. The type layout is opaque; we dynamically bitcast to
// the element type.
// CHECK: %T11enum_future20DynamicSinglePayloadO = type <{}>
// CHECK: [[DYNAMIC_SINGLE_EMPTY_PAYLOAD:%T11enum_future20DynamicSinglePayloadOyytG]] = type <{ [1 x i8] }>
// -- Address-only multi-payload enums. We can't use spare bits.
// CHECK-64: %T11enum_future32MultiPayloadAddressOnlySpareBitsO = type <{ [16 x i8], [1 x i8] }>
// CHECK-32: %T11enum_future32MultiPayloadAddressOnlySpareBitsO = type <{ [8 x i8], [1 x i8] }>
// CHECK: [[DYNAMIC_SINGLETON:%T11enum_future16DynamicSingletonO.*]] = type <{}>
// CHECK: %T11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesO = type <{ [1 x i8], [1 x i8] }>
// -- Dynamic metadata template carries a value witness table pattern
@@ -118,13 +112,13 @@ import Swift
// CHECK-SAME: i32 6291456,
// CHECK-SAME: i32 0,
// Enum witnesses.
// CHECK-SAME: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s11enum_future16DynamicSingletonOwug" to i8*)
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s11enum_future16DynamicSingletonOwup" to i8*)
// CHECK-SAME: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s11enum_future16DynamicSingletonOwui" to i8*)
// CHECK-SAME: ptr @"$s11enum_future16DynamicSingletonOwug"
// CHECK-SAME: ptr @"$s11enum_future16DynamicSingletonOwup"
// CHECK-SAME: ptr @"$s11enum_future16DynamicSingletonOwui"
// CHECK: [[DYNAMICSINGLETON_NAME:@.*]] = private constant [17 x i8] c"DynamicSingleton\00"
// CHECK: @"$s11enum_future16DynamicSingletonOMn" = hidden constant <{
// CHECK-SAME: [17 x i8]* [[DYNAMICSINGLETON_NAME]]
// CHECK-SAME: ptr [[DYNAMICSINGLETON_NAME]]
// -- One payload
// CHECK-SAME: i32 1,
// -- No empty cases
@@ -139,7 +133,7 @@ import Swift
// CHECK: @"$s11enum_future16DynamicSingletonOMP" = internal constant <{ {{.*}} }> <{
// CHECK-SAME: @"$s11enum_future16DynamicSingletonOMi"
// CHECK-SAME: %swift.enum_vwtable* @"$s11enum_future16DynamicSingletonOWV"
// CHECK-SAME: ptr @"$s11enum_future16DynamicSingletonOWV"
// -- No-payload enums have extra inhabitants in
// their value witness table.
@@ -177,7 +171,7 @@ import Swift
// CHECK: @"$s11enum_future20DynamicSinglePayloadOMP" = internal constant <{ {{.*}} }> <{
// CHECK-SAME: @"$s11enum_future20DynamicSinglePayloadOMi"
// CHECK-SAME: %swift.enum_vwtable* @"$s11enum_future20DynamicSinglePayloadOWV"
// CHECK-SAME: ptr @"$s11enum_future20DynamicSinglePayloadOWV"
// CHECK: @"$s11enum_future18MultiPayloadNestedOWV" = internal constant %swift.enum_vwtable {
// -- size
@@ -208,7 +202,7 @@ enum DynamicSingleton<T> {
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(i64 %0, i64 %1) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(%T11enum_future9SingletonO* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @singleton_switch : $(Singleton) -> () {
// CHECK-64: entry:
// CHECK-32: entry:
@@ -227,12 +221,12 @@ dest:
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(i64 %0, i64 %1) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(%T11enum_future9SingletonO* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_arg(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @singleton_switch_arg : $(Singleton) -> () {
// CHECK-64: entry:
// CHECK-32: entry:
entry(%u : $Singleton):
// CHECK-32: call %T11enum_future9SingletonO* @"$s11enum_future9SingletonOWOb"
// CHECK-32: call ptr @"$s11enum_future9SingletonOWOb"
// CHECK-64: br label %[[PREDEST:[0-9]+]]
// CHECK-32: br label %[[PREDEST:[0-9]+]]
switch_enum %u : $Singleton, case #Singleton.value!enumelt: dest
@@ -248,11 +242,10 @@ dest(%u2 : $(Builtin.Int64, Builtin.Int64)):
return %x : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_indirect(%T11enum_future9SingletonO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: br label %[[DEST:[0-9]+]]
// CHECK: [[DEST]]:
// CHECK: [[ADDR:%.*]] = bitcast %T11enum_future9SingletonO* %0 to <{ i64, i64 }>*
// CHECK: ret void
// CHECK: }
sil @singleton_switch_indirect : $(@inout Singleton) -> () {
@@ -270,13 +263,12 @@ dest:
// CHECK-64: [[B:%.*]] = insertvalue { i64, i64 } [[A]], i64 %1, 1
// CHECK-64: ret { i64, i64 } [[B]]
// CHECK-64: }
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject(%T11enum_future9SingletonO* noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject(ptr noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2) {{.*}} {
// CHECK-32: entry:
// CHECK-32: [[CAST:%.*]] = bitcast %T11enum_future9SingletonO* %0 to <{ i64, i64 }>*
// CHECK-32: [[GEP1:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[CAST]], i32 0, i32 0
// CHECK-32: store i64 %1, i64* [[GEP1]]
// CHECK-32: [[GEP2:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[CAST]], i32 0, i32 1
// CHECK-32: store i64 %2, i64* [[GEP2]]
// CHECK-32: [[GEP1:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %0, i32 0, i32 0
// CHECK-32: store i64 %1, ptr [[GEP1]]
// CHECK-32: [[GEP2:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %0, i32 0, i32 1
// CHECK-32: store i64 %2, ptr [[GEP2]]
// CHECK-32: ret void
// CHECK-32: }
sil @singleton_inject : $(Builtin.Int64, Builtin.Int64) -> Singleton {
@@ -286,13 +278,12 @@ entry(%0 : $Builtin.Int64, %1 : $Builtin.Int64):
return %u : $Singleton
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject_indirect(i64 %0, i64 %1, %T11enum_future9SingletonO* nocapture dereferenceable({{.*}}) %2) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @singleton_inject_indirect(i64 %0, i64 %1, ptr nocapture dereferenceable({{.*}}) %2) {{.*}} {
// CHECK: entry:
// CHECK: [[DATA_ADDR:%.*]] = bitcast %T11enum_future9SingletonO* %2 to <{ i64, i64 }>*
// CHECK: [[DATA_0_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[DATA_ADDR]], i32 0, i32 0
// CHECK: store i64 %0, i64* [[DATA_0_ADDR]]
// CHECK: [[DATA_1_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, <{ i64, i64 }>* [[DATA_ADDR]], i32 0, i32 1
// CHECK: store i64 %1, i64* [[DATA_1_ADDR]]
// CHECK: [[DATA_0_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %2, i32 0, i32 0
// CHECK: store i64 %0, ptr [[DATA_0_ADDR]]
// CHECK: [[DATA_1_ADDR:%.*]] = getelementptr inbounds <{ i64, i64 }>, ptr %2, i32 0, i32 1
// CHECK: store i64 %1, ptr [[DATA_1_ADDR]]
// CHECK: ret void
// CHECK: }
sil @singleton_inject_indirect : $(Builtin.Int64, Builtin.Int64, @inout Singleton) -> () {
@@ -362,11 +353,11 @@ end:
return %x : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_switch_indirect(%T11enum_future10NoPayloadsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
sil @no_payload_switch_indirect : $@convention(thin) (@inout NoPayloads) -> () {
entry(%u : $*NoPayloads):
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T11enum_future10NoPayloadsO, %T11enum_future10NoPayloadsO* %0, i32 0, i32 0
// CHECK: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]]
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T11enum_future10NoPayloadsO, ptr %0, i32 0, i32 0
// CHECK: [[TAG:%.*]] = load i8, ptr [[TAG_ADDR]]
// CHECK: switch i8 [[TAG]]
switch_enum_addr %u : $*NoPayloads, case #NoPayloads.x!enumelt: x_dest, case #NoPayloads.y!enumelt: y_dest, case #NoPayloads.z!enumelt: z_dest
@@ -411,10 +402,10 @@ entry:
return %u : $NoPayloads
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_inject_z_indirect(%T11enum_future10NoPayloadsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @no_payload_inject_z_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T11enum_future10NoPayloadsO, %T11enum_future10NoPayloadsO* %0, i32 0, i32 0
// CHECK: store i8 2, i8* [[TAG_ADDR]]
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T11enum_future10NoPayloadsO, ptr %0, i32 0, i32 0
// CHECK: store i8 2, ptr [[TAG_ADDR]]
// CHECK: ret void
// CHECK: }
sil @no_payload_inject_z_indirect : $(@inout NoPayloads) -> () {
@@ -642,13 +633,11 @@ entry(%0 : $Builtin.Word):
return %u : $SinglePayloadNoXI2
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_x_indirect([[WORD]] %0, %T11enum_future18SinglePayloadNoXI2O* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_x_indirect([[WORD]] %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: entry:
// CHECK: [[DATA_ADDR:%.*]] = bitcast %T11enum_future18SinglePayloadNoXI2O* %1 to [[WORD]]*
// CHECK: store [[WORD]] %0, [[WORD]]* [[DATA_ADDR]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %T11enum_future18SinglePayloadNoXI2O, %T11enum_future18SinglePayloadNoXI2O* %1, i32 0, i32 1
// CHECK: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK: store i1 false, i1* [[TAG_ADDR]]
// CHECK: store [[WORD]] %0, ptr %1
// CHECK: [[T0:%.*]] = getelementptr inbounds %T11enum_future18SinglePayloadNoXI2O, ptr %1, i32 0, i32 1
// CHECK: store i1 false, ptr [[T0]]
// CHECK: ret void
// CHECK: }
sil @single_payload_no_xi_inject_x_indirect : $(Builtin.Word, @inout SinglePayloadNoXI2) -> () {
@@ -670,13 +659,11 @@ entry:
return %u : $SinglePayloadNoXI2
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_y_indirect(%T11enum_future18SinglePayloadNoXI2O* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_no_xi_inject_y_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future18SinglePayloadNoXI2O* %0 to [[WORD]]*
// CHECK: store [[WORD]] 0, [[WORD]]* [[PAYLOAD_ADDR]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %T11enum_future18SinglePayloadNoXI2O, %T11enum_future18SinglePayloadNoXI2O* %0, i32 0, i32 1
// CHECK: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK: store i1 true, i1* [[TAG_ADDR]]
// CHECK: store [[WORD]] 0, ptr %0
// CHECK: [[T0:%.*]] = getelementptr inbounds %T11enum_future18SinglePayloadNoXI2O, ptr %0, i32 0, i32 1
// CHECK: store i1 true, ptr [[T0]]
// CHECK: ret void
// CHECK: }
sil @single_payload_no_xi_inject_y_indirect : $(@inout SinglePayloadNoXI2) -> () {
@@ -769,7 +756,7 @@ enum AggregateSinglePayload2 {
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2([[WORD]] %0, [[WORD]] %1, [[WORD]] %2, [[WORD]] %3) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2(%T11enum_future23AggregateSinglePayload2O* noalias nocapture dereferenceable(16) %0) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_unpack_2(ptr noalias nocapture dereferenceable(16) %0) {{.*}} {
sil @aggregate_single_payload_unpack_2 : $@convention(thin) (AggregateSinglePayload2) -> () {
entry(%u : $AggregateSinglePayload2):
switch_enum %u : $AggregateSinglePayload2, case #AggregateSinglePayload2.x!enumelt: x_dest, default default_dest
@@ -800,15 +787,14 @@ end:
// CHECK-64: %9 = insertvalue { [[WORD]], [[WORD]], [[WORD]], [[WORD]] } %8, [[WORD]] %3, 3
// CHECK-64: ret { [[WORD]], [[WORD]], [[WORD]], [[WORD]] } %9
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_2_inject(%T11enum_future23AggregateSinglePayload2O* noalias nocapture sret({{.*}}) %0, i32 %1, i32 %2, i32 %3, i32 %4) {{.*}} {
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @aggregate_single_payload_2_inject(ptr noalias nocapture sret({{.*}}) %0, i32 %1, i32 %2, i32 %3, i32 %4) {{.*}} {
// CHECK-32: [[TRUNC:%.*]] = trunc i32 %1 to i21
// CHECK-32: [[ZEXT:%.*]] = zext i21 [[TRUNC]] to i32
// CHECK-32: [[CAST:%.*]] = bitcast %T11enum_future23AggregateSinglePayload2O* %0 to { i32, i32, i32, i32 }*
// CHECK-32: [[GEP:%.*]] = getelementptr inbounds {{.*}} [[CAST]], i32 0, i32 0
// CHECK-32: store i32 [[ZEXT]], i32* [[GEP]]
// CHECK-32: store i32 %2, i32*
// CHECK-32: store i32 %3, i32*
// CHECK-32: store i32 %4, i32*
// CHECK-32: [[GEP:%.*]] = getelementptr inbounds {{.*}} %0, i32 0, i32 0
// CHECK-32: store i32 [[ZEXT]], ptr [[GEP]]
// CHECK-32: store i32 %2, ptr
// CHECK-32: store i32 %3, ptr
// CHECK-32: store i32 %4, ptr
// CHECK-32: ret void
sil @aggregate_single_payload_2_inject : $(CharLike, IntLike, RangeLike) -> AggregateSinglePayload2 {
entry(%0 : $CharLike, %1 : $IntLike, %2 : $RangeLike):
@@ -976,13 +962,11 @@ end:
sil @single_payload_spare_bit_switch_indirect : $@convention(thin) (@inout SinglePayloadSpareBit) -> () {
entry(%u : $*SinglePayloadSpareBit):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future21SinglePayloadSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: switch i64 [[PAYLOAD]], label %[[DFLT:[0-9]+]] [
switch_enum_addr %u : $*SinglePayloadSpareBit, case #SinglePayloadSpareBit.x!enumelt: x_dest, case #SinglePayloadSpareBit.y!enumelt: y_dest, case #SinglePayloadSpareBit.z!enumelt: z_dest
// CHECK-64: [[DFLT]]:
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future21SinglePayloadSpareBitO* %0 to i63*
x_dest:
%u2 = unchecked_take_enum_data_addr %u : $*SinglePayloadSpareBit, #SinglePayloadSpareBit.x!enumelt
%a = function_ref @a : $@convention(thin) () -> ()
@@ -1012,13 +996,11 @@ entry(%0 : $Builtin.Int63):
return %u : $SinglePayloadSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_x_indirect(i64 %0, %T11enum_future21SinglePayloadSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[T:%.*]] = trunc i64 %0 to i63
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future21SinglePayloadSpareBitO* %1 to i63*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i63* [[DATA_ADDR]] to i64*
// CHECK-64: [[BYTE:%.*]] = zext i63 [[T]] to i64
// CHECK-64: store i64 [[BYTE]], i64* [[BYTE_ADDR]]
// CHECK-64: store i64 [[BYTE]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @single_payload_spare_bit_inject_x_indirect : $(Builtin.Int63, @inout SinglePayloadSpareBit) -> () {
@@ -1041,11 +1023,10 @@ entry:
return %u : $SinglePayloadSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_y_indirect(%T11enum_future21SinglePayloadSpareBitO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_spare_bit_inject_y_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future21SinglePayloadSpareBitO* %0 to i64*
// -- 0x8000_0000_0000_0000
// CHECK-64: store i64 -9223372036854775808, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 -9223372036854775808, ptr %0
// CHECK-64: ret void
// CHECK-64: }
sil @single_payload_spare_bit_inject_y_indirect : $(@inout SinglePayloadSpareBit) -> () {
@@ -1154,7 +1135,7 @@ enum SinglePayloadClass {
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-64: [[DFLT]]:
// CHECK-64: inttoptr [[WORD]] %0 to %T11enum_future1CC*
// CHECK-64: inttoptr [[WORD]] %0 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_switch(i32 %0) {{.*}} {
// CHECK-32: entry:
@@ -1164,7 +1145,7 @@ enum SinglePayloadClass {
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-32: [[DFLT]]:
// CHECK-32: inttoptr [[WORD]] %0 to %T11enum_future1CC*
// CHECK-32: inttoptr [[WORD]] %0 to ptr
sil @single_payload_class_switch : $(SinglePayloadClass) -> () {
entry(%c : $SinglePayloadClass):
@@ -1201,9 +1182,9 @@ enum SinglePayloadClassProtocol {
// CHECK-native-64: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-objc-64: inttoptr i64 %0 to %objc_object*
// CHECK-native-64: inttoptr i64 %0 to %swift.refcounted*
// CHECK-64: inttoptr i64 %1 to i8**
// CHECK-objc-64: inttoptr i64 %0 to ptr
// CHECK-native-64: inttoptr i64 %0 to ptr
// CHECK-64: inttoptr i64 %1 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i32 %0, i32 %1) {{.*}} {
// CHECK-32: switch i32 %0, label {{%.*}} [
@@ -1212,9 +1193,9 @@ enum SinglePayloadClassProtocol {
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-objc-32: inttoptr i32 %0 to %objc_object*
// CHECK-native-32: inttoptr i32 %0 to %swift.refcounted*
// CHECK-32: inttoptr i32 %1 to i8**
// CHECK-objc-32: inttoptr i32 %0 to ptr
// CHECK-native-32: inttoptr i32 %0 to ptr
// CHECK-32: inttoptr i32 %1 to ptr
sil @single_payload_class_protocol_switch : $(SinglePayloadClassProtocol) -> () {
entry(%c : $SinglePayloadClassProtocol):
@@ -1240,15 +1221,12 @@ enum DynamicSinglePayload<T> {
case w
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_switch(%T11enum_future20DynamicSinglePayloadO* noalias nocapture %0, %swift.type* %T) {{.*}} {
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T11enum_future20DynamicSinglePayloadO* %0 to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 6
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %getEnumTagSinglePayload = bitcast i8* [[WITNESS]] to i32 (%swift.opaque*, i32, %swift.type*)*
// CHECK: [[CASE_INDEX:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_switch(ptr noalias nocapture %0, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 6
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: [[CASE_INDEX:%.*]] = call i32 [[WITNESS]](ptr noalias %0, i32 3, ptr %T)
// CHECK: switch i32 [[CASE_INDEX]], label {{%.*}} [
// CHECK: i32 0, label {{%.*}}
// CHECK: i32 3, label {{%.*}}
@@ -1271,16 +1249,12 @@ end:
return %v : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_x(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.opaque* noalias nocapture %1, %swift.type* %T) {{.*}} {
// CHECK: [[ARG:%.*]] = bitcast %swift.opaque* %0 to %T11enum_future20DynamicSinglePayloadO*
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T11enum_future20DynamicSinglePayloadO* [[ARG]] to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %storeEnumTagSinglePayload = bitcast i8* [[WITNESS]] to void (%swift.opaque*, i32, i32, %swift.type*)*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 0, i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_x(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: call void [[WITNESS]](ptr noalias %0, i32 0, i32 3, ptr %T)
sil @dynamic_single_payload_inject_x : $<T> (@in T) -> @out DynamicSinglePayload<T> {
entry(%r : $*DynamicSinglePayload<T>, %t : $*T):
inject_enum_addr %r : $*DynamicSinglePayload<T>, #DynamicSinglePayload.x!enumelt
@@ -1288,16 +1262,12 @@ entry(%r : $*DynamicSinglePayload<T>, %t : $*T):
return %v : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_y(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.type* %T) {{.*}} {
// CHECK: [[ARG:%.*]] = bitcast %swift.opaque* %0 to %T11enum_future20DynamicSinglePayloadO*
// CHECK: [[OPAQUE_ENUM:%.*]] = bitcast %T11enum_future20DynamicSinglePayloadO* [[ARG]] to %swift.opaque*
// CHECK: [[TMP:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[TMP2:%.*]] = getelementptr inbounds i8**, i8*** [[TMP]], i{{.*}} -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load i8*, i8** [[ENUMADDR]]
// CHECK: %storeEnumTagSinglePayload = bitcast i8* [[WITNESS]] to void (%swift.opaque*, i32, i32, %swift.type*)*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE_ENUM]], i32 1, i32 3, %swift.type* %T)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_inject_y(ptr noalias nocapture sret({{.*}}) %0, ptr %T) {{.*}} {
// CHECK: [[TMP2:%.*]] = getelementptr inbounds ptr, ptr %T, i{{.*}} -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[TMP2]]
// CHECK: [[ENUMADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 7
// CHECK: [[WITNESS:%.*]] = load ptr, ptr [[ENUMADDR]]
// CHECK: call void [[WITNESS]](ptr noalias %0, i32 1, i32 3, ptr %T)
sil @dynamic_single_payload_inject_y : $<T> () -> @out DynamicSinglePayload<T> {
entry(%r : $*DynamicSinglePayload<T>):
inject_enum_addr %r : $*DynamicSinglePayload<T>, #DynamicSinglePayload.y!enumelt
@@ -1338,11 +1308,10 @@ end(%z : $()):
return %z : $()
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @dynamic_single_payload_empty_payload_load([[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8 @dynamic_single_payload_empty_payload_load(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: entry:
// CHECK: %1 = bitcast [[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* %0 to i8*
// CHECK: %2 = load i8, i8* %1
// CHECK: ret i8 %2
// CHECK: %1 = load i8, ptr %0
// CHECK: ret i8 %1
// CHECK: }
sil @dynamic_single_payload_empty_payload_load : $(@inout DynamicSinglePayload<()>) -> DynamicSinglePayload<()> {
entry(%p : $*DynamicSinglePayload<()>):
@@ -1350,10 +1319,9 @@ entry(%p : $*DynamicSinglePayload<()>):
return %x : $DynamicSinglePayload<()>
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_empty_payload_store([[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* nocapture dereferenceable({{.*}}) %0, i8 %1) {{.*}} {
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_empty_payload_store(ptr nocapture dereferenceable({{.*}}) %0, i8 %1) {{.*}} {
// CHECK: entry:
// CHECK: %2 = bitcast [[DYNAMIC_SINGLE_EMPTY_PAYLOAD]]* %0 to i8*
// CHECK: store i8 %1, i8* %2
// CHECK: store i8 %1, ptr %0
// CHECK: ret void
// CHECK: }
sil @dynamic_single_payload_empty_payload_store : $(@inout DynamicSinglePayload<()>, DynamicSinglePayload<()>) -> () {
@@ -1386,7 +1354,7 @@ sil @dynamic_single_payload_empty_payload_inject_no_payload : $() -> DynamicSing
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_single_payload_generic_destroy
// CHECK: br i1
// CHECK: {{[0-9]+}}:
// CHECK: call void %destroy
// CHECK: call void
// CHECK: {{[0-9]+}}:
sil @dynamic_single_payload_generic_destroy : $@convention(thin) <T> (@in DynamicSinglePayload<T>) -> () {
entry(%x : $*DynamicSinglePayload<T>):
@@ -1476,14 +1444,12 @@ end:
return %v : $()
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bits_switch_indirect(%T11enum_future23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bits_switch_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
sil @multi_payload_no_spare_bits_switch_indirect : $(@inout MultiPayloadNoSpareBits) -> () {
entry(%u : $*MultiPayloadNoSpareBits):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, %T11enum_future23MultiPayloadNoSpareBitsO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, ptr %0, i32 0, i32 1
// CHECK-64: [[TAG:%.*]] = load i8, ptr [[T0]]
// CHECK-64: switch i8 [[TAG]]
// CHECK-64: switch i64 [[PAYLOAD]]
// CHECK-64: {{[0-9]+}}:
@@ -1491,11 +1457,8 @@ entry(%u : $*MultiPayloadNoSpareBits):
switch_enum_addr %u : $*MultiPayloadNoSpareBits, case #MultiPayloadNoSpareBits.x!enumelt: x_dest, case #MultiPayloadNoSpareBits.y!enumelt: y_dest, case #MultiPayloadNoSpareBits.z!enumelt: z_dest, case #MultiPayloadNoSpareBits.a!enumelt: a_dest, case #MultiPayloadNoSpareBits.b!enumelt: b_dest, case #MultiPayloadNoSpareBits.c!enumelt: c_dest
// CHECK-64: [[X_DEST:[0-9]+]]:
// CHECK-64: bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: [[Y_DEST:[0-9]+]]:
// CHECK-64: bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %0 to i32*
// CHECK-64: [[Z_DEST:[0-9]+]]:
// CHECK-64: bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %0 to i63*
x_dest:
%x = unchecked_take_enum_data_addr %u : $*MultiPayloadNoSpareBits, #MultiPayloadNoSpareBits.x!enumelt
@@ -1535,13 +1498,11 @@ entry(%0 : $Builtin.Int64):
return %u : $MultiPayloadNoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_x_indirect(i64 %0, %T11enum_future23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %1 to i64*
// CHECK-64: store i64 %0, i64* [[DATA_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, %T11enum_future23MultiPayloadNoSpareBitsO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: store i8 0, i8* [[TAG_ADDR]]
// CHECK-64: store i64 %0, ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, ptr %1, i32 0, i32 1
// CHECK-64: store i8 0, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_no_spare_bit_inject_x_indirect : $(Builtin.Int64, @inout MultiPayloadNoSpareBits) -> () {
@@ -1590,13 +1551,11 @@ entry:
return %u : $MultiPayloadNoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_a_indirect(%T11enum_future23MultiPayloadNoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_no_spare_bit_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadNoSpareBitsO* %0 to i64*
// CHECK-64: store i64 0, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, %T11enum_future23MultiPayloadNoSpareBitsO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-64: store i8 3, i8* [[TAG_ADDR]]
// CHECK-64: store i64 0, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadNoSpareBitsO, ptr %0, i32 0, i32 1
// CHECK-64: store i8 3, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_no_spare_bit_inject_a_indirect : $(@inout MultiPayloadNoSpareBits) -> () {
@@ -1724,11 +1683,9 @@ end:
sil @multi_payload_one_spare_bit_switch_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
entry(%u : $*MultiPayloadOneSpareBit):
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, %T11enum_future23MultiPayloadOneSpareBitO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: [[TAG:%.*]] = load i1, i1* [[TAG_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
// CHECK-64: [[TAG:%.*]] = load i1, ptr [[T0]]
// CHECK-64: switch i8 {{%.*}}
// CHECK-64: switch i64 [[PAYLOAD]]
// CHECK-64: {{[0-9]+}}:
@@ -1736,19 +1693,14 @@ entry(%u : $*MultiPayloadOneSpareBit):
switch_enum_addr %u : $*MultiPayloadOneSpareBit, case #MultiPayloadOneSpareBit.x!enumelt: x_dest, case #MultiPayloadOneSpareBit.y!enumelt: y_dest, case #MultiPayloadOneSpareBit.z!enumelt: z_dest, case #MultiPayloadOneSpareBit.a!enumelt: a_dest, case #MultiPayloadOneSpareBit.b!enumelt: b_dest, case #MultiPayloadOneSpareBit.c!enumelt: c_dest
// CHECK-64: [[X_PREDEST:[0-9]+]]:
// CHECK-64: bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i62*
// CHECK-64: [[Y_PREDEST:[0-9]+]]:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i63*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %0
// CHECK-64: [[Z_PREDEST:[0-9]+]]:
// CHECK-64: bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i61*
x_dest:
%x = unchecked_take_enum_data_addr %u : $*MultiPayloadOneSpareBit, #MultiPayloadOneSpareBit.x!enumelt
@@ -1790,22 +1742,17 @@ entry(%0 : $Builtin.Int62):
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_x_indirect(i64 %0, %T11enum_future23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i62
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i62*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i62* [[DATA_ADDR]] to i64*
// CHECK-64: [[VAL:%.*]] = zext i62 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[VAL]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[VAL]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, %T11enum_future23MultiPayloadOneSpareBitO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 false, i1* [[TAG_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
// CHECK-64: store i1 false, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_one_spare_bit_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadOneSpareBit) -> () {
@@ -1833,24 +1780,19 @@ entry(%0 : $Builtin.Int63):
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_y_indirect(i64 %0, %T11enum_future23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_y_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i63
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i63*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i63* [[DATA_ADDR]] to i64*
// CHECK-64: [[VAL:%.*]] = zext i63 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[VAL]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[VAL]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x7FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// -- 0x8000_0000_0000_0000
// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], -9223372036854775808
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, %T11enum_future23MultiPayloadOneSpareBitO* %1, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 false, i1* [[TAG_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
// CHECK-64: store i1 false, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
@@ -1888,14 +1830,12 @@ entry:
return %u : $MultiPayloadOneSpareBit
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_a_indirect(%T11enum_future23MultiPayloadOneSpareBitO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future23MultiPayloadOneSpareBitO* %0 to i64*
// -- 0x8000_0000_0000_0000
// CHECK-64: store i64 -9223372036854775808, i64* [[PAYLOAD_ADDR]]
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, %T11enum_future23MultiPayloadOneSpareBitO* %0, i32 0, i32 1
// CHECK-64: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i1*
// CHECK-64: store i1 true, i1* [[TAG_ADDR]]
// CHECK-64: store i64 -9223372036854775808, ptr %0
// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T11enum_future23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
// CHECK-64: store i1 true, ptr [[T0]]
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_one_spare_bit_inject_a_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
@@ -2034,19 +1974,15 @@ entry(%0 : $Builtin.Int62):
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_x_indirect(i64 %0, %T11enum_future24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_x_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i62
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i62*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i62* [[DATA_ADDR]] to i64*
// CHECK-64: [[VAL:%.*]] = zext i62 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[VAL]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[VAL]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x3FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 4611686018427387903
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_MASKED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadTwoSpareBits) -> () {
@@ -2072,21 +2008,17 @@ entry(%0 : $Builtin.Int60):
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_y_indirect(i64 %0, %T11enum_future24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_y_indirect(i64 %0, ptr nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i64 %0 to i60
// CHECK-64: [[DATA_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i60*
// CHECK-64: [[BYTE_ADDR:%.*]] = bitcast i60* [[DATA_ADDR]] to i64*
// CHECK-64: [[VAL:%.*]] = zext i60 [[NATIVECC_TRUNC]] to i64
// CHECK-64: store i64 [[VAL]], i64* [[BYTE_ADDR]]
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[VAL]], ptr %1
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %1
// -- 0x3FFF_FFFF_FFFF_FFFF
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 4611686018427387903
// -- 0x4000_0000_0000_0000
// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], 4611686018427387904
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %1 to i64*
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_y_indirect : $(Builtin.Int60, @inout MultiPayloadTwoSpareBits) -> () {
@@ -2123,11 +2055,10 @@ entry:
return %u : $MultiPayloadTwoSpareBits
}
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_a_indirect(%T11enum_future24MultiPayloadTwoSpareBitsO* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_two_spare_bits_inject_a_indirect(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: [[PAYLOAD_ADDR:%.*]] = bitcast %T11enum_future24MultiPayloadTwoSpareBitsO* %0 to i64*
// -- 0xC000_0000_0000_0000
// CHECK-64: store i64 -4611686018427387904, i64* [[PAYLOAD_ADDR]]
// CHECK-64: store i64 -4611686018427387904, ptr %0
// CHECK-64: ret void
// CHECK-64: }
sil @multi_payload_two_spare_bits_inject_a_indirect : $(@inout MultiPayloadTwoSpareBits) -> () {
@@ -2187,11 +2118,11 @@ enum MultiPayloadClasses {
// CHECK-64: i64 -9223372036854775800, label {{%.*}}
// CHECK-64: ]
// -- Extract x(C)
// CHECK-64: inttoptr i64 %0 to %T11enum_future1CC*
// CHECK-64: inttoptr i64 %0 to ptr
// -- Extract y(D)
// -- 0x3fffffffffffffff
// CHECK-64: [[MASKED:%.*]] = and i64 %0, 4611686018427387903
// CHECK-64: inttoptr i64 [[MASKED]] to %T11enum_future1DC*
// CHECK-64: inttoptr i64 [[MASKED]] to ptr
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_classes_switch(i32 %0) {{.*}} {
// CHECK-32: %1 = trunc i32 %0 to i8
@@ -2206,10 +2137,10 @@ enum MultiPayloadClasses {
// CHECK-32: i32 6, label {{%.*}}
// CHECK-32: ]
// -- Extract x(C)
// CHECK-32: inttoptr i32 %0 to %T11enum_future1CC*
// CHECK-32: inttoptr i32 %0 to ptr
// -- Extract y(D)
// CHECK-32: [[MASKED:%.*]] = and i32 %0, -4
// CHECK-32: inttoptr i32 [[MASKED]] to %T11enum_future1DC*
// CHECK-32: inttoptr i32 [[MASKED]] to ptr
sil @multi_payload_classes_switch : $(MultiPayloadClasses) -> () {
entry(%c : $MultiPayloadClasses):
@@ -2259,8 +2190,8 @@ enum MultiPayloadSpareBitAggregates {
// CHECK-64: [[Y_DEST]]:
// -- 0x3fffffffffffffff
// CHECK-64: [[Y_MASKED:%.*]] = and i64 %0, 4611686018427387903
// CHECK-64: [[Y_0:%.*]] = inttoptr i64 [[Y_MASKED]] to %T11enum_future1CC*
// CHECK-64: [[Y_1:%.*]] = inttoptr i64 %1 to %T11enum_future1CC*
// CHECK-64: [[Y_0:%.*]] = inttoptr i64 [[Y_MASKED]] to ptr
// CHECK-64: [[Y_1:%.*]] = inttoptr i64 %1 to ptr
// CHECK-64: [[Z_DEST]]:
// -- 0x3fffffffffffffff
// CHECK-64: [[Z_MASKED:%.*]] = and i64 %0, 4611686018427387903
@@ -2295,14 +2226,13 @@ enum MultiPayloadNested {
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_switch
// CHECK: %1 = bitcast %T11enum_future18MultiPayloadNestedO* %0 to { [[WORD]], i8 }*
// CHECK: %2 = getelementptr
// CHECK: %3 = load [[WORD]], [[WORD]]* %2
// CHECK: %4 = getelementptr
// CHECK: %5 = load i8, i8* %4
// CHECK: %6 = lshr i8 %5, 7
// CHECK: %7 = trunc i8 %6 to i1
// CHECK: br i1 %7
// CHECK: %1 = getelementptr
// CHECK: %2 = load [[WORD]], ptr %1
// CHECK: %3 = getelementptr
// CHECK: %4 = load i8, ptr %3
// CHECK: %5 = lshr i8 %4, 7
// CHECK: %6 = trunc i8 %5 to i1
// CHECK: br i1 %6
sil @multi_payload_nested_switch : $(@in MultiPayloadNested) -> () {
entry(%c : $*MultiPayloadNested):
switch_enum_addr %c : $*MultiPayloadNested, case #MultiPayloadNested.A!enumelt: a_dest, case #MultiPayloadNested.B!enumelt: b_dest
@@ -2329,13 +2259,12 @@ enum MultiPayloadNestedSpareBits {
case B(MultiPayloadInnerSpareBits)
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_spare_bits_switch(%T11enum_future27MultiPayloadNestedSpareBitsO* noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_nested_spare_bits_switch(ptr noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-64: entry:
// CHECK-64: %1 = bitcast %T11enum_future27MultiPayloadNestedSpareBitsO* %0 to [[WORD]]*
// CHECK-64: %2 = load [[WORD]], [[WORD]]* %1
// CHECK-64: %3 = lshr [[WORD]] %2, 61
// CHECK-64: %4 = trunc [[WORD]] %3 to i1
// CHECK-64: br i1 %4
// CHECK-64: %1 = load [[WORD]], ptr %0
// CHECK-64: %2 = lshr [[WORD]] %1, 61
// CHECK-64: %3 = trunc [[WORD]] %2 to i1
// CHECK-64: br i1 %3
sil @multi_payload_nested_spare_bits_switch : $(@in MultiPayloadNestedSpareBits) -> () {
entry(%c : $*MultiPayloadNestedSpareBits):
switch_enum_addr %c : $*MultiPayloadNestedSpareBits, case #MultiPayloadNestedSpareBits.A!enumelt: a_dest, case #MultiPayloadNestedSpareBits.B!enumelt: b_dest
@@ -2381,8 +2310,8 @@ enum MultiPayloadClassGeneric<T: AnyObject> {
case B(T)
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i64, i64, i8 } @multi_payload_class_generic_no_spare_bits(i64 %0, i64 %1, i8 %2, %swift.type* %T)
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i32, i32, i8 } @multi_payload_class_generic_no_spare_bits(i32 %0, i32 %1, i8 %2, %swift.type* %T)
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i64, i64, i8 } @multi_payload_class_generic_no_spare_bits(i64 %0, i64 %1, i8 %2, ptr %T)
// CHECK-32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i32, i32, i8 } @multi_payload_class_generic_no_spare_bits(i32 %0, i32 %1, i8 %2, ptr %T)
sil @multi_payload_class_generic_no_spare_bits : $@convention(thin) <T: AnyObject> (@owned MultiPayloadClassGeneric<T>) -> MultiPayloadClassGeneric<T> {
entry(%e : $MultiPayloadClassGeneric<T>):
return %e : $MultiPayloadClassGeneric<T>
@@ -2400,7 +2329,7 @@ enum MultiPayloadAddressOnlyFixed {
case Y(Builtin.Int32)
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_destroy(%T11enum_future28MultiPayloadAddressOnlyFixedO* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_destroy(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @multi_payload_address_only_destroy : $@convention(thin) (@in MultiPayloadAddressOnlyFixed) -> () {
entry(%m : $*MultiPayloadAddressOnlyFixed):
destroy_addr %m : $*MultiPayloadAddressOnlyFixed
@@ -2420,7 +2349,7 @@ enum MultiPayloadAddressOnlySpareBits {
case Y(AddressOnlySpareBitsPayload)
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_spare_bits(%T11enum_future32MultiPayloadAddressOnlySpareBitsO* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_address_only_spare_bits(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @multi_payload_address_only_spare_bits : $@convention(thin) (@in MultiPayloadAddressOnlySpareBits) -> () {
entry(%m : $*MultiPayloadAddressOnlySpareBits):
destroy_addr %m : $*MultiPayloadAddressOnlySpareBits
@@ -2449,8 +2378,7 @@ typealias AllConcreteTestEnums = (
sil_global @x : $AllConcreteTestEnums
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_singleton_switch_indirect([[DYNAMIC_SINGLETON]]* noalias nocapture %0, %swift.type* %T) {{.*}} {
// CHECK: bitcast [[DYNAMIC_SINGLETON]]* %0 to %swift.opaque*
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @dynamic_singleton_switch_indirect(ptr noalias nocapture %0, ptr %T) {{.*}} {
// CHECK: ret void
// CHECK: }
sil @dynamic_singleton_switch_indirect : $<T> (@in DynamicSingleton<T>) -> () {
@@ -2556,7 +2484,7 @@ struct StructWithWeakVar {
weak var delegate: delegateProtocol?
}
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(%T11enum_future17StructWithWeakVarVSg* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @weak_optional : $@convention(thin) (@in StructWithWeakVar?) -> () {
entry(%x : $*StructWithWeakVar?):
// CHECK-64: icmp eq [[WORD]] {{%.*}}, 0
@@ -2671,54 +2599,48 @@ entry(%x : $*MyOptional):
}
// -- Fill function for dynamic singleton.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s11enum_future16DynamicSingletonOMi"(%swift.type_descriptor* %0, i8** %1, i8* %2) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: [[T:%T]] = load %swift.type*, %swift.type** [[T0]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2, [[WORD]] {{4|8|12|16}})
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s11enum_future16DynamicSingletonOMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
// CHECK: [[T:%T]] = load ptr, ptr %1,
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata(ptr %0, ptr %1, ptr %2, [[WORD]] {{4|8|12|16}})
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s11enum_future16DynamicSingletonOMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, %swift.type* [[T]])
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, ptr [[T]])
// CHECK: [[T_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[T_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
// CHECK: [[T_OK:%.*]] = icmp ule [[WORD]] [[T_STATUS]], 63
// CHECK: br i1 [[T_OK]],
// CHECK: [[T_VWTS:%.*]] = bitcast %swift.type* [[T_CHECKED]] to i8***
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[T_VWTS]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load i8**, i8*** [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSingleCase(%swift.type* [[METADATA]], [[WORD]] 0, i8** [[T_LAYOUT]])
// CHECK: [[PAYLOAD_TYPELAYOUT:%.*]] = bitcast i8** [[T_LAYOUT]] to %swift.type_layout*
// CHECK: [[PAYLOAD_EXTRAINHABITANTCNT:%.*]] = getelementptr inbounds %swift.type_layout, %swift.type_layout* [[PAYLOAD_TYPELAYOUT]], i32 0, i32 3
// CHECK: [[CNT:%.*]] = load i32, i32* [[PAYLOAD_EXTRAINHABITANTCNT]]
// CHECK: [[METADATA2:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[METADATA2]], [[WORD]] -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[VWT2:%.*]] = bitcast i8** [[VWT]] to %swift.vwtable*
// CHECK: [[XIC_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, %swift.vwtable* [[VWT2]], i32 0, i32 11
// CHECK: store i32 [[CNT]], i32* [[XIC_ADDR]]
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load ptr, ptr [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSingleCase(ptr [[METADATA]], [[WORD]] 0, ptr [[T_LAYOUT]])
// CHECK: [[PAYLOAD_EXTRAINHABITANTCNT:%.*]] = getelementptr inbounds %swift.type_layout, ptr [[T_LAYOUT]], i32 0, i32 3
// CHECK: [[CNT:%.*]] = load i32, ptr [[PAYLOAD_EXTRAINHABITANTCNT]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], [[WORD]] -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK: [[XIC_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 11
// CHECK: store i32 [[CNT]], ptr [[XIC_ADDR]]
// CHECK: ret %swift.metadata_response
// -- Fill function for dynamic single-payload. Call into the runtime to
// calculate the size.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s11enum_future20DynamicSinglePayloadOMi"
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s11enum_future20DynamicSinglePayloadOMi"
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal swiftcc %swift.metadata_response @"$s11enum_future20DynamicSinglePayloadOMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, %swift.type* [[T]])
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// CHECK: [[T0:%.*]] = call{{( tail)?}} swiftcc %swift.metadata_response @swift_checkMetadataState([[WORD]] 319, ptr [[T]])
// CHECK: [[T_CHECKED:%.*]] = extractvalue %swift.metadata_response [[T0]], 0
// CHECK: [[T_STATUS:%.*]] = extractvalue %swift.metadata_response [[T0]], 1
// CHECK: [[T_OK:%.*]] = icmp ule [[WORD]] [[T_STATUS]], 63
// CHECK: br i1 [[T_OK]],
// CHECK: [[T_VWTS:%.*]] = bitcast %swift.type* [[T_CHECKED]] to i8***
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[T_VWTS]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load i8**, i8*** [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds i8*, i8** [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSinglePayload(%swift.type* [[METADATA]], [[WORD]] 0, i8** [[T_LAYOUT]], i32 3)
// CHECK: [[T_VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[T_CHECKED]], [[WORD]] -1
// CHECK: [[T_VWT:%.*]] = load ptr, ptr [[T_VWT_ADDR]]
// CHECK: [[T_LAYOUT:%.*]] = getelementptr inbounds ptr, ptr [[T_VWT]], i32 8
// CHECK: call void @swift_initEnumMetadataSinglePayload(ptr [[METADATA]], [[WORD]] 0, ptr [[T_LAYOUT]], i32 3)
// CHECK-64-LABEL: define internal void @"$s11enum_future17StructWithWeakVarVwst"(%swift.opaque* noalias %value, i32 %whichCase, i32 %numEmptyCases, %swift.type* %StructWithWeakVar)
// CHECK-64-LABEL: define internal void @"$s11enum_future17StructWithWeakVarVwst"(ptr noalias %value, i32 %whichCase, i32 %numEmptyCases, ptr %StructWithWeakVar)
// -- TODO: some pointless masking here.
// -- TODO: should use EnumPayload word-chunking.
// CHECK-64: [[INDEX:%.*]] = sub i32 %whichCase, 1
@@ -2732,13 +2654,10 @@ entry(%x : $*MyOptional):
// -- 0x1__0000_0000_0000_0000
// CHECK-64: [[T5:%.*]] = or i128 [[T4]], 18446744073709551616
// CHECK-LABEL: define internal i32 @"$s11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(%swift.opaque* noalias %value
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value to %T11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesO*
// CHECK: [[VAL01:%.*]] = bitcast %T11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesO* [[VAL00]] to i8*
// CHECK: [[VAL02:%.*]] = load {{.*}} [[VAL01]]
// CHECK: [[VAL03:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL04:%.*]] = bitcast {{.*}} [[VAL03]] to i8*
// CHECK: [[VAL05:%.*]] = load {{.*}} [[VAL04]]
// CHECK-LABEL: define internal i32 @"$s11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesOwug"(ptr noalias %value
// CHECK: [[VAL02:%.*]] = load {{.*}} %value
// CHECK: [[VAL03:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: [[VAL05:%.*]] = load {{.*}} [[VAL03]]
// CHECK: [[VAL06:%.*]] = zext i8 [[VAL05]] to i32
// CHECK: [[VAL07:%.*]] = zext i8 [[VAL02]] to i32
// CHECK: [[VAL08:%.*]] = and i32 [[VAL07]], 255
@@ -2747,27 +2666,23 @@ entry(%x : $*MyOptional):
// CHECK: [[VAL11:%.*]] = select i1 [[VAL10]], i32 [[VAL09]], i32 [[VAL06]]
// CHECK: ret i32 [[VAL11]]
// CHECK-LABEL: define internal void @"$s11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(%swift.opaque* noalias %value, i32 %tag
// CHECK-LABEL: define internal void @"$s11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesOwui"(ptr noalias %value, i32 %tag
// CHECK: entry:
// CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value
// CHECK: [[VAL01:%.*]] = icmp uge i32 %tag, 2
// CHECK: br i1 [[VAL01]], label %[[TLABEL:.*]], label %[[FLABEL:.*]]
// CHECK: [[TLABEL]]:
// CHECK: [[VAL02:%.*]] = sub i32 %tag, 2
// CHECK: [[VAL03:%.*]] = trunc i32 [[VAL02]] to i8
// CHECK: [[VAL04:%.*]] = bitcast %T11enum_future40MultiPayloadLessThan32BitsWithEmptyCasesO* [[VAL00]] to i8*
// CHECK: store i8 [[VAL03]], i8* [[VAL04]]
// CHECK: [[VAL05:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL06:%.*]] = bitcast [1 x i8]* [[VAL05]] to i8*
// CHECK: store i8 2, i8* [[VAL06]]
// CHECK: store i8 [[VAL03]], ptr %value
// CHECK: [[VAL05:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: store i8 2, ptr [[VAL05]]
// CHECK: br label %[[RLABEL:.*]]
// CHECK: [[FLABEL]]:
// CHECK: [[VAL09:%.*]] = trunc i32 %tag to i8
// CHECK: [[VAL10:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
// CHECK: [[VAL11:%.*]] = bitcast [1 x i8]* [[VAL10]] to i8*
// CHECK: store i8 [[VAL09]], i8* [[VAL11]]
// CHECK: [[VAL10:%.*]] = getelementptr inbounds {{.*}} %value, i32 0, i32 1
// CHECK: store i8 [[VAL09]], ptr [[VAL10]]
// CHECK: br label %[[RLABEL]]
// CHECK: [[RLABEL]]:

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -gnone -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-simulator-%target-is-simulator
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop
// RUN: %target-swift-frontend %s -gnone -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-%target-ptrsize-simulator-%target-is-simulator
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -39,8 +38,8 @@ enum SinglePayloadObjCProtocol {
// CHECK-64-simulator-true: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-64: inttoptr i64 %0 to %objc_object*
// CHECK-64: inttoptr i64 %1 to i8**
// CHECK-64: inttoptr i64 %0 to ptr
// CHECK-64: inttoptr i64 %1 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_class_protocol_switch(i32 %0, i32 %1) {{.*}} {
// CHECK-32: switch i32 %0, label {{%.*}} [
@@ -49,8 +48,8 @@ enum SinglePayloadObjCProtocol {
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-32: inttoptr i32 %0 to %objc_object*
// CHECK-32: inttoptr i32 %1 to i8**
// CHECK-32: inttoptr i32 %0 to ptr
// CHECK-32: inttoptr i32 %1 to ptr
sil @single_payload_class_protocol_switch : $(SinglePayloadClassProtocol) -> () {
entry(%c : $SinglePayloadClassProtocol):
@@ -77,7 +76,7 @@ end:
// CHECK-64-simulator-true: i64 1, label {{%.*}}
// CHECK-64-simulator-true: i64 2, label {{%.*}}
// CHECK-64: ]
// CHECK-64: inttoptr i64 %0 to %objc_object*
// CHECK-64: inttoptr i64 %0 to ptr
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc void @single_payload_objc_protocol_switch(i32 %0) {{.*}} {
// CHECK-32: switch i32 %0, label {{%.*}}
@@ -85,7 +84,7 @@ end:
// CHECK-32: i32 1, label {{%.*}}
// CHECK-32: i32 2, label {{%.*}}
// CHECK-32: ]
// CHECK-32: inttoptr i32 %0 to %objc_object*
// CHECK-32: inttoptr i32 %0 to ptr
sil @single_payload_objc_protocol_switch : $(SinglePayloadObjCProtocol) -> () {
entry(%c : $SinglePayloadObjCProtocol):
@@ -110,7 +109,7 @@ struct StructWithWeakVar {
weak var delegate: delegateProtocol?
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(%T9enum_objc17StructWithWeakVarVSg* noalias nocapture dereferenceable({{.*}}) %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @weak_optional(ptr noalias nocapture dereferenceable({{.*}}) %0)
sil @weak_optional : $@convention(thin) (@in StructWithWeakVar?) -> () {
entry(%x : $*StructWithWeakVar?):
// CHECK: icmp eq [[WORD:i32|i64]] {{%.*}}, 0

View File

@@ -1,7 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
// RUN: %target-swift-frontend %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -enable-objc-interop
// RUN: %target-swift-frontend %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-objc-interop
// RUN: %target-swift-frontend %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
// RUN: %target-swift-frontend %s -disable-type-layout -disable-generic-metadata-prespecialization -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
// REQUIRES: CPU=x86_64
@@ -98,39 +96,39 @@ enum GenericFixedLayout<T> {
// CHECK-LABEL: @"$s20enum_value_semantics20SinglePayloadTrivialOWV" = internal constant %swift.enum_vwtable {
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s20enum_value_semantics20SinglePayloadTrivialOwet" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s20enum_value_semantics20SinglePayloadTrivialOwst" to i8*),
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_noop_void_return,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOwet",
// CHECK: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOwst",
// CHECK: i64 9,
// CHECK: i64 16,
// CHECK: i32 2097159,
// CHECK: i32 0,
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s20enum_value_semantics20SinglePayloadTrivialOwug" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s20enum_value_semantics20SinglePayloadTrivialOwup" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s20enum_value_semantics20SinglePayloadTrivialOwui" to i8*)
// CHECK: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOwug",
// CHECK: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOwup",
// CHECK: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOwui"
// CHECK: }
// CHECK-LABEL: @"$s20enum_value_semantics20SinglePayloadTrivialOMf" =
// CHECK-SAME: internal constant <{ {{.*}} }> <{
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s20enum_value_semantics20SinglePayloadTrivialOWV", i32 0, i32 0),
// CHECK-SAME: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOWV",
// CHECK-SAME: i64 513,
// CHECK-SAME: {{.*}}* @"$s20enum_value_semantics20SinglePayloadTrivialOMn"
// CHECK-SAME: ptr @"$s20enum_value_semantics20SinglePayloadTrivialOMn"
// CHECK-SAME: }>
// CHECK-LABEL: @"$s20enum_value_semantics23SinglePayloadNontrivialOWV" = internal constant %swift.enum_vwtable {
// CHECK: i8* bitcast (%swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwCP" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx" to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwcp" to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwca" to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy8_8 to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwta" to i8*),
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwCP",
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx",
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwcp",
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwca",
// CHECK: ptr @__swift_memcpy8_8,
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwta",
// CHECK: i64 8,
// CHECK: i64 8,
// -- 0x210007
@@ -145,33 +143,33 @@ enum GenericFixedLayout<T> {
// CHECK-native-linux-gnu: i32 4093
// CHECK-objc-windows: i32 2045
// CHECK-native-windows: i32 4093
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwug" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwup" to i8*)
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s20enum_value_semantics23SinglePayloadNontrivialOwui" to i8*)
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwug",
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwup"
// CHECK: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOwui"
// CHECK: ]
// CHECK-LABEL: @"$s20enum_value_semantics23SinglePayloadNontrivialOMf" =
// CHECK-SAME: internal constant <{ {{.*}} }> <{
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s20enum_value_semantics23SinglePayloadNontrivialOWV", i32 0, i32 0),
// CHECK-SAME: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOWV",
// CHECK-SAME: i64 513,
// CHECK-SAME: {{.*}}* @"$s20enum_value_semantics23SinglePayloadNontrivialOMn"
// CHECK-SAME: ptr @"$s20enum_value_semantics23SinglePayloadNontrivialOMn"
// CHECK-SAME: }>
// CHECK-LABEL: @"$s20enum_value_semantics18GenericFixedLayoutOMn" = hidden constant
// CHECK-SAME: [16 x i8*]* @"$s20enum_value_semantics18GenericFixedLayoutOMI"
// CHECK-SAME: ptr @"$s20enum_value_semantics18GenericFixedLayoutOMI"
// CHECK-SAME: @"$s20enum_value_semantics18GenericFixedLayoutOMP"
// CHECK-LABEL: @"$s20enum_value_semantics18GenericFixedLayoutOMP" = internal constant <{ {{.*}} }> <{
// Instantiation function.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s20enum_value_semantics18GenericFixedLayoutOMi" to i64), i64 ptrtoint (<{ i32, i32, i32, i32 }>* @"$s20enum_value_semantics18GenericFixedLayoutOMP" to i64)) to i32),
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s20enum_value_semantics18GenericFixedLayoutOMi" to i64), i64 ptrtoint (ptr @"$s20enum_value_semantics18GenericFixedLayoutOMP" to i64)) to i32),
// Completion function.
// CHECK-SAME: i32 0,
// Pattern flags. 0x4020_0000 == (MetadataKind::Enum << 21).
// CHECK-SAME: i32 1075838976,
// Value witness table.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.enum_vwtable* @"$s20enum_value_semantics18GenericFixedLayoutOWV" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32 }>, <{ i32, i32, i32, i32 }>* @"$s20enum_value_semantics18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s20enum_value_semantics18GenericFixedLayoutOWV" to i64), i64 ptrtoint (ptr getelementptr inbounds (<{ i32, i32, i32, i32 }>, ptr @"$s20enum_value_semantics18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
// CHECK-SAME: }>
sil @single_payload_nontrivial_copy_destroy : $(@owned SinglePayloadNontrivial) -> () {
@@ -197,10 +195,9 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- NoPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics9NoPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics9NoPayloadO*
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, %T20enum_value_semantics9NoPayloadO* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 1
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 %2 to i32
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[TAG:%.*]] = load i8, ptr [[TAG_ADDR]], align 1
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 [[TAG]] to i32
// CHECK-NEXT: ret i32 [[RESULT]]
@@ -211,10 +208,9 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- NoPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics9NoPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics9NoPayloadO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, %T20enum_value_semantics9NoPayloadO* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], i8* [[TAG_ADDR]], align 1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics9NoPayloadO, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], ptr [[TAG_ADDR]], align 1
// CHECK-NEXT: ret void
@@ -225,8 +221,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SingletonPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics16SingletonPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics16SingletonPayloadO*
// CHECK-NEXT: ret i32 0
// CHECK: ret i32 0
// -- SingletonPayload destructiveProjectEnumData
@@ -236,15 +231,14 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SingletonPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics16SingletonPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics16SingletonPayloadO*
// CHECK-NEXT: ret void
// CHECK: ret void
// -- SinglePayloadTrivial getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics20SinglePayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics20SinglePayloadTrivialO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: [[TAG:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 3, %swift.type* getelementptr inbounds (%swift.full_existential_type, %swift.full_existential_type* @"$sBi64_N", i32 0, i32 1))
// CHECK: = load
// CHECK: [[W:%.*]] = load ptr
// CHECK: [[TAG:%.*]] = call i32 [[W]](ptr noalias %value, i32 3, ptr getelementptr inbounds (%swift.full_existential_type, ptr @"$sBi64_N", i32 0, i32 1))
// CHECK: ret i32 [[TAG]]
@@ -260,18 +254,16 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SinglePayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics20SinglePayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics20SinglePayloadTrivialO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 %tag, i32 3, %swift.type* getelementptr inbounds (%swift.full_existential_type, %swift.full_existential_type* @"$sBi64_N", i32 0, i32 1))
// CHECK: = load
// CHECK: [[W:%.*]] = load ptr
// CHECK: call void [[W]](ptr noalias %value, i32 %tag, i32 3, ptr getelementptr inbounds (%swift.full_existential_type, ptr @"$sBi64_N", i32 0, i32 1))
// CHECK-NEXT: ret void
// -- SinglePayloadNontrivial destroyBuffer
// CHECK: define internal void @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %SinglePayloadNontrivial) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics23SinglePayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics23SinglePayloadNontrivialO* [[ADDR]] to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: switch i64 %2, label %[[RELEASE_PAYLOAD:[0-9]+]] [
// CHECK: define internal void @"$s20enum_value_semantics23SinglePayloadNontrivialOwxx"(ptr noalias [[OBJ:%.*]], ptr %SinglePayloadNontrivial) {{.*}} {
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr [[OBJ]], align 8
// CHECK-NEXT: switch i64 %0, label %[[RELEASE_PAYLOAD:[0-9]+]] [
// CHECK: i64 0, label %[[DONE:[0-9]+]]
// CHECK-native: i64 1, label %[[DONE]]
// CHECK-native: i64 2, label %[[DONE]]
@@ -282,9 +274,8 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK: ]
// CHECK: [[RELEASE_PAYLOAD]]:
// CHECK-NEXT: [[DATA_ADDR:%.*]] = bitcast %T20enum_value_semantics23SinglePayloadNontrivialO* [[ADDR]] to %swift.refcounted**
// CHECK-NEXT: [[DATA:%.*]] = load %swift.refcounted*, %swift.refcounted** [[DATA_ADDR]], align 8
// CHECK-NEXT: call void @swift_release(%swift.refcounted* [[DATA]])
// CHECK-NEXT: [[DATA:%.*]] = load ptr, ptr [[OBJ]], align 8
// CHECK-NEXT: call void @swift_release(ptr [[DATA]])
// CHECK-NEXT: br label %[[DONE]]
// CHECK: [[DONE]]:
@@ -298,17 +289,14 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadTrivial getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics19MultiPayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadTrivialO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]] to i64*
// -- Load the low bits of the tag from the payload area
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
// CHECK: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, ptr %value, align 8
// -- Load the high bits of the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = trunc i64 [[NO_PAYLOAD_TAG_TMP]] to i32
@@ -328,8 +316,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadTrivialO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
// CHECK: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
// CHECK: [[HAS_NO_PAYLOAD]]:
@@ -337,24 +324,21 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- Compute the no-payload tag
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = sub i32 %tag, 2
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]] to i64*
// -- Store the low bits of the tag in the payload area
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[PAYLOAD]], align 8
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], ptr %value, align 8
// -- Store the high bits of the tag in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: store i8 2, i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i8 2, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: br label %[[DONE:.*]]
// CHECK: [[HAS_PAYLOAD]]:
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, %T20enum_value_semantics19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i8 [[TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: br label %[[DONE]]
// CHECK: [[DONE]]:
@@ -368,15 +352,12 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNoEmptyCases getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics24MultiPayloadNoEmptyCasesO* [[SELF]] to i64*
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
// CHECK: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, ptr %value, align 8
// -- The payload has no spare bits and there are no empty cases, so the tag
// is entirely contained in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics24MultiPayloadNoEmptyCasesO, %T20enum_value_semantics24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics24MultiPayloadNoEmptyCasesO, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i1 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
@@ -387,13 +368,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNoEmptyCases destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics24MultiPayloadNoEmptyCasesOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i1
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics24MultiPayloadNoEmptyCasesO, %T20enum_value_semantics24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: store i1 [[TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics24MultiPayloadNoEmptyCasesO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i1 [[TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: ret void
@@ -404,11 +383,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadEmptyPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics017MultiPayloadEmptyE0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics017MultiPayloadEmptyE0O*
// -- Load the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics017MultiPayloadEmptyE0O, %T20enum_value_semantics017MultiPayloadEmptyE0O* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 1
// CHECK: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics017MultiPayloadEmptyE0O, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, ptr [[EXTRA_TAG_ADDR]], align 1
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
@@ -420,12 +398,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadEmptyPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s20enum_value_semantics017MultiPayloadEmptyE0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics017MultiPayloadEmptyE0O*
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics017MultiPayloadEmptyE0O, %T20enum_value_semantics017MultiPayloadEmptyE0O* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T20enum_value_semantics017MultiPayloadEmptyE0O, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], ptr [[EXTRA_TAG_ADDR]], align 1
// CHECK-NEXT: ret void
@@ -435,16 +412,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNontrivial destroyBuffer
// CHECK: define internal void @"$s20enum_value_semantics22MultiPayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivial)
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics22MultiPayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics22MultiPayloadNontrivialO* [[ADDR]] to { i64, i64 }*
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
// CHECK: define internal void @"$s20enum_value_semantics22MultiPayloadNontrivialOwxx"(ptr noalias [[OBJ:%.*]], ptr %MultiPayloadNontrivial)
// CHECK: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, ptr [[PAYLOAD_0_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %T20enum_value_semantics22MultiPayloadNontrivialO, %T20enum_value_semantics22MultiPayloadNontrivialO* %0, i32 0, i32 1
// CHECK-NEXT: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, ptr [[PAYLOAD_1_ADDR]], align 8
// CHECK: [[T0:%.*]] = getelementptr inbounds %T20enum_value_semantics22MultiPayloadNontrivialO, ptr [[OBJ]], i32 0, i32 1
// CHECK-NEXT: [[TAG:%.*]] = load i8, ptr [[T0]], align 8
// CHECK-NEXT: @"$s20enum_value_semantics22MultiPayloadNontrivialOWOe"
// CHECK-NEXT: ret void
@@ -455,9 +429,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics19MultiPayloadGenericOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadGenericO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>")
// CHECK: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(ptr %value, ptr %"MultiPayloadGeneric<T>")
// CHECK-NEXT: ret i32 [[TAG]]
@@ -466,9 +438,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal void @"$s20enum_value_semantics19MultiPayloadGenericOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics19MultiPayloadGenericO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T20enum_value_semantics19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: call void @swift_storeEnumTagMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>", i32 %tag)
// CHECK: call void @swift_storeEnumTagMultiPayload(ptr %value, ptr %"MultiPayloadGeneric<T>", i32 %tag)
// CHECK-NEXT: ret void
@@ -479,26 +449,22 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNontrivialSpareBits destroyBuffer
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwxx"
// CHECK-SAME: (%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivialSpareBits) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[ADDR]] to { i64, i64 }*
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
// CHECK-SAME: (ptr noalias [[OBJ:%.*]], ptr %MultiPayloadNontrivialSpareBits) {{.*}} {
// CHECK: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, ptr [[PAYLOAD_0_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, ptr [[PAYLOAD_1_ADDR]], align 8
// CHECK: call void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOWOe"
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Get the high bits of the tag from the spare bits
// CHECK-NEXT: [[SPARE_TAG_TMP:%.*]] = lshr i64 [[SECOND]], 62
@@ -518,29 +484,26 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret i32 [[TAG]]
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwup"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
// -- Load the payload
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Strip off spare bits
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 4611686018427387903
// -- Store the payload
// CHECK-NEXT: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_PROJ]], i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_PROJ]], ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal void @"$s20enum_value_semantics31MultiPayloadNontrivialSpareBitsOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
// CHECK: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
// CHECK: [[HAS_NO_PAYLOAD]]:
@@ -550,14 +513,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
// -- Store the low bits of the tag into the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], ptr [[FIRST_ADDR]], align 8
// -- Store the high bits of the tag into the spare bits
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// -- 0xc000000000000000
// CHECK-NEXT: store i64 -4611686018427387904, i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: store i64 -4611686018427387904, ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: br label %[[END:.*]]
// CHECK: [[HAS_PAYLOAD]]:
@@ -566,11 +528,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[TAG_TMP:%.*]] = and i32 %tag, 3
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Mask off spare bits in the payload -- 0x00fffffffffffff8
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 72057594037927928
@@ -586,11 +547,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[SECOND_NEW:%.*]] = or i64 [[SPARE_TAG_TMP]], [[SECOND_PROJ]]
// -- Store the payload back
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T20enum_value_semantics31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_NEW]], i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_NEW]], ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: br label %[[END]]
// CHECK: [[END]]:
@@ -598,16 +558,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal i32 @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O*
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O* [[SELF]] to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr %value, align 8
// -- Load the load bits of the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O, %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// -- Load the high bits of the tag from the spare bits area
// CHECK-NEXT: [[SPARE_BITS_TMP2:%.*]] = lshr i64 [[PAYLOAD]], 63
@@ -623,22 +580,18 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owup"
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr %value, align 8
// -- 0x7fffffffffffffff
// CHECK-NEXT: [[PAYLOAD_PROJ:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
// CHECK-NEXT: store i64 [[PAYLOAD_PROJ]], i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: store i64 [[PAYLOAD_PROJ]], ptr %value, align 8
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal void @"$s20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O*
// CHECK-NEXT: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1
// CHECK: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O* %0 to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, ptr {{.*}}, align 8
// -- Mask off the spare bits
// -- 0x7fffffffffffffff
@@ -652,13 +605,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[PAYLOAD_NEW:%.*]] = or i64 [[SPARE_TAG]], [[PAYLOAD_PROJ]]
// -- Store the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O* %0 to i64*
// CHECK-NEXT: store i64 [[PAYLOAD_NEW]], i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: store i64 [[PAYLOAD_NEW]], ptr {{.*}}, align 8
// -- Store high bits of tag in extra tag area
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = lshr i32 %tag, 1
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = trunc i32 [[EXTRA_TAG_TMP]] to i1
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O, %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: store i1 [[EXTRA_TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T20enum_value_semantics029MultiPayloadSpareBitsAndExtraG0O, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i1 [[EXTRA_TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: ret void

View File

@@ -1,7 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -enable-objc-interop
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -disable-objc-interop
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -enable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-objc --check-prefix=CHECK-objc-simulator-%target-is-simulator --check-prefix=CHECK-objc-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-objc-%target-os
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata %s -target %module-target-future -gnone -emit-ir -disable-objc-interop | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize --check-prefix=CHECK-native --check-prefix=CHECK-native-%target-ptrsize --check-prefix=CHECK-%target-os --check-prefix=CHECK-native-%target-os
// REQUIRES: CPU=x86_64
// REQUIRES: VENDOR=apple || OS=linux-gnu
@@ -102,39 +100,39 @@ enum GenericFixedLayout<T> {
// CHECK-LABEL: @"$s27enum_value_semantics_future20SinglePayloadTrivialOWV" = internal constant %swift.enum_vwtable {
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (void (i8*, %swift.type*)* @__swift_noop_void_return to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy9_8 to i8*),
// CHECK: i8* bitcast (i32 (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwet" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, i32, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwst" to i8*),
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_noop_void_return,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @__swift_memcpy9_8,
// CHECK: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOwet",
// CHECK: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOwst",
// CHECK: i64 9,
// CHECK: i64 16,
// CHECK: i32 2097159,
// CHECK: i32 0,
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwug" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwup" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future20SinglePayloadTrivialOwui" to i8*)
// CHECK: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOwug",
// CHECK: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOwup",
// CHECK: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOwui"
// CHECK: }
// CHECK-LABEL: @"$s27enum_value_semantics_future20SinglePayloadTrivialOMf" =
// CHECK-SAME: internal constant <{ {{.*}} }> <{
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s27enum_value_semantics_future20SinglePayloadTrivialOWV", i32 0, i32 0),
// CHECK-SAME: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOWV",
// CHECK-SAME: i64 513,
// CHECK-SAME: {{.*}}* @"$s27enum_value_semantics_future20SinglePayloadTrivialOMn"
// CHECK-SAME: ptr @"$s27enum_value_semantics_future20SinglePayloadTrivialOMn"
// CHECK-SAME: }>
// CHECK-LABEL: @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWV" = internal constant %swift.enum_vwtable {
// CHECK: i8* bitcast (%swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwCP" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx" to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwcp" to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwca" to i8*),
// CHECK: i8* bitcast (i8* (i8*, i8*, %swift.type*)* @__swift_memcpy8_8 to i8*),
// CHECK: i8* bitcast (%swift.opaque* (%swift.opaque*, %swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwta" to i8*),
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwCP",
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx",
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwcp",
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwca",
// CHECK: ptr @__swift_memcpy8_8,
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwta",
// CHECK: i64 8,
// CHECK: i64 8,
// -- 0x210007
@@ -149,37 +147,37 @@ enum GenericFixedLayout<T> {
// CHECK-native-linux-gnu: i32 4093
// CHECK-objc-windows: i32 2045
// CHECK-native-windows: i32 4093
// CHECK: i8* bitcast (i32 (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwug" to i8*),
// CHECK: i8* bitcast (void (%swift.opaque*, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwup" to i8*)
// CHECK: i8* bitcast (void (%swift.opaque*, i32, %swift.type*)* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwui" to i8*)
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwug",
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwup"
// CHECK: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwui"
// CHECK: ]
// CHECK-LABEL: @"$s27enum_value_semantics_future23SinglePayloadNontrivialOMf" =
// CHECK-SAME: internal constant <{ {{.*}} }> <{
// CHECK-SAME: i8** getelementptr inbounds (%swift.enum_vwtable, %swift.enum_vwtable* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWV", i32 0, i32 0),
// CHECK-SAME: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOWV",
// CHECK-SAME: i64 513,
// CHECK-SAME: {{.*}}* @"$s27enum_value_semantics_future23SinglePayloadNontrivialOMn"
// CHECK-SAME: ptr @"$s27enum_value_semantics_future23SinglePayloadNontrivialOMn"
// CHECK-SAME: }>
// CHECK: @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" = internal constant %swift.enum_vwtable
// CHECK: [[EXTRA_DATA_PATTERN:@[0-9]+]] = internal constant <{ i64 }> zeroinitializer
// CHECK-LABEL: @"$s27enum_value_semantics_future18GenericFixedLayoutOMn" = hidden constant
// CHECK-SAME: [16 x i8*]* @"$s27enum_value_semantics_future18GenericFixedLayoutOMI"
// CHECK-SAME: ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOMI"
// CHECK-SAME: @"$s27enum_value_semantics_future18GenericFixedLayoutOMP"
// CHECK-LABEL: @"$s27enum_value_semantics_future18GenericFixedLayoutOMP" = internal constant <{ {{.*}} }> <{
// Instantiation function.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s27enum_value_semantics_future18GenericFixedLayoutOMi" to i64), i64 ptrtoint (<{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP" to i64)) to i32),
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOMi" to i64), i64 ptrtoint (ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOMP" to i64)) to i32),
// Completion function.
// CHECK-SAME: i32 0,
// Pattern flags. 0x4020_0003 == (MetadataKind::Enum << 21 | HasTrailingFlags | HasExtraDataPattern).
// CHECK-SAME: i32 1075838979,
// Value witness table.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (%swift.enum_vwtable* @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, <{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOWV" to i64), i64 ptrtoint (ptr getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 3) to i64)) to i32)
// Extra data pattern.
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (<{ i64 }>* [[EXTRA_DATA_PATTERN]] to i64), i64 ptrtoint (i32* getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, <{ i32, i32, i32, i32, i32, i16, i16 }>* @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 4) to i64)) to i32)
// CHECK-SAME: i32 trunc (i64 sub (i64 ptrtoint (ptr [[EXTRA_DATA_PATTERN]] to i64), i64 ptrtoint (ptr getelementptr inbounds (<{ i32, i32, i32, i32, i32, i16, i16 }>, ptr @"$s27enum_value_semantics_future18GenericFixedLayoutOMP", i32 0, i32 4) to i64)) to i32)
// CHECK-SAME: }>
sil @single_payload_nontrivial_copy_destroy : $(@owned SinglePayloadNontrivial) -> () {
@@ -205,10 +203,9 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- NoPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future9NoPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future9NoPayloadO*
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, %T27enum_value_semantics_future9NoPayloadO* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 1
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 %2 to i32
// CHECK: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[TAG:%.*]] = load i8, ptr [[TAG_ADDR]], align 1
// CHECK-NEXT: [[RESULT:%.*]] = zext i8 {{.*}} to i32
// CHECK-NEXT: ret i32 [[RESULT]]
@@ -219,10 +216,9 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- NoPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future9NoPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future9NoPayloadO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, %T27enum_value_semantics_future9NoPayloadO* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], i8* [[TAG_ADDR]], align 1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future9NoPayloadO, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], ptr [[TAG_ADDR]], align 1
// CHECK-NEXT: ret void
@@ -233,8 +229,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SingletonPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future16SingletonPayloadOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future16SingletonPayloadO*
// CHECK-NEXT: ret i32 0
// CHECK: ret i32 0
// -- SingletonPayload destructiveProjectEnumData
@@ -244,15 +239,12 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SingletonPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future16SingletonPayloadOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future16SingletonPayloadO*
// CHECK-NEXT: ret void
// CHECK: ret void
// -- SinglePayloadTrivial getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future20SinglePayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future20SinglePayloadTrivialO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: [[TAG:%.*]] = call i32 %getEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 3, %swift.type* getelementptr inbounds (%swift.full_existential_type, %swift.full_existential_type* @"$sBi64_N", i32 0, i32 1))
// CHECK: [[TAG:%.*]] = call i32 %{{.*}}(ptr noalias %value, i32 3, ptr getelementptr inbounds (%swift.full_existential_type, ptr @"$sBi64_N", i32 0, i32 1))
// CHECK: ret i32 [[TAG]]
@@ -268,18 +260,14 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- SinglePayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future20SinglePayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future20SinglePayloadTrivialO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future20SinglePayloadTrivialO* [[SELF]] to %swift.opaque*
// CHECK: call void %storeEnumTagSinglePayload(%swift.opaque* noalias [[OPAQUE]], i32 %tag, i32 3, %swift.type* getelementptr inbounds (%swift.full_existential_type, %swift.full_existential_type* @"$sBi64_N", i32 0, i32 1))
// CHECK: call void %{{.*}}(ptr noalias %value, i32 %tag, i32 3, ptr getelementptr inbounds (%swift.full_existential_type, ptr @"$sBi64_N", i32 0, i32 1))
// CHECK-NEXT: ret void
// -- SinglePayloadNontrivial destroyBuffer
// CHECK: define internal void @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %SinglePayloadNontrivial) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future23SinglePayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future23SinglePayloadNontrivialO* [[ADDR]] to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: switch i64 %2, label %[[RELEASE_PAYLOAD:[0-9]+]] [
// CHECK: define internal void @"$s27enum_value_semantics_future23SinglePayloadNontrivialOwxx"(ptr noalias [[OBJ:%.*]], ptr %SinglePayloadNontrivial) {{.*}} {
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr [[OBJ]], align 8
// CHECK-NEXT: switch i64 {{.*}}, label %[[RELEASE_PAYLOAD:[0-9]+]] [
// CHECK: i64 0, label %[[DONE:[0-9]+]]
// CHECK-native: i64 1, label %[[DONE]]
// CHECK-native: i64 2, label %[[DONE]]
@@ -290,9 +278,8 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK: ]
// CHECK: [[RELEASE_PAYLOAD]]:
// CHECK-NEXT: [[DATA_ADDR:%.*]] = bitcast %T27enum_value_semantics_future23SinglePayloadNontrivialO* [[ADDR]] to %swift.refcounted**
// CHECK-NEXT: [[DATA:%.*]] = load %swift.refcounted*, %swift.refcounted** [[DATA_ADDR]], align 8
// CHECK-NEXT: call void @swift_release(%swift.refcounted* [[DATA]])
// CHECK-NEXT: [[DATA:%.*]] = load ptr, ptr [[OBJ]], align 8
// CHECK-NEXT: call void @swift_release(ptr [[DATA]])
// CHECK-NEXT: br label %[[DONE]]
// CHECK: [[DONE]]:
@@ -306,17 +293,14 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadTrivial getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future19MultiPayloadTrivialOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadTrivialO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]] to i64*
// -- Load the low bits of the tag from the payload area
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
// CHECK: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, ptr %value, align 8
// -- Load the high bits of the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = trunc i64 [[NO_PAYLOAD_TAG_TMP]] to i32
@@ -336,8 +320,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadTrivial destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadTrivialOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadTrivialO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
// CHECK: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 2
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
// CHECK: [[HAS_NO_PAYLOAD]]:
@@ -345,24 +328,21 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- Compute the no-payload tag
// CHECK-NEXT: [[NO_PAYLOAD_TAG:%.*]] = sub i32 %tag, 2
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]] to i64*
// -- Store the low bits of the tag in the payload area
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[PAYLOAD]], align 8
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], ptr %value, align 8
// -- Store the high bits of the tag in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: store i8 2, i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i8 2, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: br label %[[DONE:.*]]
// CHECK: [[HAS_PAYLOAD]]:
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, %T27enum_value_semantics_future19MultiPayloadTrivialO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i8*
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future19MultiPayloadTrivialO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i8 [[TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: br label %[[DONE]]
// CHECK: [[DONE]]:
@@ -376,15 +356,12 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNoEmptyCases getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future24MultiPayloadNoEmptyCasesOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]] to i64*
// CHECK-NEXT: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, i64* [[PAYLOAD]], align 8
// CHECK: [[NO_PAYLOAD_TAG_TMP:%.*]] = load i64, ptr %value, align 8
// -- The payload has no spare bits and there are no empty cases, so the tag
// is entirely contained in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i1 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
@@ -395,13 +372,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNoEmptyCases destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future24MultiPayloadNoEmptyCasesOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO*
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i1
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: store i1 [[TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future24MultiPayloadNoEmptyCasesO, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i1 [[TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: ret void
@@ -412,11 +387,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadEmptyPayload getEnumTag
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future017MultiPayloadEmptyF0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future017MultiPayloadEmptyF0O*
// -- Load the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, %T27enum_value_semantics_future017MultiPayloadEmptyF0O* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, i8* [[EXTRA_TAG_ADDR]], align 1
// CHECK: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i8, ptr [[EXTRA_TAG_ADDR]], align 1
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = zext i8 [[EXTRA_TAG_TMP]] to i32
// CHECK-NEXT: ret i32 [[EXTRA_TAG]]
@@ -428,12 +402,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadEmptyPayload destructiveInjectEnumTag
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future017MultiPayloadEmptyF0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future017MultiPayloadEmptyF0O*
// -- Store the tag in the extra tag area
// CHECK-NEXT: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, %T27enum_value_semantics_future017MultiPayloadEmptyF0O* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], i8* [[EXTRA_TAG_ADDR]], align 1
// CHECK: [[TAG:%.*]] = trunc i32 %tag to i8
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = getelementptr inbounds %T27enum_value_semantics_future017MultiPayloadEmptyF0O, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i8 [[TAG]], ptr [[EXTRA_TAG_ADDR]], align 1
// CHECK-NEXT: ret void
@@ -443,16 +416,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNontrivial destroyBuffer
// CHECK: define internal void @"$s27enum_value_semantics_future22MultiPayloadNontrivialOwxx"(%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivial)
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future22MultiPayloadNontrivialO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future22MultiPayloadNontrivialO* [[ADDR]] to { i64, i64 }*
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
// CHECK: define internal void @"$s27enum_value_semantics_future22MultiPayloadNontrivialOwxx"(ptr noalias [[OBJ:%.*]], ptr %MultiPayloadNontrivial)
// CHECK: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, ptr [[PAYLOAD_0_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %T27enum_value_semantics_future22MultiPayloadNontrivialO, %T27enum_value_semantics_future22MultiPayloadNontrivialO* %0, i32 0, i32 1
// CHECK-NEXT: [[TAG_ADDR:%.*]] = bitcast [1 x i8]* [[T0]] to i8*
// CHECK-NEXT: [[TAG:%.*]] = load i8, i8* [[TAG_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, ptr [[PAYLOAD_1_ADDR]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds %T27enum_value_semantics_future22MultiPayloadNontrivialO, ptr {{.*}}, i32 0, i32 1
// CHECK-NEXT: [[TAG:%.*]] = load i8, ptr [[T0]], align 8
// CHECK-NEXT: @"$s27enum_value_semantics_future22MultiPayloadNontrivialOWOe"
// CHECK-NEXT: ret void
@@ -463,9 +433,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future19MultiPayloadGenericOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadGenericO*
// CHECK-NEXT: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>")
// CHECK: [[TAG:%.*]] = call i32 @swift_getEnumCaseMultiPayload(ptr %value, ptr %"MultiPayloadGeneric<T>")
// CHECK-NEXT: ret i32 [[TAG]]
@@ -474,9 +442,7 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future19MultiPayloadGenericOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future19MultiPayloadGenericO*
// CHECK: [[OPAQUE:%.*]] = bitcast %T27enum_value_semantics_future19MultiPayloadGenericO* [[SELF]] to %swift.opaque*
// CHECK-NEXT: call void @swift_storeEnumTagMultiPayload(%swift.opaque* [[OPAQUE]], %swift.type* %"MultiPayloadGeneric<T>", i32 %tag)
// CHECK: call void @swift_storeEnumTagMultiPayload(ptr %value, ptr %"MultiPayloadGeneric<T>", i32 %tag)
// CHECK-NEXT: ret void
@@ -487,26 +453,22 @@ bb0(%0 : $SinglePayloadNontrivial):
// -- MultiPayloadNontrivialSpareBits destroyBuffer
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwxx"
// CHECK-SAME: (%swift.opaque* noalias [[OBJ:%.*]], %swift.type* %MultiPayloadNontrivialSpareBits) {{.*}} {
// CHECK: [[ADDR:%.*]] = bitcast %swift.opaque* [[OBJ]] to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[ADDR]] to { i64, i64 }*
// CHECK-NEXT: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, i64* [[PAYLOAD_0_ADDR]], align 8
// CHECK-SAME: (ptr noalias [[OBJ:%.*]], ptr %MultiPayloadNontrivialSpareBits) {{.*}} {
// CHECK: [[PAYLOAD_0_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_0:%.*]] = load i64, ptr [[PAYLOAD_0_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1_ADDR:%.*]] = getelementptr
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, i64* [[PAYLOAD_1_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD_1:%.*]] = load i64, ptr [[PAYLOAD_1_ADDR]], align 8
// CHECK: call void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOWOe"
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Get the high bits of the tag from the spare bits
// CHECK-NEXT: [[SPARE_TAG_TMP:%.*]] = lshr i64 [[SECOND]], 62
@@ -526,29 +488,26 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: ret i32 [[TAG]]
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwup"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
// -- Load the payload
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Strip off spare bits
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 4611686018427387903
// -- Store the payload
// CHECK-NEXT: [[SELF:%.*]] = bitcast %swift.opaque* %value to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[SELF]], i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_PROJ]], i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_PROJ]], ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsOwui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO*
// CHECK-NEXT: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
// CHECK: [[IS_PAYLOAD:%.*]] = icmp uge i32 %tag, 3
// CHECK-NEXT: br i1 [[IS_PAYLOAD]], label %[[HAS_NO_PAYLOAD:.*]], label %[[HAS_PAYLOAD:.*]]
// CHECK: [[HAS_NO_PAYLOAD]]:
@@ -558,14 +517,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[NO_PAYLOAD_TAG2:%.*]] = zext i32 [[NO_PAYLOAD_TAG]] to i64
// -- Store the low bits of the tag into the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[NO_PAYLOAD_TAG2]], ptr [[FIRST_ADDR]], align 8
// -- Store the high bits of the tag into the spare bits
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// -- 0xc000000000000000
// CHECK-NEXT: store i64 -4611686018427387904, i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: store i64 -4611686018427387904, ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: br label %[[END:.*]]
// CHECK: [[HAS_PAYLOAD]]:
@@ -574,11 +532,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[TAG_TMP:%.*]] = and i32 %tag, 3
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: [[FIRST:%.*]] = load i64, ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[SECOND:%.*]] = load i64, ptr [[SECOND_ADDR]], align 8
// -- Mask off spare bits in the payload -- 0x00fffffffffffff8
// CHECK-NEXT: [[SECOND_PROJ:%.*]] = and i64 [[SECOND]], 72057594037927928
@@ -594,11 +551,10 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[SECOND_NEW:%.*]] = or i64 [[SPARE_TAG_TMP]], [[SECOND_PROJ]]
// -- Store the payload back
// CHECK-NEXT: [[PAYLOAD:%.*]] = bitcast %T27enum_value_semantics_future31MultiPayloadNontrivialSpareBitsO* [[SELF]] to { i64, i64 }*
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], i64* [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[PAYLOAD]], i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_NEW]], i64* [[SECOND_ADDR]], align 8
// CHECK-NEXT: [[FIRST_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 0
// CHECK-NEXT: store i64 [[FIRST]], ptr [[FIRST_ADDR]], align 8
// CHECK-NEXT: [[SECOND_ADDR:%.*]] = getelementptr inbounds { i64, i64 }, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i64 [[SECOND_NEW]], ptr [[SECOND_ADDR]], align 8
// CHECK-NEXT: br label %[[END]]
// CHECK: [[END]]:
@@ -606,16 +562,13 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal i32 @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owug"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O*
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]] to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr %value, align 8
// -- Load the load bits of the tag from the extra tag area
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, ptr %value, i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = load i1, ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// -- Load the high bits of the tag from the spare bits area
// CHECK-NEXT: [[SPARE_BITS_TMP2:%.*]] = lshr i64 [[PAYLOAD]], 63
@@ -631,22 +584,18 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owup"
// CHECK: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK: [[PAYLOAD:%.*]] = load i64, ptr %value, align 8
// -- 0x7fffffffffffffff
// CHECK-NEXT: [[PAYLOAD_PROJ:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %swift.opaque* %value to i64*
// CHECK-NEXT: store i64 [[PAYLOAD_PROJ]], i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: store i64 [[PAYLOAD_PROJ]], ptr %value, align 8
// CHECK-NEXT: ret void
// CHECK-LABEL: define internal void @"$s27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0Owui"
// CHECK: [[SELF:%.*]] = bitcast %swift.opaque* %value to %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O*
// CHECK-NEXT: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1
// CHECK: [[SPARE_TAG_TMP3:%.*]] = and i32 %tag, 1
// -- Load the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* %0 to i64*
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: [[PAYLOAD:%.*]] = load i64, ptr {{.*}}, align 8
// -- Mask off the spare bits
// -- 0x7fffffffffffffff
@@ -660,13 +609,11 @@ bb0(%0 : $SinglePayloadNontrivial):
// CHECK-NEXT: [[PAYLOAD_NEW:%.*]] = or i64 [[SPARE_TAG]], [[PAYLOAD_PROJ]]
// -- Store the payload
// CHECK-NEXT: [[PAYLOAD_ADDR:%.*]] = bitcast %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* %0 to i64*
// CHECK-NEXT: store i64 [[PAYLOAD_NEW]], i64* [[PAYLOAD_ADDR]], align 8
// CHECK-NEXT: store i64 [[PAYLOAD_NEW]], ptr {{.*}}, align 8
// -- Store high bits of tag in extra tag area
// CHECK-NEXT: [[EXTRA_TAG_TMP:%.*]] = lshr i32 %tag, 1
// CHECK-NEXT: [[EXTRA_TAG:%.*]] = trunc i32 [[EXTRA_TAG_TMP]] to i1
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O* [[SELF]], i32 0, i32 1
// CHECK-NEXT: [[EXTRA_TAG_ADDR:%.*]] = bitcast [1 x i8]* [[EXTRA_TAG_ADDR_TMP]] to i1*
// CHECK-NEXT: store i1 [[EXTRA_TAG]], i1* [[EXTRA_TAG_ADDR]], align 8
// CHECK-NEXT: [[EXTRA_TAG_ADDR_TMP:%.*]] = getelementptr inbounds %T27enum_value_semantics_future029MultiPayloadSpareBitsAndExtraH0O, ptr %value, i32 0, i32 1
// CHECK-NEXT: store i1 [[EXTRA_TAG]], ptr [[EXTRA_TAG_ADDR_TMP]], align 8
// CHECK-NEXT: ret void

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime --check-prefix=CHECK-%target-runtime-simulator-%target-is-simulator
// RUN: %target-swift-frontend -disable-type-layout %s -emit-ir
// RUN: %target-swift-frontend -disable-type-layout %s -emit-ir | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-runtime --check-prefix=CHECK-%target-runtime-simulator-%target-is-simulator
// REQUIRES: CPU=x86_64
@@ -12,55 +11,38 @@ enum NullableRefcounted {
case None
}
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases18NullableRefcountedOwxx"(%swift.opaque* noalias %object, %swift.type* %NullableRefcounted) {{.*}} {
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases18NullableRefcountedOwxx"(ptr noalias %object, ptr %NullableRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %object to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %1 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.refcounted**
// CHECK: %2 = load %swift.refcounted*, %swift.refcounted** %1, align 8
// CHECK: call void @swift_release(%swift.refcounted* %2)
// CHECK: %0 = load ptr, ptr %object, align 8
// CHECK: call void @swift_release(ptr %0)
// CHECK: ret void
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases18NullableRefcountedOwcp"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %NullableRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases18NullableRefcountedOwcp"(ptr noalias %dest, ptr noalias %src, ptr %NullableRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.refcounted**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %1 to %swift.refcounted**
// CHECK: %4 = load %swift.refcounted*, %swift.refcounted** %3, align 8
// CHECK: %5 = call %swift.refcounted* @swift_retain(%swift.refcounted* returned %4)
// CHECK: store %swift.refcounted* %4, %swift.refcounted** %2, align 8
// CHECK: %6 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %6
// CHECK: %0 = load ptr, ptr %src, align 8
// CHECK: %1 = call ptr @swift_retain(ptr returned %0)
// CHECK: store ptr %0, ptr %dest, align 8
// CHECK: ret ptr %dest
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases18NullableRefcountedOwca"(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %NullableRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases18NullableRefcountedOwca"(ptr %dest, ptr %src, ptr %NullableRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.refcounted**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %1 to %swift.refcounted**
// CHECK: %4 = load %swift.refcounted*, %swift.refcounted** %2, align 8
// CHECK: %5 = load %swift.refcounted*, %swift.refcounted** %3, align 8
// CHECK: %6 = call %swift.refcounted* @swift_retain(%swift.refcounted* returned %5)
// CHECK: store %swift.refcounted* %5, %swift.refcounted** %2, align 8
// CHECK: call void @swift_release(%swift.refcounted* %4)
// CHECK: %7 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %7
// CHECK: %0 = load ptr, ptr %dest, align 8
// CHECK: %1 = load ptr, ptr %src, align 8
// CHECK: %2 = call ptr @swift_retain(ptr returned %1)
// CHECK: store ptr %1, ptr %dest, align 8
// CHECK: call void @swift_release(ptr %0)
// CHECK: ret ptr %dest
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases18NullableRefcountedOwta"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %NullableRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases18NullableRefcountedOwta"(ptr noalias %dest, ptr noalias %src, ptr %NullableRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases18NullableRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.refcounted**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %1 to %swift.refcounted**
// CHECK: %4 = load %swift.refcounted*, %swift.refcounted** %2, align 8
// CHECK: %5 = load %swift.refcounted*, %swift.refcounted** %3, align 8
// CHECK: store %swift.refcounted* %5, %swift.refcounted** %2, align 8
// CHECK: call void @swift_release(%swift.refcounted* %4)
// CHECK: %6 = bitcast %T34enum_value_semantics_special_cases18NullableRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %6
// CHECK: %0 = load ptr, ptr %dest, align 8
// CHECK: %1 = load ptr, ptr %src, align 8
// CHECK: store ptr %1, ptr %dest, align 8
// CHECK: call void @swift_release(ptr %0)
// CHECK: ret ptr %dest
// CHECK: }
// Enums consisting of a retainable block pointer and a single empty case use
@@ -70,55 +52,38 @@ enum NullableBlockRefcounted {
case None
}
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwxx"(%swift.opaque* noalias %object, %swift.type* %NullableBlockRefcounted) {{.*}} {
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwxx"(ptr noalias %object, ptr %NullableBlockRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %object to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %1 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %objc_block**
// CHECK: %2 = load %objc_block*, %objc_block** %1, align 8
// CHECK: call void @_Block_release(%objc_block* %2)
// CHECK: %0 = load ptr, ptr %object, align 8
// CHECK: call void @_Block_release(ptr %0)
// CHECK: ret void
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwcp"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %NullableBlockRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwcp"(ptr noalias %dest, ptr noalias %src, ptr %NullableBlockRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %objc_block**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %1 to %objc_block**
// CHECK: %4 = load %objc_block*, %objc_block** %3, align 8
// CHECK: %5 = call %objc_block* @_Block_copy(%objc_block* %4)
// CHECK: store %objc_block* %4, %objc_block** %2, align 8
// CHECK: %6 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %6
// CHECK: %0 = load ptr, ptr %src, align 8
// CHECK: %1 = call ptr @_Block_copy(ptr %0)
// CHECK: store ptr %0, ptr %dest, align 8
// CHECK: ret ptr %dest
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwca"(%swift.opaque* %dest, %swift.opaque* %src, %swift.type* %NullableBlockRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwca"(ptr %dest, ptr %src, ptr %NullableBlockRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %objc_block**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %1 to %objc_block**
// CHECK: %4 = load %objc_block*, %objc_block** %2, align 8
// CHECK: %5 = load %objc_block*, %objc_block** %3, align 8
// CHECK: %6 = call %objc_block* @_Block_copy(%objc_block* %5)
// CHECK: store %objc_block* %5, %objc_block** %2, align 8
// CHECK: call void @_Block_release(%objc_block* %4)
// CHECK: %7 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %7
// CHECK: %0 = load ptr, ptr %dest, align 8
// CHECK: %1 = load ptr, ptr %src, align 8
// CHECK: %2 = call ptr @_Block_copy(ptr %1)
// CHECK: store ptr %1, ptr %dest, align 8
// CHECK: call void @_Block_release(ptr %0)
// CHECK: ret ptr %dest
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwta"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %NullableBlockRefcounted) {{.*}} {
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases23NullableBlockRefcountedOwta"(ptr noalias %dest, ptr noalias %src, ptr %NullableBlockRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %dest to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %1 = bitcast %swift.opaque* %src to %T34enum_value_semantics_special_cases23NullableBlockRefcountedO*
// CHECK: %2 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %objc_block**
// CHECK: %3 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %1 to %objc_block**
// CHECK: %4 = load %objc_block*, %objc_block** %2, align 8
// CHECK: %5 = load %objc_block*, %objc_block** %3, align 8
// CHECK: store %objc_block* %5, %objc_block** %2, align 8
// CHECK: call void @_Block_release(%objc_block* %4)
// CHECK: %6 = bitcast %T34enum_value_semantics_special_cases23NullableBlockRefcountedO* %0 to %swift.opaque*
// CHECK: ret %swift.opaque* %6
// CHECK: %0 = load ptr, ptr %dest, align 8
// CHECK: %1 = load ptr, ptr %src, align 8
// CHECK: store ptr %1, ptr %dest, align 8
// CHECK: call void @_Block_release(ptr %0)
// CHECK: ret ptr %dest
// CHECK: }
// With multiple empty cases, the nullable pointer semantics aren't used.
@@ -128,23 +93,20 @@ enum MultipleEmptyRefcounted {
case B
}
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases23MultipleEmptyRefcountedOwxx"(%swift.opaque* noalias %object, %swift.type* %MultipleEmptyRefcounted) {{.*}} {
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases23MultipleEmptyRefcountedOwxx"(ptr noalias %object, ptr %MultipleEmptyRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %object to %T34enum_value_semantics_special_cases23MultipleEmptyRefcountedO*
// CHECK: %1 = bitcast %T34enum_value_semantics_special_cases23MultipleEmptyRefcountedO* %0 to i64*
// CHECK: %2 = load i64, i64* %1, align 8
// CHECK: switch i64 %2, label %3 [
// CHECK: i64 0, label %5
// CHECK-native: i64 1, label %5
// CHECK-objc-simulator-false: i64 2, label %5
// CHECK-objc-simulator-true: i64 1, label %5
// CHECK: %0 = load i64, ptr %object, align 8
// CHECK: switch i64 %0, label %1 [
// CHECK: i64 0, label %2
// CHECK-native: i64 1, label %2
// CHECK-objc-simulator-false: i64 2, label %2
// CHECK-objc-simulator-true: i64 1, label %2
// CHECK: ]
// CHECK: 3: ; preds = %entry
// CHECK: %4 = bitcast %T34enum_value_semantics_special_cases23MultipleEmptyRefcountedO* %0 to %swift.refcounted**
// CHECK: %toDestroy = load %swift.refcounted*, %swift.refcounted** %4, align 8
// CHECK: call void @swift_release(%swift.refcounted* %toDestroy)
// CHECK: br label %5
// CHECK: 5: ; preds = %3, %entry, %entry
// CHECK: 1: ; preds = %entry
// CHECK: %toDestroy = load ptr, ptr %object, align 8
// CHECK: call void @swift_release(ptr %toDestroy)
// CHECK: br label %2
// CHECK: 2: ; preds = %1, %entry, %entry
// CHECK: ret void
// CHECK: }
@@ -167,26 +129,23 @@ enum AllRefcounted {
case None
}
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases13AllRefcountedOwxx"(%swift.opaque* noalias %object, %swift.type* %AllRefcounted) {{.*}} {
// CHECK-LABEL: define internal void @"$s34enum_value_semantics_special_cases13AllRefcountedOwxx"(ptr noalias %object, ptr %AllRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %object to %T34enum_value_semantics_special_cases13AllRefcountedO*
// CHECK: %1 = bitcast %T34enum_value_semantics_special_cases13AllRefcountedO* %0 to i64*
// CHECK: %2 = load i64, i64* %1, align 8
// CHECK: %0 = load i64, ptr %object, align 8
// -- 0x3fffffffffffffff
// CHECK: %3 = and i64 %2, 4611686018427387903
// CHECK: %4 = inttoptr i64 %3 to %swift.refcounted*
// CHECK: call void @swift_release(%swift.refcounted* %4)
// CHECK: %1 = and i64 %0, 4611686018427387903
// CHECK: %2 = inttoptr i64 %1 to ptr
// CHECK: call void @swift_release(ptr %2)
// CHECK: ret void
// CHECK: }
// CHECK-LABEL: define internal %swift.opaque* @"$s34enum_value_semantics_special_cases13AllRefcountedOwcp"(%swift.opaque* noalias %dest, %swift.opaque* noalias %src, %swift.type* %AllRefcounted)
// CHECK-LABEL: define internal ptr @"$s34enum_value_semantics_special_cases13AllRefcountedOwcp"(ptr noalias %dest, ptr noalias %src, ptr %AllRefcounted)
// -- 0x3fffffffffffffff
// CHECK: %4 = and i64 %3, 4611686018427387903
// CHECK: %5 = inttoptr i64 %4 to %swift.refcounted*
// CHECK: call %swift.refcounted* @swift_retain(%swift.refcounted* returned %5)
// CHECK: %6 = bitcast %T34enum_value_semantics_special_cases13AllRefcountedO* %0 to i64*
// CHECK: %1 = and i64 %0, 4611686018427387903
// CHECK: %2 = inttoptr i64 %1 to ptr
// CHECK: call ptr @swift_retain(ptr returned %2)
// -- NB: The original loaded value is stored, not the masked one.
// CHECK: store i64 %3, i64* %6, align 8
// CHECK: store i64 %0, ptr %dest, align 8
// CHECK: }
enum AllRefcountedTwoSimple {

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -enable-objc-interop -disable-type-layout -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend %s -enable-objc-interop -disable-type-layout -emit-ir
// RUN: %target-swift-frontend %s -enable-objc-interop -disable-type-layout -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -10,11 +9,9 @@ enum NullableObjCRefcounted {
case Ref(Builtin.AnyObject)
case None
}
// CHECK-LABEL: define internal void @"$s39enum_value_semantics_special_cases_objc22NullableObjCRefcountedOwxx"(%swift.opaque* noalias %object, %swift.type* %NullableObjCRefcounted) {{.*}} {
// CHECK-LABEL: define internal void @"$s39enum_value_semantics_special_cases_objc22NullableObjCRefcountedOwxx"(ptr noalias %object, ptr %NullableObjCRefcounted) {{.*}} {
// CHECK: entry:
// CHECK: %0 = bitcast %swift.opaque* %object to %T39enum_value_semantics_special_cases_objc22NullableObjCRefcountedO*
// CHECK: %1 = bitcast %T39enum_value_semantics_special_cases_objc22NullableObjCRefcountedO* %0 to %objc_object**
// CHECK: %2 = load %objc_object*, %objc_object** %1, align 8
// CHECK: call void @swift_unknownObjectRelease(%objc_object* %2) {{#[0-9]+}}
// CHECK: %0 = load ptr, ptr %object, align 8
// CHECK: call void @swift_unknownObjectRelease(ptr %0) {{#[0-9]+}}
// CHECK: ret void
// CHECK: }

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// REQUIRES: CPU=x86_64
@@ -25,11 +24,9 @@ class ParentNode : Node {
sil @_test_exact_checked_cast_branch : $@convention(method) (@guaranteed Node) -> Int {
bb0(%0 : $Node):
//CHECK-LABEL: define{{.*}}@_test_exact_checked_cast_branch
//CHECK: [[LOAD:%.*]] = load %swift.type
//CHECK-DIRECT-NEXT: = icmp eq %swift.type
//CHECK-INDIRECT-NEXT: = bitcast %swift.type* [[LOAD]] to %objc_class*
//CHECK-INDIRECT-NEXT: = icmp eq %objc_class*
//CHECK-NEXT: = bitcast
//CHECK: [[LOAD:%.*]] = load ptr
//CHECK-DIRECT-NEXT: = icmp eq ptr
//CHECK-INDIRECT-NEXT: = icmp eq ptr
//CHECK-NEXT: br i1
checked_cast_br [exact] %0 : $Node to ParentNode, bb2, bb3 // id: %2
@@ -65,8 +62,7 @@ bb0(%0 : $BaseBase):
//CHECK-LABEL: define{{.*}}@test_exact_checked_cast_branch_dynamic_init
//CHECK: call swiftcc {{.*}}@"$s9exactcast10DerivedIntCMa"({{.*}})
//CHECK: load
//CHECK: bitcast
//CHECK: icmp eq %swift.type
//CHECK: icmp eq ptr
//CHECK: br
checked_cast_br [exact] %0 : $BaseBase to DerivedInt, bb2, bb3 // id: %2

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -emit-ir -o - -primary-file %s | %FileCheck %s
// RUN: %target-swift-frontend -emit-ir -o - -primary-file %s
// RUN: %target-swift-frontend -emit-ir -o - -primary-file %s | %FileCheck %s
// REQUIRES: CPU=x86_64
sil_stage canonical
@@ -20,8 +19,8 @@ extension Float : Kindable {
public var kind: Int { get }
}
// CHECK: @"$sSi21existential_metatypes8KindableAAWP" = external{{( dllimport)?}} global i8*, align 8
// CHECK: @"$sSf21existential_metatypes8KindableAAWP" = external{{( dllimport)?}} global i8*, align 8
// CHECK: @"$sSi21existential_metatypes8KindableAAWP" = external{{( dllimport)?}} global ptr, align 8
// CHECK: @"$sSf21existential_metatypes8KindableAAWP" = external{{( dllimport)?}} global ptr, align 8
sil @int_kind_getter : $@convention(method) (Int) -> Int {
bb0(%0 : $Int):
@@ -56,28 +55,26 @@ bb0(%0 : $*Float):
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test0()
sil @test0 : $@convention(thin) () -> () {
bb0:
// CHECK: [[V:%.*]] = alloca { %swift.type*, i8** }, align 8
// CHECK-NEXT: bitcast
// CHECK: [[V:%.*]] = alloca { ptr, ptr }, align 8
// CHECK-NEXT: llvm.lifetime.start
%0 = alloc_stack $@thick Kindable.Type, var, name "v"
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 0
// CHECK-NEXT: store %swift.type* @"$sSiN", %swift.type** [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 1
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[V]], i32 0, i32 0
// CHECK-NEXT: store ptr @"$sSiN", ptr [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[V]], i32 0, i32 1
%1 = metatype $@thin Int.Type
%2 = metatype $@thick Int.Type
%3 = init_existential_metatype %2 : $@thick Int.Type, $@thick Kindable.Type
// CHECK-NEXT: store i8** @"$sSi21existential_metatypes8KindableAAWP", i8*** [[T0]], align 8
// CHECK-NEXT: store ptr @"$sSi21existential_metatypes8KindableAAWP", ptr [[T0]], align 8
store %3 to %0 : $*@thick Kindable.Type
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 0
// CHECK-NEXT: store %swift.type* @"$sSfN", %swift.type** [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { %swift.type*, i8** }, { %swift.type*, i8** }* [[V]], i32 0, i32 1
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[V]], i32 0, i32 0
// CHECK-NEXT: store ptr @"$sSfN", ptr [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds { ptr, ptr }, ptr [[V]], i32 0, i32 1
%5 = metatype $@thin Float.Type
%6 = metatype $@thick Float.Type
%7 = init_existential_metatype %6 : $@thick Float.Type, $@thick Kindable.Type
// CHECK-NEXT: store i8** @"$sSf21existential_metatypes8KindableAAWP", i8*** [[T0]], align 8
// CHECK-NEXT: store ptr @"$sSf21existential_metatypes8KindableAAWP", ptr [[T0]], align 8
store %7 to %0 : $*@thick Kindable.Type
%9 = tuple ()
// CHECK-NEXT: bitcast
// CHECK-NEXT: llvm.lifetime.end
dealloc_stack %0 : $*@thick Kindable.Type
// CHECK-NEXT: ret void
@@ -93,8 +90,8 @@ bb0(%0 : $@thick Kindable.Type):
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test1(i64 %0, i64 %1)
sil @test1 : $@convention(thin) (Optional<@thick Kindable.Type>) -> () {
bb0(%0 : $Optional<@thick Kindable.Type>):
// CHECK: [[TYPE:%.*]] = inttoptr i64 %0 to %swift.type*
// CHECK: [[WITNESS:%.*]] = inttoptr i64 %1 to i8**
// CHECK: [[TYPE:%.*]] = inttoptr i64 %0 to ptr
// CHECK: [[WITNESS:%.*]] = inttoptr i64 %1 to ptr
switch_enum %0 : $Optional<@thick Kindable.Type>, case #Optional.some!enumelt: bb1, case #Optional.none!enumelt: bb2
bb1(%3 : $@thick Kindable.Type):

View File

@@ -1,7 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir -disable-objc-interop | %FileCheck %s
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir -disable-objc-interop -O | %FileCheck %s --check-prefix=OPT
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop -O
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop -O | %FileCheck %s --check-prefix=OPT
// REQUIRES: CPU=x86_64
@@ -19,83 +17,83 @@ struct BitwiseTakable {
protocol CP: class {}
// CHECK-DAG: define{{( dllexport)?}}{{( protected)?}} swiftcc { %swift.refcounted*, i8** } @class_existential_unowned(%swift.refcounted* %0, i8** %1) {{.*}} {
// CHECK-DAG: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @class_existential_unowned(ptr %0, ptr %1) {{.*}} {
sil @class_existential_unowned : $@convention(thin) (@owned CP) -> @owned CP {
entry(%s : $CP):
%u = ref_to_unowned %s : $CP to $@sil_unowned CP
// CHECK: call %swift.refcounted* @swift_unownedRetain(%swift.refcounted* returned %0)
// CHECK: call ptr @swift_unownedRetain(ptr returned %0)
unowned_retain %u : $@sil_unowned CP
// CHECK: call void @swift_unownedRelease(%swift.refcounted* %0)
// CHECK: call void @swift_unownedRelease(ptr %0)
unowned_release %u : $@sil_unowned CP
// CHECK: call %swift.refcounted* @swift_unownedRetainStrong(%swift.refcounted* returned %0)
// CHECK: call ptr @swift_unownedRetainStrong(ptr returned %0)
strong_retain_unowned %u : $@sil_unowned CP
%t = unowned_to_ref %u : $@sil_unowned CP to $CP
// CHECK: call void @swift_release(%swift.refcounted* %0)
// CHECK: call void @swift_release(ptr %0)
strong_release %t : $CP
%v = ref_to_unmanaged %s : $CP to $@sil_unmanaged CP
// CHECK: call %swift.refcounted* @swift_retain(%swift.refcounted* returned %0)
// CHECK: call ptr @swift_retain(ptr returned %0)
%v_copy = strong_copy_unmanaged_value %v : $@sil_unmanaged CP
// CHECK: call void @swift_release(%swift.refcounted* %0)
// CHECK: call void @swift_release(ptr %0)
strong_release %v_copy : $CP
// CHECK: [[RESULT_A:%.*]] = insertvalue { %swift.refcounted*, i8** } undef, %swift.refcounted* %0, 0
// CHECK: [[RESULT_B:%.*]] = insertvalue { %swift.refcounted*, i8** } [[RESULT_A]], i8** %1, 1
// CHECK: [[RESULT_A:%.*]] = insertvalue { ptr, ptr } undef, ptr %0, 0
// CHECK: [[RESULT_B:%.*]] = insertvalue { ptr, ptr } [[RESULT_A]], ptr %1, 1
%z = unmanaged_to_ref %v : $@sil_unmanaged CP to $CP
// CHECK: ret { %swift.refcounted*, i8** } [[RESULT_B]]
// CHECK: ret { ptr, ptr } [[RESULT_B]]
return %z : $CP
}
// CHECK-DAG: define{{( dllexport)?}}{{( protected)?}} swiftcc void @class_existential_weak({ %swift.weak, i8** }* noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2)
// CHECK-DAG: define{{( dllexport)?}}{{( protected)?}} swiftcc void @class_existential_weak(ptr noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2)
sil @class_existential_weak : $@convention(thin) (@owned CP?) -> @out @sil_weak CP? {
entry(%w : $*@sil_weak CP?, %a : $CP?):
// CHECK: [[V:%.*]] = alloca { %swift.weak, i8** }
// CHECK: [[V:%.*]] = alloca { %swift.weak, ptr }
%v = alloc_stack $@sil_weak CP?
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} %swift.refcounted*
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} i8**
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call %swift.weak* @swift_weakInit(%swift.weak* returned [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: store ptr [[SRC_WITNESS]], ptr [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: call ptr @swift_weakInit(ptr returned [[DEST_REF_ADDR]], ptr [[SRC_REF]])
store_weak %a to [init] %w : $*@sil_weak CP?
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} %swift.refcounted*
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} i8**
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call %swift.weak* @swift_weakAssign(%swift.weak* returned [[DEST_REF_ADDR]], %swift.refcounted* [[SRC_REF]])
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: store ptr [[SRC_WITNESS]], ptr [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: call ptr @swift_weakAssign(ptr returned [[DEST_REF_ADDR]], ptr [[SRC_REF]])
store_weak %a to %w : $*@sil_weak CP?
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call %swift.refcounted* @swift_weakTakeStrong(%swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]]
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call ptr @swift_weakTakeStrong(ptr [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load ptr, ptr [[SRC_WITNESS_ADDR]]
%b = load_weak [take] %w : $*@sil_weak CP?
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call %swift.refcounted* @swift_weakLoadStrong(%swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]]
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call ptr @swift_weakLoadStrong(ptr [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load ptr, ptr [[SRC_WITNESS_ADDR]]
%c = load_weak %w : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s12existentials2CP_pSgXwWOb"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s12existentials2CP_pSgXwWOb"(ptr %0, ptr [[V]])
copy_addr [take] %w to [init] %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s12existentials2CP_pSgXwWOd"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s12existentials2CP_pSgXwWOd"(ptr %0, ptr [[V]])
copy_addr [take] %w to %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s12existentials2CP_pSgXwWOc"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s12existentials2CP_pSgXwWOc"(ptr %0, ptr [[V]])
copy_addr %w to [init] %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s12existentials2CP_pSgXwWOf"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s12existentials2CP_pSgXwWOf"(ptr %0, ptr [[V]])
copy_addr %w to %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s12existentials2CP_pSgXwWOh"({ %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s12existentials2CP_pSgXwWOh"(ptr [[V]])
destroy_addr %v : $*@sil_weak CP?
dealloc_stack %v : $*@sil_weak CP?

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -disable-type-layout -sdk %S/Inputs -I %t %s -emit-ir
// RUN: %target-swift-frontend -disable-type-layout -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -23,13 +22,12 @@ bb0(%0 : $*Any, %1 : $T):
return %3 : $()
}
// CHECK-DAG: define{{( protected)?}} swiftcc void @init_opaque_existential([[ANY:%Any]]* noalias nocapture sret({{.*}}) %0, [[GIZMO:%.*]]* %1, [[TYPE:%.*]]* %T) {{.*}} {
// CHECK: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 1
// CHECK-NEXT: store [[TYPE]]* %T, [[TYPE]]** [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 0
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], [[ANY]]* %0, i32 0, i32 0
// CHECK-NEXT: [[T1:%.*]] = bitcast [24 x i8]* [[T0]] to [[GIZMO]]**
// CHECK-NEXT: store [[GIZMO]]* %1, [[GIZMO]]** [[T1]], align 8
// CHECK-DAG: define{{( protected)?}} swiftcc void @init_opaque_existential(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %T) {{.*}} {
// CHECK: [[T0:%.*]] = getelementptr inbounds [[ANY:%Any]], ptr %0, i32 0, i32 1
// CHECK-NEXT: store ptr %T, ptr [[T0]], align 8
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], ptr %0, i32 0, i32 0
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [[ANY]], ptr %0, i32 0, i32 0
// CHECK-NEXT: store ptr %1, ptr [[T0]], align 8
// CHECK-NEXT: ret void
sil @take_opaque_existential : $@convention(thin) (@in Any) -> @out Any {
@@ -39,22 +37,20 @@ bb0(%0 : $*Any, %1 : $*Any):
return %3 : $()
}
// CHECK-DAG: define{{( protected)?}} swiftcc void @take_opaque_existential([[ANY:%Any]]* noalias nocapture sret({{.*}}) %0, %Any* noalias nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: call %Any* @"$sypWOb"(%Any* %1, %Any* %0)
// CHECK-DAG: define{{( protected)?}} swiftcc void @take_opaque_existential(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: call ptr @"$sypWOb"(ptr %1, ptr %0)
// CHECK-NEXT: ret void
// CHECK-DAG: define linkonce_odr hidden %Any* @"$sypWOb"(%Any* %0, %Any* %1)
// CHECK: %2 = bitcast %Any* %1 to i8*
// CHECK-NEXT: %3 = bitcast %Any* %0 to i8*
// CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %2, i8* align 8 %3, i64 32, i1 false)
// CHECK-NEXT: ret %Any* %1
// CHECK-DAG: define linkonce_odr hidden ptr @"$sypWOb"(ptr %0, ptr %1)
// CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %1, ptr align 8 %0, i64 32, i1 false)
// CHECK-NEXT: ret ptr %1
// rdar://problem/19035529
@objc protocol OP {}
@objc protocol OP2: OP {}
// CHECK-DAG: define{{( protected)?}} swiftcc %objc_object* @init_existential_objc_to_objc(%objc_object* %0) {{.*}} {
// CHECK: ret %objc_object* %0
// CHECK-DAG: define{{( protected)?}} swiftcc ptr @init_existential_objc_to_objc(ptr %0) {{.*}} {
// CHECK: ret ptr %0
sil @init_existential_objc_to_objc : $@convention(thin) (@owned OP2) -> @owned OP {
entry(%o : $OP2):
%a = init_existential_ref %o : $OP2 : $OP2, $OP
@@ -63,91 +59,91 @@ entry(%o : $OP2):
protocol CP: class {}
// CHECK-DAG: define{{( protected)?}} swiftcc { %objc_object*, i8** } @class_existential_unowned(%objc_object* %0, i8** %1) {{.*}} {
// CHECK-DAG: define{{( protected)?}} swiftcc { ptr, ptr } @class_existential_unowned(ptr %0, ptr %1) {{.*}} {
sil @class_existential_unowned : $@convention(thin) (@owned CP) -> @owned CP {
entry(%s : $CP):
%u1 = alloc_stack $@sil_unowned CP
%u2 = alloc_stack $@sil_unowned CP
// CHECK: [[U1:%.*]] = alloca [[UREF:{ %swift.unowned, i8.. }]], align 8
// CHECK: [[U1:%.*]] = alloca [[UREF:{ %swift.unowned, ptr }]], align 8
// CHECK: [[U2:%.*]] = alloca [[UREF]], align 8
store_unowned %s to [init] %u1 : $*@sil_unowned CP
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], [[UREF]]* [[U1]], i32 0, i32 1
// CHECK: store i8** %1, i8*** [[T0]], align 8
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], [[UREF]]* [[U1]], i32 0, i32 0
// CHECK: call %swift.unowned* @swift_unknownObjectUnownedInit(%swift.unowned* returned [[T0]], %objc_object* %0)
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], ptr [[U1]], i32 0, i32 1
// CHECK: store ptr %1, ptr [[T0]], align 8
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], ptr [[U1]], i32 0, i32 0
// CHECK: call ptr @swift_unknownObjectUnownedInit(ptr returned [[T0]], ptr %0)
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], [[UREF]]* [[U1]], i32 0, i32 0
// CHECK: [[T1:%.*]] = call %objc_object* @swift_unknownObjectUnownedLoadStrong(%swift.unowned* [[T0]])
// CHECK: [[T0:%.*]] = getelementptr inbounds [[UREF]], ptr [[U1]], i32 0, i32 0
// CHECK: [[T1:%.*]] = call ptr @swift_unknownObjectUnownedLoadStrong(ptr [[T0]])
%t = load_unowned %u1 : $*@sil_unowned CP
// CHECK: call void @swift_unknownObjectRelease(%objc_object* [[T1]])
// CHECK: call void @swift_unknownObjectRelease(ptr [[T1]])
strong_release %t : $CP
dealloc_stack %u2 : $*@sil_unowned CP
dealloc_stack %u1 : $*@sil_unowned CP
%v = ref_to_unmanaged %s : $CP to $@sil_unmanaged CP
// CHECK: call %objc_object* @swift_unknownObjectRetain(%objc_object*
// CHECK: call ptr @swift_unknownObjectRetain(ptr
%v_copy = strong_copy_unmanaged_value %v : $@sil_unmanaged CP
// CHECK: call void @swift_unknownObjectRelease(%objc_object*
// CHECK: call void @swift_unknownObjectRelease(ptr
strong_release %v_copy : $CP
%z = unmanaged_to_ref %v : $@sil_unmanaged CP to $CP
// CHECK: [[RESULT_A:%.*]] = insertvalue { %objc_object*, i8** } undef, %objc_object* %0, 0
// CHECK: [[RESULT_B:%.*]] = insertvalue { %objc_object*, i8** } [[RESULT_A]], i8** %1, 1
// CHECK: ret { %objc_object*, i8** } [[RESULT_B]]
// CHECK: [[RESULT_A:%.*]] = insertvalue { ptr, ptr } undef, ptr %0, 0
// CHECK: [[RESULT_B:%.*]] = insertvalue { ptr, ptr } [[RESULT_A]], ptr %1, 1
// CHECK: ret { ptr, ptr } [[RESULT_B]]
return %z : $CP
}
// CHECK-DAG: define{{( protected)?}} swiftcc void @class_existential_weak({ %swift.weak, i8** }* noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2)
// CHECK-DAG: define{{( protected)?}} swiftcc void @class_existential_weak(ptr noalias nocapture sret({{.*}}) %0, i64 %1, i64 %2)
sil @class_existential_weak : $@convention(thin) (@owned CP?) -> @out @sil_weak CP? {
entry(%w : $*@sil_weak CP?, %a : $CP?):
// CHECK: [[V:%.*]] = alloca { %swift.weak, i8** }
// CHECK: [[V:%.*]] = alloca { %swift.weak, ptr }
%v = alloc_stack $@sil_weak CP?
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} %objc_object*
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} i8**
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call %swift.weak* @swift_unknownObjectWeakInit(%swift.weak* returned [[DEST_REF_ADDR]], %objc_object* [[SRC_REF]])
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: store ptr [[SRC_WITNESS]], ptr [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: call ptr @swift_unknownObjectWeakInit(ptr returned [[DEST_REF_ADDR]], ptr [[SRC_REF]])
store_weak %a to [init] %w : $*@sil_weak CP?
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} %objc_object*
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} i8**
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: store i8** [[SRC_WITNESS]], i8*** [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: call %swift.weak* @swift_unknownObjectWeakAssign(%swift.weak* returned [[DEST_REF_ADDR]], %objc_object* [[SRC_REF]])
// CHECK: [[SRC_REF:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[SRC_WITNESS:%.*]] = inttoptr {{.*}} ptr
// CHECK: [[DEST_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: store ptr [[SRC_WITNESS]], ptr [[DEST_WITNESS_ADDR]]
// CHECK: [[DEST_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: call ptr @swift_unknownObjectWeakAssign(ptr returned [[DEST_REF_ADDR]], ptr [[SRC_REF]])
store_weak %a to %w : $*@sil_weak CP?
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call %objc_object* @swift_unknownObjectWeakTakeStrong(%swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]]
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call ptr @swift_unknownObjectWeakTakeStrong(ptr [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load ptr, ptr [[SRC_WITNESS_ADDR]]
%b = load_weak [take] %w : $*@sil_weak CP?
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call %objc_object* @swift_unknownObjectWeakLoadStrong(%swift.weak* [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, i8** }, { %swift.weak, i8** }* %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load i8**, i8*** [[SRC_WITNESS_ADDR]]
// CHECK: [[SRC_REF_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[DEST_REF:%.*]] = call ptr @swift_unknownObjectWeakLoadStrong(ptr [[SRC_REF_ADDR]])
// CHECK: [[SRC_WITNESS_ADDR:%.*]] = getelementptr inbounds { %swift.weak, ptr }, ptr %0, i32 0, i32 1
// CHECK: [[DEST_WITNESS:%.*]] = load ptr, ptr [[SRC_WITNESS_ADDR]]
%c = load_weak %w : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s17existentials_objc2CP_pSgXwWOb"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s17existentials_objc2CP_pSgXwWOb"(ptr %0, ptr [[V]])
copy_addr [take] %w to [init] %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s17existentials_objc2CP_pSgXwWOd"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s17existentials_objc2CP_pSgXwWOd"(ptr %0, ptr [[V]])
copy_addr [take] %w to %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s17existentials_objc2CP_pSgXwWOc"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s17existentials_objc2CP_pSgXwWOc"(ptr %0, ptr [[V]])
copy_addr %w to [init] %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s17existentials_objc2CP_pSgXwWOf"({ %swift.weak, i8** }* %0, { %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s17existentials_objc2CP_pSgXwWOf"(ptr %0, ptr [[V]])
copy_addr %w to %v : $*@sil_weak CP?
// CHECK: call { %swift.weak, i8** }* @"$s17existentials_objc2CP_pSgXwWOh"({ %swift.weak, i8** }* [[V]])
// CHECK: call ptr @"$s17existentials_objc2CP_pSgXwWOh"(ptr [[V]])
destroy_addr %v : $*@sil_weak CP?
dealloc_stack %v : $*@sil_weak CP?
@@ -159,15 +155,14 @@ entry(%w : $*@sil_weak CP?, %a : $CP?):
@objc optional func funcA()
}
// CHECK: define swiftcc void @useObjcProtocol(%objc_object* swiftself %0)
// CHECK: define swiftcc void @useObjcProtocol(ptr swiftself %0)
// CHECK: entry:
// CHECK: load i8*, i8** @"\01L_selector(funcA)"
// CHECK: load i8*, i8** @"\01L_selector(respondsToSelector:)"
// CHECK: [[TMP:%.*]] = call i1 bitcast (void ()* @objc_msgSend
// CHECK: load ptr, ptr @"\01L_selector(funcA)"
// CHECK: load ptr, ptr @"\01L_selector(respondsToSelector:)"
// CHECK: [[TMP:%.*]] = call i1 @objc_msgSend
// CHECK: br i1 [[TMP]]
//
// CHECK: [[SELF:%.*]] = bitcast %objc_object* %0 to i8*
// CHECK: call void bitcast (void ()* @objc_msgSend to void (i8*, i8*)*)(i8* [[SELF]]
// CHECK: call void @objc_msgSend(ptr %0
// CHECK: ret void
// CHECK: }
@@ -197,12 +192,11 @@ class TestC {
}
// CHECK-LABEL: define {{.*}}@test_load_unowned
// CHECK: [[REF:%.*]] = load %swift.refcounted*, %swift.refcounted**
// CHECK: [[CAST:%.*]] = bitcast %swift.refcounted* [[REF]] to %T17existentials_objc8NSObjectC
// CHECK: [[REF:%.*]] = load ptr, ptr
// CHECK: swift_unownedRetainStrong
// CHECK: [[EXIST0:%.*]] = insertvalue { %T17existentials_objc8NSObjectC*, i8** } undef, %T17existentials_objc8NSObjectC* [[CAST]], 0
// CHECK: [[EXIST:%.*]] = insertvalue { %T17existentials_objc8NSObjectC*, i8** } [[EXIST0]], i8** {{.*}}, 1
// CHECK: ret { %T17existentials_objc8NSObjectC*, i8** } [[EXIST]]
// CHECK: [[EXIST0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[REF]], 0
// CHECK: [[EXIST:%.*]] = insertvalue { ptr, ptr } [[EXIST0]], ptr {{.*}}, 1
// CHECK: ret { ptr, ptr } [[EXIST]]
sil @test_load_unowned : $@convention(method) (@guaranteed TestC) -> @owned NSObject & TestP {
bb0(%0 : $TestC):
@@ -212,12 +206,11 @@ bb0(%0 : $TestC):
}
// CHECK-LABEL: define {{.*}}@test_load_take_unowned
// CHECK: [[REF:%.*]] = load %swift.refcounted*, %swift.refcounted**
// CHECK: [[CAST:%.*]] = bitcast %swift.refcounted* [[REF]] to %T17existentials_objc8NSObjectC
// CHECK: [[REF:%.*]] = load ptr, ptr
// CHECK: swift_unownedRetainStrongAndRelease
// CHECK: [[EXIST0:%.*]] = insertvalue { %T17existentials_objc8NSObjectC*, i8** } undef, %T17existentials_objc8NSObjectC* [[CAST]], 0
// CHECK: [[EXIST:%.*]] = insertvalue { %T17existentials_objc8NSObjectC*, i8** } [[EXIST0]], i8** {{.*}}, 1
// CHECK: ret { %T17existentials_objc8NSObjectC*, i8** } [[EXIST]]
// CHECK: [[EXIST0:%.*]] = insertvalue { ptr, ptr } undef, ptr [[REF]], 0
// CHECK: [[EXIST:%.*]] = insertvalue { ptr, ptr } [[EXIST0]], ptr {{.*}}, 1
// CHECK: ret { ptr, ptr } [[EXIST]]
sil @test_load_take_unowned : $@convention(method) (@guaranteed TestC) -> @owned NSObject & TestP {
bb0(%0 : $TestC):

View File

@@ -1,9 +1,6 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-sil -emit-ir -disable-llvm-optzns -O %s | %FileCheck --check-prefix=CHECK-%target-runtime %s
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-sil -emit-ir -disable-llvm-optzns -Ounchecked %s | %FileCheck --check-prefix=CHECK-%target-runtime %s
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-sil -emit-ir -disable-llvm-optzns -Onone %s | %FileCheck --check-prefix=ONONE %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -O %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -Ounchecked %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -Onone %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -O %s | %FileCheck --check-prefix=CHECK-%target-runtime %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -Ounchecked %s | %FileCheck --check-prefix=CHECK-%target-runtime %s
// RUN: %target-swift-frontend -parse-sil -emit-ir -disable-llvm-optzns -Onone %s | %FileCheck --check-prefix=ONONE %s
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -11,27 +8,27 @@
// unnecessary.
// ONONE-NOT: @__swift_fixLifetime
// CHECK-objc-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test(%T11fixlifetime1CC* %0, %objc_object* %1, i8** %2, i8* %3, %swift.refcounted* %4, %T11fixlifetime3AggV* noalias nocapture dereferenceable({{.*}}) %5, {{(i64|i32)}} %6, {{(i64|i32)}} %7) {{.*}} {
// CHECK-objc-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr noalias nocapture dereferenceable({{.*}}) %5, {{(i64|i32)}} %6, {{(i64|i32)}} %7) {{.*}} {
// CHECK-objc: entry:
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC*)*)(%T11fixlifetime1CC*
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%objc_object*)*)(%objc_object*
// CHECK-objc: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC*)*)(%T11fixlifetime1CC*
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%objc_object*)*)(%objc_object*
// CHECK-objc: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-objc: [[TEMP:%.*]] = inttoptr {{(i64|i32)}} %6 to %objc_object*
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%objc_object*)*)(%objc_object* [[TEMP]])
// CHECK-objc: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC**)*)(%T11fixlifetime1CC**
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-objc: [[TEMP:%.*]] = inttoptr {{(i64|i32)}} %6 to ptr
// CHECK-objc: call void @__swift_fixLifetime(ptr [[TEMP]])
// CHECK-objc: call void @__swift_fixLifetime(ptr
// CHECK-native-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test(%T11fixlifetime1CC* %0, %swift.refcounted* %1, i8** %2, i8* %3, %swift.refcounted* %4, %T11fixlifetime3AggV* noalias nocapture dereferenceable({{.*}}) %5, {{(i64|i32)}} %6, {{(i64|i32)}} %7) {{.*}} {
// CHECK-native-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr noalias nocapture dereferenceable({{.*}}) %5, {{(i64|i32)}} %6, {{(i64|i32)}} %7) {{.*}} {
// CHECK-native: entry:
// CHECK-native: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC*)*)(%T11fixlifetime1CC*
// CHECK-native: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-native: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-native: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC*)*)(%T11fixlifetime1CC*
// CHECK-native: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-native: call void @__swift_fixLifetime(%swift.refcounted*
// CHECK-native: call void bitcast (void (%swift.refcounted*)* @__swift_fixLifetime to void (%T11fixlifetime1CC**)*)(%T11fixlifetime1CC**
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
// CHECK-native: call void @__swift_fixLifetime(ptr
import Builtin

View File

@@ -1,7 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir -enable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir -disable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// RUN: %target-swift-frontend -primary-file %s -emit-ir -enable-objc-interop
// RUN: %target-swift-frontend -primary-file %s -emit-ir -disable-objc-interop
// RUN: %target-swift-frontend -primary-file %s -emit-ir -enable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend -primary-file %s -emit-ir -disable-objc-interop | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// REQUIRES: CPU=x86_64
@@ -21,7 +19,7 @@ protocol P {
class B<T, U:P> {}
sil_vtable B {}
// CHECK-LABEL: define hidden swiftcc void @thick_metatype(%swift.type* %0)
// CHECK-LABEL: define hidden swiftcc void @thick_metatype(ptr %0)
sil hidden @thick_metatype : $@convention(thin) <T> (@thick A<T>.Type) -> () {
bb0(%0 : $@thick A<T>.Type):
%2 = tuple ()
@@ -30,21 +28,19 @@ bb0(%0 : $@thick A<T>.Type):
sil hidden_external @use_all : $@convention(thin) <T, U where T : P, U : P> () -> ()
// CHECK-LABEL: define hidden swiftcc void @class_pointer(%T11fulfillment1BC* %0, i8** %T.P)
// CHECK: [[T0:%.*]] = bitcast %T11fulfillment1BC* %0 to %swift.type**
// CHECK-NEXT: [[METADATA:%.*]] = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK: [[T0:%.*]] = bitcast %swift.type* [[METADATA]] to %swift.type**
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i64 10
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i64 7
// CHECK-NEXT: %T = load %swift.type*, %swift.type** [[T1]], align 8
// CHECK: [[T0:%.*]] = bitcast %swift.type* [[METADATA]] to %swift.type**
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i64 11
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i64 8
// CHECK-NEXT: %U = load %swift.type*, %swift.type** [[T1]], align 8
// CHECK: [[T0:%.*]] = bitcast %swift.type* [[METADATA]] to i8***
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 12
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 9
// CHECK-NEXT: %U.P = load i8**, i8*** [[T1]], align 8
// CHECK-LABEL: define hidden swiftcc void @class_pointer(ptr %0, ptr %T.P)
// CHECK: [[METADATA:%.*]] = load ptr, ptr %0, align 8
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 10
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 7
// CHECK-NEXT: %T = load ptr, ptr [[T1]], align 8
// CHECK: store
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 11
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 8
// CHECK-NEXT: %U = load ptr, ptr [[T1]], align 8
// CHECK: store
// CHECK-objc-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 12
// CHECK-native-NEXT: [[T1:%.*]] = getelementptr inbounds ptr, ptr [[METADATA]], i64 9
// CHECK-NEXT: %U.P = load ptr, ptr [[T1]], align 8
sil hidden @class_pointer : $@convention(thin) <T, U where T : P, U : P> (@guaranteed B<T, U>) -> () {
bb0(%0 : $B<T, U>):
%f = function_ref @use_all : $@convention(thin) <T, U where T : P, U : P> () -> ()
@@ -53,7 +49,7 @@ bb0(%0 : $B<T, U>):
return %3 : $()
}
// CHECK-LABEL: define hidden swiftcc void @test_23121786(%T11fulfillment1AC* %0, %T11fulfillment1AC{{.*}}* %1)
// CHECK-LABEL: define hidden swiftcc void @test_23121786(ptr %0, ptr %1)
sil hidden @test_23121786 : $@convention(thin) <T> (@owned A<A<T>>, @owned A<T>) -> () {
bb0(%0 : $A<A<T>>, %1 : $A<T>):
%2 = tuple ()
@@ -76,13 +72,12 @@ class K<T> : A2 where T : C {
sil @callee : $@convention(method) <τ_0_0 where τ_0_0 : A2, τ_0_0.AssocTy : C> (@in_guaranteed τ_0_0) -> ()
// CHECK-LABEL: define{{.*}} swiftcc void @caller(%T11fulfillment1KC** {{.*}}, %swift.type* %Self, i8** %SelfWitnessTable)
// CHECK-LABEL: define{{.*}} swiftcc void @caller(ptr {{.*}}, ptr %Self, ptr %SelfWitnessTable)
// CHECK: entry:
// CHECK: %1 = bitcast %swift.type* %Self to i8***
// CHECK-objc: %2 = getelementptr inbounds i8**, i8*** %1, i64 11
// CHECK-native: %2 = getelementptr inbounds i8**, i8*** %1, i64 8
// CHECK: %"\CF\84_1_0.C" = load i8**, i8*** %2
// CHECK: call swiftcc void @callee(%swift.type* %Self, i8** %SelfWitnessTable, i8** %"\CF\84_1_0.C"
// CHECK-objc: %1 = getelementptr inbounds ptr, ptr %Self, i64 11
// CHECK-native: %1 = getelementptr inbounds ptr, ptr %Self, i64 8
// CHECK: %"\CF\84_1_0.C" = load ptr, ptr %1
// CHECK: call swiftcc void @callee(ptr %Self, ptr %SelfWitnessTable, ptr %"\CF\84_1_0.C"
sil @caller : $@convention(witness_method: A2) <τ_0_0><τ_1_0 where τ_0_0 : K<τ_1_0>, τ_1_0 : C> (@in_guaranteed τ_0_0) -> () {
bb0(%0 : $*τ_0_0):
%1 = function_ref @callee : $@convention(method) <τ_0_0 where τ_0_0 : A2, τ_0_0.AssocTy : C> (@in_guaranteed τ_0_0) -> ()

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-os
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-os
// REQUIRES: CPU=x86_64
@@ -10,61 +9,56 @@ import gizmo
// -- Protocol records for cast-to ObjC protocols
// CHECK: @_PROTOCOL__TtP13generic_casts10ObjCProto1_ = weak hidden constant
// CHECK: @"\01l_OBJC_LABEL_PROTOCOL_$__TtP13generic_casts10ObjCProto1_" = weak hidden global i8* bitcast ({{.*}} @_PROTOCOL__TtP13generic_casts10ObjCProto1_ to i8*), section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK: @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP13generic_casts10ObjCProto1_" = weak hidden global i8* bitcast ({{.*}} @_PROTOCOL__TtP13generic_casts10ObjCProto1_ to i8*), section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK: @"\01l_OBJC_LABEL_PROTOCOL_$__TtP13generic_casts10ObjCProto1_" = weak hidden global ptr @_PROTOCOL__TtP13generic_casts10ObjCProto1_, section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK: @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP13generic_casts10ObjCProto1_" = weak hidden global ptr @_PROTOCOL__TtP13generic_casts10ObjCProto1_, section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK-macosx: @"_OBJC_PROTOCOL_$_NSRuncing" = weak hidden global
// CHECK-macosx: @"\01l_OBJC_LABEL_PROTOCOL_$_NSRuncing" = weak hidden global i8* bitcast ({{.*}} @"_OBJC_PROTOCOL_$_NSRuncing" to i8*), section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK-macosx: @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing" = weak hidden global i8* bitcast ({{.*}} @"_OBJC_PROTOCOL_$_NSRuncing" to i8*), section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK-macosx: @"\01l_OBJC_LABEL_PROTOCOL_$_NSRuncing" = weak hidden global ptr @"_OBJC_PROTOCOL_$_NSRuncing", section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK-macosx: @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing" = weak hidden global ptr @"_OBJC_PROTOCOL_$_NSRuncing", section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK-linux: @_PROTOCOL_NSRuncing = weak hidden constant
// CHECK-linux: @"\01l_OBJC_LABEL_PROTOCOL_$_NSRuncing" = weak hidden global i8* bitcast ({{.*}} @_PROTOCOL_NSRuncing to i8*), section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK-linux: @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing" = weak hidden global i8* bitcast ({{.*}} @_PROTOCOL_NSRuncing to i8*), section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK-linux: @"\01l_OBJC_LABEL_PROTOCOL_$_NSRuncing" = weak hidden global ptr @_PROTOCOL_NSRuncing, section {{"__DATA,__objc_protolist,coalesced,no_dead_strip"|"objc_protolist"|".objc_protolist\$B"}}
// CHECK-linux: @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing" = weak hidden global ptr @_PROTOCOL_NSRuncing, section {{"__DATA,__objc_protorefs,coalesced,no_dead_strip"|"objc_protorefs"|".objc_protorefs\$B"}}
// CHECK: @_PROTOCOLS__TtC13generic_casts10ObjCClass2 = internal constant { i64, [1 x i8*] } {
// CHECK: @_PROTOCOLS__TtC13generic_casts10ObjCClass2 = internal constant { i64, [1 x ptr] } {
// CHECK: i64 1,
// CHECK: @_PROTOCOL__TtP13generic_casts10ObjCProto2_
// CHECK: }
// CHECK: @_DATA__TtC13generic_casts10ObjCClass2 = internal constant {{.*}} @_PROTOCOLS__TtC13generic_casts10ObjCClass2
// CHECK: @_PROTOCOL_PROTOCOLS__TtP13generic_casts10ObjCProto2_ = weak hidden constant { i64, [1 x i8*] } {
// CHECK: @_PROTOCOL_PROTOCOLS__TtP13generic_casts10ObjCProto2_ = weak hidden constant { i64, [1 x ptr] } {
// CHECK: i64 1,
// CHECK: @_PROTOCOL__TtP13generic_casts10ObjCProto1_
// CHECK: }
// CHECK: define hidden swiftcc i64 @"$s13generic_casts8allToIntySixlF"(%swift.opaque* noalias nocapture %0, %swift.type* %T)
// CHECK: define hidden swiftcc i64 @"$s13generic_casts8allToIntySixlF"(ptr noalias nocapture %0, ptr %T)
func allToInt<T>(_ x: T) -> Int {
return x as! Int
// CHECK: [[INT_TEMP:%.*]] = alloca %TSi,
// CHECK: [[TYPE_ADDR:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[TYPE_ADDR]], i64 -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[VWT_CAST:%.*]] = bitcast i8** [[VWT]] to %swift.vwtable*
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, %swift.vwtable* [[VWT_CAST]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load i64, i64* [[SIZE_ADDR]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, i64 -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load i64, ptr [[SIZE_ADDR]]
// CHECK: [[T_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16
// CHECK: [[T_TMP:%.*]] = bitcast i8* [[T_ALLOCA]] to %swift.opaque*
// CHECK: [[TEMP:%.*]] = call %swift.opaque* {{.*}}(%swift.opaque* noalias [[T_TMP]], %swift.opaque* noalias %0, %swift.type* %T)
// CHECK: [[T0:%.*]] = bitcast %TSi* [[INT_TEMP]] to %swift.opaque*
// CHECK: call zeroext i1 @swift_dynamicCast(%swift.opaque* [[T0]], %swift.opaque* [[T_TMP]], %swift.type* %T, %swift.type* @"$sSiN", i64 7)
// CHECK: [[T0:%.*]] = getelementptr inbounds %TSi, %TSi* [[INT_TEMP]], i32 0, i32 0
// CHECK: [[INT_RESULT:%.*]] = load i64, i64* [[T0]],
// CHECK: [[TEMP:%.*]] = call ptr {{.*}}(ptr noalias [[T_ALLOCA]], ptr noalias %0, ptr %T)
// CHECK: call zeroext i1 @swift_dynamicCast(ptr [[INT_TEMP]], ptr [[T_ALLOCA]], ptr %T, ptr @"$sSiN", i64 7)
// CHECK: [[T0:%.*]] = getelementptr inbounds %TSi, ptr [[INT_TEMP]], i32 0, i32 0
// CHECK: [[INT_RESULT:%.*]] = load i64, ptr [[T0]],
// CHECK: ret i64 [[INT_RESULT]]
}
// CHECK: define hidden swiftcc void @"$s13generic_casts8intToAllyxSilF"(%swift.opaque* noalias nocapture sret({{.*}}) %0, i64 %1, %swift.type* %T) {{.*}} {
// CHECK: define hidden swiftcc void @"$s13generic_casts8intToAllyxSilF"(ptr noalias nocapture sret({{.*}}) %0, i64 %1, ptr %T) {{.*}} {
func intToAll<T>(_ x: Int) -> T {
// CHECK: [[INT_TEMP:%.*]] = alloca %TSi,
// CHECK: [[T0:%.*]] = getelementptr inbounds %TSi, %TSi* [[INT_TEMP]], i32 0, i32 0
// CHECK: store i64 %1, i64* [[T0]],
// CHECK: [[T0:%.*]] = bitcast %TSi* [[INT_TEMP]] to %swift.opaque*
// CHECK: call zeroext i1 @swift_dynamicCast(%swift.opaque* %0, %swift.opaque* [[T0]], %swift.type* @"$sSiN", %swift.type* %T, i64 7)
// CHECK: [[T0:%.*]] = getelementptr inbounds %TSi, ptr [[INT_TEMP]], i32 0, i32 0
// CHECK: store i64 %1, ptr [[T0]],
// CHECK: call zeroext i1 @swift_dynamicCast(ptr %0, ptr [[INT_TEMP]], ptr @"$sSiN", ptr %T, i64 7)
return x as! T
}
// CHECK: define hidden swiftcc i64 @"$s13generic_casts8anyToIntySiypF"(%Any* noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: define hidden swiftcc i64 @"$s13generic_casts8anyToIntySiypF"(ptr noalias nocapture dereferenceable({{.*}}) %0) {{.*}} {
func anyToInt(_ x: Any) -> Int {
return x as! Int
}
@@ -80,11 +74,11 @@ func anyToInt(_ x: Any) -> Int {
@objc class ObjCClass {}
// CHECK: define hidden swiftcc %objc_object* @"$s13generic_casts9protoCastyAA10ObjCProto1_So9NSRuncingpAA0E6CClassCF"(%T13generic_casts9ObjCClassC* %0) {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s13generic_casts9protoCastyAA10ObjCProto1_So9NSRuncingpAA0E6CClassCF"(ptr %0) {{.*}} {
func protoCast(_ x: ObjCClass) -> ObjCProto1 & NSRuncing {
// CHECK: load i8*, i8** @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP13generic_casts10ObjCProto1_"
// CHECK: load i8*, i8** @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing"
// CHECK: call %objc_object* @swift_dynamicCastObjCProtocolUnconditional(%objc_object* {{%.*}}, i64 2, i8** {{%.*}})
// CHECK: load ptr, ptr @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP13generic_casts10ObjCProto1_"
// CHECK: load ptr, ptr @"\01l_OBJC_PROTOCOL_REFERENCE_$_NSRuncing"
// CHECK: call ptr @swift_dynamicCastObjCProtocolUnconditional(ptr {{%.*}}, i64 2, ptr {{%.*}})
return x as! ObjCProto1 & NSRuncing
}
@@ -97,21 +91,20 @@ func protoCast(_ x: ObjCClass) -> ObjCProto1 & NSRuncing {
// <rdar://problem/15313840>
// Class existential to opaque archetype cast
// CHECK: define hidden swiftcc void @"$s13generic_casts33classExistentialToOpaqueArchetypeyxAA10ObjCProto1_plF"(%swift.opaque* noalias nocapture sret({{.*}}) %0, %objc_object* %1, %swift.type* %T)
// CHECK: define hidden swiftcc void @"$s13generic_casts33classExistentialToOpaqueArchetypeyxAA10ObjCProto1_plF"(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %T)
func classExistentialToOpaqueArchetype<T>(_ x: ObjCProto1) -> T {
var x = x
// CHECK: [[X:%.*]] = alloca %T13generic_casts10ObjCProto1P
// CHECK: [[LOCAL:%.*]] = alloca %T13generic_casts10ObjCProto1P
// CHECK: [[LOCAL_OPAQUE:%.*]] = bitcast %T13generic_casts10ObjCProto1P* [[LOCAL]] to %swift.opaque*
// CHECK: [[PROTO_TYPE:%.*]] = call {{.*}}@"$s13generic_casts10ObjCProto1_pMD"
// CHECK: call zeroext i1 @swift_dynamicCast(%swift.opaque* %0, %swift.opaque* [[LOCAL_OPAQUE]], %swift.type* [[PROTO_TYPE]], %swift.type* %T, i64 7)
// CHECK: call zeroext i1 @swift_dynamicCast(ptr %0, ptr [[LOCAL]], ptr [[PROTO_TYPE]], ptr %T, i64 7)
return x as! T
}
protocol P {}
protocol Q {}
// CHECK: define hidden swiftcc void @"$s13generic_casts19compositionToMemberyAA1P_pAaC_AA1QpF{{.*}}"(%T13generic_casts1PP* noalias nocapture sret({{.*}}) %0, %T13generic_casts1P_AA1Qp* noalias nocapture dereferenceable({{.*}}) %1) {{.*}} {
// CHECK: define hidden swiftcc void @"$s13generic_casts19compositionToMemberyAA1P_pAaC_AA1QpF{{.*}}"(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}}) %1) {{.*}} {
func compositionToMember(_ a: P & Q) -> P {
return a
}

View File

@@ -1,10 +1,9 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -enable-objc-interop -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -enable-objc-interop -emit-ir
// RUN: %target-swift-frontend -primary-file %s -enable-objc-interop -emit-ir | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
func foo<T: AnyObject>(_ x: T) -> T { return x }
// CHECK-LABEL: define hidden swiftcc %objc_object* @"$s23generic_class_anyobject3baryyXlyXlF"(%objc_object* %0)
// CHECK: call swiftcc %objc_object* @"$s23generic_class_anyobject3foo{{[_0-9a-zA-Z]*}}F"
// CHECK-LABEL: define hidden swiftcc ptr @"$s23generic_class_anyobject3baryyXlyXlF"(ptr %0)
// CHECK: call swiftcc ptr @"$s23generic_class_anyobject3foo{{[_0-9a-zA-Z]*}}F"
func bar(_ x: AnyObject) -> AnyObject { return foo(x) }

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %{python} %utils/chex.py < %s > %t/generic_structs.sil
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -disable-generic-metadata-prespecialization %t/generic_structs.sil -emit-ir | %FileCheck %t/generic_structs.sil
// RUN: %target-swift-frontend -disable-type-layout -disable-generic-metadata-prespecialization %t/generic_structs.sil -emit-ir
// RUN: %target-swift-frontend -disable-type-layout -disable-generic-metadata-prespecialization %t/generic_structs.sil -emit-ir | %FileCheck %t/generic_structs.sil
// REQUIRES: CPU=x86_64
@@ -12,7 +11,7 @@ import Builtin
// CHECK: [[PATTERN:@.*]] = internal constant <{ i32, i32, i32, [4 x i8] }> <{ i32 0, i32 1, i32 8, [4 x i8] zeroinitializer }>, align 8
// CHECK-LABEL: @"$s15generic_structs18FixedLayoutGenericVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s15generic_structs18FixedLayoutGenericVMi"
// CHECK-SAME: ptr @"$s15generic_structs18FixedLayoutGenericVMi"
// -- completion function
// CHECK-SAME: i32 0,
// -- pattern flags
@@ -20,14 +19,14 @@ import Builtin
// -- vwtable pointer
// CHECK-SAME: @"$s15generic_structs18FixedLayoutGenericVWV"
// -- extra data pattern
// CHECK-SAME: <{ i32, i32, i32, [4 x i8] }>* [[PATTERN]]
// CHECK-SAME: ptr [[PATTERN]]
// CHECK-SAME: i16 1,
// CHECK-SAME: i16 2 }>
// -- Generic structs with dynamic layout contain the vwtable pattern as part
// of the metadata pattern, and no independent vwtable symbol
// CHECK: @"$s15generic_structs13SingleDynamicVWV" = internal constant
// CHECK-SAME: i8* bitcast (%swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)* @"$s15generic_structs13SingleDynamicVwCP" to i8*),
// CHECK-SAME: ptr @"$s15generic_structs13SingleDynamicVwCP",
// -- ...
// -- placeholder for size, stride, flags
// CHECK-SAME: i64 0,
@@ -41,13 +40,13 @@ import Builtin
// -- flags: struct, unique, generic
// CHECK-SAME: <i32 0x0000_00D1>
// -- name
// CHECK-SAME: [14 x i8]* [[SINGLEDYNAMIC_NAME]]
// CHECK-SAME: ptr [[SINGLEDYNAMIC_NAME]]
// -- field count
// CHECK-SAME: i32 1,
// -- field offset vector offset
// CHECK-SAME: i32 3,
// -- generic instantiation info
// CHECK-SAME: [{{[0-9]+}} x i8*]* @"$s15generic_structs13SingleDynamicVMI"
// CHECK-SAME: ptr @"$s15generic_structs13SingleDynamicVMI"
// CHECK-SAME: @"$s15generic_structs13SingleDynamicVMP"
// -- generic params, requirements, key args, extra args
// CHECK-SAME: i16 1, i16 0, i16 1, i16 0
@@ -56,7 +55,7 @@ import Builtin
// CHECK-SAME: }>
// CHECK: @"$s15generic_structs13SingleDynamicVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s15generic_structs13SingleDynamicVMi"
// CHECK-SAME: ptr @"$s15generic_structs13SingleDynamicVMi"
// -- vwtable pointer
// CHECK-SAME: @"$s15generic_structs13SingleDynamicVWV"
@@ -67,7 +66,7 @@ import Builtin
// -- flags: struct, unique, generic
// CHECK-SAME: <i32 0x0000_00D1>
// -- name
// CHECK-SAME: [24 x i8]* [[DYNAMICWITHREQUIREMENTS_NAME]]
// CHECK-SAME: ptr [[DYNAMICWITHREQUIREMENTS_NAME]]
// -- field count
// CHECK-SAME: i32 2,
// -- field offset vector offset
@@ -160,29 +159,20 @@ sil @explode_complex_dynamic : $<A, B> (@in ComplexDynamic<A, B>, @inout Byteful
entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Chareth):
%a = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.a2
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 10
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %swift.opaque*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 10
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%b = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.b
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 11
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %T15generic_structs13SingleDynamicV
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 11
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%5 = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.c
%c = struct_element_addr %5 : $*SingleDynamic<B>, #SingleDynamic.x
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 12
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T15generic_structs14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %T15generic_structs7CharethV
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 12
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%d = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.d
copy_addr %a to %1 : $*Byteful
copy_addr %b to %2 : $*A
@@ -192,37 +182,31 @@ entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Ch
return %v : $()
}
// CHECK-LABEL: define{{( protected)?}} internal %swift.type* @"$s15generic_structs13SingleDynamicVMi"(%swift.type_descriptor* %0, i8** %1, i8* %2)
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2, i64 16)
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( protected)?}} internal ptr @"$s15generic_structs13SingleDynamicVMi"(ptr %0, ptr %1, ptr %2)
// CHECK: %T = load ptr, ptr %1, align 8
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata(ptr %0, ptr %1, ptr %2, i64 16)
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK: }
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s15generic_structs13SingleDynamicVMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// Lay out fields.
// CHECK: [[T0:%.*]] = bitcast %swift.type* [[METADATA]] to i32*
// CHECK: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i64 6
// CHECK: [[T2:%.*]] = getelementptr inbounds i8**, i8*** [[TYPES:%.*]], i32 0
// CHECK: call void @swift_initStructMetadata(%swift.type* [[METADATA]], i64 0, i64 1, i8*** [[TYPES]], i32* [[T1]])
// CHECK: [[T1:%.*]] = getelementptr inbounds i32, ptr [[METADATA]], i64 6
// CHECK: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[TYPES:%.*]], i32 0
// CHECK: call void @swift_initStructMetadata(ptr [[METADATA]], i64 0, i64 1, ptr [[TYPES]], ptr [[T1]])
// CHECK: ret %swift.metadata_response
// CHECK: }
// Check that we directly delegate buffer witnesses to a single dynamic field:
// initializeBufferWithCopyOfBuffer
// CHECK-LABEL: define internal %swift.opaque* @"$s15generic_structs13SingleDynamicVwCP"([24 x i8]* noalias %dest, [24 x i8]* noalias %src, %swift.type* %"SingleDynamic<T>") {{.*}} {
// CHECK: %T = load %swift.type*,
// CHECK: [[T0:%.*]] = bitcast %swift.type* %T to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 -1
// CHECK-NEXT: %T.valueWitnesses = load i8**, i8*** [[T1]]
// CHECK-NEXT: [[T1:%.*]] = load i8*, i8** %T.valueWitnesses,
// CHECK-NEXT: [[FN:%.*]] = bitcast i8* [[T1]] to %swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)*
// CHECK-NEXT: [[T0:%.*]] = call %swift.opaque* [[FN]]([24 x i8]* noalias %dest, [24 x i8]* noalias %src, %swift.type* %T)
// CHECK-NEXT: [[T1:%.*]] = bitcast %swift.opaque* [[T0]] to {{.*}}
// CHECK-NEXT: [[T2:%.*]] = bitcast {{.*}} [[T1]] to %swift.opaque*
// CHECK-NEXT: ret %swift.opaque* [[T2]]
// CHECK-LABEL: define internal ptr @"$s15generic_structs13SingleDynamicVwCP"(ptr noalias %dest, ptr noalias %src, ptr %"SingleDynamic<T>") {{.*}} {
// CHECK: %T = load ptr,
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %T, i64 -1
// CHECK-NEXT: %T.valueWitnesses = load ptr, ptr [[T1]]
// CHECK-NEXT: [[T1:%.*]] = load ptr, ptr %T.valueWitnesses,
// CHECK-NEXT: [[T0:%.*]] = call ptr [[T1]](ptr noalias %dest, ptr noalias %src, ptr %T)
// CHECK-NEXT: ret ptr [[T0]]
protocol HasAssociatedType {
@@ -236,24 +220,21 @@ struct GenericLayoutWithAssocType<T: ParentHasAssociatedType> {
var x: T.Assoc
var y: T.Assoc.Assoc
}
// CHECK-LABEL: define internal %swift.type* @"$s15generic_structs26GenericLayoutWithAssocTypeVMi"(
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i32 1
// CHECK: [[T2:%.*]] = bitcast %swift.type** [[T1]] to i8***
// CHECK: %T.ParentHasAssociatedType = load i8**, i8*** [[T2]],
// CHECK-LABEL: define internal ptr @"$s15generic_structs26GenericLayoutWithAssocTypeVMi"(
// CHECK: %T = load ptr, ptr %1, align 8
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %1, i32 1
// CHECK: %T.ParentHasAssociatedType = load ptr, ptr [[T1]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s15generic_structs26GenericLayoutWithAssocTypeVMr"(
// CHECK: [[T0_GEP:%.*]] = getelementptr inbounds i8*, i8** %T.ParentHasAssociatedType, i32 1
// CHECK: [[T0:%.*]] = load i8*, i8** [[T0_GEP]]
// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i8**
// CHECK: [[T4:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, i8** %T.HasAssociatedType, %swift.type* %T, %swift.protocol_requirement* @"$s15generic_structs17HasAssociatedTypeTL", %swift.protocol_requirement* @"$s5Assoc15generic_structs17HasAssociatedTypePTl")
// CHECK: [[T0_GEP:%.*]] = getelementptr inbounds ptr, ptr %T.ParentHasAssociatedType, i32 1
// CHECK: [[T0:%.*]] = load ptr, ptr [[T0_GEP]]
// CHECK: [[T4:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, ptr %T.HasAssociatedType, ptr %T, ptr @"$s15generic_structs17HasAssociatedTypeTL", ptr @"$s5Assoc15generic_structs17HasAssociatedTypePTl")
// CHECK: %T.Assoc = extractvalue %swift.metadata_response [[T4]], 0
// CHECK: %T.Assoc.HasAssociatedType = call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** %T.ParentHasAssociatedType, %swift.type* %T, %swift.type* %T.Assoc,
// CHECK: %T.Assoc.HasAssociatedType = call swiftcc ptr @swift_getAssociatedConformanceWitness(ptr %T.ParentHasAssociatedType, ptr %T, ptr %T.Assoc,
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, i8** %T.Assoc.HasAssociatedType, %swift.type* %T.Assoc, %swift.protocol_requirement* @"$s15generic_structs17HasAssociatedTypeTL", %swift.protocol_requirement* @"$s5Assoc15generic_structs17HasAssociatedTypePTl")
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, ptr %T.Assoc.HasAssociatedType, ptr %T.Assoc, ptr @"$s15generic_structs17HasAssociatedTypeTL", ptr @"$s5Assoc15generic_structs17HasAssociatedTypePTl")
// CHECK: %T.Assoc.Assoc = extractvalue %swift.metadata_response [[T2]], 0

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %{python} %utils/chex.py < %s > %t/generic_structs_future.sil
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-type-layout -prespecialize-generic-metadata -target %module-target-future %t/generic_structs_future.sil -emit-ir | %FileCheck %t/generic_structs_future.sil
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata -target %module-target-future %t/generic_structs_future.sil -emit-ir
// RUN: %target-swift-frontend -disable-type-layout -prespecialize-generic-metadata -target %module-target-future %t/generic_structs_future.sil -emit-ir | %FileCheck %t/generic_structs_future.sil
// REQUIRES: VENDOR=apple || OS=linux-gnu
// REQUIRES: CPU=x86_64
@@ -13,7 +12,7 @@ import Builtin
// CHECK: [[PATTERN:@.*]] = internal constant <{ i32, i32, i32, [4 x i8], i64 }> <{ i32 0, i32 1, i32 8, [4 x i8] zeroinitializer, i64 0 }>, align 8
// CHECK-LABEL: @"$s22generic_structs_future18FixedLayoutGenericVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s22generic_structs_future18FixedLayoutGenericVMi"
// CHECK-SAME: ptr @"$s22generic_structs_future18FixedLayoutGenericVMi"
// -- completion function
// CHECK-SAME: i32 0,
// -- pattern flags
@@ -21,14 +20,14 @@ import Builtin
// -- vwtable pointer
// CHECK-SAME: @"$s22generic_structs_future18FixedLayoutGenericVWV"
// -- extra data pattern
// CHECK-SAME: <{ i32, i32, i32, [4 x i8], i64 }>* [[PATTERN]]
// CHECK-SAME: ptr [[PATTERN]]
// CHECK-SAME: i16 1,
// CHECK-SAME: i16 3 }>
// -- Generic structs with dynamic layout contain the vwtable pattern as part
// of the metadata pattern, and no independent vwtable symbol
// CHECK: @"$s22generic_structs_future13SingleDynamicVWV" = internal constant
// CHECK-SAME: i8* bitcast (%swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)* @"$s22generic_structs_future13SingleDynamicVwCP" to i8*),
// CHECK-SAME: ptr @"$s22generic_structs_future13SingleDynamicVwCP",
// -- ...
// -- placeholder for size, stride, flags
// CHECK-SAME: i64 0,
@@ -42,13 +41,13 @@ import Builtin
// -- flags: struct, unique, generic
// CHECK-SAME: <i32 0x0000_00D1>
// -- name
// CHECK-SAME: [14 x i8]* [[SINGLEDYNAMIC_NAME]]
// CHECK-SAME: ptr [[SINGLEDYNAMIC_NAME]]
// -- field count
// CHECK-SAME: i32 1,
// -- field offset vector offset
// CHECK-SAME: i32 3,
// -- generic instantiation info
// CHECK-SAME: [{{[0-9]+}} x i8*]* @"$s22generic_structs_future13SingleDynamicVMI"
// CHECK-SAME: ptr @"$s22generic_structs_future13SingleDynamicVMI"
// CHECK-SAME: @"$s22generic_structs_future13SingleDynamicVMP"
// -- generic params, requirements, key args, extra args
// CHECK-SAME: i16 1, i16 0, i16 1, i16 0
@@ -57,7 +56,7 @@ import Builtin
// CHECK-SAME: }>
// CHECK: @"$s22generic_structs_future13SingleDynamicVMP" = internal constant <{ {{.*}} }> <{
// -- instantiation function
// CHECK-SAME: %swift.type* (%swift.type_descriptor*, i8**, i8*)* @"$s22generic_structs_future13SingleDynamicVMi"
// CHECK-SAME: ptr @"$s22generic_structs_future13SingleDynamicVMi"
// -- vwtable pointer
// CHECK-SAME: @"$s22generic_structs_future13SingleDynamicVWV"
@@ -68,7 +67,7 @@ import Builtin
// -- flags: struct, unique, generic
// CHECK-SAME: <i32 0x0000_00D1>
// -- name
// CHECK-SAME: [24 x i8]* [[DYNAMICWITHREQUIREMENTS_NAME]]
// CHECK-SAME: ptr [[DYNAMICWITHREQUIREMENTS_NAME]]
// -- field count
// CHECK-SAME: i32 2,
// -- field offset vector offset
@@ -161,29 +160,20 @@ sil @explode_complex_dynamic : $<A, B> (@in ComplexDynamic<A, B>, @inout Byteful
entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Chareth):
%a = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.a2
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 10
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T22generic_structs_future14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %swift.opaque*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 10
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%b = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.b
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 11
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T22generic_structs_future14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %T22generic_structs_future13SingleDynamicV
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 11
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%5 = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.c
%c = struct_element_addr %5 : $*SingleDynamic<B>, #SingleDynamic.x
// CHECK: [[METADATA:%.*]] = bitcast %swift.type* {{%.*}} to i32*
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, i32* [[METADATA]], i64 12
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, i32* [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTES:%.*]] = bitcast %T22generic_structs_future14ComplexDynamicV* %0 to i8*
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, i8* [[BYTES]], i32 [[FIELD_OFFSET]]
// CHECK: bitcast i8* [[BYTE_OFFSET]] to %T22generic_structs_future7CharethV
// CHECK: [[FIELD_OFFSET_ADDR:%.*]] = getelementptr inbounds i32, ptr {{%.*}}, i64 12
// CHECK: [[FIELD_OFFSET:%.*]] = load i32, ptr [[FIELD_OFFSET_ADDR]], align 8
// CHECK: [[BYTE_OFFSET:%.*]] = getelementptr inbounds i8, ptr %0, i32 [[FIELD_OFFSET]]
%d = struct_element_addr %0 : $*ComplexDynamic<A, B>, #ComplexDynamic.d
copy_addr %a to %1 : $*Byteful
copy_addr %b to %2 : $*A
@@ -193,37 +183,31 @@ entry(%0 : $*ComplexDynamic<A, B>, %1 : $*Byteful, %2 : $*A, %3 : $*B, %4 : $*Ch
return %v : $()
}
// CHECK-LABEL: define{{( protected)?}} internal %swift.type* @"$s22generic_structs_future13SingleDynamicVMi"(%swift.type_descriptor* %0, i8** %1, i8* %2)
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2, i64 24)
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( protected)?}} internal ptr @"$s22generic_structs_future13SingleDynamicVMi"(ptr %0, ptr %1, ptr %2)
// CHECK: %T = load ptr, ptr %1, align 8
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata(ptr %0, ptr %1, ptr %2, i64 24)
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK: }
// CHECK-LABEL: define{{( protected)?}} internal swiftcc %swift.metadata_response @"$s22generic_structs_future13SingleDynamicVMr"
// CHECK-SAME: (%swift.type* [[METADATA:%.*]], i8* %0, i8** %1) {{.*}} {
// CHECK-SAME: (ptr [[METADATA:%.*]], ptr %0, ptr %1) {{.*}} {
// Lay out fields.
// CHECK: [[T0:%.*]] = bitcast %swift.type* [[METADATA]] to i32*
// CHECK: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i64 6
// CHECK: [[T2:%.*]] = getelementptr inbounds i8**, i8*** [[TYPES:%.*]], i32 0
// CHECK: call void @swift_initStructMetadata(%swift.type* [[METADATA]], i64 0, i64 1, i8*** [[TYPES]], i32* [[T1]])
// CHECK: [[T1:%.*]] = getelementptr inbounds i32, ptr [[METADATA]], i64 6
// CHECK: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[TYPES:%.*]], i32 0
// CHECK: call void @swift_initStructMetadata(ptr [[METADATA]], i64 0, i64 1, ptr [[TYPES]], ptr [[T1]])
// CHECK: ret %swift.metadata_response
// CHECK: }
// Check that we directly delegate buffer witnesses to a single dynamic field:
// initializeBufferWithCopyOfBuffer
// CHECK-LABEL: define internal %swift.opaque* @"$s22generic_structs_future13SingleDynamicVwCP"([24 x i8]* noalias %dest, [24 x i8]* noalias %src, %swift.type* %"SingleDynamic<T>") {{.*}} {
// CHECK: %T = load %swift.type*,
// CHECK: [[T0:%.*]] = bitcast %swift.type* %T to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 -1
// CHECK-NEXT: %T.valueWitnesses = load i8**, i8*** [[T1]]
// CHECK-NEXT: [[T1:%.*]] = load i8*, i8** %T.valueWitnesses,
// CHECK-NEXT: [[FN:%.*]] = bitcast i8* [[T1]] to %swift.opaque* ([24 x i8]*, [24 x i8]*, %swift.type*)*
// CHECK-NEXT: [[T0:%.*]] = call %swift.opaque* [[FN]]([24 x i8]* noalias %dest, [24 x i8]* noalias %src, %swift.type* %T)
// CHECK-NEXT: [[T1:%.*]] = bitcast %swift.opaque* [[T0]] to {{.*}}
// CHECK-NEXT: [[T2:%.*]] = bitcast {{.*}} [[T1]] to %swift.opaque*
// CHECK-NEXT: ret %swift.opaque* [[T2]]
// CHECK-LABEL: define internal ptr @"$s22generic_structs_future13SingleDynamicVwCP"(ptr noalias %dest, ptr noalias %src, ptr %"SingleDynamic<T>") {{.*}} {
// CHECK: %T = load ptr,
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %T, i64 -1
// CHECK-NEXT: %T.valueWitnesses = load ptr, ptr [[T1]]
// CHECK-NEXT: [[T1:%.*]] = load ptr, ptr %T.valueWitnesses,
// CHECK-NEXT: [[T0:%.*]] = call ptr [[T1]](ptr noalias %dest, ptr noalias %src, ptr %T)
// CHECK-NEXT: ret ptr [[T0]]
protocol HasAssociatedType {
@@ -237,24 +221,21 @@ struct GenericLayoutWithAssocType<T: ParentHasAssociatedType> {
var x: T.Assoc
var y: T.Assoc.Assoc
}
// CHECK-LABEL: define internal %swift.type* @"$s22generic_structs_future26GenericLayoutWithAssocTypeVMi"(
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]], align 8
// CHECK: [[T1:%.*]] = getelementptr inbounds %swift.type*, %swift.type** [[T0]], i32 1
// CHECK: [[T2:%.*]] = bitcast %swift.type** [[T1]] to i8***
// CHECK: %T.ParentHasAssociatedType = load i8**, i8*** [[T2]],
// CHECK-LABEL: define internal ptr @"$s22generic_structs_future26GenericLayoutWithAssocTypeVMi"(
// CHECK: %T = load ptr, ptr %1, align 8
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %1, i32 1
// CHECK: %T.ParentHasAssociatedType = load ptr, ptr [[T1]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericValueMetadata
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericValueMetadata
// CHECK-LABEL: define internal swiftcc %swift.metadata_response @"$s22generic_structs_future26GenericLayoutWithAssocTypeVMr"(
// CHECK: [[T0_GEP:%.*]] = getelementptr inbounds i8*, i8** %T.ParentHasAssociatedType, i32 1
// CHECK: [[T0:%.*]] = load i8*, i8** [[T0_GEP]]
// CHECK: [[T1:%.*]] = bitcast i8* [[T0]] to i8**
// CHECK: [[T4:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, i8** %T.HasAssociatedType, %swift.type* %T, %swift.protocol_requirement* @"$s22generic_structs_future17HasAssociatedTypeTL", %swift.protocol_requirement* @"$s5Assoc22generic_structs_future17HasAssociatedTypePTl")
// CHECK: [[T0_GEP:%.*]] = getelementptr inbounds ptr, ptr %T.ParentHasAssociatedType, i32 1
// CHECK: [[T0:%.*]] = load ptr, ptr [[T0_GEP]]
// CHECK: [[T4:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, ptr %T.HasAssociatedType, ptr %T, ptr @"$s22generic_structs_future17HasAssociatedTypeTL", ptr @"$s5Assoc22generic_structs_future17HasAssociatedTypePTl")
// CHECK: %T.Assoc = extractvalue %swift.metadata_response [[T4]], 0
// CHECK: %T.Assoc.HasAssociatedType = call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** %T.ParentHasAssociatedType, %swift.type* %T, %swift.type* %T.Assoc,
// CHECK: %T.Assoc.HasAssociatedType = call swiftcc ptr @swift_getAssociatedConformanceWitness(ptr %T.ParentHasAssociatedType, ptr %T, ptr %T.Assoc,
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, i8** %T.Assoc.HasAssociatedType, %swift.type* %T.Assoc, %swift.protocol_requirement* @"$s22generic_structs_future17HasAssociatedTypeTL", %swift.protocol_requirement* @"$s5Assoc22generic_structs_future17HasAssociatedTypePTl")
// CHECK: [[T2:%.*]] = call swiftcc %swift.metadata_response @swift_getAssociatedTypeWitness(i64 0, ptr %T.Assoc.HasAssociatedType, ptr %T.Assoc, ptr @"$s22generic_structs_future17HasAssociatedTypeTL", ptr @"$s5Assoc22generic_structs_future17HasAssociatedTypePTl")
// CHECK: %T.Assoc.Assoc = extractvalue %swift.metadata_response [[T2]], 0

View File

@@ -1,11 +1,10 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// <rdar://problem/13793646>
struct OptionalStreamAdaptor<T : IteratorProtocol> {
// CHECK: define hidden swiftcc void @"$s15generic_ternary21OptionalStreamAdaptorV4next{{[_0-9a-zA-Z]*}}F"(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.type* %"OptionalStreamAdaptor<T>", %T15generic_ternary21OptionalStreamAdaptorV* nocapture swiftself dereferenceable({{.*}}) %1)
// CHECK: define hidden swiftcc void @"$s15generic_ternary21OptionalStreamAdaptorV4next{{[_0-9a-zA-Z]*}}F"(ptr noalias nocapture sret({{.*}}) %0, ptr %"OptionalStreamAdaptor<T>", ptr nocapture swiftself dereferenceable({{.*}}) %1)
mutating
func next() -> Optional<T.Element> {
return x[0].next()

View File

@@ -1,6 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -module-name generic_tuples -emit-ir -primary-file %s | %FileCheck %s
// RUN: %target-swift-frontend -module-name generic_tuples -emit-ir -primary-file %s
// RUN: %target-swift-frontend -module-name generic_tuples -emit-ir -primary-file %s | %FileCheck %s
// Make sure that optimization passes don't choke on storage types for generic tuples
// RUN: %target-swift-frontend -module-name generic_tuples -emit-ir -O %s
@@ -8,35 +6,30 @@
// REQUIRES: CPU=x86_64
// CHECK: [[TYPE:%swift.type]] = type {
// CHECK: [[OPAQUE:%swift.opaque]] = type opaque
// CHECK: [[TUPLE_TYPE:%swift.tuple_type]] = type { [[TYPE]], i64, i8*, [0 x %swift.tuple_element_type] }
// CHECK: %swift.tuple_element_type = type { [[TYPE]]*, i32 }
// CHECK-DAG: [[OPAQUE:%swift.opaque]] = type opaque
// CHECK-DAG: [[TUPLE_TYPE:%swift.tuple_type]] = type { [[TYPE]], i64, ptr, [0 x %swift.tuple_element_type] }
// CHECK: %swift.tuple_element_type = type { ptr, i32 }
func dup<T>(_ x: T) -> (T, T) { var x = x; return (x,x) }
// CHECK: define hidden swiftcc void @"$s14generic_tuples3dupyx_xtxlF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %swift.type* %T)
// CHECK: define hidden swiftcc void @"$s14generic_tuples3dupyx_xtxlF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr %T)
// CHECK: entry:
// Allocate a local variable for 'x'.
// CHECK: [[TYPE_ADDR:%.*]] = bitcast %swift.type* %T to i8***
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds i8**, i8*** [[TYPE_ADDR]], i64 -1
// CHECK: [[VWT:%.*]] = load i8**, i8*** [[VWT_ADDR]]
// CHECK: [[VWT_CAST:%.*]] = bitcast i8** [[VWT]] to %swift.vwtable*
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, %swift.vwtable* [[VWT_CAST]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load i64, i64* [[SIZE_ADDR]]
// CHECK: [[VWT_ADDR:%.*]] = getelementptr inbounds ptr, ptr %T, i64 -1
// CHECK: [[VWT:%.*]] = load ptr, ptr [[VWT_ADDR]]
// CHECK: [[SIZE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 8
// CHECK: [[SIZE:%.*]] = load i64, ptr [[SIZE_ADDR]]
// CHECK: [[X_ALLOCA:%.*]] = alloca i8, {{.*}} [[SIZE]], align 16
// CHECK: [[X_TMP:%.*]] = bitcast i8* [[X_ALLOCA]] to %swift.opaque*
// Debug info shadow copy.
// CHECK-NEXT: store i8* [[X_ALLOCA]]
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 2
// CHECK-NEXT: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]], align 8
// CHECK-NEXT: [[INITIALIZE_WITH_COPY:%.*]] = bitcast i8* [[WITNESS]] to [[OPAQUE]]* ([[OPAQUE]]*, [[OPAQUE]]*, [[TYPE]]*)*
// CHECK-NEXT: [[X:%.*]] = call [[OPAQUE]]* [[INITIALIZE_WITH_COPY]]([[OPAQUE]]* noalias [[X_TMP]], [[OPAQUE]]* noalias {{.*}}, [[TYPE]]* %T)
// CHECK: store ptr [[X_ALLOCA]]
// CHECK: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 2
// CHECK-NEXT: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_ADDR]], align 8
// CHECK-NEXT: [[X:%.*]] = call ptr [[WITNESS]](ptr noalias [[X_ALLOCA]], ptr noalias {{.*}}, ptr %T)
// Copy 'x' into the first result.
// CHECK-NEXT: call [[OPAQUE]]* [[INITIALIZE_WITH_COPY]]([[OPAQUE]]* noalias %0, [[OPAQUE]]* noalias [[X_TMP]], [[TYPE]]* %T)
// CHECK-NEXT: call ptr [[WITNESS]](ptr noalias %0, ptr noalias [[X_ALLOCA]], ptr %T)
// Copy 'x' into the second element.
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32 4
// CHECK-NEXT: [[WITNESS:%.*]] = load i8*, i8** [[WITNESS_ADDR]], align 8
// CHECK-NEXT: [[TAKE_FN:%.*]] = bitcast i8* [[WITNESS]] to [[OPAQUE]]* ([[OPAQUE]]*, [[OPAQUE]]*, [[TYPE]]*)*
// CHECK-NEXT: call [[OPAQUE]]* [[TAKE_FN]]([[OPAQUE]]* noalias %1, [[OPAQUE]]* noalias [[X_TMP]], [[TYPE]]* %T)
// CHECK-NEXT: [[WITNESS_ADDR:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32 4
// CHECK-NEXT: [[WITNESS:%.*]] = load ptr, ptr [[WITNESS_ADDR]], align 8
// CHECK-NEXT: call ptr [[WITNESS]](ptr noalias %1, ptr noalias [[X_ALLOCA]], ptr %T)
struct S {}
@@ -44,50 +37,48 @@ struct S {}
func callDup(_ s: S) { _ = dup(s) }
// CHECK-LABEL: define hidden swiftcc void @"$s14generic_tuples7callDupyyAA1SVF"()
// CHECK-NEXT: entry:
// CHECK-NEXT: call swiftcc void @"$s14generic_tuples3dupyx_xtxlF"({{.*}} undef, {{.*}} undef, %swift.type* {{.*}} @"$s14generic_tuples1SVMf", {{.*}})
// CHECK-NEXT: call swiftcc void @"$s14generic_tuples3dupyx_xtxlF"({{.*}} undef, {{.*}} undef, ptr {{.*}} @"$s14generic_tuples1SVMf", {{.*}})
// CHECK-NEXT: ret void
class C {}
func dupC<T : C>(_ x: T) -> (T, T) { return (x, x) }
// CHECK-LABEL: define hidden swiftcc { %T14generic_tuples1CC*, %T14generic_tuples1CC* } @"$s14generic_tuples4dupCyx_xtxAA1CCRbzlF"(%T14generic_tuples1CC* %0, %swift.type* %T)
// CHECK-LABEL: define hidden swiftcc { ptr, ptr } @"$s14generic_tuples4dupCyx_xtxAA1CCRbzlF"(ptr %0, ptr %T)
// CHECK-NEXT: entry:
// CHECK: [[REF:%.*]] = bitcast %T14generic_tuples1CC* %0 to %swift.refcounted*
// CHECK-NEXT: call %swift.refcounted* @swift_retain(%swift.refcounted* returned [[REF]])
// CHECK-NEXT: [[REF:%.*]] = bitcast %T14generic_tuples1CC* %0 to %swift.refcounted*
// CHECK-NEXT: call %swift.refcounted* @swift_retain(%swift.refcounted* returned [[REF]])
// CHECK-NEXT: [[TUP1:%.*]] = insertvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } undef, %T14generic_tuples1CC* %0, 0
// CHECK-NEXT: [[TUP2:%.*]] = insertvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUP1:%.*]], %T14generic_tuples1CC* %0, 1
// CHECK-NEXT: ret { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUP2]]
// CHECK: call ptr @swift_retain(ptr returned %0)
// CHECK-NEXT: call ptr @swift_retain(ptr returned %0)
// CHECK-NEXT: [[TUP1:%.*]] = insertvalue { ptr, ptr } undef, ptr %0, 0
// CHECK-NEXT: [[TUP2:%.*]] = insertvalue { ptr, ptr } [[TUP1:%.*]], ptr %0, 1
// CHECK-NEXT: ret { ptr, ptr } [[TUP2]]
func callDupC(_ c: C) { _ = dupC(c) }
// CHECK-LABEL: define hidden swiftcc void @"$s14generic_tuples8callDupCyyAA1CCF"(%T14generic_tuples1CC* %0)
// CHECK-LABEL: define hidden swiftcc void @"$s14generic_tuples8callDupCyyAA1CCF"(ptr %0)
// CHECK-NEXT: entry:
// CHECK: [[REQUEST:%.*]] = call {{.*}} @"$s14generic_tuples1CCMa"
// CHECK-NEXT: [[METATYPE:%.*]] = extractvalue {{.*}} [[REQUEST]]
// CHECK-NEXT: [[TUPLE:%.*]] = call swiftcc { %T14generic_tuples1CC*, %T14generic_tuples1CC* } @"$s14generic_tuples4dupCyx_xtxAA1CCRbzlF"(%T14generic_tuples1CC* %0, %swift.type* [[METATYPE]])
// CHECK-NEXT: [[LEFT:%.*]] = extractvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUPLE]], 0
// CHECK-NEXT: [[RIGHT:%.*]] = extractvalue { %T14generic_tuples1CC*, %T14generic_tuples1CC* } [[TUPLE]], 1
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[RIGHT]])
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T14generic_tuples1CC*)*)(%T14generic_tuples1CC* [[LEFT]])
// CHECK-NEXT: [[TUPLE:%.*]] = call swiftcc { ptr, ptr } @"$s14generic_tuples4dupCyx_xtxAA1CCRbzlF"(ptr %0, ptr [[METATYPE]])
// CHECK-NEXT: [[LEFT:%.*]] = extractvalue { ptr, ptr } [[TUPLE]], 0
// CHECK-NEXT: [[RIGHT:%.*]] = extractvalue { ptr, ptr } [[TUPLE]], 1
// CHECK-NEXT: call void @swift_release(ptr [[RIGHT]])
// CHECK-NEXT: call void @swift_release(ptr [[LEFT]])
// CHECK-NEXT: ret void
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples4lumpySi_xxtxlF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %swift.type* %T)
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples4lumpySi_xxtxlF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr %T)
func lump<T>(_ x: T) -> (Int, T, T) { return (0,x,x) }
// CHECK: define hidden swiftcc { i64, i64 } @"$s14generic_tuples5lump2ySi_SixtxlF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.type* %T)
// CHECK: define hidden swiftcc { i64, i64 } @"$s14generic_tuples5lump2ySi_SixtxlF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr %T)
func lump2<T>(_ x: T) -> (Int, Int, T) { return (0,0,x) }
// CHECK: define hidden swiftcc void @"$s14generic_tuples5lump3yx_xxtxlF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %swift.opaque* noalias nocapture %3, %swift.type* %T)
// CHECK: define hidden swiftcc void @"$s14generic_tuples5lump3yx_xxtxlF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr noalias nocapture %3, ptr %T)
func lump3<T>(_ x: T) -> (T, T, T) { return (x,x,x) }
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples5lump4yx_SixtxlF"(%swift.opaque* noalias nocapture %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %swift.type* %T)
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples5lump4yx_SixtxlF"(ptr noalias nocapture %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr %T)
func lump4<T>(_ x: T) -> (T, Int, T) { return (x,0,x) }
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples6unlumpyS2i_xxt_tlF"(i64 %0, %swift.opaque* noalias nocapture %1, %swift.opaque* noalias nocapture %2, %swift.type* %T)
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples6unlumpyS2i_xxt_tlF"(i64 %0, ptr noalias nocapture %1, ptr noalias nocapture %2, ptr %T)
func unlump<T>(_ x: (Int, T, T)) -> Int { return x.0 }
// CHECK: define hidden swiftcc void @"$s14generic_tuples7unlump1yxSi_xxt_tlF"(%swift.opaque* noalias nocapture sret({{.*}}) %0, i64 %1, %swift.opaque* noalias nocapture %2, %swift.opaque* noalias nocapture %3, %swift.type* %T)
// CHECK: define hidden swiftcc void @"$s14generic_tuples7unlump1yxSi_xxt_tlF"(ptr noalias nocapture sret({{.*}}) %0, i64 %1, ptr noalias nocapture %2, ptr noalias nocapture %3, ptr %T)
func unlump1<T>(_ x: (Int, T, T)) -> T { return x.1 }
// CHECK: define hidden swiftcc void @"$s14generic_tuples7unlump2yxx_Sixt_tlF"(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.opaque* noalias nocapture %1, i64 %2, %swift.opaque* noalias nocapture %3, %swift.type* %T)
// CHECK: define hidden swiftcc void @"$s14generic_tuples7unlump2yxx_Sixt_tlF"(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, i64 %2, ptr noalias nocapture %3, ptr %T)
func unlump2<T>(_ x: (T, Int, T)) -> T { return x.0 }
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples7unlump3ySix_Sixt_tlF"(%swift.opaque* noalias nocapture %0, i64 %1, %swift.opaque* noalias nocapture %2, %swift.type* %T)
// CHECK: define hidden swiftcc i64 @"$s14generic_tuples7unlump3ySix_Sixt_tlF"(ptr noalias nocapture %0, i64 %1, ptr noalias nocapture %2, ptr %T)
func unlump3<T>(_ x: (T, Int, T)) -> Int { return x.1 }

View File

@@ -1,17 +1,13 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-objc-interop %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// RUN: %target-swift-frontend -enable-objc-interop %s -emit-ir
// RUN: %target-swift-frontend -disable-objc-interop %s -emit-ir
// RUN: %target-swift-frontend -enable-objc-interop %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-objc
// RUN: %target-swift-frontend -disable-objc-interop %s -emit-ir | %FileCheck %s --check-prefixes=CHECK,CHECK-native
// REQUIRES: CPU=x86_64
// CHECK: [[A:%T13generic_types1AC]] = type <{ [[REF:%swift.refcounted]], [[INT:%TSi]] }>
// CHECK: [[INT]] = type <{ i64 }>
// CHECK: [[B:%T13generic_types1BC]] = type <{ [[REF:%swift.refcounted]], [[UNSAFE:%TSp]] }>
// CHECK: [[C:%T13generic_types1CC]] = type
// CHECK: [[D:%T13generic_types1DC]] = type
// CHECK-LABEL: @"$s13generic_types1ACMI" = internal global [16 x i8*] zeroinitializer, align 8
// CHECK-LABEL: @"$s13generic_types1ACMI" = internal global [16 x ptr] zeroinitializer, align 8
// CHECK-LABEL: @"$s13generic_types1ACMn" = hidden constant
// CHECK-SAME: i32 -2147483440,
@@ -51,14 +47,14 @@
// -- instantiation function
// CHECK-SAME: @"$s13generic_types1ACMi"
// -- heap destructor
// CHECK-SAME: void ([[A]]*)* @"$s13generic_types1ACfD"
// CHECK-SAME: ptr @"$s13generic_types1ACfD"
// -- ivar destroyer
// CHECK-SAME: i32 0,
// -- flags
// CHECK-SAME: i32 {{3|2}},
// CHECK-SAME: }
// CHECK-LABEL: @"$s13generic_types1BCMI" = internal global [16 x i8*] zeroinitializer, align 8
// CHECK-LABEL: @"$s13generic_types1BCMI" = internal global [16 x ptr] zeroinitializer, align 8
// CHECK-LABEL: @"$s13generic_types1BCMn" = hidden constant
// CHECK-SAME: @"$s13generic_types1BCMa"
@@ -69,7 +65,7 @@
// -- instantiation function
// CHECK-SAME: @"$s13generic_types1BCMi"
// -- heap destructor
// CHECK-SAME: void ([[B]]*)* @"$s13generic_types1BCfD"
// CHECK-SAME: ptr @"$s13generic_types1BCfD"
// -- ivar destroyer
// CHECK-SAME: i32 0,
// -- class flags
@@ -80,7 +76,7 @@
// -- instantiation function
// CHECK-SAME: @"$s13generic_types1CCMi"
// -- heap destructor
// CHECK-SAME: void ([[C]]*)* @"$s13generic_types1CCfD"
// CHECK-SAME: ptr @"$s13generic_types1CCfD"
// -- ivar destroyer
// CHECK-SAME: i32 0,
// -- class flags
@@ -91,7 +87,7 @@
// -- instantiation function
// CHECK-SAME: @"$s13generic_types1DCMi"
// -- heap destructor
// CHECK-SAME: void ([[D]]*)* @"$s13generic_types1DCfD"
// CHECK-SAME: ptr @"$s13generic_types1DCfD"
// -- ivar destroyer
// CHECK-SAME: i32 0,
// -- class flags
@@ -163,16 +159,14 @@ struct X2: P2 {
struct X3<T, U> where U: P2, U.A: P1 { }
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s13generic_types1ACMi"(%swift.type_descriptor* %0, i8** %1, i8* %2) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2)
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s13generic_types1ACMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
// CHECK: %T = load ptr, ptr %1,
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericClassMetadata(ptr %0, ptr %1, ptr %2)
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK: }
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal %swift.type* @"$s13generic_types1BCMi"(%swift.type_descriptor* %0, i8** %1, i8* %2) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast i8** %1 to %swift.type**
// CHECK: %T = load %swift.type*, %swift.type** [[T0]],
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_descriptor* %0, i8** %1, i8* %2)
// CHECK-NEXT: ret %swift.type* [[METADATA]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} internal ptr @"$s13generic_types1BCMi"(ptr %0, ptr %1, ptr %2) {{.*}} {
// CHECK: %T = load ptr, ptr %1,
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericClassMetadata(ptr %0, ptr %1, ptr %2)
// CHECK-NEXT: ret ptr [[METADATA]]
// CHECK: }

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -Xllvm -sil-disable-pass=simplification -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -emit-ir
// RUN: %target-swift-frontend %s -Xllvm -sil-disable-pass=simplification -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -13,44 +12,39 @@ struct SameSizeStride { var x, y: Builtin.Int32 }
// This type has unequal stride and size.
struct DifferentSizeStride { var x: Builtin.Int32, y: Builtin.Int16 }
// CHECK: define{{( protected)?}} {{.*}}void @same_size_stride(%T8indexing14SameSizeStrideV* noalias nocapture dereferenceable({{.*}}) %0, i64 %1) {{.*}} {
// CHECK: getelementptr inbounds %T8indexing14SameSizeStrideV, %T8indexing14SameSizeStrideV* %0, i64 %1
// CHECK: define{{( protected)?}} {{.*}}void @same_size_stride(ptr noalias nocapture dereferenceable({{.*}}) %0, i64 %1) {{.*}} {
// CHECK: getelementptr inbounds %T8indexing14SameSizeStrideV, ptr %0, i64 %1
sil @same_size_stride : $@convention(thin) (@in SameSizeStride, Builtin.Word) -> () {
entry(%p : $*SameSizeStride, %i: $Builtin.Word):
%q = index_addr %p : $*SameSizeStride, %i : $Builtin.Word
return undef : $()
}
// CHECK: define{{( protected)?}} {{.*}}void @different_size_stride(%T8indexing19DifferentSizeStrideV* noalias nocapture dereferenceable({{.*}}) %0, i64 %1) {{.*}} {
// CHECK: %2 = bitcast %T8indexing19DifferentSizeStrideV* %0 to i8*
// CHECK-NEXT: %3 = mul nsw i64 %1, 8
// CHECK-NEXT: %4 = getelementptr inbounds i8, i8* %2, i64 %3
// CHECK-NEXT: %5 = bitcast i8* %4 to %T8indexing19DifferentSizeStrideV*
// CHECK: define{{( protected)?}} {{.*}}void @different_size_stride(ptr noalias nocapture dereferenceable({{.*}}) %0, i64 %1) {{.*}} {
// CHECK: %2 = mul nsw i64 %1, 8
// CHECK-NEXT: %3 = getelementptr inbounds i8, ptr %0, i64 %2
sil @different_size_stride : $@convention(thin) (@in DifferentSizeStride, Builtin.Word) -> () {
entry(%p : $*DifferentSizeStride, %i: $Builtin.Word):
%q = index_addr %p : $*DifferentSizeStride, %i : $Builtin.Word
return undef : $()
}
// CHECK: define{{( protected)?}} {{.*}}void @zero_size(%swift.opaque* noalias nocapture %0, i64 %1) {{.*}} {
// CHECK: %2 = bitcast %swift.opaque* %0 to i8*
// CHECK-NEXT: %3 = mul nsw i64 %1, 1
// CHECK-NEXT: %4 = getelementptr inbounds i8, i8* %2, i64 %3
// CHECK: define{{( protected)?}} {{.*}}void @zero_size(ptr noalias nocapture %0, i64 %1) {{.*}} {
// CHECK: %2 = mul nsw i64 %1, 1
// CHECK-NEXT: %3 = getelementptr inbounds i8, ptr %0, i64 %2
sil @zero_size : $@convention(thin) (@in (), Builtin.Word) -> () {
entry(%p : $*(), %i: $Builtin.Word):
%q = index_addr %p : $*(), %i : $Builtin.Word
return undef : $()
}
// CHECK: define{{( protected)?}} {{.*}}void @dynamic_size(%swift.opaque* noalias nocapture %0, i64 %1, %swift.type* %T) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast %swift.type* %T to i8***
// CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i8**, i8*** [[T0]], i64 -1
// CHECK-NEXT: [[VWT:%T.valueWitnesses]] = load i8**, i8*** [[T1]], align 8
// CHECK: [[VWT_CAST:%.*]] = bitcast i8** [[VWT]] to %swift.vwtable*
// CHECK: [[STRIDE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, %swift.vwtable* [[VWT_CAST]], i32 0, i32 9
// CHECK: [[STRIDE:%.*]] = load i64, i64* [[STRIDE_ADDR]]
// CHECK: define{{( protected)?}} {{.*}}void @dynamic_size(ptr noalias nocapture %0, i64 %1, ptr %T) {{.*}} {
// CHECK: [[T1:%.*]] = getelementptr inbounds ptr, ptr %T, i64 -1
// CHECK-NEXT: [[VWT:%T.valueWitnesses]] = load ptr, ptr [[T1]], align 8
// CHECK: [[STRIDE_ADDR:%.*]] = getelementptr inbounds %swift.vwtable, ptr [[VWT]], i32 0, i32 9
// CHECK: [[STRIDE:%.*]] = load i64, ptr [[STRIDE_ADDR]]
// CHECK-NEXT: [[T0:%.*]] = mul nsw i64 %1, [[STRIDE]]
// CHECK-NEXT: getelementptr inbounds i8, i8* %2, i64 [[T0]]
// CHECK-NEXT: getelementptr inbounds i8, ptr %0, i64 [[T0]]
sil @dynamic_size : $@convention(thin) <T> (@in T, Builtin.Word) -> () {
entry(%p : $*T, %i: $Builtin.Word):

View File

@@ -1,13 +1,11 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// CHECK: define hidden swiftcc void @"$s15indirect_return11generic_get{{[_0-9a-zA-Z]*}}F"
func generic_get<T>(p: UnsafeMutablePointer<T>) -> T {
// CHECK-NOT: [[T0:%.*]] = call i8* @_TFVs20UnsafeMutablePointerl6memoryQ_(i8* %1, %swift.type* %T)
// CHECK: [[T1:%.*]] = bitcast i8* {{%.*}} to %swift.opaque*
// CHECK: call %swift.opaque* {{%.*}}(%swift.opaque* noalias %0, %swift.opaque* noalias [[T1]], %swift.type* %T)
// CHECK-NOT: [[T0:%.*]] = call ptr @_TFVs20UnsafeMutablePointerl6memoryQ_(ptr %1, ptr %T)
// CHECK: call ptr {{%.*}}(ptr noalias %0, ptr noalias {{%.*}}, ptr %T)
return p.pointee
}
@@ -16,12 +14,12 @@ protocol Number {}
extension Int: Number {}
// Make sure that the absence of the sret attribute matches.
// CHECK: define hidden swiftcc void @"$s15indirect_return3fooSS_S2SAA6Number_pAaC_ptyF"(<{ %TSS, %TSS, %TSS }>* noalias nocapture
// CHECK: define hidden swiftcc void @"$s15indirect_return3fooSS_S2SAA6Number_pAaC_ptyF"(ptr noalias nocapture
func foo() -> (String, String, String, Number, Number) {
return ("1", "2", "3", 42, 7)
}
// CHECK-LABEL: define{{.*}}testCall
func testCall() {
// CHECK: call swiftcc void @"$s15indirect_return3fooSS_S2SAA6Number_pAaC_ptyF"(<{ %TSS, %TSS, %TSS }>* noalias nocapture %{{.*}}
// CHECK: call swiftcc void @"$s15indirect_return3fooSS_S2SAA6Number_pAaC_ptyF"(ptr noalias nocapture %{{.*}}
print(foo())
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -7,5 +6,5 @@ protocol Fooable {
associatedtype Foo
}
// CHECK: define hidden swiftcc void @"$s18infinite_archetype3foo{{[_0-9a-zA-Z]*}}F"(%swift.opaque* noalias nocapture sret({{.*}}) %0, %swift.opaque* noalias nocapture %1, %swift.type* %T, i8** %T.Fooable)
// CHECK: define hidden swiftcc void @"$s18infinite_archetype3foo{{[_0-9a-zA-Z]*}}F"(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture %1, ptr %T, ptr %T.Fooable)
func foo<T: Fooable>(x: T) -> T where T == T.Foo { return x }

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s
// RUN: %target-swift-frontend -enable-objc-interop -emit-ir %s | %FileCheck %s -check-prefix CHECK -check-prefix CHECK-%target-import-type
// REQUIRES: CPU=x86_64
@@ -8,14 +7,14 @@
// CHECK: [[TYPE:%swift.type]] = type
// CHECK-LABEL: @"$s14ivar_destroyer17NonTrivialDerivedCMf" = internal global <{ {{.*}} }> <{
// CHECK-SAME: i8* null,
// CHECK-SAME: i8** {{@"\$sBoWV"|null}},
// CHECK-SAME: i64 ptrtoint ([[OBJCCLASS]]* @"$s14ivar_destroyer17NonTrivialDerivedCMm" to i64),
// CHECK-DIRECT-SAME: [[TYPE]]* bitcast (i64* getelementptr inbounds (<{ {{.*}} }>, <{ {{.*}} }>* @"$s14ivar_destroyer11TrivialBaseCMf", i32 0, i32 3) to [[TYPE]]*),
// CHECK-INDIRECT-SAME: [[TYPE]]* null,
// CHECK-SAME: [[OPAQUE]]* @_objc_empty_cache,
// CHECK-SAME: [[OPAQUE]]* null,
// CHECK-SAME: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC14ivar_destroyer17NonTrivialDerived to i64), i64 {{1|2}}),
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr {{@"\$sBoWV"|null}},
// CHECK-SAME: i64 ptrtoint (ptr @"$s14ivar_destroyer17NonTrivialDerivedCMm" to i64),
// CHECK-DIRECT-SAME: ptr getelementptr inbounds (<{ {{.*}} }>, ptr @"$s14ivar_destroyer11TrivialBaseCMf", i32 0, i32 3),
// CHECK-INDIRECT-SAME: ptr null,
// CHECK-SAME: ptr @_objc_empty_cache,
// CHECK-SAME: ptr null,
// CHECK-SAME: i64 add (i64 ptrtoint (ptr @_DATA__TtC14ivar_destroyer17NonTrivialDerived to i64), i64 {{1|2}}),
// CHECK-SAME: i32 {{3|2}},
// CHECK-SAME: i32 0,
// CHECK-SAME: i32 24,
@@ -23,9 +22,9 @@
// CHECK-SAME: i16 0,
// CHECK-SAME: i32 120,
// CHECK-SAME: i32 24,
// CHECK-SAME: <{ {{.*}} }>* @"$s14ivar_destroyer17NonTrivialDerivedCMn"
// CHECK-SAME: void (%T14ivar_destroyer17NonTrivialDerivedC*)* @"$s14ivar_destroyer17NonTrivialDerivedCfE",
// CHECK-SAME: %T14ivar_destroyer17NonTrivialDerivedC* ([[TYPE]]*)* @alloc_NonTrivialDerived
// CHECK-SAME: ptr @"$s14ivar_destroyer17NonTrivialDerivedCMn"
// CHECK-SAME: ptr @"$s14ivar_destroyer17NonTrivialDerivedCfE",
// CHECK-SAME: ptr @alloc_NonTrivialDerived
// CHECK-DIRECT-SAME: i64 16
// CHECK-INDIRECT-SAME: i64 0
// CHECK-SAME: }>

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-as-library -emit-ir -primary-file %s | %FileCheck %s
// RUN: %target-swift-frontend -parse-as-library -emit-ir -primary-file %s
// RUN: %target-swift-frontend -parse-as-library -emit-ir -primary-file %s | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -8,36 +7,35 @@
// CHECK: @"$s12lazy_globals1ySivp" = hidden global %TSi zeroinitializer, align 8
// CHECK: @"$s12lazy_globals1zSivp" = hidden global %TSi zeroinitializer, align 8
// CHECK: define internal void @"[[T]]WZ"(i8* %0) {{.*}} {
// CHECK: define internal void @"[[T]]WZ"(ptr %0) {{.*}} {
// CHECK: entry:
// CHECK: store i64 1, i64* getelementptr inbounds (%TSi, %TSi* @"$s12lazy_globals1xSivp", i32 0, i32 0), align 8
// CHECK: store i64 2, i64* getelementptr inbounds (%TSi, %TSi* @"$s12lazy_globals1ySivp", i32 0, i32 0), align 8
// CHECK: store i64 3, i64* getelementptr inbounds (%TSi, %TSi* @"$s12lazy_globals1zSivp", i32 0, i32 0), align 8
// CHECK: store i64 1, ptr @"$s12lazy_globals1xSivp", align 8
// CHECK: store i64 2, ptr @"$s12lazy_globals1ySivp", align 8
// CHECK: store i64 3, ptr @"$s12lazy_globals1zSivp", align 8
// CHECK: ret void
// CHECK: }
// CHECK: define hidden swiftcc i8* @"$s12lazy_globals1xSivau"() {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s12lazy_globals1xSivau"() {{.*}} {
// CHECK: entry:
// CHECK: call void @swift_once(i64* @"[[T]]Wz", i8* bitcast (void (i8*)* @"[[T]]WZ" to i8*), i8* undef)
// CHECK: call void @swift_once(ptr @"[[T]]Wz", ptr @"[[T]]WZ", ptr undef)
// CHECK: }
// CHECK: define hidden swiftcc i8* @"$s12lazy_globals1ySivau"() {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s12lazy_globals1ySivau"() {{.*}} {
// CHECK: entry:
// CHECK: call void @swift_once(i64* @"[[T]]Wz", i8* bitcast (void (i8*)* @"[[T]]WZ" to i8*), i8* undef)
// CHECK: call void @swift_once(ptr @"[[T]]Wz", ptr @"[[T]]WZ", ptr undef)
// CHECK: }
// CHECK: define hidden swiftcc i8* @"$s12lazy_globals1zSivau"() {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s12lazy_globals1zSivau"() {{.*}} {
// CHECK: entry:
// CHECK: call void @swift_once(i64* @"[[T]]Wz", i8* bitcast (void (i8*)* @"[[T]]WZ" to i8*), i8* undef)
// CHECK: call void @swift_once(ptr @"[[T]]Wz", ptr @"[[T]]WZ", ptr undef)
// CHECK: }
var (x, y, z) = (1, 2, 3)
// CHECK: define hidden swiftcc i64 @"$s12lazy_globals4getXSiyF"() {{.*}} {
// CHECK: entry:
// CHECK: %0 = call swiftcc i8* @"$s12lazy_globals1xSivau"()
// CHECK: %1 = bitcast i8* %0 to %TSi*
// CHECK: %._value = getelementptr inbounds %TSi, %TSi* %1, i32 0, i32 0
// CHECK: [[V:%.*]] = load i64, i64* %._value, align 8
// CHECK: %0 = call swiftcc ptr @"$s12lazy_globals1xSivau"()
// CHECK: %._value = getelementptr inbounds %TSi, ptr %0, i32 0, i32 0
// CHECK: [[V:%.*]] = load i64, ptr %._value, align 8
// CHECK: ret i64 [[V]]
// CHECK: }
func getX() -> Int { return x }

View File

@@ -1,4 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s %S/Inputs/lazy_multi_file_helper.swift -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s %S/Inputs/lazy_multi_file_helper.swift -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -primary-file %s %S/Inputs/lazy_multi_file_helper.swift -emit-ir
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -14,9 +14,9 @@ class Subclass : LazyContainerClass {
// an indirect return value. When it shrinks back, remove the optional
// indirect out.
//
// CHECK-LABEL: @"$s15lazy_multi_file8SubclassC6getStrSSyF"({{(\%TSS\* noalias nocapture sret, )?}}%T15lazy_multi_file8SubclassC* swiftself %0) {{.*}} {
// CHECK-LABEL: @"$s15lazy_multi_file8SubclassC6getStrSSyF"({{(ptr noalias nocapture sret, )?}}ptr swiftself %0) {{.*}} {
func getStr() -> String {
// CHECK: = getelementptr inbounds %T15lazy_multi_file8SubclassC, %T15lazy_multi_file8SubclassC* %0, i32 0, i32 3
// CHECK: = getelementptr inbounds %T15lazy_multi_file8SubclassC, ptr %0, i32 0, i32 3
return str
}
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -emit-ir %s
// RUN: %target-swift-frontend -emit-ir %s | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -15,14 +14,14 @@ bb0:
%0 = string_literal utf8 "help\tme"
return %0 : $Builtin.RawPointer
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @utf8_literal() {{.*}} {
// CHECK: ret i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[U8_0]], i64 0, i64 0)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @utf8_literal() {{.*}} {
// CHECK: ret ptr [[U8_0]]
sil @utf8_literal_with_nul : $@convention(thin) () -> Builtin.RawPointer {
bb0:
%0 = string_literal utf8 "\u{00}x\u{01ab}"
return %0 : $Builtin.RawPointer
}
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @utf8_literal_with_nul() {{.*}} {
// CHECK: ret i8* getelementptr inbounds ([5 x i8], [5 x i8]* [[U8_1]], i64 0, i64 0)
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @utf8_literal_with_nul() {{.*}} {
// CHECK: ret ptr [[U8_1]]

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -Xllvm -sil-disable-pass=simplification -sdk %S/Inputs -I %t -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -sdk %S/Inputs -I %t -emit-ir %s
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -sdk %S/Inputs -I %t -emit-ir %s | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -20,56 +19,55 @@ sil @_TFC8metatype1Xd : $@convention(method) (@owned X) -> @owned Builtin.Native
sil @_TFC8metatype1XD : $@convention(method) (@owned X) -> ()
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_(%swift.type* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_(ptr %0)
sil @_TF8metatype22thick_to_objc_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@thick X.Type) -> @objc_metatype X.Type {
bb0(%0 : $@thick X.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = bitcast %swift.type* %0 to %objc_class*
%1 = thick_to_objc_metatype %0 : $@thick X.Type to $@objc_metatype X.Type
// CHECK-NEXT: ret %objc_class* [[RESULT]]
// CHECK: ret ptr %0
return %1 : $@objc_metatype X.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @foreign_thick_to_objc(%swift.type* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @foreign_thick_to_objc(ptr %0)
sil @foreign_thick_to_objc : $@convention(thin) (@thick Gizmo.Type) -> @objc_metatype Gizmo.Type {
bb0(%0 : $@thick Gizmo.Type):
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata
// CHECK: call ptr @swift_getObjCClassFromMetadata
%1 = thick_to_objc_metatype %0 : $@thick Gizmo.Type to $@objc_metatype Gizmo.Type
// CHECK: ret %objc_class*
// CHECK: ret ptr
return %1 : $@objc_metatype Gizmo.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_(%objc_class* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_(ptr %0)
sil @_TF8metatype22objc_to_thick_metatypeFT2xmMCS_1X_T_ : $@convention(thin) (@objc_metatype X.Type) -> @thick X.Type {
bb0(%0 : $@objc_metatype X.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0)
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call ptr @swift_getObjCClassMetadata(ptr %0)
%1 = objc_to_thick_metatype %0 : $@objc_metatype X.Type to $@thick X.Type
// CHECK-NEXT: ret %swift.type* [[RESULT]]
// CHECK-NEXT: ret ptr [[RESULT]]
return %1 : $@thick X.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @foreign_objc_to_thick(%objc_class* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @foreign_objc_to_thick(ptr %0)
sil @foreign_objc_to_thick : $@convention(thin) (@objc_metatype Gizmo.Type) -> @thick Gizmo.Type {
bb0(%0 : $@objc_metatype Gizmo.Type):
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %0)
// CHECK: [[RESULT:%[0-9a-zA-Z_-]+]] = call ptr @swift_getObjCClassMetadata(ptr %0)
%1 = objc_to_thick_metatype %0 : $@objc_metatype Gizmo.Type to $@thick Gizmo.Type
// CHECK-NEXT: ret %swift.type* [[RESULT]]
// CHECK-NEXT: ret ptr [[RESULT]]
return %1 : $@thick Gizmo.Type
}
protocol CP: class {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @archetype_objc_metatype(%swift.type* %T, i8** %T.CP)
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @archetype_objc_metatype(ptr %T, ptr %T.CP)
// CHECK: call ptr @swift_getObjCClassFromMetadata
sil @archetype_objc_metatype : $@convention(thin) <T: CP> () -> @objc_metatype T.Type {
entry:
%m = metatype $@objc_metatype T.Type
return %m : $@objc_metatype T.Type
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_class* @existential_objc_metatype(%objc_object* %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @existential_objc_metatype(ptr %0) {{.*}} {
// CHECK: entry:
// CHECK-NEXT: [[METATYPE:%.*]] = call %objc_class* @swift_getObjCClassFromObject(%objc_object* %0) {{#[0-9]+}}
// CHECK-NEXT: ret %objc_class* [[METATYPE]]
// CHECK-NEXT: [[METATYPE:%.*]] = call ptr @swift_getObjCClassFromObject(ptr %0) {{#[0-9]+}}
// CHECK-NEXT: ret ptr [[METATYPE]]
// CHECK-NEXT: }
sil @existential_objc_metatype : $@convention(thin) (AnyObject) -> (@objc_metatype AnyObject.Type) {
bb0(%0 : $AnyObject):
@@ -82,8 +80,8 @@ public protocol ClassProto : AnyObject {
var other: ClassProto? { get }
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @drop_witness_table(%swift.type* %0, i8** %1)
// CHECK: call %objc_class* @swift_getObjCClassFromMetadata(%swift.type* %0)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @drop_witness_table(ptr %0, ptr %1)
// CHECK: call ptr @swift_getObjCClassFromMetadata(ptr %0)
// CHECK: ret void
sil @drop_witness_table : $@convention(thin) (@thick ClassProto.Type) -> () {
bb0(%0 : $@thick ClassProto.Type):

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -enable-objc-interop -emit-ir | %FileCheck %s -DINT=i%target-ptrsize -check-prefix CHECK -check-prefix CHECK-%target-import-type
// RUN: %target-swift-frontend %s -enable-objc-interop -emit-ir
// RUN: %target-swift-frontend %s -enable-objc-interop -emit-ir | %FileCheck %s -DINT=i%target-ptrsize -check-prefix CHECK -check-prefix CHECK-%target-import-type
// REQUIRES: CPU=i386 || CPU=x86_64
@@ -8,8 +7,8 @@
import Swift
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @archetype_metatype_cast
// CHECK: %0 = call %swift.type* @swift_dynamicCastMetatype(%swift.type* %T, %swift.type* %U)
// CHECK: %1 = icmp ne %swift.type* %0, null
// CHECK: %0 = call ptr @swift_dynamicCastMetatype(ptr %T, ptr %U)
// CHECK: %1 = icmp ne ptr %0, null
sil @archetype_metatype_cast : $@convention(thin) <T, U> () -> () {
entry:
%0 = metatype $@thick T.Type
@@ -26,9 +25,9 @@ end:
protocol P {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @existential_archetype_metatype_cast(%swift.type* %0, i8** %1, %swift.type* %T)
// CHECK: [[T0:%.*]] = call %swift.type* @swift_dynamicCastMetatype(%swift.type* %0, %swift.type* %T)
// CHECK: [[T1:%.*]] = icmp ne %swift.type* [[T0]], null
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @existential_archetype_metatype_cast(ptr %0, ptr %1, ptr %T)
// CHECK: [[T0:%.*]] = call ptr @swift_dynamicCastMetatype(ptr %0, ptr %T)
// CHECK: [[T1:%.*]] = icmp ne ptr [[T0]], null
sil @existential_archetype_metatype_cast : $@convention(thin) <T> (@thick P.Type) -> () {
entry(%0 : $@thick P.Type):
checked_cast_br %0 : $@thick P.Type to @thick T.Type, yes, no
@@ -45,9 +44,8 @@ end:
class SomeClass {}
sil_vtable SomeClass {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @metatype_object_conversion(%objc_class* %0) {{.*}} {
// CHECK: %1 = bitcast %objc_class* %0 to %objc_object*
// CHECK: ret %objc_object* %1
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @metatype_object_conversion(ptr %0) {{.*}} {
// CHECK: ret ptr %0
// CHECK: }
sil @metatype_object_conversion : $@convention(thin) (@objc_metatype SomeClass.Type) -> @owned AnyObject {
entry(%m : $@objc_metatype SomeClass.Type):
@@ -57,9 +55,8 @@ entry(%m : $@objc_metatype SomeClass.Type):
protocol SomeClassProtocol : class {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_object* @existential_metatype_object_conversion(%objc_class* %0, i8** %1) {{.*}} {
// CHECK: [[T0:%.*]] = bitcast %objc_class* %0 to %objc_object*
// CHECK: ret %objc_object* [[T0]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @existential_metatype_object_conversion(ptr %0, ptr %1) {{.*}} {
// CHECK: ret ptr %0
// CHECK: }
sil @existential_metatype_object_conversion : $@convention(thin) (@objc_metatype SomeClassProtocol.Type) -> @owned AnyObject {
entry(%m : $@objc_metatype SomeClassProtocol.Type):
@@ -70,11 +67,10 @@ entry(%m : $@objc_metatype SomeClassProtocol.Type):
class OtherClass : SomeClass {}
sil_vtable OtherClass {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @value_metatype_cast(%T14metatype_casts9SomeClassC* %0)
// CHECK: [[T0:%.*]] = bitcast %T14metatype_casts9SomeClassC* %0 to %swift.type**
// CHECK: [[T1:%.*]] = load %swift.type*, %swift.type** [[T0]]
// CHECK-DIRECT: [[T2:%.*]] = icmp eq %swift.type* [[T1]], {{.*}} @"$s14metatype_casts10OtherClassCMf"
// CHECK-INDIRECT:[[T2:%.*]] = icmp eq %objc_class*
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @value_metatype_cast(ptr %0)
// CHECK: [[T1:%.*]] = load ptr, ptr %0
// CHECK-DIRECT: [[T2:%.*]] = icmp eq ptr [[T1]], {{.*}} @"$s14metatype_casts10OtherClassCMf"
// CHECK-INDIRECT:[[T2:%.*]] = icmp eq ptr
sil @value_metatype_cast : $@convention(thin) (SomeClass) -> () {
entry(%0 : $SomeClass):
%1 = value_metatype $@thick SomeClass.Type, %0 : $SomeClass
@@ -90,12 +86,10 @@ end:
return undef : $()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_cast_to_anyobject_type
// CHECK: [[T0:%.*]] = bitcast %swift.type* %0 to i8*
// CHECK: [[CAST:%.*]] = call { i8* } @dynamic_cast_existential_0_class_unconditional(i8* [[T0]], %swift.type* %0)
// CHECK: [[RESULT0:%.*]] = extractvalue { i8* } [[CAST]], 0
// CHECK: [[RESULT:%.*]] = bitcast i8* [[RESULT0]] to %swift.type*
// CHECK: ret %swift.type* [[RESULT]]
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_cast_to_anyobject_type
// CHECK: [[CAST:%.*]] = call { ptr } @dynamic_cast_existential_0_class_unconditional(ptr %0, ptr %0)
// CHECK: [[RESULT0:%.*]] = extractvalue { ptr } [[CAST]], 0
// CHECK: ret ptr [[RESULT0]]
sil @checked_cast_to_anyobject_type : $@convention(thin) (@thick Any.Type) -> @thick AnyObject.Type {
entry(%0 : $@thick Any.Type):
%2 = unconditional_checked_cast %0 : $@thick Any.Type to @thick AnyObject.Type
@@ -105,10 +99,10 @@ entry(%0 : $@thick Any.Type):
// Trivial case -- we know the source is a class metatype, so there's nothing
// to check.
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.type* @checked_cast_class_to_anyobject_type
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @checked_cast_class_to_anyobject_type
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s14metatype_casts9SomeClassCMa"([[INT]] 0)
// CHECK: [[METATYPE:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: ret %swift.type* [[METATYPE]]
// CHECK: ret ptr [[METATYPE]]
sil @checked_cast_class_to_anyobject_type : $@convention(thin) () -> @thick AnyObject.Type {
entry:
%1 = metatype $@thick SomeClass.Type

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -enable-objc-interop -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -enable-objc-interop -primary-file %s -emit-ir
// RUN: %target-swift-frontend -enable-objc-interop -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -25,9 +24,9 @@ enum Node {
case sequence(Sequence)
}
// CHECK: define internal i32 @"$s22multi_payload_shifting4NodeOwet"(%swift.opaque* noalias %value, i32 %numEmptyCases, %swift.type* %Node)
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64, i8 }, { i64, i64, i64, i8 }* {{.*}}, i32 0, i32 3
// CHECK: [[BYTE:%.*]] = load i8, i8* [[ADDR]]
// CHECK: define internal i32 @"$s22multi_payload_shifting4NodeOwet"(ptr noalias %value, i32 %numEmptyCases, ptr %Node)
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64, i8 }, ptr {{.*}}, i32 0, i32 3
// CHECK: [[BYTE:%.*]] = load i8, ptr [[ADDR]]
// Make sure we zext before we shift.
// CHECK: [[ZEXT:%.*]] = zext i8 [[BYTE]] to i32
// CHECK: shl i32 [[ZEXT]], 10

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir > %t.txt
// RUN: %target-swift-frontend %s -emit-ir
// RUN: %target-swift-frontend %s -emit-ir > %t.txt
// RUN: %FileCheck %s --check-prefix=CHECK < %t.txt
// RUN: %FileCheck %s --check-prefix=CHECK-CONSTANTS < %t.txt
@@ -17,13 +16,13 @@ public func makeAMetadata() {
}
// Type constructor for OuterGenericStruct<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructVMa"(i64 %0, %swift.type* %1)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructVMa"(i64 %0, ptr %1)
// Type constructor for OuterGenericStruct<T>.InnerGenericStruct<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VMa"(i64 %0, %swift.type* %1, %swift.type* %2)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV05InnerdE0VMa"(i64 %0, ptr %1, ptr %2)
// Type constructor for OuterGenericStruct<T>.InnerConcreteStruct
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VMa"(i64 %0, %swift.type* %1)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics18OuterGenericStructV013InnerConcreteE0VMa"(i64 %0, ptr %1)
public struct OuterGenericStruct<T> {
public struct InnerGenericStruct<U> {
@@ -41,13 +40,13 @@ public struct OuterGenericStruct<T> {
}
// Type constructor for OuterGenericClass<T>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassCMa"(i64 %0, %swift.type* %1)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassCMa"(i64 %0, ptr %1)
// Type constructor for OuterGenericClass<T>.InnerGenericClass<U>
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CMa"(i64 %0, %swift.type* %1, %swift.type* %2)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC05InnerdE0CMa"(i64 %0, ptr %1, ptr %2)
// Type constructor for OuterGenericClass<T>.InnerConcreteClass
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CMa"(i64 %0, %swift.type* %1)
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %swift.metadata_response @"$s15nested_generics17OuterGenericClassC013InnerConcreteE0CMa"(i64 %0, ptr %1)
public class OuterGenericClass<T> {
public class InnerGenericClass<U> {

View File

@@ -1,7 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend %use_no_opaque_pointers -O -primary-file %s -emit-ir | %FileCheck %s --check-prefix=OPT
// RUN: %target-swift-frontend -primary-file %s -emit-ir
// RUN: %target-swift-frontend -O -primary-file %s -emit-ir
// RUN: %target-swift-frontend -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -O -primary-file %s -emit-ir | %FileCheck %s --check-prefix=OPT
// REQUIRES: CPU=x86_64
@@ -57,21 +55,17 @@ func create<T>(_ t: T) -> C<T> {
// We use opaque storage types because LLVM performs type based analysis based
// on the sret storage type which goes wrong with non fixed types.
// CHECK-LABEL: define hidden swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(%swift.opaque* noalias nocapture sret(%swift.opaque) %0
// CHECK-LABEL: define hidden swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(ptr noalias nocapture sret(%swift.opaque) %0
// CHECK-LABEL: define hidden swiftcc void @"$s16non_fixed_return6createyAA1CVyxGxlF"(%swift.opaque* noalias nocapture sret(%swift.opaque) %0, %swift.opaque* noalias nocapture %1, %swift.type* %T)
// CHECK: [[CAST_PARAM:%.*]] = bitcast %swift.opaque* %0 to %T16non_fixed_return1CV*
// CHECK: [[CAST_ARG:%.*]] = bitcast %T16non_fixed_return1CV* [[CAST_PARAM]] to %swift.opaque*
// CHECK: call swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(%swift.opaque* noalias nocapture sret(%swift.opaque) [[CAST_ARG]]
// CHECK-LABEL: define hidden swiftcc void @"$s16non_fixed_return6createyAA1CVyxGxlF"(ptr noalias nocapture sret(%swift.opaque) %0, ptr noalias nocapture %1, ptr %T)
// CHECK: call swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(ptr noalias nocapture sret(%swift.opaque) %0
// CHECK: ret void
// Make sure we don't loose the stores for the optional UInt32? in optimize mode.
// OPT-LABEL: define hidden swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(%swift.opaque* noalias nocapture sret(%swift.opaque) %0
// OPT: [[ADDR:%.*]] = bitcast i8* [[BASE:%.*]] to i32*
// OPT: store i32 0, i32* [[ADDR]]
// OPT: [[ADDR2:%.*]] = getelementptr inbounds i8, i8* [[BASE:%.*]], i64 4
// OPT: [[ADDR3:%.*]] = bitcast i8* [[ADDR2]] to i1*
// OPT: store i1 true, i1* [[ADDR3]]
// OPT: [[ADDR4:%.*]] = getelementptr inbounds i8, i8* [[BASE]], i64 8
// OPT: call void @llvm.memset.p0i8.i64(i8* {{.*}}[[ADDR4]], i8 0, i64 16, i1 false)
// OPT-LABEL: define hidden swiftcc void @"$s16non_fixed_return1CVACyxGycfC"(ptr noalias nocapture sret(%swift.opaque) %0
// OPT: store i32 0, ptr [[BASE:%[0-9]+]]
// OPT: [[ADDR2:%.*]] = getelementptr inbounds %Ts6UInt32VSg, ptr [[BASE]], i64 0, i32 1
// OPT: store i1 true, ptr [[ADDR2]]
// OPT: [[ADDR4:%.*]] = getelementptr inbounds %T16non_fixed_return1BV, ptr [[BASE]], i64 0, i32 2
// OPT: call void @llvm.memset.p0.i64(ptr {{.*}}[[ADDR4]], i8 0, i64 16, i1 false)
// OPT: ret void

View File

@@ -1,8 +1,7 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -module-name objc -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -module-name objc -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -module-name objc -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -11,17 +10,12 @@ import Foundation
import gizmo
// CHECK: [[TYPE:%swift.type]] = type
// CHECK: [[BLAMMO:%T4objc6BlammoC]] = type
// CHECK: [[MYBLAMMO:%T4objc8MyBlammoC]] = type
// CHECK: [[TEST2:%T4objc5Test2C]] = type
// CHECK: [[OBJC:%objc_object]] = type
// CHECK: [[ID:%T4objc2idV]] = type <{ %AnyObject }>
// CHECK: [[GIZMO:%TSo5GizmoC]] = type
// CHECK: [[RECT:%TSo4RectV]] = type
// CHECK: [[FLOAT:%TSf]] = type
// CHECK: @"\01L_selector_data(bar)" = private global [4 x i8] c"bar\00", section "__TEXT,__objc_methname,cstring_literals", align 1
// CHECK: @"\01L_selector(bar)" = private externally_initialized global i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"\01L_selector_data(bar)", i64 0, i64 0), section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
// CHECK: @"\01L_selector(bar)" = private externally_initialized global ptr @"\01L_selector_data(bar)", section "__DATA,__objc_selrefs,literal_pointers,no_dead_strip", align 8
// CHECK: @"\01L_selector_data(acquiesce)"
// CHECK-NOT: @"\01L_selector_data(disharmonize)"
@@ -40,14 +34,14 @@ struct id {
// Class and methods are [objc] by inheritance.
class MyBlammo : Blammo {
func foo() {}
// CHECK: define hidden swiftcc void @"$s4objc8MyBlammoC3fooyyF"([[MYBLAMMO]]* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s4objc8MyBlammoC3fooyyF"(ptr swiftself %0) {{.*}} {
// CHECK: ret void
}
// Class and methods are [objc] by inheritance.
class Test2 : Gizmo {
func foo() {}
// CHECK: define hidden swiftcc void @"$s4objc5Test2C3fooyyF"([[TEST2]]* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s4objc5Test2C3fooyyF"(ptr swiftself %0) {{.*}} {
// CHECK: ret void
@objc dynamic func bar() {}
@@ -71,12 +65,12 @@ class Octogenarian : Contrarian {
@_silgen_name("unknown")
func unknown(_ x: id) -> id
// CHECK: define hidden swiftcc %objc_object* @"$s4objc5test0{{[_0-9a-zA-Z]*}}F"(%objc_object* %0)
// CHECK: define hidden swiftcc ptr @"$s4objc5test0{{[_0-9a-zA-Z]*}}F"(ptr %0)
// CHECK-NOT: call {{.*}} @swift_unknownObjectRetain
// CHECK: call {{.*}} @swift_unknownObjectRetain
// CHECK-NOT: call {{.*}} @swift_unknownObjectRelease
// CHECK: call {{.*}} @swift_unknownObjectRelease
// CHECK: ret %objc_object*
// CHECK: ret ptr
func test0(_ arg: id) -> id {
var x : id
x = arg
@@ -86,10 +80,9 @@ func test0(_ arg: id) -> id {
}
func test1(_ cell: Blammo) {}
// CHECK: define hidden swiftcc void @"$s4objc5test1{{[_0-9a-zA-Z]*}}F"([[BLAMMO]]* %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s4objc5test1{{[_0-9a-zA-Z]*}}F"(ptr %0) {{.*}} {
// CHECK-NEXT: entry
// CHECK-NEXT: alloca
// CHECK-NEXT: bitcast
// CHECK-NEXT: memset
// CHECK-NEXT: store
// CHECK-NEXT: ret void

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=i386 || CPU=x86_64
// REQUIRES: objc_interop
@@ -13,15 +12,13 @@ import Swift
import gizmo
// CHECK-LABEL: define {{.*}} @test
// CHECK: [[ALLOC1:%.*]] = call %objc_object* @objc_allocWithZone
// CHECK: [[CAST1:%.*]] = bitcast %objc_object* [[ALLOC1]] to [[KLASS:%.*]]*
// CHECK: [[ALLOC1:%.*]] = call ptr @objc_allocWithZone
// CHECK: br
// CHECK: [[ALLOC2:%.*]] = call %objc_object* @objc_allocWithZone
// CHECK: [[CAST2:%.*]] = bitcast %objc_object* [[ALLOC2]] to [[KLASS]]*
// CHECK: [[ALLOC2:%.*]] = call ptr @objc_allocWithZone
// CHECK: br
// CHECK: phi [[KLASS]]* [ [[CAST2]], %{{.*}} ], [ [[CAST1]], %{{.*}} ]
// CHECK: phi ptr [ [[ALLOC2]], %{{.*}} ], [ [[ALLOC1]], %{{.*}} ]
// CHECK: ret
sil @test : $@convention(thin) (@owned Optional<Int>) -> () {
@@ -44,15 +41,13 @@ bb3(%3 : $Gizmo):
}
// CHECK-LABEL: define {{.*}} @class_test
// CHECK: [[ALLOC1:%.*]] = call %objc_object* @objc_allocWithZone
// CHECK: [[CAST1:%.*]] = bitcast %objc_object* [[ALLOC1]] to [[KLASS:%.*]]*
// CHECK: [[ALLOC1:%.*]] = call ptr @objc_allocWithZone
// CHECK: br
// CHECK: [[ALLOC2:%.*]] = call %objc_object* @objc_allocWithZone
// CHECK: [[CAST2:%.*]] = bitcast %objc_object* [[ALLOC2]] to [[KLASS]]*
// CHECK: [[ALLOC2:%.*]] = call ptr @objc_allocWithZone
// CHECK: br
// CHECK: phi [[KLASS]]* [ [[CAST2]], %{{.*}} ], [ [[CAST1]], %{{.*}} ]
// CHECK: phi ptr [ [[ALLOC2]], %{{.*}} ], [ [[ALLOC1]], %{{.*}} ]
// CHECK: ret

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -Xllvm -sil-disable-pass=simplification -gnone -enable-objc-interop -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -gnone -enable-objc-interop -sdk %S/Inputs -I %t %s -emit-ir
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -gnone -enable-objc-interop -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -14,36 +13,36 @@ import gizmo
// CHECK: [[BLOCK_ISA:@_NSConcreteStackBlock]] = external global {{(dllimport )?}}%objc_class
// CHECK: [[VOID_BLOCK_SIGNATURE:@.*]] = private unnamed_addr constant {{.*}} c"v8@?0\00"
// CHECK: [[TRIVIAL_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } {
// CHECK: i64 0,
// CHECK: i64 40,
// CHECK: i8* {{.*}} [[VOID_BLOCK_SIGNATURE]]
// CHECK: }
// CHECK: [[TRIVIAL_BLOCK_DESCRIPTOR:@.*]] = internal constant { i64, i64, ptr } {
// CHECK-SAME: i64 0,
// CHECK-SAME: i64 40,
// CHECK-SAME: ptr [[VOID_BLOCK_SIGNATURE]]
// CHECK-SAME: }
// CHECK: [[BLOCK_PARAM_BLOCK_SIGNATURE:@.*]] = private unnamed_addr constant {{.*}} c"v16@?0@?<q@?q>8\00"
// CHECK: [[BLOCK_PARAM_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } {
// CHECK: i64 0,
// CHECK: i64 40,
// CHECK: i8* {{.*}} [[BLOCK_PARAM_BLOCK_SIGNATURE]]
// CHECK: ptr [[BLOCK_PARAM_BLOCK_SIGNATURE]]
// CHECK: }
// CHECK: [[NONTRIVIAL_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } {
// CHECK: i64 0,
// CHECK: i64 40,
// CHECK: void ({ %objc_block, %swift.refcounted* }*, { %objc_block, %swift.refcounted* }*)* [[NONTRIVIAL_BLOCK_COPY:@[A-Za-z0-9_]+]],
// CHECK: void ({ %objc_block, %swift.refcounted* }*)* [[NONTRIVIAL_BLOCK_DISPOSE:@[A-Za-z0-9_]+]],
// CHECK: i8* {{.*}} [[VOID_BLOCK_SIGNATURE]]
// CHECK: ptr [[NONTRIVIAL_BLOCK_COPY:@[A-Za-z0-9_]+]],
// CHECK: ptr [[NONTRIVIAL_BLOCK_DISPOSE:@[A-Za-z0-9_]+]],
// CHECK: ptr [[VOID_BLOCK_SIGNATURE]]
// CHECK: }
// CHECK: [[NSRECT_BLOCK_SIGNATURE:@.*]] = private unnamed_addr constant {{.*}} c"{NSRect={NSPoint=dd}{NSSize=dd}}8@?0\00"
// CHECK: [[STRET_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } {
// CHECK: i64 0,
// CHECK: i64 40,
// CHECK: i8* {{.*}} [[NSRECT_BLOCK_SIGNATURE]]
// CHECK: ptr [[NSRECT_BLOCK_SIGNATURE]]
// CHECK: }
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i8* @project_block_storage({ %objc_block, i8* }* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @project_block_storage(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, i8* }, { %objc_block, i8* }* %0, i32 0, i32 1
// CHECK-NEXT: %2 = load i8*, i8** %1, align 8
// CHECK-NEXT: ret i8* %2
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 1
// CHECK-NEXT: %2 = load ptr, ptr %1, align 8
// CHECK-NEXT: ret ptr %2
// CHECK-NEXT: }
sil @project_block_storage : $@convention(thin) (@inout_aliasable @block_storage Builtin.RawPointer) -> Builtin.RawPointer {
entry(%0 : $*@block_storage Builtin.RawPointer):
@@ -52,10 +51,10 @@ entry(%0 : $*@block_storage Builtin.RawPointer):
return %p : $Builtin.RawPointer
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc fp128 @overaligned_project_block_storage({ %objc_block, fp128 }* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc fp128 @overaligned_project_block_storage(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-NEXT: entry:
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, fp128 }, { %objc_block, fp128 }* %0, i32 0, i32 1
// CHECK-NEXT: %2 = load fp128, fp128* %1, align 16
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, fp128 }, ptr %0, i32 0, i32 1
// CHECK-NEXT: %2 = load fp128, ptr %1, align 16
// CHECK-NEXT: ret fp128 %2
// CHECK-NEXT: }
sil @overaligned_project_block_storage : $@convention(thin) (@inout_aliasable @block_storage Builtin.FPIEEE128) -> Builtin.FPIEEE128 {
@@ -65,21 +64,20 @@ entry(%0 : $*@block_storage Builtin.FPIEEE128):
return %p : $Builtin.FPIEEE128
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_block* @init_block_header_trivial({ %objc_block, i8* }* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, i8* }, { %objc_block, i8* }* %0, i32 0, i32 0
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 0
// CHECK: store %objc_class* [[BLOCK_ISA]], %objc_class** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 1
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @init_block_header_trivial(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 0
// CHECK: store ptr [[BLOCK_ISA]], ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 1
// -- 0x4000_0000 -- HAS_SIGNATURE
// CHECK: store i32 1073741824, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 3
// CHECK: store i8* bitcast ({{.*}} @invoke_trivial to i8*), i8** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 4
// CHECK: store i8* bitcast ({{.*}} [[TRIVIAL_BLOCK_DESCRIPTOR]] to i8*), i8** [[T0]]
// CHECK: [[RESULT:%.*]] = bitcast {{.*}} %0 to %objc_block*
// CHECK: ret %objc_block* [[RESULT]]
// CHECK: store i32 1073741824, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 3
// CHECK: store ptr @invoke_trivial, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 4
// CHECK: store ptr [[TRIVIAL_BLOCK_DESCRIPTOR]], ptr [[T0]]
// CHECK: ret ptr %0
sil @init_block_header_trivial : $@convention(thin) (@inout_aliasable @block_storage Builtin.RawPointer) -> @convention(block) () -> () {
entry(%0 : $*@block_storage Builtin.RawPointer):
%i = function_ref @invoke_trivial : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer) -> ()
@@ -87,9 +85,8 @@ entry(%0 : $*@block_storage Builtin.RawPointer):
return %b : $@convention(block) () -> ()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} void @invoke_trivial(void (...)* %0) {{.*}} {
// CHECK: %1 = bitcast void (...)* %0 to { %objc_block, i8* }*
// CHECK: %2 = getelementptr inbounds { %objc_block, i8* }, { %objc_block, i8* }* %1, i32 0, i32 1
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} void @invoke_trivial(ptr %0) {{.*}} {
// CHECK: %1 = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 1
sil @invoke_trivial : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer) -> () {
entry(%0 : $*@block_storage Builtin.RawPointer):
%c = project_block_storage %0 : $*@block_storage Builtin.RawPointer
@@ -105,26 +102,26 @@ entry(%0 : $*@block_storage Builtin.RawPointer):
sil @invoke_trivial_block_param : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer, @convention(block) (Int) -> Int) -> ()
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} i64 @invoke_trivial_with_arg(void (...)* %0, i64 %1) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} i64 @invoke_trivial_with_arg(ptr %0, i64 %1) {{.*}} {
// CHECK: ret i64 %1
sil @invoke_trivial_with_arg : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer, Int) -> Int {
entry(%0 : $*@block_storage Builtin.RawPointer, %1 : $Int):
return %1 : $Int
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_block* @init_block_header_nontrivial({ %objc_block, %swift.refcounted* }* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @init_block_header_nontrivial(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: [[HEADER:%.*]] = getelementptr inbounds
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 0
// CHECK: store %objc_class* [[BLOCK_ISA]], %objc_class** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 1
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 0
// CHECK: store ptr [[BLOCK_ISA]], ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 1
// -- 0x4200_0000 -- HAS_SIGNATURE, HAS_COPY_DISPOSE
// CHECK: store i32 1107296256, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 3
// CHECK: store i8* bitcast ({{.*}} @invoke_nontrivial to i8*), i8** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 4
// CHECK: store i8* bitcast ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR]] to i8*), i8** [[T0]]
// CHECK: store i32 1107296256, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 3
// CHECK: store ptr @invoke_nontrivial, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 4
// CHECK: store ptr [[NONTRIVIAL_BLOCK_DESCRIPTOR]], ptr [[T0]]
sil @init_block_header_nontrivial : $@convention(thin) (@inout_aliasable @block_storage Builtin.NativeObject) -> @convention(block) () -> () {
entry(%0 : $*@block_storage Builtin.NativeObject):
%i = function_ref @invoke_nontrivial : $@convention(c) (@inout_aliasable @block_storage Builtin.NativeObject) -> ()
@@ -134,35 +131,35 @@ entry(%0 : $*@block_storage Builtin.NativeObject):
// CHECK: define internal void [[NONTRIVIAL_BLOCK_COPY]]
// CHECK-NEXT: entry:
// CHECK-NEXT: %2 = getelementptr inbounds { %objc_block, %swift.refcounted* }, { %objc_block, %swift.refcounted* }* %0, i32 0, i32 1
// CHECK-NEXT: %3 = getelementptr inbounds { %objc_block, %swift.refcounted* }, { %objc_block, %swift.refcounted* }* %1, i32 0, i32 1
// CHECK-NEXT: %4 = load %swift.refcounted*, %swift.refcounted** %3, align 8
// CHECK-NEXT: call %swift.refcounted* @swift_retain(%swift.refcounted* returned %4) {{#[0-9]+}}
// CHECK-NEXT: store %swift.refcounted* %4, %swift.refcounted** %2, align 8
// CHECK-NEXT: %2 = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 1
// CHECK-NEXT: %3 = getelementptr inbounds { %objc_block, ptr }, ptr %1, i32 0, i32 1
// CHECK-NEXT: %4 = load ptr, ptr %3, align 8
// CHECK-NEXT: call ptr @swift_retain(ptr returned %4) {{#[0-9]+}}
// CHECK-NEXT: store ptr %4, ptr %2, align 8
// CHECK-NEXT: ret void
// CHECK: define internal void [[NONTRIVIAL_BLOCK_DISPOSE]]
// CHECK-NEXT: entry:
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, %swift.refcounted* }, { %objc_block, %swift.refcounted* }* %0, i32 0, i32 1
// CHECK-NEXT: %toDestroy = load %swift.refcounted*, %swift.refcounted** %1, align 8
// CHECK-NEXT: call void @swift_release(%swift.refcounted* %toDestroy) {{#[0-9]+}}
// CHECK-NEXT: %1 = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 1
// CHECK-NEXT: %toDestroy = load ptr, ptr %1, align 8
// CHECK-NEXT: call void @swift_release(ptr %toDestroy) {{#[0-9]+}}
// CHECK-NEXT: ret void
sil public_external @invoke_nontrivial : $@convention(c) (@inout_aliasable @block_storage Builtin.NativeObject) -> ()
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %objc_block* @init_block_header_stret({ %objc_block, i8* }* nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @init_block_header_stret(ptr nocapture dereferenceable({{.*}}) %0) {{.*}} {
// CHECK: [[HEADER:%.*]] = getelementptr inbounds
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 0
// CHECK: store %objc_class* [[BLOCK_ISA]], %objc_class** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 1
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 0
// CHECK: store ptr [[BLOCK_ISA]], ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 1
// -- 0x6000_0000 -- HAS_STRET, HAS_SIGNATURE
// CHECK: store i32 1610612736, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, i32* [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 3
// CHECK: store i8* bitcast ({{.*}} @invoke_stret to i8*), i8** [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 4
// CHECK: store i8* bitcast ({{.*}} [[STRET_BLOCK_DESCRIPTOR]] to i8*), i8** [[T0]]
// CHECK: store i32 1610612736, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 2
// CHECK: store i32 0, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 3
// CHECK: store ptr @invoke_stret, ptr [[T0]]
// CHECK: [[T0:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 4
// CHECK: store ptr [[STRET_BLOCK_DESCRIPTOR]], ptr [[T0]]
sil @init_block_header_stret : $@convention(thin) (@inout_aliasable @block_storage Builtin.RawPointer) -> @convention(block) () -> NSRect {
entry(%0 : $*@block_storage Builtin.RawPointer):
%i = function_ref @invoke_stret : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer) -> NSRect

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -enable-objc-interop -emit-ir | %FileCheck %s --check-prefix=CHECK-%target-ptrsize
// RUN: %target-swift-frontend -primary-file %s -enable-objc-interop -emit-ir
// RUN: %target-swift-frontend -primary-file %s -enable-objc-interop -emit-ir | %FileCheck %s --check-prefix=CHECK-%target-ptrsize
// https://github.com/apple/swift/issues/43667

View File

@@ -1,14 +1,11 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -sdk %S/Inputs -I %t -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s
// RUN: %target-swift-frontend -sdk %S/Inputs -I %t -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend -sdk %S/Inputs -I %t -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
// CHECK-DAG: %swift.refcounted = type
// CHECK-DAG: [[HOOZIT:%T17objc_class_export6HoozitC]] = type <{ [[REF:%swift.refcounted]] }>
// CHECK-DAG: [[FOO:%T17objc_class_export3FooC]] = type <{ [[REF]], %TSi }>
// CHECK-DAG: [[INT:%TSi]] = type <{ i64 }>
// CHECK-DAG: [[DOUBLE:%TSd]] = type <{ double }>
// CHECK-DAG: [[NSRECT:%TSo6NSRectV]] = type <{ %TSo7NSPointV, %TSo6NSSizeV }>
@@ -16,54 +13,54 @@
// CHECK-DAG: [[NSSIZE:%TSo6NSSizeV]] = type <{ %TSd, %TSd }>
// CHECK: @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" = hidden global %objc_class {
// CHECK-SAME: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: %objc_class* @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: %swift.opaque* @_objc_empty_cache,
// CHECK-SAME: %swift.opaque* null,
// CHECK-SAME: i64 ptrtoint ({{.*}}* @_METACLASS_DATA__TtC17objc_class_export3Foo to i64)
// CHECK-SAME: ptr @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: ptr @"OBJC_METACLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: ptr @_objc_empty_cache,
// CHECK-SAME: ptr null,
// CHECK-SAME: i64 ptrtoint (ptr @_METACLASS_DATA__TtC17objc_class_export3Foo to i64)
// CHECK-SAME: }
// CHECK: [[FOO_NAME:@.*]] = private unnamed_addr constant [28 x i8] c"_TtC17objc_class_export3Foo\00"
// CHECK: @_METACLASS_DATA__TtC17objc_class_export3Foo = internal constant {{.*\*}} } {
// CHECK: @_METACLASS_DATA__TtC17objc_class_export3Foo = internal constant { {{.*ptr}} } {
// CHECK-SAME: i32 129,
// CHECK-SAME: i32 40,
// CHECK-SAME: i32 40,
// CHECK-SAME: i32 0,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr [[FOO_NAME]],
// CHECK-SAME: @_CLASS_METHODS__TtC17objc_class_export3Foo,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* null
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr null
// CHECK-SAME: }, section "__DATA, {{.*}}", align 8
// CHECK: @_DATA__TtC17objc_class_export3Foo = internal constant {{.*\*}} } {
// CHECK: @_DATA__TtC17objc_class_export3Foo = internal constant { {{.*}}, ptr } {
// CHECK-SAME: i32 128,
// CHECK-SAME: i32 16,
// CHECK-SAME: i32 24,
// CHECK-SAME: i32 0,
// CHECK-SAME: i8* null,
// CHECK-SAME: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* [[FOO_NAME]], i64 0, i64 0),
// CHECK-SAME: { i32, i32, [6 x { i8*, i8*, i8* }] }* @_INSTANCE_METHODS__TtC17objc_class_export3Foo,
// CHECK-SAME: i8* null,
// CHECK-SAME: ptr null,
// CHECK-SAME: ptr [[FOO_NAME]],
// CHECK-SAME: ptr @_INSTANCE_METHODS__TtC17objc_class_export3Foo,
// CHECK-SAME: ptr null,
// CHECK-SAME: @_IVARS__TtC17objc_class_export3Foo,
// CHECK-SAME: i8* null,
// CHECK-SAME: ptr null,
// CHECK-SAME: _PROPERTIES__TtC17objc_class_export3Foo
// CHECK-SAME: }, section "__DATA, {{.*}}", align 8
// CHECK: @"$s17objc_class_export3FooCMf" = internal global <{{.*}} }> <{
// CHECK-SAME: void ([[FOO]]*)* @"$s17objc_class_export3FooCfD",
// CHECK-SAME: i8** @"$sBOWV",
// CHECK-SAME: i64 ptrtoint (%objc_class* @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" to i64),
// CHECK-SAME: %objc_class* @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: %swift.opaque* @_objc_empty_cache,
// CHECK-SAME: %swift.opaque* null,
// CHECK-SAME: i64 add (i64 ptrtoint ({{.*}}* @_DATA__TtC17objc_class_export3Foo to i64), i64 {{1|2}}),
// CHECK-SAME: [[FOO]]* (%swift.type*)* @"$s17objc_class_export3FooC6createACyFZ",
// CHECK-SAME: void (double, double, double, double, [[FOO]]*)* @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"
// CHECK-SAME: ptr @"$s17objc_class_export3FooCfD",
// CHECK-SAME: ptr @"$sBOWV",
// CHECK-SAME: i64 ptrtoint (ptr @"OBJC_METACLASS_$__TtC17objc_class_export3Foo" to i64),
// CHECK-SAME: ptr @"OBJC_CLASS_$_{{(_TtCs12_)?}}SwiftObject",
// CHECK-SAME: ptr @_objc_empty_cache,
// CHECK-SAME: ptr null,
// CHECK-SAME: i64 add (i64 ptrtoint (ptr @_DATA__TtC17objc_class_export3Foo to i64), i64 {{1|2}}),
// CHECK-SAME: ptr @"$s17objc_class_export3FooC6createACyFZ",
// CHECK-SAME: ptr @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"
// CHECK-SAME: }>, section "__DATA,__objc_data, regular"
// -- TODO: The OBJC_CLASS symbol should reflect the qualified runtime name of
// Foo.
// CHECK: @"$s17objc_class_export3FooCN" = hidden alias %swift.type, bitcast (i64* getelementptr inbounds ({{.*}} @"$s17objc_class_export3FooCMf", i32 0, i32 3) to %swift.type*)
// CHECK: @"OBJC_CLASS_$__TtC17objc_class_export3Foo" = hidden alias %swift.type, %swift.type* @"$s17objc_class_export3FooCN"
// CHECK: @"$s17objc_class_export3FooCN" = hidden alias %swift.type, getelementptr inbounds ({{.*}} @"$s17objc_class_export3FooCMf", i32 0, i32 3)
// CHECK: @"OBJC_CLASS_$__TtC17objc_class_export3Foo" = hidden alias %swift.type, ptr @"$s17objc_class_export3FooCN"
import gizmo
@@ -82,25 +79,22 @@ struct BigStructWithNativeObjects {
@objc func drawInRect(dirty dirty: NSRect) {
}
// CHECK: define internal void @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tFTo"([[OPAQUE:%.*]]* %0, i8* %1, [[NSRECT]]* byval({{.*}}) align 8 %2) {{[#0-9]*}} {
// CHECK: [[CAST:%[a-zA-Z0-9]+]] = bitcast [[OPAQUE]]* %0 to [[FOO]]*
// CHECK: call swiftcc void @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"(double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, [[FOO]]* swiftself [[CAST]])
// CHECK: define internal void @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tFTo"(ptr %0, ptr %1, ptr byval({{.*}}) align 8 %2) {{[#0-9]*}} {
// CHECK: call swiftcc void @"$s17objc_class_export3FooC10drawInRect5dirtyySo6NSRectV_tF"(double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, ptr swiftself %0)
// CHECK: }
@objc func bounds() -> NSRect {
return NSRect(origin: NSPoint(x: 0, y: 0),
size: NSSize(width: 0, height: 0))
}
// CHECK: define internal void @"$s17objc_class_export3FooC6boundsSo6NSRectVyFTo"([[NSRECT]]* noalias nocapture sret({{.*}}) %0, [[OPAQUE4:%.*]]* %1, i8* %2) {{[#0-9]*}} {
// CHECK: [[CAST:%[a-zA-Z0-9]+]] = bitcast [[OPAQUE4]]* %1 to [[FOO]]*
// CHECK: call swiftcc { double, double, double, double } @"$s17objc_class_export3FooC6boundsSo6NSRectVyF"([[FOO]]* swiftself [[CAST]])
// CHECK: define internal void @"$s17objc_class_export3FooC6boundsSo6NSRectVyFTo"(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %2) {{[#0-9]*}} {
// CHECK: call swiftcc { double, double, double, double } @"$s17objc_class_export3FooC6boundsSo6NSRectVyF"(ptr swiftself %1)
@objc func convertRectToBacking(r r: NSRect) -> NSRect {
return r
}
// CHECK: define internal void @"$s17objc_class_export3FooC20convertRectToBacking1rSo6NSRectVAG_tFTo"([[NSRECT]]* noalias nocapture sret({{.*}}) %0, [[OPAQUE5:%.*]]* %1, i8* %2, [[NSRECT]]* byval({{.*}} align 8 %3) {{[#0-9]*}} {
// CHECK: [[CAST:%[a-zA-Z0-9]+]] = bitcast [[OPAQUE5]]* %1 to [[FOO]]*
// CHECK: call swiftcc { double, double, double, double } @"$s17objc_class_export3FooC20convertRectToBacking1rSo6NSRectVAG_tF"(double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, [[FOO]]* swiftself [[CAST]])
// CHECK: define internal void @"$s17objc_class_export3FooC20convertRectToBacking1rSo6NSRectVAG_tFTo"(ptr noalias nocapture sret({{.*}}) %0, ptr %1, ptr %2, ptr byval({{.*}} align 8 %3) {{[#0-9]*}} {
// CHECK: call swiftcc { double, double, double, double } @"$s17objc_class_export3FooC20convertRectToBacking1rSo6NSRectVAG_tF"(double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, ptr swiftself %1)
func doStuffToSwiftSlice(f f: [Int]) {
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend %s -emit-ir -enable-objc-interop -disable-objc-attr-requires-foundation-module | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -7,11 +6,11 @@
// class properties, so no ObjC property is reflected.
// CHECK-NOT: @_PROPERTIES__TtC19objc_class_property7Smashed
// CHECK: @_CLASS_METHODS__TtC19objc_class_property7Smashed = internal constant { i32, i32, [1 x { i8*, i8*, i8* }] } {
// CHECK: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(sharedSmashed)"
// CHECK: @_CLASS_METHODS__TtC19objc_class_property7Smashed = internal constant { i32, i32, [1 x { ptr, ptr, ptr }] } {
// CHECK: ptr @"\01L_selector_data(sharedSmashed)"
// CHECK-NOT: @_PROPERTIES__TtC19objc_class_property7Smashed
// CHECK: @_INSTANCE_METHODS__TtC19objc_class_property7Smashed = internal constant { i32, i32, [1 x { i8*, i8*, i8* }] } {
// CHECK: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(init)"
// CHECK: @_INSTANCE_METHODS__TtC19objc_class_property7Smashed = internal constant { i32, i32, [1 x { ptr, ptr, ptr }] } {
// CHECK: ptr @"\01L_selector_data(init)"
// CHECK-NOT: @_PROPERTIES__TtC19objc_class_property7Smashed
@objc class Smashed {

View File

@@ -1,14 +1,10 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
// CHECK: [[SGIZMO:%T12objc_dealloc10SwiftGizmoC]] = type
// CHECK: [[GIZMO:%TSo5GizmoC]] = type <{ %objc_class* }>
sil_stage raw
import Builtin
@@ -71,12 +67,11 @@ bb0(%0 : @unowned $X, %1 : @unowned $SwiftGizmo):
return %7 : $() // id: %8
}
// CHECK: define internal void @"$s12objc_dealloc10SwiftGizmoCfDTo"([[OPAQUE:%.*]]* %0, i8* %1) {{[#0-9]*}} {
// CHECK: define internal void @"$s12objc_dealloc10SwiftGizmoCfDTo"(ptr %0, ptr %1) {{[#0-9]*}} {
sil private [ossa] @$s12objc_dealloc10SwiftGizmoCfDTo : $@convention(objc_method) (SwiftGizmo) -> () {
bb0(%0 : @unowned $SwiftGizmo):
// CHECK-NEXT: entry
// CHECK-NEXT: [[OBJC_SUPER:%[a-zA-Z0-9_]+]] = alloca %objc_super, align 8
// CHECK: [[SGIZMOVAL:%[a-zA-Z0-9]+]] = bitcast [[OPAQUE]]* %0 to [[SGIZMO]]*
// Call to onDestruct()
// CHECK: call swiftcc void @"$s12objc_dealloc10onDestructyyF"()
@@ -87,29 +82,24 @@ bb0(%0 : @unowned $SwiftGizmo):
// Destroy instance variables
// FIXME: This should move to .cxx_destruct
// CHECK: [[XOFFSET:%[a-zA-Z0-9]+]] = load i64, i64* @"$s12objc_dealloc10SwiftGizmoC1xAA1XCvpWvd", align 8
// CHECK-NEXT: bitcast
// CHECK-NEXT: [[IVAR_ADDR:%[a-zA-Z0-9]+]] = getelementptr inbounds i8, i8* {{.*}}, i64 [[XOFFSET]]
// CHECK-NEXT: [[XADDR:%[.a-zA-Z0-9]+]] = bitcast i8* [[IVAR_ADDR]] to %T12objc_dealloc1XC**
// CHECK-NEXT: [[X:%[a-zA-Z0-9]+]] = load %T12objc_dealloc1XC*, %T12objc_dealloc1XC** [[XADDR]], align 8
// CHECK-NEXT: call void bitcast (void (%swift.refcounted*)* @swift_release to void (%T12objc_dealloc1XC*)*)(%T12objc_dealloc1XC* [[X]])
// CHECK: [[XOFFSET:%[a-zA-Z0-9]+]] = load i64, ptr @"$s12objc_dealloc10SwiftGizmoC1xAA1XCvpWvd", align 8
// CHECK-NEXT: [[IVAR_ADDR:%[a-zA-Z0-9]+]] = getelementptr inbounds i8, ptr {{.*}}, i64 [[XOFFSET]]
// CHECK-NEXT: [[X:%[a-zA-Z0-9]+]] = load ptr, ptr [[IVAR_ADDR]], align 8
// CHECK-NEXT: call void @swift_release(ptr [[X]])
%3 = unchecked_ownership_conversion %0 : $SwiftGizmo, @unowned to @guaranteed
%4 = ref_element_addr %3 : $SwiftGizmo, #SwiftGizmo.x // user: %4
destroy_addr %4 : $*X // id: %4
end_borrow %3 : $SwiftGizmo
// Call super -dealloc.
// CHECK: [[SUPER:%[a-zA-Z0-9]+]] = bitcast [[SGIZMO]]* [[SGIZMOVAL]] to [[GIZMO]]*
// CHECK-NEXT: [[SUPER_OBJ:%[a-zA-Z0-9]+]] = bitcast [[GIZMO]]* [[SUPER]] to %objc_object*
// CHECK-NEXT: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s12objc_dealloc10SwiftGizmoCMa"(i64 0)
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s12objc_dealloc10SwiftGizmoCMa"(i64 0)
// CHECK-NEXT: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK-NEXT: [[T1:%.*]] = bitcast %swift.type* [[T0]] to %objc_class*
// CHECK-NEXT: [[OBJC_SUPER_RECEIVER:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, %objc_super* [[OBJC_SUPER]], i32 0, i32 0
// CHECK-NEXT: store %objc_object* [[SUPER_OBJ]], %objc_object** [[OBJC_SUPER_RECEIVER]], align 8
// CHECK-NEXT: [[OBJC_SUPER_CLASS:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, %objc_super* [[OBJC_SUPER]], i32 0, i32 1
// CHECK-NEXT: store %objc_class* [[T1]], %objc_class** [[OBJC_SUPER_CLASS]], align 8
// CHECK-NEXT: [[DEALLOC_SEL:%[a-zA-Z0-9]+]] = load i8*, i8** @"\01L_selector(dealloc)", align 8
// CHECK-NEXT: call void bitcast (void ()* @objc_msgSendSuper2 to void (%objc_super*, i8*)*)(%objc_super* [[OBJC_SUPER]], i8* [[DEALLOC_SEL]])
// CHECK-NEXT: [[OBJC_SUPER_RECEIVER:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, ptr [[OBJC_SUPER]], i32 0, i32 0
// CHECK-NEXT: store ptr %0, ptr [[OBJC_SUPER_RECEIVER]], align 8
// CHECK-NEXT: [[OBJC_SUPER_CLASS:%[a-zA-Z0-9]+]] = getelementptr inbounds %objc_super, ptr [[OBJC_SUPER]], i32 0, i32 1
// CHECK-NEXT: store ptr [[T0]], ptr [[OBJC_SUPER_CLASS]], align 8
// CHECK-NEXT: [[DEALLOC_SEL:%[a-zA-Z0-9]+]] = load ptr, ptr @"\01L_selector(dealloc)", align 8
// CHECK-NEXT: call void @objc_msgSendSuper2(ptr [[OBJC_SUPER]], ptr [[DEALLOC_SEL]])
%5 = objc_super_method %0 : $SwiftGizmo, #Gizmo.deinit!deallocator.foreign : (Gizmo) -> () -> (), $@convention(objc_method) (Gizmo) -> () // user: %7
%6 = upcast %0 : $SwiftGizmo to $Gizmo // user: %7
%7 = apply %5(%6) : $@convention(objc_method) (Gizmo) -> ()

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %s %use_no_opaque_pointers -emit-ir -disable-objc-attr-requires-foundation-module -enable-swift3-objc-inference -swift-version 4 | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-attr-requires-foundation-module -enable-swift3-objc-inference -swift-version 4
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-attr-requires-foundation-module -enable-swift3-objc-inference -swift-version 4 | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -12,7 +11,6 @@ class ObjCSubclass : NSObject {
func foo() { }
}
// CHECK-LABEL: define internal void @"$s016objc_deprecated_A7_thunks12ObjCSubclassC3fooyyFTo"(%0* %0, i8* %1)
// CHECK-LABEL: define internal void @"$s016objc_deprecated_A7_thunks12ObjCSubclassC3fooyyFTo"(ptr %0, ptr %1)
// CHECK: entry:
// CHECK: [[SELF:%[0-9]+]] = bitcast %0* %0 to %objc_object*
// CHECK-NEXT: call void @swift_objc_swift3ImplicitObjCEntrypoint(%objc_object* [[SELF]], i8* %1, i8* getelementptr inbounds ({{.*}}[[FILENAME_STR]]{{.*}}), i64 [[FILENAME_LENGTH:[0-9]+]], i64 12, i64 3, i8* {{.*}})
// CHECK: call void @swift_objc_swift3ImplicitObjCEntrypoint(ptr %0, ptr %1, ptr [[FILENAME_STR]], i64 [[FILENAME_LENGTH:[0-9]+]], i64 11, i64 3, ptr {{.*}})

View File

@@ -1,9 +1,7 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %use_no_opaque_pointers -enable-objc-interop -emit-ir %s | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -emit-ir %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -emit-ir %s | %FileCheck %s
// REQUIRES: CPU=x86_64
// CHECK: [[SWIFT_TYPE:%swift.type]] = type { i64 }
sil_stage canonical
import Builtin
@@ -21,7 +19,7 @@ bb0:
sil @_TFCSo4HiveCfMS_FT5queenGSQCSo3Bee__S_ : $@convention(thin) (@owned Optional<Bee>, @thick Hive.Type) -> @owned Optional<Hive> {
bb0(%0 : $Optional<Bee>, %1 : $@thick Hive.Type):
%2 = thick_to_objc_metatype %1 : $@thick Hive.Type to $@objc_metatype Hive.Type // users: %3, %4
// CHECK: load i8*, i8** @"\01L_selector(hiveWithQueen:)"
// CHECK: load ptr, ptr @"\01L_selector(hiveWithQueen:)"
%3 = objc_method %2 : $@objc_metatype Hive.Type, #Hive.init!allocator.foreign : (Hive.Type) -> (Bee!) -> Hive!, $@convention(objc_method) (Optional<Bee>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive> // user: %4
// CHECK: call {{.*}} @objc_msgSend
%4 = apply %3(%0, %2) : $@convention(objc_method) (Optional<Bee>, @objc_metatype Hive.Type) -> @autoreleased Optional<Hive> // users: %5, %6

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-os-abi %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-os-abi %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -58,40 +57,40 @@ class ObjcDestructible: NSObject {
// CHECK: @_INSTANCE_METHODS__TtC12objc_methods3Foo = internal constant { {{.*}}] } {
// CHECK: i32 24,
// CHECK: i32 10,
// CHECK: [10 x { i8*, i8*, i8* }] [{
// CHECK: i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"\01L_selector_data(baz)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[NO_ARGS_SIGNATURE]], i64 0, i64 0),
// CHECK: i8* bitcast (void (i8*, i8*)* @"$s12objc_methods3FooC3bazyyFTo" to i8*)
// CHECK: [10 x { ptr, ptr, ptr }] [{
// CHECK: ptr @"\01L_selector_data(baz)",
// CHECK: ptr [[NO_ARGS_SIGNATURE]],
// CHECK: ptr @"$s12objc_methods3FooC3bazyyFTo"
// CHECK: }, {
// CHECK: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_selector_data(garply:)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([11 x i8], [11 x i8]* [[GARPLY_SIGNATURE]], i64 0, i64 0),
// CHECK: i8* bitcast (void (i8*, i8*, i8*)* @"$s12objc_methods3FooC6garplyyyyXlSgFTo" to i8*)
// CHECK: ptr @"\01L_selector_data(garply:)",
// CHECK: ptr [[GARPLY_SIGNATURE]],
// CHECK: ptr @"$s12objc_methods3FooC6garplyyyyXlSgFTo"
// CHECK: }, {
// CHECK: i8* getelementptr inbounds ([9 x i8], [9 x i8]* @"\01L_selector_data(harply::)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([14 x i8], [14 x i8]* [[HARPLY_SIGNATURE]], i64 0, i64 0),
// CHECK: i8* bitcast (i8* (i8*, i8*, i8*, i8*)* @"$s12objc_methods3FooC6harplyyyXlSgAE_yXltFTo" to i8*)
// CHECK: ptr @"\01L_selector_data(harply::)",
// CHECK: ptr [[HARPLY_SIGNATURE]],
// CHECK: ptr @"$s12objc_methods3FooC6harplyyyXlSgAE_yXltFTo"
// CHECK: }, {
// CHECK: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_selector_data(block:)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[BLOCK_SIGNATURE_TRAD]], i64 0, i64 0),
// CHECK: i8* bitcast (void (i8*, i8*, i64 (i64)*)* @"$s12objc_methods3FooC5blockyyS2iXEFTo" to i8*)
// CHECK: ptr @"\01L_selector_data(block:)",
// CHECK: ptr [[BLOCK_SIGNATURE_TRAD]],
// CHECK: ptr @"$s12objc_methods3FooC5blockyyS2iXEFTo"
// CHECK: }, {
// CHECK: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_selector_data(block2:)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[BLOCK_SIGNATURE_TRAD]], i64 0, i64 0),
// CHECK: i8* bitcast (void (i8*, i8*, i64 (i64, i64)*)* @"$s12objc_methods3FooC6block2yyS2i_SitXEFTo" to i8*)
// CHECK: ptr @"\01L_selector_data(block2:)",
// CHECK: ptr [[BLOCK_SIGNATURE_TRAD]],
// CHECK: ptr @"$s12objc_methods3FooC6block2yyS2i_SitXEFTo"
// CHECK: }, {
// CHECK: i8* getelementptr inbounds ([20 x i8], [20 x i8]* @"\01L_selector_data(failAndReturnError:)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([12 x i8], [12 x i8]* [[FAIL_SIGNATURE]], i64 0, i64 0),
// CHECK-macosx: i8* bitcast (i8 (i8*, i8*, %4**)* @"$s12objc_methods3FooC4failyyKFTo" to i8*)
// CHECK-ios: i8* bitcast (i1 (i8*, i8*, %4**)* @"$s12objc_methods3FooC4failyyKFTo" to i8*)
// CHECK: ptr @"\01L_selector_data(failAndReturnError:)",
// CHECK: ptr [[FAIL_SIGNATURE]],
// CHECK-macosx: ptr @"$s12objc_methods3FooC4failyyKFTo"
// CHECK-ios: ptr @"$s12objc_methods3FooC4failyyKFTo"
// CHECK: }]
// CHECK: }, section "__DATA, {{.*}}", align 8
// CHECK: @_INSTANCE_METHODS__TtC12objc_methods16ObjcDestructible = internal constant { {{.*}}] } {
// CHECK: i32 24,
// CHECK: i32 2,
// CHECK: [2 x { i8*, i8*, i8* }] [{
// CHECK: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(.cxx_destruct)", i64 0, i64 0),
// CHECK: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[NO_ARGS_SIGNATURE]], i64 0, i64 0),
// CHECK: i8* bitcast (void (%6*, i8*)* @"$s12objc_methods16ObjcDestructibleCfETo" to i8*) }]
// CHECK: [2 x { ptr, ptr, ptr }] [{
// CHECK: ptr @"\01L_selector_data(.cxx_destruct)",
// CHECK: ptr [[NO_ARGS_SIGNATURE]],
// CHECK: ptr @"$s12objc_methods16ObjcDestructibleCfETo" }]
// CHECK: }]
// CHECK: }, section "__DATA, {{.*}}", align 8
// CHECK: [[BLOCK_SIGNATURE_EXT_1:@.*]] = private unnamed_addr constant [18 x i8] c"v24@0:8@?<q@?q>16\00"
@@ -100,13 +99,13 @@ class ObjcDestructible: NSObject {
// CHECK: [[ARRAY_SIGNATURE_EXT:@.*]] = private unnamed_addr constant [29 x i8] c"@\22NSArray\2224@0:8@\22NSArray\2216\00"
// CHECK: [[DICT_SIGNATURE_EXT:@.*]] = private unnamed_addr constant [39 x i8] c"@\22NSDictionary\2224@0:8@\22NSDictionary\2216\00"
// CHECK: [[SET_SIGNATURE_EXT:@.*]] = private unnamed_addr constant [25 x i8] c"@\22NSSet\2224@0:8@\22NSSet\2216\00"
// CHECK: @_PROTOCOL_METHOD_TYPES__TtP12objc_methods7Fooable_ = weak hidden constant [6 x i8*] [
// CHECK: i8* getelementptr inbounds ([18 x i8], [18 x i8]* [[BLOCK_SIGNATURE_EXT_1]], i64 0, i64 0)
// CHECK: i8* getelementptr inbounds ([19 x i8], [19 x i8]* [[BLOCK_SIGNATURE_EXT_2]], i64 0, i64 0)
// CHECK: i8* getelementptr inbounds ([31 x i8], [31 x i8]* [[STRING_SIGNATURE_EXT]], i64 0, i64 0)
// CHECK: i8* getelementptr inbounds ([29 x i8], [29 x i8]* [[ARRAY_SIGNATURE_EXT]], i64 0, i64 0)
// CHECK: i8* getelementptr inbounds ([39 x i8], [39 x i8]* [[DICT_SIGNATURE_EXT]], i64 0, i64 0)
// CHECK: i8* getelementptr inbounds ([25 x i8], [25 x i8]* [[SET_SIGNATURE_EXT]], i64 0, i64 0)
// CHECK: @_PROTOCOL_METHOD_TYPES__TtP12objc_methods7Fooable_ = weak hidden constant [6 x ptr] [
// CHECK: ptr [[BLOCK_SIGNATURE_EXT_1]]
// CHECK: ptr [[BLOCK_SIGNATURE_EXT_2]]
// CHECK: ptr [[STRING_SIGNATURE_EXT]]
// CHECK: ptr [[ARRAY_SIGNATURE_EXT]]
// CHECK: ptr [[DICT_SIGNATURE_EXT]]
// CHECK: ptr [[SET_SIGNATURE_EXT]]
// CHECK: ]

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir > %t/out.txt
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir > %t/out.txt
// RUN: %FileCheck %s -DINT=i%target-ptrsize < %t/out.txt
// RUN: %FileCheck %s --check-prefix=NEGATIVE < %t/out.txt
@@ -101,27 +100,27 @@ use_metadata(NSRuncingOptions.mince)
}
@objc class ObjCEnumMethods : NSObject {
// CHECK: define internal void @"$s12objc_ns_enum15ObjCEnumMethodsC0C2InyyAA010ExportedToD1COFTo"([[OBJC_ENUM_METHODS:.*]]* %0, i8* %1, i64 %2)
// CHECK: define internal void @"$s12objc_ns_enum15ObjCEnumMethodsC0C2InyyAA010ExportedToD1COFTo"(ptr %0, ptr %1, i64 %2)
@objc dynamic func enumIn(_ x: ExportedToObjC) {}
// CHECK: define internal i64 @"$s12objc_ns_enum15ObjCEnumMethodsC0C3OutAA010ExportedToD1COyFTo"([[OBJC_ENUM_METHODS]]* %0, i8* %1)
// CHECK: define internal i64 @"$s12objc_ns_enum15ObjCEnumMethodsC0C3OutAA010ExportedToD1COyFTo"(ptr %0, ptr %1)
@objc dynamic func enumOut() -> ExportedToObjC { return .Foo }
// CHECK: define internal i64 @"$s12objc_ns_enum15ObjCEnumMethodsC4propAA010ExportedToD1COvgTo"([[OBJC_ENUM_METHODS]]* %0, i8* %1)
// CHECK: define internal void @"$s12objc_ns_enum15ObjCEnumMethodsC4propAA010ExportedToD1COvsTo"([[OBJC_ENUM_METHODS]]* %0, i8* %1, i64 %2)
// CHECK: define internal i64 @"$s12objc_ns_enum15ObjCEnumMethodsC4propAA010ExportedToD1COvgTo"(ptr %0, ptr %1)
// CHECK: define internal void @"$s12objc_ns_enum15ObjCEnumMethodsC4propAA010ExportedToD1COvsTo"(ptr %0, ptr %1, i64 %2)
@objc dynamic var prop: ExportedToObjC = .Foo
}
// CHECK-LABEL: define hidden swiftcc void @"$s12objc_ns_enum0a1_C13_method_callsyyAA15ObjCEnumMethodsCF"(%T12objc_ns_enum15ObjCEnumMethodsC* %0)
// CHECK-LABEL: define hidden swiftcc void @"$s12objc_ns_enum0a1_C13_method_callsyyAA15ObjCEnumMethodsCF"(ptr %0)
func objc_enum_method_calls(_ x: ObjCEnumMethods) {
// CHECK: call i64 bitcast (void ()* @objc_msgSend to i64 ([[OBJC_ENUM_METHODS]]*, i8*)*)
// CHECK: call void bitcast (void ()* @objc_msgSend to void ([[OBJC_ENUM_METHODS]]*, i8*, i64)*)
// CHECK: call i64 @objc_msgSend
// CHECK: call void @objc_msgSend
x.enumIn(x.enumOut())
// CHECK: call i64 bitcast (void ()* @objc_msgSend to i64 ([[OBJC_ENUM_METHODS]]*, i8*)*)
// CHECK: call void bitcast (void ()* @objc_msgSend to void ([[OBJC_ENUM_METHODS]]*, i8*, i64)*)
// CHECK: call i64 @objc_msgSend
// CHECK: call void @objc_msgSend
x.enumIn(x.prop)
// CHECK: call i64 bitcast (void ()* @objc_msgSend to i64 ([[OBJC_ENUM_METHODS]]*, i8*)*)
// CHECK: call void bitcast (void ()* @objc_msgSend to void ([[OBJC_ENUM_METHODS]]*, i8*, i64)*)
// CHECK: call i64 @objc_msgSend
// CHECK: call void @objc_msgSend
x.prop = x.enumOut()
}

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -9,13 +8,13 @@
import Foundation
@objc class Foo : NSObject {
// CHECK: define internal void @"$s13objc_pointers3FooC16pointerArguments_1y1z1wySpySiG_SvSPySiGSAyACSgGtFTo"(%0* %0, i8* %1, i64* %2, i8* %3, i64* %4, %0** %5)
// CHECK: define internal void @"$s13objc_pointers3FooC16pointerArguments_1y1z1wySpySiG_SvSPySiGSAyACSgGtFTo"(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4, ptr %5)
@objc func pointerArguments(_ x: UnsafeMutablePointer<Int>,
y: UnsafeMutableRawPointer,
z: UnsafePointer<Int>,
w: AutoreleasingUnsafeMutablePointer<Foo?>) {}
// CHECK: define internal void @"$s13objc_pointers3FooC24pointerMetatypeArguments1x1yySAyyXlXpG_SAyyXlXpSgGtFTo"(%0* %0, i8* %1, i8** %2, i8** %3)
// CHECK: define internal void @"$s13objc_pointers3FooC24pointerMetatypeArguments1x1yySAyyXlXpG_SAyyXlXpSgGtFTo"(ptr %0, ptr %1, ptr %2, ptr %3)
@objc func pointerMetatypeArguments(x: AutoreleasingUnsafeMutablePointer<AnyClass>,
y: AutoreleasingUnsafeMutablePointer<AnyClass?>) {}
}

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %use_no_opaque_pointers -enable-objc-interop -enable-source-import -emit-ir -o - -primary-file %s | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -enable-source-import -emit-ir -o - -primary-file %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -enable-objc-interop -enable-source-import -emit-ir -o - -primary-file %s | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -22,9 +21,9 @@ class OverridesBoolProperty : HasProperties {
// CHECK-LABEL: define hidden swiftcc void @"$s24objc_properties_imported16testBoolProperty{{[_0-9a-zA-Z]*}}F"
func testBoolProperty(hp: HasProperties) {
// CHECK-NOT: ret void
// CHECK: load i8*, i8** @"\01L_selector(isEnabled)"
// CHECK: load ptr, ptr @"\01L_selector(isEnabled)"
// CHECK-NOT: ret void
// CHECK: load i8*, i8** @"\01L_selector(setIsEnabled:)"
// CHECK: load ptr, ptr @"\01L_selector(setIsEnabled:)"
hp.enabled = !hp.enabled
// CHECK: ret void
}

View File

@@ -1,9 +1,6 @@
// RUN: %swift -target x86_64-apple-ios9-simulator %S/objc_properties.swift -disable-target-os-checking -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck -check-prefix=CHECK -check-prefix=CHECK-NEW %S/objc_properties.swift
// RUN: %swift -target x86_64-apple-ios8-simulator %S/objc_properties.swift -disable-target-os-checking -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck -check-prefix=CHECK -check-prefix=CHECK-OLD %S/objc_properties.swift
// RUN: %swift -target x86_64-apple-ios9-simulator %S/objc_properties.swift -disable-target-os-checking -emit-ir -disable-objc-attr-requires-foundation-module
// RUN: %swift -target x86_64-apple-ios8-simulator %S/objc_properties.swift -disable-target-os-checking -emit-ir -disable-objc-attr-requires-foundation-module
// REQUIRES: OS=ios
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend %use_no_opaque_pointers -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -sdk %S/Inputs -I %t %s -emit-ir
// RUN: %target-swift-frontend -sdk %S/Inputs -I %t %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -13,10 +12,9 @@ import ObjectiveC
@objc protocol OP {}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc %TSo8ProtocolC* @protocol_conversion() {{.*}} {
// CHECK: %0 = load i8*, i8** @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP24objc_protocol_conversion2OP_", align 8
// CHECK: %1 = bitcast i8* %0 to %TSo8ProtocolC*
// CHECK: ret %TSo8ProtocolC* %1
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc ptr @protocol_conversion() {{.*}} {
// CHECK: %0 = load ptr, ptr @"\01l_OBJC_PROTOCOL_REFERENCE_$__TtP24objc_protocol_conversion2OP_", align 8
// CHECK: ret ptr %0
// CHECK: }
sil @protocol_conversion : $@convention(thin) () -> @owned Protocol {

View File

@@ -1,8 +1,5 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -module-name objc_retainAutoreleasedReturnValue -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend %use_no_opaque_pointers -module-name objc_retainAutoreleasedReturnValue -O -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir | %FileCheck %s --check-prefix=OPT
// RUN: %target-swift-frontend -module-name objc_retainAutoreleasedReturnValue -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir
// RUN: %target-swift-frontend -module-name objc_retainAutoreleasedReturnValue -O -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir
// RUN: %target-swift-frontend -module-name objc_retainAutoreleasedReturnValue -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -module-name objc_retainAutoreleasedReturnValue -O -import-objc-header %S/Inputs/StaticInline.h %s -emit-ir | %FileCheck %s --check-prefix=OPT
// REQUIRES: objc_interop
// REQUIRES: CPU=x86_64
@@ -27,14 +24,14 @@ public func test(_ dict: NSDictionary) {
// popq %rbp ;<== Blocks the handshake from objc_autoreleaseReturnValue
// jmp 0x01ec20 ; symbol stub for: objc_retainAutoreleasedReturnValue
// CHECK-LABEL: define {{.*}}swiftcc void @"$s34objc_retainAutoreleasedReturnValue4testyySo12NSDictionaryCFyADXEfU_"(%TSo12NSDictionaryC* %0)
// CHECK-LABEL: define {{.*}}swiftcc void @"$s34objc_retainAutoreleasedReturnValue4testyySo12NSDictionaryCFyADXEfU_"(ptr %0)
// CHECK: entry:
// CHECK: call {{.*}}@objc_msgSend
// CHECK: notail call i8* @llvm.objc.retainAutoreleasedReturnValue
// CHECK: notail call ptr @llvm.objc.retainAutoreleasedReturnValue
// CHECK: ret void
// OPT-LABEL: define {{.*}}swiftcc void @"$s34objc_retainAutoreleasedReturnValue10useClosureyySo12NSDictionaryC_yADXEtF09$s34objc_bcd16Value4testyySo12H10CFyADXEfU_Tf1nc_n"(%TSo12NSDictionaryC* %0)
// OPT-LABEL: define {{.*}}swiftcc void @"$s34objc_retainAutoreleasedReturnValue10useClosureyySo12NSDictionaryC_yADXEtF09$s34objc_bcd16Value4testyySo12H10CFyADXEfU_Tf1nc_n"(ptr %0)
// OPT: entry:
// OPT: call {{.*}}@objc_msgSend
// OPT: notail call i8* @llvm.objc.retainAutoreleasedReturnValue
// OPT: notail call ptr @llvm.objc.retainAutoreleasedReturnValue
// OPT: ret void

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) %use_no_opaque_pointers -emit-ir %s | %FileCheck %s --check-prefix=%target-cpu --check-prefix=%target-cpu-%target-sdk-name
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir %s
// RUN: %target-swift-frontend(mock-sdk: %clang-importer-sdk) -emit-ir %s | %FileCheck %s --check-prefix=%target-cpu --check-prefix=%target-cpu-%target-sdk-name
import Swift
import simd
@@ -51,21 +50,20 @@ entry(%x : $float4):
sil @simd_c_args_float3 : $@convention(c) (float3) -> float3 {
entry(%x : $float3):
// x86_64: [[COERCE:%.*]] = alloca <3 x float>, align 16
// x86_64: store <3 x float> %0, <3 x float>* [[COERCE]]
// x86_64: [[COERCED:%.*]] = bitcast <3 x float>* [[COERCE]] to %T4simd6float3V*
// x86_64: store <3 x float> %0, ptr [[COERCE]]
return %x : $float3
}
// x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @simd_native_args(%T4simd6float4V* noalias nocapture sret({{.*}}) %0, %T4simd6float4V* noalias nocapture dereferenceable({{.*}}) %1)
// i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @simd_native_args(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}}) %1)
// aarch64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// arm64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// armv6-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @simd_native_args(%T4simd6float4V* noalias nocapture sret({{.*}}) %0, %T4simd6float4V* noalias nocapture dereferenceable({{.*}}) %1)
// armv6-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @simd_native_args(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}}) %1)
// armv7-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// armv7s-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// armv7k-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// arm64_32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// powerpc64-LABEL: define{{( dllexport)?}}{{( protected)?}} void @simd_native_args(%T4simd6float4V* noalias nocapture sret({{.*}}) %0, %T4simd6float4V* noalias nocapture dereferenceable({{.*}}) %1)
// powerpc64-LABEL: define{{( dllexport)?}}{{( protected)?}} void @simd_native_args(ptr noalias nocapture sret({{.*}}) %0, ptr noalias nocapture dereferenceable({{.*}}) %1)
// powerpc64le-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
// s390x-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { float, float, float, float } @simd_native_args(float %0, float %1, float %2, float %3)
sil @simd_native_args : $@convention(thin) (float4) -> float4 {

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -9,61 +8,58 @@
import Foundation
import gizmo
// CHECK: [[GIZMO:%TSo5GizmoC]] = type opaque
// CHECK: [[NSRECT:%TSo6NSRectV]] = type <{ [[NSPOINT:%TSo7NSPointV]], [[NSSIZE:%TSo6NSSizeV]] }>
// CHECK: [[NSPOINT]] = type <{ [[DOUBLE:%TSd]], [[DOUBLE]] }>
// CHECK: [[DOUBLE]] = type <{ double }>
// CHECK: [[NSSIZE]] = type <{ [[DOUBLE]], [[DOUBLE]] }>
// CHECK: [[NSSTRING:%TSo8NSStringC]] = type opaque
// CHECK: [[NSVIEW:%TSo6NSViewC]] = type opaque
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs8getFrame{{[_0-9a-zA-Z]*}}F"([[GIZMO]]* %0) {{.*}} {
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs8getFrame{{[_0-9a-zA-Z]*}}F"(ptr %0) {{.*}} {
func getFrame(_ g: Gizmo) -> NSRect {
// CHECK: load i8*, i8** @"\01L_selector(frame)"
// CHECK: call void bitcast (void ()* @objc_msgSend_stret to void ([[NSRECT]]*, [[OPAQUE0:.*]]*, i8*)*)([[NSRECT]]* noalias nocapture sret({{.*}}) {{.*}}, [[OPAQUE0:.*]]* {{.*}}, i8* {{.*}})
// CHECK: load ptr, ptr @"\01L_selector(frame)"
// CHECK: call void @objc_msgSend_stret(ptr noalias nocapture sret({{.*}}) {{.*}}, ptr {{.*}}, ptr {{.*}})
return g.frame()
}
// CHECK: }
// CHECK: define hidden swiftcc void @"$s12objc_structs8setFrame{{[_0-9a-zA-Z]*}}F"(%TSo5GizmoC* %0, double %1, double %2, double %3, double %4) {{.*}} {
// CHECK: define hidden swiftcc void @"$s12objc_structs8setFrame{{[_0-9a-zA-Z]*}}F"(ptr %0, double %1, double %2, double %3, double %4) {{.*}} {
func setFrame(_ g: Gizmo, frame: NSRect) {
// CHECK: load i8*, i8** @"\01L_selector(setFrame:)"
// CHECK: call void bitcast (void ()* @objc_msgSend to void ([[OPAQUE0:.*]]*, i8*, [[NSRECT]]*)*)([[OPAQUE0:.*]]* {{.*}}, i8* {{.*}}, [[NSRECT]]* byval({{.*}}) align 8 {{.*}})
// CHECK: load ptr, ptr @"\01L_selector(setFrame:)"
// CHECK: call void @objc_msgSend(ptr {{.*}}, ptr {{.*}}, ptr byval({{.*}}) align 8 {{.*}})
g.setFrame(frame)
}
// CHECK: }
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs8makeRect{{[_0-9a-zA-Z]*}}F"(double %0, double %1, double %2, double %3)
func makeRect(_ a: Double, b: Double, c: Double, d: Double) -> NSRect {
// CHECK: call void @NSMakeRect(%struct.NSRect* noalias nocapture sret({{.*}}) {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}})
// CHECK: call void @NSMakeRect(ptr noalias nocapture sret({{.*}}) {{.*}}, double {{.*}}, double {{.*}}, double {{.*}}, double {{.*}})
return NSMakeRect(a,b,c,d)
}
// CHECK: }
// CHECK: define hidden swiftcc [[stringLayout:[^@]*]] @"$s12objc_structs14stringFromRect{{[_0-9a-zA-Z]*}}F"(double %0, double %1, double %2, double %3) {{.*}} {
func stringFromRect(_ r: NSRect) -> String {
// CHECK: call [[OPAQUE0:.*]]* @NSStringFromRect(%struct.NSRect* byval({{.*}}) align 8 {{.*}})
// CHECK: call ptr @NSStringFromRect(ptr byval({{.*}}) align 8 {{.*}})
return NSStringFromRect(r)
}
// CHECK: }
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs9insetRect{{[_0-9a-zA-Z]*}}F"(double %0, double %1, double %2, double %3, double %4, double %5)
func insetRect(_ r: NSRect, x: Double, y: Double) -> NSRect {
// CHECK: call void @NSInsetRect(%struct.NSRect* noalias nocapture sret({{.*}}) {{.*}}, %struct.NSRect* byval({{.*}}) align 8 {{.*}}, double {{.*}}, double {{.*}})
// CHECK: call void @NSInsetRect(ptr noalias nocapture sret({{.*}}) {{.*}}, ptr byval({{.*}}) align 8 {{.*}}, double {{.*}}, double {{.*}})
return NSInsetRect(r, x, y)
}
// CHECK: }
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs19convertRectFromBase{{[_0-9a-zA-Z]*}}F"([[NSVIEW]]* %0, double %1, double %2, double %3, double %4)
// CHECK: define hidden swiftcc { double, double, double, double } @"$s12objc_structs19convertRectFromBase{{[_0-9a-zA-Z]*}}F"(ptr %0, double %1, double %2, double %3, double %4)
func convertRectFromBase(_ v: NSView, r: NSRect) -> NSRect {
// CHECK: load i8*, i8** @"\01L_selector(convertRectFromBase:)", align 8
// CHECK: call void bitcast (void ()* @objc_msgSend_stret to void ([[NSRECT]]*, [[OPAQUE0:.*]]*, i8*, [[NSRECT]]*)*)([[NSRECT]]* noalias nocapture sret({{.*}}) {{.*}}, [[OPAQUE0:.*]]* {{.*}}, i8* {{.*}}, [[NSRECT]]* byval({{.*}}) align 8 {{.*}})
// CHECK: load ptr, ptr @"\01L_selector(convertRectFromBase:)", align 8
// CHECK: call void @objc_msgSend_stret(ptr noalias nocapture sret({{.*}}) {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr byval({{.*}}) align 8 {{.*}})
return v.convertRect(fromBase: r)
}
// CHECK: }
// CHECK: define hidden swiftcc { {{.*}}*, {{.*}}*, {{.*}}*, {{.*}}* } @"$s12objc_structs20useStructOfNSStringsySo0deF0VADF"({{.*}}* %0, {{.*}}* %1, {{.*}}* %2, {{.*}}* %3)
// CHECK: call void @useStructOfNSStringsInObjC(%struct.StructOfNSStrings* noalias nocapture sret({{.*}}) {{%.*}}, %struct.StructOfNSStrings* byval({{.*}}) align 8 {{%.*}})
// CHECK: define hidden swiftcc { ptr, ptr, ptr, ptr } @"$s12objc_structs20useStructOfNSStringsySo0deF0VADF"(ptr %0, ptr %1, ptr %2, ptr %3)
// CHECK: call void @useStructOfNSStringsInObjC(ptr noalias nocapture sret({{.*}}) {{%.*}}, ptr byval({{.*}}) align 8 {{%.*}})
func useStructOfNSStrings(_ s: StructOfNSStrings) -> StructOfNSStrings {
return useStructOfNSStringsInObjC(s)
}

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers -primary-file %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %s
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) -primary-file %s -emit-ir | %FileCheck --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize %s
// REQUIRES: objc_interop
@@ -9,154 +8,149 @@
// the stlib.
// REQUIRES: swift_stdlib_asserts
// CHECK: [[SGIZMO:T13objc_subclass10SwiftGizmoC]] = type
// CHECK: [[OBJC_CLASS:%objc_class]] = type
// CHECK: [[OPAQUE:%swift.opaque]] = type
// CHECK: [[INT:%TSi]] = type <{ [[LLVM_PTRSIZE_INT:i(32|64)]] }>
// CHECK: [[TYPE:%swift.type]] = type
// CHECK-DAG: [[GIZMO:%TSo5GizmoC]] = type <{ %objc_class* }>
// CHECK-DAG: [[OBJC:%objc_object]] = type opaque
// CHECK-32: @"$s13objc_subclass10SwiftGizmoC1xSivpWvd" = hidden global i32 4, align [[WORD_SIZE_IN_BYTES:4]]
// CHECK-64: @"$s13objc_subclass10SwiftGizmoC1xSivpWvd" = hidden global i64 8, align [[WORD_SIZE_IN_BYTES:8]]
// CHECK: @"OBJC_METACLASS_$__TtC13objc_subclass10SwiftGizmo" = hidden global [[OBJC_CLASS]] { [[OBJC_CLASS]]* @"OBJC_METACLASS_$_NSObject", [[OBJC_CLASS]]* @"OBJC_METACLASS_$_Gizmo", [[OPAQUE]]* @_objc_empty_cache, [[OPAQUE]]* null, [[LLVM_PTRSIZE_INT]] ptrtoint ({{.*}} @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo to [[LLVM_PTRSIZE_INT]]) }
// CHECK: @"OBJC_METACLASS_$__TtC13objc_subclass10SwiftGizmo" = hidden global [[OBJC_CLASS]] { ptr @"OBJC_METACLASS_$_NSObject", ptr @"OBJC_METACLASS_$_Gizmo", ptr @_objc_empty_cache, ptr null, [[LLVM_PTRSIZE_INT]] ptrtoint ({{.*}} @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo to [[LLVM_PTRSIZE_INT]]) }
// CHECK-32: @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}* } {
// CHECK-32: @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { ptr } {
// CHECK-32: i32 129,
// CHECK-32: i32 20,
// CHECK-32: i32 20,
// CHECK-32: i8* null,
// CHECK-32: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.str.31._TtC13objc_subclass10SwiftGizmo, i32 0, i32 0),
// CHECK-32: i8* null,
// CHECK-32: i8* null,
// CHECK-32: i8* null,
// CHECK-32: i8* null,
// CHECK-32: i8* null
// CHECK-32: ptr null,
// CHECK-32: ptr @.str.31._TtC13objc_subclass10SwiftGizmo,
// CHECK-32: ptr null,
// CHECK-32: ptr null,
// CHECK-32: ptr null,
// CHECK-32: ptr null,
// CHECK-32: ptr null
// CHECK-32: }, section "__DATA, {{.*}}", align 4
// CHECK-64: @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}* } {
// CHECK-64: @_METACLASS_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { ptr } {
// CHECK-64: i32 129,
// CHECK-64: i32 40,
// CHECK-64: i32 40,
// CHECK-64: i32 0,
// CHECK-64: i8* null,
// CHECK-64: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.str.31._TtC13objc_subclass10SwiftGizmo, i64 0, i64 0),
// CHECK-64: i8* null,
// CHECK-64: i8* null,
// CHECK-64: i8* null,
// CHECK-64: i8* null,
// CHECK-64: i8* null
// CHECK-64: ptr null,
// CHECK-64: ptr @.str.31._TtC13objc_subclass10SwiftGizmo,
// CHECK-64: ptr null,
// CHECK-64: ptr null,
// CHECK-64: ptr null,
// CHECK-64: ptr null,
// CHECK-64: ptr null
// CHECK-64: }, section "__DATA, {{.*}}", align 8
// CHECK-32: @_INSTANCE_METHODS__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}] } {
// CHECK-32: i32 12,
// CHECK-32: i32 11,
// CHECK-32: [11 x { i8*, i8*, i8* }] [{ i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_selector_data(x)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.l8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast {{.*}}* @"$s13objc_subclass10SwiftGizmoC1xSivgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_selector_data(setX:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* @".str.9.v12@0:4l8", i32 0, i32 0),
// CHECK-32: i8* bitcast {{.*}}* @"$s13objc_subclass10SwiftGizmoC1xSivsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(getX)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.l8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast {{.*}}* @"$s13objc_subclass10SwiftGizmoC4getXSiyFTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"\01L_selector_data(duplicate)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.@8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC9duplicateSo0D0CyFTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(init)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.@8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoCACycfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([20 x i8], [20 x i8]* @"\01L_selector_data(initWithInt:string:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([13 x i8], [13 x i8]* @".str.12.@16@0:4l8@12", i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC3int6stringACSi_SStcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_selector_data(dealloc)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.v8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast {{.*}}* @"$s13objc_subclass10SwiftGizmoCfDTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"\01L_selector_data(isEnabled)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7enabledSbvgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(setIsEnabled:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7enabledSbvsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([17 x i8], [17 x i8]* @"\01L_selector_data(initWithBellsOn:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: }, { i8*, i8*, i8* } {
// CHECK-32: i8* getelementptr inbounds ([15 x i8], [15 x i8]* @"\01L_selector_data(.cxx_construct)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoCfeTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: [11 x { ptr, ptr, ptr }] [{ ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(x)",
// CHECK-32: ptr @".str.6.l8@0:4",
// CHECK-32: ptr bitcast ptr @"$s13objc_subclass10SwiftGizmoC1xSivgTo{{(\.ptrauth)?}}" to ptr)
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(setX:)",
// CHECK-32: ptr @".str.9.v12@0:4l8",
// CHECK-32: ptr bitcast ptr @"$s13objc_subclass10SwiftGizmoC1xSivsTo{{(\.ptrauth)?}}" to ptr)
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(getX)",
// CHECK-32: ptr @".str.6.l8@0:4",
// CHECK-32: ptr bitcast ptr @"$s13objc_subclass10SwiftGizmoC4getXSiyFTo{{(\.ptrauth)?}}" to ptr)
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(duplicate)",
// CHECK-32: ptr @".str.6.@8@0:4",
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC9duplicateSo0D0CyFTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(init)",
// CHECK-32: ptr @".str.6.@8@0:4",
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoCACycfcTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(initWithInt:string:)",
// CHECK-32: ptr @".str.12.@16@0:4l8@12",
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC3int6stringACSi_SStcfcTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(dealloc)",
// CHECK-32: ptr @".str.6.v8@0:4",
// CHECK-32: ptr bitcast ptr @"$s13objc_subclass10SwiftGizmoCfDTo{{(\.ptrauth)?}}" to ptr)
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(isEnabled)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC7enabledSbvgTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(setIsEnabled:)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC7enabledSbvsTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(initWithBellsOn:)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}"
// CHECK-32: }, { ptr, ptr, ptr } {
// CHECK-32: ptr @"\01L_selector_data(.cxx_construct)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoCfeTo{{(\.ptrauth)?}}"
// CHECK-32: }]
// CHECK-32: }, section "__DATA, {{.*}}", align 4
// CHECK-64: @_INSTANCE_METHODS__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}] } {
// CHECK-64: i32 24,
// CHECK-64: i32 11,
// CHECK-64: [11 x { i8*, i8*, i8* }] [{
// CHECK-64: i8* getelementptr inbounds ([2 x i8], [2 x i8]* @"\01L_selector_data(x)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.q16@0:8", i64 0, i64 0)
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC1xSivgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: [11 x { ptr, ptr, ptr }] [{
// CHECK-64: ptr @"\01L_selector_data(x)",
// CHECK-64: ptr @".str.7.q16@0:8"
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC1xSivgTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"\01L_selector_data(setX:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([11 x i8], [11 x i8]* @".str.10.v24@0:8q16", i64 0, i64 0)
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC1xSivsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(setX:)",
// CHECK-64: ptr @".str.10.v24@0:8q16"
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC1xSivsTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(getX)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.q16@0:8", i64 0, i64 0)
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC4getXSiyFTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(getX)",
// CHECK-64: ptr @".str.7.q16@0:8"
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC4getXSiyFTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"\01L_selector_data(duplicate)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.@16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC9duplicateSo0D0CyFTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(duplicate)",
// CHECK-64: ptr @".str.7.@16@0:8",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC9duplicateSo0D0CyFTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(init)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.@16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoCACycfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(init)",
// CHECK-64: ptr @".str.7.@16@0:8",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoCACycfcTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([20 x i8], [20 x i8]* @"\01L_selector_data(initWithInt:string:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @".str.13.@32@0:8q16@24", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC3int6stringACSi_SStcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(initWithInt:string:)",
// CHECK-64: ptr @".str.13.@32@0:8q16@24",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC3int6stringACSi_SStcfcTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @"\01L_selector_data(dealloc)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.v16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoCfDTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(dealloc)",
// CHECK-64: ptr @".str.7.v16@0:8",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoCfDTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([10 x i8], [10 x i8]* @"\01L_selector_data(isEnabled)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.{{[Bc]}}16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7enabledSbvgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(isEnabled)",
// CHECK-64: ptr @".str.7.{{[Bc]}}16@0:8",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC7enabledSbvgTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(setIsEnabled:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([11 x i8], [11 x i8]* @".str.10.v20@0:8{{[Bc]}}16", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7enabledSbvsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(setIsEnabled:)",
// CHECK-64: ptr @".str.10.v20@0:8{{[Bc]}}16",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC7enabledSbvsTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([17 x i8], [17 x i8]* @"\01L_selector_data(initWithBellsOn:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([11 x i8], [11 x i8]* @".str.10.@24@0:8q16", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoC7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(initWithBellsOn:)",
// CHECK-64: ptr @".str.10.@24@0:8q16",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([15 x i8], [15 x i8]* @"\01L_selector_data(.cxx_construct)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @".str.7.v16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass10SwiftGizmoCfeTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(.cxx_construct)",
// CHECK-64: ptr @".str.7.v16@0:8",
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoCfeTo{{(\.ptrauth)?}}"
// CHECK-64: }]
// CHECK-64: }, section "__DATA, {{.*}}", align 8
// CHECK-32: @_IVARS__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}] } {
// CHECK-32: i32 20,
// CHECK-32: i32 1,
// CHECK-32: [1 x { i32*, i8*, i8*, i32, i32 }] [{ i32*, i8*, i8*, i32, i32 } {
// CHECK-32: i32* @"$s13objc_subclass10SwiftGizmoC1xSivpWvd",
// CHECK-32: i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1.x, i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([1 x i8], [1 x i8]* {{.*}}, i32 0, i32 0),
// CHECK-32: [1 x { ptr, ptr, ptr, i32, i32 }] [{ ptr, ptr, ptr, i32, i32 } {
// CHECK-32: ptr @"$s13objc_subclass10SwiftGizmoC1xSivpWvd",
// CHECK-32: ptr @.str.1.x,
// CHECK-32: ptr {{.*}},
// CHECK-32: i32 2,
// CHECK-32: i32 4 }]
// CHECK-32: }, section "__DATA, {{.*}}", align 4
@@ -164,38 +158,38 @@
// CHECK-64: @_IVARS__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}] } {
// CHECK-64: i32 32,
// CHECK-64: i32 1,
// CHECK-64: [1 x { i64*, i8*, i8*, i32, i32 }] [{ i64*, i8*, i8*, i32, i32 } {
// CHECK-64: i64* @"$s13objc_subclass10SwiftGizmoC1xSivpWvd",
// CHECK-64: i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1.x, i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str.0., i64 0, i64 0),
// CHECK-64: [1 x { ptr, ptr, ptr, i32, i32 }] [{ ptr, ptr, ptr, i32, i32 } {
// CHECK-64: ptr @"$s13objc_subclass10SwiftGizmoC1xSivpWvd",
// CHECK-64: ptr @.str.1.x,
// CHECK-64: ptr @.str.0.,
// CHECK-64: i32 3,
// CHECK-64: i32 8 }]
// CHECK-64: }, section "__DATA, {{.*}}", align 8
// CHECK-32: @_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}* } {
// CHECK-32: @_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { ptr } {
// CHECK-32: i32 132,
// CHECK-32: i32 4,
// CHECK-32: i32 8,
// CHECK-32: i8* null,
// CHECK-32: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.str.31._TtC13objc_subclass10SwiftGizmo, i32 0, i32 0),
// CHECK-32: ptr null,
// CHECK-32: ptr @.str.31._TtC13objc_subclass10SwiftGizmo,
// CHECK-32: @_INSTANCE_METHODS__TtC13objc_subclass10SwiftGizmo,
// CHECK-32: i8* null,
// CHECK-32: ptr null,
// CHECK-32: @_IVARS__TtC13objc_subclass10SwiftGizmo,
// CHECK-32: i8* null,
// CHECK-32: ptr null,
// CHECK-32: @_PROPERTIES__TtC13objc_subclass10SwiftGizmo
// CHECK-32: }, section "__DATA, {{.*}}", align 4
// CHECK-64: @_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { {{.*}}* } {
// CHECK-64: @_DATA__TtC13objc_subclass10SwiftGizmo = internal constant { ptr } {
// CHECK-64: i32 132,
// CHECK-64: i32 8,
// CHECK-64: i32 16,
// CHECK-64: i32 0,
// CHECK-64: i8* null,
// CHECK-64: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @.str.31._TtC13objc_subclass10SwiftGizmo, i64 0, i64 0),
// CHECK-64: ptr null,
// CHECK-64: ptr @.str.31._TtC13objc_subclass10SwiftGizmo,
// CHECK-64: @_INSTANCE_METHODS__TtC13objc_subclass10SwiftGizmo,
// CHECK-64: i8* null,
// CHECK-64: ptr null,
// CHECK-64: @_IVARS__TtC13objc_subclass10SwiftGizmo,
// CHECK-64: i8* null,
// CHECK-64: ptr null,
// CHECK-64: @_PROPERTIES__TtC13objc_subclass10SwiftGizmo
// CHECK-64: }, section "__DATA, {{.*}}", align 8
@@ -206,30 +200,30 @@
// CHECK-32: [[SETTER_ENCODING:@.*]] = private unnamed_addr constant [10 x i8] c"v12@0:4@8\00"
// CHECK-64: [[SETTER_ENCODING:@.*]] = private unnamed_addr constant [11 x i8] c"v24@0:8@16\00"
// CHECK-32: @_INSTANCE_METHODS__TtC13objc_subclass11SwiftGizmo2 = internal constant { i32, i32, [5 x { i8*, i8*, i8* }] } {
// CHECK-32: @_INSTANCE_METHODS__TtC13objc_subclass11SwiftGizmo2 = internal constant { i32, i32, [5 x { ptr, ptr, ptr }] } {
// CHECK-32: i32 12,
// CHECK-32: i32 5,
// CHECK-32: [5 x { i8*, i8*, i8* }] [
// CHECK-32: [5 x { ptr, ptr, ptr }] [
// CHECK-32: {
// CHECK-32: i8* getelementptr inbounds ([3 x i8], [3 x i8]* @"\01L_selector_data(sg)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.@8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: ptr @"\01L_selector_data(sg)",
// CHECK-32: ptr @".str.6.@8@0:4",
// CHECK-32: ptr @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvgTo{{(\.ptrauth)?}}"
// CHECK-32: }, {
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_selector_data(setSg:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* [[SETTER_ENCODING]], i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: ptr @"\01L_selector_data(setSg:)",
// CHECK-32: ptr [[SETTER_ENCODING]],
// CHECK-32: ptr @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvsTo{{(\.ptrauth)?}}"
// CHECK-32: }, {
// CHECK-32: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(init)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @".str.6.@8@0:4", i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2CACycfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: ptr @"\01L_selector_data(init)",
// CHECK-32: ptr @".str.6.@8@0:4",
// CHECK-32: ptr @"$s13objc_subclass11SwiftGizmo2CACycfcTo{{(\.ptrauth)?}}"
// CHECK-32: }, {
// CHECK-32: i8* getelementptr inbounds ([17 x i8], [17 x i8]* @"\01L_selector_data(initWithBellsOn:)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([10 x i8], [10 x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: ptr @"\01L_selector_data(initWithBellsOn:)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass11SwiftGizmo2C7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}"
// CHECK-32: }, {
// CHECK-32: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(.cxx_destruct)", i32 0, i32 0),
// CHECK-32: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* {{@".str.[^"]+"}}, i32 0, i32 0),
// CHECK-32: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2CfETo{{(\.ptrauth)?}}" to i8*)
// CHECK-32: ptr @"\01L_selector_data(.cxx_destruct)",
// CHECK-32: ptr {{@".str.[^"]+"}},
// CHECK-32: ptr @"$s13objc_subclass11SwiftGizmo2CfETo{{(\.ptrauth)?}}"
// CHECK-32: }
// CHECK-32: ]
// CHECK-32: }, section "__DATA, {{.*}}", align 4
@@ -237,35 +231,35 @@
// CHECK-64: @_INSTANCE_METHODS__TtC13objc_subclass11SwiftGizmo2 = internal constant { i32, {{.*}}] } {
// CHECK-64: i32 24,
// CHECK-64: i32 5,
// CHECK-64: [5 x { i8*, i8*, i8* }] [
// CHECK-64: [5 x { ptr, ptr, ptr }] [
// CHECK-64: {
// CHECK-64: i8* getelementptr inbounds ([3 x i8], [3 x i8]* @"\01L_selector_data(sg)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.@16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvgTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(sg)",
// CHECK-64: ptr @".str.7.@16@0:8",
// CHECK-64: ptr @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvgTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_selector_data(setSg:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([11 x i8], [11 x i8]* [[SETTER_ENCODING]], i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvsTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(setSg:)",
// CHECK-64: ptr [[SETTER_ENCODING]],
// CHECK-64: ptr @"$s13objc_subclass11SwiftGizmo2C2sgAA0C5GizmoCvsTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"\01L_selector_data(init)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([8 x i8], [8 x i8]* @".str.7.@16@0:8", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2CACycfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(init)",
// CHECK-64: ptr @".str.7.@16@0:8",
// CHECK-64: ptr @"$s13objc_subclass11SwiftGizmo2CACycfcTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([17 x i8], [17 x i8]* @"\01L_selector_data(initWithBellsOn:)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([11 x i8], [11 x i8]* @".str.10.@24@0:8q16", i64 0, i64 0),
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2C7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(initWithBellsOn:)",
// CHECK-64: ptr @".str.10.@24@0:8q16",
// CHECK-64: ptr @"$s13objc_subclass11SwiftGizmo2C7bellsOnACSgSi_tcfcTo{{(\.ptrauth)?}}"
// CHECK-64: }, {
// CHECK-64: i8* getelementptr inbounds ([14 x i8], [14 x i8]* @"\01L_selector_data(.cxx_destruct)", i64 0, i64 0),
// CHECK-64: i8* getelementptr inbounds ([{{[0-9]+}} x i8], [{{[0-9]+}} x i8]* @".str.7.v16@0:8", i64 0, i64 0)
// CHECK-64: i8* bitcast ({{.*}}* @"$s13objc_subclass11SwiftGizmo2CfETo{{(\.ptrauth)?}}" to i8*)
// CHECK-64: ptr @"\01L_selector_data(.cxx_destruct)",
// CHECK-64: ptr @".str.7.v16@0:8",
// CHECK-64: ptr @"$s13objc_subclass11SwiftGizmo2CfETo{{(\.ptrauth)?}}"
// CHECK-64: }
// CHECK-64: ] }
// CHECK: @"objc_classes_$s13objc_subclass10SwiftGizmoCN" = internal global i8* bitcast (%swift.type* @"$s13objc_subclass10SwiftGizmoCN" to i8*), section "__DATA,__objc_classlist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
// CHECK: @"objc_classes_$s13objc_subclass11SwiftGizmo2CN" = internal global i8* bitcast (%swift.type* @"$s13objc_subclass11SwiftGizmo2CN" to i8*), section "__DATA,__objc_classlist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
// CHECK: @"objc_classes_$s13objc_subclass10SwiftGizmoCN" = internal global ptr @"$s13objc_subclass10SwiftGizmoCN", section "__DATA,__objc_classlist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
// CHECK: @"objc_classes_$s13objc_subclass11SwiftGizmo2CN" = internal global ptr @"$s13objc_subclass11SwiftGizmo2CN", section "__DATA,__objc_classlist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
// CHECK: @objc_non_lazy_classes = internal global [1 x i8*] [i8* bitcast (%swift.type* @"$s13objc_subclass11SwiftGizmo2CN" to i8*)], section "__DATA,__objc_nlclslist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
// CHECK: @objc_non_lazy_classes = internal global [1 x ptr] [ptr @"$s13objc_subclass11SwiftGizmo2CN"], section "__DATA,__objc_nlclslist,regular,no_dead_strip", no_sanitize_address, align [[WORD_SIZE_IN_BYTES]]
import Foundation
import gizmo

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -10,62 +9,56 @@
import gizmo
// CHECK: [[CLASS:%objc_class]] = type
// CHECK: [[HOOZIT:%T10objc_super6HoozitC]] = type
// CHECK: [[TYPE:%swift.type]] = type
// CHECK: [[PARTIAL_APPLY_CLASS:%T10objc_super12PartialApplyC]] = type
// CHECK: [[SUPER:%objc_super]] = type
// CHECK: [[OBJC:%objc_object]] = type
// CHECK: [[GIZMO:%TSo5GizmoC]] = type
// CHECK: [[NSRECT:%TSo6NSRectV]] = type
class Hoozit : Gizmo {
// CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC4frobyyF"([[HOOZIT]]* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC4frobyyF"(ptr swiftself %0) {{.*}} {
override func frob() {
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super6HoozitCMa"([[INT]] 0)
// CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[T1:%.*]] = bitcast %swift.type* [[T0]] to [[CLASS]]*
// CHECK: store [[CLASS]]* [[T1]], [[CLASS]]** {{.*}}, align 8
// CHECK: load i8*, i8** @"\01L_selector(frob)"
// CHECK: call void bitcast (void ()* @objc_msgSendSuper2 to void ([[SUPER]]*, i8*)*)([[SUPER]]* {{.*}}, i8* {{.*}})
// CHECK: store ptr [[T0]], ptr {{.*}}, align 8
// CHECK: load ptr, ptr @"\01L_selector(frob)"
// CHECK: call void @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
super.frob()
}
// CHECK: }
// CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC5runceyyFZ"(%swift.type* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s10objc_super6HoozitC5runceyyFZ"(ptr swiftself %0) {{.*}} {
override class func runce() {
// CHECK: store [[CLASS]]* @"OBJC_METACLASS_$__TtC10objc_super6Hoozit", [[CLASS]]** {{.*}}, align 8
// CHECK: load i8*, i8** @"\01L_selector(runce)"
// CHECK: call void bitcast (void ()* @objc_msgSendSuper2 to void ([[SUPER]]*, i8*)*)([[SUPER]]* {{.*}}, i8* {{.*}})
// CHECK: store ptr @"OBJC_METACLASS_$__TtC10objc_super6Hoozit", ptr {{.*}}, align 8
// CHECK: load ptr, ptr @"\01L_selector(runce)"
// CHECK: call void @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
super.runce()
}
// CHECK: }
// CHECK: define hidden swiftcc { double, double, double, double } @"$s10objc_super6HoozitC5frameSo6NSRectVyF"(%T10objc_super6HoozitC* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc { double, double, double, double } @"$s10objc_super6HoozitC5frameSo6NSRectVyF"(ptr swiftself %0) {{.*}} {
override func frame() -> NSRect {
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super6HoozitCMa"([[INT]] 0)
// CHECK: [[T0:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK: [[T1:%.*]] = bitcast %swift.type* [[T0]] to [[CLASS]]*
// CHECK: store [[CLASS]]* [[T1]], [[CLASS]]** {{.*}}, align 8
// CHECK: load i8*, i8** @"\01L_selector(frame)"
// CHECK: call void bitcast (void ()* @objc_msgSendSuper2_stret to void ([[NSRECT]]*, [[SUPER]]*, i8*)*)([[NSRECT]]* noalias nocapture sret({{.*}}) {{.*}}, [[SUPER]]* {{.*}}, i8* {{.*}})
// CHECK: store ptr [[T0]], ptr {{.*}}, align 8
// CHECK: load ptr, ptr @"\01L_selector(frame)"
// CHECK: call void @objc_msgSendSuper2_stret(ptr noalias nocapture sret({{.*}}) {{.*}}, ptr {{.*}}, ptr {{.*}})
return NSInsetRect(super.frame(), 2.0, 2.0)
}
// CHECK: }
// CHECK: define hidden swiftcc [[HOOZIT]]* @"$s10objc_super6HoozitC1xACSi_tcfc"(i64 %0, %T10objc_super6HoozitC* swiftself %1) {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s10objc_super6HoozitC1xACSi_tcfc"(i64 %0, ptr swiftself %1) {{.*}} {
init(x:Int) {
// CHECK: load i8*, i8** @"\01L_selector(init)"
// CHECK: call [[OPAQUE:.*]]* bitcast (void ()* @objc_msgSendSuper2 to [[OPAQUE:.*]]* (%objc_super*, i8*)*)([[SUPER]]* {{.*}}, i8* {{.*}})
// CHECK: load ptr, ptr @"\01L_selector(init)"
// CHECK: call ptr @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}})
// CHECK-NOT: @swift_dynamicCastClassUnconditional
// CHECK: ret
super.init()
}
// CHECK: }
// CHECK: define hidden swiftcc [[HOOZIT]]* @"$s10objc_super6HoozitC1yACSi_tcfc"(i64 %0, %T10objc_super6HoozitC* swiftself %1) {{.*}} {
// CHECK: define hidden swiftcc ptr @"$s10objc_super6HoozitC1yACSi_tcfc"(i64 %0, ptr swiftself %1) {{.*}} {
init(y:Int) {
// CHECK: load i8*, i8** @"\01L_selector(initWithBellsOn:)"
// CHECK: call [[OPAQUE:.*]]* bitcast (void ()* @objc_msgSendSuper2 to [[OPAQUE:.*]]* (%objc_super*, i8*, i64)*)([[SUPER]]* {{.*}}, i8* {{.*}}, i64 {{.*}})
// CHECK: load ptr, ptr @"\01L_selector(initWithBellsOn:)"
// CHECK: call ptr @objc_msgSendSuper2(ptr {{.*}}, ptr {{.*}}, i64 {{.*}})
// CHECK-NOT: swift_dynamicCastClassUnconditional
// CHECK: ret
super.init(bellsOn:y)
@@ -76,15 +69,15 @@ class Hoozit : Gizmo {
func acceptFn(_ fn: () -> Void) { }
class PartialApply : Gizmo {
// CHECK: define hidden swiftcc void @"$s10objc_super12PartialApplyC4frobyyF"([[PARTIAL_APPLY_CLASS]]* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s10objc_super12PartialApplyC4frobyyF"(ptr swiftself %0) {{.*}} {
override func frob() {
// CHECK: call swiftcc void @"$s10objc_super8acceptFnyyyyXEF"(i8* bitcast (void (%swift.refcounted*)* [[PARTIAL_FORWARDING_THUNK:@"\$[A-Za-z0-9_]+"]] to i8*), %swift.opaque* %{{[0-9]+}})
// CHECK: call swiftcc void @"$s10objc_super8acceptFnyyyyXEF"(ptr [[PARTIAL_FORWARDING_THUNK:@"\$[A-Za-z0-9_]+"]], ptr %{{[0-9]+}})
acceptFn(super.frob)
}
// CHECK: }
}
// CHECK: define internal swiftcc void @"$s10objc_super12PartialApplyC4frobyyFyycfu_"(%T10objc_super12PartialApplyC* %0)
// CHECK: define internal swiftcc void @"$s10objc_super12PartialApplyC4frobyyFyycfu_"(ptr %0)
// CHECK: call swiftcc %swift.metadata_response @"$s10objc_super12PartialApplyCMa"([[INT]] 0)
// CHECK: @"\01L_selector(frob)"
// CHECK: @objc_msgSendSuper2
@@ -97,46 +90,37 @@ class GenericRuncer<T> : Gizmo {
// Use a constant indirect field access instead of a non-constant direct
// access because the layout dependents on the alignment of y.
// CHECK: define hidden swiftcc i64 @"$s10objc_super13GenericRuncerC1xSo5GizmoCSgvg"(%T10objc_super13GenericRuncerC* swiftself %0)
// CHECK: define hidden swiftcc i64 @"$s10objc_super13GenericRuncerC1xSo5GizmoCSgvg"(ptr swiftself %0)
// CHECK: inttoptr
// CHECK: [[CAST:%.*]] = bitcast %T10objc_super13GenericRuncerC* %0 to i64*
// CHECK: [[ISA:%.*]] = load i64, i64* [[CAST]]
// CHECK: [[ISAMASK:%.*]] = load i64, i64* @swift_isaMask
// CHECK: [[ISA:%.*]] = load i64, ptr %0
// CHECK: [[ISAMASK:%.*]] = load i64, ptr @swift_isaMask
// CHECK: [[CLASS:%.*]] = and i64 [[ISA]], [[ISAMASK]]
// CHECK: [[TY:%.*]] = inttoptr i64 [[CLASS]] to %swift.type*
// CHECK: [[CAST:%.*]] = bitcast %swift.type* [[TY]] to i64*
// CHECK: [[OFFSETADDR:%.*]] = getelementptr inbounds i64, i64* [[CAST]], i64 11
// CHECK: [[FIELDOFFSET:%.*]] = load i64, i64* [[OFFSETADDR]]
// CHECK: [[BYTEADDR:%.*]] = bitcast %T10objc_super13GenericRuncerC* %0 to i8*
// CHECK: [[FIELDADDR:%.*]] = getelementptr inbounds i8, i8* [[BYTEADDR]], i64 [[FIELDOFFSET]]
// CHECK: [[XADDR:%.*]] = bitcast i8* [[FIELDADDR]] to %TSo5GizmoCSg*
// CHECK: [[OPTIONALADDR:%.*]] = bitcast %TSo5GizmoCSg* [[XADDR]] to i64*
// CHECK: [[OPTIONAL:%.*]] = load i64, i64* [[OPTIONALADDR]]
// CHECK: [[OBJ:%.*]] = inttoptr i64 [[OPTIONAL]] to %objc_object*
// CHECK: [[OBJ_CAST:%.*]] = bitcast %objc_object* [[OBJ]] to i8*
// CHECK: call i8* @llvm.objc.retain(i8* [[OBJ_CAST]])
// CHECK: [[TY:%.*]] = inttoptr i64 [[CLASS]] to ptr
// CHECK: [[OFFSETADDR:%.*]] = getelementptr inbounds i64, ptr [[TY]], i64 11
// CHECK: [[FIELDOFFSET:%.*]] = load i64, ptr [[OFFSETADDR]]
// CHECK: [[FIELDADDR:%.*]] = getelementptr inbounds i8, ptr %0, i64 [[FIELDOFFSET]]
// CHECK: [[OPTIONAL:%.*]] = load i64, ptr [[FIELDADDR]]
// CHECK: [[OBJ:%.*]] = inttoptr i64 [[OPTIONAL]] to ptr
// CHECK: call ptr @llvm.objc.retain(ptr [[OBJ]])
// CHECK: ret i64 [[OPTIONAL]]
// CHECK: define hidden swiftcc void @"$s10objc_super13GenericRuncerC5runceyyFZ"(%swift.type* swiftself %0) {{.*}} {
// CHECK: define hidden swiftcc void @"$s10objc_super13GenericRuncerC5runceyyFZ"(ptr swiftself %0) {{.*}} {
override class func runce() {
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super13GenericRuncerCMa"([[INT]] 0, %swift.type* %T)
// CHECK: [[TMP:%.*]] = call swiftcc %swift.metadata_response @"$s10objc_super13GenericRuncerCMa"([[INT]] 0, ptr %T)
// CHECK-NEXT: [[CLASS:%.*]] = extractvalue %swift.metadata_response [[TMP]], 0
// CHECK-NEXT: [[CLASS1:%.*]] = bitcast %swift.type* [[CLASS]] to %objc_class*
// CHECK-NEXT: [[CLASS2:%.*]] = bitcast %objc_class* [[CLASS1]] to i64*
// CHECK-NEXT: [[ISA:%.*]] = load i64, i64* [[CLASS2]], align 8
// CHECK-NEXT: [[ISA_MASK:%.*]] = load i64, i64* @swift_isaMask, align 8
// CHECK-NEXT: [[ISA:%.*]] = load i64, ptr [[CLASS]], align 8
// CHECK-NEXT: [[ISA_MASK:%.*]] = load i64, ptr @swift_isaMask, align 8
// CHECK-NEXT: [[ISA_MASKED:%.*]] = and i64 [[ISA]], [[ISA_MASK]]
// CHECK-NEXT: [[ISA_PTR:%.*]] = inttoptr i64 [[ISA_MASKED]] to %swift.type*
// CHECK-NEXT: [[METACLASS:%.*]] = bitcast %swift.type* [[ISA_PTR]] to %objc_class*
// CHECK: [[METACLASS_ADDR:%.*]] = getelementptr inbounds %objc_super, %objc_super* %objc_super, i32 0, i32 1
// CHECK-NEXT: store %objc_class* [[METACLASS]], %objc_class** [[METACLASS_ADDR]], align 8
// CHECK-NEXT: [[SELECTOR:%.*]] = load i8*, i8** @"\01L_selector(runce)", align 8
// CHECK-NEXT: call void bitcast (void ()* @objc_msgSendSuper2 to void (%objc_super*, i8*)*)(%objc_super* %objc_super, i8* [[SELECTOR]])
// CHECK-NEXT: [[ISA_PTR:%.*]] = inttoptr i64 [[ISA_MASKED]] to ptr
// CHECK: [[METACLASS_ADDR:%.*]] = getelementptr inbounds %objc_super, ptr %objc_super, i32 0, i32 1
// CHECK-NEXT: store ptr [[ISA_PTR]], ptr [[METACLASS_ADDR]], align 8
// CHECK-NEXT: [[SELECTOR:%.*]] = load ptr, ptr @"\01L_selector(runce)", align 8
// CHECK-NEXT: call void @objc_msgSendSuper2(ptr %objc_super, ptr [[SELECTOR]])
// CHECK-NEXT: ret void
super.runce()
}
}
// CHECK: define internal swiftcc void [[PARTIAL_FORWARDING_THUNK]](%swift.refcounted* swiftself %0) {{.*}} {
// CHECK: define internal swiftcc void [[PARTIAL_FORWARDING_THUNK]](ptr swiftself %0) {{.*}} {
// CHECK: @"$ss12StaticStringV14withUTF8BufferyxxSRys5UInt8VGXElFxAFXEfU_yt_Tgq5"
// CHECK: }

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple | %FileCheck %s -check-prefix=CHECK-%target-os
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir -disable-objc-attr-requires-foundation-module -target %target-swift-abi-5.8-triple | %FileCheck %s -check-prefix=CHECK-%target-os
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -173,14 +172,14 @@ import gizmo
@objc func getRawEnumInGizmo() -> RawEnumInGizmo {
return InGizmoTwo
}
// CHECK-macosx: { i8* getelementptr inbounds ([18 x i8], [18 x i8]* @"\01L_selector_data(getRawEnumInGizmo)", i64 0, i64 0),
// CHECK-macosx: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[ENUMENCODING]], i64 0, i64 0)
// CHECK-ios: { i8* getelementptr inbounds ([18 x i8], [18 x i8]* @"\01L_selector_data(getRawEnumInGizmo)", i64 0, i64 0),
// CHECK-ios: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[ENUMENCODING]], i64 0, i64 0)
// CHECK-tvos: { i8* getelementptr inbounds ([18 x i8], [18 x i8]* @"\01L_selector_data(getRawEnumInGizmo)", i64 0, i64 0),
// CHECK-tvos: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[ENUMENCODING]], i64 0, i64 0)
// CHECK-watchos: { i8* getelementptr inbounds ([18 x i8], [18 x i8]* @"\01L_selector_data(getRawEnumInGizmo)", i64 0, i64 0),
// CHECK-watchos: i8* getelementptr inbounds ([8 x i8], [8 x i8]* [[ENUMENCODING]], i64 0, i64 0)
// CHECK-macosx: { ptr @"\01L_selector_data(getRawEnumInGizmo)",
// CHECK-macosx: ptr [[ENUMENCODING]]
// CHECK-ios: { ptr @"\01L_selector_data(getRawEnumInGizmo)",
// CHECK-ios: ptr [[ENUMENCODING]]
// CHECK-tvos: { ptr @"\01L_selector_data(getRawEnumInGizmo)",
// CHECK-tvos: ptr [[ENUMENCODING]]
// CHECK-watchos: { ptr @"\01L_selector_data(getRawEnumInGizmo)",
// CHECK-watchos: ptr [[ENUMENCODING]]
}
@@ -200,22 +199,22 @@ import gizmo
// CHECK-macosx: [[ENC2:@.*]] = private unnamed_addr constant [46 x i8] c"v32@0:8@\22Gizmo\2216@?<v@?@\22NSView\22@\22NSSpoon\22>24\00"
// CHECK-macosx: [[ENC3:@.*]] = private unnamed_addr constant [53 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject\2216\00"
// CHECK-macosx: [[ENC4:@.*]] = private unnamed_addr constant [75 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject<NSFunging><NSRuncing>\2216\00"
// CHECK-macosx: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x i8*] [i8* getelementptr inbounds ([35 x i8], [35 x i8]* [[ENC1]], i64 0, i64 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* [[ENC2]], i64 0, i64 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* [[ENC3]], i64 0, i64 0), i8* getelementptr inbounds ([75 x i8], [75 x i8]* [[ENC4]], i64 0, i64 0)]
// CHECK-macosx: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x ptr] [ptr [[ENC1]], ptr [[ENC2]], ptr [[ENC3]], ptr [[ENC4]]]
// CHECK-ios: [[ENC1:@.*]] = private unnamed_addr constant [35 x i8] c"v24@0:8@\22<NSFunging><NSRuncing>\2216\00"
// CHECK-ios: [[ENC2:@.*]] = private unnamed_addr constant [46 x i8] c"v32@0:8@\22Gizmo\2216@?<v@?@\22NSView\22@\22NSSpoon\22>24\00"
// CHECK-ios: [[ENC3:@.*]] = private unnamed_addr constant [53 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject\2216\00"
// CHECK-ios: [[ENC4:@.*]] = private unnamed_addr constant [75 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject<NSFunging><NSRuncing>\2216\00"
// CHECK-ios: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x i8*] [i8* getelementptr inbounds ([35 x i8], [35 x i8]* [[ENC1]], i64 0, i64 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* [[ENC2]], i64 0, i64 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* [[ENC3]], i64 0, i64 0), i8* getelementptr inbounds ([75 x i8], [75 x i8]* [[ENC4]], i64 0, i64 0)]
// CHECK-ios: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x ptr] [ptr [[ENC1]], ptr [[ENC2]], ptr [[ENC3]], ptr [[ENC4]]]
// CHECK-tvos: [[ENC1:@.*]] = private unnamed_addr constant [35 x i8] c"v24@0:8@\22<NSFunging><NSRuncing>\2216\00"
// CHECK-tvos: [[ENC2:@.*]] = private unnamed_addr constant [46 x i8] c"v32@0:8@\22Gizmo\2216@?<v@?@\22NSView\22@\22NSSpoon\22>24\00"
// CHECK-tvos: [[ENC3:@.*]] = private unnamed_addr constant [53 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject\2216\00"
// CHECK-tvos: [[ENC4:@.*]] = private unnamed_addr constant [75 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject<NSFunging><NSRuncing>\2216\00"
// CHECK-tvos: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x i8*] [i8* getelementptr inbounds ([35 x i8], [35 x i8]* [[ENC1]], i64 0, i64 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* [[ENC2]], i64 0, i64 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* [[ENC3]], i64 0, i64 0), i8* getelementptr inbounds ([75 x i8], [75 x i8]* [[ENC4]], i64 0, i64 0)]
// CHECK-tvos: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x ptr] [ptr [[ENC1]], ptr [[ENC2]], ptr [[ENC3]], ptr [[ENC4]]]
// CHECK-watchos: [[ENC1:@.*]] = private unnamed_addr constant [35 x i8] c"v24@0:8@\22<NSFunging><NSRuncing>\2216\00"
// CHECK-watchos: [[ENC2:@.*]] = private unnamed_addr constant [46 x i8] c"v32@0:8@\22Gizmo\2216@?<v@?@\22NSView\22@\22NSSpoon\22>24\00"
// CHECK-watchos: [[ENC3:@.*]] = private unnamed_addr constant [53 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject\2216\00"
// CHECK-watchos: [[ENC4:@.*]] = private unnamed_addr constant [75 x i8] c"v24@0:8@\22_TtC18objc_type_encoding14MyCustomObject<NSFunging><NSRuncing>\2216\00"
// CHECK-watchos: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x i8*] [i8* getelementptr inbounds ([35 x i8], [35 x i8]* [[ENC1]], i64 0, i64 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* [[ENC2]], i64 0, i64 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* [[ENC3]], i64 0, i64 0), i8* getelementptr inbounds ([75 x i8], [75 x i8]* [[ENC4]], i64 0, i64 0)]
// CHECK-watchos: @_PROTOCOL_METHOD_TYPES__TtP18objc_type_encoding10MyProtocol_ = weak hidden constant [4 x ptr] [ptr [[ENC1]], ptr [[ENC2]], ptr [[ENC3]], ptr [[ENC4]]]
class C: P {
func stuff() {}

View File

@@ -1,6 +1,5 @@
// RUN: %target-sil-opt -enable-sil-verify-all %s -pack-metadata-marker-inserter -enable-pack-metadata-stack-promotion=true | %FileCheck %s --check-prefixes CHECK-SIL
// RUN: %target-swift-frontend %use_no_opaque_pointers -parse-sil -emit-ir -primary-file %s -enable-pack-metadata-stack-promotion=false -enable-pack-metadata-stack-promotion=true | %IRGenFileCheck %s --check-prefixes CHECK-LLVM
// RUN: %target-swift-frontend -parse-sil -emit-ir -primary-file %s -enable-pack-metadata-stack-promotion=false -enable-pack-metadata-stack-promotion=true
// RUN: %target-swift-frontend -parse-sil -emit-ir -primary-file %s -enable-pack-metadata-stack-promotion=false -enable-pack-metadata-stack-promotion=true | %IRGenFileCheck %s --check-prefixes CHECK-LLVM
// REQUIRES: asserts
@@ -81,10 +80,10 @@ entry:
// CHECK-SIL-LABEL: } // end sil function 'forward_type_pack'
// CHECK-LLVM-LABEL: define{{.*}} @forward_type_pack(
// CHECK-LLVM-SAME: [[INT]] [[SHAPE:%[^,]+]],
// CHECK-LLVM-SAME: %swift.type** [[PACK:%[^,]+]]) {{.*}} {
// CHECK-LLVM-SAME: ptr [[PACK:%[^,]+]]) {{.*}} {
// CHECK-LLVM: call swiftcc void @takeTypePack(
// CHECK-LLVM-SAME: [[INT]] [[SHAPE]],
// CHECK-LLVM-SAME: %swift.type** [[PACK]])
// CHECK-LLVM-SAME: ptr [[PACK]])
// CHECK-LLVM: }
sil @forward_type_pack : $<each T>() -> () {
%take = function_ref @takeTypePack : $@convention(thin) <each T>() -> ()
@@ -103,13 +102,11 @@ sil @forward_type_pack : $<each T>() -> () {
// CHECK-SIL: dealloc_pack_metadata [[MARKER]]
// CHECK-SIL-LABEL: } // end sil function 'apply_with_variadic_generic_instance'
// CHECK-LLVM-LABEL: define{{.*}} @apply_with_variadic_generic_instance{{.*}} {
// CHECK-LLVM: [[PACK_ADDR:%[^,]+]] = alloca [3 x %swift.type*]
// CHECK-LLVM: [[LIFETIME_START_CAST:%[^,]+]] = bitcast [3 x %swift.type*]* [[PACK_ADDR]] to i8*
// CHECK-LLVM: call void @llvm.lifetime.start.p0i8(
// CHECK-LLVM-SAME: i8* [[LIFETIME_START_CAST]])
// CHECK-LLVM: [[LIFETIME_END_CAST:%[^,]+]] = bitcast [3 x %swift.type*]* [[PACK_ADDR]] to i8*
// CHECK-LLVM: call void @llvm.lifetime.end.p0i8(
// CHECK-LLVM-SAME: i8* [[LIFETIME_END_CAST]])
// CHECK-LLVM: [[PACK_ADDR:%[^,]+]] = alloca [3 x ptr]
// CHECK-LLVM: call void @llvm.lifetime.start.p0(
// CHECK-LLVM-SAME: ptr [[PACK_ADDR]])
// CHECK-LLVM: call void @llvm.lifetime.end.p0(
// CHECK-LLVM-SAME: ptr [[PACK_ADDR]])
// CHECK-LLVM: ret void
// CHECK-LLVM: }
sil @apply_with_variadic_generic_instance : $<T>(@in GV<T, S2, S3>) -> () {

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir
// RUN: %target-swift-frontend %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=x86_64
@@ -38,9 +37,8 @@ var x = seq ~> split
// Indirect return
//
// CHECK-LABEL: define internal swiftcc { i8*, %swift.refcounted* } @"$s21partial_apply_generic5split{{[_0-9a-zA-Z]*}}FTA"(%T21partial_apply_generic5SpoonV* noalias nocapture %0, %swift.refcounted* swiftself %1)
// CHECK: [[REABSTRACT:%.*]] = bitcast %T21partial_apply_generic5SpoonV* %0 to %swift.opaque*
// CHECK: tail call swiftcc { i8*, %swift.refcounted* } @"$s21partial_apply_generic5split{{[_0-9a-zA-Z]*}}F"(%swift.opaque* noalias nocapture [[REABSTRACT]],
// CHECK-LABEL: define internal swiftcc { ptr, ptr } @"$s21partial_apply_generic5split{{[_0-9a-zA-Z]*}}FTA"(ptr noalias nocapture %0, ptr swiftself %1)
// CHECK: tail call swiftcc { ptr, ptr } @"$s21partial_apply_generic5split{{[_0-9a-zA-Z]*}}F"(ptr noalias nocapture %0,
struct HugeStruct { var a, b, c, d: Int }
struct S {
@@ -49,7 +47,7 @@ struct S {
let s = S()
var y = s.hugeStructReturn
// CHECK-LABEL: define internal swiftcc { i64, i64, i64, i64 } @"$s21partial_apply_genericAA10HugeStructVACcAA1SVcfu_A2Ccfu0_TA"(i64 %0, i64 %1, i64 %2, i64 %3, %swift.refcounted* swiftself %4)
// CHECK-LABEL: define internal swiftcc { i64, i64, i64, i64 } @"$s21partial_apply_genericAA10HugeStructVACcAA1SVcfu_A2Ccfu0_TA"(i64 %0, i64 %1, i64 %2, i64 %3, ptr swiftself %4)
// CHECK: entry:
// CHECK: call swiftcc { i64, i64, i64, i64 } @"$s21partial_apply_genericAA10HugeStructVACcAA1SVcfu_A2Ccfu0_"(i64 %0, i64 %1, i64 %2, i64 %3)
// CHECK: }

View File

@@ -1,7 +1,6 @@
// RUN: %empty-directory(%t)
// RUN: %build-irgen-test-overlays
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %use_no_opaque_pointers %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir -disable-objc-attr-requires-foundation-module
// RUN: %target-swift-frontend(mock-sdk: -sdk %S/Inputs -I %t) %s -emit-ir -disable-objc-attr-requires-foundation-module | %FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-%target-ptrsize
// REQUIRES: CPU=x86_64
// REQUIRES: objc_interop
@@ -49,32 +48,27 @@ bb0(%0 : $ObjCClass):
return %0 : $ObjCClass
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @indirect_partial_apply(i8* %0, %swift.refcounted* %1, i64 %2) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @indirect_partial_apply(ptr %0, ptr %1, i64 %2) {{.*}} {
// CHECK: entry:
// CHECK: [[T0:%.*]] = bitcast i8* %0 to void (i64, %swift.refcounted*)*
// CHECK: [[OBJ:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* getelementptr inbounds (%swift.full_boxmetadata, %swift.full_boxmetadata* @metadata, i32 0, i32 2), i64 40, i64 7)
// CHECK: [[DATA_ADDR:%.*]] = bitcast %swift.refcounted* [[OBJ]] to [[DATA_TYPE:<{ %swift.refcounted, i64, %swift.refcounted\*, i8\* }>]]*
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 1
// CHECK: store i64 %2, i64* [[X_ADDR]], align 8
// CHECK: [[CONTEXT_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 2
// CHECK: store %swift.refcounted* %1, %swift.refcounted** [[CONTEXT_ADDR]], align 8
// CHECK: [[FN_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 3
// CHECK: [[CAST_FN:%.*]] = bitcast void (i64, %swift.refcounted*)* [[T0]] to i8*
// CHECK: store i8* [[CAST_FN]], i8** [[FN_ADDR]], align 8
// CHECK: [[RET:%.*]] = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (void (%swift.refcounted*)* [[INDIRECT_PARTIAL_APPLY_STUB:@"\$sTA[A-Za-z0-9_]*"]] to i8*), %swift.refcounted* undef }, %swift.refcounted* [[OBJ]], 1
// CHECK: ret { i8*, %swift.refcounted* } [[RET]]
// CHECK: [[OBJ:%.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata, ptr @metadata, i32 0, i32 2), i64 40, i64 7)
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE:<{ %swift.refcounted, i64, ptr, ptr }>]], ptr [[OBJ]], i32 0, i32 1
// CHECK: store i64 %2, ptr [[X_ADDR]], align 8
// CHECK: [[CONTEXT_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr [[OBJ]], i32 0, i32 2
// CHECK: store ptr %1, ptr [[CONTEXT_ADDR]], align 8
// CHECK: [[FN_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr [[OBJ]], i32 0, i32 3
// CHECK: store ptr %0, ptr [[FN_ADDR]], align 8
// CHECK: [[RET:%.*]] = insertvalue { ptr, ptr } { ptr [[INDIRECT_PARTIAL_APPLY_STUB:@"\$sTA[A-Za-z0-9_]*"]], ptr undef }, ptr [[OBJ]], 1
// CHECK: ret { ptr, ptr } [[RET]]
// CHECK: }
// CHECK: define internal swiftcc void [[INDIRECT_PARTIAL_APPLY_STUB]](%swift.refcounted* swiftself %0) {{.*}} {
// CHECK: define internal swiftcc void [[INDIRECT_PARTIAL_APPLY_STUB]](ptr swiftself %0) {{.*}} {
// CHECK: entry:
// CHECK: [[DATA_ADDR:%.*]] = bitcast %swift.refcounted* %0 to [[DATA_TYPE]]
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* %1, i32 0, i32 1
// CHECK: [[X:%.*]] = load i64, i64* [[X_ADDR]], align 8
// CHECK: [[CONTEXT_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 2
// CHECK: [[CONTEXT:%.*]] = load %swift.refcounted*, %swift.refcounted** [[CONTEXT_ADDR]], align 8
// CHECK: [[FN_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 3
// CHECK: [[FN_PTR:%.*]] = load i8*, i8** [[FN_ADDR]], align 8
// CHECK: [[FN:%.*]] = bitcast i8* [[FN_PTR]] to void (i64, %swift.refcounted*)*
// CHECK: tail call swiftcc void [[FN]](i64 [[X]], %swift.refcounted* swiftself [[CONTEXT]])
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr %0, i32 0, i32 1
// CHECK: [[X:%.*]] = load i64, ptr [[X_ADDR]], align 8
// CHECK: [[CONTEXT_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr %0, i32 0, i32 2
// CHECK: [[CONTEXT:%.*]] = load ptr, ptr [[CONTEXT_ADDR]], align 8
// CHECK: [[FN_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr %0, i32 0, i32 3
// CHECK: [[FN_PTR:%.*]] = load ptr, ptr [[FN_ADDR]], align 8
// CHECK: tail call swiftcc void [[FN_PTR]](i64 [[X]], ptr swiftself [[CONTEXT]])
// CHECK: ret void
// CHECK: }
@@ -84,28 +78,25 @@ entry(%f : $@callee_owned (Builtin.Word) -> (), %x : $Builtin.Word):
return %p : $@callee_owned () -> ()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @objc_partial_apply(%T18partial_apply_objc9ObjCClassC* %0) {{.*}} {
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @objc_partial_apply(ptr %0) {{.*}} {
// CHECK: entry:
// CHECK: [[OBJ:%.*]] = call noalias %swift.refcounted* @swift_allocObject(%swift.type* getelementptr inbounds (%swift.full_boxmetadata, %swift.full_boxmetadata* @metadata.2, i32 0, i32 2), i64 24, i64 7)
// CHECK: [[DATA_ADDR:%.*]] = bitcast %swift.refcounted* [[OBJ]] to [[DATA_TYPE:<{ %swift.refcounted, %T18partial_apply_objc9ObjCClassC\* }>]]*
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 1
// CHECK: store %T18partial_apply_objc9ObjCClassC* %0, %T18partial_apply_objc9ObjCClassC** [[X_ADDR]], align 8
// CHECK: [[RET:%.*]] = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (void (i64, %swift.refcounted*)* [[OBJC_PARTIAL_APPLY_STUB:@"\$sTa[A-Za-z0-9_]*"]] to i8*), %swift.refcounted* undef }, %swift.refcounted* [[OBJ]], 1
// CHECK: ret { i8*, %swift.refcounted* } [[RET]]
// CHECK: [[OBJ:%.*]] = call noalias ptr @swift_allocObject(ptr getelementptr inbounds (%swift.full_boxmetadata, ptr @metadata.2, i32 0, i32 2), i64 24, i64 7)
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE:<{ %swift.refcounted, ptr }>]], ptr [[OBJ]], i32 0, i32 1
// CHECK: store ptr %0, ptr [[X_ADDR]], align 8
// CHECK: [[RET:%.*]] = insertvalue { ptr, ptr } { ptr [[OBJC_PARTIAL_APPLY_STUB:@"\$sTa[A-Za-z0-9_]*"]], ptr undef }, ptr [[OBJ]], 1
// CHECK: ret { ptr, ptr } [[RET]]
// CHECK: }
// CHECK: define internal swiftcc void [[OBJC_PARTIAL_APPLY_STUB]](i64 %0, %swift.refcounted* swiftself %1) {{.*}} {
// CHECK: define internal swiftcc void [[OBJC_PARTIAL_APPLY_STUB]](i64 %0, ptr swiftself %1) {{.*}} {
// CHECK: entry:
// CHECK-NOT: swift_retain
// CHECK: [[DATA_ADDR:%.*]] = bitcast %swift.refcounted* %1 to [[DATA_TYPE]]*
// CHECK-NOT: swift_retain
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 1
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], ptr %1, i32 0, i32 1
// CHECK-NOT: swift_retain
// CHECK: [[SELF:%.*]] = load %T18partial_apply_objc9ObjCClassC*, %T18partial_apply_objc9ObjCClassC** [[X_ADDR]], align 8
// CHECK: [[SELF:%.*]] = load ptr, ptr [[X_ADDR]], align 8
// CHECK-NOT: swift_retain
// CHECK: [[CMD:%.*]] = load i8*, i8** @"\01L_selector(methodWithX:)", align 8
// CHECK: [[I8PTRSELF:%.*]] = bitcast %T18partial_apply_objc9ObjCClassC* [[SELF]] to [[OPAQUE0:%.*]]*
// CHECK: [[CMD:%.*]] = load ptr, ptr @"\01L_selector(methodWithX:)", align 8
// CHECK-NOT: swift_retain
// CHECK: call void bitcast (void ()* @objc_msgSend to void ([[OPAQUE2:%.*]]*, i8*, i64)*)([[OPAQUE2]]* [[I8PTRSELF]], i8* [[CMD]], i64 %0)
// CHECK: call void @objc_msgSend(ptr [[SELF]], ptr [[CMD]], i64 %0)
// CHECK: ret void
// CHECK: }
@@ -116,20 +107,19 @@ entry(%c : $ObjCClass):
return %p : $@callee_owned (Int) -> ()
}
// CHECK-LABEL: define{{.*}} { i8*, %swift.refcounted* } @objc_partial_apply_indirect_sil_argument(%T18partial_apply_objc9ObjCClassC* %0) {{.*}}
// CHECK: [[CTX:%.*]] = call noalias %swift.refcounted* @swift_allocObject
// CHECK: [[CTX_ADDR:%.*]] = bitcast %swift.refcounted* [[CTX]] to [[CTXTYPE:<{ %swift.refcounted, %T18partial_apply_objc9ObjCClassC\* }>]]*
// CHECK: [[SELF_ADDR:%.*]] = getelementptr inbounds [[CTXTYPE]], [[CTXTYPE]]* [[CTX_ADDR]], i32 0, i32 1
// CHECK: store %T18partial_apply_objc9ObjCClassC* %0, %T18partial_apply_objc9ObjCClassC** [[SELF_ADDR]]
// CHECK: [[CLOSURE:%.*]] = insertvalue { i8*, %swift.refcounted* } { i8* bitcast (void (double, double, double, double, %swift.refcounted*)* [[OBJC_PARTIAL_APPLY_STUB2:@"\$sTa[A-Za-z0-9_.]*"]] to i8*), %swift.refcounted* undef }, %swift.refcounted* [[CTX]], 1
// CHECK: ret { i8*, %swift.refcounted* } [[CLOSURE]]
// CHECK-LABEL: define{{.*}} { ptr, ptr } @objc_partial_apply_indirect_sil_argument(ptr %0) {{.*}}
// CHECK: [[CTX:%.*]] = call noalias ptr @swift_allocObject
// CHECK: [[SELF_ADDR:%.*]] = getelementptr inbounds [[CTXTYPE:<{ %swift.refcounted, ptr }>]], ptr [[CTX]], i32 0, i32 1
// CHECK: store ptr %0, ptr [[SELF_ADDR]]
// CHECK: [[CLOSURE:%.*]] = insertvalue { ptr, ptr } { ptr [[OBJC_PARTIAL_APPLY_STUB2:@"\$sTa[A-Za-z0-9_.]*"]], ptr undef }, ptr [[CTX]], 1
// CHECK: ret { ptr, ptr } [[CLOSURE]]
// CHECK:}
// CHECK: define internal swiftcc void [[OBJC_PARTIAL_APPLY_STUB2]](double %0, double %1, double %2, double %3, %swift.refcounted*
// CHECK: define internal swiftcc void [[OBJC_PARTIAL_APPLY_STUB2]](double %0, double %1, double %2, double %3, ptr
// CHECK: [[TMP:%.*]] = alloca %TSo6NSRectV
// CHECK: [[ORIGIN:%.*]] = getelementptr inbounds %TSo6NSRectV, %TSo6NSRectV* [[TMP]]
// CHECK: [[ORIGINX:%.*]] = getelementptr inbounds %TSo7NSPointV, %TSo7NSPointV* [[ORIGIN]]
// CHECK: [[ORIGINXVAL:%*]] = getelementptr inbounds %TSd, %TSd* [[ORIGINX]]
// CHECK: store double %0, double* [[ORIGINXVAL]]
// CHECK: [[ORIGIN:%.*]] = getelementptr inbounds %TSo6NSRectV, ptr [[TMP]]
// CHECK: [[ORIGINX:%.*]] = getelementptr inbounds %TSo7NSPointV, ptr [[ORIGIN]]
// CHECK: [[ORIGINXVAL:%*]] = getelementptr inbounds %TSd, ptr [[ORIGINX]]
// CHECK: store double %0, ptr [[ORIGINXVAL]]
sil @objc_partial_apply_indirect_sil_argument : $@convention(thin) (ObjCClass) -> @callee_owned (NSRect) -> () {
entry(%c : $ObjCClass):
%m = objc_method %c : $ObjCClass, #ObjCClass.method2!foreign : (ObjCClass) -> (NSRect) -> (), $@convention(objc_method) (NSRect, ObjCClass) -> ()
@@ -137,20 +127,16 @@ entry(%c : $ObjCClass):
return %p : $@callee_owned (NSRect) -> ()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @objc_partial_apply_consumes_self(%T18partial_apply_objc9ObjCClassC* %0) {{.*}} {
// CHECK: bitcast %swift.refcounted* {{%.*}} to [[DATA_TYPE:<{ %swift.refcounted, %T18partial_apply_objc9ObjCClassC\* }>]]*
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @objc_partial_apply_consumes_self(ptr %0) {{.*}} {
// CHECK: insertvalue {{.*}} [[OBJC_CONSUMES_SELF_PARTIAL_APPLY_STUB:@"\$sTa[A-Za-z0-9_.]*"]]
// CHECK: define internal swiftcc %T18partial_apply_objc9ObjCClassC* [[OBJC_CONSUMES_SELF_PARTIAL_APPLY_STUB]](%swift.refcounted* swiftself %0) {{.*}} {
// CHECK: [[DATA_ADDR:%.*]] = bitcast %swift.refcounted* %0 to [[DATA_TYPE]]*
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE]], [[DATA_TYPE]]* [[DATA_ADDR]], i32 0, i32 1
// CHECK: [[SELF:%.*]] = load %T18partial_apply_objc9ObjCClassC*, %T18partial_apply_objc9ObjCClassC** [[X_ADDR]], align 8
// CHECK: [[T0:%.*]] = bitcast %T18partial_apply_objc9ObjCClassC* [[SELF]] to i8*
// CHECK: call i8* @llvm.objc.retain(i8* [[T0]])
// CHECK: [[CMD:%.*]] = load i8*, i8** @"\01L_selector(fakeInitFamily)", align 8
// CHECK: [[I8PTRSELF:%.*]] = bitcast %T18partial_apply_objc9ObjCClassC* [[SELF]] to [[OPAQUE4:%.*]]*
// CHECK: call [[OPAQUE3:%.*]]* bitcast (void ()* @objc_msgSend to [[OPAQUE3]]* ([[OPAQUE4:%.*]]*, i8*)*)([[OPAQUE4]]* [[I8PTRSELF]], i8* [[CMD]])
// CHECK: define internal swiftcc ptr [[OBJC_CONSUMES_SELF_PARTIAL_APPLY_STUB]](ptr swiftself %0) {{.*}} {
// CHECK: [[X_ADDR:%.*]] = getelementptr inbounds [[DATA_TYPE:<{ %swift.refcounted, ptr }>]], ptr %0, i32 0, i32 1
// CHECK: [[SELF:%.*]] = load ptr, ptr [[X_ADDR]], align 8
// CHECK: call ptr @llvm.objc.retain(ptr [[SELF]])
// CHECK: [[CMD:%.*]] = load ptr, ptr @"\01L_selector(fakeInitFamily)", align 8
// CHECK: call ptr @objc_msgSend(ptr [[SELF]], ptr [[CMD]])
// CHECK-NOT: release
// CHECK: call void @swift_release(%swift.refcounted* %0)
// CHECK: call void @swift_release(ptr %0)
// CHECK-NOT: release
// CHECK: ret void
// CHECK: }
@@ -168,10 +154,10 @@ entry(%x : $Int):
return %v : $()
}
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @dynamic_lookup_br_partial_apply(%objc_object* %0) {{.*}} {
// CHECK: phi i8* [ bitcast (void (i64)* @dummy to i8*), {{%.*}} ], [ bitcast (void (i64, %swift.refcounted*)* [[DYNAMIC_LOOKUP_BR_PARTIAL_APPLY_STUB:@"\$sTa[A-Za-z0-9_.]*"]] to i8*), {{%.*}} ]
// CHECK: define internal swiftcc void [[DYNAMIC_LOOKUP_BR_PARTIAL_APPLY_STUB]](i64 %0, %swift.refcounted* swiftself %1) {{.*}} {
// CHECK: load i8*, i8** @"\01L_selector(methodWithX:)", align 8
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @dynamic_lookup_br_partial_apply(ptr %0) {{.*}} {
// CHECK: phi ptr [ @dummy, {{%.*}} ], [ [[DYNAMIC_LOOKUP_BR_PARTIAL_APPLY_STUB:@"\$sTa[A-Za-z0-9_.]*"]], {{%.*}} ]
// CHECK: define internal swiftcc void [[DYNAMIC_LOOKUP_BR_PARTIAL_APPLY_STUB]](i64 %0, ptr swiftself %1) {{.*}} {
// CHECK: load ptr, ptr @"\01L_selector(methodWithX:)", align 8
sil @dynamic_lookup_br_partial_apply : $@convention(thin) (Builtin.AnyObject) -> @callee_owned (Int) -> () {
entry(%o : $Builtin.AnyObject):
@@ -192,7 +178,7 @@ done(%f : $@callee_owned (Int) -> ()):
sil @partially_applyable_to_pure_objc : $@convention(thin) (Gizmo) -> ()
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc { i8*, %swift.refcounted* } @partial_apply_pure_objc
// CHECK: define{{( dllexport)?}}{{( protected)?}} swiftcc { ptr, ptr } @partial_apply_pure_objc
// CHECK: @swift_allocObject
sil @partial_apply_pure_objc : $@convention(thin) (Gizmo) -> @callee_owned () -> () {
entry(%c : $Gizmo):
@@ -201,15 +187,15 @@ entry(%c : $Gizmo):
return %g : $@callee_owned () -> ()
}
// CHECK: define internal swiftcc void @"$sTa.17"(i64 %0, i64 %1, i64 %2, %swift.refcounted* swiftself %3)
// CHECK: define internal swiftcc void @"$sTa.17"(i64 %0, i64 %1, i64 %2, ptr swiftself %3)
// CHECK: [[TMPCOERCE:%.*]] = alloca { i64, i64, i64 }
// CHECK: [[INDIRECTTEMP:%.*]] = alloca %TSo3FobV
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64 }, { i64, i64, i64 }* [[TMPCOERCE]], i32 0, i32 0
// CHECK: store i64 %0, i64* [[ADDR]]
// CHECK: [[ADDR:%.]] = getelementptr inbounds { i64, i64, i64 }, { i64, i64, i64 }* [[TMPCOERCE]], i32 0, i32 1
// CHECK: store i64 %1, i64* [[ADDR]]
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64 }, { i64, i64, i64 }* [[TMPCOERCE]], i32 0, i32 2
// CHECK: store i64 %2, i64* [[ADDR]]
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64 }, ptr [[TMPCOERCE]], i32 0, i32 0
// CHECK: store i64 %0, ptr [[ADDR]]
// CHECK: [[ADDR:%.]] = getelementptr inbounds { i64, i64, i64 }, ptr [[TMPCOERCE]], i32 0, i32 1
// CHECK: store i64 %1, ptr [[ADDR]]
// CHECK: [[ADDR:%.*]] = getelementptr inbounds { i64, i64, i64 }, ptr [[TMPCOERCE]], i32 0, i32 2
// CHECK: store i64 %2, ptr [[ADDR]]
// CHECK: load i64
// CHECK: load i32
// CHECK: load i32
@@ -241,7 +227,7 @@ entry(%c : $ObjCClass):
return %p : $@callee_guaranteed (Int) -> ()
}
// CHECK-LABEL: define {{.*}}swiftcc void @"$sTa.20"(i64 %0, %swift.refcounted* swiftself %1)
// CHECK-LABEL: define {{.*}}swiftcc void @"$sTa.20"(i64 %0, ptr swiftself %1)
// CHECK: entry:
// CHECK-NOT: retain
// CHECK-NOT: release
@@ -264,7 +250,7 @@ entry(%c : $Gizmo):
return %p : $@callee_guaranteed (Fob) -> ()
}
// CHECK-LABEL: define {{.*}}swiftcc void @"$sTa.23"(i64 %0, i64 %1, i64 %2, %swift.refcounted* swiftself %3)
// CHECK-LABEL: define {{.*}}swiftcc void @"$sTa.23"(i64 %0, i64 %1, i64 %2, ptr swiftself %3)
// CHECK: entry:
// CHECK-NOT: retain
// CHECK-NOT: release

View File

@@ -1,5 +1,4 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s -DINT=i%target-ptrsize
// RUN: %target-swift-frontend -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop
// RUN: %target-swift-frontend -primary-file %s -emit-ir -disable-objc-attr-requires-foundation-module -enable-objc-interop | %FileCheck %s -DINT=i%target-ptrsize
// REQUIRES: PTRSIZE=64
// UNSUPPORTED: CPU=arm64e
@@ -62,7 +61,7 @@ protocol ABO : A, B, O { func abo() }
// CHECK-SAME: }
// -- @objc protocol OPT uses ObjC symbol mangling and layout
// CHECK: @_PROTOCOL__TtP17protocol_metadata3OPT_ = weak hidden constant { {{.*}} i32, [4 x i8*]*, i8*, i8* } {
// CHECK: @_PROTOCOL__TtP17protocol_metadata3OPT_ = weak hidden constant { {{.*}} i32, ptr, ptr, ptr } {
// CHECK-SAME: @_PROTOCOL_INSTANCE_METHODS_OPT__TtP17protocol_metadata3OPT_,
// CHECK-SAME: @_PROTOCOL_CLASS_METHODS_OPT__TtP17protocol_metadata3OPT_,
// -- size, flags: 1 = Swift
@@ -106,7 +105,7 @@ protocol Comprehensive {
// CHECK-SAME: i32 1
// CHECK-SAME: i32 11,
// CHECK-SAME: i32 trunc
// CHECK-SAME: [6 x i8]* [[COMPREHENSIVE_ASSOC_NAME]]
// CHECK-SAME: ptr [[COMPREHENSIVE_ASSOC_NAME]]
// CHECK-SAME: %swift.protocol_requirement { i32 8, i32 0 },
// CHECK-SAME: %swift.protocol_requirement { i32 7, i32 0 },
// CHECK-SAME: %swift.protocol_requirement { i32 2, i32 0 },

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -8,11 +7,11 @@ import Builtin
// CHECK: [[VOID_BLOCK_SIGNATURE:@.*]] = private unnamed_addr constant {{.*}} c"v8@?0\00"
// CHECK: [[TRIVIAL_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } { i64 0, i64 40, i8* getelementptr inbounds ({{.*}} [[VOID_BLOCK_SIGNATURE]], i64 0, i64 0) }
// CHECK: [[TRIVIAL_BLOCK_DESCRIPTOR:@.*]] = internal constant { {{.*}} } { i64 0, i64 40, ptr [[VOID_BLOCK_SIGNATURE]] }
// CHECK: @block_copy_helper.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast ({{.*}}* @block_copy_helper to i8*), i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR:@.*]], i32 0, i32 2) to i64), i64 0 }, section "llvm.ptrauth"
// CHECK: @block_destroy_helper.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast ({{.*}}* @block_destroy_helper to i8*), i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR:@.*]], i32 0, i32 3) to i64), i64 0 }, section "llvm.ptrauth"
// CHECK: [[NONTRIVIAL_BLOCK_DESCRIPTOR]] = internal constant { {{.*}} } { i64 0, i64 40, void ({ %objc_block, %swift.refcounted* }*, {{.*}} bitcast ({{.*}} @block_copy_helper.ptrauth to {{.*}}), {{.*}} bitcast ({{.*}} @block_destroy_helper.ptrauth to {{.*}}), i8* getelementptr inbounds ({{.*}} [[VOID_BLOCK_SIGNATURE]], i64 0, i64 0) }
// CHECK: @block_copy_helper.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @block_copy_helper, i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR:@.*]], i32 0, i32 2) to i64), i64 0 }, section "llvm.ptrauth"
// CHECK: @block_destroy_helper.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @block_destroy_helper, i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR:@.*]], i32 0, i32 3) to i64), i64 0 }, section "llvm.ptrauth"
// CHECK: [[NONTRIVIAL_BLOCK_DESCRIPTOR]] = internal constant { {{.*}} } { i64 0, i64 40, ptr @block_copy_helper.ptrauth, {{.*}} @block_destroy_helper.ptrauth, ptr [[VOID_BLOCK_SIGNATURE]] }
sil @init_header_trivial : $@convention(thin) (@inout_aliasable @block_storage Builtin.RawPointer) -> @convention(block) () -> () {
entry(%0 : $*@block_storage Builtin.RawPointer):
@@ -20,15 +19,15 @@ entry(%0 : $*@block_storage Builtin.RawPointer):
%b = init_block_storage_header %0 : $*@block_storage Builtin.RawPointer, invoke %i : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer) -> (), type $@convention(block) () -> ()
return %b : $@convention(block) () -> ()
}
// CHECK-LABEL: define swiftcc %objc_block* @init_header_trivial({ %objc_block, i8* }*
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, i8* }, { %objc_block, i8* }* %0, i32 0, i32 0
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (void (void (...)*)* @invoke_trivial to i64), i32 0, i64 [[T0]])
// CHECK: [[T0:%.*]] = inttoptr i64 [[SIGNED]] to i8*
// CHECK: store i8* [[T0]], i8** [[SLOT]],
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 4
// CHECK: store i8* bitcast ({{.*}} [[TRIVIAL_BLOCK_DESCRIPTOR]] to i8*), i8** [[SLOT]]
// CHECK-LABEL: define swiftcc ptr @init_header_trivial(ptr
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr @invoke_trivial to i64), i32 0, i64 [[T0]])
// CHECK: [[T0:%.*]] = inttoptr i64 [[SIGNED]] to ptr
// CHECK: store ptr [[T0]], ptr [[SLOT]],
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 4
// CHECK: store ptr [[TRIVIAL_BLOCK_DESCRIPTOR]], ptr [[SLOT]]
sil @invoke_trivial : $@convention(c) (@inout_aliasable @block_storage Builtin.RawPointer) -> () {
entry(%0 : $*@block_storage Builtin.RawPointer):
@@ -42,15 +41,15 @@ entry(%0 : $*@block_storage Builtin.NativeObject):
%b = init_block_storage_header %0 : $*@block_storage Builtin.NativeObject, invoke %i : $@convention(c) (@inout_aliasable @block_storage Builtin.NativeObject) -> (), type $@convention(block) () -> ()
return %b : $@convention(block) () -> ()
}
// CHECK-LABEL: define swiftcc %objc_block* @init_header_nontrivial({ %objc_block, %swift.refcounted* }*
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, %swift.refcounted* }, { %objc_block, %swift.refcounted* }* %0, i32 0, i32 0
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (void (void (...)*)* @invoke_nontrivial to i64), i32 0, i64 [[T0]])
// CHECK: [[T0:%.*]] = inttoptr i64 [[SIGNED]] to i8*
// CHECK: store i8* [[T0]], i8** [[SLOT]],
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, %objc_block* [[HEADER]], i32 0, i32 4
// CHECK: store i8* bitcast ({{.*}} [[NONTRIVIAL_BLOCK_DESCRIPTOR]] to i8*), i8** [[SLOT]]
// CHECK-LABEL: define swiftcc ptr @init_header_nontrivial(ptr
// CHECK: [[HEADER:%.*]] = getelementptr inbounds { %objc_block, ptr }, ptr %0, i32 0, i32 0
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 ptrtoint (ptr @invoke_nontrivial to i64), i32 0, i64 [[T0]])
// CHECK: [[T0:%.*]] = inttoptr i64 [[SIGNED]] to ptr
// CHECK: store ptr [[T0]], ptr [[SLOT]],
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, ptr [[HEADER]], i32 0, i32 4
// CHECK: store ptr [[NONTRIVIAL_BLOCK_DESCRIPTOR]], ptr [[SLOT]]
sil @invoke_nontrivial : $@convention(c) (@inout_aliasable @block_storage Builtin.NativeObject) -> () {
entry(%0 : $*@block_storage Builtin.NativeObject):
@@ -63,9 +62,8 @@ entry(%0 : $@convention(block) () -> ()):
apply %0() : $@convention(block) () -> ()
return undef : $()
}
// CHECK-LABEL: define swiftcc void @invoke_block(%objc_block* %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, %objc_block* %0, i32 0, i32 3
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[INVOKE:%.*]] = bitcast i8* [[T0]] to void (%objc_block*)*
// CHECK-NEXT: [[DISC:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: call void [[INVOKE]](%objc_block* %0) [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-LABEL: define swiftcc void @invoke_block(ptr %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds %objc_block, ptr %0, i32 0, i32 3
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[DISC:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: call void [[T0]](ptr %0) [ "ptrauth"(i32 0, i64 [[DISC]]) ]

View File

@@ -1,15 +1,14 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import Builtin
// CHECK: @"$s4test1ACfD.ptrauth" = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%T4test1AC*)* @"$s4test1ACfD" to i8*), i32 0, i64 ptrtoint ({{.*}} @"$s4test1ACMf", i32 0, i32 1) to i64), i64 48063 }, section "llvm.ptrauth", align 8
// CHECK: @A_foo.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%T4test1AC*)* @A_foo to i8*), i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} @"$s4test1ACMf", i32 0, i32 {{.*}}) to i64), i64 23008 }, section "llvm.ptrauth", align 8
// CHECK: @"$s4test1BCfD.ptrauth" = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%T4test1BC*)* @"$s4test1BCfD" to i8*), i32 0, i64 ptrtoint ({{.*}} @"$s4test1BCMf", i32 0, i32 1) to i64), i64 48063 }, section "llvm.ptrauth", align 8
// CHECK: @B_foo.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%T4test1BC*)* @B_foo to i8*), i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} @"$s4test1BCMf", i32 0, i32 {{.*}}) to i64), i64 23008 }, section "llvm.ptrauth", align 8
// CHECK: @"$s4test1ACfD.ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"$s4test1ACfD", i32 0, i64 ptrtoint ({{.*}} @"$s4test1ACMf", i32 0, i32 1) to i64), i64 48063 }, section "llvm.ptrauth", align 8
// CHECK: @A_foo.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @A_foo, i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} @"$s4test1ACMf", i32 0, i32 {{.*}}) to i64), i64 23008 }, section "llvm.ptrauth", align 8
// CHECK: @"$s4test1BCfD.ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"$s4test1BCfD", i32 0, i64 ptrtoint ({{.*}} @"$s4test1BCMf", i32 0, i32 1) to i64), i64 48063 }, section "llvm.ptrauth", align 8
// CHECK: @B_foo.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @B_foo, i32 0, i64 ptrtoint ({{.*}} getelementptr inbounds ({{.*}} @"$s4test1BCMf", i32 0, i32 {{.*}}) to i64), i64 23008 }, section "llvm.ptrauth", align 8
// CHECK: @"$s4test1GCMn" =
// -1212481520 == 0xb7bb0010. 0xb7bb == 47035.
@@ -54,16 +53,14 @@ bb0(%0 : $A):
%2 = apply %1(%0) : $@convention(method) (@guaranteed A) -> ()
return %2 : $()
}
// CHECK-LABEL: define swiftcc void @test_call_a(%T4test1AC* %0)
// CHECK: [[T0:%.*]] = bitcast %T4test1AC* %0 to %swift.type**
// CHECK-NEXT: [[META:%.*]] = load %swift.type*, %swift.type** [[T0]], align
// CHECK-NEXT: [[T0:%.*]] = bitcast %swift.type* [[META]] to void (%T4test1AC*)**
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds void (%T4test1AC*)*, void (%T4test1AC*)** [[T0]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load void (%T4test1AC*)*, void (%T4test1AC*)** [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint void (%T4test1AC*)** [[SLOT]] to i64
// CHECK-LABEL: define swiftcc void @test_call_a(ptr %0)
// CHECK: [[META:%.*]] = load ptr, ptr %0, align
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[META]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load ptr, ptr [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// Discriminator value is arbitrary, but must be the same as the next test.
// CHECK-NEXT: [[DISCRIMINATOR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 23008)
// CHECK-NEXT: call swiftcc void [[FN]](%T4test1AC* swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: call swiftcc void [[FN]](ptr swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: ret void
sil @test_call_b : $@convention(thin) (@guaranteed B) -> () {
@@ -72,16 +69,14 @@ bb0(%0 : $B):
%2 = apply %1(%0) : $@convention(method) (@guaranteed B) -> ()
return %2 : $()
}
// CHECK-LABEL: define swiftcc void @test_call_b(%T4test1BC* %0)
// CHECK: [[T0:%.*]] = bitcast %T4test1BC* %0 to %swift.type**
// CHECK-NEXT: [[META:%.*]] = load %swift.type*, %swift.type** [[T0]], align
// CHECK-NEXT: [[T0:%.*]] = bitcast %swift.type* [[META]] to void (%T4test1BC*)**
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds void (%T4test1BC*)*, void (%T4test1BC*)** [[T0]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load void (%T4test1BC*)*, void (%T4test1BC*)** [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint void (%T4test1BC*)** [[SLOT]] to i64
// CHECK-LABEL: define swiftcc void @test_call_b(ptr %0)
// CHECK: [[META:%.*]] = load ptr, ptr %0, align
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[META]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load ptr, ptr [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// Discriminator value is arbitrary, but must be the same as the previous test.
// CHECK-NEXT: [[DISCRIMINATOR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 23008)
// CHECK-NEXT: call swiftcc void [[FN]](%T4test1BC* swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: call swiftcc void [[FN]](ptr swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: ret void
sil @test_call_g : $@convention(thin) <T> (@guaranteed G<T>) -> () {
@@ -90,15 +85,13 @@ bb0(%0 : $G<T>):
%2 = apply %1<T>(%0) : $@convention(method) <t> (@guaranteed G<t>) -> ()
return %2 : $()
}
// CHECK-LABEL: define swiftcc void @test_call_g(%T4test1GC* %0)
// CHECK: [[T0:%.*]] = bitcast %T4test1GC* %0 to %swift.type**
// CHECK: [[T0:%.*]] = bitcast %T4test1GC* %0 to %swift.type**
// CHECK-NEXT: [[META:%.*]] = load %swift.type*, %swift.type** [[T0]], align
// CHECK-NEXT: [[T0:%.*]] = bitcast %swift.type* [[META]] to void (%T4test1GC*)**
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds void (%T4test1GC*)*, void (%T4test1GC*)** [[T0]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load void (%T4test1GC*)*, void (%T4test1GC*)** [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint void (%T4test1GC*)** [[SLOT]] to i64
// CHECK-LABEL: define swiftcc void @test_call_g(ptr %0)
// CHECK: load
// CHECK: [[META:%.*]] = load ptr, ptr %0, align
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[META]], i64 {{.*}}
// CHECK-NEXT: [[FN:%.*]] = load ptr, ptr [[SLOT]]
// CHECK-NEXT: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// Discriminator value is arbitrary, but must be the same as the previous test.
// CHECK-NEXT: [[DISCRIMINATOR:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 47035)
// CHECK-NEXT: call swiftcc void [[FN]](%T4test1GC* swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: call swiftcc void [[FN]](ptr swiftself %0) [ "ptrauth"(i32 0, i64 [[DISCRIMINATOR]]) ]
// CHECK-NEXT: ret void

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -14,9 +13,9 @@ struct S {}
class B : A<S> {}
sil_vtable B {}
// CHECK-LABEL: define internal %swift.type* @"$s4test1ACMi"(%swift.type_descriptor* %0, i8** %1, i8* %2)
// CHECK: [[INT:%.*]] = ptrtoint %swift.type_descriptor* %0 to i64
// CHECK-LABEL: define internal ptr @"$s4test1ACMi"(ptr %0, ptr %1, ptr %2)
// CHECK: [[INT:%.*]] = ptrtoint ptr %0 to i64
// CHECK: [[SIGNED:%.*]] = call i64 @llvm.ptrauth.sign(i64 [[INT]], i32 2, i64 44678)
// CHECK: [[PTR:%.*]] = inttoptr i64 [[SIGNED]] to %swift.type_descriptor*
// CHECK: [[METADATA:%.*]] = call %swift.type* @swift_allocateGenericClassMetadata(%swift.type_descriptor* [[PTR]], i8** %1, i8* %2)
// CHECK: ret %swift.type* [[METADATA]]
// CHECK: [[PTR:%.*]] = inttoptr i64 [[SIGNED]] to ptr
// CHECK: [[METADATA:%.*]] = call ptr @swift_allocateGenericClassMetadata(ptr [[PTR]], ptr %1, ptr %2)
// CHECK: ret ptr [[METADATA]]

View File

@@ -1,31 +1,30 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers %s -emit-ir -disable-objc-interop -module-name A | %FileCheck %s
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop -module-name A
// RUN: %target-swift-frontend %s -emit-ir -disable-objc-interop -module-name A | %FileCheck %s
// REQUIRES: objc_interop
// REQUIRES: CPU=arm64e
// CHECK: @test_dynamically_replaceableTX = global %swift.dyn_repl_link_entry { i8*{{.*}} @test_dynamically_replaceable.ptrauth to i8*), %swift.dyn_repl_link_entry* null }
// CHECK: @test_dynamically_replaceable.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void ()* @test_dynamically_replaceable to i8*), i32 0, i64 ptrtoint (%swift.dyn_repl_link_entry* @test_dynamically_replaceableTX to i64), i64 679 }, section "llvm.ptrauth"
// CHECK: @test_dynamically_replaceableTx = constant %swift.dyn_repl_key { i32 trunc ([[INTPTR:i[0-9]+]] sub ([[INTPTR]] ptrtoint (%swift.dyn_repl_link_entry* @test_dynamically_replaceableTX to [[INTPTR]]), [[INTPTR]] ptrtoint (%swift.dyn_repl_key* @test_dynamically_replaceableTx to [[INTPTR]])) to i32), i32 679 }, section "__TEXT,__const"
// CHECK: @test_dynamically_replaceableTX = global %swift.dyn_repl_link_entry { ptr{{.*}} @test_dynamically_replaceable.ptrauth, ptr null }
// CHECK: @test_dynamically_replaceable.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @test_dynamically_replaceable, i32 0, i64 ptrtoint (ptr @test_dynamically_replaceableTX to i64), i64 679 }, section "llvm.ptrauth"
// CHECK: @test_dynamically_replaceableTx = constant %swift.dyn_repl_key { i32 trunc ([[INTPTR:i[0-9]+]] sub ([[INTPTR]] ptrtoint (ptr @test_dynamically_replaceableTX to [[INTPTR]]), [[INTPTR]] ptrtoint (ptr @test_dynamically_replaceableTx to [[INTPTR]])) to i32), i32 679 }, section "__TEXT,__const"
// CHECK: @test_replacementTX = global %swift.dyn_repl_link_entry zeroinitializer
// CHECK: @test_replacement_for_externalTX = global %swift.dyn_repl_link_entry zeroinitializer
// CHECK: @external_test_dynamically_replaceableTx = external global %swift.dyn_repl_key
// CHECK: @got.external_test_dynamically_replaceableTx = private unnamed_addr constant %swift.dyn_repl_key* bitcast ({ i8*, i32, i64, i64 }* @external_test_dynamically_replaceableTx.ptrauth to %swift.dyn_repl_key*)
// CHECK: @external_test_dynamically_replaceableTx.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (%swift.dyn_repl_key* @external_test_dynamically_replaceableTx to i8*), i32 2, i64 ptrtoint (%swift.dyn_repl_key** @got.external_test_dynamically_replaceableTx to i64), i64 11389 }, section "llvm.ptrauth"
// CHECK: @got.external_test_dynamically_replaceableTx = private unnamed_addr constant ptr @external_test_dynamically_replaceableTx.ptrauth
// CHECK: @external_test_dynamically_replaceableTx.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @external_test_dynamically_replaceableTx, i32 2, i64 ptrtoint (ptr @got.external_test_dynamically_replaceableTx to i64), i64 11389 }, section "llvm.ptrauth"
// CHECK: @"\01l_unnamed_dynamic_replacements" = private constant { i32, i32, [2 x { i32, i32, i32, i32 }] }
// CHECK: { i32 0,
// CHECK: i32 2,
// CHECK: [2 x { i32, i32, i32, i32 }]
// CHECK: [{ i32, i32, i32, i32 }
// CHECK: %swift.dyn_repl_key* @test_dynamically_replaceableTx
// CHECK: ptr @test_dynamically_replaceableTx
// CHECK: @test_replacement
// CHECK: %swift.dyn_repl_link_entry* @test_replacementTX
// CHECK: ptr @test_replacementTX
// CHECK: i32 0 },
// CHECK: { i32, i32, i32, i32 }
// CHECK: %swift.dyn_repl_key** @got.external_test_dynamically_replaceableTx
// CHECK: ptr @got.external_test_dynamically_replaceableTx
// CHECK: @test_replacement_for_external
// CHECK: %swift.dyn_repl_link_entry* @test_replacement_for_externalTX
// CHECK: ptr @test_replacement_for_externalTX
// CHECK: i32 0 }] }, section "__TEXT,__const"
// CHECK: @"\01l_auto_dynamic_replacements" = private constant { i32, i32, [2 x i32] }
@@ -35,13 +34,12 @@
// CHECK-LABEL: define swiftcc void @test_dynamically_replaceable()
// CHECK-NEXT: entry:
// CHECK-NEXT: [[FUN_PTR:%.*]] = call i8* @swift_getFunctionReplacement{{.*}}({{.*}} getelementptr {{.*}} @test_dynamically_replaceableTX, i32 0, i32 0
// CHECK-NEXT: [[CMP:%.*]] = icmp eq i8* [[FUN_PTR]], null
// CHECK-NEXT: [[FUN_PTR:%.*]] = call ptr @swift_getFunctionReplacement{{.*}}({{.*}} @test_dynamically_replaceableTX
// CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[FUN_PTR]], null
// CHECK-NEXT: br i1 [[CMP]], label %original_entry, label %forward_to_replaced
// CHECK: forward_to_replaced:
// CHECK-NEXT: [[TYPED_PTR:%.*]] = bitcast i8* [[FUN_PTR]] to void ()*
// CHECK-NEXT: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (%swift.dyn_repl_link_entry* @test_dynamically_replaceableTX to i64), i64 679)
// CHECK-NEXT: tail call swiftcc void [[TYPED_PTR]]() [ "ptrauth"(i32 0, i64 [[BLEND]]) ]
// CHECK-NEXT: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @test_dynamically_replaceableTX to i64), i64 679)
// CHECK-NEXT: tail call swiftcc void [[FUN_PTR]]() [ "ptrauth"(i32 0, i64 [[BLEND]]) ]
// CHECK-NEXT: ret void
// CHECK: original_entry:
// CHECK-NEXT: ret void
@@ -62,10 +60,9 @@ bb0:
// The thunk that implement the prev_dynamic_function_ref lookup.
// CHECK-LABEL: define swiftcc void @test_replacementTI()
// CHECK: entry:
// CHECK: [[FUN_PTR:%.*]] = call i8* @swift_getOrigOfReplaceable{{.*}}({{.*}} getelementptr {{.*}} @test_replacementTX, i32 0, i32 0
// CHECK: [[TYPED_PTR:%.*]] = bitcast i8* [[FUN_PTR]] to void ()*
// CHECK-NEXT: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (%swift.dyn_repl_link_entry* @test_replacementTX to i64), i64 679)
// CHECK-NEXT: call swiftcc void [[TYPED_PTR]]() [ "ptrauth"(i32 0, i64 [[BLEND]]) ]
// CHECK: [[FUN_PTR:%.*]] = call ptr @swift_getOrigOfReplaceable{{.*}}({{.*}} @test_replacementTX
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @test_replacementTX to i64), i64 679)
// CHECK-NEXT: call swiftcc void [[FUN_PTR]]() [ "ptrauth"(i32 0, i64 [[BLEND]]) ]
// CHECK: ret void
// CHECK: }
sil [dynamic_replacement_for "test_dynamically_replaceable"] @test_replacement : $@convention(thin) () -> () {

View File

@@ -1,17 +1,16 @@
// RUN: %target-swift-frontend %use_no_opaque_pointers -disable-availability-checking -module-name A -swift-version 5 -primary-file %s -emit-ir | %FileCheck %s
// RUN: %target-swift-frontend -disable-availability-checking -module-name A -swift-version 5 -primary-file %s -emit-ir
// RUN: %target-swift-frontend -disable-availability-checking -module-name A -swift-version 5 -primary-file %s -emit-ir | %FileCheck %s
// REQUIRES: CPU=arm64e
// CHECK: @"$s1A3baryQrSiFQOMk" = global %swift.dyn_repl_link_entry { {{.*}}@"$s1A3baryQrSiFQOMh.ptrauth" to i8*), %swift.dyn_repl_link_entry* null }
// CHECK: @"$s1A3baryQrSiFQOMh.ptrauth" = private constant { i8*, i32, i64, i64 } { {{.*}}@"$s1A3baryQrSiFQOMh" to i8*), i32 0, i64 ptrtoint (%swift.dyn_repl_link_entry* @"$s1A3baryQrSiFQOMk" to i64), i64 44678 }, section "llvm.ptrauth"
// CHECK: @"$s1A3baryQrSiFQOMj" = constant %swift.dyn_repl_key { {{.*}}%swift.dyn_repl_link_entry* @"$s1A3baryQrSiFQOMk"{{.*}}, i32 44678 }, section "__TEXT,__const"
// CHECK: @"$s1A3baryQrSiFQOMk" = global %swift.dyn_repl_link_entry { {{.*}}@"$s1A3baryQrSiFQOMh.ptrauth", ptr null }
// CHECK: @"$s1A3baryQrSiFQOMh.ptrauth" = private constant { ptr, i32, i64, i64 } { {{.*}}@"$s1A3baryQrSiFQOMh", i32 0, i64 ptrtoint (ptr @"$s1A3baryQrSiFQOMk" to i64), i64 44678 }, section "llvm.ptrauth"
// CHECK: @"$s1A3baryQrSiFQOMj" = constant %swift.dyn_repl_key { {{.*}}ptr @"$s1A3baryQrSiFQOMk"{{.*}}, i32 44678 }, section "__TEXT,__const"
// CHECK: @"$s1A16_replacement_bar1yQrSi_tFQOMk" = global %swift.dyn_repl_link_entry zeroinitializer
// CHECK: @"\01l_unnamed_dynamic_replacements" =
// CHECK: private constant { i32, i32, [2 x { i32, i32, i32, i32 }] }
// CHECK: { i32 0, i32 2, [2 x { i32, i32, i32, i32 }] [
// CHECK: { i32, i32, i32, i32 } { {{.*}}%swift.dyn_repl_key* @"$s1A3baryQrSiFTx"{{.*}}@"$s1A16_replacement_bar1yQrSi_tF"{{.*}}%swift.dyn_repl_link_entry* @"$s1A16_replacement_bar1yQrSi_tFTX"{{.*}}, i32 0 },
// CHECK: { i32, i32, i32, i32 } { {{.*}}%swift.dyn_repl_key* @"$s1A3baryQrSiFQOMj"{{.*}},{{.*}}@"$s1A16_replacement_bar1yQrSi_tFQOMg"{{.*}},{{.*}}@"$s1A16_replacement_bar1yQrSi_tFQOMk"{{.*}}, i32 0 }] }, section "__TEXT,__const", no_sanitize_address, align 8
// CHECK: { i32, i32, i32, i32 } { {{.*}}ptr @"$s1A3baryQrSiFTx"{{.*}}@"$s1A16_replacement_bar1yQrSi_tF"{{.*}}ptr @"$s1A16_replacement_bar1yQrSi_tFTX"{{.*}}, i32 0 },
// CHECK: { i32, i32, i32, i32 } { {{.*}}ptr @"$s1A3baryQrSiFQOMj"{{.*}},{{.*}}@"$s1A16_replacement_bar1yQrSi_tFQOMg"{{.*}},{{.*}}@"$s1A16_replacement_bar1yQrSi_tFQOMk"{{.*}}, i32 0 }] }, section "__TEXT,__const", no_sanitize_address, align 8
public protocol P {
func myValue() -> Int
@@ -23,19 +22,18 @@ extension Int: P {
}
}
// Opaque result type descriptor accessor for bar.
// CHECK-LABEL: define swiftcc %swift.type_descriptor* @"$s1A3baryQrSiFQOMg"()
// CHECK-LABEL: define swiftcc ptr @"$s1A3baryQrSiFQOMg"()
// CHECK: entry:
// CHECK: %0 = load i8*, i8** getelementptr inbounds (%swift.dyn_repl_link_entry, %swift.dyn_repl_link_entry* @"$s1A3baryQrSiFQOMk", i32 0, i32 0)
// CHECK: %1 = bitcast i8* %0 to %swift.type_descriptor* ()*
// CHECK: %2 = call i64 @llvm.ptrauth.blend(i64 ptrtoint (%swift.dyn_repl_link_entry* @"$s1A3baryQrSiFQOMk" to i64), i64 44678)
// CHECK: %3 = tail call swiftcc %swift.type_descriptor* %1() [ "ptrauth"(i32 0, i64 %2) ]
// CHECK: ret %swift.type_descriptor* %3
// CHECK: %0 = load ptr, ptr @"$s1A3baryQrSiFQOMk"
// CHECK: %1 = call i64 @llvm.ptrauth.blend(i64 ptrtoint (ptr @"$s1A3baryQrSiFQOMk" to i64), i64 44678)
// CHECK: %2 = tail call swiftcc ptr %0() [ "ptrauth"(i32 0, i64 %1) ]
// CHECK: ret ptr %2
// CHECK: }
// Opaque result type descriptor accessor impl.
// CHECK-LABEL: define swiftcc %swift.type_descriptor* @"$s1A3baryQrSiFQOMh"()
// CHECK-LABEL: define swiftcc ptr @"$s1A3baryQrSiFQOMh"()
// CHECK: entry:
// CHECK: ret %swift.type_descriptor* bitcast ({{.*}}* @"$s1A3baryQrSiFQOMQ" to %swift.type_descriptor*)
// CHECK: ret ptr @"$s1A3baryQrSiFQOMQ"
// CHECK: }
public dynamic func bar(_ x: Int) -> some P {
@@ -50,9 +48,9 @@ struct Pair : P {
}
}
// Opaque result type descriptor accessor for _replacement_bar.
// CHECK: define swiftcc %swift.type_descriptor* @"$s1A16_replacement_bar1yQrSi_tFQOMg"()
// CHECK: define swiftcc ptr @"$s1A16_replacement_bar1yQrSi_tFQOMg"()
// CHECK: entry:
// CHECK: ret %swift.type_descriptor* bitcast ({{.*}} @"$s1A16_replacement_bar1yQrSi_tFQOMQ" to %swift.type_descriptor*)
// CHECK: ret ptr @"$s1A16_replacement_bar1yQrSi_tFQOMQ"
// CHECK: }
@_dynamicReplacement(for:bar(_:))
public func _replacement_bar(y x: Int) -> some P {

View File

@@ -1,12 +1,11 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import Builtin
// CHECK: @global_function.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void ()* @global_function to i8*), i32 0, i64 0, i64 {{.*}} }, section "llvm.ptrauth", align 8
// CHECK: @global_function.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @global_function, i32 0, i64 0, i64 {{.*}} }, section "llvm.ptrauth", align 8
sil @global_function : $@convention(thin) () -> ()
@@ -15,8 +14,8 @@ bb0:
%0 = function_ref @global_function : $@convention(thin) () -> ()
return %0 : $@convention(thin) () -> ()
}
// CHECK-LABEL: define swiftcc i8* @test_sign()
// CHECK: ret i8* bitcast ({ i8*, i32, i64, i64 }* @global_function.ptrauth to i8*)
// CHECK-LABEL: define swiftcc ptr @test_sign()
// CHECK: ret ptr @global_function.ptrauth
sil @test_direct_call : $@convention(thin) () -> () {
bb0:
@@ -32,27 +31,24 @@ bb0(%0 : $@convention(thin) () -> ()):
%1 = apply %0() : $@convention(thin) () -> ()
return %1 : $()
}
// CHECK-LABEL: define swiftcc void @test_indirect_call_thin(i8* %0)
// CHECK: [[CAST:%.*]] = bitcast i8* %0 to void ()*
// CHECK-NEXT: call swiftcc void [[CAST]]() [ "ptrauth"(i32 0, i64 {{.*}}) ]
// CHECK-LABEL: define swiftcc void @test_indirect_call_thin(ptr %0)
// CHECK: call swiftcc void %0() [ "ptrauth"(i32 0, i64 {{.*}}) ]
sil @test_indirect_call_thick : $@convention(thin) (@guaranteed @callee_guaranteed () -> ()) -> () {
bb0(%0 : $@callee_guaranteed () -> ()):
%1 = apply %0() : $@callee_guaranteed () -> ()
return %1 : $()
}
// CHECK-LABEL: define swiftcc void @test_indirect_call_thick(i8* %0, %swift.refcounted* %1)
// CHECK: [[CAST:%.*]] = bitcast i8* %0 to void (%swift.refcounted*)*
// CHECK-NEXT: call swiftcc void [[CAST]](%swift.refcounted* swiftself %1) [ "ptrauth"(i32 0, i64 {{.*}}) ]
// CHECK-LABEL: define swiftcc void @test_indirect_call_thick(ptr %0, ptr %1)
// CHECK: call swiftcc void %0(ptr swiftself %1) [ "ptrauth"(i32 0, i64 {{.*}}) ]
sil @test_indirect_call_c : $@convention(thin) (@convention(c) () -> ()) -> () {
bb0(%0 : $@convention(c) () -> ()):
%1 = apply %0() : $@convention(c) () -> ()
return %1 : $()
}
// CHECK-LABEL: define swiftcc void @test_indirect_call_c(i8* %0)
// CHECK: [[CAST:%.*]] = bitcast i8* %0 to void ()*
// CHECK-NEXT: call void [[CAST]]() [ "ptrauth"(i32 0, i64 {{.*}}) ]
// CHECK-LABEL: define swiftcc void @test_indirect_call_c(ptr %0)
// CHECK: call void %0() [ "ptrauth"(i32 0, i64 {{.*}}) ]
sil @test_thin_to_thick : $@convention(thin) (@convention(thin) () -> ()) -> (@callee_guaranteed () -> ()) {
bb0(%0 : $@convention(thin) () -> ()):
@@ -60,10 +56,10 @@ bb0(%0 : $@convention(thin) () -> ()):
return %1 : $@callee_guaranteed () -> ()
}
// CHECK-LABEL: define swiftcc { i8*, %swift.refcounted* } @test_thin_to_thick(i8* %0)
// CHECK: [[T0:%.*]] = insertvalue { i8*, %swift.refcounted* } undef, i8* %0, 0
// CHECK-NEXT: [[T1:%.*]] = insertvalue { i8*, %swift.refcounted* } [[T0]], %swift.refcounted* null, 1
// CHECK-NEXT: ret { i8*, %swift.refcounted* } [[T1]]
// CHECK-LABEL: define swiftcc { ptr, ptr } @test_thin_to_thick(ptr %0)
// CHECK: [[T0:%.*]] = insertvalue { ptr, ptr } undef, ptr %0, 0
// CHECK-NEXT: [[T1:%.*]] = insertvalue { ptr, ptr } [[T0]], ptr null, 1
// CHECK-NEXT: ret { ptr, ptr } [[T1]]
sil @test_sign_thin_to_thick : $@convention(thin) () -> (@callee_guaranteed () -> ()) {
bb0:
@@ -71,8 +67,8 @@ bb0:
%1 = thin_to_thick_function %0 : $@convention(thin) () -> () to $@callee_guaranteed () -> ()
return %1 : $@callee_guaranteed () -> ()
}
// CHECK: define swiftcc { i8*, %swift.refcounted* } @test_sign_thin_to_thick() #[[ATTRS:[0-9]+]] {
// CHECK: ret { i8*, %swift.refcounted* } { i8* bitcast ({ i8*, i32, i64, i64 }* @global_function.ptrauth to i8*), %swift.refcounted* null }
// CHECK: define swiftcc { ptr, ptr } @test_sign_thin_to_thick() #[[ATTRS:[0-9]+]] {
// CHECK: ret { ptr, ptr } { ptr @global_function.ptrauth, ptr null }
class F {}
sil @generic_return : $@convention(thin) @yield_once <T : F> (@guaranteed T) -> @yields @guaranteed T

View File

@@ -1,7 +1,5 @@
// RUN: %swift-frontend %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -primary-file %s -emit-ir -module-name A | %FileCheck %s --check-prefix=CHECK
// RUN: %swift-frontend %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 %s -primary-file %S/Inputs/ptrauth-global-2.swift -emit-ir -module-name A | %FileCheck %s --check-prefix=CHECK2
// RUN: %swift-frontend -swift-version 4 -target arm64e-apple-ios12.0 -primary-file %s -emit-ir -module-name A
// RUN: %swift-frontend -swift-version 4 -target arm64e-apple-ios12.0 %s -primary-file %S/Inputs/ptrauth-global-2.swift -emit-ir -module-name A
// RUN: %swift-frontend -swift-version 4 -target arm64e-apple-ios12.0 -primary-file %s -emit-ir -module-name A | %FileCheck %s --check-prefix=CHECK
// RUN: %swift-frontend -swift-version 4 -target arm64e-apple-ios12.0 %s -primary-file %S/Inputs/ptrauth-global-2.swift -emit-ir -module-name A | %FileCheck %s --check-prefix=CHECK2
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -9,17 +7,15 @@
// Make sure that the key at the definition of the global matches call sites.
// CHECK-DAG: @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZ" = constant %swift.function { {{.*}} @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZfiAGycAJcycfU_.ptrauth"
// CHECK-DAG: @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZfiAGycAJcycfU_.ptrauth" = {{.*}} @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZfiAGycAJcycfU_" {{.*}} i64 58141 }, section "llvm.ptrauth"
// CHECK-DAG: @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZfiAGycAJcycfU_.ptrauth" = {{.*}}@"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvpZfiAGycAJcycfU_"{{.*}} i64 58141 }, section "llvm.ptrauth"
// CHECK2: define {{.*}}swiftcc void @"$s1A4testyyF"()
// CHECK2: [[T:%.*]] = call swiftcc i8* @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvau"()
// CHECK2: [[T2:%.*]] = bitcast i8* [[T]] to %swift.function*
// CHECK2: [[T3:%.*]] = getelementptr inbounds %swift.function, %swift.function* [[T2]], i32 0, i32 0
// CHECK2: [[T4:%.*]] = load i8*, i8** [[T3]]
// CHECK2: [[T5:%.*]] = bitcast i8* [[T4]] to { i8*, %swift.refcounted* } (%swift.refcounted*)*
// CHECK2: call swiftcc { i8*, %swift.refcounted* } [[T5]]({{.*}}) [ "ptrauth"(i32 0, i64 58141) ]
// CHECK2: [[T:%.*]] = call swiftcc ptr @"$s1A9ContainerV3AllAA1GVySiGycAA1VVySiGcycvau"()
// CHECK2: [[T1:%.*]] = getelementptr inbounds %swift.function, ptr [[T]], i32 0, i32 0
// CHECK2: [[T4:%.*]] = load ptr, ptr [[T1]]
// CHECK2: call swiftcc { ptr, ptr } [[T4]]({{.*}}) [ "ptrauth"(i32 0, i64 58141) ]
public struct G<T> {
init(_ t: T) {}

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: objc_interop
// REQUIRES: CPU=arm64e
@@ -23,9 +22,8 @@ bb0(%0 : $A):
// The partial apply was optimized.
// CHECK-LABEL: define swiftcc void @test0(
// CHECK: %1 = load i8*, i8** @"\01L_selector(foo)"
// CHECK: %2 = bitcast %T4test1AC* %0
// CHECK: call void bitcast (void ()* @objc_msgSend to void (%0*, i8*)*)(%0* %2, i8* %1)
// CHECK: %1 = load ptr, ptr @"\01L_selector(foo)"
// CHECK: call void @objc_msgSend(ptr %0, ptr %1)
sil @test0 : $@convention(thin) (@guaranteed A) -> () {
bb0(%0: $A):
%method = objc_method %0 : $A, #A.foo!foreign, $@convention(objc_method) (A) -> ()

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -8,7 +7,7 @@
@objc func foo() {}
}
// CHECK: @"$s4test1AC3fooyyFTo.ptrauth" = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%0*, i8*)* @"$s4test1AC3fooyyFTo" to i8*), i32 0, i64 ptrtoint (i8** getelementptr inbounds ({ i32, i32, [1 x { i8*, i8*, i8* }] }, { i32, i32, [1 x { i8*, i8*, i8* }] }* @_INSTANCE_METHODS__TtC4test1A, i32 0, i32 2, i32 0, i32 2) to i64), i64 0 }, section "llvm.ptrauth"
// CHECK: @"$s4test1AC3fooyyFTo.ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"$s4test1AC3fooyyFTo", i32 0, i64 ptrtoint (ptr getelementptr inbounds ({ i32, i32, [1 x { ptr, ptr, ptr }] }, ptr @_INSTANCE_METHODS__TtC4test1A, i32 0, i32 2, i32 0, i32 2) to i64), i64 0 }, section "llvm.ptrauth"
@objc protocol P {
func bar()
@@ -16,4 +15,4 @@
@objc class B : P {
func bar() {}
}
// CHECK: @_PROTOCOL_INSTANCE_METHODS__TtP4test1P_ = {{.*}} [{ i8*, i8*, i8* } { i8* getelementptr inbounds ([4 x i8], [4 x i8]* @"\01L_selector_data(bar)", i64 0, i64 0), i8* getelementptr inbounds ([8 x i8], [8 x i8]* {{@.*}}, i64 0, i64 0), i8* null }]
// CHECK: @_PROTOCOL_INSTANCE_METHODS__TtP4test1P_ = {{.*}} [{ ptr, ptr, ptr } { ptr @"\01L_selector_data(bar)", ptr {{@.*}}, ptr null }]

View File

@@ -1,65 +1,54 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import Builtin
// CHECK: @"$sTA.ptrauth" = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%swift.refcounted*)* @"$sTA" to i8*), i32 0, i64 0, i64 {{.*}} }, section "llvm.ptrauth"
// CHECK: @"$sTA.ptrauth" = private constant { ptr, i32, i64, i64 } { ptr @"$sTA", i32 0, i64 0, i64 {{.*}} }, section "llvm.ptrauth"
sil @test_thin_indirect : $@convention(thin) (@convention(thin) (Builtin.Int32, Builtin.Int32) -> (), Builtin.Int32) -> @owned @callee_owned () -> () {
bb0(%0 : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> (), %1 : $Builtin.Int32):
%2 = partial_apply %0(%1, %1) : $@convention(thin) (Builtin.Int32, Builtin.Int32) -> ()
return %2 : $@callee_owned () -> ()
}
// CHECK-LABEL: define swiftcc { i8*, %swift.refcounted* } @test_thin_indirect(i8* %0, i32 %1)
// CHECK: [[FN:%.*]] = bitcast i8* %0 to void (i32, i32)*
// CHECK-LABEL: define swiftcc { ptr, ptr } @test_thin_indirect(ptr %0, i32 %1)
// CHECK: [[ALLOC:%.*]] = call {{.*}}swift_allocObject(
// CHECK: [[CTXT:%.*]] = bitcast %swift.refcounted* [[ALLOC]] to [[CTXT_TY:<{ %swift.refcounted, i32, i32, i8\* }>]]*
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY]], [[CTXT_TY]]* [[CTXT]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr }>]], ptr [[ALLOC]], i32 0, i32 3
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 7185)
// CHECK: [[T0:%.*]] = ptrtoint void (i32, i32)* [[FN]] to i64
// CHECK: [[T0:%.*]] = ptrtoint ptr %0 to i64
// CHECK: [[T1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[T0]], i32 0, i64 {{.*}}, i32 1, i64 [[DISC]])
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to void (i32, i32)*
// CHECK: [[T3:%.*]] = bitcast void (i32, i32)* [[T2]] to i8*
// CHECK: store i8* [[T3]], i8** [[SLOT]], align 8
// CHECK: insertvalue { i8*, %swift.refcounted* } { i8* bitcast ({ i8*, i32, i64, i64 }* @"$sTA.ptrauth" to i8*), %swift.refcounted* undef }, %swift.refcounted* {{.*}}, 1
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to ptr
// CHECK: store ptr [[T2]], ptr [[SLOT]], align 8
// CHECK: insertvalue { ptr, ptr } { ptr @"$sTA.ptrauth", ptr undef }, ptr {{.*}}, 1
// CHECK-LABEL: define internal swiftcc void @"$sTA"(%swift.refcounted* swiftself %0)
// CHECK: [[T0:%.*]] = bitcast %swift.refcounted* %0 to [[CTXT_TY:<{ %swift.refcounted, i32, i32, i8\* }>]]*
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY]], [[CTXT_TY]]* [[T0]], i32 0, i32 3
// CHECK: [[T0:%.*]] = load i8*, i8** [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-LABEL: define internal swiftcc void @"$sTA"(ptr swiftself %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr }>]], ptr %0, i32 0, i32 3
// CHECK: [[T0:%.*]] = load ptr, ptr [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 7185)
// CHECK: [[FN:%.*]] = bitcast i8* [[T0]] to void (i32, i32)*
// CHECK: call swiftcc void [[FN]](i32 {{.*}}, i32 {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]
// CHECK: call swiftcc void [[T0]](i32 {{.*}}, i32 {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]
sil @test_thick_indirect : $@convention(thin) (@callee_owned (Builtin.Int32, Builtin.Int32) -> (), Builtin.Int32) -> @owned @callee_owned () -> () {
bb0(%0 : $@callee_owned (Builtin.Int32, Builtin.Int32) -> (), %1 : $Builtin.Int32):
%2 = partial_apply %0(%1, %1) : $@callee_owned (Builtin.Int32, Builtin.Int32) -> ()
return %2 : $@callee_owned () -> ()
}
// CHECK-LABEL: define swiftcc { i8*, %swift.refcounted* } @test_thick_indirect(i8* %0, %swift.refcounted* %1, i32 %2)
// CHECK: [[FN:%.*]] = bitcast i8* %0 to void (i32, i32, %swift.refcounted*)*
// CHECK-LABEL: define swiftcc { ptr, ptr } @test_thick_indirect(ptr %0, ptr %1, i32 %2)
// CHECK: [[ALLOC:%.*]] = call {{.*}}swift_allocObject(
// CHECK: [[CTXT:%.*]] = bitcast %swift.refcounted* [[ALLOC]] to [[CTXT_TY:<{ %swift.refcounted, i32, i32, %swift.refcounted\*, i8\* }>]]*
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY]], [[CTXT_TY]]* {{%.*}}, i32 0, i32 4
// CHECK: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK: [[SLOT:%.*]] = getelementptr inbounds [[CTXT_TY:<{ %swift.refcounted, i32, i32, ptr, ptr }>]], ptr {{%.*}}, i32 0, i32 4
// CHECK: [[T0:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 7185)
// CHECK: [[T0:%.*]] = ptrtoint void (i32, i32, %swift.refcounted*)* [[FN]] to i64
// CHECK: [[T0:%.*]] = ptrtoint ptr %0 to i64
// CHECK: [[T1:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[T0]], i32 0, i64 {{.*}}, i32 1, i64 [[DISC]])
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to void (i32, i32, %swift.refcounted*)*
// CHECK: [[T3:%.*]] = bitcast void (i32, i32, %swift.refcounted*)* [[T2]] to i8*
// CHECK: store i8* [[T3]], i8** [[SLOT]], align 8
// CHECK: insertvalue { i8*, %swift.refcounted* } { i8* bitcast ({ i8*, i32, i64, i64 }* @"$sTA{{.*}}.ptrauth" to i8*), %swift.refcounted* undef }, %swift.refcounted* {{.*}}, 1
// CHECK: [[T2:%.*]] = inttoptr i64 [[T1]] to ptr
// CHECK: store ptr [[T2]], ptr [[SLOT]], align 8
// CHECK: insertvalue { ptr, ptr } { ptr @"$sTA{{.*}}.ptrauth", ptr undef }, ptr {{.*}}, 1
// CHECK-LABEL: define internal swiftcc void @"$sTA{{.*}}"(%swift.refcounted* swiftself %0)
// CHECK: [[T0:%.*]] = bitcast %swift.refcounted* %0 to <{ %swift.refcounted, i32, i32, %swift.refcounted*, i8* }>*
// CHECK: [[SLOT:%.*]] = getelementptr inbounds <{ %swift.refcounted, i32, i32, %swift.refcounted*, i8* }>, <{ %swift.refcounted, i32, i32, %swift.refcounted*, i8* }>* [[T0]], i32 0, i32 4
// CHECK: [[T0:%.*]] = load i8*, i8** [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-LABEL: define internal swiftcc void @"$sTA{{.*}}"(ptr swiftself %0)
// CHECK: [[SLOT:%.*]] = getelementptr inbounds <{ %swift.refcounted, i32, i32, ptr, ptr }>, ptr %0, i32 0, i32 4
// CHECK: [[T0:%.*]] = load ptr, ptr [[SLOT]], align 8
// CHECK: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 7185)
// CHECK: [[FN:%.*]] = bitcast i8* [[T0]] to void (i32, i32, %swift.refcounted*)*
// CHECK: call swiftcc void [[FN]](i32 {{.*}}, i32 {{.*}}, %swift.refcounted* {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]
// CHECK: call swiftcc void [[T0]](i32 {{.*}}, i32 {{.*}}, ptr {{.*}}) [ "ptrauth"(i32 1, i64 [[DISC]]) ]

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 5 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 5 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 5 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -42,9 +41,9 @@ bb0(%0 : $@thick A.Type):
sil_witness_table A : P module test {
method #P.foo: @A_foo
}
// CHECK: @A_foo.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%swift.type*, %swift.type*, i8**)* @A_foo to i8*), i32 0, i64 ptrtoint (i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @"$s4test1AVAA1PAAWP", i32 0, i32 1) to i64), i64 53700 }, section "llvm.ptrauth"
// CHECK: @A_foo.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @A_foo, i32 0, i64 ptrtoint (ptr getelementptr inbounds ([2 x ptr], ptr @"$s4test1AVAA1PAAWP", i32 0, i32 1) to i64), i64 53700 }, section "llvm.ptrauth"
// CHECK: @"$s4test1AVAA1PAAWP" = hidden constant [2 x i8*] [i8* bitcast (%swift.protocol_conformance_descriptor* @"$s4test1AVAA1PAAMc" to i8*), i8* bitcast ({ i8*, i32, i64, i64 }* @A_foo.ptrauth to i8*)], align 8
// CHECK: @"$s4test1AVAA1PAAWP" = hidden constant [2 x ptr] [ptr @"$s4test1AVAA1PAAMc", ptr @A_foo.ptrauth], align 8
sil @B_init : $@convention(witness_method : Q) (@thick B.Type) -> (@out B) {
bb0(%0 : $*B, %1 : $@thick B.Type):
@@ -56,11 +55,11 @@ sil_witness_table B : Q module test {
associated_type Assoc: A
method #Q.init!allocator: @B_init
}
// CHECK: @B_init.ptrauth = private constant { i8*, i32, i64, i64 } { i8* bitcast (void (%T4test1BV*, %swift.type*, %swift.type*, i8**)* @B_init to i8*), i32 0, i64 ptrtoint (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @"$s4test1BVAA1QAAWP", i32 0, i32 3) to i64), i64 33208 }, section "llvm.ptrauth"
// CHECK: @"$s4test1BVAA1QAAWP" = hidden global [4 x i8*] [
// CHECK-SAME: i8* bitcast ({{.*}}* @"$s4test1BVAA1QAAMc" to i8*),
// CHECK-SAME: @.ptrauth
// CHECK-SAME: i8* bitcast ({ i8*, i32, i64, i64 }* @B_init.ptrauth to i8*)]
// CHECK: @B_init.ptrauth = private constant { ptr, i32, i64, i64 } { ptr @B_init, i32 0, i64 ptrtoint (ptr getelementptr inbounds ([4 x ptr], ptr @"$s4test1BVAA1QAAWP", i32 0, i32 3) to i64), i64 33208 }, section "llvm.ptrauth"
// CHECK: @"$s4test1BVAA1QAAWP" = hidden global [4 x ptr] [
// CHECK-SAME: ptr @"$s4test1BVAA1QAAMc",
// CHECK-SAME: @"{{.*}}.ptrauth",
// CHECK-SAME: ptr @B_init.ptrauth]
sil @test_accesses : $@convention(thin) <T : Q> () -> () {
bb0:
@@ -69,22 +68,21 @@ bb0:
apply %0<T.Assoc>(%1) : $@convention(witness_method : P) <τ_0_0 where τ_0_0 : P> (@thick τ_0_0.Type) -> ()
return undef : $()
}
// CHECK-LABEL: define swiftcc void @test_accesses(%swift.type* %T, i8** %T.Q)
// CHECK-LABEL: define swiftcc void @test_accesses(ptr %T, ptr %T.Q)
// Fetch T.Assoc.
// CHECK: [[T_ASSOC:%.*]] = extractvalue %swift.metadata_response [[TMP:%.*]], 0
// CHECK-NEXT: {{%.*}} = extractvalue %swift.metadata_response [[TMP]], 1
// Fetch T.Assoc : P.
// CHECK-NEXT: %T.Assoc.P = call swiftcc i8** @swift_getAssociatedConformanceWitness(i8** %T.Q, %swift.type* %T, %swift.type* [[T_ASSOC]]
// CHECK-NEXT: %T.Assoc.P = call swiftcc ptr @swift_getAssociatedConformanceWitness(ptr %T.Q, ptr %T, ptr [[T_ASSOC]]
// Fetch T.Assoc.foo
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8*, i8** %T.Assoc.P, i32 1
// CHECK-NEXT: [[T1:%.*]] = load i8*, i8** [[T0]], align 8
// CHECK-NEXT: [[FOO:%.*]] = bitcast i8* [[T1]] to void (%swift.type*, %swift.type*, i8**)*
// CHECK-NEXT: [[T1:%.*]] = ptrtoint i8** [[T0]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 53700)
// CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds ptr, ptr %T.Assoc.P, i32 1
// CHECK-NEXT: [[T1:%.*]] = load ptr, ptr [[T0]], align 8
// CHECK-NEXT: [[T2:%.*]] = ptrtoint ptr [[T0]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T2]], i64 53700)
// TODO: be smart about this and do a complete-metadata fetch in the first place
// CHECK-NEXT: [[ASSOC_RESPONSE:%.*]] = call swiftcc %swift.metadata_response @swift_checkMetadataState(i64 0, %swift.type* [[T_ASSOC]])
// CHECK-NEXT: [[ASSOC_RESPONSE:%.*]] = call swiftcc %swift.metadata_response @swift_checkMetadataState(i64 0, ptr [[T_ASSOC]])
// CHECK-NEXT: [[ASSOC:%.*]] = extractvalue %swift.metadata_response [[ASSOC_RESPONSE]], 0
// CHECK-NEXT: call swiftcc void [[FOO]](%swift.type* swiftself [[ASSOC]], %swift.type* [[ASSOC]], i8** %T.Assoc.P) [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: call swiftcc void [[T1]](ptr swiftself [[ASSOC]], ptr [[ASSOC]], ptr %T.Assoc.P) [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @use_conformances : $@convention(thin) () -> () {

View File

@@ -1,5 +1,4 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test | %FileCheck %s --check-prefix=CHECK
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -13,8 +12,8 @@ bb0(%0 : $Builtin.NativeObject):
strong_retain %0 : $Builtin.NativeObject
return %0 : $Builtin.NativeObject
}
// CHECK-LABEL: define swiftcc %swift.refcounted* @test_retain(%swift.refcounted* %0)
// CHECK: call %swift.refcounted* @swift_retain(
// CHECK-NEXT: ret %swift.refcounted* %0
// CHECK-LABEL: define swiftcc ptr @test_retain(ptr %0)
// CHECK: call ptr @swift_retain(
// CHECK-NEXT: ret ptr %0
// CHECK: declare %swift.refcounted* @swift_retain(%swift.refcounted* returned
// CHECK: declare ptr @swift_retain(ptr returned

View File

@@ -1,5 +1,5 @@
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift %use_no_opaque_pointers -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls | %FileCheck %s --check-prefix=CHECK
// RUN: %swift -swift-version 4 -target arm64e-apple-ios12.0 -parse-stdlib -parse-as-library %s -emit-ir -module-name test -Xcc -Xclang -Xcc -fptrauth-calls
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
@@ -23,13 +23,12 @@ bb0(%0 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 1272)
// CHECK-NEXT: call void [[WITNESS]](%swift.opaque* noalias %0, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_copy_init : $@convention(thin) <T> (@in_guaranteed T) -> (@out T) {
@@ -39,13 +38,12 @@ bb0(%0 : $*T, %1 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_init(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 58298)
// CHECK-NEXT: call %swift.opaque* [[WITNESS]](%swift.opaque* noalias %0, %swift.opaque* noalias %1, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 58298)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_take_init : $@convention(thin) <T> (@in T) -> (@out T) {
@@ -55,13 +53,12 @@ bb0(%0 : $*T, %1 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_init(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 18648)
// CHECK-NEXT: call %swift.opaque* [[WITNESS]](%swift.opaque* noalias %0, %swift.opaque* noalias %1, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 18648)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_copy_assign : $@convention(thin) <T> (@inout T, @in_guaranteed T) -> () {
@@ -71,13 +68,12 @@ bb0(%0 : $*T, %1 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_copy_assign(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 34641)
// CHECK-NEXT: call %swift.opaque* [[WITNESS]](%swift.opaque* %0, %swift.opaque* %1, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 34641)
// CHECK-NEXT: call ptr [[T0]](ptr %0, ptr %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
sil @test_take_assign : $@convention(thin) <T> (@inout T, @in T) -> () {
@@ -87,13 +83,12 @@ bb0(%0 : $*T, %1 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_take_assign(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 61402)
// CHECK-NEXT: call %swift.opaque* [[WITNESS]](%swift.opaque* noalias %0, %swift.opaque* noalias %1, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 61402)
// CHECK-NEXT: call ptr [[T0]](ptr noalias %0, ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void
// Make sure that the local-type-data caching mechanism sets things up right.
@@ -105,12 +100,11 @@ bb0(%0 : $*T, %1 : $*T):
return %result : $()
}
// CHECK-LABEL: define swiftcc void @test_destroy_twice(
// CHECK: [[VWT:%.*]] = load i8**,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load i8*, i8** [[SLOT]], align
// CHECK-NEXT: [[WITNESS:%.*]] = bitcast i8* [[T0]] to
// CHECK-NEXT: [[T0:%.*]] = ptrtoint i8** [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T0]], i64 1272)
// CHECK-NEXT: call void [[WITNESS]](%swift.opaque* noalias %0, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: call void [[WITNESS]](%swift.opaque* noalias %1, %swift.type* %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK: [[VWT:%.*]] = load ptr,
// CHECK-NEXT: [[SLOT:%.*]] = getelementptr inbounds ptr, ptr [[VWT]], i32
// CHECK-NEXT: [[T0:%.*]] = load ptr, ptr [[SLOT]], align
// CHECK-NEXT: [[T1:%.*]] = ptrtoint ptr [[SLOT]] to i64
// CHECK-NEXT: [[DISC:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[T1]], i64 1272)
// CHECK-NEXT: call void [[T0]](ptr noalias %0, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: call void [[T0]](ptr noalias %1, ptr %T) {{#[0-9]+}} [ "ptrauth"(i32 0, i64 [[DISC]]) ]
// CHECK-NEXT: ret void

View File

@@ -1,87 +1,72 @@
// RUN: %swift-frontend %use_no_opaque_pointers %s -enable-import-ptrauth-field-function-pointers -emit-ir -target arm64e-apple-ios13.0 -I %S/Inputs/ -validate-tbd-against-ir=none -Xllvm -sil-disable-pass=OnoneSimplification | %FileCheck %s
// RUN: %swift-frontend %s -enable-import-ptrauth-field-function-pointers -emit-ir -target arm64e-apple-ios13.0 -I %S/Inputs/ -validate-tbd-against-ir=none -Xllvm -sil-disable-pass=OnoneSimplification
// RUN: %swift-frontend %s -enable-import-ptrauth-field-function-pointers -emit-ir -target arm64e-apple-ios13.0 -I %S/Inputs/ -validate-tbd-against-ir=none -Xllvm -sil-disable-pass=OnoneSimplification | %FileCheck %s
// REQUIRES: CPU=arm64e
// REQUIRES: OS=ios
import PointerAuth
// CHECK: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import05test_B8_fn_reads5Int32VyF"() #0 {
// CHECK: [[LD:%.*]] = load i64, i64* bitcast (%struct.SecureStruct** @ptr_to_secure_struct to i64*), align 8
// CHECK: 5: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to i8*
// CHECK: br label %12
// CHECK: 12:
// CHECK: [[SECURESTRUCT:%.*]] = phi i8* [ [[CAST0]], %5 ]
// CHECK: [[CAST1:%.*]] = bitcast i8* [[SECURESTRUCT]] to %TSo12SecureStructV*
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* %14, i32 0, i32 0
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64*
// CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
// CHECK: [[COND:%.*]] = icmp ne i64* %16, null
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_secure_struct, align 8
// CHECK: 2: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %9
// CHECK: 9:
// CHECK: [[SECURESTRUCT:%.*]] = phi ptr [ [[CAST0]], {{.*}} ]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, ptr [[SECURESTRUCT]], i32 0, i32 0
// CHECK: [[PTR:%.*]] = load ptr, ptr %.secure_func_ptr, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[PTR]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull: ; preds = %12
// CHECK: [[SIGNEDINT:%.*]] = ptrtoint i64* [[PTR]] to i64
// CHECK: resign-nonnull:
// CHECK: [[SIGNEDINT:%.*]] = ptrtoint ptr [[PTR]] to i64
// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[SIGNEDINT]], i32 1, i64 88, i32 0, i64 0)
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
// CHECK: store i64* [[AUTHPTR]], i64** [[CAST3]], align 8
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to ptr
// CHECK: store ptr [[AUTHPTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-null: ; preds = %12
// CHECK: store i64* [[PTR]], i64** [[CAST3]], align 8
// CHECK: resign-null:
// CHECK: store ptr [[PTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-cont: ; preds = %resign-null, %resign-nonnull
// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
// CHECK: [[FUNCPTR:%.*]] = load i64, ptr %ptrauth.temp, align 8
func test_field_fn_read() -> Int32 {
let fn = ptr_to_secure_struct!.pointee.secure_func_ptr!
return fn()
}
// CHECK-LABEL: define hidden swiftcc void @"$s25ptrauth_field_fptr_import05test_B14_fn_ptr_modifyyyF"() #0 {
// CHECK: 11: ; preds = %4
// CHECK: [[SECURESTRUCT:%.*]] = phi i8* [ %5, %4 ]
// CHECK: [[CAST1:%.*]] = bitcast i8* [[SECURESTRUCT]] to %TSo12SecureStructV*
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, %TSo12SecureStructV* [[CAST1]], i32 0, i32 0
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
// CHECK: store i64 ptrtoint ({ i8*, i32, i64, i64 }* @returnInt.ptrauth to i64), i64* [[CAST2]], align 8
// CHECK: [[PTR:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
// CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
// CHECK: [[COND:%.*]] = icmp ne i64* [[LD]], null
// CHECK: [[SECURESTRUCT:%.*]] = phi ptr [
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo12SecureStructV, ptr [[SECURESTRUCT]], i32 0, i32 0
// CHECK: store i64 ptrtoint (ptr @returnInt.ptrauth to i64), ptr %ptrauth.temp, align 8
// CHECK: [[LD:%.*]] = load ptr, ptr %ptrauth.temp, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[LD]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull: ; preds = %11
// CHECK: [[CAST4:%.*]] = ptrtoint i64* [[LD]] to i64
// CHECK: resign-nonnull:
// CHECK: [[CAST4:%.*]] = ptrtoint ptr [[LD]] to i64
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 0, i64 0, i32 1, i64 88)
// CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to i64*
// CHECK: store i64* [[CAST5]], i64** [[PTR]], align 8
// CHECK: [[CAST5:%.*]] = inttoptr i64 [[SIGN]] to ptr
// CHECK: store ptr [[CAST5]], ptr %.secure_func_ptr, align 8
func test_field_fn_ptr_modify() {
ptr_to_secure_struct!.pointee.secure_func_ptr = returnInt
}
// CHECK: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B8_fn_reads5Int32VyF"() #0 {
// CHECK: [[LD:%.*]] = load i64, i64* bitcast (%struct.AddressDiscriminatedSecureStruct** @ptr_to_addr_discriminated_secure_struct to i64*), align 8
// CHECK: 5: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to i8*
// CHECK: br label %12
// CHECK: 12:
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi i8* [ [[CAST0]], %5 ]
// CHECK: [[CAST1:%.*]] = bitcast i8* [[AddressDiscriminatedSecureStruct]] to %TSo32AddressDiscriminatedSecureStructV*
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
// CHECK: [[PTR:%.*]] = load i64*, i64** [[CAST2]], align 8
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
// CHECK: [[COND:%.*]] = icmp ne i64* [[PTR]], null
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi ptr [ [[CAST0]]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, ptr [[AddressDiscriminatedSecureStruct]], i32 0, i32 0
// CHECK: [[PTR:%.*]] = load ptr, ptr %.secure_func_ptr, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[PTR]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull: ; preds = %12
// CHECK: [[ADDR:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
// CHECK: resign-nonnull:
// CHECK: [[ADDR:%.*]] = ptrtoint ptr %.secure_func_ptr to i64
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[ADDR]], i64 88)
// CHECK: [[CAST4:%.*]] = ptrtoint i64* [[PTR]] to i64
// CHECK: [[CAST4:%.*]] = ptrtoint ptr [[PTR]] to i64
// CHECK: [[DEFAULTSIGNVAL:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST4]], i32 1, i64 [[BLEND]], i32 0, i64 0)
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to i64*
// CHECK: store i64* [[AUTHPTR]], i64** [[CAST3]], align 8
// CHECK: [[AUTHPTR:%.*]] = inttoptr i64 [[DEFAULTSIGNVAL]] to ptr
// CHECK: store ptr [[AUTHPTR]], ptr %ptrauth.temp, align 8
// CHECK: br label %resign-cont
// CHECK: resign-cont: ; preds = %resign-null, %resign-nonnull
// CHECK: [[TMPCAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
// CHECK: [[FUNCPTR:%.*]] = load i64, i64* [[TMPCAST2]], align 8
// CHECK: resign-cont:
// CHECK: [[FUNCPTR:%.*]] = load i64, ptr %ptrauth.temp, align 8
func test_addr_discriminated_field_fn_read() -> Int32 {
let fn = ptr_to_addr_discriminated_secure_struct!.pointee.secure_func_ptr!
return fn()
@@ -89,28 +74,23 @@ func test_addr_discriminated_field_fn_read() -> Int32 {
// CHECK-LABEL: define hidden swiftcc void @"$s25ptrauth_field_fptr_import024test_addr_discriminated_B14_fn_ptr_modifyyyF"() #0 {
// CHECK: entry:
// CHECK: [[PTR:%.*]] = load i64, i64* bitcast (%struct.AddressDiscriminatedSecureStruct** @ptr_to_addr_discriminated_secure_struct to i64*), align 8
// CHECK: 4: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[PTR]] to i8*
// CHECK: br label %11
// CHECK: 11: ; preds = %4
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi i8* [ [[CAST0]], %4 ]
// CHECK: [[CAST1:%.*]] = bitcast i8* [[AddressDiscriminatedSecureStruct]] to %TSo32AddressDiscriminatedSecureStructV*
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, %TSo32AddressDiscriminatedSecureStructV* [[CAST1]], i32 0, i32 0
// CHECK: [[CAST2:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64*
// CHECK: store i64 ptrtoint ({ i8*, i32, i64, i64 }* @returnInt.ptrauth to i64), i64* [[CAST2]], align 8
// CHECK: [[PTR:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64**
// CHECK: [[CAST3:%.*]] = bitcast %Ts5Int32VIetCd_Sg* %ptrauth.temp to i64**
// CHECK: [[LD:%.*]] = load i64*, i64** [[CAST3]], align 8
// CHECK: [[COND:%.*]] = icmp ne i64* [[LD]], null
// CHECK: [[PTR:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[PTR]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[AddressDiscriminatedSecureStruct:%.*]] = phi ptr [ [[CAST0]]
// CHECK: %.secure_func_ptr = getelementptr inbounds %TSo32AddressDiscriminatedSecureStructV, ptr [[AddressDiscriminatedSecureStruct]], i32 0, i32 0
// CHECK: store i64 ptrtoint (ptr @returnInt.ptrauth to i64), ptr %ptrauth.temp, align 8
// CHECK: [[LD:%.*]] = load ptr, ptr %ptrauth.temp, align 8
// CHECK: [[COND:%.*]] = icmp ne ptr [[LD]], null
// CHECK: br i1 [[COND]], label %resign-nonnull, label %resign-null
// CHECK: resign-nonnull: ; preds = %11
// CHECK: [[CAST4:%.*]] = ptrtoint %Ts5Int32VIetCd_Sg* %.secure_func_ptr to i64
// CHECK: resign-nonnull:
// CHECK: [[CAST4:%.*]] = ptrtoint ptr %.secure_func_ptr to i64
// CHECK: [[BLEND:%.*]] = call i64 @llvm.ptrauth.blend(i64 [[CAST4]], i64 88)
// CHECK: [[CAST5:%.*]] = ptrtoint i64* [[LD]] to i64
// CHECK: [[CAST5:%.*]] = ptrtoint ptr [[LD]] to i64
// CHECK: [[SIGN:%.*]] = call i64 @llvm.ptrauth.resign(i64 [[CAST5]], i32 0, i64 0, i32 1, i64 [[BLEND]])
// CHECK: [[CAST6:%.*]] = inttoptr i64 [[SIGN]] to i64*
// CHECK: store i64* [[CAST6]], i64** [[PTR]], align 8
// CHECK: [[CAST6:%.*]] = inttoptr i64 [[SIGN]] to ptr
// CHECK: store ptr [[CAST6]], ptr %.secure_func_ptr, align 8
func test_addr_discriminated_field_fn_ptr_modify() {
ptr_to_addr_discriminated_secure_struct!.pointee.secure_func_ptr = returnInt
}
@@ -118,16 +98,12 @@ func test_addr_discriminated_field_fn_ptr_modify() {
// CHECK-LABEL: define hidden swiftcc i32 @"$s25ptrauth_field_fptr_import28test_addr_discriminated_copys5Int32VyF"() #0 {
// CHECK: entry:
// CHECK: [[STRUCT:%.*]] = alloca %TSo32AddressDiscriminatedSecureStructV, align 8
// CHECK: [[LD:%.*]] = load i64, i64* bitcast (%struct.AddressDiscriminatedSecureStruct** @ptr_to_addr_discriminated_secure_struct to i64*), align 8
// CHECK: 6: ; preds = %entry
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to i8*
// CHECK: br label %13
// CHECK: 13: ; preds = %6
// CHECK: [[PHI:%.*]] = phi i8* [ [[CAST0]], %6 ]
// CHECK: [[CAST1:%.*]] = bitcast i8* [[PHI]] to %TSo32AddressDiscriminatedSecureStructV*
// CHECK: [[CAST2:%.*]] = bitcast %TSo32AddressDiscriminatedSecureStructV* [[STRUCT]] to i8**
// CHECK: [[CAST3:%.*]] = bitcast %TSo32AddressDiscriminatedSecureStructV* [[CAST1]] to i8**
// CHECK: call void @__copy_assignment_8_8_pa1_88_0(i8** [[CAST2]], i8** [[CAST3]])
// CHECK: [[LD:%.*]] = load i64, ptr @ptr_to_addr_discriminated_secure_struct, align 8
// CHECK: [[CAST0:%.*]] = inttoptr i64 [[LD]] to ptr
// CHECK: br label %[[L1:[0-9]+]]
// CHECK: [[L1]]:
// CHECK: [[PHI:%.*]] = phi ptr [ [[CAST0]]
// CHECK: call void @__copy_assignment_8_8_pa1_88_0(ptr [[STRUCT]], ptr [[PHI]])
func test_addr_discriminated_copy() -> Int32 {
let struct_with_signed_val = ptr_to_addr_discriminated_secure_struct.pointee
return struct_with_signed_val.secure_func_ptr()

Some files were not shown because too many files have changed in this diff Show More