blob: d7d66ad7f5dfee902eeede6df09507106a4ea074 [file] [log] [blame]
// 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
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(%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
// 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: 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(%TSo10SIMDStructV* noalias nocapture sret %
// CHECK-SYSV-x86_64: call void @consumeSIMDStruct(<3 x float>
// CHECK-WIN-x86_64: call void @consumeSIMDStruct(%TSo10SIMDStructV* %
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"<HasRecursivePointers>(%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-armv7: call signext i8 @chareth(i8 signext
// CHECK-armv7: call signext i8 @signedChareth(i8 signext
// 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-armv7-LABEL: declare{{( dllimport)?}} signext i8 @chareth(i8 signext)
// CHECK-armv7-LABEL: declare{{( dllimport)?}} signext i8 @signedChareth(i8 signext)
// 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-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)
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(%objc_block*, i8)
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 {{%.*}})
%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* {{%.*}})
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