Skip to content

[clang] Make __builtin_expf constexpr. #140841

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
18 changes: 16 additions & 2 deletions clang/include/clang/Basic/Builtins.td
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,22 @@ def ErfcF128 : Builtin {
let Prototype = "__float128(__float128)";
}

def ExpF16F128 : Builtin, F16F128MathTemplate {
def BIExpF : Builtin {
let Spellings = ["__builtin_expf"];
#ifdef LLVM_INTEGRATE_LIBC
let Attributes = [FunctionWithBuiltinPrefix, NoThrow, Const, Constexpr];
#else
let Attributes = [FunctionWithBuiltinPrefix, NoThrow,
ConstIgnoringErrnoAndExceptions];
#endif // LLVM_INTEGRATE_LIBC
let Prototype = "float(float)";
}

def BIExp
: Builtin,
Template<["double", "long double", "_Float16", "__float128"], ["", "l",
"f16",
"f128"]> {
let Spellings = ["__builtin_exp"];
let Attributes = [FunctionWithBuiltinPrefix, NoThrow, ConstIgnoringErrnoAndExceptions];
let Prototype = "T(T)";
Expand Down Expand Up @@ -3742,7 +3757,6 @@ def Exp : FPMathTemplate, LibBuiltin<"math.h"> {
let Spellings = ["exp"];
let Attributes = [NoThrow, ConstIgnoringErrnoAndExceptions];
let Prototype = "T(T)";
let AddBuiltinPrefixedAlias = 1;
}

def Exp2 : FPMathTemplate, LibBuiltin<"math.h"> {
Expand Down
22 changes: 22 additions & 0 deletions clang/lib/AST/ByteCode/InterpBuiltin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "clang/Basic/TargetBuiltins.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/Support/SipHash.h"

namespace clang {
Expand Down Expand Up @@ -419,6 +420,13 @@ static bool interp__builtin_copysign(InterpState &S, CodePtr OpPC,
return true;
}

static bool interp__builtin_exp(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame) {
APFloat Result = exp(S.Stk.peek<Floating>().getAPFloat());
S.Stk.push<Floating>(Floating(Result));
return true;
}

static bool interp__builtin_fmin(InterpState &S, CodePtr OpPC,
const InterpFrame *Frame, bool IsNumBuiltin) {
const Floating &LHS = S.Stk.peek<Floating>(align(primSize(PT_Float)) * 2);
Expand Down Expand Up @@ -2315,6 +2323,20 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
return false;
break;

case Builtin::BI__builtin_exp:
case Builtin::BI__builtin_expl:
case Builtin::BI__builtin_expf16:
case Builtin::BI__builtin_expf128:
return false;
case Builtin::BI__builtin_expf:
#ifdef LLVM_INTEGRATE_LIBC
if (!interp__builtin_exp(S, OpPC, Frame))
return false;
break;
#else
return false;
#endif // LLVM_INTEGRATE_LIBC

case Builtin::BI__builtin_fmin:
case Builtin::BI__builtin_fminf:
case Builtin::BI__builtin_fminl:
Expand Down
19 changes: 19 additions & 0 deletions clang/lib/AST/ExprConstant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Config/llvm-config.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/SaveAndRestore.h"
Expand Down Expand Up @@ -15711,6 +15712,24 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
return true;
}

// FIXME: allow other __builtin_exp* to be constexpr.
case Builtin::BI__builtin_exp:
case Builtin::BI__builtin_expl:
case Builtin::BI__builtin_expf16:
case Builtin::BI__builtin_expf128:
return false;
case Builtin::BI__builtin_expf: {
#ifdef LLVM_INTEGRATE_LIBC
APFloat Input(0.);
if (!EvaluateFloat(E->getArg(0), Input, Info))
return false;
Result = exp(Input);
return true;
#else
return false;
#endif // LLVM_INTEGRATE_LIBC
}

case Builtin::BI__builtin_fmax:
case Builtin::BI__builtin_fmaxf:
case Builtin::BI__builtin_fmaxl:
Expand Down
1 change: 1 addition & 0 deletions clang/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ llvm_canonicalize_cmake_booleans(
LLVM_TOOL_LLVM_DRIVER_BUILD
LLVM_INCLUDE_SPIRV_TOOLS_TESTS
LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS
LLVM_INTEGRATE_LIBC
)

configure_lit_site_cfg(
Expand Down
10 changes: 10 additions & 0 deletions clang/test/Preprocessor/feature_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,16 @@
#error Clang should have these constexpr builtins
#endif

#ifdef LLVM_INTEGRATE_LIBC
#if !__has_constexpr_builtin(__builtin_expf)
#error Clang should have these constexpr builtins
#endif
#else
#if __has_constexpr_builtin(__builtin_expf)
#error This builtin should not be constexpr in Clang
#endif
#endif // LLVM_INTEGRATE_LIBC

#if !__has_constexpr_builtin(__builtin_convertvector)
#error Clang should have these constexpr builtins
#endif
Expand Down
12 changes: 12 additions & 0 deletions clang/test/Sema/constant-builtins-exp.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify %s
// RUN: %clang_cc1 -std=c++17 -fsyntax-only -verify -fexperimental-new-constant-interpreter %s
// REQUIRES: llvm_integrate_libc
// expected-no-diagnostics

constexpr float Inf = __builtin_inff();
constexpr float NegInf = -__builtin_inff();

static_assert(Inf == __builtin_expf(Inf));
static_assert(0.0f == __builtin_expf(NegInf));
static_assert(1.0f == __builtin_expf(0.0f));
static_assert(0x1.5bf0a8p1f == __builtin_expf(1.0f));
3 changes: 3 additions & 0 deletions clang/test/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -385,3 +385,6 @@ def calculate_arch_features(arch_string):
# possibly be present in system and user configuration files, so disable
# default configs for the test runs.
config.environment["CLANG_NO_DEFAULT_CONFIG"] = "1"

if config.llvm_integrate_libc:
config.available_features.add("llvm_integrate_libc")
1 change: 1 addition & 0 deletions clang/test/lit.site.cfg.py.in
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@
config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@
config.substitutions.append(("%llvm-version-major", "@LLVM_VERSION_MAJOR@"))
config.has_key_instructions = @LLVM_EXPERIMENTAL_KEY_INSTRUCTIONS@
config.llvm_integrate_libc = @LLVM_INTEGRATE_LIBC@

import lit.llvm
lit.llvm.initialize(lit_config, config)
Expand Down
4 changes: 4 additions & 0 deletions libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ function(_get_compile_options_from_config output_var)
list(APPEND config_options "-DLIBC_MATH=${LIBC_CONF_MATH_OPTIMIZATIONS}")
endif()

if(LIBC_CONF_ERRNO_MODE)
set(APPEND config_options "-DLIBC_ERRNO_MODE=${LIBC_CONF_ERRNO_MODE}")
endif()

set(${output_var} ${config_options} PARENT_SCOPE)
endfunction(_get_compile_options_from_config)

Expand Down
4 changes: 3 additions & 1 deletion libc/cmake/modules/LLVMLibCTestRules.cmake
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
function(_get_common_test_compile_options output_var c_test flags)
_get_compile_options_from_flags(compile_flags ${flags})
_get_compile_options_from_config(config_flags)

# Remove -fno-math-errno if it was added.
if(LIBC_ADD_FNO_MATH_ERRNO)
Expand All @@ -9,7 +10,8 @@ function(_get_common_test_compile_options output_var c_test flags)
set(compile_options
${LIBC_COMPILE_OPTIONS_DEFAULT}
${LIBC_TEST_COMPILE_OPTIONS_DEFAULT}
${compile_flags})
${compile_flags}
${config_flags})

if(LLVM_LIBC_COMPILER_IS_GCC_COMPATIBLE)
list(APPEND compile_options "-fpie")
Expand Down
2 changes: 1 addition & 1 deletion libc/docs/configure.rst
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ to learn about the defaults for your platform and target.
* **"general" options**
- ``LIBC_ADD_NULL_CHECKS``: Add nullptr checks in the library's implementations to some functions for which passing nullptr is undefined behavior.
* **"math" options**
- ``LIBC_CONF_FREXP_INF_NAN_EXPONENT``: The value written back to the second parameter when calling frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is unspecified. Configure an explicit exp value for Inf/NaN inputs.
- ``LIBC_CONF_FREXP_INF_NAN_EXPONENT``: The value written back to the second parameter when calling frexp/frexpf/frexpl` with `+/-Inf`/`NaN` is unspecified. Configue an explicit exp value for Inf/NaN inputs.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this reverts a landed fix to docs?

- ``LIBC_CONF_MATH_OPTIMIZATIONS``: Configures optimizations for math functions. Values accepted are LIBC_MATH_SKIP_ACCURATE_PASS, LIBC_MATH_SMALL_TABLES, LIBC_MATH_NO_ERRNO, LIBC_MATH_NO_EXCEPT, and LIBC_MATH_FAST.
* **"printf" options**
- ``LIBC_CONF_PRINTF_DISABLE_FIXED_POINT``: Disable printing fixed point values in printf and friends.
Expand Down
4 changes: 2 additions & 2 deletions libc/docs/dev/code_style.rst
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ test infrastructure itself can be affected. To avoid perturbing the unit test
infrastructure around the setting of ``errno``, the following rules are to be
followed:

#. A special macro named ``libc_errno`` defined in ``src/errno/libc_errno.h``
#. A special macro named ``libc_errno`` defined in ``src/__support/libc_errno.h``
should be used when setting ``errno`` from libc runtime code. For example,
code to set ``errno`` to ``EINVAL`` should be:

Expand All @@ -117,7 +117,7 @@ followed:
`ErrorOr <https://github.com/llvm/llvm-project/blob/main/libc/src/__support/error_or.h>`_
to return error values.

#. The header file ``src/errno/libc_errno.h`` is shipped as part of the target
#. The header file ``src/__support/libc_errno.h`` is shipped as part of the target
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this bullet point be revisited? I think that if we're using system errno, targets no longer need to depend on errno. For full-build, conversely, system errno shouldn't be feasible?

corresponding to the ``errno`` entrypoint ``libc.src.errno.errno``. We do
not in general allow dependencies between entrypoints. However, the ``errno``
entrypoint is the only exceptional entrypoint on which other entrypoints
Expand Down
22 changes: 22 additions & 0 deletions libc/shared/math.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//===-- Floating point math functions ---------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIBC_SHARED_MATH_H
#define LLVM_LIBC_SHARED_MATH_H

#include "src/__support/math/expf.h"

namespace LIBC_NAMESPACE_DECL {
namespace shared {

using math::expf;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if there's any value in having a per-function (or per-function-group) header? E.g. libc/shared/math/exp.h . Otherwise the user who wants to use just one function will include header with all of them, potentially pulling in a bunch of deps they don't want (or won't work on their system).


} // namespace shared
} // namespace LIBC_NAMESPACE_DECL

#endif // LLVM_LIBC_SHARED_FP_BITS_H
2 changes: 2 additions & 0 deletions libc/src/__support/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -381,3 +381,5 @@ add_subdirectory(HashTable)
add_subdirectory(fixed_point)

add_subdirectory(time)

add_subdirectory(math)
2 changes: 1 addition & 1 deletion libc/src/__support/FPUtil/FEnvImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
#include "hdr/fenv_macros.h"
#include "hdr/math_macros.h"
#include "hdr/types/fenv_t.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/attributes.h" // LIBC_INLINE
#include "src/__support/macros/config.h"
#include "src/__support/macros/properties/architectures.h"
#include "src/errno/libc_errno.h"

#if defined(LIBC_TARGET_ARCH_IS_AARCH64) && defined(__ARM_FP)
#if defined(__APPLE__)
Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/File/dir.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
#include "src/__support/CPP/mutex.h" // lock_guard
#include "src/__support/CPP/new.h"
#include "src/__support/error_or.h"
#include "src/__support/libc_errno.h" // For error macros
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h" // For error macros

namespace LIBC_NAMESPACE_DECL {

Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/File/file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
#include "hdr/types/off_t.h"
#include "src/__support/CPP/new.h"
#include "src/__support/CPP/span.h"
#include "src/__support/libc_errno.h" // For error macros
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h" // For error macros

namespace LIBC_NAMESPACE_DECL {

Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/File/linux/file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
#include "src/__support/File/linux/lseekImpl.h"
#include "src/__support/OSUtil/fcntl.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/libc_errno.h" // For error macros
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h" // For error macros

#include "hdr/fcntl_macros.h" // For mode_t and other flags to the open syscall
#include <sys/stat.h> // For S_IS*, S_IF*, and S_IR* flags.
Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/File/linux/lseekImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/__support/error_or.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"

#include <stdint.h> // For uint64_t.
#include <sys/syscall.h> // For syscall numbers.
Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/HashTable/randomness.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include "src/__support/macros/attributes.h"
#include "src/__support/macros/config.h"
#if defined(LIBC_HASHTABLE_USE_GETRANDOM)
#include "src/errno/libc_errno.h"
#include "src/__support/libc_errno.h"
#include "src/sys/random/getrandom.h"
#endif

Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/OSUtil/linux/fcntl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
#include "hdr/types/struct_flock64.h"
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"

#include <stdarg.h>
#include <sys/syscall.h> // For syscall numbers.
Expand Down
2 changes: 1 addition & 1 deletion libc/src/__support/OSUtil/linux/vdso.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
#include "src/__support/CPP/array.h"
#include "src/__support/CPP/optional.h"
#include "src/__support/CPP/string_view.h"
#include "src/__support/libc_errno.h"
#include "src/__support/threads/callonce.h"
#include "src/__support/threads/linux/futex_word.h"
#include "src/errno/libc_errno.h"
#include "src/sys/auxv/getauxval.h"
#include <linux/auxvec.h>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
#define LLVM_LIBC_SRC___SUPPORT_STRINGUTIL_TABLES_LINUX_EXTENSION_ERRORS_H

#include "src/__support/StringUtil/message_mapper.h"
#include "src/__support/libc_errno.h"
#include "src/__support/macros/config.h"
#include "src/errno/libc_errno.h"

namespace LIBC_NAMESPACE_DECL {

Expand Down
Loading
Loading