On Mon, 30 Jun 2025, Richard Biener wrote:
> > * gcc.target/i386/pr116979.c > > > > Here we check that FMA is used for complex multiplication. This is a case > > where use of FMA is detrimental for accuracy, but I guess we can choose > > to preserve the status quo. I can look into teaching > > expand_complex_multiplication to emit FMAs. > > Yeah, I guess that's within -ffp-contract=on constraints. When you say it's > detrimental for accuracy, is that a general statement for complex multiply > lowering? If so we possibly do not want FMAs? We may want FMAs when completely disregarding accuracy for speed (-ffast-math), but otherwise, yes, I meant that in general our strategy is not good. We are lowering complex multiplication by components (x + yi)*(z + wi) = (x*z - y*w) + (x*w + y*z)i and when FMA is available, we end up with something like fma(x, z, -y*w) for the real part and likewise fma(x, w, y*z) for the imaginary part, which is asymmetrical with respect to operands, and, for instance, yields wrong results for conjugate vectors: take z=x and w=-y, then imaginary part fma(x, w, y*z) is fma(x, -y, y*x), which is negated round-off tail of y*x, but should be zero. FMA is useful for improving accuracy of sum/difference of two products, where you'd compute x*w + y*z as xw = x*w xw_tail = fma(x, w, -xw) tmp = fma(y, z, xw) return tmp + xw_tail but apart from this, I'd say we don't want to emit FMAs in expand_complex_multiplication. LLVM seems to produce FMAs for complex product only under -ffp-contract=fast. What are the next steps here, then? Thank you. Alexander