From 2cbc4fba85bb452ab18117e0633ab0ceb8cf6989 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Fri, 17 May 2024 11:00:08 +0200 Subject: [PATCH] CodeGen: Fix libcall names for exp10 on the various darwins It's really great that we have the same information duplicated in TargetLibraryInfo and RuntimeLibcalls which both assume everything by default. Should fix issue reported after #92287 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp | 11 ++++- llvm/lib/CodeGen/TargetLoweringBase.cpp | 28 +++++++++++++ .../CodeGen/AArch64/exp10-libcall-names.ll | 39 ++++++++++++++++++ llvm/test/CodeGen/ARM/exp10-libcall-names.ll | 39 ++++++++++++++++++ llvm/test/CodeGen/X86/exp10-libcall-names.ll | 40 +++++++++++++++++++ 5 files changed, 155 insertions(+), 2 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/exp10-libcall-names.ll create mode 100644 llvm/test/CodeGen/ARM/exp10-libcall-names.ll create mode 100644 llvm/test/CodeGen/X86/exp10-libcall-names.ll diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp index fd97a1283b65a65..08644159e75263d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -2050,8 +2050,15 @@ SDValue SelectionDAGLegalize::ExpandSPLAT_VECTOR(SDNode *Node) { std::pair SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, TargetLowering::ArgListTy &&Args, bool isSigned) { - SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), - TLI.getPointerTy(DAG.getDataLayout())); + EVT CodePtrTy = TLI.getPointerTy(DAG.getDataLayout()); + SDValue Callee; + if (const char *LibcallName = TLI.getLibcallName(LC)) + Callee = DAG.getExternalSymbol(LibcallName, CodePtrTy); + else { + Callee = DAG.getUNDEF(CodePtrTy); + DAG.getContext()->emitError(Twine("no libcall available for ") + + Node->getOperationName(&DAG)); + } EVT RetVT = Node->getValueType(0); Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); diff --git a/llvm/lib/CodeGen/TargetLoweringBase.cpp b/llvm/lib/CodeGen/TargetLoweringBase.cpp index 09b70cfb72278fd..82a59918b085b38 100644 --- a/llvm/lib/CodeGen/TargetLoweringBase.cpp +++ b/llvm/lib/CodeGen/TargetLoweringBase.cpp @@ -227,6 +227,34 @@ void TargetLoweringBase::InitLibcalls(const Triple &TT) { CallingConv::ARM_AAPCS_VFP); } } + + switch (TT.getOS()) { + case Triple::MacOSX: + if (TT.isMacOSXVersionLT(10, 9)) { + setLibcallName(RTLIB::EXP10_F32, nullptr); + setLibcallName(RTLIB::EXP10_F64, nullptr); + } else { + setLibcallName(RTLIB::EXP10_F32, "__exp10f"); + setLibcallName(RTLIB::EXP10_F64, "__exp10"); + } + break; + case Triple::IOS: + case Triple::TvOS: + case Triple::WatchOS: + case Triple::XROS: + if (!TT.isWatchOS() && + (TT.isOSVersionLT(7, 0) || (TT.isOSVersionLT(9, 0) && TT.isX86()))) { + setLibcallName(RTLIB::EXP10_F32, nullptr); + setLibcallName(RTLIB::EXP10_F64, nullptr); + } else { + setLibcallName(RTLIB::EXP10_F32, "__exp10f"); + setLibcallName(RTLIB::EXP10_F64, "__exp10"); + } + + break; + default: + break; + } } else { setLibcallName(RTLIB::FPEXT_F16_F32, "__gnu_h2f_ieee"); setLibcallName(RTLIB::FPROUND_F32_F16, "__gnu_f2h_ieee"); diff --git a/llvm/test/CodeGen/AArch64/exp10-libcall-names.ll b/llvm/test/CodeGen/AArch64/exp10-libcall-names.ll new file mode 100644 index 000000000000000..1220aec447abda6 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/exp10-libcall-names.ll @@ -0,0 +1,39 @@ +; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck -check-prefix=LINUX %s +; RUN: llc -mtriple=aarch64-apple-macos10.9 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=aarch64-apple-ios7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=aarch64-apple-tvos7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=aarch64-apple-watchos7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=aarch64-apple-xros7.0 < %s | FileCheck -check-prefix=APPLE %s + +; RUN: not llc -mtriple=aarch64-apple-macos10.8 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=aarch64-apple-ios6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=aarch64-apple-tvos6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=aarch64-apple-xros6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s + +; Check exp10/exp10f is emitted as __exp10/__exp10f on assorted systems. + +; ERR: no libcall available for fexp10 + +define float @test_exp10_f32(float %x) { +; LINUX-LABEL: test_exp10_f32: +; LINUX: // %bb.0: +; LINUX-NEXT: b exp10f +; +; APPLE-LABEL: test_exp10_f32: +; APPLE: ; %bb.0: +; APPLE-NEXT: b ___exp10f + %ret = call float @llvm.exp10.f32(float %x) + ret float %ret +} + +define double @test_exp10_f64(double %x) { +; LINUX-LABEL: test_exp10_f64: +; LINUX: // %bb.0: +; LINUX-NEXT: b exp10 +; +; APPLE-LABEL: test_exp10_f64: +; APPLE: ; %bb.0: +; APPLE-NEXT: b ___exp10 + %ret = call double @llvm.exp10.f64(double %x) + ret double %ret +} diff --git a/llvm/test/CodeGen/ARM/exp10-libcall-names.ll b/llvm/test/CodeGen/ARM/exp10-libcall-names.ll new file mode 100644 index 000000000000000..0ac68b3e8c46629 --- /dev/null +++ b/llvm/test/CodeGen/ARM/exp10-libcall-names.ll @@ -0,0 +1,39 @@ +; RUN: llc -mtriple=armv7-linux-gnu < %s | FileCheck -check-prefix=LINUX %s +; RUN: llc -mtriple=armv7-apple-macos10.9 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=armv7-apple-ios7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=armv7-apple-tvos7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=armv7-apple-watchos7.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=armv7-apple-xros7.0 < %s | FileCheck -check-prefix=APPLE %s + +; RUN: not llc -mtriple=armv7-apple-macos10.8 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=armv7-apple-ios6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=armv7-apple-tvos6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=armv7-apple-xros6.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s + +; Check exp10/exp10f is emitted as __exp10/__exp10f on assorted systems. + +; ERR: no libcall available for fexp10 + +define float @test_exp10_f32(float %x) { +; LINUX-LABEL: test_exp10_f32: +; LINUX: @ %bb.0: +; LINUX-NEXT: b exp10f +; +; APPLE-LABEL: test_exp10_f32: +; APPLE: @ %bb.0: +; APPLE-NEXT: b ___exp10f + %ret = call float @llvm.exp10.f32(float %x) + ret float %ret +} + +define double @test_exp10_f64(double %x) { +; LINUX-LABEL: test_exp10_f64: +; LINUX: @ %bb.0: +; LINUX-NEXT: b exp10 +; +; APPLE-LABEL: test_exp10_f64: +; APPLE: @ %bb.0: +; APPLE-NEXT: b ___exp10 + %ret = call double @llvm.exp10.f64(double %x) + ret double %ret +} diff --git a/llvm/test/CodeGen/X86/exp10-libcall-names.ll b/llvm/test/CodeGen/X86/exp10-libcall-names.ll new file mode 100644 index 000000000000000..ce26a0e738e90a5 --- /dev/null +++ b/llvm/test/CodeGen/X86/exp10-libcall-names.ll @@ -0,0 +1,40 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 +; RUN: llc -mtriple=x86_64-linux-gnu < %s | FileCheck -check-prefix=LINUX %s +; RUN: llc -mtriple=x86_64-apple-macos10.9 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=x86_64-apple-ios9.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=x86_64-apple-tvos9.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=x86_64-apple-watchos9.0 < %s | FileCheck -check-prefix=APPLE %s +; RUN: llc -mtriple=x86_64-apple-xros9.0 < %s | FileCheck -check-prefix=APPLE %s + +; RUN: not llc -mtriple=x86_64-apple-macos10.8 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=x86_64-apple-ios8.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=x86_64-apple-tvos8.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s +; RUN: not llc -mtriple=x86_64-apple-xros8.0 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s + +; Check exp10/exp10f is emitted as __exp10/__exp10f on assorted systems. + +; ERR: no libcall available for fexp10 + +define float @test_exp10_f32(float %x) { +; LINUX-LABEL: test_exp10_f32: +; LINUX: # %bb.0: +; LINUX-NEXT: jmp exp10f@PLT # TAILCALL +; +; APPLE-LABEL: test_exp10_f32: +; APPLE: ## %bb.0: +; APPLE-NEXT: jmp ___exp10f ## TAILCALL + %ret = call float @llvm.exp10.f32(float %x) + ret float %ret +} + +define double @test_exp10_f64(double %x) { +; LINUX-LABEL: test_exp10_f64: +; LINUX: # %bb.0: +; LINUX-NEXT: jmp exp10@PLT # TAILCALL +; +; APPLE-LABEL: test_exp10_f64: +; APPLE: ## %bb.0: +; APPLE-NEXT: jmp ___exp10 ## TAILCALL + %ret = call double @llvm.exp10.f64(double %x) + ret double %ret +}