https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120747
--- Comment #15 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ``` A has higher numerical error (3.09998e+02) B has ok numerical error (3.12012e+02) ... So in dump A we compute x = vnb12 - vnb6 + vnbtot z = FMA(a, b, FMS(vnb12, 1.2e+1, c)) = a * b + vnb12 * 1.2e+1 - c and in dump B we have x = vnbtot - vnb6 + vnb12 z = FMA(vnb12, 1.2e+1, FMS(a, b, c)) = vnb12 * 1.2e+1 + a * b - c ``` So: a * b + (vnb12 * 1.2e+1 - c) vs: vnb12 * 1.2e+1 + (a * b - c) Which matters as which one is done in infinite precision as rounding error is not happening in one case but it is in the other. So it looks like (a * b) are closer in value to (vnb12 * 1.2e+1 - c) than (vnb12 * 1.2e+1) is to (a * b - c) . (or the other way around as I noticed the mention of "higher numerical error" has the one which works), that avoids the rounding error.