3
関数から構造体を返すときのGCCバグの可能性
O'NeillのPCG PRNGの実装中にGCCのバグを見つけたと思います。(Godboltのコンパイラエクスプローラの初期コード) 、(rdiに格納された結果)を乗算oldstateした後MULTIPLIER、GCCはその結果をINCREMENTに追加せず、INCREMENT代わりにrdxに移動し、rand32_ret.state の戻り値として使用されます。 最小限の再現可能な例(コンパイラエクスプローラ): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成されたアセンブリ(GCC 9.2、x86_64、-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in imm32) xor …
133
c
gcc
assembly
x86-64
compiler-bug