@@ -316,3 +316,58 @@ loop:
316316exit:
317317 ret void
318318}
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