Skip to content

Commit 4cfd4a7

Browse files
committed
[LAA] Add test case for llvm#82665.
Test case for llvm#82665.
1 parent 597be90 commit 4cfd4a7

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3+
4+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
5+
6+
; Test case for https://github.com/llvm/llvm-project/issues/82665.
7+
define void @indirect_ptr_recurrences_read_write(ptr %A, ptr %B) {
8+
; CHECK-LABEL: 'indirect_ptr_recurrences_read_write'
9+
; CHECK-NEXT: loop:
10+
; CHECK-NEXT: Memory dependences are safe
11+
; CHECK-NEXT: Dependences:
12+
; CHECK-NEXT: Run-time memory checks:
13+
; CHECK-NEXT: Grouped accesses:
14+
; CHECK-EMPTY:
15+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
16+
; CHECK-NEXT: SCEV assumptions:
17+
; CHECK-EMPTY:
18+
; CHECK-NEXT: Expressions re-written:
19+
;
20+
entry:
21+
br label %loop
22+
23+
loop:
24+
%iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
25+
%ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
26+
%gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
27+
%ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
28+
%l = load i32, ptr %ptr.recur, align 4, !tbaa !10
29+
%xor = xor i32 %l, 1
30+
store i32 %xor, ptr %ptr.recur, align 4, !tbaa !10
31+
%iv.next = add nuw nsw i64 %iv, 1
32+
%ec = icmp eq i64 %iv.next, 5
33+
br i1 %ec, label %exit, label %loop
34+
35+
exit:
36+
ret void
37+
}
38+
39+
define i32 @indirect_ptr_recurrences_read_only_loop(ptr %A, ptr %B) {
40+
; CHECK-LABEL: 'indirect_ptr_recurrences_read_only_loop'
41+
; CHECK-NEXT: loop:
42+
; CHECK-NEXT: Memory dependences are safe
43+
; CHECK-NEXT: Dependences:
44+
; CHECK-NEXT: Run-time memory checks:
45+
; CHECK-NEXT: Grouped accesses:
46+
; CHECK-EMPTY:
47+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
48+
; CHECK-NEXT: SCEV assumptions:
49+
; CHECK-EMPTY:
50+
; CHECK-NEXT: Expressions re-written:
51+
;
52+
entry:
53+
br label %loop
54+
55+
loop:
56+
%iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
57+
%ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
58+
%red = phi i32 [ 0, %entry ], [ %xor, %loop ]
59+
%gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
60+
%ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
61+
%l = load i32, ptr %ptr.recur, align 4, !tbaa !10
62+
%xor = xor i32 %l, 1
63+
%iv.next = add nuw nsw i64 %iv, 1
64+
%ec = icmp eq i64 %iv.next, 5
65+
br i1 %ec, label %exit, label %loop
66+
67+
exit:
68+
ret i32 %xor
69+
}
70+
71+
define void @indirect_ptr_recurrences_read_write_may_alias_no_tbaa(ptr %A, ptr %B) {
72+
; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_alias_no_tbaa'
73+
; CHECK-NEXT: loop:
74+
; CHECK-NEXT: Report: cannot identify array bounds
75+
; CHECK-NEXT: Dependences:
76+
; CHECK-NEXT: Run-time memory checks:
77+
; CHECK-NEXT: Grouped accesses:
78+
; CHECK-EMPTY:
79+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
80+
; CHECK-NEXT: SCEV assumptions:
81+
; CHECK-EMPTY:
82+
; CHECK-NEXT: Expressions re-written:
83+
;
84+
entry:
85+
br label %loop
86+
87+
loop:
88+
%iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
89+
%ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
90+
%gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
91+
%ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
92+
%l = load i32, ptr %ptr.recur, align 4
93+
%xor = xor i32 %l, 1
94+
store i32 %xor, ptr %ptr.recur, align 4
95+
%iv.next = add nuw nsw i64 %iv, 1
96+
%ec = icmp eq i64 %iv.next, 5
97+
br i1 %ec, label %exit, label %loop
98+
99+
exit:
100+
ret void
101+
}
102+
103+
define void @indirect_ptr_recurrences_read_write_may_alias_different_obj(ptr %A, ptr %B, ptr %C) {
104+
; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_alias_different_obj'
105+
; CHECK-NEXT: loop:
106+
; CHECK-NEXT: Report: cannot identify array bounds
107+
; CHECK-NEXT: Dependences:
108+
; CHECK-NEXT: Run-time memory checks:
109+
; CHECK-NEXT: Grouped accesses:
110+
; CHECK-EMPTY:
111+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
112+
; CHECK-NEXT: SCEV assumptions:
113+
; CHECK-EMPTY:
114+
; CHECK-NEXT: Expressions re-written:
115+
;
116+
entry:
117+
br label %loop
118+
119+
loop:
120+
%iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
121+
%ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
122+
%gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
123+
%ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
124+
%l = load i32, ptr %ptr.recur, align 4
125+
%xor = xor i32 %l, 1
126+
%gep.C = getelementptr inbounds ptr, ptr %C, i64 %iv
127+
store i32 %xor, ptr %gep.C, align 4
128+
%iv.next = add nuw nsw i64 %iv, 1
129+
%ec = icmp eq i64 %iv.next, 5
130+
br i1 %ec, label %exit, label %loop
131+
132+
exit:
133+
ret void
134+
}
135+
136+
define void @indirect_ptr_recurrences_read_write_may_noalias_different_obj(ptr %A, ptr %B, ptr noalias %C) {
137+
; CHECK-LABEL: 'indirect_ptr_recurrences_read_write_may_noalias_different_obj'
138+
; CHECK-NEXT: loop:
139+
; CHECK-NEXT: Memory dependences are safe
140+
; CHECK-NEXT: Dependences:
141+
; CHECK-NEXT: Run-time memory checks:
142+
; CHECK-NEXT: Grouped accesses:
143+
; CHECK-EMPTY:
144+
; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.
145+
; CHECK-NEXT: SCEV assumptions:
146+
; CHECK-EMPTY:
147+
; CHECK-NEXT: Expressions re-written:
148+
;
149+
entry:
150+
br label %loop
151+
152+
loop:
153+
%iv = phi i64 [ 1, %entry ], [ %iv.next, %loop ]
154+
%ptr.recur = phi ptr [ %A, %entry ], [ %ptr.next, %loop ]
155+
%gep.B = getelementptr inbounds ptr, ptr %B, i64 %iv
156+
%ptr.next = load ptr, ptr %gep.B, align 8, !tbaa !6
157+
%l = load i32, ptr %ptr.recur, align 4
158+
%xor = xor i32 %l, 1
159+
%gep.C = getelementptr inbounds ptr, ptr %C, i64 %iv
160+
store i32 %xor, ptr %gep.C, align 4
161+
%iv.next = add nuw nsw i64 %iv, 1
162+
%ec = icmp eq i64 %iv.next, 5
163+
br i1 %ec, label %exit, label %loop
164+
165+
exit:
166+
ret void
167+
}
168+
169+
170+
!6 = !{!7, !7, i64 0}
171+
!7 = !{!"any pointer", !8, i64 0}
172+
!8 = !{!"omnipotent char", !9, i64 0}
173+
!9 = !{!"Simple C/C++ TBAA"}
174+
!10 = !{!11, !11, i64 0}
175+
!11 = !{!"int", !8, i64 0}

0 commit comments

Comments
 (0)