At Mon, 23 May 2005 15:05:46 +0900,
Takehiro Amaike wrote:
>
> たんぱぁです。
>
> オフトピック引き延ばしでスミマセンが・・・
> 社内の人が体験した話です。(下の関数は適当な例です)
>
> 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宣言したらその最適化でも動いたそうですが。。。
> これは普通の考えで行われた最適化なのでしょうか・・・。
>
インライン展開されたのであれば、kansuのp = mainのpであるいうことも
コンパイラは理解しているので、そういう最適化はありでしょう。
やりすぎという気もしないではないですが、volatileが付いていないので、
そういう物ですということになると思います。
個人的にはgcc-3.3以降はそれなりに信用できると思っていますが…