// 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 import Builtin import Swift // TODO: Provide tests for other architectures // CHECK-x86_64: %TSo11BitfieldOneV = type <{ %Ts6UInt32V, %TSo6NestedV, [4 x i8], [4 x i8], %TSf, [1 x i8], [7 x i8], %Ts6UInt64V, %Ts6UInt32V, [4 x i8] }> // CHECK-x86_64: %TSo6NestedV = type <{ %TSf, [3 x i8], [1 x i8] }> // CHECK-SYSV-x86_64: %TSo26BitfieldSeparatorReferenceV = type [[BITFIELD_SEP_TYPE:<{ %Ts5UInt8V, \[3 x i8\], %Ts5UInt8V }>]] // CHECK-WIN-x86_64: %TSo26BitfieldSeparatorReferenceV = type [[BITFIELD_SEP_TYPE:<{ %Ts5UInt8V, %Ts5UInt8V }>]] // CHECK-x86_64: %TSo25BitfieldSeparatorSameNameV = type [[BITFIELD_SEP_TYPE]] // CHECK-x86_64: %TSo36BitfieldSeparatorDifferentNameStructV = type [[BITFIELD_SEP_TYPE]] // CHECK-x86_64: %TSo21BitfieldSeparatorAnona = type [[BITFIELD_SEP_TYPE]] sil public_external @createBitfieldOne : $@convention(c) () -> BitfieldOne sil public_external @consumeBitfieldOne : $@convention(c) (BitfieldOne) -> () sil @test0 : $() -> () { bb0: %0 = function_ref @createBitfieldOne : $@convention(c) () -> BitfieldOne %1 = apply %0() : $@convention(c) () -> BitfieldOne %2 = function_ref @consumeBitfieldOne : $@convention(c) (BitfieldOne) -> () apply %2(%1) : $@convention(c) (BitfieldOne) -> () %r = tuple () return %r : $() } // CHECK-x86_64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @test0() // 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(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, 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 sil public_external @testBitfields : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) sil @testTypedefs : $() -> () { bb0: %0 = function_ref @testBitfields : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) %1 = apply %0() : $@convention(thin) () -> (BitfieldSeparatorReference, BitfieldSeparatorSameName, BitfieldSeparatorDifferentNameStruct, BitfieldSeparatorAnon) %r = tuple () return %r : $() } sil public_external @createSIMDStruct : $@convention(c) () -> SIMDStruct 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(ptr noalias nocapture sret({{.*}}) % // CHECK-SYSV-x86_64: call void @consumeSIMDStruct(<3 x float> // CHECK-WIN-x86_64: call void @consumeSIMDStruct(ptr % sil @testSIMDStruct : $() -> () { bb0: %f = function_ref @createSIMDStruct : $@convention(c) () -> SIMDStruct %x = apply %f() : $@convention(c) () -> SIMDStruct %g = function_ref @consumeSIMDStruct : $@convention(c) (SIMDStruct) -> () %z = apply %g(%x) : $@convention(c) (SIMDStruct) -> () return undef : $() } sil @testRecursive : $@convention(thin) () -> Builtin.Word { bb0: %m = metatype $@thin HasRecursivePointers.Type %s = builtin "sizeof"(%m : $@thin HasRecursivePointers.Type) : $Builtin.Word return %s : $Builtin.Word } // CHECK-x86_64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-SYSV-x86_64: call signext i8 @chareth(i8 signext // CHECK-WIN-x86_64: call i8 @chareth(i8 // CHECK-SYSV-x86_64: call signext i8 @signedChareth(i8 signext // CHECK-WIN-x86_64: call i8 @signedChareth(i8 // CHECK-SYSV-x86_64: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-WIN-x86_64: call i8 @unsignedChareth(i8 // CHECK-SYSV-x86_64: call signext i16 @eatMyShorts(i16 signext // CHECK-WIN-x86_64: call i16 @eatMyShorts(i16 // CHECK-SYSV-x86_64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-WIN-x86_64: call i16 @eatMyUnsignedShorts(i16 // CHECK-x86_64: call i32 @ints(i32 %5) // CHECK-x86_64: call i32 @unsigneds(i32 %6) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @chareth(i8) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @signedChareth(i8) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i8 @unsignedChareth(i8) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i16 @eatMyShorts(i16) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i16 @eatMyUnsignedShorts(i16) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-SYSV-x86_64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-WIN-x86_64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-i386-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-i386: call signext i8 @chareth(i8 signext // CHECK-i386: call signext i8 @signedChareth(i8 signext // CHECK-i386: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-i386: call signext i16 @eatMyShorts(i16 signext // CHECK-i386: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-i386: call i32 @ints(i32 %5) // CHECK-i386: call i32 @unsigneds(i32 %6) // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-i386-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-i386-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-i386-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-i386-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-i386-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-armv7-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-ios-armv7: call signext i8 @chareth(i8 signext // CHECK-ios-armv7: call signext i8 @signedChareth(i8 signext // CHECK-android-armv7: call zeroext i8 @chareth(i8 zeroext // CHECK-android-armv7: call zeroext i8 @signedChareth(i8 zeroext // CHECK-linux-armv7: call zeroext i8 @chareth(i8 zeroext // CHECK-linux-armv7: call zeroext i8 @signedChareth(i8 zeroext // CHECK-windows-armv7: call zeroext i8 @chareth(i8 zeroext // CHECK-windows-armv7: call zeroext i8 @signedChareth(i8 zeroext // CHECK-armv7: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-armv7: call signext i16 @eatMyShorts(i16 signext // CHECK-armv7: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-armv7: call i32 @ints(i32 %5) // CHECK-armv7: call i32 @unsigneds(i32 %6) // CHECK-ios-armv7-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-ios-armv7-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-android-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-android-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-linux-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-linux-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-windows-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-windows-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-armv7-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-armv7-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-armv7-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-armv7-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-armv7-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-armv7s-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-armv7s: call signext i8 @chareth(i8 signext // CHECK-armv7s: call signext i8 @signedChareth(i8 signext // CHECK-armv7s: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-armv7s: call signext i16 @eatMyShorts(i16 signext // CHECK-armv7s: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-armv7s: call i32 @ints(i32 %5) // CHECK-armv7s: call i32 @unsigneds(i32 %6) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-armv7s-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-armv7k-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-armv7k: call signext i8 @chareth(i8 signext // CHECK-armv7k: call signext i8 @signedChareth(i8 signext // CHECK-armv7k: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-armv7k: call signext i16 @eatMyShorts(i16 signext // CHECK-armv7k: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-armv7k: call i32 @ints(i32 %5) // CHECK-armv7k: call i32 @unsigneds(i32 %6) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-armv7k-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-arm64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-arm64: call signext i8 @chareth(i8 signext // CHECK-arm64: call signext i8 @signedChareth(i8 signext // CHECK-arm64: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-arm64: call signext i16 @eatMyShorts(i16 signext // CHECK-arm64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-arm64: call i32 @ints(i32 %5) // CHECK-arm64: call i32 @unsigneds(i32 %6) // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-arm64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-arm64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-arm64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-arm64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-arm64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-arm64e-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-arm64e: call signext i8 @chareth(i8 signext // CHECK-arm64e: call signext i8 @signedChareth(i8 signext // CHECK-arm64e: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-arm64e: call signext i16 @eatMyShorts(i16 signext // CHECK-arm64e: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-arm64e: call i32 @ints(i32 %5) // CHECK-arm64e: call i32 @unsigneds(i32 %6) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-arm64e-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-arm64_32-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-arm64_32: call signext i8 @chareth(i8 signext // CHECK-arm64_32: call signext i8 @signedChareth(i8 signext // CHECK-arm64_32: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-arm64_32: call signext i16 @eatMyShorts(i16 signext // CHECK-arm64_32: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-arm64_32: call i32 @ints(i32 %5) // CHECK-arm64_32: call i32 @unsigneds(i32 %6) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-arm64_32-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-aarch64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-aarch64: call i8 @chareth(i8 %0) // CHECK-aarch64: call i8 @signedChareth(i8 %1) // CHECK-aarch64: call i8 @unsignedChareth(i8 %2) // CHECK-aarch64: call i16 @eatMyShorts(i16 %3) // CHECK-aarch64: call i16 @eatMyUnsignedShorts(i16 %4) // CHECK-aarch64: call i32 @ints(i32 %5) // CHECK-aarch64: call i32 @unsigneds(i32 %6) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @chareth(i8) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @signedChareth(i8) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i8 @unsignedChareth(i8) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i16 @eatMyShorts(i16) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i16 @eatMyUnsignedShorts(i16) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i32 @ints(i32) // CHECK-aarch64-LABEL: declare{{( dllimport)?}} i32 @unsigneds(i32) // CHECK-powerpc64-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-powerpc64: call zeroext i8 @chareth(i8 zeroext // CHECK-powerpc64: call zeroext i8 @signedChareth(i8 zeroext // CHECK-powerpc64: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-powerpc64: call signext i16 @eatMyShorts(i16 signext // CHECK-powerpc64: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-powerpc64: call signext i32 @ints(i32 signext %5) // CHECK-powerpc64: call zeroext i32 @unsigneds(i32 zeroext %6) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) // CHECK-powerpc64-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) // CHECK-powerpc64le-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-powerpc64le: call zeroext i8 @chareth(i8 zeroext // CHECK-powerpc64le: call zeroext i8 @signedChareth(i8 zeroext // CHECK-powerpc64le: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-powerpc64le: call signext i16 @eatMyShorts(i16 signext // CHECK-powerpc64le: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-powerpc64le: call signext i32 @ints(i32 signext %5) // CHECK-powerpc64le: call zeroext i32 @unsigneds(i32 zeroext %6) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) // CHECK-powerpc64le-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) // CHECK-s390x-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @testIntegerExtension // CHECK-s390x: call zeroext i8 @chareth(i8 zeroext // CHECK-s390x: call zeroext i8 @signedChareth(i8 zeroext // CHECK-s390x: call zeroext i8 @unsignedChareth(i8 zeroext // CHECK-s390x: call signext i16 @eatMyShorts(i16 signext // CHECK-s390x: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext // CHECK-s390x: call signext i32 @ints(i32 signext %5) // CHECK-s390x: call zeroext i32 @unsigneds(i32 zeroext %6) // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @chareth(i8 zeroext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @signedChareth(i8 zeroext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i8 @unsignedChareth(i8 zeroext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} signext i16 @eatMyShorts(i16 signext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i16 @eatMyUnsignedShorts(i16 zeroext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} signext i32 @ints(i32 signext) // CHECK-s390x-LABEL: declare{{( dllimport)?}} zeroext i32 @unsigneds(i32 zeroext) // CHECK-wasm32-LABEL: define swiftcc void @testIntegerExtension(i8 %0, i8 %1, i8 %2, i16 %3, i16 %4, i32 %5, i32 %6) #0 { // CHECK-wasm32: call signext i8 @chareth(i8 signext %0) // CHECK-wasm32: call signext i8 @signedChareth(i8 signext %1) // CHECK-wasm32: call zeroext i8 @unsignedChareth(i8 zeroext %2) // CHECK-wasm32: call signext i16 @eatMyShorts(i16 signext %3) // CHECK-wasm32: call zeroext i16 @eatMyUnsignedShorts(i16 zeroext %4) // CHECK-wasm32: call i32 @ints(i32 %5) // CHECK-wasm32: call i32 @unsigneds(i32 %6) // CHECK-wasm32-LABEL: declare signext i8 @chareth(i8 signext) #0 // CHECK-wasm32-LABEL: declare signext i8 @signedChareth(i8 signext) #0 // CHECK-wasm32-LABEL: declare zeroext i8 @unsignedChareth(i8 zeroext) #0 // CHECK-wasm32-LABEL: declare signext i16 @eatMyShorts(i16 signext) #0 // CHECK-wasm32-LABEL: declare zeroext i16 @eatMyUnsignedShorts(i16 zeroext) #0 // CHECK-wasm32-LABEL: declare i32 @ints(i32) #0 // CHECK-wasm32-LABEL: declare i32 @unsigneds(i32) #0 sil @testIntegerExtension : $@convention(thin) (CChar, CSignedChar, CUnsignedChar, CShort, CUnsignedShort, CInt, CUnsignedInt) -> () { entry(%a : $CChar, %b : $CSignedChar, %c : $CUnsignedChar, %d : $CShort, %e : $CUnsignedShort, %f : $CInt, %g : $CUnsignedInt): %h = function_ref @chareth : $@convention(c) (CChar) -> CChar %i = apply %h(%a) : $@convention(c) (CChar) -> CChar %j = function_ref @signedChareth : $@convention(c) (CSignedChar) -> CSignedChar %k = apply %j(%b) : $@convention(c) (CSignedChar) -> CSignedChar %l = function_ref @unsignedChareth : $@convention(c) (CUnsignedChar) -> CUnsignedChar %m = apply %l(%c) : $@convention(c) (CUnsignedChar) -> CUnsignedChar %n = function_ref @eatMyShorts : $@convention(c) (CShort) -> CShort %o = apply %n(%d) : $@convention(c) (CShort) -> CShort %p = function_ref @eatMyUnsignedShorts : $@convention(c) (CUnsignedShort) -> CUnsignedShort %q = apply %p(%e) : $@convention(c) (CUnsignedShort) -> CUnsignedShort %r = function_ref @ints : $@convention(c) (CInt) -> CInt %s = apply %r(%f) : $@convention(c) (CInt) -> CInt %t = function_ref @unsigneds : $@convention(c) (CUnsignedInt) -> CUnsignedInt %u = apply %t(%g) : $@convention(c) (CUnsignedInt) -> CUnsignedInt return undef : $() } // 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 {{%.*}}(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 {{%.*}}(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 return %r : $BitfieldOne } sil public_external @chareth : $@convention(c) (CChar) -> CChar sil public_external @signedChareth : $@convention(c) (CSignedChar) -> CSignedChar sil public_external @unsignedChareth : $@convention(c) (CUnsignedChar) -> CUnsignedChar sil public_external @eatMyShorts : $@convention(c) (CShort) -> CShort sil public_external @eatMyUnsignedShorts : $@convention(c) (CUnsignedShort) -> CUnsignedShort sil public_external @ints : $@convention(c) (CInt) -> CInt sil public_external @unsigneds : $@convention(c) (CUnsignedInt) -> CUnsignedInt