1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 3
2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s
3
4; Test cases for using the backedge-taken-count to rule out dependencies between
5; an invariant and strided accesses.
6
7define void @test_distance_greater_than_BTC_100(ptr %a) {
8; CHECK-LABEL: 'test_distance_greater_than_BTC_100'
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;
20entry:
21  %gep.x = getelementptr i32, ptr %a, i32 100
22  br label %loop
23
24loop:
25  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
26  %gep = getelementptr i32, ptr %a, i32 %iv
27  %l = load i32, ptr %gep.x
28  store i32 %l, ptr %gep
29  %iv.next = add i32 %iv, 1
30  %ec = icmp eq i32 %iv.next, 100
31  br i1 %ec, label %exit, label %loop
32
33exit:
34  ret void
35}
36
37define void @test_distance_much_greater_than_BTC_100(ptr %a) {
38; CHECK-LABEL: 'test_distance_much_greater_than_BTC_100'
39; CHECK-NEXT:    loop:
40; 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
41; CHECK-NEXT:  Unknown data dependence.
42; CHECK-NEXT:      Dependences:
43; CHECK-NEXT:        Unknown:
44; CHECK-NEXT:            %l = load i32, ptr %gep.x, align 4 ->
45; CHECK-NEXT:            store i32 %l, ptr %gep, align 4
46; CHECK-EMPTY:
47; CHECK-NEXT:      Run-time memory checks:
48; CHECK-NEXT:      Grouped accesses:
49; CHECK-EMPTY:
50; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
51; CHECK-NEXT:      SCEV assumptions:
52; CHECK-EMPTY:
53; CHECK-NEXT:      Expressions re-written:
54;
55entry:
56  %gep.x = getelementptr i32, ptr %a, i32 200
57  br label %loop
58
59loop:
60  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
61  %gep = getelementptr i32, ptr %a, i32 %iv
62  %l = load i32, ptr %gep.x
63  store i32 %l, ptr %gep
64  %iv.next = add i32 %iv, 1
65  %ec = icmp eq i32 %iv.next, 100
66  br i1 %ec, label %exit, label %loop
67
68exit:
69  ret void
70}
71
72define void @test_distance_equal_BTC_100(ptr %a) {
73; CHECK-LABEL: 'test_distance_equal_BTC_100'
74; CHECK-NEXT:    loop:
75; 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
76; CHECK-NEXT:  Unknown data dependence.
77; CHECK-NEXT:      Dependences:
78; CHECK-NEXT:        Unknown:
79; CHECK-NEXT:            %l = load i32, ptr %gep.x, align 4 ->
80; CHECK-NEXT:            store i32 %l, ptr %gep, align 4
81; CHECK-EMPTY:
82; CHECK-NEXT:      Run-time memory checks:
83; CHECK-NEXT:      Grouped accesses:
84; CHECK-EMPTY:
85; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
86; CHECK-NEXT:      SCEV assumptions:
87; CHECK-EMPTY:
88; CHECK-NEXT:      Expressions re-written:
89;
90entry:
91  %gep.x = getelementptr i32, ptr %a, i32 99
92  br label %loop
93
94loop:
95  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
96  %gep = getelementptr i32, ptr %a, i32 %iv
97  %l = load i32, ptr %gep.x
98  store i32 %l, ptr %gep
99  %iv.next = add i32 %iv, 1
100  %ec = icmp eq i32 %iv.next, 100
101  br i1 %ec, label %exit, label %loop
102
103exit:
104  ret void
105}
106
107define void @test_distance_greater_than_BTC_10000(ptr %a) {
108; CHECK-LABEL: 'test_distance_greater_than_BTC_10000'
109; CHECK-NEXT:    loop:
110; CHECK-NEXT:      Memory dependences are safe
111; CHECK-NEXT:      Dependences:
112; CHECK-NEXT:      Run-time memory checks:
113; CHECK-NEXT:      Grouped accesses:
114; CHECK-EMPTY:
115; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
116; CHECK-NEXT:      SCEV assumptions:
117; CHECK-EMPTY:
118; CHECK-NEXT:      Expressions re-written:
119;
120entry:
121  %gep.x = getelementptr i32, ptr %a, i32 10000
122  br label %loop
123
124loop:
125  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
126  %gep = getelementptr i32, ptr %a, i32 %iv
127  %l = load i32, ptr %gep.x
128  store i32 %l, ptr %gep
129  %iv.next = add i32 %iv, 1
130  %ec = icmp eq i32 %iv.next, 10000
131  br i1 %ec, label %exit, label %loop
132
133exit:
134  ret void
135}
136
137define void @test_distance_equal_to_BTC_10000(ptr %a) {
138; CHECK-LABEL: 'test_distance_equal_to_BTC_10000'
139; CHECK-NEXT:    loop:
140; 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
141; CHECK-NEXT:  Unknown data dependence.
142; CHECK-NEXT:      Dependences:
143; CHECK-NEXT:        Unknown:
144; CHECK-NEXT:            %l = load i32, ptr %gep.x, align 4 ->
145; CHECK-NEXT:            store i32 %l, ptr %gep, align 4
146; CHECK-EMPTY:
147; CHECK-NEXT:      Run-time memory checks:
148; CHECK-NEXT:      Grouped accesses:
149; CHECK-EMPTY:
150; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
151; CHECK-NEXT:      SCEV assumptions:
152; CHECK-EMPTY:
153; CHECK-NEXT:      Expressions re-written:
154;
155entry:
156  %gep.x = getelementptr i32, ptr %a, i32 9999
157  br label %loop
158
159loop:
160  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
161  %gep = getelementptr i32, ptr %a, i32 %iv
162  %l = load i32, ptr %gep.x
163  store i32 %l, ptr %gep
164  %iv.next = add i32 %iv, 1
165  %ec = icmp eq i32 %iv.next, 100000
166  br i1 %ec, label %exit, label %loop
167
168exit:
169  ret void
170}
171
172define void @test_btc_is_unknown_value(ptr %a, i32 %N) {
173; CHECK-LABEL: 'test_btc_is_unknown_value'
174; CHECK-NEXT:    loop:
175; 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
176; CHECK-NEXT:  Unknown data dependence.
177; CHECK-NEXT:      Dependences:
178; CHECK-NEXT:        Unknown:
179; CHECK-NEXT:            %l = load i32, ptr %gep.x, align 4 ->
180; CHECK-NEXT:            store i32 %l, ptr %gep, align 4
181; CHECK-EMPTY:
182; CHECK-NEXT:      Run-time memory checks:
183; CHECK-NEXT:      Grouped accesses:
184; CHECK-NEXT:        Group [[GRP1:0x[0-9a-f]+]]:
185; CHECK-NEXT:          (Low: (400 + %a) High: (404 + %a))
186; CHECK-NEXT:            Member: (400 + %a)
187; CHECK-NEXT:        Group [[GRP2:0x[0-9a-f]+]]:
188; CHECK-NEXT:          (Low: %a High: (4 + (4 * (zext i32 (-1 + %N) to i64))<nuw><nsw> + %a))
189; CHECK-NEXT:            Member: {%a,+,4}<nw><%loop>
190; CHECK-EMPTY:
191; CHECK-NEXT:      Non vectorizable stores to invariant address were not found in loop.
192; CHECK-NEXT:      SCEV assumptions:
193; CHECK-NEXT:      {0,+,1}<nuw><%loop> Added Flags: <nssw>
194; CHECK-EMPTY:
195; CHECK-NEXT:      Expressions re-written:
196; CHECK-NEXT:      [PSE] %gep = getelementptr i32, ptr %a, i32 %iv:
197; CHECK-NEXT:        ((4 * (sext i32 {0,+,1}<nuw><%loop> to i64))<nsw> + %a)
198; CHECK-NEXT:        --> {%a,+,4}<nw><%loop>
199;
200entry:
201  %gep.x = getelementptr i32, ptr %a, i32 100
202  br label %loop
203
204loop:
205  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
206  %gep = getelementptr i32, ptr %a, i32 %iv
207  %l = load i32, ptr %gep.x
208  store i32 %l, ptr %gep
209  %iv.next = add i32 %iv, 1
210  %ec = icmp eq i32 %iv.next, %N
211  br i1 %ec, label %exit, label %loop
212
213exit:
214  ret void
215}
216