>*.s を見ただけで何も分りませんでした。 diff をみてもよくわからないと思いますが、-O2 でかつ short * の時、 メモリーの読み出しと書き込みの順序を(間違って)いれかえちゃうんですよ。 コメントになっていた asm volatile ... を有効にすると、この入れ換えを やめさせることができます。