From c7c6a9370490acb1a4c158e2227f0cdda7d08cb8 Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Thu, 3 Apr 2014 07:06:13 +0000 Subject: [PATCH] ARM64: don't generate __sincos_stret calls unless on MachO This should fix PR19314. llvm-svn: 205514 --- llvm/lib/Target/ARM64/ARM64ISelLowering.cpp | 15 ++++++++----- llvm/test/CodeGen/ARM64/sincos.ll | 25 +++++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp index 956c57a6495b..8164e6d2967e 100644 --- a/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp +++ b/llvm/lib/Target/ARM64/ARM64ISelLowering.cpp @@ -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. diff --git a/llvm/test/CodeGen/ARM64/sincos.ll b/llvm/test/CodeGen/ARM64/sincos.ll index da14f533beb9..06157b2580c4 100644 --- a/llvm/test/CodeGen/ARM64/sincos.ll +++ b/llvm/test/CodeGen/ARM64/sincos.ll @@ -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