[H8-ML(5565)] Re: 最適化条件で動作が変わる場合(Re: 使えるCコンパイラ)
From: Takehiro Amaike <ml@xxxxxxxxxx>
Date: 2005年05月23日(月)15時05分46秒
たんぱぁです。

オフトピック引き延ばしでスミマセンが・・・
社内の人が体験した話です。(下の関数は適当な例です)

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/


スレッド概略
[5549(R)](起点)
 └[5564(U)]
   └[表示中]
     ├[5568(1)]
     ├[5570(2)]
     └[5571(3)]


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


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