https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119280
Bug ID: 119280
Summary: Unexpected inline asm rdcycle code misplaced cause
wrong cycle calculation
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: fanghuaqi at vip dot qq.com
Target Milestone: ---
Hello,
here is a case for riscv gcc -march=rv32imafc -mabi=ilp32f -O3
see https://godbolt.org/z/T9zGhhqGT
// test.c
#include <stdint.h>
#include <stdio.h>
void test(int32_t *a) {
unsigned long begin_cycle, end_cycle;
int32_t res;
__asm volatile("rdcycle %0" : "=r"(begin_cycle) : : "memory");
res = a[0] * a[0];
__asm volatile("rdcycle %0" : "=r"(end_cycle) : : "memory");
printf("acc: %d, cost %lu\n", res, end_cycle-begin_cycle);
}
gcc output
.LC0:
.string "acc: %d, cost %lu\n"
test:
rdcycle a5
lw a1,0(a0)
rdcycle a2
mul a1,a1,a1
lui a0,%hi(.LC0)
sub a2,a2,a5
addi a0,a0,%lo(.LC0)
tail printf
llvm output
test:
rdcycle a2
lw a0, 0(a0)
rdcycle a3
mul a1, a0, a0
sub a2, a3, a2
lui a0, %hi(.L.str)
addi a0, a0, %lo(.L.str)
tail printf
.L.str:
.asciz "acc: %d, cost %lu\n"
.Ldebug_list_header_start0:
.half 5
.byte 4
.byte 0
.word 4
.Ldebug_list_header_end0:
As above, you can see mul is done after cycle read, but I am expecting to
calculate the cycle cost of mul, but it didn't.
Is this expected, if expected, how can I achieve a correct cycle calculation of
a piece of code.
Thanks in advance