[LLVMdev] Commutability of X86 FMA3 instructions.

Lang Hames lhames at gmail.com
Thu Dec 19 21:45:22 PST 2013


Hi all,

The 213 variant of the FMA3 instructions is currently marked
commutable (see X86InstrFMA.td). Is that safe? According to the ISA
the FMA3 instructions aren't commutable for non-numeric results, so
I'd have thought commuting this would only be valid in fast-math mode?

For the curious, the reason that I'm asking is that we currently
always select the 213 variant, but this introduces an extra copies in
accumulator-style loops. Something like:

while (...)
  accumulator = x * y + accumulator;

yields:

loop:
  vfmadd.213 y, x, acc
  vmovaps acc, x
  decl count
  jne loop

instead of

loop:
  vfmadd.231 acc, x, y
  decl count
  jne loop

I have started writing a patch to generate the 231 variant by default,
and I want to know whether I need to go to the trouble of adding
custom commute logic. If these things aren't commutable then I don't
need to worry at all. If they are commutable, but only in fast-math
mode, then I can support that too.

Thanks for the help!

- Lang.



More information about the llvm-dev mailing list