diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 11bac7bdb6eb2..17cf4154f8dbd 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3952,6 +3952,19 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { } break; } + case Intrinsic::get_active_lane_mask: { + const APInt *Op0, *Op1; + if (match(II->getOperand(0), m_StrictlyPositive(Op0)) && + match(II->getOperand(1), m_APInt(Op1))) { + Type *OpTy = II->getOperand(0)->getType(); + return replaceInstUsesWith( + *II, Builder.CreateIntrinsic( + II->getType(), Intrinsic::get_active_lane_mask, + {Constant::getNullValue(OpTy), + ConstantInt::get(OpTy, Op1->usub_sat(*Op0))})); + } + break; + } default: { // Handle target specific intrinsics std::optional V = targetInstCombineIntrinsic(*II); diff --git a/llvm/test/Transforms/InstCombine/get_active_lane_mask.ll b/llvm/test/Transforms/InstCombine/get_active_lane_mask.ll new file mode 100644 index 0000000000000..c642904cc275b --- /dev/null +++ b/llvm/test/Transforms/InstCombine/get_active_lane_mask.ll @@ -0,0 +1,38 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt < %s -passes=instcombine -S | FileCheck %s + +define @rewrite_range_nxv4i1() { +; CHECK-LABEL: define @rewrite_range_nxv4i1() { +; CHECK-NEXT: [[MASK:%.*]] = call @llvm.get.active.lane.mask.nxv4i1.i32(i32 0, i32 3) +; CHECK-NEXT: ret [[MASK]] +; + %mask = call @llvm.get.active.lane.mask.nxv4i1.i32(i32 1, i32 4) + ret %mask +} + +define @rewrite_range_nxv16i1() { +; CHECK-LABEL: define @rewrite_range_nxv16i1() { +; CHECK-NEXT: [[MASK:%.*]] = call @llvm.get.active.lane.mask.nxv16i1.i64(i64 0, i64 7) +; CHECK-NEXT: ret [[MASK]] +; + %mask = call @llvm.get.active.lane.mask.nxv16i1.i64(i64 123123, i64 123130) + ret %mask +} + +define @rewrite_range_nxv16i1_i128() { +; CHECK-LABEL: define @rewrite_range_nxv16i1_i128() { +; CHECK-NEXT: [[MASK:%.*]] = call @llvm.get.active.lane.mask.nxv16i1.i128(i128 0, i128 10) +; CHECK-NEXT: ret [[MASK]] +; + %mask = call @llvm.get.active.lane.mask.nxv16i1.i128(i128 18446744073709551616, i128 18446744073709551626) + ret %mask +} + +define @bail_lhs_is_zero() { +; CHECK-LABEL: define @bail_lhs_is_zero() { +; CHECK-NEXT: [[MASK:%.*]] = call @llvm.get.active.lane.mask.nxv4i1.i32(i32 0, i32 4) +; CHECK-NEXT: ret [[MASK]] +; + %mask = call @llvm.get.active.lane.mask.nxv4i1.i32(i32 0, i32 4) + ret %mask +}