https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104657
--- Comment #4 from Christoph Müllner <christophm30 at gmail dot com> ---
Thanks for mentioning the volatile pointer method.
However, the pragma-solution results in better code (fewer instructions and
does not require a valid stack pointer).
I've used the code below to see what happens on AArch64 and RISC-V 64-bit:
#define MEM_ADDR 0xffff8000
void foo_warning(unsigned long v)
{
volatile unsigned long * p;
p = (void*)MEM_ADDR;
*p = v;
}
void foo_warningfree(unsigned long v)
{
volatile unsigned long * p;
p = (void*)MEM_ADDR;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Warray-bounds"
*p = v;
#pragma GCC diagnostic pop
}
void foo_volatile(unsigned long v)
{
volatile unsigned long * volatile p;
p = (void*)MEM_ADDR;
*p = v;
}
AArch64:
foo_warning:
mov x1, 4294934528
str x0, [x1]
ret
foo_warningfree:
mov x1, 4294934528
str x0, [x1]
ret
foo_volatile:
sub sp, sp, #16
mov x1, 4294934528
str x1, [sp, 8]
ldr x1, [sp, 8]
str x0, [x1]
add sp, sp, 16
ret
RISC-V 64-bit:
foo_warning:
li a5,536866816
slli a5,a5,3
sd a0,0(a5)
ret
foo_warningfree:
li a5,536866816
slli a5,a5,3
sd a0,0(a5)
ret
foo_volatile:
li a5,536866816
addi sp,sp,-16
slli a5,a5,3
sd a5,8(sp)
ld a5,8(sp)
sd a0,0(a5)
addi sp,sp,16
jr ra