diff options
-rw-r--r-- | llvm/lib/Analysis/TargetLibraryInfo.cpp | 9 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/illegal-float-ops.ll | 29 |
2 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/TargetLibraryInfo.cpp b/llvm/lib/Analysis/TargetLibraryInfo.cpp index f655eaeca52..2dbcc9fa6f2 100644 --- a/llvm/lib/Analysis/TargetLibraryInfo.cpp +++ b/llvm/lib/Analysis/TargetLibraryInfo.cpp @@ -397,6 +397,15 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, TLI.setUnavailable(LibFunc_flsll); } + // Android uses bionic instead of glibc. So disable some finite + // lib calls in glibc for Android. The list of unsupported lib + // calls for Android may expand as the need arises. + if (T.isAndroid()) { + TLI.setUnavailable(LibFunc_exp_finite); + TLI.setUnavailable(LibFunc_exp2_finite); + TLI.setUnavailable(LibFunc_pow_finite); + } + // The following functions are available on at least Linux: if (!T.isOSLinux()) { TLI.setUnavailable(LibFunc_dunder_strdup); diff --git a/llvm/test/CodeGen/AArch64/illegal-float-ops.ll b/llvm/test/CodeGen/AArch64/illegal-float-ops.ll index 9f7dd998bc2..81a3abd2bd9 100644 --- a/llvm/test/CodeGen/AArch64/illegal-float-ops.ll +++ b/llvm/test/CodeGen/AArch64/illegal-float-ops.ll @@ -1,4 +1,5 @@ ; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -o - %s | FileCheck %s +; RUN: llc -mtriple=aarch64-linux-android -verify-machineinstrs -o - %s | FileCheck --check-prefix=ANDROID-AARCH64 %s @varfloat = global float 0.0 @vardouble = global double 0.0 @@ -245,3 +246,31 @@ define void @test_fmuladd(fp128 %fp128) { ret void } + +define void @test_exp_finite(double %double) #0 { + %expdouble = call double @llvm.exp.f64(double %double) + store double %expdouble, double* @vardouble + ; ANDROID-AARCH64-NOT: bl __exp_finite + ; CHECK: bl __exp_finite + + ret void +} + +define void @test_exp2_finite(double %double) #0 { + %expdouble = call double @llvm.exp2.f64(double %double) + store double %expdouble, double* @vardouble + ; ANDROID-AARCH64-NOT: bl __exp2_finite + ; CHECK: bl __exp2_finite + + ret void +} + +define void @test_pow_finite(double %double) #0 { + %powdouble = call double @llvm.pow.f64(double %double, double %double) + store double %powdouble, double* @vardouble + ; ANDROID-AARCH64-NOT: bl __pow_finite + ; CHECK: bl __pow_finite + ret void +} + +attributes #0 = { "no-infs-fp-math"="true" "no-nans-fp-math"="true" } |