ARM64: don't generate __sincos_stret calls unless on MachO
authorTim Northover <tnorthover@apple.com>
Thu, 3 Apr 2014 07:06:13 +0000 (07:06 +0000)
committerTim Northover <tnorthover@apple.com>
Thu, 3 Apr 2014 07:06:13 +0000 (07:06 +0000)
This should fix PR19314.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205514 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM64/ARM64ISelLowering.cpp
test/CodeGen/ARM64/sincos.ll

index 956c57a6495ba409b3c1c89ef0ad7c9869a0c6cc..8164e6d2967effe8f804bdc42c46593be4d778ae 100644 (file)
@@ -351,11 +351,16 @@ ARM64TargetLowering::ARM64TargetLowering(ARM64TargetMachine &TM)
 
   setOperationAction(ISD::PREFETCH, MVT::Other, Custom);
 
-  // For iOS, we don't want to the normal expansion of a libcall to
-  // sincos. We want to issue a libcall to __sincos_stret to avoid memory
-  // traffic.
-  setOperationAction(ISD::FSINCOS, MVT::f64, Custom);
-  setOperationAction(ISD::FSINCOS, MVT::f32, Custom);
+  if (Subtarget->isTargetMachO()) {
+    // For iOS, we don't want to the normal expansion of a libcall to
+    // sincos. We want to issue a libcall to __sincos_stret to avoid memory
+    // traffic.
+    setOperationAction(ISD::FSINCOS, MVT::f64, Custom);
+    setOperationAction(ISD::FSINCOS, MVT::f32, Custom);
+  } else {
+    setOperationAction(ISD::FSINCOS, MVT::f64, Expand);
+    setOperationAction(ISD::FSINCOS, MVT::f32, Expand);
+  }
 
   // ARM64 does not have floating-point extending loads, i1 sign-extending load,
   // floating-point truncating stores, or v2i32->v2i16 truncating store.
index da14f533beb9321262fd5169fe679d9bba186237..06157b2580c4701a2a0d29da250f143b1b9f4bfb 100644 (file)
@@ -1,13 +1,19 @@
-; RUN: llc < %s -mtriple=arm64-apple-ios7 | FileCheck %s
+; RUN: llc < %s -mtriple=arm64-apple-ios7 | FileCheck %s --check-prefix CHECK-IOS
+; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s --check-prefix CHECK-LINUX
 
 ; Combine sin / cos into a single call.
 ; rdar://12856873
 
 define float @test1(float %x) nounwind {
 entry:
-; CHECK-LABEL: test1:
-; CHECK: bl ___sincosf_stret
-; CHECK: fadd s0, s0, s1
+; CHECK-IOS-LABEL: test1:
+; CHECK-IOS: bl ___sincosf_stret
+; CHECK-IOS: fadd s0, s0, s1
+
+; CHECK-LINUX-LABEL: test1:
+; CHECK-LINUX: bl sinf
+; CHECK-LINUX: bl cosf
+
   %call = tail call float @sinf(float %x) nounwind readnone
   %call1 = tail call float @cosf(float %x) nounwind readnone
   %add = fadd float %call, %call1
@@ -16,9 +22,14 @@ entry:
 
 define double @test2(double %x) nounwind {
 entry:
-; CHECK-LABEL: test2:
-; CHECK: bl ___sincos_stret
-; CHECK: fadd d0, d0, d1
+; CHECK-IOS-LABEL: test2:
+; CHECK-IOS: bl ___sincos_stret
+; CHECK-IOS: fadd d0, d0, d1
+
+; CHECK-LINUX-LABEL: test2:
+; CHECK-LINUX: bl sin
+; CHECK-LINUX: bl cos
+
   %call = tail call double @sin(double %x) nounwind readnone
   %call1 = tail call double @cos(double %x) nounwind readnone
   %add = fadd double %call, %call1