lmntal-compiler icon indicating copy to clipboard operation
lmntal-compiler copied to clipboard

コード変換器の分析・slimcode化

Open 8q opened this issue 5 years ago • 5 comments

ルールコンパイラによって中間命令列が構築された後、コード変換器によって中間命令列は再構築される。コード変換器には長年の成果により様々な最適化処理などが記述されており、例えばピープホール最適化や膜再利用最適化が行われている。

コード変換器

  • compile.Compactor
  • compile.Grouping
  • compile.Merger
  • compile.Optimizer

ただその全容は多分誰も把握していない。このままでは、例えばルールコンパイラに新しい中間命令を導入しようにも、その後のコード変換で何が起きているのか分からないので追加できない。ので、どこかに分かりやすい形でまとめる。どんなオプションをつけたとき(つけなくても)に中間命令列にどんなこと変換が施されるのか、そしてそれはどこに記述されているか、など。

また、 #35 に関連して、slimcode化の結果必要のない最適化が出てきていると思うので除去する。 #39 のプルリクの変更内容や、slimの src/vm/task.cppdo nothingになっている中間命令に注目すればいいと思う。

8q avatar Feb 11 '20 02:02 8q

補足ですが、lock中間命令のようにSLIMから廃止された中間命令がある可能性もあるので、対応する際はそれらの削除もお願いします。

ryotosaito avatar Feb 12 '20 06:02 ryotosaito

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を参照)

Tamu7532 avatar Feb 12 '20 11:02 Tamu7532

slim/vm/task.cpp内コメントで/*do nothing*/と書いていた命令列

ENQUEUEATOM 
DEQUEUEATOM
UNLOCKMEM
RECURSIVELOCK
RECURSIVEUNLOCK

Tamu7532 avatar Feb 12 '20 12:02 Tamu7532

リファクタリングで削除できそうな命令列

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/のコメントがついてる

Tamu7532 avatar Feb 13 '20 01:02 Tamu7532

関連 #76

8q avatar Feb 13 '20 01:02 8q