On Sat, 2019-12-21 at 00:34 +0100, Jakub Jelinek wrote:
> Hi!
>
> As mentioned in the PR, the following testcase is miscompiled with avx512vl.
> The reason is that the fma *_bcst_1 define_insns have two alternatives:
> "=v,v" "0,v" "v,0" "m,m" and use the same
> vfmadd213* %3<avx512bcst>, %2, %0<sd_mask_op4>
> pattern. If the first alternative is chosen, everything is ok, but if the
> second alternative is chosen, %2 and %0 are the same register, so instead
> of doing dest=dest*another+membcst we do dest=dest*dest+membcst.
> Now, to fix this, either we'd need separate:
> "vfmadd213<ssemodesuffix>\t{%3<avx512bcst>, %2,
> %0<sd_mask_op4>|%0<sd_mask_op4>, %2, %3<avx512bcst>}
> vfmadd213<ssemodesuffix>\t{%3<avx512bcst>, %1,
> %0<sd_mask_op4>|%0<sd_mask_op4>, %1, %3<avx512bcst>}"
> where for the second alternative, we'd just use %1 instead of %2, but
> what I think is actually cleaner is just use a single alternative and
> make the two multiplication operands commutative, which they really are.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2019-12-20 Jakub Jelinek <ja...@redhat.com>
>
> PR target/93009
> * config/i386/sse.md
> (*<sd_mask_codefor>fma_fmadd_<mode><sd_maskz_name>_bcst_1,
> *<sd_mask_codefor>fma_fmsub_<mode><sd_maskz_name>_bcst_1,
> *<sd_mask_codefor>fma_fnmadd_<mode><sd_maskz_name>_bcst_1,
> *<sd_mask_codefor>fma_fnmsub_<mode><sd_maskz_name>_bcst_1): Use
> just a single alternative instead of two, make operands 1 and 2
> commutative.
>
> * gcc.target/i386/avx512vl-pr93009.c: New test.
OK
jeff
>