[H8-ML(5571)] Re: 最適化条件で動作が変わる場合(Re: 使えるCコンパイラ)
From: Yoshinori Sato <qzb04471@xxxxxxxxxxx>
Date: 2005年05月23日(月)23時57分19秒
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以降はそれなりに信用できると思っていますが…
スレッド概略
[5549(R)](起点)
 └[5565(U)]
   └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]