dup

おとといのコメントより、

0:load  x
2:load  y
4:mul
5:dup
6:add
7:store a
9:

で、いいのでは、との意見を。
えーと、すいません…その通りです。
で、あれの続きの話は、まさに、そういう「どーやってdupするのが効率がいいか」っていう話にしようと思ってたんですが、なんか終わりかたが中途半端でしたな…


で、まあ、その話なんだけど、KJCのbytecode/ssa/CodeGeneratorBasicBlock.javaのstackSchedule()あたりで実装されてるので、ソース読んでたら、

     * Use the idea of Philip Koopman to generate dup instructions

というコメントを発見。で、このPhillip Koopmanという人の名前で調べてみたら、
A Preliminary Exploration of Optimized Stack Code Generation
というそのものずばりな論文を発見。なんで今日まで気付かなかったんだ。
Intra-Blockとか呼ぶらしい。一旦適当に生成したあと、コードをたぐっていって、変数がどういうふうに再利用されるかを示すUse/Reuseペアを求めて、んで、ごにょごにょって感じだろうか?あんまりよくわかってません。とりあえず、結構な効果があるっぽい。


あー、でも、JavaにはUNDERとかみたいな命令無いしなー、と思ったんだけど、dup_x1とかってそれじゃないのか?とすると、JVM設計した人は、それなりにバイトコード最適化コンパイラも考慮して設計した、ということだろうか。んん、ここらへん適当な感想だけど。


で、これ、最後に「条件分岐とかをまたぐグローバルなスタックのやりとりはどうなんだろうね」って感じで書いてあるんだけど、その手法ってもうなんとかなったんだろうか。
それができればVC++の生成する387コードと対等な勝負くらいはできると思うんだけど。


んーと、何が言いたいんだ。よくわかりません。話が飛び飛びですな。上のIntra-Block手法は元ソースが無くてもバイトコードさえあれば最適化できるので、Javaバイトコード最適化ツールはこれを利用してるのかもしれないし、そうじゃないかもしれない。Sunのjavacの吐くコードは結構ヘボいので、なんかBCELとか使ってごにょごにょすればなんかできるかもしれないし、できないかもしれない。超適当。
これのインスラクション最適化ってのがそうかも。実物無いので確認しようが無いけど。


あと、ついでにStack Computerというのも見つけたんだけど、読んだほうがいいだろうか。多分読まないけど。いちおう。