[llvm] [X86] Use GFNI for LZCNT vXi8 ops (PR #141888)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 3 04:33:58 PDT 2025


================
@@ -28999,6 +28999,32 @@ static SDValue LowerVectorCTLZ(SDValue Op, const SDLoc &DL,
   return LowerVectorCTLZInRegLUT(Op, DL, Subtarget, DAG);
 }
 
+static SDValue LowerVectorCTLZ_GFNI(SDValue Op, const SDLoc &DL,
+                                    SelectionDAG &DAG,
+                                    const X86Subtarget &Subtarget) {
+  MVT VT = Op.getSimpleValueType();
+  SDValue Input = Op.getOperand(0);
+
+  assert(VT.isVector() && VT.getVectorElementType() == MVT::i8 &&
+         "Expected vXi8 input for GFNI-based CTLZ lowering");
+
+  SDValue Reversed = DAG.getNode(ISD::BITREVERSE, DL, VT, Input);
+
+  SDValue Zero = DAG.getConstant(0, DL, MVT::i8);
+  SDValue ZeroVec = DAG.getSplatBuildVector(VT, DL, Zero);
+  SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, ZeroVec, Reversed);
----------------
RKSimon wrote:

@houngkoungting Can you use DAG.getNegative and remove the Zero/ZeroVec?

https://github.com/llvm/llvm-project/pull/141888


More information about the llvm-commits mailing list