Issue 130033
Summary [RISCV][MachineScheduler] RISCV backend mis-schedules rdcycle instruction leading to incorrect cycle count
Labels new issue
Assignees
Reporter jupiter-zzp
    https://godbolt.org/z/GfPenPv3f
I've found an issue with the RISCV backend in LLVM's instruction scheduling. The rdcycle instruction is being scheduled incorrectly, which results in an incorrect cycle count calculation.

A small case is:
```
#include <stdio.h>

int test(int a[]) {
  unsigned long begin_cycle, end_cycle;
  __asm volatile("rdcycle %0"
                    : "=r"(begin_cycle) \
                    : \
                    : "memory");
  
  int res = 0;
  for (int i = 0; i < 4; i++) {
    res += a[i];
  }

  __asm volatile("rdcycle %0"
                    : "=r"(end_cycle) \
                    : \
                    : "memory");

  printf("cycle = %ld\n", end_cycle - begin_cycle);
  return res;
}
```
Compiled with `-O3`:
```
test:
        addi    sp, sp, -16
        sd      ra, 8(sp)
 sd      s0, 0(sp)
        rdcycle a1
        lw      a2, 0(a0)
 lw      a3, 4(a0)
        lw      a4, 8(a0)
        lw      a0, 12(a0)
 rdcycle a5
        add     a2, a2, a3
        add     a0, a0, a4
 addw    s0, a0, a2
        sub     a1, a5, a1
.Lpcrel_hi0:
 auipc   a0, %pcrel_hi(.L.str)
        addi    a0, a0, %pcrel_lo(.Lpcrel_hi0)
        call    printf
        mv      a0, s0
 ld      ra, 8(sp)
        ld      s0, 0(sp)
        addi    sp, sp, 16
 ret
```
The second `rdcycle` instruction is scheduled and cycle count of the for loop is wrong.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to