@@ -316,3 +316,58 @@ loop:
316
316
exit:
317
317
ret void
318
318
}
319
+
320
+ define void @retry_after_dep_check_with_unknown_offset (ptr %A , i32 %offset ) {
321
+ ; CHECK-LABEL: 'retry_after_dep_check_with_unknown_offset'
322
+ ; CHECK-NEXT: loop:
323
+ ; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
324
+ ; CHECK-NEXT: Unknown data dependence.
325
+ ; CHECK-NEXT: Dependences:
326
+ ; CHECK-NEXT: Unknown:
327
+ ; CHECK-NEXT: %l.A = load float, ptr %A, align 4 ->
328
+ ; CHECK-NEXT: store float 0.000000e+00, ptr %A.100.iv.offset.3, align 4
329
+ ; CHECK-EMPTY:
330
+ ; CHECK-NEXT: Unknown:
331
+ ; CHECK-NEXT: %l.A = load float, ptr %A, align 4 ->
332
+ ; CHECK-NEXT: store float %l.A, ptr %A.100.iv, align 8
333
+ ; CHECK-EMPTY:
334
+ ; CHECK-NEXT: Run-time memory checks:
335
+ ; CHECK-NEXT: Grouped accesses:
336
+ ; CHECK-NEXT: Group [[GRP16:0x[0-9a-f]+]]:
337
+ ; CHECK-NEXT: (Low: %A High: (4 + %A))
338
+ ; CHECK-NEXT: Member: %A
339
+ ; CHECK-NEXT: Group [[GRP17:0x[0-9a-f]+]]:
340
+ ; CHECK-NEXT: (Low: (100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A) High: (96 + (16 * (zext i32 %offset to i64))<nuw><nsw> + %A))
341
+ ; CHECK-NEXT: Member: {(100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A),+,8}<%loop>
342
+ ; CHECK-NEXT: Group [[GRP18:0x[0-9a-f]+]]:
343
+ ; CHECK-NEXT: (Low: (100 + %A) High: (96 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A))
344
+ ; CHECK-NEXT: Member: {(100 + %A),+,8}<%loop>
345
+ ; CHECK-EMPTY:
346
+ ; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
347
+ ; CHECK-NEXT: SCEV assumptions:
348
+ ; CHECK-NEXT: {(100 + %A),+,8}<%loop> Added Flags: <nusw>
349
+ ; CHECK-NEXT: {(100 + (8 * (zext i32 %offset to i64))<nuw><nsw> + %A),+,8}<%loop> Added Flags: <nusw>
350
+ ; CHECK-EMPTY:
351
+ ; CHECK-NEXT: Expressions re-written:
352
+ ;
353
+ entry:
354
+ %A.100 = getelementptr i8 , ptr %A , i64 100
355
+ %offset.ext = zext i32 %offset to i64
356
+ br label %loop
357
+
358
+ loop:
359
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
360
+ %l.A = load float , ptr %A , align 4
361
+ %A.100.iv = getelementptr { float , float }, ptr %A.100 , i64 %iv
362
+ store float %l.A , ptr %A.100.iv , align 8
363
+ %iv.offset = add i64 %iv , %offset.ext
364
+ %iv.offset.3 = shl i64 %iv.offset , 3
365
+ %A.100.iv.offset.3 = getelementptr i8 , ptr %A.100 , i64 %iv.offset.3
366
+ store float 0 .0 , ptr %A.100.iv.offset.3 , align 4
367
+ %iv.next = add i64 %iv , 1
368
+ %ec = icmp eq i64 %iv.next , %offset.ext
369
+ br i1 %ec , label %exit , label %loop
370
+
371
+ exit:
372
+ ret void
373
+ }
0 commit comments