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

            Bug ID: 117974
           Summary: RISC-V: VSETVL hoisting across branch
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vineetg at gcc dot gnu.org
                CC: jeffreyalaw at gmail dot com, juzhe.zhong at rivai dot ai,
                    rdapp at gcc dot gnu.org
  Target Milestone: ---

This came out of some tinkering with "C" testcase in
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117733

float g(float q[], int N){
    float dqnorm = 0.0;

    #pragma GCC unroll 4

    for (int i=0; i < N; i++) {
        dqnorm = dqnorm + q[i] * q[i];
    }
    return dqnorm;
}

-march=rv64gcv_zvl256b -Ofast -mrvv-vector-bits=zvl

g:
  ble a1,zero,.L4                 
  vsetivli zero,4,e32,m1,ta,ma
  vmv.v.i v1,0

.L3:
  vsetvli a5,a1,e32,m1,tu,ma
  vle32.v v2,0(a0)
  sub a1,a1,a5
  slli a4,a5,2
  add a0,a0,a4
  vfmacc.vv v1,v2,v2
  vsetvli a5,a1,e32,m1,tu,ma        <---
  slli a4,a5,2
  beq a1,zero,.L12
  vle32.v v2,0(a0)
...
...

The VSETVL for VLE32 is hoisted before the BEQ. It would have been better to
keep this closer to VLE, after the branch for zero, to potentially avoid
setting VL=0 which might be expensive on some uarches.

Reply via email to