Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
9aba342
Precommit tests
lukel97 Jul 30, 2025
ea2b861
[RISCV] Handle recurrences in RISCVVLOptimizer
lukel97 Feb 7, 2025
9f24fe7
Link to talk in header comment
lukel97 Jul 30, 2025
9b61df6
Fix test name
lukel97 Aug 22, 2025
a78cc60
Merge branch 'main' of github.com:llvm/llvm-project into vloptimizer/…
lukel97 Sep 2, 2025
257ed3c
Reword a comment to be more clear
lukel97 Sep 3, 2025
4d80e45
Merge branch 'main' of github.com:llvm/llvm-project into vloptimizer/…
lukel97 Sep 4, 2025
5465920
Merge branch 'main' of github.com:llvm/llvm-project into vloptimizer/…
lukel97 Sep 4, 2025
a31269c
Merge branch 'main' of github.com:llvm/llvm-project into vloptimizer/…
lukel97 Sep 5, 2025
97a12b1
Merge branch 'main' of github.com:llvm/llvm-project into vloptimizer/…
lukel97 Sep 5, 2025
8f75db7
Make vector_uses just a static function
lukel97 Sep 5, 2025
d550870
clang-format
lukel97 Sep 5, 2025
dc0ca0e
Remove debug code
lukel97 Sep 6, 2025
1dd36a4
Merge branch 'main' into vloptimizer/dataflow-analysis
lukel97 Sep 10, 2025
ebce546
Add vleff recurrence test case
lukel97 Sep 11, 2025
cadf393
Move max into DemandedVL
lukel97 Sep 12, 2025
0ef2baf
Move isVirtualVec into virtual_vec_uses method, avoid pointer chasing
lukel97 Sep 12, 2025
1068f3a
Rename Worklist in checkUsers to avoid shadowing
lukel97 Sep 12, 2025
62635d5
Merge branch 'main' into vloptimizer/dataflow-analysis
lukel97 Sep 15, 2025
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