有没有一个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。