8.4 Peephole optimization

あなたがスーパー命令(superinstructions)を使用する場合にのみ、 のぞき穴最適化(peephole optimization)が必要です。 ただし、 スーパー命令を使用しない場合に、 のぞき穴最適化のコードを持っていても、 それほど差し障りはありません。

スーパー命令(superinstruction)の選択には、 単純な貪欲な覗き穴最適化(simple greedy peephole optimization)アルゴリズムが使用されます: gen_inst が VM 命令をコンパイルするたびに、 それを直前の VM 命令と結合(combine)できるかどうかがチェックされます(これは、以前ののぞき穴最適化から生じたスーパー命令である可能性もあります)。 結合できる場合、 現在の ‘*ctp’ に i を配置する代わりに、 最後の命令を結合された命令に変更します。

のぞき穴最適化のコードは vmgen-ex/peephole.c にあります。 このファイルはほぼそのまま使用できます。 Vmgen は、 除き穴最適化のデータを含む file-peephole.i を生成します。

あなたは、 ‘vm_prim’ を初期化した後、 VM コードをコンパイルして覗き穴最適化のためのデータ構造を初期化する前に、 ‘init_peeptable()’ を呼び出す必要があります。 その後、 VM コード生成関数を使用してコンパイルすると、 VM 命令がスーパー命令(superinstructions)に自動的に結合されます。 あなたが VM 分岐ターゲット間で命令を結合したくない時(そうしないと、 分岐先の適切な VM 命令が存在しなくなります)、 分岐ターゲットで BB_BOUNDARY (see VM code generation) を呼び出す必要があります。