|
| 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 |
| 2 | +; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s |
| 3 | + |
| 4 | +define i32 @loop_live_out(ptr %p, i64 %n) { |
| 5 | +; CHECK-LABEL: loop_live_out: |
| 6 | +; CHECK: # %bb.0: # %entry |
| 7 | +; CHECK-NEXT: mv a2, a0 |
| 8 | +; CHECK-NEXT: .LBB0_1: # %loop |
| 9 | +; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 |
| 10 | +; CHECK-NEXT: mv a4, a1 |
| 11 | +; CHECK-NEXT: vsetvli a3, a1, e8, mf2, ta, ma |
| 12 | +; CHECK-NEXT: vle32.v v8, (a2) |
| 13 | +; CHECK-NEXT: sub a1, a1, a3 |
| 14 | +; CHECK-NEXT: vsetvli a5, zero, e32, m2, ta, ma |
| 15 | +; CHECK-NEXT: vadd.vi v8, v8, 1 |
| 16 | +; CHECK-NEXT: vsetvli zero, a4, e32, m2, ta, ma |
| 17 | +; CHECK-NEXT: vse32.v v8, (a2) |
| 18 | +; CHECK-NEXT: slli a2, a3, 2 |
| 19 | +; CHECK-NEXT: add a2, a0, a2 |
| 20 | +; CHECK-NEXT: bnez a1, .LBB0_1 |
| 21 | +; CHECK-NEXT: # %bb.2: # %exit |
| 22 | +; CHECK-NEXT: addi a3, a3, -1 |
| 23 | +; CHECK-NEXT: vsetivli zero, 1, e32, m2, ta, ma |
| 24 | +; CHECK-NEXT: vslidedown.vx v8, v8, a3 |
| 25 | +; CHECK-NEXT: vmv.x.s a0, v8 |
| 26 | +; CHECK-NEXT: ret |
| 27 | +entry: |
| 28 | + br label %loop |
| 29 | + |
| 30 | +loop: |
| 31 | + %avl = phi i64 [%n, %entry], [%avl.next, %loop] |
| 32 | + %gep = phi ptr [%p, %entry], [%gep.next, %loop] |
| 33 | + %vl = call i32 @llvm.experimental.get.vector.length(i64 %avl, i32 4, i1 true) |
| 34 | + %x = call <vscale x 4 x i32> @llvm.vp.load(ptr %gep, <vscale x 4 x i1> splat (i1 true), i32 %vl) |
| 35 | + %y = add <vscale x 4 x i32> %x, splat (i32 1) |
| 36 | + call void @llvm.vp.store(<vscale x 4 x i32> %y, ptr %gep, <vscale x 4 x i1> splat (i1 true), i32 %vl) |
| 37 | + %vl.zext = zext i32 %vl to i64 |
| 38 | + %avl.next = sub i64 %avl, %vl.zext |
| 39 | + %gep.next = getelementptr i32, ptr %p, i32 %vl |
| 40 | + %ec = icmp eq i64 %avl.next, 0 |
| 41 | + br i1 %ec, label %exit, label %loop |
| 42 | + |
| 43 | +exit: |
| 44 | + %lastidx = sub i64 %vl.zext, 1 |
| 45 | + %lastelt = extractelement <vscale x 4 x i32> %y, i64 %lastidx |
| 46 | + ret i32 %lastelt |
| 47 | +} |
0 commit comments