-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Invalid lowering of llvm.*.f128 intrinsics #44744
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Labels
Comments
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Aug 12, 2023
Change the lowering of 128-bit floating point math function intrinsics to use binary128 functions (`sqrtf128`) rather than `long double` functions (`sqrtl`). Currently intrinsic calls such as `@llvm.sqrt.f128` are lowered to libc's `long double` functions. On platforms where `long double` is not `fp128`, this results in incorrect math. define fp128 @test_sqrt(fp128 %a) { start: %0 = tail call fp128 @llvm.sqrt.f128(fp128 %a) ret fp128 %0 } declare fp128 @llvm.sqrt.f128(fp128) lowers to test_sqrt: # @test_sqrt jmp sqrtl@PLT # TAILCALL On x86 this results in the binary128 argument being treated as 80-bit extended precision. This has no effect on clang, which lowers builtins to the libc calls directly without going through LLVM intrinsics. Fixes llvm#44744
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Aug 14, 2023
`f128` intrinsic functions lower to incorrect libc calls. Add a test showing current behavior. [IR] Correct lowering of `f128` intrinsics Change the lowering of 128-bit floating point math function intrinsics to use binary128 functions (`sqrtf128`) rather than `long double` functions (`sqrtl`). Currently intrinsic calls such as `@llvm.sqrt.f128` are lowered to libc's `long double` functions. On platforms where `long double` is not `fp128`, this results in incorrect math. define fp128 @test_sqrt(fp128 %a) { start: %0 = tail call fp128 @llvm.sqrt.f128(fp128 %a) ret fp128 %0 } declare fp128 @llvm.sqrt.f128(fp128) lowers to test_sqrt: # @test_sqrt jmp sqrtl@PLT # TAILCALL On x86 this results in the binary128 argument being treated as 80-bit extended precision. This has no effect on clang, which lowers builtins to the libc calls directly without going through LLVM intrinsics. Fixes llvm#44744 Differential Revision: https://reviews.llvm.org/D157836
I started a patch for this here https://reviews.llvm.org/D157836 |
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Dec 30, 2023
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Jan 13, 2024
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Jan 20, 2024
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
tgross35
added a commit
to tgross35/rust
that referenced
this issue
Jul 30, 2024
Due to a LLVM bug, `f128` math functions link successfully but LLVM chooses the wrong symbols (`long double` symbols rather than those for binary128). Since this is a notable problem that may surprise a number of users, add a note about it. Link: llvm/llvm-project#44744
tgross35
added a commit
to tgross35/rust
that referenced
this issue
Aug 1, 2024
Due to a LLVM bug, `f128` math functions link successfully but LLVM chooses the wrong symbols (`long double` symbols rather than those for binary128). Since this is a notable problem that may surprise a number of users, add a note about it. Link: llvm/llvm-project#44744
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Feb 27, 2025
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Feb 27, 2025
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
tgross35
added a commit
to tgross35/llvm-project
that referenced
this issue
Mar 1, 2025
Switch from emitting long double functions to using `f128`-specific functions. Fixes llvm#44744.
# for free
to join this conversation on GitHub.
Already have an account?
# to comment
Extended Description
llvm.sin.f128 is incorrectly lowered to a call to sinl, which takes a f80: https://godbolt.org/z/M9fjLW
generates:
which is missing conversions from and to x86_fp80.
I expect a correct lowering to be:
The text was updated successfully, but these errors were encountered: