[llvm] [LV] Vectorize bounded (i % 2^N) loads in read only loops w/o RT checks. (PR #207279)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 23 07:46:03 PDT 2026
================
@@ -229,79 +197,91 @@ exit:
define i16 @bounded_load_reduction_bound4_i16(ptr %A, i32 %N) {
; CHECK-LABEL: define i16 @bounded_load_reduction_bound4_i16(
; CHECK-SAME: ptr [[A:%.*]], i32 [[N:%.*]]) {
-; CHECK-NEXT: [[ITER_CHECK:.*]]:
+; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[N]], 4
-; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[VEC_EPILOG_SCALAR_PH:.*]], label %[[VECTOR_SCEVCHECK:.*]]
-; CHECK: [[VECTOR_SCEVCHECK]]:
-; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[N]], -1
-; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[TMP0]], 3
-; CHECK-NEXT: br i1 [[TMP1]], label %[[VEC_EPILOG_SCALAR_PH]], label %[[VECTOR_MAIN_LOOP_ITER_CHECK:.*]]
-; CHECK: [[VECTOR_MAIN_LOOP_ITER_CHECK]]:
-; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i32 [[N]], 16
-; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH:.*]]
+; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
; CHECK: [[VECTOR_PH]]:
-; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i32 [[N]], 16
+; CHECK-NEXT: [[MIN_ITERS_CHECK1:%.*]] = icmp ult i32 [[N]], 16
+; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK1]], label %[[VEC_EPILOG_PH:.*]], label %[[VECTOR_PH1:.*]]
+; CHECK: [[VECTOR_PH1]]:
+; CHECK-NEXT: [[N_MOD_VF1:%.*]] = urem i32 [[N]], 16
+; CHECK-NEXT: [[N_VEC1:%.*]] = sub i32 [[N]], [[N_MOD_VF1]]
+; CHECK-NEXT: br label %[[VECTOR_BODY1:.*]]
+; CHECK: [[VECTOR_BODY1]]:
+; CHECK-NEXT: [[INDEX1:%.*]] = phi i32 [ 0, %[[VECTOR_PH1]] ], [ [[INDEX_NEXT1:%.*]], %[[VECTOR_BODY1]] ]
+; CHECK-NEXT: [[VEC_PHI1:%.*]] = phi <4 x i16> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP11:%.*]], %[[VECTOR_BODY1]] ]
+; CHECK-NEXT: [[VEC_PHI2:%.*]] = phi <4 x i16> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP12:%.*]], %[[VECTOR_BODY1]] ]
+; CHECK-NEXT: [[VEC_PHI3:%.*]] = phi <4 x i16> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP13:%.*]], %[[VECTOR_BODY1]] ]
+; CHECK-NEXT: [[VEC_PHI4:%.*]] = phi <4 x i16> [ zeroinitializer, %[[VECTOR_PH1]] ], [ [[TMP14:%.*]], %[[VECTOR_BODY1]] ]
+; CHECK-NEXT: [[TMP18:%.*]] = add i32 [[INDEX1]], 4
+; CHECK-NEXT: [[TMP19:%.*]] = add i32 [[INDEX1]], 8
+; CHECK-NEXT: [[TMP20:%.*]] = add i32 [[INDEX1]], 12
+; CHECK-NEXT: [[TMP21:%.*]] = urem i32 [[INDEX1]], 4
+; CHECK-NEXT: [[TMP22:%.*]] = urem i32 [[TMP18]], 4
+; CHECK-NEXT: [[TMP5:%.*]] = urem i32 [[TMP19]], 4
+; CHECK-NEXT: [[TMP6:%.*]] = urem i32 [[TMP20]], 4
+; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i16, ptr [[A]], i32 [[TMP21]]
+; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i16, ptr [[A]], i32 [[TMP22]]
+; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i16, ptr [[A]], i32 [[TMP5]]
+; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds i16, ptr [[A]], i32 [[TMP6]]
+; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <4 x i16>, ptr [[TMP7]], align 2
----------------
david-arm wrote:
All these unrolled loads are loading exactly the same thing and are all loop-invariant. Can you confirm whether or not instcombine deletes the redundant 3 other loads?
https://github.com/llvm/llvm-project/pull/207279
More information about the llvm-commits
mailing list