@@ -256,3 +256,66 @@ loop:
256256exit:
257257 ret void
258258}
259+
260+ @a = external global [10 x [12 x i16 ]]
261+
262+ ; Test case for https://github.com/llvm/llvm-project/issues/134696.
263+ define void @safe_load_store_distance_not_pow_of_2 (i64 %N ) {
264+ ; CHECK-LABEL: @safe_load_store_distance_not_pow_of_2(
265+ ; CHECK-NEXT: entry:
266+ ; CHECK-NEXT: [[UMIN:%.*]] = call i64 @llvm.umin.i64(i64 [[N:%.*]], i64 1)
267+ ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[N]], [[UMIN]]
268+ ; CHECK-NEXT: [[TMP1:%.*]] = udiv i64 [[TMP0]], 3
269+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[UMIN]], [[TMP1]]
270+ ; CHECK-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], 1
271+ ; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ule i64 [[TMP3]], 8
272+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
273+ ; CHECK: vector.ph:
274+ ; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP3]], 8
275+ ; CHECK-NEXT: [[TMP4:%.*]] = icmp eq i64 [[N_MOD_VF]], 0
276+ ; CHECK-NEXT: [[TMP5:%.*]] = select i1 [[TMP4]], i64 8, i64 [[N_MOD_VF]]
277+ ; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[TMP3]], [[TMP5]]
278+ ; CHECK-NEXT: [[TMP6:%.*]] = mul i64 [[N_VEC]], 3
279+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
280+ ; CHECK: vector.body:
281+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
282+ ; CHECK-NEXT: [[VEC_IND:%.*]] = phi <8 x i64> [ <i64 0, i64 3, i64 6, i64 9, i64 12, i64 15, i64 18, i64 21>, [[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], [[VECTOR_BODY]] ]
283+ ; CHECK-NEXT: [[TMP7:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 8, <8 x i64> [[VEC_IND]]
284+ ; CHECK-NEXT: call void @llvm.masked.scatter.v8i16.v8p0(<8 x i16> zeroinitializer, <8 x ptr> [[TMP7]], i32 2, <8 x i1> splat (i1 true))
285+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 8
286+ ; CHECK-NEXT: [[VEC_IND_NEXT]] = add <8 x i64> [[VEC_IND]], splat (i64 24)
287+ ; CHECK-NEXT: [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
288+ ; CHECK-NEXT: br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]
289+ ; CHECK: middle.block:
290+ ; CHECK-NEXT: br label [[SCALAR_PH]]
291+ ; CHECK: scalar.ph:
292+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ [[TMP6]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
293+ ; CHECK-NEXT: br label [[LOOP:%.*]]
294+ ; CHECK: loop:
295+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
296+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 0, i64 [[IV]]
297+ ; CHECK-NEXT: [[TMP9:%.*]] = load i16, ptr [[GEP]], align 2
298+ ; CHECK-NEXT: [[GEP_OFF:%.*]] = getelementptr [10 x [12 x i16]], ptr @a, i64 0, i64 8, i64 [[IV]]
299+ ; CHECK-NEXT: store i16 0, ptr [[GEP_OFF]], align 2
300+ ; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], 3
301+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[IV]], [[N]]
302+ ; CHECK-NEXT: br i1 [[CMP]], label [[LOOP]], label [[EXIT:%.*]], !llvm.loop [[LOOP11:![0-9]+]]
303+ ; CHECK: exit:
304+ ; CHECK-NEXT: ret void
305+ ;
306+ entry:
307+ br label %loop
308+
309+ loop:
310+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
311+ %gep = getelementptr [10 x [12 x i16 ]], ptr @a , i64 0 , i64 0 , i64 %iv
312+ %1 = load i16 , ptr %gep , align 2
313+ %gep.off = getelementptr [10 x [12 x i16 ]], ptr @a , i64 0 , i64 8 , i64 %iv
314+ store i16 0 , ptr %gep.off , align 2
315+ %iv.next = add nsw i64 %iv , 3
316+ %cmp = icmp ult i64 %iv , %N
317+ br i1 %cmp , label %loop , label %exit
318+
319+ exit:
320+ ret void
321+ }
0 commit comments