https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107498
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2022-11-01 Status|UNCONFIRMED |WAITING Ever confirmed|0 |1 --- Comment #5 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- Note that the fields are marked volatile in the source: union { struct { volatile indx_t pb_lower; volatile indx_t pb_upper; } pb; uint32_t pb_pages; } mp_pb; But, yes, it looks like something went wrong earlier: mp is a pointer to MDB_page, which is a structure containing a union containing a uint32_t field, which gives it an alignment of 4 bytes, so mp must be a multiple of 4. mp_pb is a union containing a uint32_t field so it is at an offset multiple of 4. So &mp->mp_pb.pb must be a multiple of 4 and, assuming that it is contained in %l0, the instruction: 0x00000100000c8aec <+300>: st %l3, [ %l0 + 0xc ] would therefore be legal. Can anyone print the value of mp in the debugger?