[llvm] [RISCV] custom scmp(x, 0) and scmp(0, x) lowering for RVV (PR #151753)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 4 09:32:23 PDT 2025
================
@@ -8223,6 +8225,36 @@ SDValue RISCVTargetLowering::LowerOperation(SDValue Op,
case ISD::SADDSAT:
case ISD::SSUBSAT:
return lowerToScalableOp(Op, DAG);
+ case ISD::SCMP: {
+ SDLoc DL(Op);
+ EVT VT = Op->getValueType(0);
+ SDValue LHS = Op->getOperand(0);
+ SDValue RHS = Op->getOperand(1);
+ unsigned SEW = VT.getScalarSizeInBits();
+ EVT CCVT = getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), VT);
+
+ SDValue Shift = DAG.getConstant(SEW - 1, DL, VT);
+ SDValue Zero = DAG.getConstant(0, DL, VT);
+ SDValue One = DAG.getConstant(1, DL, VT);
+ SDValue MinusOne = DAG.getAllOnesConstant(DL, VT);
+
+ if (ISD::isConstantSplatVectorAllZeros(RHS.getNode())) {
+ // scmp(lhs, 0) -> vor.vv(vsra.vi/vx(lhs,SEW-1), vmin.vx(lhs,1))
+ LHS = DAG.getFreeze(LHS);
+ SDValue Sra = DAG.getNode(ISD::SRA, DL, VT, LHS, Shift);
+ SDValue Min = DAG.getNode(ISD::SMIN, DL, VT, LHS, One);
+ return DAG.getNode(ISD::OR, DL, VT, Sra, Min);
+ }
+ if (ISD::isConstantSplatVectorAllZeros(LHS.getNode())) {
+ // scmp(0, rhs) -> vmerge.vi(vmsgt.vi(rhs,0), vsrl.vi/vx(rhs,SEW-1), -1)
----------------
lukel97 wrote:
```suggestion
// scmp(0, rhs) -> vmerge.vi(vmsle.vi(rhs,0), vsrl.vi/vx(rhs,SEW-1), -1)
```
https://github.com/llvm/llvm-project/pull/151753
More information about the llvm-commits
mailing list