WebAssembly は概要にスタックマシンと書かれていて実際にそうなのだけれど、 VM で直接実行することは想定されていない仕様にみえる。中でも分岐命令でブロック終端にジャンプするとき、ブロック始端と同じスタックの深さになるようにスタックをリサイズした上で値をプッシュする、という仕様にはちょっと驚く。スタックに対する制約が強い関係で、よく考えるとこれは必要な仕様なのだけれど。全体的に AOT コンパイルでスタックを追跡しながらローカル変数を割り当てていくときには自然で、 VM で直接実行するには不自然な仕様が多い。
なら SSA の方がいいのではと思ってしまうけれど、 1:1 で機械語に変換するような Baseline AOT コンパイルではスタックマシンの方が速度が出るようだ。スタックのトップの方を優先して単純にレジスタ割り付けするのかな。