有没有一个Java字节码优化器可以删除无用的gotos?

2022-09-02 22:45:26

问题:我有一个方法可以编译为超过8000字节的Java字节码。HotSpot有一个神奇的限制,使得JIT不会启动超过8000字节的方法。(是的,有一个巨大的方法是合理的。这是一个分词器循环。该方法在库中,我不想要求库的用户必须配置HotSpot以停用魔术限制。

观察:反编译字节码表明Eclipse Java编译器会生成许多毫无意义的goto。(javac甚至更糟。也就是说,有些goto只能通过跳跃到达。显然,跳到转到的跳跃应该直接跳到转到跳跃的位置,并且应该消除转到。

问:是否有针对 Java 5 类文件的字节码优化器可以扁平化无意义的跳转链,然后删除不必要的 gotos?

编辑:我的意思是模式,如:

8698:   goto    8548
8701:   goto    0

显然,第二个goto只能通过跳到8701来达到,这也可以直接跳到0。

在第二项调查中,这种可疑模式更常见:

4257:   if_icmpne   4263
4260:   goto    8704
4263:   aload_0

显然,人们希望编译器将“不等于”比较反转为“相等”比较,跳转到8704并消除goto。


答案 1

我感受到你的痛苦。我曾经不得不写一个解析器,它有大约5kloc的if(str.equals(...))代码。我按照 parse1、parse2 等划分了几种方法。如果 parse1 未导致解析的答案,则调用 parse2,依此类推。这不一定是最佳实践,但它确实可以满足您的需要。


答案 2

如果您不使用调试符号(即javac中的-g标志)进行编译,是否会有所不同?这可能会使该方法低于魔术极限。


推荐