[llvm] [SVE] Wide active lane mask (PR #76514)
Momchil Velikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 17 06:46:18 PST 2024
================
@@ -19791,15 +19815,63 @@ static SDValue performIntrinsicCombine(SDNode *N,
EVT::getVectorVT(*DAG.getContext(), PromVT.getVectorElementType(),
VT.getVectorElementCount());
- Res = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, WhileVT, ID,
- N->getOperand(1), N->getOperand(2));
+ SDValue Res = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, WhileVT, ID,
+ N->getOperand(1), N->getOperand(2));
Res = DAG.getNode(ISD::SIGN_EXTEND, DL, PromVT, Res);
Res = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ExtVT, Res,
DAG.getConstant(0, DL, MVT::i64));
Res = DAG.getNode(ISD::TRUNCATE, DL, VT, Res);
+
+ return Res;
}
- return Res;
+
+ if (!Subtarget->hasSVE2p1() && !Subtarget->hasSME2())
+ return SDValue();
+
+ if (!N->hasNUsesOfValue(2, 0))
+ return SDValue();
+
+ auto It = N->use_begin();
+ SDNode *Lo = *It++;
+ SDNode *Hi = *It;
+
+ const uint64_t HalfSize = VT.getVectorMinNumElements() / 2;
+ uint64_t OffLo, OffHi;
+ if (Lo->getOpcode() != ISD::EXTRACT_SUBVECTOR ||
+ Lo->getOperand(1)->getOpcode() != ISD::Constant ||
+ ((OffLo = Lo->getConstantOperandVal(1)) != 0 && OffLo != HalfSize) ||
+ Hi->getOpcode() != ISD::EXTRACT_SUBVECTOR ||
+ Hi->getOperand(1)->getOpcode() != ISD::Constant ||
+ ((OffHi = Hi->getConstantOperandVal(1)) != 0 && OffHi != HalfSize))
+ return SDValue();
----------------
momchil-velikov wrote:
No, we will not be able to process arbitrary LLVM IR that uses 32-bit lane masks. That's pretty much the current state - we cannot process correctly in the AArch64 backend arbitrary valid LLVM IR.
The current solution is to not generate LLVM IR that the backend cannot process.
https://github.com/llvm/llvm-project/pull/76514
More information about the llvm-commits
mailing list