diff options
Diffstat (limited to 'test/CodeGen/X86/fma-do-not-commute.ll')
-rw-r--r-- | test/CodeGen/X86/fma-do-not-commute.ll | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/test/CodeGen/X86/fma-do-not-commute.ll b/test/CodeGen/X86/fma-do-not-commute.ll new file mode 100644 index 0000000..4e21172 --- /dev/null +++ b/test/CodeGen/X86/fma-do-not-commute.ll @@ -0,0 +1,30 @@ +; RUN: llc -fp-contract=fast -mattr=+fma -disable-cgp < %s -o - | FileCheck %s +; Check that the 2nd and 3rd arguments of fmaXXX231 reg1, reg2, mem3 are not commuted. +; <rdar://problem/16800495> +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx" + +; CHECK-LABEL: test1: +; %arg lives in xmm0 and it shouldn't be redefined until it is used in the FMA. +; CHECK-NOT {{.*}}, %xmm0 +; %addr lives in rdi. +; %addr2 lives in rsi. +; CHECK: vmovss (%rsi), [[ADDR2:%xmm[0-9]+]] +; The assembly syntax is in the reverse order. +; CHECK: vfmadd231ss (%rdi), [[ADDR2]], %xmm0 +define void @test1(float* %addr, float* %addr2, float %arg) { +entry: + br label %loop + +loop: + %sum0 = phi float [ %fma, %loop ], [ %arg, %entry ] + %addrVal = load float* %addr, align 4 + %addr2Val = load float* %addr2, align 4 + %fmul = fmul float %addrVal, %addr2Val + %fma = fadd float %sum0, %fmul + br i1 true, label %exit, label %loop + +exit: + store float %fma, float* %addr, align 4 + ret void +} |