diff options
| author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-10-21 13:02:37 +0000 |
|---|---|---|
| committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-10-21 13:02:37 +0000 |
| commit | 5c6cb813b6a2d36713a3e67a2aa40e220e27ede9 (patch) | |
| tree | 4ee4520b932380a7270c674b94e7c6aaad6b1f61 /llvm/test/CodeGen/PowerPC/fma-mutate.ll | |
| parent | 6ca45c92a93feaa4c5e7bba34317b7c8b5af3125 (diff) | |
| download | bcm5719-llvm-5c6cb813b6a2d36713a3e67a2aa40e220e27ede9.tar.gz bcm5719-llvm-5c6cb813b6a2d36713a3e67a2aa40e220e27ede9.zip | |
[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.
llvm-svn: 220290
Diffstat (limited to 'llvm/test/CodeGen/PowerPC/fma-mutate.ll')
| -rw-r--r-- | llvm/test/CodeGen/PowerPC/fma-mutate.ll | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/PowerPC/fma-mutate.ll b/llvm/test/CodeGen/PowerPC/fma-mutate.ll new file mode 100644 index 00000000000..1a391f4c230 --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/fma-mutate.ll @@ -0,0 +1,21 @@ +; Test several VSX FMA mutation opportunities. The first one isn't a +; reasonable transformation because the killed product register is the +; same as the FMA target register. The second one is legal. The third +; one doesn't fit the feeding-copy pattern. + +; RUN: llc < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -enable-unsafe-fp-math -mattr=+vsx | FileCheck %s +target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64" +target triple = "powerpc64-unknown-linux-gnu" + +declare double @llvm.sqrt.f64(double) + +define double @foo3(double %a) nounwind { + %r = call double @llvm.sqrt.f64(double %a) + ret double %r + +; CHECK: @foo3 +; CHECK: xsnmsubadp [[REG:[0-9]+]], {{[0-9]+}}, [[REG]] +; CHECK: xsmaddmdp +; CHECK: xsmaddadp +} + |

