blob: 1576fe99d8767491ccb95b97852d2fe3db42529a [file]
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
; RUN: opt < %s -disable-output "-passes=print<da>" 2>&1 | FileCheck %s
; Test case for GitHub issue #149977: Strong SIV test with symbolic coefficients and deltas
; The issue was that the bound constraint check was overly conservative with symbolic expressions,
; causing valid dependencies to be rejected before reaching the division logic.
;
; Mathematical analysis:
; - Access patterns: a[-k*i] vs a[-k*i + (2*k + 1)]
; - Strong SIV equation: -k*(i2-i1) = (2*k + 1)
; - Distance: (2*k + 1)/k
; - For k=-1: distance = -1/-1 = 1 (clear dependence)
define void @f(ptr %a, i64 %k) {
; CHECK-LABEL: 'f'
; CHECK-NEXT: Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.0, align 1
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i8 42, ptr %idx.0, align 1 --> Dst: store i8 42, ptr %idx.1, align 1
; CHECK-NEXT: da analyze - consistent output [((-1 + (-2 * %k)) /u (-1 * %k))]!
; CHECK-NEXT: Runtime Assumptions:
; CHECK-NEXT: Compare predicate: (1 + (2 * %k))<nuw><nsw> sle) (2 * %k)
; CHECK-NEXT: Src: store i8 42, ptr %idx.1, align 1 --> Dst: store i8 42, ptr %idx.1, align 1
; CHECK-NEXT: da analyze - none!
;
entry:
%mk = sub i64 0, %k ; mk = -k
%kk = mul i64 %k, 2 ; kk = 2*k
%kk.inc = add i64 1, %kk ; kk.inc = 2*k + 1
br label %loop
loop:
%i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
%subscript.0 = mul i64 %mk, %i ; -k * i
%subscript.1 = add i64 %subscript.0, %kk.inc ; -k * i + (2*k + 1)
%idx.0 = getelementptr i8, ptr %a, i64 %subscript.0
%idx.1 = getelementptr i8, ptr %a, i64 %subscript.1
store i8 42, ptr %idx.0
store i8 42, ptr %idx.1
%i.next = add i64 %i, 1
%cond.exit = icmp eq i64 %i.next, 3
br i1 %cond.exit, label %exit, label %loop
exit:
ret void
}