[clang] [llvm] [mlir] [AArch64][SME] Improve codegen for aarch64.sme.cnts* when not in streaming mode (PR #154761)
Kerry McLaughlin via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 11 06:32:52 PDT 2025
================
@@ -6266,25 +6266,15 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
case Intrinsic::aarch64_sve_clz:
return DAG.getNode(AArch64ISD::CTLZ_MERGE_PASSTHRU, DL, Op.getValueType(),
Op.getOperand(2), Op.getOperand(3), Op.getOperand(1));
- case Intrinsic::aarch64_sme_cntsb:
- return DAG.getNode(AArch64ISD::RDSVL, DL, Op.getValueType(),
- DAG.getConstant(1, DL, MVT::i32));
- case Intrinsic::aarch64_sme_cntsh: {
- SDValue One = DAG.getConstant(1, DL, MVT::i32);
- SDValue Bytes = DAG.getNode(AArch64ISD::RDSVL, DL, Op.getValueType(), One);
- return DAG.getNode(ISD::SRL, DL, Op.getValueType(), Bytes, One);
- }
- case Intrinsic::aarch64_sme_cntsw: {
- SDValue Bytes = DAG.getNode(AArch64ISD::RDSVL, DL, Op.getValueType(),
- DAG.getConstant(1, DL, MVT::i32));
- return DAG.getNode(ISD::SRL, DL, Op.getValueType(), Bytes,
- DAG.getConstant(2, DL, MVT::i32));
- }
case Intrinsic::aarch64_sme_cntsd: {
+ auto Flags = SDNodeFlags();
+ Flags.setNoUnsignedWrap(true);
+ Flags.setNoSignedWrap(true);
----------------
kmclaughlin-arm wrote:
I only added the wrap flags here because I'm also adding them when creating the `cntsd` intrinisic and `mul`, but they aren't necessary. Adding `exact` is enough to ensure there are no extra `and` instructions.
https://github.com/llvm/llvm-project/pull/154761
More information about the llvm-commits
mailing list