読者です 読者をやめる 読者になる 読者になる

Open64構築メモ

compiler

Open64.net - Under Maintenance


Open64なるコンパイラがあることを知ったので、試しにビルドして
テストしてみたときのメモ。

環境

  • Ubuntu11.10 x64
  • gcc4.6.1
  • Open64 4.2.4


もうすぐ 5.0が出るそうですが、まだ置いてなかったので 4.2.4を
使いました。

ビルド前の修正

普通ではビルドできなかったので修正。
'osprey/ipa/local/Makefile.gbase'を以下のように修正。
'-CG:all_sched'というオプションが g++で認識されなかったので
削除しました。

#----------------------------------------------------------------------
#  Temporary workaround
#----------------------------------------------------------------------
-ipl_summarize_util.o: OPTIMIZER += -CG:all_sched=0
+ipl_summarize_util.o: OPTIMIZER += 

ビルド

fortranコンパイラをビルドしたら, internal errorに遭遇してしまったので,
無効化しました。

  # ランタイムルーチン crti.o等を見つけられなかったので、LIBRARY_PATHの設定
  % export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu 
  # GCC同様, 別途ディレクトリを作って, configure, makeをしてください
  % mkdir build && cd build
  % ../configure --prefix=/home/syohei/local/open64 --disable-fortran
  % make -j2
  % make install

テスト

Testgenの結果は以下の通り

------------------------------------------
Total          :    35188
Passed Compile :    35188 (100.0 %)
Failed Compile :        0 (  0.0 %)
Passed Execute :    35167 ( 99.9 %)
Failed Execute :       21 (  0.1 %)

Test Start     : Mon Oct 31 22:38:57 2011
Test Finish    : Mon Oct 31 23:28:29 2011
------------------------------------------


調べてみると以下のプログラムが '-O2'オプションで
期待する動作をしませんでした。

#include <stdio.h>
long itest;

int main(void)
{
	unsigned Variable;

	itest = 0;
	Variable = -1;
	itest = -Variable;
	printf("itest=%ld, Variable=%d\n", itest, Variable);

	return 0;
}

これの結果が以下のようになりました。

itest=-4294967295, Variable=-1

Variable(+4294967295)は '-'との計算が先に行われて(+1)、long型への変換が
行われるはずですが、これだと long型への変換(+4294967295)が行われて、
その後 '-'との計算(-4294967295)が行われているようです。


5.0ではなおっているんでしょうかね ?
普通使わないけど、わりとあるような気もするコードなので、
このバージョンはまだ使わない方がいいのかなと思いました。

追記(2011/NOV/11)

5.0がリリースされていたので試してみましたが、同じところでこけました。