= x * 7
преобразуется в
t = x << 3
y = t - x
В llvm смог понять только, что для X86 это делается на этапе понижения из ll в mir, т.е. это не стандартный проход.
Может, есть статьи на эту тему или хотя бы ключевые слова на погуглить?
Strength reduction
Благодарю!
Скажем так, я исследовал только X86, а в нём заметил, что "mul 7" преобразуется в "lea + sub" на этапе понижения в mir. Возможно, другие бэкенды делают иначе. Зуб не дам.
В зависимости от реализации, это может быть и классическим применением техники супероптимизации (souper).
Жемчужины программирования. Джон Бентли. Это замена более дорогих инструкций на более дешёвые для известных частных случаев.
Кстати сейчас такая оптимизация часто может быть вредной, ибо сейчас конвееризация и скорость может амортизировать издержки, тогда как две чистые связанные по данным инструкции сольют выигрыш в чистых вычислениях и проиграют из-за кэширования промежуточного результата или занятия регистров. ЕМНИП единственное где ты можешь выигрыш получить, это если ты будешь векторные инструкции гонять с помощью load/store и разумно держать регистры.
Так ведь это настолько архитектурно-зависимая оптимизация, что без знания конкретных задержек от инструкций делать её в общем бессмысленно. Соответственно, и правила для strength reduction / peephole optimization работают только тогда, когда это улучшает производительность.
Обсуждают сегодня