[PowerPC] Avoid VSX FMA mutate when killed product reg = addend reg
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Tue, 21 Oct 2014 13:02:37 +0000 (13:02 +0000)
committerBill Schmidt <wschmidt@linux.vnet.ibm.com>
Tue, 21 Oct 2014 13:02:37 +0000 (13:02 +0000)
commit41454cc88bfbf16ae4aa89d4398ac034d98e7883
treee8c232165cc759451ad9d0c4b7fdab8cb7b59b31
parent00e0b8a01652bcd3bcfaa817d3ff5cb230cb68f6
[PowerPC] Avoid VSX FMA mutate when killed product reg = addend reg

With VSX enabled, test/CodeGen/PowerPC/recipest.ll exposes a bug in
the FMA mutation pass.  If we have a situation where a killed product
register is the same register as the FMA target, such as:

   %vreg5<def,tied1> = XSNMSUBADP %vreg5<tied0>, %vreg11, %vreg5,
                       %RM<imp-use>; VSFRC:%vreg5 F8RC:%vreg11

then the substitution makes no sense.  We end up getting a crash when
we try to extend the interval associated with the killed product
register, as there is already a live range for %vreg5 there.  This
patch just disables the mutation under those circumstances.

Since recipest.ll generates different code with VMX enabled, I've
modified that test to use -mattr=-vsx.  I've borrowed the code from
that test that exposed the bug and placed it in fma-mutate.ll, where
it tests several mutation opportunities including the "bad" one.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220290 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/PowerPC/PPCInstrInfo.cpp
test/CodeGen/PowerPC/fma-mutate.ll [new file with mode: 0644]
test/CodeGen/PowerPC/recipest.ll