diff options
Diffstat (limited to 'test/CodeGen/64bit-swiftcall.c')
-rw-r--r-- | test/CodeGen/64bit-swiftcall.c | 93 |
1 files changed, 54 insertions, 39 deletions
diff --git a/test/CodeGen/64bit-swiftcall.c b/test/CodeGen/64bit-swiftcall.c index 7486e44406ed1..6175553ec967e 100644 --- a/test/CodeGen/64bit-swiftcall.c +++ b/test/CodeGen/64bit-swiftcall.c @@ -10,7 +10,7 @@ #define ERROR __attribute__((swift_error_result)) #define CONTEXT __attribute__((swift_context)) -// CHECK: [[STRUCT2_RESULT:@.*]] = private {{.*}} constant [[STRUCT2_TYPE:%.*]] { i32 0, i8 0, i8 undef, i8 0, float 0.000000e+00, float 0.000000e+00 } +// CHECK: [[STRUCT2_RESULT:@.*]] = private {{.*}} constant [[STRUCT2_TYPE:%.*]] { i32 0, i8 0, i8 undef, i8 0, i32 0, i32 0 } /*****************************************************************************/ /****************************** PARAMETER ABIS *******************************/ @@ -102,8 +102,8 @@ typedef struct { int x; char c0; char c1; - float f0; - float f1; + int f0; + int f1; } struct_1; TEST(struct_1); // CHECK-LABEL: define swiftcc { i64, i64 } @return_struct_1() {{.*}}{ @@ -150,8 +150,8 @@ typedef struct { int x; char c0; __attribute__((aligned(2))) char c1; - float f0; - float f1; + int f0; + int f1; } struct_2; TEST(struct_2); // CHECK-LABEL: define swiftcc { i64, i64 } @return_struct_2() {{.*}}{ @@ -308,20 +308,30 @@ typedef union { TEST(union_hom_fp_partial) // CHECK: define void @test_union_hom_fp_partial() // CHECK: [[AGG:%.*]] = alloca [[UNION:%.*]], align 16 -// CHECK: [[CALL:%.*]] = call swiftcc { i64, i64 } @return_union_hom_fp_partial() -// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, i64 }* -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 0 -// CHECK: [[T1:%.*]] = extractvalue { i64, i64 } [[CALL]], 0 -// CHECK: store i64 [[T1]], i64* [[T0]], align 16 -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 1 -// CHECK: [[T1:%.*]] = extractvalue { i64, i64 } [[CALL]], 1 -// CHECK: store i64 [[T1]], i64* [[T0]], align 8 -// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, i64 }* -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 0 -// CHECK: [[V0:%.*]] = load i64, i64* [[T0]], align 16 -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 1 -// CHECK: [[V1:%.*]] = load i64, i64* [[T0]], align 8 -// CHECK: call swiftcc void @take_union_hom_fp_partial(i64 [[V0]], i64 [[V1]]) +// CHECK: [[CALL:%.*]] = call swiftcc { float, float, float, float } @return_union_hom_fp_partial() +// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { float, float, float, float }* +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 0 +// CHECK: [[T1:%.*]] = extractvalue { float, float, float, float } [[CALL]], 0 +// CHECK: store float [[T1]], float* [[T0]], align 16 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 1 +// CHECK: [[T1:%.*]] = extractvalue { float, float, float, float } [[CALL]], 1 +// CHECK: store float [[T1]], float* [[T0]], align 4 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 2 +// CHECK: [[T1:%.*]] = extractvalue { float, float, float, float } [[CALL]], 2 +// CHECK: store float [[T1]], float* [[T0]], align 8 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 3 +// CHECK: [[T1:%.*]] = extractvalue { float, float, float, float } [[CALL]], 3 +// CHECK: store float [[T1]], float* [[T0]], align 4 +// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { float, float, float, float }* +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 0 +// CHECK: [[V0:%.*]] = load float, float* [[T0]], align 16 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 1 +// CHECK: [[V1:%.*]] = load float, float* [[T0]], align 4 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 2 +// CHECK: [[V2:%.*]] = load float, float* [[T0]], align 8 +// CHECK: [[T0:%.*]] = getelementptr inbounds { float, float, float, float }, { float, float, float, float }* [[CAST]], i32 0, i32 3 +// CHECK: [[V3:%.*]] = load float, float* [[T0]], align 4 +// CHECK: call swiftcc void @take_union_hom_fp_partial(float [[V0]], float [[V1]], float [[V2]], float [[V3]]) // CHECK: ret void // CHECK: } @@ -332,20 +342,25 @@ typedef union { TEST(union_het_fpv_partial) // CHECK-LABEL: define void @test_union_het_fpv_partial() // CHECK: [[AGG:%.*]] = alloca [[UNION:%.*]], align 16 -// CHECK: [[CALL:%.*]] = call swiftcc { i64, i64 } @return_union_het_fpv_partial() -// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, i64 }* -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 0 -// CHECK: [[T1:%.*]] = extractvalue { i64, i64 } [[CALL]], 0 +// CHECK: [[CALL:%.*]] = call swiftcc { i64, float, float } @return_union_het_fpv_partial() +// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, float, float }* +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 0 +// CHECK: [[T1:%.*]] = extractvalue { i64, float, float } [[CALL]], 0 // CHECK: store i64 [[T1]], i64* [[T0]], align 16 -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 1 -// CHECK: [[T1:%.*]] = extractvalue { i64, i64 } [[CALL]], 1 -// CHECK: store i64 [[T1]], i64* [[T0]], align 8 -// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, i64 }* -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 0 +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 1 +// CHECK: [[T1:%.*]] = extractvalue { i64, float, float } [[CALL]], 1 +// CHECK: store float [[T1]], float* [[T0]], align 8 +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 2 +// CHECK: [[T1:%.*]] = extractvalue { i64, float, float } [[CALL]], 2 +// CHECK: store float [[T1]], float* [[T0]], align 4 +// CHECK: [[CAST:%.*]] = bitcast [[UNION]]* [[AGG]] to { i64, float, float }* +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 0 // CHECK: [[V0:%.*]] = load i64, i64* [[T0]], align 16 -// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, i64 }, { i64, i64 }* [[CAST]], i32 0, i32 1 -// CHECK: [[V1:%.*]] = load i64, i64* [[T0]], align 8 -// CHECK: call swiftcc void @take_union_het_fpv_partial(i64 [[V0]], i64 [[V1]]) +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 1 +// CHECK: [[V1:%.*]] = load float, float* [[T0]], align 8 +// CHECK: [[T0:%.*]] = getelementptr inbounds { i64, float, float }, { i64, float, float }* [[CAST]], i32 0, i32 2 +// CHECK: [[V2:%.*]] = load float, float* [[T0]], align 4 +// CHECK: call swiftcc void @take_union_het_fpv_partial(i64 [[V0]], float [[V1]], float [[V2]]) // CHECK: ret void // CHECK: } @@ -464,8 +479,8 @@ typedef struct { float f1; } struct_f2; TEST(struct_f2) -// CHECK-LABEL: define swiftcc i64 @return_struct_f2() -// CHECK-LABEL: define swiftcc void @take_struct_f2(i64) +// CHECK-LABEL: define swiftcc { float, float } @return_struct_f2() +// CHECK-LABEL: define swiftcc void @take_struct_f2(float, float) typedef struct { float f0; @@ -473,8 +488,8 @@ typedef struct { float f2; } struct_f3; TEST(struct_f3) -// CHECK-LABEL: define swiftcc { i64, float } @return_struct_f3() -// CHECK-LABEL: define swiftcc void @take_struct_f3(i64, float) +// CHECK-LABEL: define swiftcc { float, float, float } @return_struct_f3() +// CHECK-LABEL: define swiftcc void @take_struct_f3(float, float, float) typedef struct { float f0; @@ -483,8 +498,8 @@ typedef struct { float f3; } struct_f4; TEST(struct_f4) -// CHECK-LABEL: define swiftcc { i64, i64 } @return_struct_f4() -// CHECK-LABEL: define swiftcc void @take_struct_f4(i64, i64) +// CHECK-LABEL: define swiftcc { float, float, float, float } @return_struct_f4() +// CHECK-LABEL: define swiftcc void @take_struct_f4(float, float, float, float) typedef struct { @@ -1016,8 +1031,8 @@ typedef union { float3 fv2; } union_hom_fp_partial2; TEST(union_hom_fp_partial2) -// X86-64-LABEL: take_union_hom_fp_partial2(i64, float) -// ARM64-LABEL: take_union_hom_fp_partial2(i64, float) +// X86-64-LABEL: take_union_hom_fp_partial2(float, float, float) +// ARM64-LABEL: take_union_hom_fp_partial2(float, float, float) // At one point, we emitted lifetime.ends without a matching lifetime.start for // CoerceAndExpanded args. Since we're not performing optimizations, neither |