[Bug target/108031] New: riscv: Access of members of a global structure is not optimized in atomic operations
sebastian.huber@embedded-brains.de
gcc-bugzilla@gcc.gnu.org
Fri Dec 9 13:01:21 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108031
Bug ID: 108031
Summary: riscv: Access of members of a global structure is not
optimized in atomic operations
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: sebastian.huber@embedded-brains.de
Target Milestone: ---
Consider the following test code:
struct s {
int a;
int b;
};
struct s s;
int f(void)
{
return __atomic_fetch_add(&s.a, 1, 0) + __atomic_fetch_add(&s.b, 1, 0);
}
Using gcc -O2 -S -o - test.c yields:
f:
lui a5,%hi(s)
li a4,1
addi a5,a5,%lo(s)
amoadd.w a0,a4,0(a5)
lui a5,%hi(s+4) <-- this should be: addi a5, a5, 4
addi a5,a5,%lo(s+4) <-- this should be removed
amoadd.w a3,a4,0(a5)
add a0,a0,a3
ret
This seems to be a backend issue since on arm we have for example (gcc
-march=armv7-a -O2 -S -o - test.c):
f:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
movw r3, #:lower16:.LANCHOR0
movt r3, #:upper16:.LANCHOR0
.L2:
ldrex r0, [r3]
add r2, r0, #1
strex r1, r2, [r3]
cmp r1, #0
bne .L2
add r3, r3, #4
.L3:
ldrex r2, [r3]
add r1, r2, #1
strex ip, r1, [r3]
cmp ip, #0
bne .L3
add r0, r0, r2
bx lr
clang produces (clang -O2 -S -o - test.c --target=riscv32):
f:
lui a0, %hi(s)
addi a0, a0, %lo(s)
li a1, 1
amoadd.w a2, a1, (a0)
addi a0, a0, 4
amoadd.w a0, a1, (a0)
add a0, a0, a2
ret
More information about the Gcc-bugs
mailing list