@@ -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