[X86] Add test case showing bad fmsubadd creation due to bad commuting.
authorCraig Topper <craig.topper@intel.com>
Thu, 15 Mar 2018 20:30:51 +0000 (20:30 +0000)
committerCraig Topper <craig.topper@intel.com>
Thu, 15 Mar 2018 20:30:51 +0000 (20:30 +0000)
The code that creates fmsubadd from shuffle vector has some code to allow commuting the operands of the fadd node. This code was originally created when we only recognized fmaddsub. When fmsubadd support was added this code was not updated and is now commuting the fsub operands instead.

llvm-svn: 327659

llvm/test/CodeGen/X86/fmsubadd-combine.ll

index ca2c61a..20d8503 100644 (file)
@@ -132,4 +132,23 @@ entry:
   ret <16 x float> %subadd
 }
 
+; This should not be matched to fmsubadd because the mul is on the wrong side of the fsub.
+define <2 x double> @mul_subadd_bad_commute(<2 x double> %A, <2 x double> %B, <2 x double> %C) #0 {
+; FMA3-LABEL: mul_subadd_bad_commute:
+; FMA3:       # %bb.0: # %entry
+; FMA3-NEXT:    vfmsubadd213pd {{.*#+}} xmm0 = (xmm1 * xmm0) -/+ xmm2
+; FMA3-NEXT:    retq
+;
+; FMA4-LABEL: mul_subadd_bad_commute:
+; FMA4:       # %bb.0: # %entry
+; FMA4-NEXT:    vfmsubaddpd %xmm2, %xmm1, %xmm0, %xmm0
+; FMA4-NEXT:    retq
+entry:
+  %AB = fmul <2 x double> %A, %B
+  %Sub = fsub <2 x double> %C, %AB
+  %Add = fadd <2 x double> %AB, %C
+  %subadd = shufflevector <2 x double> %Add, <2 x double> %Sub, <2 x i32> <i32 0, i32 3>
+  ret <2 x double> %subadd
+}
+
 attributes #0 = { nounwind "unsafe-fp-math"="true" }