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

Reply via email to