Open2
gccの `-fstrict-volatile-bitfields` の挙動がおかしい?
ちょっと分離。深追いしないので。。
-fstrict-volatile-bitfields
が volatile
な配列について効いたり効かなかったりする。
わかっていること
とりあえず最小ケースは作れたと思う: https://godbolt.org/z/6E6GofE4Y
- ループ内で2度以上参照が発生する必要がある
- アーキテクチャを問わず発生する
- gcc 4.9 未満では発生しない:
対策としては、アクセスを関数にくくり出す https://godbolt.org/z/7GfGoqvrb と正常になることがわかった。
static inline uint32_t
getb(int idx){
volatile pad* p = set->io;
return p[idx].b;
}
volatile
なポインタのdereferenceして得たオブジェクトのポインタは volatile
だと思うんだけど。。