元派遣プログラマの自称技術系ブログです。雑記とか自作のオープンソースプロジェクトの話とか。
Javaとか組込とかできます。お仕事ください。

コンパイラが最適化に失敗した?

このコードを-O3オプションでAlchemy使ってコンパイルしたら、#0と#2の値が違った。

#include <math.h>
#include <stdio.h>

struct ST
{
  double m00;
  double m01;
  double m02;
  double m03;
};

void k(int t,struct ST s)
{
  double c;
  double d;

  if(t==0){
    int i=0;
    c=s.m02;
    d=s.m03;
    printf("%f,%f\n",c,d);
    printf("#1>%f\n",atan2(c,d));
  }else{
    int i=0;
    c=s.m00;
    d=s.m01;
    printf("%f,%f\n",c,d);
    printf("#2>%f\n",atan2(c,d));
  }

}
int main(int argc,char* argv[])
{
  printf("#0>%f\n",atan2(0.049268,-0.968404));
  ST s;
  s.m00=0.049268;
  s.m01=-0.968404;
  k(1,s);
  return 1;
}
$ sample/debug.exe
/cygdrive/d/application.files/flex_sdk_3.3.0.4852/bin/adl.exe c:\\cygwin/tmp/t3a
7b4.0/app.xml 2> /tmp/adl.trace & echo $!
#0>3.090761
0.049268,-0.968404
#2>-1.519965

atan2がテンプレートだからか?

追記

どうも、Alchemyに入ってるライブラリavm2-libc.l.bcのatanの実装がおかしいらしい。atan(y,x)のはずが、atan(x,y)になっている?

avm2-libc.l.bcにパッチ当てて修正する方法までは判ったんだけど、公開していいかどうかAdobeに問い合わせ中・・・。

公開OKがでたら、修正方法とかを書きます。