Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -17446,6 +17446,16 @@ Res = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, ExtVT, Res, DAG.getConstant(0, DL, MVT::i64)); Res = DAG.getNode(ISD::TRUNCATE, DL, VT, Res); + } else { + if (isa(N->getOperand(1)) && + isa(N->getOperand(2)) && + N->getValueType(0).isVector() && + N->getConstantOperandVal(1) == 0 && + N->getConstantOperandVal(2) < + N->getValueType(0).getVectorMinNumElements() && + getSVEPredPatternFromNumElements(N->getConstantOperandVal(2)) != None) + return getPTrue(DAG, SDLoc(N), N->getValueType(0), + N->getConstantOperandVal(2)); } return Res; } 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_imm10() { +; CHECK-LABEL: lane_mask_nxv4i1_imm10: +; CHECK: // %bb.0: // %entry +; CHECK-NEXT: mov w8, #10 +; 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 10) + 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)