Issue 151459
Summary Convert branch to bnez with EVL tail folding
Labels backend:RISC-V, vectorizers
Assignees lukel97
Reporter lukel97
    With EVL tail folding today the branch condition is `bne iv, trip-count`, e.g. this loop generates

```c
void f(int *x, int n) {
  for (int i = 0; i < n; i++)
    x[i]++;
}
```

```asm
# %bb.1: # %for.body.preheader
	li	a2, 0
.LBB0_2: # %vector.body
                                        # =>This Inner Loop Header: Depth=1
	sub	a3, a1, a2
	sh2add	a4, a2, a0
	vsetvli	a3, a3, e32, m2, ta, ma
	vle32.v	v8, (a4)
	vadd.vi	v8, v8, 1
	add	a2, a2, a3
	vse32.v	v8, (a4)
	bne	a2, a1, .LBB0_2
```

Given that the trip count is countable we should be able to instead emit something like 

```asm
# %bb.1:                                # %for.body.preheader
	li	a2, 0
	mv	a3, a1
.LBB0_2: # %vector.body
                                        # =>This Inner Loop Header: Depth=1
	vsetvli	a4, a3, e32, m2, ta, ma
	sh2add	a5, a2, a0
	vle32.v	v8, (a5)
	add	a2, a2, a4
	vadd.vi	v8, v8, 1
	vse32.v	v8, (a5)
	sub	a3, a3, a4
	bnez	a3, .LBB0_2
```

To do this we need to use a separate phi to carry the AVL, and not compute it from the EVL based IV. This is closer to the stripmining examples given in the RVV spec, and is what GCC currently does.

This removes a use of the trip count in the branch and also shortens the dependency chain for the AVL.

I have two patches to submit for this soon, one to add the separate phi to carry the AVL, and another to change the branch.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to