mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[AArch64] When combining constant mul of -3, prefer (sub x, (shl x, N)).
This change only effects codegen when the constant is -3. llvm-svn: 231085
This commit is contained in:
parent
8d1b74869c
commit
c6fa32cc2a
@ -6895,6 +6895,15 @@ static SDValue performMulCombine(SDNode *N, SelectionDAG &DAG,
|
||||
N->getOperand(0));
|
||||
}
|
||||
} else {
|
||||
// (mul x, -(2^N - 1)) => (sub x, (shl x, N))
|
||||
APInt VNP1 = -Value + 1;
|
||||
if (VNP1.isPowerOf2()) {
|
||||
SDValue ShiftedVal =
|
||||
DAG.getNode(ISD::SHL, SDLoc(N), VT, N->getOperand(0),
|
||||
DAG.getConstant(VNP1.logBase2(), MVT::i64));
|
||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N->getOperand(0),
|
||||
ShiftedVal);
|
||||
}
|
||||
// (mul x, -(2^N + 1)) => - (add (shl x, N), x)
|
||||
APInt VNM1 = -Value - 1;
|
||||
if (VNM1.isPowerOf2()) {
|
||||
@ -6905,15 +6914,6 @@ static SDValue performMulCombine(SDNode *N, SelectionDAG &DAG,
|
||||
DAG.getNode(ISD::ADD, SDLoc(N), VT, ShiftedVal, N->getOperand(0));
|
||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, DAG.getConstant(0, VT), Add);
|
||||
}
|
||||
// (mul x, -(2^N - 1)) => (sub x, (shl x, N))
|
||||
APInt VNP1 = -Value + 1;
|
||||
if (VNP1.isPowerOf2()) {
|
||||
SDValue ShiftedVal =
|
||||
DAG.getNode(ISD::SHL, SDLoc(N), VT, N->getOperand(0),
|
||||
DAG.getConstant(VNP1.logBase2(), MVT::i64));
|
||||
return DAG.getNode(ISD::SUB, SDLoc(N), VT, N->getOperand(0),
|
||||
ShiftedVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
return SDValue();
|
||||
|
@ -74,8 +74,7 @@ define i32 @ntest2(i32 %x) {
|
||||
|
||||
define i32 @ntest3(i32 %x) {
|
||||
; CHECK-LABEL: ntest3
|
||||
; CHECK: add {{w[0-9]+}}, w0, w0, lsl #1
|
||||
; CHECK: neg w0, {{w[0-9]+}}
|
||||
; CHECK: sub w0, w0, w0, lsl #2
|
||||
|
||||
%mul = mul nsw i32 %x, -3
|
||||
ret i32 %mul
|
||||
|
Loading…
x
Reference in New Issue
Block a user