-
Notifications
You must be signed in to change notification settings - Fork 15.2k
Open
Open
Copy link
Labels
Description
The issue was initially reported by @kasuga-fj during a discussion on PR 128782. For the loop in Example 1 (IR at the end) DA reports incorrect results (most notably it reports no dependency between two store instructions). It is easy to show that different variations of this loop have the same problem. See Example 2 for one of the cases.
Example 1:
; for (i = 0; i < 9223372036854775806; i++) {
; if (i < 2147483640)
; for (j = 0; j < 2147483640; j++)
; a[i + j * 4294967296] = 0;
;
; for (j = 0; j < 2147483640; j++)
; a[j * 2] = 0;
; }
;
Example 2:
void foo2 (int *a ) {
unsigned long long i;
unsigned long long j;
for (i = 0; i < 9223372036854775806; i++) {
for (j = 0; j < 2147483640; j++) {
a[i + j * 4294967296] = 0;
a[j * 2] = 0;
}
}
}
IR for Example 1
define void @f(ptr %a) {
entry:
br label %loop.i.header
loop.i.header:
%i = phi i64 [ 0 , %entry ], [ %i.next, %loop.i.latch ]
br label %loop.j.0.pr
loop.j.0.pr:
%guard.j.0 = icmp slt i64 %i, 2147483640
br i1 %guard.j.0, label %loop.j.0, label %loop.j.1
loop.j.0:
%j.0 = phi i64 [ 0, %loop.j.0.pr ], [ %j.0.next, %loop.j.0 ]
%val.0 = phi i64 [ %i, %loop.j.0.pr ], [ %val.0.next, %loop.j.0 ]
%j.0.next = add nsw i64 %j.0, 1
%idx.0 = getelementptr inbounds i8, ptr %a, i64 %val.0
store i8 0, ptr %idx.0
%val.0.next = add nsw i64 %val.0, 4294967296
%exitcond.j.0 = icmp eq i64 %j.0.next, 2147483640
br i1 %exitcond.j.0, label %loop.j.1, label %loop.j.0
loop.j.1:
%j.1 = phi i64 [ 0, %loop.j.0 ], [ 0, %loop.j.0.pr ], [ %j.1.next, %loop.j.1 ]
%val.1 = phi i64 [ 0, %loop.j.0 ], [ 0, %loop.j.0.pr ], [ %val.1.next, %loop.j.1 ]
%idx.1 = getelementptr inbounds i8, ptr %a, i64 %val.1
store i8 0, ptr %idx.1
%j.1.next = add nsw i64 %j.1, 1
%val.1.next = add nsw i64 %val.1, 2
%exitcond.j.1 = icmp eq i64 %j.1.next, 2147483640
br i1 %exitcond.j.1, label %loop.i.latch, label %loop.j.1
loop.i.latch:
%i.next = add nsw i64 %i, 1
%exitcond.i = icmp eq i64 %i.next, 9223372036854775806
br i1 %exitcond.i, label %exit, label %loop.i.header
exit:
ret void
}