[llvm] [SelectionDAG] Expand CTTZ_ELTS[_ZERO_POISON] and handle legalization (PR #188691)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 30 03:44:44 PDT 2026
================
@@ -12591,6 +12600,34 @@ SDValue TargetLowering::expandVECTOR_COMPRESS(SDNode *Node,
return DAG.getLoad(VecVT, DL, Chain, StackPtr, PtrInfo);
}
+SDValue TargetLowering::expandCttzElts(SDNode *Node, SelectionDAG &DAG) const {
+ SDLoc DL(Node);
+ EVT VT = Node->getValueType(0);
+
+ bool ZeroIsPoison = Node->getOpcode() == ISD::CTTZ_ELTS_ZERO_POISON;
+ auto [Mask, StepVec] =
+ getLegalStepVector(Node->getOperand(0), ZeroIsPoison, DL, DAG);
+ EVT StepVecVT = StepVec.getValueType();
+ EVT StepVT = StepVecVT.getVectorElementType();
+
+ // Promote the scalar result type early to avoid redundant zexts.
+ if (getTypeAction(StepVT.getSimpleVT()) == TypePromoteInteger)
+ StepVT = getTypeToTransformTo(*DAG.getContext(), StepVT);
+
+ SDValue VL =
+ DAG.getElementCount(DL, StepVT, StepVecVT.getVectorElementCount());
+ SDValue SplatVL = DAG.getSplat(StepVecVT, DL, VL);
+ StepVec = DAG.getNode(ISD::SUB, DL, StepVecVT, SplatVL, StepVec);
+ SDValue Zeroes = DAG.getConstant(0, DL, StepVecVT);
+ SDValue Select = DAG.getSelect(DL, StepVecVT, Mask, StepVec, Zeroes);
+ SDValue Max = DAG.getNode(ISD::VECREDUCE_UMAX, DL,
+ StepVecVT.getVectorElementType(), Select);
+ SDValue Sub = DAG.getNode(ISD::SUB, DL, StepVT, VL,
+ DAG.getZExtOrTrunc(Max, DL, StepVT));
----------------
david-arm wrote:
I think this `DAG.getZExtOrTrunc` is now redundant, since both the SUB operation and `Max` have the same type.
https://github.com/llvm/llvm-project/pull/188691
More information about the llvm-commits
mailing list