Skip to content

Commit

Permalink
[x86][Windows] Fix chromium build break
Browse files Browse the repository at this point in the history
Windows does not support float C89 math functions like:
- acosf
- asinf
- atanf
- coshf
- sinhf
- tanhf
These 6 libfuncs need to be type promoted.

This PR fixes the bug introduced by llvm#98949
  • Loading branch information
farzonl committed Jul 31, 2024
1 parent 12189f8 commit 6f1bdae
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 27 deletions.
10 changes: 8 additions & 2 deletions llvm/lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2475,16 +2475,22 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
(Subtarget.isTargetWindowsMSVC() || Subtarget.isTargetWindowsItanium()))
// clang-format off
for (ISD::NodeType Op :
{ISD::FCEIL, ISD::STRICT_FCEIL,
{ISD::FACOS, ISD::STRICT_FACOS,
ISD::FASIN, ISD::STRICT_FASIN,
ISD::FATAN, ISD::STRICT_FATAN,
ISD::FCEIL, ISD::STRICT_FCEIL,
ISD::FCOS, ISD::STRICT_FCOS,
ISD::FCOSH, ISD::STRICT_FCOSH,
ISD::FEXP, ISD::STRICT_FEXP,
ISD::FFLOOR, ISD::STRICT_FFLOOR,
ISD::FREM, ISD::STRICT_FREM,
ISD::FLOG, ISD::STRICT_FLOG,
ISD::FLOG10, ISD::STRICT_FLOG10,
ISD::FPOW, ISD::STRICT_FPOW,
ISD::FSIN, ISD::STRICT_FSIN,
ISD::FTAN, ISD::STRICT_FTAN})
ISD::FSINH, ISD::STRICT_FSINH,
ISD::FTAN, ISD::STRICT_FTAN,
ISD::FTANH, ISD::STRICT_FTANH})
if (isOperationExpand(Op, MVT::f32))
setOperationAction(Op, MVT::f32, Promote);
// clang-format on
Expand Down
67 changes: 42 additions & 25 deletions llvm/test/CodeGen/X86/fp-strict-libcalls-msvc32.ll
Original file line number Diff line number Diff line change
Expand Up @@ -180,12 +180,15 @@ define float @tan(float %x) #0 {
define float @acos(float %x) #0 {
; CHECK-LABEL: acos:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _acos
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _acosf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.acos.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
Expand All @@ -194,12 +197,15 @@ define float @acos(float %x) #0 {
define float @asin(float %x) #0 {
; CHECK-LABEL: asin:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _asin
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _asinf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.asin.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
Expand All @@ -208,12 +214,15 @@ define float @asin(float %x) #0 {
define float @atan(float %x) #0 {
; CHECK-LABEL: atan:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _atanf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: calll _atan
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.atan.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
Expand All @@ -222,12 +231,15 @@ define float @atan(float %x) #0 {
define float @cosh(float %x) #0 {
; CHECK-LABEL: cosh:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _cosh
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _coshf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.cosh.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
Expand All @@ -236,26 +248,31 @@ define float @cosh(float %x) #0 {
define float @sinh(float %x) #0 {
; CHECK-LABEL: sinh:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _sinh
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _sinhf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.sinh.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
}

define float @tanh(float %x) #0 {
; CHECK-LABEL: tanh:
; CHECK: # %bb.0:
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: subl $12, %esp
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: fstps (%esp)
; CHECK-NEXT: fstpl (%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: calll _tanhf
; CHECK-NEXT: popl %eax
; CHECK-NEXT: calll _tanh
; CHECK-NEXT: fstps {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: wait
; CHECK-NEXT: addl $12, %esp
; CHECK-NEXT: retl
%result = call float @llvm.experimental.constrained.tanh.f32(float %x, metadata !"round.dynamic", metadata !"fpexcept.strict") #0
ret float %result
Expand Down

0 comments on commit 6f1bdae

Please sign in to comment.