Skip to content

Commit d2d9452

Browse files
committed
RuntimeLibcalls: Stop opting out of exp10
This changes the behavior on old darwin triples for x86_fp80; it now turns into an error instead of emitting exp10l. The comments in TargetLibraryInfo suggest it never existed.
1 parent 1a5ee21 commit d2d9452

File tree

4 files changed

+80
-60
lines changed

4 files changed

+80
-60
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.td

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ def isNotOSWindowsOrIsCygwinMinGW
2929
def isGNUEnvironment : RuntimeLibcallPredicate<"TT.isGNUEnvironment()">;
3030
def darwinHasSinCosStret : RuntimeLibcallPredicate<"darwinHasSinCosStret(TT)">;
3131
def darwinHasExp10 : RuntimeLibcallPredicate<"darwinHasExp10(TT)">;
32+
33+
def hasExp10 : RuntimeLibcallPredicate<[{!TT.isOSDarwin()}]>;
34+
3235
def hasSinCos : RuntimeLibcallPredicate<"hasSinCos(TT)">;
3336

3437
// FIXME: Way to combine predicates
@@ -776,12 +779,6 @@ def __exp2l_finite_f80 : RuntimeLibcallImpl<EXP2_FINITE_F80, "__exp2l_finite">;
776779
def __exp2l_finite_f128 : RuntimeLibcallImpl<EXP2_FINITE_F128, "__exp2l_finite">;
777780
def __exp2l_finite_ppcf128 : RuntimeLibcallImpl<EXP2_FINITE_PPCF128, "__exp2l_finite">;
778781

779-
def exp10f : RuntimeLibcallImpl<EXP10_F32>;
780-
def exp10 : RuntimeLibcallImpl<EXP10_F64>;
781-
def exp10l_f80 : RuntimeLibcallImpl<EXP10_F80, "exp10l">;
782-
def exp10l_f128 : RuntimeLibcallImpl<EXP10_F128, "exp10l">;
783-
def exp10l_ppcf128 : RuntimeLibcallImpl<EXP10_PPCF128, "exp10l">;
784-
785782
def sinf : RuntimeLibcallImpl<SIN_F32>;
786783
def sin : RuntimeLibcallImpl<SIN_F64>;
787784
defm sin : LibmLongDoubleLibCall;
@@ -942,6 +939,12 @@ def calloc : RuntimeLibcallImpl<CALLOC>;
942939

943940
} // End let IsDefault = true
944941

942+
def exp10f : RuntimeLibcallImpl<EXP10_F32>;
943+
def exp10 : RuntimeLibcallImpl<EXP10_F64>;
944+
def exp10l_f80 : RuntimeLibcallImpl<EXP10_F80, "exp10l">;
945+
def exp10l_f128 : RuntimeLibcallImpl<EXP10_F128, "exp10l">;
946+
def exp10l_ppcf128 : RuntimeLibcallImpl<EXP10_PPCF128, "exp10l">;
947+
945948
//--------------------------------------------------------------------
946949
// compiler-rt/libgcc but 64-bit only, not available by default
947950
//--------------------------------------------------------------------
@@ -1101,6 +1104,12 @@ defvar LibmHasSinCosF80 = LibcallImpls<(add sincos_f80), hasSinCos>;
11011104
defvar LibmHasSinCosF128 = LibcallImpls<(add sincos_f128), hasSinCos>;
11021105
defvar LibmHasSinCosPPCF128 = LibcallImpls<(add sincos_ppcf128), hasSinCos>;
11031106

1107+
defvar LibmHasExp10F32 = LibcallImpls<(add exp10f), hasExp10>;
1108+
defvar LibmHasExp10F64 = LibcallImpls<(add exp10), hasExp10>;
1109+
defvar LibmHasExp10F80 = LibcallImpls<(add exp10l_f80), hasExp10>;
1110+
defvar LibmHasExp10F128 = LibcallImpls<(add exp10l_f128), hasExp10>;
1111+
defvar LibmHasExp10PPCF128 = LibcallImpls<(add exp10l_ppcf128), hasExp10>;
1112+
11041113
defvar WindowsMathRemovals = [
11051114
ldexpf, ldexp_f80, ldexp_f128, ldexp_ppcf128,
11061115
frexpf, frexp_f80, frexp_f128, frexp_ppcf128
@@ -1199,7 +1208,8 @@ def AArch64SystemLibrary : SystemRuntimeLibrary<
11991208
LibcallImpls<(add Int128RTLibcalls), isAArch64_ILP64>,
12001209
LibcallImpls<(add bzero), isOSDarwin>,
12011210
DarwinExp10, DarwinSinCosStret,
1202-
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128)
1211+
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
1212+
LibmHasExp10F32, LibmHasExp10F64, LibmHasExp10F128)
12031213
>;
12041214

12051215
// Prepend a # to every name
@@ -1470,6 +1480,7 @@ def ARMSystemLibrary
14701480
AEABIDivRemCalls,
14711481
DarwinSinCosStret, DarwinExp10,
14721482
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
1483+
LibmHasExp10F32, LibmHasExp10F64, LibmHasExp10F128,
14731484

14741485
// Use divmod compiler-rt calls for iOS 5.0 and later.
14751486
LibcallImpls<(add __divmodsi4, __udivmodsi4),
@@ -1962,6 +1973,7 @@ def PPCSystemLibrary
19621973
DefaultRuntimeLibcallImpls_f128),
19631974
__extendkftf2, __trunctfkf2,
19641975
DefaultRuntimeLibcallImpls_ppcf128,
1976+
exp10f, exp10, exp10l_ppcf128,
19651977
LibmF128Libcalls, AIX32Calls, AIX64Calls,
19661978
LibmHasSinCosF32, LibmHasSinCosF64, LibmHasSinCosF128,
19671979
LibmHasSinCosPPCF128,
@@ -1977,7 +1989,9 @@ def isRISCV64 : RuntimeLibcallPredicate<"TT.isRISCV64()">;
19771989

19781990
def RISCVSystemLibrary
19791991
: SystemRuntimeLibrary<isRISCV,
1980-
(add DefaultRuntimeLibcallImpls, __riscv_flush_icache,
1992+
(add DefaultRuntimeLibcallImpls,
1993+
exp10f, exp10, exp10l_f128,
1994+
__riscv_flush_icache,
19811995
LibcallImpls<(add Int128RTLibcalls), isRISCV64>)>;
19821996

19831997
//===----------------------------------------------------------------------===//
@@ -2086,6 +2100,10 @@ defvar X86CommonLibcalls =
20862100
LibmHasFrexpF32, LibmHasLdexpF32,
20872101
LibmHasFrexpF80, LibmHasLdexpF80,
20882102
DefaultRuntimeLibcallImpls_f80,
2103+
2104+
LibmHasExp10F32, LibmHasExp10F64, LibmHasExp10F80,
2105+
LibmHasExp10F128,
2106+
20892107
// MSVCRT doesn't have powi
20902108
// FIXME: It's almost certainly correct that MSVCRT has
20912109
// __powitf2_f128, but at least one test is relying on it.
@@ -2230,4 +2248,5 @@ def WasmSystemLibrary
22302248
: SystemRuntimeLibrary<isWasm,
22312249
(add DefaultRuntimeLibcallImpls, Int128RTLibcalls,
22322250
CompilerRTOnlyInt64Libcalls, CompilerRTOnlyInt128Libcalls,
2251+
exp10f, exp10,
22332252
emscripten_return_address)>;

llvm/lib/IR/RuntimeLibcalls.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,21 +99,15 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
9999
setLibcallImplCallingConv(RTLIB::__sincos_stret,
100100
CallingConv::ARM_AAPCS_VFP);
101101
}
102-
103-
if (!darwinHasExp10(TT)) {
104-
// FIXME: Remove exp10 from default set
105-
setLibcallImpl(RTLIB::EXP10_F32, RTLIB::Unsupported);
106-
setLibcallImpl(RTLIB::EXP10_F64, RTLIB::Unsupported);
107-
}
108102
}
109103

110104
if (TT.isOSOpenBSD()) {
111105
setLibcallImpl(RTLIB::STACKPROTECTOR_CHECK_FAIL, RTLIB::Unsupported);
112106
}
113107

114-
// Skip default manual processing for targets that have been fully ported to
108+
// Skip default manual processing for targets that have been mostly ported to
115109
// tablegen for now. Eventually the rest of this should be deleted.
116-
if (TT.isX86() || TT.isAArch64() || TT.isWasm())
110+
if (TT.isX86() || TT.isAArch64() || TT.isWasm() || TT.isPPC())
117111
return;
118112

119113
if (TT.isARM() || TT.isThumb()) {
@@ -127,6 +121,10 @@ void RuntimeLibcallsInfo::initLibcalls(const Triple &TT,
127121
setLibcallImpl(RTLIB::SINCOS_F128, RTLIB::sincos_f128);
128122
}
129123

124+
setLibcallImpl(RTLIB::EXP10_F32, RTLIB::exp10f);
125+
setLibcallImpl(RTLIB::EXP10_F64, RTLIB::exp10);
126+
setLibcallImpl(RTLIB::EXP10_F128, RTLIB::exp10l_f128);
127+
130128
// These libcalls are only available in compiler-rt, not libgcc.
131129
if (TT.isArch64Bit()) {
132130
setLibcallImpl(RTLIB::SHL_I128, RTLIB::__ashlti3);

llvm/test/CodeGen/X86/exp10-libcall-names.ll

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,7 @@
1313
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL-X86
1414
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL-X64
1515

16-
; RUN: not llc -mtriple=x86_64-apple-macos10.8 -filetype=null %s 2>&1 | FileCheck -check-prefix=ERR %s
17-
; Check exp10/exp10f is emitted as __exp10/__exp10f on assorted systems.
18-
19-
; ERR: no libcall available for fexp10
16+
; Check exp10/exp10f is emitted as __exp10/__exp10f on assorted darwin systems.
2017

2118
define float @test_exp10_f32(float %x) nounwind {
2219
; LINUX-LABEL: test_exp10_f32:
@@ -78,43 +75,3 @@ define double @test_exp10_f64(double %x) nounwind {
7875
%ret = call double @llvm.exp10.f64(double %x)
7976
ret double %ret
8077
}
81-
82-
define x86_fp80 @test_exp10_f80(x86_fp80 %x) nounwind {
83-
; LINUX-LABEL: test_exp10_f80:
84-
; LINUX: # %bb.0:
85-
; LINUX-NEXT: subq $24, %rsp
86-
; LINUX-NEXT: fldt {{[0-9]+}}(%rsp)
87-
; LINUX-NEXT: fstpt (%rsp)
88-
; LINUX-NEXT: callq exp10l@PLT
89-
; LINUX-NEXT: addq $24, %rsp
90-
; LINUX-NEXT: retq
91-
;
92-
; APPLE-LABEL: test_exp10_f80:
93-
; APPLE: ## %bb.0:
94-
; APPLE-NEXT: subq $24, %rsp
95-
; APPLE-NEXT: fldt {{[0-9]+}}(%rsp)
96-
; APPLE-NEXT: fstpt (%rsp)
97-
; APPLE-NEXT: callq _exp10l
98-
; APPLE-NEXT: addq $24, %rsp
99-
; APPLE-NEXT: retq
100-
;
101-
; GISEL-X86-LABEL: test_exp10_f80:
102-
; GISEL-X86: # %bb.0:
103-
; GISEL-X86-NEXT: subl $12, %esp
104-
; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)
105-
; GISEL-X86-NEXT: fstpt (%esp)
106-
; GISEL-X86-NEXT: calll exp10l
107-
; GISEL-X86-NEXT: addl $12, %esp
108-
; GISEL-X86-NEXT: retl
109-
;
110-
; GISEL-X64-LABEL: test_exp10_f80:
111-
; GISEL-X64: # %bb.0:
112-
; GISEL-X64-NEXT: subq $24, %rsp
113-
; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)
114-
; GISEL-X64-NEXT: fstpt (%rsp)
115-
; GISEL-X64-NEXT: callq exp10l
116-
; GISEL-X64-NEXT: addq $24, %rsp
117-
; GISEL-X64-NEXT: retq
118-
%ret = call x86_fp80 @llvm.exp10.f80(x86_fp80 %x)
119-
ret x86_fp80 %ret
120-
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
; RUN: llc -mtriple=x86_64-linux-gnu < %s | FileCheck -check-prefix=LINUX %s
2+
; RUN: not llc -mtriple=x86_64-apple-macos10.9 < %s 2>&1 | FileCheck -check-prefix=ERR %s
3+
; RUN: not llc -mtriple=x86_64-apple-ios9.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
4+
; RUN: not llc -mtriple=x86_64-apple-tvos9.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
5+
; RUN: not llc -mtriple=x86_64-apple-watchos9.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
6+
; RUN: not llc -mtriple=x86_64-apple-xros9.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
7+
; RUN: not llc -mtriple=x86_64-apple-ios8.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
8+
; RUN: not llc -mtriple=x86_64-apple-tvos8.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
9+
; RUN: not llc -mtriple=x86_64-apple-xros8.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
10+
; RUN: not llc -mtriple=x86_64-apple-driverkit < %s 2>&1 | FileCheck -check-prefix=ERR %s
11+
; RUN: not llc -mtriple=x86_64-apple-driverkit24.0 < %s 2>&1 | FileCheck -check-prefix=ERR %s
12+
; RUN: llc < %s -mtriple=i686-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL-X86
13+
; RUN: llc < %s -mtriple=x86_64-linux-gnu -global-isel -global-isel-abort=1 | FileCheck %s --check-prefix=GISEL-X64
14+
15+
; ERR: no libcall available for fexp10
16+
17+
define x86_fp80 @test_exp10_f80(x86_fp80 %x) nounwind {
18+
; LINUX-LABEL: test_exp10_f80:
19+
; LINUX: # %bb.0:
20+
; LINUX-NEXT: subq $24, %rsp
21+
; LINUX-NEXT: fldt {{[0-9]+}}(%rsp)
22+
; LINUX-NEXT: fstpt (%rsp)
23+
; LINUX-NEXT: callq exp10l@PLT
24+
; LINUX-NEXT: addq $24, %rsp
25+
; LINUX-NEXT: retq
26+
;
27+
; GISEL-X86-LABEL: test_exp10_f80:
28+
; GISEL-X86: # %bb.0:
29+
; GISEL-X86-NEXT: subl $12, %esp
30+
; GISEL-X86-NEXT: fldt {{[0-9]+}}(%esp)
31+
; GISEL-X86-NEXT: fstpt (%esp)
32+
; GISEL-X86-NEXT: calll exp10l
33+
; GISEL-X86-NEXT: addl $12, %esp
34+
; GISEL-X86-NEXT: retl
35+
;
36+
; GISEL-X64-LABEL: test_exp10_f80:
37+
; GISEL-X64: # %bb.0:
38+
; GISEL-X64-NEXT: subq $24, %rsp
39+
; GISEL-X64-NEXT: fldt {{[0-9]+}}(%rsp)
40+
; GISEL-X64-NEXT: fstpt (%rsp)
41+
; GISEL-X64-NEXT: callq exp10l
42+
; GISEL-X64-NEXT: addq $24, %rsp
43+
; GISEL-X64-NEXT: retq
44+
%ret = call x86_fp80 @llvm.exp10.f80(x86_fp80 %x)
45+
ret x86_fp80 %ret
46+
}

0 commit comments

Comments
 (0)