Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 37 additions & 2 deletions llvm/test/CodeGen/RISCV/rvv/vl-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -266,18 +266,53 @@ exit:
ret void
}

define void @recurrence_vleff(<vscale x 4 x i32> %v, ptr %p, iXLen %n, iXLen %vl) {
; CHECK-LABEL: recurrence_vleff:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vsetvli zero, a2, e32, m2, ta, ma
; CHECK-NEXT: vmv.v.i v8, 0
; CHECK-NEXT: mv a3, a0
; CHECK-NEXT: .LBB17_1: # %loop
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
; CHECK-NEXT: vsetvli zero, a2, e32, m2, ta, ma
; CHECK-NEXT: vle32ff.v v10, (a3)
; CHECK-NEXT: addi a1, a1, -1
; CHECK-NEXT: vadd.vv v8, v8, v10
; CHECK-NEXT: vse32.v v8, (a0)
; CHECK-NEXT: addi a3, a3, 4
; CHECK-NEXT: bnez a1, .LBB17_1
; CHECK-NEXT: # %bb.2: # %exit
; CHECK-NEXT: ret
Comment on lines +270 to +285
Copy link
Contributor Author

@lukel97 lukel97 Sep 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mshockwave for reference the codegen before this patch is:

recurrence_vleff:                       # @recurrence_vleff
	.cfi_startproc
# %bb.0:                                # %entry
	vsetvli	a3, zero, e32, m2, ta, ma
	vmv.v.i	v8, 0
	mv	a3, a0
.LBB0_1:                                # %loop
                                        # =>This Inner Loop Header: Depth=1
	vsetvli	zero, a2, e32, m2, ta, ma
	vle32ff.v	v10, (a3)
	csrr	a4, vl
	addi	a1, a1, -1
	vsetvli	a5, zero, e32, m2, ta, ma
	vadd.vv	v8, v8, v10
	vsetvli	zero, a4, e32, m2, ta, ma
	vse32.v	v8, (a0)
	addi	a3, a3, 4
	bnez	a1, .LBB0_1
# %bb.2:                                # %exit
	ret
.Lfunc_end0:
	.size	recurrence_vleff, .Lfunc_end0-recurrence_vleff
	.cfi_endproc
                                        # -- End function
	.section	".note.GNU-stack","",@progbits

So now we're able to propagate %vleff.vl through to %y and %phi

entry:
br label %loop
loop:
%iv = phi iXLen [ 0, %entry ], [ %iv.next, %loop ]
%phi = phi <vscale x 4 x i32> [ zeroinitializer, %entry ], [ %y, %loop ]
%gep = getelementptr i32, ptr %p, iXLen %iv
%vleff = call { <vscale x 4 x i32>, iXLen } @llvm.riscv.vleff(<vscale x 4 x i32> poison, ptr %gep, iXLen %vl)
%vleff.x = extractvalue { <vscale x 4 x i32>, iXLen } %vleff, 0
%vleff.vl = extractvalue { <vscale x 4 x i32>, iXLen } %vleff, 1
%y = add <vscale x 4 x i32> %phi, %vleff.x
call void @llvm.riscv.vse(<vscale x 4 x i32> %y, ptr %p, iXLen %vleff.vl)
%iv.next = add iXLen %iv, 1
%done = icmp eq iXLen %iv.next, %n
br i1 %done, label %exit, label %loop
exit:
ret void
}

define <vscale x 4 x i32> @join(<vscale x 4 x i32> %v, i1 %cond, iXLen %vl) {
; CHECK-LABEL: join:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: andi a0, a0, 1
; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma
; CHECK-NEXT: vadd.vi v8, v8, 1
; CHECK-NEXT: beqz a0, .LBB17_2
; CHECK-NEXT: beqz a0, .LBB18_2
; CHECK-NEXT: # %bb.1: # %foo
; CHECK-NEXT: vsetivli zero, 1, e32, m2, ta, ma
; CHECK-NEXT: vadd.vi v8, v8, 1
; CHECK-NEXT: ret
; CHECK-NEXT: .LBB17_2: # %bar
; CHECK-NEXT: .LBB18_2: # %bar
; CHECK-NEXT: vadd.vi v8, v8, 2
; CHECK-NEXT: ret
entry:
Expand Down