[llvm] [AArch64] Combine PTEST_FIRST(PTRUE, CONCAT(A, B)) -> PTEST_FIRST(PTRUE, A) (PR #161384)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 30 10:31:31 PDT 2025
================
@@ -27519,6 +27522,37 @@ static SDValue performMULLCombine(SDNode *N,
return SDValue();
}
+static SDValue performPTestFirstCombine(SDNode *N,
+ TargetLowering::DAGCombinerInfo &DCI,
+ SelectionDAG &DAG) {
+ if (DCI.isBeforeLegalize())
+ return SDValue();
+
+ SDLoc DL(N);
+ auto Mask = N->getOperand(0);
+ auto Pred = N->getOperand(1);
+
+ if (Mask->getOpcode() == AArch64ISD::REINTERPRET_CAST)
+ Mask = Mask->getOperand(0);
+
+ if (Pred->getOpcode() == AArch64ISD::REINTERPRET_CAST)
+ Pred = Pred->getOperand(0);
+
+ if (Pred->getValueType(0).getVectorElementType() != MVT::i1 ||
+ !isAllActivePredicate(DAG, Mask))
+ return SDValue();
+
+ if (Pred->getOpcode() == ISD::CONCAT_VECTORS) {
+ Pred = Pred->getOperand(0);
+ SDValue Mask = DAG.getSplatVector(Pred->getValueType(0), DL,
+ DAG.getAllOnesConstant(DL, MVT::i64));
----------------
paulwalker-arm wrote:
You've already proven the existing `Mask` does what you need so should be reusable. Perhaps it's worth adding an `isLanes1toNKnownOne` helper function, then you don't need to strip reinterpret from `Mask` and can then reuse it directly.
https://github.com/llvm/llvm-project/pull/161384
More information about the llvm-commits
mailing list