Skip to content

Commit 4bccd25

Browse files
authored
[AArch64] LowerAVG - fallback to default expansion (#95416)
The TargetLowering::expandAVG implementations now match or are better than the AArch64 override.
1 parent ab0d01a commit 4bccd25

File tree

2 files changed

+74
-164
lines changed

2 files changed

+74
-164
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15007,55 +15007,13 @@ AArch64TargetLowering::LowerDYNAMIC_STACKALLOC(SDValue Op,
1500715007
return SDValue();
1500815008
}
1500915009

15010-
// When x and y are extended, lower:
15011-
// avgfloor(x, y) -> (x + y) >> 1
15012-
// avgceil(x, y) -> (x + y + 1) >> 1
15013-
15014-
// Otherwise, lower to:
15015-
// avgfloor(x, y) -> (x >> 1) + (y >> 1) + (x & y & 1)
15016-
// avgceil(x, y) -> (x >> 1) + (y >> 1) + ((x || y) & 1)
1501715010
SDValue AArch64TargetLowering::LowerAVG(SDValue Op, SelectionDAG &DAG,
1501815011
unsigned NewOp) const {
1501915012
if (Subtarget->hasSVE2())
1502015013
return LowerToPredicatedOp(Op, DAG, NewOp);
1502115014

15022-
SDLoc dl(Op);
15023-
SDValue OpA = Op->getOperand(0);
15024-
SDValue OpB = Op->getOperand(1);
15025-
EVT VT = Op.getValueType();
15026-
bool IsCeil =
15027-
(Op->getOpcode() == ISD::AVGCEILS || Op->getOpcode() == ISD::AVGCEILU);
15028-
bool IsSigned =
15029-
(Op->getOpcode() == ISD::AVGFLOORS || Op->getOpcode() == ISD::AVGCEILS);
15030-
unsigned ShiftOpc = IsSigned ? ISD::SRA : ISD::SRL;
15031-
15032-
assert(VT.isScalableVector() && "Only expect to lower scalable vector op!");
15033-
15034-
auto IsZeroExtended = [&DAG](SDValue &Node) {
15035-
KnownBits Known = DAG.computeKnownBits(Node, 0);
15036-
return Known.Zero.isSignBitSet();
15037-
};
15038-
15039-
auto IsSignExtended = [&DAG](SDValue &Node) {
15040-
return (DAG.ComputeNumSignBits(Node, 0) > 1);
15041-
};
15042-
15043-
SDValue ConstantOne = DAG.getConstant(1, dl, VT);
15044-
if ((!IsSigned && IsZeroExtended(OpA) && IsZeroExtended(OpB)) ||
15045-
(IsSigned && IsSignExtended(OpA) && IsSignExtended(OpB))) {
15046-
SDValue Add = DAG.getNode(ISD::ADD, dl, VT, OpA, OpB);
15047-
if (IsCeil)
15048-
Add = DAG.getNode(ISD::ADD, dl, VT, Add, ConstantOne);
15049-
return DAG.getNode(ShiftOpc, dl, VT, Add, ConstantOne);
15050-
}
15051-
15052-
SDValue ShiftOpA = DAG.getNode(ShiftOpc, dl, VT, OpA, ConstantOne);
15053-
SDValue ShiftOpB = DAG.getNode(ShiftOpc, dl, VT, OpB, ConstantOne);
15054-
15055-
SDValue tmp = DAG.getNode(IsCeil ? ISD::OR : ISD::AND, dl, VT, OpA, OpB);
15056-
tmp = DAG.getNode(ISD::AND, dl, VT, tmp, ConstantOne);
15057-
SDValue Add = DAG.getNode(ISD::ADD, dl, VT, ShiftOpA, ShiftOpB);
15058-
return DAG.getNode(ISD::ADD, dl, VT, Add, tmp);
15015+
// Default to expand.
15016+
return SDValue();
1505915017
}
1506015018

1506115019
SDValue AArch64TargetLowering::LowerVSCALE(SDValue Op,

0 commit comments

Comments
 (0)