[llvm] [RISCV][ISel] Fold trunc (lshr (add (zext X), (zext Y)), 1) -> vaaddu X, Y (PR #76550)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 7 22:14:19 PST 2024
================
@@ -12357,6 +12393,51 @@ static SDValue combineAddOfBooleanXor(SDNode *N, SelectionDAG &DAG) {
N0.getOperand(0));
}
+static SDValue combineUnsignedAvgFloor(SDNode *N, SelectionDAG &DAG,
+ const RISCVSubtarget &Subtarget) {
+
+ if (!Subtarget.hasVInstructions())
+ return SDValue();
+
+ EVT VT = N->getValueType(0);
+ if (!VT.isVector() || !VT.isInteger())
+ return SDValue();
+
+ assert(N->getOpcode() == ISD::TRUNCATE && "Opcode should be ISD::TRUNCATE");
+
+ if (!DAG.getTargetLoweringInfo().isTypeLegal(VT))
+ return SDValue();
+
+ SDValue Srl = N->getOperand(0);
+
+ // (lshr X, 1)
+ if (!Srl.hasOneUse() || Srl.getOpcode() != ISD::SRL ||
+ !isOneOrOneSplat(Srl->getOperand(1)))
+ return SDValue();
+
+ SDValue WiddenAdd = Srl.getOperand(0);
+
+ if (!WiddenAdd.hasOneUse() || WiddenAdd.getOpcode() != ISD::ADD)
+ return SDValue();
+
+ SDValue N0 = WiddenAdd.getOperand(0);
+ SDValue N1 = WiddenAdd.getOperand(1);
+
+ auto IsZext = [&](SDValue V) {
+ if (V.getOpcode() != ISD::ZERO_EXTEND)
+ return false;
+
+ return V.getOperand(0)->getValueType(0) == VT;
+ };
+
+ if (!IsZext(N0) || !IsZext(N1))
+ return SDValue();
+
+ SDLoc DL(N);
+ return DAG.getNode(ISD::AVGFLOORU, DL, VT, N0->getOperand(0),
+ N1->getOperand(0));
+}
+
----------------
lukel97 wrote:
Do we not already get ISD::AVGFLOORU nodes from `combineShiftToAVG` in TargetLowering.cpp?
https://github.com/llvm/llvm-project/pull/76550
More information about the llvm-commits
mailing list