たんぱぁです。
オフトピック引き延ばしでスミマセンが・・・
社内の人が体験した話です。(下の関数は適当な例です)
GCCで最適化を実行したら変な動きをしたので出力されたアセンブラを調べたと
ころ、関数がインライン展開されており、(A)でレジスタに値を格納した後、(B)
ではポインタの先を読まずに(A)で格納した値を評価していたそうです。
そういうわけでポートの変化で抜けたいという意図は汲まれ無かったそうです。
--------
void kansu(volatile unsigned char *p)
{
//PORT1が変化するような処理
while(*p == 0x0A); ←(B)
}
main()
{
unsigned char *p;
p = PORT1; ←アドレス格納
*p = 0x0A; ←(A)値を格納
//何やらの処理
kansu(p);
}
--------
関数の外もvolatile宣言したらその最適化でも動いたそうですが。。。
これは普通の考えで行われた最適化なのでしょうか・・・。
--
たんぱぁ(天池 岳雄) <ml@xxxxxxxxxx>
URL: http://www.ss-lab.com/