This patch optimization of combine 2 duplicate vectors when their elements are
not equal.
typedef char v16qi __attribute__ ((vector_size (16)));
void
foo (char a, char b, char *out)
{
v16qi v = {a, a, a, a, a, b, b, b, b, b, b, b, b, b, b, b};
*(v16qi *) out = v;
}
Before this patch:
vsetivli zero,16,e8,m1,ta,ma
vmv.v.x v1,a0
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vslide1down.vx v1,v1,a1
vse8.v v1,0(a2)
ret
After this patch:
vsetivli zero,16,e8,m1,ta,ma
vmv.v.x v1,a0
vid.v v0
vmsgtu.vi v0,v0,4
vmerge.vxm v1,v1,a1,v0
vse8.v v1,0(a2)
ret
gcc/ChangeLog:
* config/riscv/riscv-v.cc
(rvv_builder::combine_sequence_use_merge_profitable_p): New function.
(expand_vector_init_merge_combine_sequence): Ditto.
(expand_vec_init): Add optimization.
gcc/testsuite/ChangeLog:
* gcc.target/riscv/rvv/autovec/vls-vlmax/combine-merge-1.c: New test.
* gcc.target/riscv/rvv/autovec/vls-vlmax/combine-merge-2.c: New test.
* gcc.target/riscv/rvv/autovec/vls-vlmax/combine-merge_run-1.c: New
test.
* gcc.target/riscv/rvv/autovec/vls-vlmax/combine-merge_run-2.c: New
test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-1.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-10.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-11.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-12.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-13.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-14.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-2.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-3.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-4.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-5.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-6.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-7.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-8.c: New test.
* gcc.target/riscv/rvv/autovec/vls/combine-merge-9.c: New test.