@@ -248,3 +248,30 @@ exit: ; preds = %for.body
248248 %result = add nsw i32 %result0 , %result1
249249 ret i32 %result
250250}
251+
252+ define i64 @loop_reduction_and_store_last_element (ptr %src , ptr writeonly %dst ) {
253+ ; CHECK-LABEL: LV: Checking a loop in 'loop_reduction_and_store_last_element'
254+ ; CHECK: LV(REG): VF = 16
255+ ; CHECK-NEXT: LV(REG): Found max usage: 2 item
256+ ; CHECK-NEXT: LV(REG): RegisterClass: Generic::ScalarRC, 2 registers
257+ ; CHECK-NEXT: LV(REG): RegisterClass: Generic::VectorRC, 16 registers
258+ ; CHECK-NEXT: LV(REG): Found invariant usage: 1 item
259+ entry:
260+ br label %loop
261+
262+ loop:
263+ %iv = phi i32 [ 1 , %entry ], [ %iv.next , %loop ]
264+ %red = phi i64 [ 0 , %entry ], [ %red.next , %loop ]
265+ %ptr = phi ptr [ %src , %entry ], [ %ptr.next , %loop ]
266+ %iv.next = add nuw i32 %iv , 1
267+ %ptr.next = getelementptr i8 , ptr %ptr , i64 1
268+ store ptr %ptr , ptr %dst , align 8
269+ %val = load i8 , ptr %ptr , align 1
270+ %val.ext = zext i8 %val to i64
271+ %red.next = or i64 %red , %val.ext
272+ %ec = icmp eq i32 %iv.next , 1000
273+ br i1 %ec , label %exit , label %loop
274+
275+ exit:
276+ ret i64 %red.next
277+ }
0 commit comments