summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Analysis/TargetLibraryInfo.cpp9
-rw-r--r--llvm/test/CodeGen/AArch64/illegal-float-ops.ll29
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" }
OpenPOWER on IntegriCloud