[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