[libcxx-commits] [libcxx] [clang] [PowerPC] Emit libcall to frexpl for calls to frexp(ppcDoublDouble) (PR #75226)
via libcxx-commits
libcxx-commits at lists.llvm.org
Tue Dec 12 09:49:53 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libcxx
@llvm/pr-subscribers-clang-codegen
Author: Lei Huang (lei137)
<details>
<summary>Changes</summary>
On Linux PPC call lib func ``frexpl`` for calls to ``frexp()`` for input of type PPCDoubleDouble.
Fixes bug: https://github.com/llvm/llvm-project/issues/64426
---
Full diff: https://github.com/llvm/llvm-project/pull/75226.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/CGBuiltin.cpp (+15-1)
- (modified) libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp (-6)
``````````diff
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 83d0a72aac5495..7a700155149e8f 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -137,6 +137,10 @@ llvm::Constant *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
{Builtin::BI__builtin_modfl, "modf"},
};
+ static SmallDenseMap<unsigned, StringRef, 4> PPCDoubleDoubleBuiltins{
+ {Builtin::BI__builtin_frexpl, "frexpl"},
+ };
+
// If the builtin has been declared explicitly with an assembler label,
// use the mangled name. This differs from the plain label on platforms
// that prefix labels.
@@ -149,6 +153,10 @@ llvm::Constant *CodeGenModule::getBuiltinLibFunction(const FunctionDecl *FD,
&getTarget().getLongDoubleFormat() == &llvm::APFloat::IEEEquad() &&
F128Builtins.contains(BuiltinID))
Name = F128Builtins[BuiltinID];
+ else if (getTriple().isPPC() && getTriple().isOSLinux() &&
+ &getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble()
+ && PPCDoubleDoubleBuiltins.contains(BuiltinID))
+ Name = PPCDoubleDoubleBuiltins[BuiltinID];
else if (getTriple().isOSAIX() &&
&getTarget().getLongDoubleFormat() ==
&llvm::APFloat::IEEEdouble() &&
@@ -3410,9 +3418,15 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
{ Src0->getType(), Src1->getType() });
return RValue::get(Builder.CreateCall(F, { Src0, Src1 }));
}
+ case Builtin::BI__builtin_frexpl: {
+ auto &Triple = getTarget().getTriple();
+ if (Triple.isPPC() && Triple.isOSLinux() &&
+ &getTarget().getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble())
+ break;
+ LLVM_FALLTHROUGH;
+ }
case Builtin::BI__builtin_frexp:
case Builtin::BI__builtin_frexpf:
- case Builtin::BI__builtin_frexpl:
case Builtin::BI__builtin_frexpf128:
case Builtin::BI__builtin_frexpf16:
return RValue::get(emitFrexpBuiltin(*this, E, Intrinsic::frexp));
diff --git a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
index 31511064ce7ca5..a07260a34516f1 100644
--- a/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
+++ b/libcxx/test/libcxx/numerics/c.math/constexpr-cxx23-clang.pass.cpp
@@ -58,15 +58,9 @@ int main(int, char**) {
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0f, &DummyInt) == 0.0f);
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0, &DummyInt) == 0.0);
-//FIXME: currently linux powerpc does not support this expansion
-// since 0.0L lowers to ppcf128 and special handling is required.
-#if !defined(__LONG_DOUBLE_IBM128__)
ASSERT_NOT_CONSTEXPR_CXX23(std::frexp(0.0L, &DummyInt) == 0.0L);
-#endif
ASSERT_NOT_CONSTEXPR_CXX23(std::frexpf(0.0f, &DummyInt) == 0.0f);
-#if !defined(__LONG_DOUBLE_IBM128__)
ASSERT_NOT_CONSTEXPR_CXX23(std::frexpl(0.0L, &DummyInt) == 0.0L);
-#endif
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogb(1.0f) == 0);
ASSERT_NOT_CONSTEXPR_CXX23(std::ilogb(1.0) == 0);
``````````
</details>
https://github.com/llvm/llvm-project/pull/75226
More information about the libcxx-commits
mailing list