RJJ行数

43966行

Sentinel PRE の手法を基本ブロック内のスケジューリングにも適用してみた。というか、実装は大学時代に始めていたのだが今回とりあえず動くところまで持っていった。Javaでは最適化により実行時に発生する例外が変化してはならないのだが、私の手法により(…

43108行

これまでは定数をレジスタに設定する const 命令は全て、諸々の都合でメソッドの入口まで引き上げていた。つまり、メソッドの入口でレジスタに定数がセットされた後はその定数の使用箇所まで延々とレジスタを占拠し続けるわけだ。これは当然レジスタ割り当て…

42906行

SPARCのディレイスロットを埋めるコードを書いた。今まで埋めてなかったのかよ、という感じだが。最終的なコードを生成する直前のステージで実行する。ディレイスロットを埋めるのによく用いられる関数呼び出しの引数を設定する命令などは、レジスタ割り付け…

42509行

中間言語を再設計した。プログラミングがしやすくなったというだけで、性能には影響無いはず。 ヌルチェックを基本ブロック内で下方へ移動し、可能な限りload/storeに付随するSIGSEGVで代用するようにした。

41873行

絶賛リファクタリング中。これまではcall命令とφ関数とそれ以外の命令とで中間言語のフォーマットが違っていたのだが、それを統一するのが主旨。解析時間は多少遅くなってもJITコンパイラのソースの読みやすさを優先しようかと。

41460行

ヌルチェックをSIGSEGVで代用するためのコードを書き始めたのだが、中間言語の設計が腐ってきたのでなんとなくリファクタリングを開始。どうなることやら。

41063行

JITコンパイラが吐くコード中にアセンブラで書いたコード断片を挿入することができる仕組みの実装が終わった。当初の設計どおりで正しく動作している。任意の箇所に性能カウンタをサンプリングするコードを挿入できるのは便利だ。この後拡張するとすれば、gc…

40429行

JITコンパイラが吐くコード中の任意の箇所に(制限はあるものの)任意のアセンブラコードを挿入することができる仕組みの実装を始めた。CPUの性能カウンタをサンプリングするコードを任意の箇所に挿入したい、というのが元々の動機。しかし、monitorenterやm…

39908行

解析時間の統計を取るコードを追加したり、最適化をon/offするオプションを追加したり、同じ基本ブロックのφ関数間でデータ依存がある場合にde_ssaが正しく動作するようにしたり、バグを直したり、色々。

39546行

jessやjackでどこがボトルネックになっているのかを調べるために、xprofilerをサポートした。SunのHotspotより10倍近く遅いのは、なんとしても原因を突き止めなければならない。xprofilerはKaffeが提供している異言語間プロファイラである。基本的にはgprof…

39456行

リストスケジューリングをおおむね書き終わった。ただし、吐いたコードを見るとまだチューニングが必要と感じる。グルーピング部分が複雑怪奇な論理になってしまった。リストスケジューリングというのは所詮ヒューリスティックスの塊なので、正直ここまで正…

39281行

アーキテクチャ依存のグルーピングルールに基づいて命令を並べ替えていくlist_sched_arch_dep_reorder_insns()をおおむね書き終わりつつあるが、こんなに手間取るとは思わなかった。

38500行

依存グラフを構築するconstruct_dependence_graph()と各命令に優先度を設定するset_priorities()を書き終わった。 依存関係にある命令間のレイテンシを返す、アーキテクチャ依存のlist_sched_get_latency()を書いた。 例外依存とメモリ依存まわりを書き直し…

38132行

依存グラフを作成するconstruct_dependence_graph()をおおむね書き終わったが、肝心の命令間のレイテンシを設定するアーキテクチャ依存部分を書いていない。とりあえずはUltraSPARC IIIを対象とするが、実行時に判定してUltraSPARC IIにも対応させたいものだ…

37726行

リストスケジューリングの第一歩、基本ブロック内の命令間依存グラフを構築するルーチンを書き始めた。全ての依存関係を網羅できているかは微妙。依存グラフというのは多少間違っていたとしてもほとんどの場合で正しく動いてしまうから厄介だ。

37416行

ある関数呼び出しがいかなるJavaオブジェクトの内容も変更しないことを示すフラグRJIL_FLAG_NONDESTRUCTIVEを導入した。いまのところRJIL_SYSCALL_InitializeClassとRJIL_SYSCALL_Newを除くsyscallにセットされている。 RJIL_FMT_EXCPはチェック命令にのみセ…

37367行

論文書きやら海外発表やらでしばらく放っておいたが、ようやく再開。リストスケジューリングを実装し始めたが、問題は多い。 スタックを介したデータ依存関係をどうやって表現するか 関数の引数をセットする命令と呼び出し自身とのデータ依存関係をどうやっ…

37221行

rjj_time.hを導入した。-vmstats ana-timeを指定すると解析時間データが出力されるようにした。pvnre, pre, gvnでtopinfo->wall_clockを用いてた部分を削除した。 preのinsert_insns()で、除去可能な冗長性があるか否かのチェックを先に行うようにした。除去…

37194行

long型のmovをサポートしていなかったというマヌケなバグを修正した。 de_ssaで同じ基本ブロック中のφ関数の間でデータ依存関係がある場合のチェックを導入した。これがないとspec.benchmarks._228_jack.RSequence#GenerateNfaが正しく動作しない。やはり逆S…

37099行

invokeinterface, store_check, checkcast, instanceof, lcmp, athrow, multianewarray をサポートした。いずれも高速化しようと思えばできるのだが、とりあえずは全部外部関数呼び出しに変換してしまう。 RJIL_SYSCALL_CheckCast*Excを廃止してRJIL_SYSCALL…

37086行

fconvf, fconvdのlong型とfconvlをサポートした。これでプリミティブ型同士の変換は全部サポートしたか。

36991行

論文書きをひとまず置いておいて久しぶりにプログラミング。 rjil.hのアーキテクチャ依存部分であるarch_dep_rjil.hを導入した。 論理レジスタ番号の1番と2番をそれぞれスタックポインタRJIL_REG_STACK_POINTERとフレームポインタRJIL_REG_FRAME_POINTERに特…

36762行

long型のshl, shr, ushrをサポートした。すべて外部関数呼び出し。いずれは直接サポートする予定。

36653行

論文書きと発表練習の合間を縫ってプログラミング。 long型のand, or, xor, sub, store をサポートした。 linear_scan_get_long_reg() と linear_scan_is_compatible() でlong型のペアが割り当て対象のレジスタか否かのチェックをしていなかったバグを修正し…

36464行

long型とint型のmul, div, remを全てサポートした。ついでにfremも。ただし、int型のmul以外は全部外部関数呼び出しに置換するだけ。int型のdivくらいはネイティブ命令でサポートしてもいいかも。%yレジスタやwr命令などのアーキテクチャ依存部分を切り分け…

36446行

mulとdivの引数が定数の場合のピープホール最適化を実装した。arch_mapでやっていたのをlocal_const_propへ移動した。divに関しては多少は冗長性除去される可能性が増すか。 long型のmulについてsoft_lmulを呼ぶ部分を実装した。まだデバッグしてない。

36212行

初期値。