Skip to content

Commit 5d35342

Browse files
committed
[LAA] Add extra test for #70819 showing incorrect Forward dep.
Add an additional test case where we currently incorrectly identify a dependence as Foward instead of ForwardButPreventsForwarding. Also cleans up the names in the tests a bit to improve readability.
1 parent 661a73f commit 5d35342

File tree

1 file changed

+68
-23
lines changed

1 file changed

+68
-23
lines changed
Lines changed: 68 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
12
; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s
23

34
target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
@@ -9,32 +10,76 @@ target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
910
; A[i+1] = A[i] + 1;
1011
; }
1112

12-
; CHECK: function 'vectorizable_Read_Write':
13-
; CHECK-NEXT: for.body:
14-
; CHECK-NEXT: Report: unsafe dependent memory operations in loop
15-
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
16-
; CHECK-NEXT: Dependences:
17-
; CHECK-NEXT: ForwardButPreventsForwarding:
18-
; CHECK-NEXT: %0 = load i32, ptr %arrayidx, align 4 ->
19-
; CHECK-NEXT: store i32 %add, ptr %gep, align 4
20-
2113
define void @vectorizable_Read_Write(ptr nocapture %A) {
14+
; CHECK-LABEL: 'vectorizable_Read_Write'
15+
; CHECK-NEXT: loop:
16+
; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop
17+
; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding.
18+
; CHECK-NEXT: Dependences:
19+
; CHECK-NEXT: ForwardButPreventsForwarding:
20+
; CHECK-NEXT: %l = load i32, ptr %gep.A, align 4 ->
21+
; CHECK-NEXT: store i32 %add, ptr %gep.A.plus.1, align 4
22+
; CHECK-EMPTY:
23+
; CHECK-NEXT: Run-time memory checks:
24+
; CHECK-NEXT: Grouped accesses:
25+
; CHECK-EMPTY:
26+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
27+
; CHECK-NEXT: SCEV assumptions:
28+
; CHECK-EMPTY:
29+
; CHECK-NEXT: Expressions re-written:
30+
;
2231
entry:
23-
%invariant.gep = getelementptr i32, ptr %A, i64 1
24-
br label %for.body
32+
%A.plus.1 = getelementptr i32, ptr %A, i64 1
33+
br label %loop
2534

26-
for.cond.cleanup:
27-
ret void
35+
loop:
36+
%iv = phi i64 [ 1022, %entry ], [ %iv.next, %loop ]
37+
%gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
38+
%l = load i32, ptr %gep.A, align 4
39+
%add = add nsw i32 %l, 1
40+
%gep.A.plus.1 = getelementptr i32, ptr %A.plus.1, i64 %iv
41+
store i32 %add, ptr %gep.A.plus.1, align 4
42+
%iv.next = add nsw i64 %iv, -1
43+
%cmp.not = icmp eq i64 %iv, 0
44+
br i1 %cmp.not, label %exit, label %loop
2845

29-
for.body:
30-
%indvars.iv = phi i64 [ 1022, %entry ], [ %indvars.iv.next, %for.body ]
31-
%arrayidx = getelementptr inbounds i32, ptr %A, i64 %indvars.iv
32-
%0 = load i32, ptr %arrayidx, align 4
33-
%add = add nsw i32 %0, 1
34-
%gep = getelementptr i32, ptr %invariant.gep, i64 %indvars.iv
35-
store i32 %add, ptr %gep, align 4
36-
%indvars.iv.next = add nsw i64 %indvars.iv, -1
37-
%cmp.not = icmp eq i64 %indvars.iv, 0
38-
br i1 %cmp.not, label %for.cond.cleanup, label %for.body
46+
exit:
47+
ret void
3948
}
4049

50+
; FIXME: There's a forward dependency that prevents forwarding here.
51+
define void @neg_step_ForwardButPreventsForwarding(ptr nocapture %A, ptr noalias %B) {
52+
; CHECK-LABEL: 'neg_step_ForwardButPreventsForwarding'
53+
; CHECK-NEXT: loop:
54+
; CHECK-NEXT: Memory dependences are safe
55+
; CHECK-NEXT: Dependences:
56+
; CHECK-NEXT: Forward:
57+
; CHECK-NEXT: store i32 0, ptr %gep.A, align 4 ->
58+
; CHECK-NEXT: %l = load i32, ptr %gep.A.plus.1, align 4
59+
; CHECK-EMPTY:
60+
; CHECK-NEXT: Run-time memory checks:
61+
; CHECK-NEXT: Grouped accesses:
62+
; CHECK-EMPTY:
63+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
64+
; CHECK-NEXT: SCEV assumptions:
65+
; CHECK-EMPTY:
66+
; CHECK-NEXT: Expressions re-written:
67+
;
68+
entry:
69+
%A.plus.1 = getelementptr i32, ptr %A, i64 1
70+
br label %loop
71+
72+
loop:
73+
%iv = phi i64 [ 1022, %entry ], [ %iv.next, %loop ]
74+
%gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
75+
store i32 0, ptr %gep.A, align 4
76+
%gep.A.plus.1 = getelementptr i32, ptr %A.plus.1, i64 %iv
77+
%l = load i32, ptr %gep.A.plus.1, align 4
78+
store i32 %l, ptr %B
79+
%iv.next = add nsw i64 %iv, -1
80+
%cmp.not = icmp eq i64 %iv, 0
81+
br i1 %cmp.not, label %exit, label %loop
82+
83+
exit:
84+
ret void
85+
}

0 commit comments

Comments
 (0)