我正在编写一个编译器,输出JVM字节码,使用ASM 9.4作为后端。这很好用,但有一个特别奇怪的问题。
我正在指定
在任何地方都没有记录的是,指定
这似乎并不会造成任何损害;我的初始测试用例通过了,我想JIT编译器实际上不会为冗余指令生成任何机器代码。但这有点令人不安。为什么会这样?我做错了什么吗?
我正在指定
COMPUTE_FRAMES
自动计算堆栈帧。据说这样做的权衡是(可以理解)使代码生成需要更多时间,但速度似乎足够快。在任何地方都没有记录的是,指定
COMPUTE_FRAMES
导致大量冗余指令被生成。具体来说,每个方法的结尾处会出现一个 athrow
,在某些情况下,整个方法中会散布一堆长时间运行的 nop
。这似乎并不会造成任何损害;我的初始测试用例通过了,我想JIT编译器实际上不会为冗余指令生成任何机器代码。但这有点令人不安。为什么会这样?我做错了什么吗?