問題:8000バイトを超えるJavaバイトコードにコンパイルするメソッドがあります。HotSpotには、8000バイトを超えるメソッドに対してJITが起動しないようにする魔法の制限があります。(はい、巨大なメソッドを持つことは合理的です。これはトークナイザーループです。)メソッドはライブラリ内にあり、ライブラリのユーザーが魔法の制限を無効にするようにHotSpotを構成する必要はありません。
観察:バイトコードを逆コンパイルすると、EclipseJavaコンパイラが多くの無意味なgotoを生成することがわかります。(javacはさらに悪いです。)つまり、ジャンプからのみ到達可能なgotoがあります。明らかに、後藤にジャンプするジャンプは、代わりに後藤がジャンプする場所に直接ジャンプする必要があり、後藤は削除する必要があります。
質問:無意味なジャンプチェーンをフラット化して不要なgotoを削除するJava 5クラスファイル用のバイトコードオプティマイザーはありますか?
編集:私は次のようなパターンを意味します:
8698: goto 8548
8701: goto 0
明らかに、2番目のgotoに到達するには、8701にジャンプする必要があります。これは、0に直接ジャンプする場合もあります。
2回目の調査では、この疑わしいパターンがより一般的です。
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
明らかに、コンパイラーが「等しくない」比較を「等しい」比較に逆にし、8704にジャンプして、gotoを削除するようにしたい場合。