Skip to content

Commit

Permalink
CodeGen: Fix libcall names for exp10 on the various darwins (llvm#92520)
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 llvm#92287
  • Loading branch information
arsenm committed May 20, 2024
1 parent 6430939 commit 1eb7f05
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 1eb7f05

Please sign in to comment.