From: | Konstantin Knizhnik <knizhnik(at)garret(dot)ru> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
Subject: | Re: Non-reproducible AIO failure |
Date: | 2025-06-07 13:27:45 |
Message-ID: | 189d4f1d-29da-41d7-b7ee-64613b1a94af@garret.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 06/06/2025 10:21 pm, Tom Lane wrote:
> Konstantin Knizhnik <knizhnik(at)garret(dot)ru> writes:
>> There is really essential difference in code generated by clang 15
>> (working) and 16 (not working).
> It's a mistake to think that this is a compiler bug. The C standard
> explicitly allows compilers to use word-wide operations to access
> bit-field struct members.
Sorry, I have not said that I have found compiler bug.
The generated code (clang 16) overwrites all three bitfields but looks
like is doing it in correct way (old values of state and target are
preserved).
My first thought was that compiler moves forward assignment of state
from `pgaio_io_update_state`. But it is not true: it just reads and
writes old value of `state` field.
It is also possible to expect that `pgaio_io_update_state` somehow
"resurrects" old value of `op` field.
But it is also not true:
```
postgres`pgaio_io_update_state:
...
postgres[0x100699070] <+372>: dmb ish ; memory write barrier
postgres[0x100699074] <+376>: ldur w10, [x29, #-0xc] ; w10 = state
postgres[0x100699078] <+380>: ldur x9, [x29, #-0x8] ; x9 = ioh
postgres[0x10069907c] <+384>: ldrh w8, [x9] ; w8 = ioh->state,
ioh->target
postgres[0x100699080] <+388>: ldrb w11, [x9, #0x2] ; w11 = ioh->op
postgres[0x100699084] <+392>: orr w8, w8, w11, lsl #16 ; w8 =
ioh->state, ioh->target, ioh->op
postgres[0x100699088] <+396>: and w10, w10, #0xff ; w10 &= 0xff
postgres[0x10069908c] <+400>: and w8, w8, #0xffffff00 ; w8 &= ~0xff
postgres[0x100699090] <+404>: orr w10, w8, w10 ; w10 =
state, ioh->target, ioh->op
postgres[0x100699094] <+408>: lsr w8, w10, #16 ; w8 = ioh->op
postgres[0x100699098] <+412>: strh w10, [x9]
postgres[0x10069909c] <+416>: strb w8, [x9, #0x2]
postgres[0x1006990a0] <+420>: ldp x29, x30, [sp, #0x60]
postgres[0x1006990a4] <+424>: add sp, sp, #0x70
postgres[0x1006990a8] <+428>: ret
```
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Treat | 2025-06-07 13:35:33 | Re: [PATCH] Re: Proposal to Enable/Disable Index using ALTER INDEX |
Previous Message | Junwang Zhao | 2025-06-07 12:56:27 | Re: Batch TIDs lookup in ambulkdelete |