Skip to content

Commit

Permalink
Add __builtin_set_flt_rounds
Browse files Browse the repository at this point in the history
This builtin will be converted to llvm.set.rounding intrinsic
in IR level and should be work with "#pragma STDC FENV_ACCESS ON"
since it changes default FP environment. Users can change rounding
mode via this builtin without introducing libc dependency.

Reviewed by: andrew.w.kaylor, rjmccall, sepavloff, aaron.ballman
Differential Revision: https://reviews.llvm.org/D145765
Signed-off-by: jinge90 <ge.jin@intel.com>
  • Loading branch information
jinge90 committed Mar 15, 2023
1 parent f3b9912 commit b38aa29
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 0 deletions.
1 change: 1 addition & 0 deletions clang/docs/ReleaseNotes.rst
Expand Up @@ -304,6 +304,7 @@ Floating Point Support in Clang
- Add ``__builtin_elementwise_log2`` builtin for floating point types only.
- Add ``__builtin_elementwise_exp`` builtin for floating point types only.
- Add ``__builtin_elementwise_exp2`` builtin for floating point types only.
- Add ``__builtin_set_flt_rounds`` builtin for X86, x86_64, Arm and AArch64 only.

AST Matchers
------------
Expand Down
1 change: 1 addition & 0 deletions clang/include/clang/Basic/Builtins.def
Expand Up @@ -397,6 +397,7 @@ BUILTIN(__builtin_truncf16, "hh", "Fnc")

// Access to floating point environment
BUILTIN(__builtin_flt_rounds, "i", "n")
BUILTIN(__builtin_set_flt_rounds, "vi", "n")

// C99 complex builtins
BUILTIN(__builtin_cabs, "dXd", "Fne")
Expand Down
8 changes: 8 additions & 0 deletions clang/lib/CodeGen/CGBuiltin.cpp
Expand Up @@ -3381,6 +3381,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
return RValue::get(Result);
}

case Builtin::BI__builtin_set_flt_rounds: {
Function *F = CGM.getIntrinsic(Intrinsic::set_rounding);

Value *V = EmitScalarExpr(E->getArg(0));
Builder.CreateCall(F, V);
return RValue::get(nullptr);
}

case Builtin::BI__builtin_fpclassify: {
CodeGenFunction::CGFPOptionsRAII FPOptsRAII(*this, E);
// FIXME: for strictfp/IEEE-754 we need to not trap on SNaN here.
Expand Down
8 changes: 8 additions & 0 deletions clang/lib/Sema/SemaChecking.cpp
Expand Up @@ -2146,6 +2146,14 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
return ExprError();
break;

case Builtin::BI__builtin_set_flt_rounds:
if (CheckBuiltinTargetInSupported(*this, BuiltinID, TheCall,
{llvm::Triple::x86, llvm::Triple::x86_64,
llvm::Triple::arm, llvm::Triple::thumb,
llvm::Triple::aarch64}))
return ExprError();
break;

case Builtin::BI__builtin_isgreater:
case Builtin::BI__builtin_isgreaterequal:
case Builtin::BI__builtin_isless:
Expand Down
8 changes: 8 additions & 0 deletions clang/test/CodeGen/builtin_set_flt_rounds.c
@@ -0,0 +1,8 @@
// RUN: %clang_cc1 -triple x86_64-gnu-linux %s -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 -triple x86_64-windows-msvc %s -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 -triple aarch64-gnu-linux %s -emit-llvm -o - | FileCheck %s
// RUN: %clang_cc1 -triple aarch64-windows-msvc %s -emit-llvm -o - | FileCheck %s
void test_builtin_set_flt_rounds() {
__builtin_set_flt_rounds(1);
// CHECK: call void @llvm.set.rounding(i32 1)
}
8 changes: 8 additions & 0 deletions clang/test/Sema/builtin_set_flt_rounds.c
@@ -0,0 +1,8 @@
// RUN: %clang_cc1 -triple mipsel-unknown-linux -fsyntax-only %s -verify=expected,unsupported
// RUN: %clang_cc1 -triple x86_64-gnu-linux -fsyntax-only %s -verify
struct S {int a;};
void test_builtin_set_flt_rounds() {
__builtin_set_flt_rounds(1); // unsupported-error {{builtin is not supported on this target}}
struct S s;
__builtin_set_flt_rounds(s); // expected-error {{passing 'struct S' to parameter of incompatible type}}
}

0 comments on commit b38aa29

Please sign in to comment.