https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118916

Tomas Chang <changyp6 at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|RESOLVED                    |UNCONFIRMED
         Resolution|INVALID                     |---

--- Comment #5 from Tomas Chang <changyp6 at gmail dot com> ---
(In reply to Andrew Pinski from comment #3)
>         str     w1, [x2]
>         str     wzr, [x2], -4
> .L6:
>         ldr     w1, [x2]
> 
> is correct as the gimple code is:
> 
>   MEM[(volatile unsigned int *)1099193386136B] ={v} 1;
>   MEM[(volatile unsigned int *)1099193386136B] ={v} 0;
> 
>   <bb 3> [local count: 1073741824]:
>   _3 ={v} MEM[(volatile unsigned int *)1099193386132B];
> 
> That is the load is loading from `the original address - 4`.
> 
> If this memory mapped register does NOT support all stores, then you need to
> use inline-asm and NOT volatile.
> 
> volatile just talks about the store/loads happening in assembly in the same
> order as written and in the GCC 14.2 case with -O3 they are. But you have
> also a write back or post increment instruction which sets x2 to the next
> address. There is no volatile violation here since the stores/load happen in
> the same. just the memory location does not support all instructions.

Hi Andrew,
Many thanks to your explanation.
I understand this case now.

I also found that the Linux kernel has implemented such code in ASM to make
sure it works in hypervisor mode.

I'll change my code accordingly.

Reply via email to