Codegen: [PPC] Fix PPCVSXFMAMutate to handle duplicates.
authorKyle Butt <kyle+llvm@iteratee.net>
Wed, 3 Feb 2016 01:41:09 +0000 (01:41 +0000)
committerKyle Butt <kyle+llvm@iteratee.net>
Wed, 3 Feb 2016 01:41:09 +0000 (01:41 +0000)
commitd62d8b771d3cc51b0b9e095011c7a1a6f83ce477
tree0b4dcccce8ae6c9d0c00306bd34d23f91e92e3cc
parent4a38201176fc8e8822fbdace03bb98ee75cac82a
Codegen: [PPC] Fix PPCVSXFMAMutate to handle duplicates.

The purpose of PPCVSXFMAMutate is to elide copies by changing FMA forms
on PPC.

    %vreg6<def> = COPY %vreg96
    %vreg6<def,tied1> = XSMADDASP %vreg6<tied0>, %vreg5<kill>, %vreg7
    ;v6 = v6 + v5 * v7

is replaced by

    %vreg5<def,tied1> = XSMADDMSP %vreg5<tied0>, %vreg7, %vreg96
    ;v5 = v5 * v7 + v96

This was broken in the case where the target register was also used as a
multiplicand. Fix this case by checking for it and replacing both uses
with the copied register.

    %vreg6<def> = COPY %vreg96
    %vreg6<def,tied1> = XSMADDASP %vreg6<tied0>, %vreg5<kill>, %vreg6
    ;v6 = v6 + v5 * v6

is replaced by

    %vreg5<def,tied1> = XSMADDMSP %vreg5<tied0>, %vreg96, %vreg96
    ;v5 = v5 * v96 + v96

llvm-svn: 259617
llvm/lib/Target/PowerPC/PPCVSXFMAMutate.cpp
llvm/test/CodeGen/PowerPC/fma-mutate-duplicate-vreg.ll [new file with mode: 0644]