[PATCH] D136176: Implement support for option 'fexcess-precision'.
Zahira Ammarguellat via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 21 08:20:37 PST 2022
zahiraam added inline comments.
================
Comment at: clang/docs/UsersManual.rst:1732
+.. option:: -fexcess-precision:
+
+ By default, Clang uses excess precision to calculate ``_Float16``
----------------
rjmccall wrote:
>
> The C and C++ standards allow floating-point expressions to be computed
> as if intermediate results had more precision (and/or a wider range) than the
> type of the expression strictly allows. This is called excess precision arithmetic.
> Excess precision arithmetic can improve the accuracy of results (although not
> always), and it can make computation significantly faster if the target lacks
> direct hardware support for arithmetic in a particular type. However, it can
> also undermine strict floating-point reproducibility.
>
> Under the standards, assignments and explicit casts force the operand to be
> converted to its formal type, discarding any excess precision. Because data
> can only flow between statements via an assignment, this means that the
> use of excess precision arithmetic is a reliable local property of a single
> statement, and results do not change based on optimization. However, when
> excess precision arithmetic is in use, Clang does not guarantee strict
> reproducibility, and future compiler releases may recognize more opportunities
> to use excess precision arithmetic, e.g. with floating-point builtins.
>
> Clang does not use excess precision arithmetic for most types or on most targets.
> For example, even on pre-SSE X86 targets where ``float`` and ``double``
> computations must be performed in the 80-bit X87 format, Clang rounds
> all intermediate results correctly for their type. Clang currently uses excess
> precision arithmetic by default only for the following types and targets:
>
> * ``_Float16`` on X86 targets without ``AVX512-FP16``
>
> The ``-fexcess-precision=<value>`` option can be used to control the use of excess
> precision arithmetic. Valid values are:
>
> * ``standard`` - The default. Allow the use of excess precision arithmetic under
> the constraints of the C and C++ standards. Has no effect except on the types
> and targets listed above.
> * ``fast`` - Accepted for GCC compatibility, but currently treated as an alias
> for ``standard``.
> * ``16`` - Forces ``_Float16`` operations to be emitted without using excess
> precision arithmetic.
>
Thanks.
================
Comment at: clang/lib/Driver/ToolChains/Clang.cpp:2995
+ StringRef Val = A->getValue();
+ if (TC.getTriple().getArch() == llvm::Triple::x86 && Val.equals("16"))
+ D.Diag(diag::err_drv_unsupported_opt_for_target)
----------------
rjmccall wrote:
> zahiraam wrote:
> > andrew.w.kaylor wrote:
> > > Why is 16 only supported for x86? Is it only here for gcc compatibility?
> > Yes for gcc compatibility (although we are using here that value "none" to disable excess precision instead of using "16") and also because we are dealing with excess precision for _Float16 types only, so sticking to X86.
> `llvm::Triple::x86` is just i386, and I think you want to include x86_64, right?
Yes. Thanks.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136176/new/
https://reviews.llvm.org/D136176
More information about the cfe-commits
mailing list