88define float @bug41488_test1 (float %f ) {
99; CHECK-LABEL: 'bug41488_test1'
1010; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
11- ; CHECK-NEXT: da analyze - input [*] !
11+ ; CHECK-NEXT: da analyze - confused !
1212; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float %f, ptr %q, align 4
1313; CHECK-NEXT: da analyze - confused!
1414; CHECK-NEXT: Src: store float %f, ptr %q, align 4 --> Dst: store float %f, ptr %q, align 4
15- ; CHECK-NEXT: da analyze - output [*] !
15+ ; CHECK-NEXT: da analyze - confused !
1616;
1717entry:
1818 %g = alloca float , align 4
@@ -34,11 +34,11 @@ for.cond.cleanup:
3434define void @bug41488_test2 (i32 %n ) {
3535; CHECK-LABEL: 'bug41488_test2'
3636; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: %0 = load float, ptr %p, align 4
37- ; CHECK-NEXT: da analyze - input [*] !
37+ ; CHECK-NEXT: da analyze - confused !
3838; CHECK-NEXT: Src: %0 = load float, ptr %p, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
3939; CHECK-NEXT: da analyze - confused!
4040; CHECK-NEXT: Src: store float 0.000000e+00, ptr %q, align 4 --> Dst: store float 0.000000e+00, ptr %q, align 4
41- ; CHECK-NEXT: da analyze - output [*] !
41+ ; CHECK-NEXT: da analyze - confused !
4242;
4343entry:
4444 %g = alloca float , align 4
@@ -68,7 +68,7 @@ define void @bug53942_foo(i32 noundef %n, ptr noalias nocapture noundef writeonl
6868; CHECK-NEXT: Src: %.pre = load double, ptr %B, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
6969; CHECK-NEXT: da analyze - confused!
7070; CHECK-NEXT: Src: store double %.pre, ptr %arrayidx2, align 8 --> Dst: store double %.pre, ptr %arrayidx2, align 8
71- ; CHECK-NEXT: da analyze - output [*] !
71+ ; CHECK-NEXT: da analyze - confused !
7272;
7373entry:
7474 %cmp8 = icmp sgt i32 %n , 1
@@ -99,11 +99,11 @@ for.body: ; preds = %for.body.preheader,
9999define void @bug53942_bar (i32 noundef %n , ptr noalias noundef %A , ptr noalias noundef %B ) {
100100; CHECK-LABEL: 'bug53942_bar'
101101; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: %0 = load double, ptr %arrayidx, align 8
102- ; CHECK-NEXT: da analyze - input [*] !
102+ ; CHECK-NEXT: da analyze - confused !
103103; CHECK-NEXT: Src: %0 = load double, ptr %arrayidx, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
104104; CHECK-NEXT: da analyze - confused!
105105; CHECK-NEXT: Src: store double %0, ptr %arrayidx8, align 8 --> Dst: store double %0, ptr %arrayidx8, align 8
106- ; CHECK-NEXT: da analyze - output [*] !
106+ ; CHECK-NEXT: da analyze - confused !
107107;
108108entry:
109109 br label %for.cond
@@ -166,14 +166,14 @@ for.end: ; preds = %for.cond.cleanup
166166; (j % 2 == 0 ? A[i][j] : A[i][j+1]) = 1;
167167; }
168168;
169- ; FIXME: There are loop-carried dependencies between the store instruction. For
169+ ; There are loop-carried dependencies between the store instruction. For
170170; example, the value of %ptr0 when (i, j) = (0, 1) is %A+8, which is the same
171171; as when (i, j) = (0, 2).
172172
173173define void @non_invariant_baseptr_with_identical_obj (ptr %A ) {
174174; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj'
175175; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
176- ; CHECK-NEXT: da analyze - none !
176+ ; CHECK-NEXT: da analyze - confused !
177177;
178178entry:
179179 br label %loop.i.header
@@ -216,13 +216,13 @@ exit:
216216; Similar to the above case, but ptr0 is loop-invariant with respsect to the
217217; k-loop.
218218;
219- ; FIXME: Same as the above case, there are loop-carried dependencies between
220- ; the store.
219+ ; Same as the above case, there are loop-carried dependencies between the
220+ ; store.
221221
222222define void @non_invariant_baseptr_with_identical_obj2 (ptr %A ) {
223223; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj2'
224224; CHECK-NEXT: Src: store i32 1, ptr %idx, align 4 --> Dst: store i32 1, ptr %idx, align 4
225- ; CHECK-NEXT: da analyze - none !
225+ ; CHECK-NEXT: da analyze - confused !
226226;
227227entry:
228228 br label %loop.i.header
@@ -259,3 +259,58 @@ loop.i.latch:
259259exit:
260260 ret void
261261}
262+
263+ ; Pseudo-code that is approximately semantically equivalent to the below IR:
264+ ;
265+ ; void f(int A[][32]) {
266+ ; for (int i = 0; i < 100; i++)
267+ ; for (int j = 0; j < 15; j++) {
268+ ; int offset = (j % 2 == 0) ? 1 : 0;
269+ ; A[i][2 * j + offset + 0] = 1;
270+ ; A[i][2 * j + offset + 1] = 1;
271+ ; }
272+ ; }
273+ ;
274+ ; There are loop-carried dependencies between the two stores. For example,
275+ ; A[0][2] is accessed from both the former one when (i, j) = (0, 1) and the
276+ ; latter one when (i, j) = (0, 0).
277+ ;
278+ define void @non_invariant_baseptr_with_identical_obj3 (ptr %A ) {
279+ ; CHECK-LABEL: 'non_invariant_baseptr_with_identical_obj3'
280+ ; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx0, align 4
281+ ; CHECK-NEXT: da analyze - confused!
282+ ; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx1, align 4
283+ ; CHECK-NEXT: da analyze - confused!
284+ ; CHECK-NEXT: Src: store i32 1, ptr %idx1, align 4 --> Dst: store i32 1, ptr %idx1, align 4
285+ ; CHECK-NEXT: da analyze - confused!
286+ ;
287+ entry:
288+ br label %loop.i.header
289+
290+ loop.i.header:
291+ %i = phi i32 [ 0 , %entry ], [ %i.inc , %loop.i.latch ]
292+ %A1 = getelementptr i32 , ptr %A , i32 1
293+ br label %loop.j
294+
295+ loop.j:
296+ %j = phi i32 [ 0 , %loop.i.header ], [ %j.inc , %loop.j ]
297+ %ptr0 = phi ptr [ %A1 , %loop.i.header ], [ %ptr1 , %loop.j ]
298+ %ptr1 = phi ptr [ %A , %loop.i.header ], [ %ptr0 , %loop.j ]
299+ %j2_0 = shl i32 %j , 1
300+ %j2_1 = add i32 %j2_0 , 1
301+ %idx0 = getelementptr [32 x i32 ], ptr %ptr0 , i32 %i , i32 %j2_0
302+ %idx1 = getelementptr [32 x i32 ], ptr %ptr0 , i32 %i , i32 %j2_1
303+ store i32 1 , ptr %idx0
304+ store i32 1 , ptr %idx1
305+ %j.inc = add i32 %j , 1
306+ %cmp.j = icmp slt i32 %j.inc , 15
307+ br i1 %cmp.j , label %loop.j , label %loop.i.latch
308+
309+ loop.i.latch:
310+ %i.inc = add i32 %i , 1
311+ %cmp.i = icmp slt i32 %i.inc , 100
312+ br i1 %cmp.i , label %loop.i.header , label %exit
313+
314+ exit:
315+ ret void
316+ }
0 commit comments