[llvm] [InstCombine] Fold canonicalized form of vecreduce_or(get_active_lane_mask) (PR #220085)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 25 03:43:14 PDT 2026
================
@@ -89,3 +89,115 @@ define <4 x i1> @extract_fixed_from_active_lane_mask() vscale_range(4, 4) {
ret <4 x i1> %ext
}
+define i1 @vecreduce_or_get_active_lane_mask_v4i1(i32 %a, i32 %b) {
+; CHECK-LABEL: define i1 @vecreduce_or_get_active_lane_mask_v4i1(
+; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
+; CHECK-NEXT: [[RED:%.*]] = icmp ult i32 [[A]], [[B]]
+; CHECK-NEXT: ret i1 [[RED]]
+;
+ %mask = call <4 x i1> @llvm.get.active.lane.mask.v4i1.i32(i32 %a, i32 %b)
+ %red = call i1 @llvm.vector.reduce.or.i1(<4 x i1> %mask)
+ ret i1 %red
+}
+
+define i1 @vecreduce_or_get_active_lane_mask_v16i1(i32 %a, i32 %b) {
+; CHECK-LABEL: define i1 @vecreduce_or_get_active_lane_mask_v16i1(
+; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
+; CHECK-NEXT: [[RED:%.*]] = icmp ult i32 [[A]], [[B]]
+; CHECK-NEXT: ret i1 [[RED]]
+;
+ %mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %a, i32 %b)
+ %red = call i1 @llvm.vector.reduce.or.i1(<16 x i1> %mask)
+ ret i1 %red
+}
+
+define i1 @vecreduce_or_get_active_lane_mask_v32i1(i32 %a, i32 %b) {
+; CHECK-LABEL: define i1 @vecreduce_or_get_active_lane_mask_v32i1(
+; CHECK-SAME: i32 [[A:%.*]], i32 [[B:%.*]]) {
+; CHECK-NEXT: [[RED:%.*]] = icmp ult i32 [[A]], [[B]]
+; CHECK-NEXT: ret i1 [[RED]]
+;
+ %mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i32(i32 %a, i32 %b)
+ %red = call i1 @llvm.vector.reduce.or.i1(<32 x i1> %mask)
+ ret i1 %red
+}
----------------
paulwalker-arm wrote:
The combine does not care about the vector length so these tests have no value and can be removed.
https://github.com/llvm/llvm-project/pull/220085
More information about the llvm-commits
mailing list