Currently we only check if the pointers involved in runtime checks do not wrap if we need to perform dependency checks. If that's not the case, we generate runtime checks, even if the pointers may wrap (see test/Analysis/LoopAccessAnalysis/runtime-checks-may-wrap.ll). If the pointer wraps, then we swap start and end of the runtime check, leading to incorrect checks. An Alive2 proof of what the runtime checks are checking conceptually (on i4 to have it complete in reasonable time) showing the incorrect result should be https://alive2.llvm.org/ce/z/KsHzn8 Depends on https://github.com/llvm/llvm-project/pull/127410 to avoid more regressions. PR: https://github.com/llvm/llvm-project/pull/127543
47 lines
1.6 KiB
LLVM
47 lines
1.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
|
|
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
|
|
|
|
target datalayout = "p:16:16"
|
|
|
|
define void @geps_may_wrap(ptr %a, ptr %b, i64 %N) {
|
|
; CHECK-LABEL: 'geps_may_wrap'
|
|
; CHECK-NEXT: loop:
|
|
; CHECK-NEXT: Memory dependences are safe with run-time checks
|
|
; CHECK-NEXT: Dependences:
|
|
; CHECK-NEXT: Run-time memory checks:
|
|
; CHECK-NEXT: Check 0:
|
|
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
|
|
; CHECK-NEXT: ptr %b
|
|
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
|
|
; CHECK-NEXT: %gep.iv = getelementptr i32, ptr %a, i64 %iv
|
|
; CHECK-NEXT: Grouped accesses:
|
|
; CHECK-NEXT: Group [[GRP1]]:
|
|
; CHECK-NEXT: (Low: %b High: (4 + %b))
|
|
; CHECK-NEXT: Member: %b
|
|
; CHECK-NEXT: Group [[GRP2]]:
|
|
; CHECK-NEXT: (Low: %a High: (16 + (12 * (trunc i128 ((zext i64 %N to i128) /u 3) to i16)) + %a))
|
|
; CHECK-NEXT: Member: {%a,+,12}<%loop>
|
|
; CHECK-EMPTY:
|
|
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
|
|
; CHECK-NEXT: SCEV assumptions:
|
|
; CHECK-NEXT: {0,+,3}<%loop> Added Flags: <nusw>
|
|
; CHECK-NEXT: {%a,+,12}<%loop> Added Flags: <nusw>
|
|
; CHECK-EMPTY:
|
|
; CHECK-NEXT: Expressions re-written:
|
|
;
|
|
entry:
|
|
br label %loop
|
|
|
|
loop:
|
|
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
|
|
%gep.iv = getelementptr i32, ptr %a, i64 %iv
|
|
store i32 0, ptr %gep.iv, align 1
|
|
store i32 0, ptr %b, align 1
|
|
%iv.next = add i64 %iv, 3
|
|
%.not = icmp ult i64 %N, %iv
|
|
br i1 %.not, label %exit, label %loop
|
|
|
|
exit:
|
|
ret void
|
|
}
|