On 11/12/23 20:37, Juzhe-Zhong wrote:
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.
OK
jeff

Reply via email to