sepavloff updated this revision to Diff 264623. sepavloff added a comment. Updated patch
Default lowering of FLT_ROUNDS_ again is made by replacing the node with constant 1, which denotes rounding to nearest, ties to even. It is incorrect, but is compatible with with current behavior. Using more correct lowering to function call may cause problems for targents that rely on default lowering, because not all C standard libraries implements `__flt_rounds`. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D79322/new/ https://reviews.llvm.org/D79322 Files: clang/include/clang/Basic/Builtins.def llvm/docs/LangRef.rst llvm/include/llvm/IR/Intrinsics.td llvm/include/llvm/IR/RuntimeLibcalls.def llvm/lib/CodeGen/IntrinsicLowering.cpp
Index: llvm/lib/CodeGen/IntrinsicLowering.cpp =================================================================== --- llvm/lib/CodeGen/IntrinsicLowering.cpp +++ llvm/lib/CodeGen/IntrinsicLowering.cpp @@ -426,10 +426,9 @@ break; } case Intrinsic::flt_rounds: - // Lower to "round to the nearest" - if (!CI->getType()->isVoidTy()) - CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1)); - break; + ReplaceCallWith("__flt_rounds", CI, CI->arg_begin(), CI->arg_end(), + Type::getInt32Ty(CI->getContext())); + break; case Intrinsic::invariant_start: case Intrinsic::lifetime_start: // Discard region information. Index: llvm/include/llvm/IR/RuntimeLibcalls.def =================================================================== --- llvm/include/llvm/IR/RuntimeLibcalls.def +++ llvm/include/llvm/IR/RuntimeLibcalls.def @@ -548,6 +548,9 @@ // Return address HANDLE_LIBCALL(RETURN_ADDRESS, nullptr) +// Floating-point Environment +HANDLE_LIBCALL(FLT_ROUNDS_, "__flt_rounds") + HANDLE_LIBCALL(UNKNOWN_LIBCALL, nullptr) #undef HANDLE_LIBCALL Index: llvm/include/llvm/IR/Intrinsics.td =================================================================== --- llvm/include/llvm/IR/Intrinsics.td +++ llvm/include/llvm/IR/Intrinsics.td @@ -612,6 +612,13 @@ [IntrNoMem, IntrSpeculatable, IntrWillReturn, ImmArg<1>, ImmArg<2>, ImmArg<3>]>, GCCBuiltin<"__builtin_object_size">; +//===--------------- Access to Floating Point Environment -----------------===// +// + +let IntrProperties = [IntrInaccessibleMemOnly, IntrWillReturn] in { + def int_flt_rounds : Intrinsic<[llvm_i32_ty], []>; +} + //===--------------- Constrained Floating Point Intrinsics ----------------===// // @@ -1115,8 +1122,6 @@ ///===-------------------------- Other Intrinsics --------------------------===// // -def int_flt_rounds : Intrinsic<[llvm_i32_ty]>, - GCCBuiltin<"__builtin_flt_rounds">; def int_trap : Intrinsic<[], [], [IntrNoReturn, IntrCold]>, GCCBuiltin<"__builtin_trap">; def int_debugtrap : Intrinsic<[]>, Index: llvm/docs/LangRef.rst =================================================================== --- llvm/docs/LangRef.rst +++ llvm/docs/LangRef.rst @@ -18270,6 +18270,46 @@ would and handles error conditions in the same way. +Floating Point Environment Manipulation intrinsics +-------------------------------------------------- + +These functions read or write floating point environment, such as rounding +mode or state of floating point exceptions. Altering the floating point +environment requires special care. See :ref:`Floating Point Environment <floatenv>`. + +'``llvm.flt.rounds``' Intrinsic +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Syntax: +""""""" + +:: + + declare i32 @llvm.flt.rounds() + +Overview: +""""""""" + +The '``llvm.flt.rounds``' intrinsic reads the current rounding mode. + +Semantics: +"""""""""" + +The '``llvm.flt.rounds``' intrinsic returns the current rounding mode. +Encoding of the returned values is same as the result of ``FLT_ROUNDS``, +specified by C standard: + +:: + + 0 - toward zero + 1 - to nearest, ties to even + 2 - toward positive infinity + 3 - toward negative infinity + 4 - to nearest, ties away from zero + +Other values may be used to represent additional rounding modes, supported by a +target. These values are target-specific. + General Intrinsics ------------------ Index: clang/include/clang/Basic/Builtins.def =================================================================== --- clang/include/clang/Basic/Builtins.def +++ clang/include/clang/Basic/Builtins.def @@ -323,6 +323,9 @@ BUILTIN(__builtin_truncl, "LdLd", "Fnc") BUILTIN(__builtin_truncf16, "hh", "Fnc") +// Access to floating point environment +BUILTIN(__builtin_flt_rounds, "i", "n") + // C99 complex builtins BUILTIN(__builtin_cabs, "dXd", "Fne") BUILTIN(__builtin_cabsf, "fXf", "Fne") @@ -517,7 +520,6 @@ BUILTIN(__builtin_extract_return_addr, "v*v*", "n") BUILTIN(__builtin_frame_address, "v*IUi", "n") BUILTIN(__builtin___clear_cache, "vc*c*", "n") -BUILTIN(__builtin_flt_rounds, "i", "nc") BUILTIN(__builtin_setjmp, "iv**", "j") BUILTIN(__builtin_longjmp, "vv**i", "r") BUILTIN(__builtin_unwind_init, "v", "")
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits