@@ -256,3 +256,66 @@ loop:
256
256
exit:
257
257
ret void
258
258
}
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