I noticed that __builtin_assoc_barrier makes a differnce for FMAs formation
but it was not documented. This adds that documentation even with a small 
example.

Build the HTML documents to make sure everything looks correct.

gcc/ChangeLog:

        PR middle-end/115023
        * doc/extend.texi (__builtin_assoc_barrier): Document ffp-contract=fast
        and FMA usage.

Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com>
---
 gcc/doc/extend.texi | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index ad1821e3e23..5902e76f043 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -15555,8 +15555,7 @@ This built-in inhibits re-association of the 
floating-point expression
 @var{expr} with expressions consuming the return value of the built-in. The
 expression @var{expr} itself can be reordered, and the whole expression
 @var{expr} can be reordered with operands after the barrier. The barrier is
-only relevant when @code{-fassociative-math} is active, since otherwise
-floating-point is not treated as associative.
+relevant when @code{-fassociative-math} is active.
 
 @smallexample
 float x0 = a + b - b;
@@ -15566,6 +15565,19 @@ float x1 = __builtin_assoc_barrier(a + b) - b;
 @noindent
 means that, with @code{-fassociative-math}, @code{x0} can be optimized to
 @code{x0 = a} but @code{x1} cannot.
+
+It is also relevant when @code{-ffp-contract=fast} is active;
+it will prevent contraction between expressions.
+
+@smallexample
+float x0 = a * b + c;
+float x1 = __builtin_assoc_barrier (a * b) + c;
+@end smallexample
+
+@noindent
+means that, with @code{-ffp-contract=fast}, @code{x0} may be optimized to
+use a fused multiply-add instruction but @code{x1} cannot.
+
 @enddefbuiltin
 
 @defbuiltin{{void *} __builtin_assume_aligned (const void *@var{exp}, size_t 
@var{align}, ...)}
-- 
2.43.0

Reply via email to