lmntal-compiler
lmntal-compiler copied to clipboard
コード変換器の分析・slimcode化
ルールコンパイラによって中間命令列が構築された後、コード変換器によって中間命令列は再構築される。コード変換器には長年の成果により様々な最適化処理などが記述されており、例えばピープホール最適化や膜再利用最適化が行われている。
コード変換器
-
compile.Compactor
-
compile.Grouping
-
compile.Merger
-
compile.Optimizer
ただその全容は多分誰も把握していない。このままでは、例えばルールコンパイラに新しい中間命令を導入しようにも、その後のコード変換で何が起きているのか分からないので追加できない。ので、どこかに分かりやすい形でまとめる。どんなオプションをつけたとき(つけなくても)に中間命令列にどんなこと変換が施されるのか、そしてそれはどこに記述されているか、など。
また、 #35 に関連して、slimcode化の結果必要のない最適化が出てきていると思うので除去する。 #39 のプルリクの変更内容や、slimの src/vm/task.cppでdo nothing
になっている中間命令に注目すればいいと思う。
補足ですが、lock
中間命令のようにSLIMから廃止された中間命令がある可能性もあるので、対応する際はそれらの削除もお願いします。
optimizerメモです
-O1を設定すると ・アトムの再利用: Reuseatom ・膜の再利用: ReuseMem ・ガード命令を可能な限り前へ移動させる: Guardmove -O2にすると O1の3つに加えて (現在のバージョンではどちらも使われていない) ×同一ルールの複数回同時適用: makeloop ×命令列のグループ化: Grouping -O3にすると O1, O2に加えて ・head, guard, bodyを全部くっつける: inlineExpandTailJump がそれぞれ実行
その他クラス内でオプション判別用のboolean型変数を定義していて、それぞれ forceReuseAtom →trueの場合"オプションにかかわらずアトム再利用最適化を有効にする"とあるがforceReuseAtomにtrueを入れるのはFrontEnd.java内1か所しかなく, このとき同時にReuseAtomもtrueになるため不必要な気がする(かつてのデバッグ用?)
fMerging →trueの場合"命令列の編み上げを行う"→Merger.java 現在は"--optimize-merging"をつけると動く(はず)
fSystemRulesetsInlining →trueの場合"システムルールセットをボディ命令列中に展開する" 現在は"--optimize-systemrulesetsinlining"をつけると動く(はず)
(その他の最適化も個別に設定可能, FrontEnd.javaを参照)
slim/vm/task.cpp内コメントで/*do nothing*/
と書いていた命令列
ENQUEUEATOM
DEQUEUEATOM
UNLOCKMEM
RECURSIVELOCK
RECURSIVEUNLOCK
リファクタリングで削除できそうな命令列
DEREFLINK, GETMEM, GETPARENT, NEWATOMINDIRECT, ALTERFUNC, ALTERFUNCINDIERCT, CHENGEVARS,INLINE, BUILTIN, GUARD_INLINE, NOT_UNIQ, ISUNARYFUNC, ISSTRINGFUNC, GETCLASSFUNC, GETRUNTIME, CONNECTRUNTIME, NEWSET, ADDATOMTOSET, SYSTEMRULESETS, ANYMEM2, ISBUDDY, CYCLELINKS, ISAL, ISAR, ISHR,INEGFUNC, INOTFUNC, IANDFUNC, IORFUNC, IXORFUNC, ISALFUNC, ISARFUNC, ISHRFUNC, FADDFUNC, FSUBFUNC, FMUFUNC, FDIVFUNC, FNEGFUNC, FLTFUNC, FLEFUNC, FGTFUNC, FGEFUNC, FLOAT2INT, INT2FROAT, FLOAT2INTFUNC, INT2FLOATFUNC, 現在のslimでは読み込めない…?
ENQUEUEATOM, DEQUEUEATOM, UNLOCKMEM, RECURSIVELOCK, RECURSIVEUNLOCK: task.cppに関数はあるがSKIPしかしてなくて/do nothing/のコメントがついてる
関連 #76