Skip to content

Commit

Permalink
CodeGen: Fix libcall names for exp10 on the various darwins
Browse files Browse the repository at this point in the history
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
  • Loading branch information
arsenm committed May 17, 2024
1 parent 5b7088c commit 2cbc4fb
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 2 deletions.
11 changes: 9 additions & 2 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2050,8 +2050,15 @@ SDValue SelectionDAGLegalize::ExpandSPLAT_VECTOR(SDNode *Node) {
std::pair<SDValue, SDValue> 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());
Expand Down
28 changes: 28 additions & 0 deletions llvm/lib/CodeGen/TargetLoweringBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
39 changes: 39 additions & 0 deletions llvm/test/CodeGen/AArch64/exp10-libcall-names.ll
Original file line number Diff line number Diff line change
@@ -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
}
39 changes: 39 additions & 0 deletions llvm/test/CodeGen/ARM/exp10-libcall-names.ll
Original file line number Diff line number Diff line change
@@ -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
}
40 changes: 40 additions & 0 deletions llvm/test/CodeGen/X86/exp10-libcall-names.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 2cbc4fb

Please sign in to comment.