[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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@342542 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Utils/BuildLibCalls.cpp b/lib/Transforms/Utils/BuildLibCalls.cpp
index b782641..6eb39e5 100644
--- a/lib/Transforms/Utils/BuildLibCalls.cpp
+++ b/lib/Transforms/Utils/BuildLibCalls.cpp
@@ -746,6 +746,8 @@
                            LibFunc DoubleFn, LibFunc FloatFn,
                            LibFunc LongDoubleFn) {
   switch (Ty->getTypeID()) {
+  case Type::HalfTyID:
+    return false;
   case Type::FloatTyID:
     return TLI->has(FloatFn);
   case Type::DoubleTyID:
diff --git a/test/Transforms/InstCombine/fdiv-cos-sin.ll b/test/Transforms/InstCombine/fdiv-cos-sin.ll
index 328eae0..3284e1f 100644
--- a/test/Transforms/InstCombine/fdiv-cos-sin.ll
+++ b/test/Transforms/InstCombine/fdiv-cos-sin.ll
@@ -78,6 +78,19 @@
   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 @@
   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)