mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-17 17:06:59 +00:00
Fix PR 17368: disable vector mul distribution for square of add/sub for ARM
Generally, it is desirable to distribute (a + b) * c to a*c + b*c for ARM with VMLx forwarding, where a, b and c are vectors. However, for (a + b)*(a + b), distribution will result in one extra instruction. With distribution: x = a + b (add) y = a * x (mul) z = y + b * y (mla) Without distribution: x = a + b (add) z = x * x (mul) This patch checks if a mul is a square of add/sub. If yes, skip distribution. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191410 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
498ffb8a56
commit
541681c848
@ -8342,6 +8342,13 @@ static SDValue PerformSUBCombine(SDNode *N,
|
||||
/// is faster than
|
||||
/// vadd d3, d0, d1
|
||||
/// vmul d3, d3, d2
|
||||
// However, for (A + B) * (A + B),
|
||||
// vadd d2, d0, d1
|
||||
// vmul d3, d0, d2
|
||||
// vmla d3, d1, d2
|
||||
// is slower than
|
||||
// vadd d2, d0, d1
|
||||
// vmul d3, d2, d2
|
||||
static SDValue PerformVMULCombine(SDNode *N,
|
||||
TargetLowering::DAGCombinerInfo &DCI,
|
||||
const ARMSubtarget *Subtarget) {
|
||||
@ -8361,6 +8368,9 @@ static SDValue PerformVMULCombine(SDNode *N,
|
||||
std::swap(N0, N1);
|
||||
}
|
||||
|
||||
if (N0 == N1)
|
||||
return SDValue();
|
||||
|
||||
EVT VT = N->getValueType(0);
|
||||
SDLoc DL(N);
|
||||
SDValue N00 = N0->getOperand(0);
|
||||
|
@ -515,6 +515,17 @@ entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
define <8 x i8> @no_distribute(<8 x i8> %a, <8 x i8> %b) nounwind {
|
||||
entry:
|
||||
; CHECK: no_distribute
|
||||
; CHECK: vadd.i8
|
||||
; CHECK: vmul.i8
|
||||
; CHECK-NOT: vmla.i8
|
||||
%0 = add <8 x i8> %a, %b
|
||||
%1 = mul <8x i8> %0, %0
|
||||
ret <8 x i8> %1
|
||||
}
|
||||
|
||||
; If one operand has a zero-extend and the other a sign-extend, vmull
|
||||
; cannot be used.
|
||||
define i16 @vmullWithInconsistentExtensions(<8 x i8> %vec) {
|
||||
|
Loading…
Reference in New Issue
Block a user