[llvm] [PowerPC] Implement a more efficient memcmp in cases where the length is known. (PR #158657)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 6 11:23:21 PDT 2025
================
@@ -15556,6 +15556,89 @@ SDValue PPCTargetLowering::combineSetCC(SDNode *N,
SDValue Add = DAG.getNode(ISD::ADD, DL, OpVT, LHS, RHS.getOperand(1));
return DAG.getSetCC(DL, VT, Add, DAG.getConstant(0, DL, OpVT), CC);
}
+
+ // Optimization: Fold i128 equality/inequality compares of two loads into a
+ // vectorized compare using vcmpequb.p when VSX is available.
+ //
+ // Rationale:
+ // A scalar i128 SETCC (eq/ne) normally lowers to multiple scalar ops.
+ // On VSX-capable subtargets, we can instead reinterpret the i128 loads
+ // as v16i8 vectors and use the Altivec/VSX vcmpequb.p instruction to
+ // perform a full 128-bit equality check in a single vector compare.
+
+ if (Subtarget.hasVSX()) {
+ if (LHS.getOpcode() == ISD::LOAD && RHS.getOpcode() == ISD::LOAD &&
+ LHS.hasOneUse() && RHS.hasOneUse() &&
+ LHS.getValueType() == MVT::i128 && RHS.getValueType() == MVT::i128) {
+ SDLoc DL(N);
+ SelectionDAG &DAG = DCI.DAG;
+ auto *LA = dyn_cast<LoadSDNode>(LHS);
+ auto *LB = dyn_cast<LoadSDNode>(RHS);
+ if (!LA || !LB)
+ return DAGCombineTruncBoolExt(N, DCI);
+
+ // If either memory operation (LA or LB) is volatile, do not perform any
+ // optimization or transformation. Volatile operations must be preserved
+ // as written to ensure correct program behavior, so we return an empty
+ // SDValue to indicate no action.
+ if (LA->isVolatile() || LB->isVolatile())
+ return DAGCombineTruncBoolExt(N, DCI);
----------------
RolandF77 wrote:
This return pattern is going to make it hard to further modify the combineSetCC function. I think this code should be outlined to a separate function.
https://github.com/llvm/llvm-project/pull/158657
More information about the llvm-commits
mailing list