Проблема: у меня есть метод, который компилирует более 8000 байт байт-кода Java. HotSpot имеет магический лимит, который запрещает использование JIT для методов, длина которых превышает 8000 байт. (Да, разумно иметь огромный метод. Это цикл токенизатора.) Метод находится в библиотеке, и я не хочу требовать, чтобы пользователи библиотеки настраивали HotSpot для деактивации магического ограничения.
Наблюдение: декомпиляция байт-кода показывает, что Eclipse Java Compiler генерирует много бессмысленных переходов. (javac еще хуже.) То есть есть gotos, которые достижимы только с прыжков. Очевидно, что прыжок, который прыгает на гото, должен вместо этого прыгать прямо туда, где гото прыгает, и гото следует устранить.
Вопрос: существует ли оптимизатор байт-кода для файлов классов Java 5, который выравнивает бессмысленные цепочки переходов, а затем удаляет ненужные переходы?
Редактировать: я имею в виду такие узоры, как:
8698: goto 8548
8701: goto 0
Очевидно, что до второго гото можно добраться только путем прыжка до 8701, который также может быть прямым прыжком до 0.
Во втором исследовании эта сомнительная картина встречается чаще:
4257: if_icmpne 4263
4260: goto 8704
4263: aload_0
Там, где, очевидно, хотелось бы, чтобы компилятор изменил сравнение «не равное» на сравнение «равное», перейти на 8704 и исключить переход.