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+
5882define 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+
113167define 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+
142250define 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+
168354declare void @init_mem (ptr , i64 );
355+ declare i64 @get_an_unknown_offset ();
0 commit comments