diff options
| author | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-09-06 00:28:43 +0000 |
|---|---|---|
| committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2016-09-06 00:28:43 +0000 |
| commit | a6519b1d543654b9b6a694ed3288e393612d3589 (patch) | |
| tree | 8c7dfb11c96c9ec3b55b971078b44eca98c25c7d /llvm/test/CodeGen/ARM | |
| parent | dfc4fc9f02f5853a8ecd176b18cce21a30a04dc1 (diff) | |
| download | bcm5719-llvm-a6519b1d543654b9b6a694ed3288e393612d3589.tar.gz bcm5719-llvm-a6519b1d543654b9b6a694ed3288e393612d3589.zip | |
CodeGen: ensure that libcalls are always AAPCS CC
All of the builtins are designed to be invoked with ARM AAPCS CC even on ARM
AAPCS VFP CC hosts. Tweak the default initialisation to ARM AAPCS CC rather
than C CC for ARM/thumb targets.
The changes to the tests are necessary to ensure that the calling convention for
the lowered library calls are honoured. Furthermore, these adjustments cause
certain branch invocations to change to branch-and-link since the returned value
needs to be moved across registers (d0 -> r0, r1).
llvm-svn: 280683
Diffstat (limited to 'llvm/test/CodeGen/ARM')
| -rw-r--r-- | llvm/test/CodeGen/ARM/arm32-rounding.ll | 85 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/tail-call-builtin.ll | 23 |
2 files changed, 55 insertions, 53 deletions
diff --git a/llvm/test/CodeGen/ARM/arm32-rounding.ll b/llvm/test/CodeGen/ARM/arm32-rounding.ll index f247648d814..d1aeb886b43 100644 --- a/llvm/test/CodeGen/ARM/arm32-rounding.ll +++ b/llvm/test/CodeGen/ARM/arm32-rounding.ll @@ -4,115 +4,116 @@ ; CHECK-LABEL: test1 ; CHECK: vrintm.f32 -define float @test1(float %a) { +define arm_aapcs_vfpcc float @test1(float %a) { entry: - %call = call float @floorf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @floorf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test2 -; SP: b floor +; SP: bl floor ; DP: vrintm.f64 -define double @test2(double %a) { +define arm_aapcs_vfpcc double @test2(double %a) { entry: - %call = call double @floor(double %a) nounwind readnone + %call = call arm_aapcscc double @floor(double %a) nounwind readnone ret double %call } ; CHECK-LABEL: test3 ; CHECK: vrintp.f32 -define float @test3(float %a) { +define arm_aapcs_vfpcc float @test3(float %a) { entry: - %call = call float @ceilf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @ceilf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test4 -; SP: b ceil +; SP: bl ceil ; DP: vrintp.f64 -define double @test4(double %a) { +define arm_aapcs_vfpcc double @test4(double %a) { entry: - %call = call double @ceil(double %a) nounwind readnone + %call = call arm_aapcscc double @ceil(double %a) nounwind readnone ret double %call } ; CHECK-LABEL: test5 ; CHECK: vrinta.f32 -define float @test5(float %a) { +define arm_aapcs_vfpcc float @test5(float %a) { entry: - %call = call float @roundf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @roundf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test6 -; SP: b round +; SP: bl round ; DP: vrinta.f64 -define double @test6(double %a) { +define arm_aapcs_vfpcc double @test6(double %a) { entry: - %call = call double @round(double %a) nounwind readnone + %call = call arm_aapcscc double @round(double %a) nounwind readnone ret double %call } ; CHECK-LABEL: test7 ; CHECK: vrintz.f32 -define float @test7(float %a) { +define arm_aapcs_vfpcc float @test7(float %a) { entry: - %call = call float @truncf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @truncf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test8 -; SP: b trunc +; SP: bl trunc ; DP: vrintz.f64 -define double @test8(double %a) { +define arm_aapcs_vfpcc double @test8(double %a) { entry: - %call = call double @trunc(double %a) nounwind readnone + %call = call arm_aapcscc double @trunc(double %a) nounwind readnone ret double %call } ; CHECK-LABEL: test9 ; CHECK: vrintr.f32 -define float @test9(float %a) { +define arm_aapcs_vfpcc float @test9(float %a) { entry: - %call = call float @nearbyintf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @nearbyintf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test10 -; SP: b nearbyint +; SP: bl nearbyint ; DP: vrintr.f64 -define double @test10(double %a) { +define arm_aapcs_vfpcc double @test10(double %a) { entry: - %call = call double @nearbyint(double %a) nounwind readnone + %call = call arm_aapcscc double @nearbyint(double %a) nounwind readnone ret double %call } ; CHECK-LABEL: test11 ; CHECK: vrintx.f32 -define float @test11(float %a) { +define arm_aapcs_vfpcc float @test11(float %a) { entry: - %call = call float @rintf(float %a) nounwind readnone + %call = call arm_aapcs_vfpcc float @rintf(float %a) nounwind readnone ret float %call } ; CHECK-LABEL: test12 -; SP: b rint +; SP: bl rint ; DP: vrintx.f64 -define double @test12(double %a) { +define arm_aapcs_vfpcc double @test12(double %a) { entry: - %call = call double @rint(double %a) nounwind readnone + %call = call arm_aapcscc double @rint(double %a) nounwind readnone ret double %call } -declare float @floorf(float) nounwind readnone -declare double @floor(double) nounwind readnone -declare float @ceilf(float) nounwind readnone -declare double @ceil(double) nounwind readnone -declare float @roundf(float) nounwind readnone -declare double @round(double) nounwind readnone -declare float @truncf(float) nounwind readnone -declare double @trunc(double) nounwind readnone -declare float @nearbyintf(float) nounwind readnone -declare double @nearbyint(double) nounwind readnone -declare float @rintf(float) nounwind readnone -declare double @rint(double) nounwind readnone +declare arm_aapcs_vfpcc float @floorf(float) nounwind readnone +declare arm_aapcscc double @floor(double) nounwind readnone +declare arm_aapcs_vfpcc float @ceilf(float) nounwind readnone +declare arm_aapcscc double @ceil(double) nounwind readnone +declare arm_aapcs_vfpcc float @roundf(float) nounwind readnone +declare arm_aapcscc double @round(double) nounwind readnone +declare arm_aapcs_vfpcc float @truncf(float) nounwind readnone +declare arm_aapcscc double @trunc(double) nounwind readnone +declare arm_aapcs_vfpcc float @nearbyintf(float) nounwind readnone +declare arm_aapcscc double @nearbyint(double) nounwind readnone +declare arm_aapcs_vfpcc float @rintf(float) nounwind readnone +declare arm_aapcscc double @rint(double) nounwind readnone + diff --git a/llvm/test/CodeGen/ARM/tail-call-builtin.ll b/llvm/test/CodeGen/ARM/tail-call-builtin.ll index c829cc52462..0ed15bc8403 100644 --- a/llvm/test/CodeGen/ARM/tail-call-builtin.ll +++ b/llvm/test/CodeGen/ARM/tail-call-builtin.ll @@ -1,37 +1,38 @@ ; RUN: llc -mtriple=thumbv7-linux-gnueabihf %s -o - | FileCheck %s -define i64 @test_mismatched_call(double %in) { +define arm_aapcs_vfpcc i64 @test_mismatched_call(double %in) { ; CHECK-LABEL: test_mismatched_call: -; CHECK: bl floor ; CHECK: vmov r0, r1, d0 +; CHECK: bl floor - %val = tail call double @floor(double %in) + %val = tail call arm_aapcscc double @floor(double %in) %res = bitcast double %val to i64 ret i64 %res } -define double @test_matched_call(double %in) { +define arm_aapcs_vfpcc double @test_matched_call(double %in) { ; CHECK-LABEL: test_matched_call: -; CHECK: b floor +; CHECK: b _floor - %val = tail call double @floor(double %in) + %val = tail call arm_aapcs_vfpcc double @_floor(double %in) ret double %val } -define void @test_irrelevant_call(double %in) { +define arm_aapcs_vfpcc void @test_irrelevant_call(double %in) { ; CHECK-LABEL: test_irrelevant_call: ; CHECK-NOT: bl floor - %val = tail call double @floor(double %in) + %val = tail call arm_aapcscc double @floor(double %in) ret void } -define arm_aapcscc double @test_callingconv(double %in) { +define arm_aapcs_vfpcc double @test_callingconv(double %in) { ; CHECK: test_callingconv: ; CHECK: bl floor - %val = tail call double @floor(double %in) + %val = tail call arm_aapcscc double @floor(double %in) ret double %val } -declare double @floor(double) nounwind readonly +declare arm_aapcs_vfpcc double @_floor(double) nounwind readonly +declare arm_aapcscc double @floor(double) nounwind readonly |

