#3→#2の処理について主に何を最適化するかだけど、まずはジャンプ命令を改善する。高級言語で雑にコードを生成すると、別のジャンプ命令へジャンプする、みたいなことがよく起きる。それはもちろん実行時間の無駄なので、最終的にどこに行くかを追いかけて、そこへ直接行かせるようにする。一度も実行されないコードも除去する。・・・次にメモリに「テンポラリ属性」を付ける。テンポラリ属性メモリは、他の関数によって書き換えられたり、ポインタアクセスによって変更されたり参照されたりはしないようなメモリのことである。これはC言語で言うところの「register属性」とほぼ同義だ。今のC言語の多くはどの変数が一時変数なのかを自動で判断しているが(そしてたまに誤判定もするけど)、とりあえず#3→#2の変換をする際には自動判定はしない。明示的に属性を付ける。そうすれば最適化は難しくない。
// Txxは、Mxxにテンポラリ属性を付けたもの.
MOV R20.EAX,T20 [R20.EBP+20]
... (この間、ラベル宣言文はないとする)
MOV R20.EAX,T20 [R20.EBP+20] // もしここまでの流れでEAXを変更していなければ、このMOV命令は除去できる
MOV T20.[R20.EBP+20],R20.EDX
... (この間、ラベル宣言文はないとする)
MOV T20.[R20.EBP+20],R20.ECX // ここまでの流れで誰も[R20.EBP+20]にアクセスしていないのなら、上のMOV命令は不要なので除去できる
// またこの先においても、もしT20.[R20.EBP+20]へのリードアクセスがあれば、それはR20.ECXで代用できる、もしECXを変更していなければ。