Skip to content

Commit 1df731b

Browse files
committed
Add test
1 parent 4977f6f commit 1df731b

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

llvm/test/Analysis/DependenceAnalysis/FlipFlopBaseAddress.ll

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,3 +259,58 @@ loop.i.latch:
259259
exit:
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

Comments
 (0)