[llvm] r342542 - [InstCombine] Don't transform sin/cos -> tanl if for half types

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 19 05:01:38 PDT 2018


Author: d0k
Date: Wed Sep 19 05:01:38 2018
New Revision: 342542

URL: http://llvm.org/viewvc/llvm-project?rev=342542&view=rev
Log:
[InstCombine] Don't transform sin/cos -> tanl if for half types

This is still unsafe for long double, we will transform things into tanl
even if tanl is for another type. But that's for someone else to fix.

Modified:
    llvm/trunk/lib/Transforms/Utils/BuildLibCalls.cpp
    llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll

Modified: llvm/trunk/lib/Transforms/Utils/BuildLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/BuildLibCalls.cpp?rev=342542&r1=342541&r2=342542&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/BuildLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/BuildLibCalls.cpp Wed Sep 19 05:01:38 2018
@@ -746,6 +746,8 @@ bool llvm::hasUnaryFloatFn(const TargetL
                            LibFunc DoubleFn, LibFunc FloatFn,
                            LibFunc LongDoubleFn) {
   switch (Ty->getTypeID()) {
+  case Type::HalfTyID:
+    return false;
   case Type::FloatTyID:
     return TLI->has(FloatFn);
   case Type::DoubleTyID:

Modified: llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll?rev=342542&r1=342541&r2=342542&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fdiv-cos-sin.ll Wed Sep 19 05:01:38 2018
@@ -78,6 +78,19 @@ define double @fdiv_cos_sin_reassoc(doub
   ret double %div
 }
 
+define half @fdiv_cosf16_sinf16_reassoc(half %a) {
+; CHECK-LABEL: @fdiv_cosf16_sinf16_reassoc(
+; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc half @llvm.cos.f16(half [[A:%.*]])
+; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc half @llvm.sin.f16(half [[A]])
+; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc half [[TMP1]], [[TMP2]]
+; CHECK-NEXT:    ret half [[DIV]]
+;
+  %1 = call reassoc half @llvm.cos.f16(half %a)
+  %2 = call reassoc half @llvm.sin.f16(half %a)
+  %div = fdiv reassoc half %1, %2
+  ret half %div
+}
+
 define float @fdiv_cosf_sinf_reassoc(float %a) {
 ; CHECK-LABEL: @fdiv_cosf_sinf_reassoc(
 ; CHECK-NEXT:    [[TANF:%.*]] = call reassoc float @tanf(float [[A:%.*]]) #1
@@ -102,12 +115,14 @@ define fp128 @fdiv_cosfp128_sinfp128_rea
   ret fp128 %div
 }
 
-declare double @llvm.cos.f64(double) #1
+declare half @llvm.cos.f16(half) #1
 declare float @llvm.cos.f32(float) #1
+declare double @llvm.cos.f64(double) #1
 declare fp128 @llvm.cos.fp128(fp128) #1
 
-declare double @llvm.sin.f64(double) #1
+declare half @llvm.sin.f16(half) #1
 declare float @llvm.sin.f32(float) #1
+declare double @llvm.sin.f64(double) #1
 declare fp128 @llvm.sin.fp128(fp128) #1
 
 declare void @use(double)




More information about the llvm-commits mailing list