https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111112
Bug ID: 111112
Summary: RISC-V: Resulting more vsetvl instructions of vwadd +
vadd but not vwadd + vwadd
Product: gcc
Version: 14.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: lehua.ding at rivai dot ai
Target Milestone: ---
For GCC, first res = b[i] + c[i], than res += promoted_d
For Clang, first res = promoted_d + b[i], than res += c[i]
Resulting more vsetvl instructions when using GCC's method
since vwadd and vadd need different type.
https://godbolt.org/z/9vexWjccn
C Code:
void __attribute__ ((noipa))
f (SIGNEDNESS char *restrict a, SIGNEDNESS char *restrict b,
SIGNEDNESS char *restrict c, SIGNEDNESS char d)
{
int promoted_d = d;
for (int i = 0; i < 8; ++i)
/* Deliberate use of signed >>. */
a[i] = ( promoted_d + b[i] + c[i]) >> 2;
}
RISC-V GCC:
f:
vsetivli zero,8,e16,m1,ta,ma
vle8.v v4,0(a1)
vle8.v v3,0(a2)
vmv.v.x v2,a3
vsetvli zero,zero,e8,mf2,ta,ma
vwadd.vv v1,v4,v3
vsetvli zero,zero,e16,m1,ta,ma
vadd.vv v1,v1,v2
vsetvli zero,zero,e8,mf2,ta,ma
vnsra.wi v1,v1,2
vse8.v v1,0(a0)
ret
RISC-V Clang:
f: # @f
vsetivli zero, 8, e8, mf2, ta, ma
vle8.v v8, (a1)
vle8.v v9, (a2)
vwadd.vx v10, v8, a3
vwadd.wv v10, v10, v9
vnsrl.wi v8, v10, 2
vse8.v v8, (a0)
ret