[llvm] r323187 - [Analysis] Disable exp/exp2/pow finite lib calls on Android with -ffast-math.

MinSeong Kim via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 23 03:11:36 PST 2018


Author: minseongkim
Date: Tue Jan 23 03:11:36 2018
New Revision: 323187

URL: http://llvm.org/viewvc/llvm-project?rev=323187&view=rev
Log:
[Analysis] Disable exp/exp2/pow finite lib calls on Android with -ffast-math.

Summary:
Since r322087, glibc's finite lib calls are generated when possible.
However, glibc is not supported on Android. Therefore this change
enables llvm to finely distinguish between linux and Android for
unsupported library calls. The change also include some regression
tests.

Reviewers: srhines, pirama

Reviewed By: srhines

Subscribers: kongyi, chh, javed.absar, llvm-commits

Differential Revision: https://reviews.llvm.org/D42288

Modified:
    llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
    llvm/trunk/test/CodeGen/AArch64/illegal-float-ops.ll

Modified: llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp?rev=323187&r1=323186&r2=323187&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/TargetLibraryInfo.cpp Tue Jan 23 03:11:36 2018
@@ -397,6 +397,15 @@ static void initialize(TargetLibraryInfo
     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);

Modified: llvm/trunk/test/CodeGen/AArch64/illegal-float-ops.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/illegal-float-ops.ll?rev=323187&r1=323186&r2=323187&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/illegal-float-ops.ll (original)
+++ llvm/trunk/test/CodeGen/AArch64/illegal-float-ops.ll Tue Jan 23 03:11:36 2018
@@ -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" }




More information about the llvm-commits mailing list