Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -4748,6 +4748,21 @@ Op.getOperand(1)))); return SDValue(); } + case Intrinsic::aarch64_sve_whilelo: { + if (isa(Op.getOperand(1)) && + isa(Op.getOperand(2))) { + int64_t MinSVEVectorSize = Subtarget->getMinSVEVectorSizeInBits() + ? Subtarget->getMinSVEVectorSizeInBits() + : 128; + unsigned ElementSize = 128 / Op.getValueType().getVectorMinNumElements(); + unsigned Dist = cast(Op.getOperand(2))->getZExtValue() - + cast(Op.getOperand(1))->getZExtValue(); + if (getSVEPredPatternFromNumElements(Dist) != None && + Dist < (MinSVEVectorSize / ElementSize)) + return getPTrue(DAG, dl, Op.getValueType(), Dist); + } + return SDValue(); + } case Intrinsic::aarch64_sve_sunpkhi: return DAG.getNode(AArch64ISD::SUNPKHI, dl, Op.getValueType(), Op.getOperand(1)); Index: llvm/test/CodeGen/AArch64/active_lane_mask.ll =================================================================== --- llvm/test/CodeGen/AArch64/active_lane_mask.ll +++ llvm/test/CodeGen/AArch64/active_lane_mask.ll @@ -475,6 +475,38 @@ ret <2 x i1> %active.lane.mask } +define @lane_mask_nxv4i1_imm3() { +; CHECK-LABEL: lane_mask_nxv4i1_imm3: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: ptrue p0.s, vl3 +; CHECK-NEXT: ret +entry: + %active.lane.mask = call @llvm.get.active.lane.mask.nxv4i1.i64(i64 0, i64 3) + ret %active.lane.mask +} + +define @lane_mask_nxv4i1_imm4() { +; CHECK-LABEL: lane_mask_nxv4i1_imm4: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov w8, #4 +; CHECK-NEXT: whilelo p0.s, xzr, x8 +; CHECK-NEXT: ret +entry: + %active.lane.mask = call @llvm.get.active.lane.mask.nxv4i1.i64(i64 0, i64 4) + ret %active.lane.mask +} + +define @lane_mask_nxv16i1_imm10() { +; CHECK-LABEL: lane_mask_nxv16i1_imm10: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov w8, #10 +; CHECK-NEXT: whilelo p0.b, xzr, x8 +; CHECK-NEXT: ret +entry: + %active.lane.mask = call @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 10) + ret %active.lane.mask +} + declare @llvm.get.active.lane.mask.nxv32i1.i32(i32, i32) declare @llvm.get.active.lane.mask.nxv16i1.i32(i32, i32)