https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116691

            Bug ID: 116691
           Summary: RISC-V: Unexpected auto-vectorization codegen in
                    simple vectorization
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: juzhe.zhong at rivai dot ai
  Target Milestone: ---

void foo (int *__restrict a, int *__restrict b, int *__restrict c, int n) {
    for (int i = 0; i < n; i++) {
      c[i] = a[i] + b[i];
    }
}

https://godbolt.org/z/4n3o3qcKW

GCC trunk:

foo:
        ble     a3,zero,.L5
        csrr    a4,vlenb
        srli    a6,a4,2
.L3:
        minu    a5,a3,a6
        vsetvli zero,a5,e32,m1,ta,ma
        vle32.v v2,0(a0)
        vle32.v v1,0(a1)
        mv      a7,a3
        add     a0,a0,a4
        add     a1,a1,a4
        sub     a3,a3,a6
        vadd.vv v1,v1,v2
        vse32.v v1,0(a2)
        add     a2,a2,a4
        bgtu    a7,a6,.L3
.L5:
        ret


GCC 14.2.0:

foo:
        ble     a3,zero,.L5
.L3:
        vsetvli a5,a3,e32,m1,ta,ma
        vle32.v v2,0(a0)
        vle32.v v1,0(a1)
        sub     a3,a3,a5
        sh2add  a0,a5,a0
        sh2add  a1,a5,a1
        vadd.vv v1,v1,v2
        vse32.v v1,0(a2)
        sh2add  a2,a5,a2
        bne     a3,zero,.L3
.L5:
        ret

Reply via email to