2016-05-30 7 views
0

У меня есть LLVM-пропуск, который неоптимизирует определенную часть моих программ, но мне также необходимо выполнить некоторые поздние оптимизации машинного кода. Проблема в том, что обычно оптимизация позднего машинного кода оптимизирует работу, которую выполняет мой пропуск. В любом случае, чтобы отключить оптимизацию позднего машинного кода без изменения LLVM?Как отключить некоторые из LLVM Late Machine Code Optimizations?

ответ

1

Не совсем.

Есть определенные вещи, которые вы можете предотвратить поздний машинный код оптимизатор делать, но они довольно навязчивы:

  • Вы можете предотвратить перемещение кода, вставив барьеры Into ИК. В LLVM's IR есть преграды, которые гарантированно не генерируют никакого кода.
  • Вы можете иногда выбирать конкретные машинные инструкции, используя встроенные функции.
  • Вы можете вызвать «мертвые» нагрузки и запасы, чтобы сохранить их волатильность.

Но вообще говоря, если вы хотите превратить свою программу таким образом, чтобы машина оптимизации не будут мешать, вам необходимо преобразовать вашу программу на уровень машины. LLVM поддерживает запись очень поздних стадий преобразования трансформации, которые работают на машинный код, и возможно запланировать один из тех крайне поздно, после того как все оптимизации машинного кода закончились. Однако теперь вам приходится иметь дело с машинным кодом, а не с высоким уровнем и абстрактным IR.

Чтобы дать некоторое представление о том, почему эти вещи так связаны друг с другом, давайте рассмотрим распределитель регистров. Большинство людей не хотят пытаться делать преобразования после того, как распределение регистров уже произошло, потому что это действительно сложно. Так что это классическая оптимизация машины, которая бы кто-то оставила , хочет запускать после своих преобразований. Однако диспетчер регистров LLVM не работает хорошо, если остальная часть оптимизатора машины не работает. Это написано в предположении, что движение кода происходит, чтобы перемещать код внутри и из петель способами, которые улучшают давление в регистре. Он также написан, чтобы иметь сложный коалесцирующий шаг за шагом и так далее.

+0

Не могли бы вы предоставить ссылку на барьеры? –

+0

http://llvm.org/docs/LangRef.html#i-fence - в частности, 'fence singlethread seq_cst'. –

 Смежные вопросы

  • Нет связанных вопросов^_^