Skip to content

Commit e33de7d

Browse files
committed
Added suggested tests
1 parent 3f401f8 commit e33de7d

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed

llvm/test/Transforms/LoopVectorize/early_exit_store_legality.ll

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,30 @@ exit:
5555
ret void
5656
}
5757

58+
define void @loop_contains_store_ee_condition_is_invariant(ptr dereferenceable(40) noalias %array, i16 %ee.val) {
59+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_ee_condition_is_invariant'
60+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
61+
entry:
62+
br label %for.body
63+
64+
for.body:
65+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
66+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
67+
%data = load i16, ptr %st.addr, align 2
68+
%inc = add nsw i16 %data, 1
69+
store i16 %inc, ptr %st.addr, align 2
70+
%ee.cond = icmp sgt i16 %ee.val, 500
71+
br i1 %ee.cond, label %exit, label %for.inc
72+
73+
for.inc:
74+
%iv.next = add nuw nsw i64 %iv, 1
75+
%counted.cond = icmp eq i64 %iv.next, 20
76+
br i1 %counted.cond, label %exit, label %for.body
77+
78+
exit:
79+
ret void
80+
}
81+
5882
define void @loop_contains_store_fcmp_condition(ptr dereferenceable(40) noalias %array, ptr align 2 dereferenceable(40) readonly %pred) {
5983
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_fcmp_condition'
6084
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
@@ -110,6 +134,36 @@ exit:
110134
ret void
111135
}
112136

137+
define void @loop_contains_store_unsafe_dependency(ptr dereferenceable(40) noalias %array, ptr align 2 dereferenceable(80) readonly %pred) {
138+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_unsafe_dependency'
139+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
140+
entry:
141+
%unknown.offset = call i64 @get_an_unknown_offset()
142+
%unknown.base = getelementptr i16, ptr %pred, i64 %unknown.offset
143+
br label %for.body
144+
145+
for.body:
146+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
147+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
148+
%data = load i16, ptr %st.addr, align 2
149+
%inc = add nsw i16 %data, 1
150+
store i16 %inc, ptr %st.addr, align 2
151+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
152+
%ee.val = load i16, ptr %ee.addr, align 2
153+
%ee.cond = icmp sgt i16 %ee.val, 500
154+
%some.addr = getelementptr inbounds nuw i16, ptr %unknown.base, i64 %iv
155+
store i16 42, ptr %some.addr, align 2
156+
br i1 %ee.cond, label %exit, label %for.inc
157+
158+
for.inc:
159+
%iv.next = add nuw nsw i64 %iv, 1
160+
%counted.cond = icmp eq i64 %iv.next, 20
161+
br i1 %counted.cond, label %exit, label %for.body
162+
163+
exit:
164+
ret void
165+
}
166+
113167
define void @loop_contains_store_assumed_bounds(ptr noalias %array, ptr readonly %pred, i32 %n) {
114168
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_assumed_bounds'
115169
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
@@ -139,6 +193,60 @@ exit:
139193
ret void
140194
}
141195

196+
define void @loop_contains_store_to_pointer_with_no_deref_info(ptr noalias %array, ptr align 2 dereferenceable(40) readonly %pred) {
197+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_to_pointer_with_no_deref_info'
198+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
199+
entry:
200+
br label %for.body
201+
202+
for.body:
203+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
204+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
205+
%data = load i16, ptr %st.addr, align 2
206+
%inc = add nsw i16 %data, 1
207+
store i16 %inc, ptr %st.addr, align 2
208+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
209+
%ee.val = load i16, ptr %ee.addr, align 2
210+
%ee.cond = icmp sgt i16 %ee.val, 500
211+
br i1 %ee.cond, label %exit, label %for.inc
212+
213+
for.inc:
214+
%iv.next = add nuw nsw i64 %iv, 1
215+
%counted.cond = icmp eq i64 %iv.next, 20
216+
br i1 %counted.cond, label %exit, label %for.body
217+
218+
exit:
219+
ret void
220+
}
221+
222+
define void @loop_contains_store_unknown_bounds(ptr noalias %array, ptr readonly %pred, i32 %n) {
223+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_unknown_bounds'
224+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
225+
entry:
226+
%n_bytes = mul nuw nsw i32 %n, 2
227+
%tc = sext i32 %n to i64
228+
br label %for.body
229+
230+
for.body:
231+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
232+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
233+
%data = load i16, ptr %st.addr, align 2
234+
%inc = add nsw i16 %data, 1
235+
store i16 %inc, ptr %st.addr, align 2
236+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
237+
%ee.val = load i16, ptr %ee.addr, align 2
238+
%ee.cond = icmp sgt i16 %ee.val, 500
239+
br i1 %ee.cond, label %exit, label %for.inc
240+
241+
for.inc:
242+
%iv.next = add nuw nsw i64 %iv, 1
243+
%counted.cond = icmp eq i64 %iv.next, %tc
244+
br i1 %counted.cond, label %exit, label %for.body
245+
246+
exit:
247+
ret void
248+
}
249+
142250
define void @loop_contains_store_volatile(ptr dereferenceable(40) noalias %array, ptr align 2 dereferenceable(40) readonly %pred) {
143251
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_volatile'
144252
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
@@ -165,4 +273,83 @@ exit:
165273
ret void
166274
}
167275

276+
define void @loop_contains_store_to_invariant_location(ptr dereferenceable(40) readonly %array, ptr align 2 dereferenceable(40) readonly %pred, ptr noalias %store_addr) {
277+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_to_invariant_location'
278+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
279+
entry:
280+
br label %for.body
281+
282+
for.body:
283+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
284+
%addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
285+
%data = load i16, ptr %addr, align 2
286+
%inc = add nsw i16 %data, 1
287+
store i16 %inc, ptr %store_addr, align 2
288+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
289+
%ee.val = load i16, ptr %ee.addr, align 2
290+
%ee.cond = icmp sgt i16 %ee.val, 500
291+
br i1 %ee.cond, label %exit, label %for.inc
292+
293+
for.inc:
294+
%iv.next = add nuw nsw i64 %iv, 1
295+
%counted.cond = icmp eq i64 %iv.next, 20
296+
br i1 %counted.cond, label %exit, label %for.body
297+
298+
exit:
299+
ret void
300+
}
301+
302+
define void @loop_contains_store_in_latch_block(ptr dereferenceable(40) noalias %array, ptr align 2 dereferenceable(40) readonly %pred) {
303+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_in_latch_block'
304+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
305+
entry:
306+
br label %for.body
307+
308+
for.body:
309+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
310+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
311+
%data = load i16, ptr %st.addr, align 2
312+
%inc = add nsw i16 %data, 1
313+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
314+
%ee.val = load i16, ptr %ee.addr, align 2
315+
%ee.cond = icmp sgt i16 %ee.val, 500
316+
br i1 %ee.cond, label %exit, label %for.inc
317+
318+
for.inc:
319+
store i16 %inc, ptr %st.addr, align 2
320+
%iv.next = add nuw nsw i64 %iv, 1
321+
%counted.cond = icmp eq i64 %iv.next, 20
322+
br i1 %counted.cond, label %exit, label %for.body
323+
324+
exit:
325+
ret void
326+
}
327+
328+
define void @loop_contains_store_requiring_alias_check(ptr dereferenceable(40) %array, ptr align 2 dereferenceable(40) %pred) {
329+
; CHECK-LABEL: LV: Checking a loop in 'loop_contains_store_requiring_alias_check'
330+
; CHECK: LV: Not vectorizing: Writes to memory unsupported in early exit loops.
331+
entry:
332+
br label %for.body
333+
334+
for.body:
335+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %for.inc ]
336+
%st.addr = getelementptr inbounds nuw i16, ptr %array, i64 %iv
337+
%data = load i16, ptr %st.addr, align 2
338+
%inc = add nsw i16 %data, 1
339+
store i16 %inc, ptr %st.addr, align 2
340+
%ee.addr = getelementptr inbounds nuw i16, ptr %pred, i64 %iv
341+
%ee.val = load i16, ptr %ee.addr, align 2
342+
%ee.cond = icmp sgt i16 %ee.val, 500
343+
br i1 %ee.cond, label %exit, label %for.inc
344+
345+
for.inc:
346+
%iv.next = add nuw nsw i64 %iv, 1
347+
%counted.cond = icmp eq i64 %iv.next, 20
348+
br i1 %counted.cond, label %exit, label %for.body
349+
350+
exit:
351+
ret void
352+
}
353+
168354
declare void @init_mem(ptr, i64);
355+
declare i64 @get_an_unknown_offset();

0 commit comments

Comments
 (0)