]> git.ipfire.org Git - thirdparty/gcc.git/commit
RISC-V: Support vi variant for vec_cmp
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>
Thu, 18 Jan 2024 09:53:24 +0000 (17:53 +0800)
committerLehua Ding <lehua.ding@rivai.ai>
Thu, 18 Jan 2024 11:17:02 +0000 (19:17 +0800)
commit38d8facddfd891e15b287e5f19c5139272900346
tree0180182af23c65f4959833396283cd3d003b18f5
parent95d436369637e5a07e0ccf5cfc6e64947e3b477e
RISC-V: Support vi variant for vec_cmp

While running various benchmarks, I notice we miss vi variant support for integer comparison.
That is, we can vectorize code into vadd.vi but we can't vectorize into vmseq.vi.

Consider this following case:

void
foo (int n, int **__restrict a)
{
  int b;
  int c;
  int d;
  for (b = 0; b < n; b++)
    for (long e = 8; e > 0; e--)
      a[b][e] = a[b][e] == 15;
}

Before this patch:

        vsetivli        zero,4,e32,m1,ta,ma
        vmv.v.i v4,15
        vmv.v.i v3,1
        vmv.v.i v2,0
.L3:
        ld      a5,0(a1)
        addi    a4,a5,4
        addi    a5,a5,20
        vle32.v v1,0(a5)
        vle32.v v0,0(a4)
        vmseq.vv        v0,v0,v4

After this patch:

        ld      a5,0(a1)
        addi    a4,a5,4
        addi    a5,a5,20
        vle32.v v1,0(a5)
        vle32.v v0,0(a4)
        vmseq.vi        v0,v0,15

It's the missing feature caused by our some mistakes, support vi variant for vec_cmp like other patterns (add, sub, ..., etc).

Tested with no regression, ok for trunk ?

gcc/ChangeLog:

* config/riscv/autovec.md: Support vi variant.

gcc/testsuite/ChangeLog:

* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-1.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-2.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-3.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-4.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-5.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-6.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-7.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-8.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/cmp_vi-9.c: New test.
* gcc.target/riscv/rvv/autovec/cmp/macro.h: New test.
gcc/config/riscv/autovec.md
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/cmp_vi-9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/riscv/rvv/autovec/cmp/macro.h [new file with mode: 0644]