如何禁用一些 LLVM 的后期机器代码优化?

How to disable some of LLVM's Late Machine Code Optimizations?

我有一个 LLVM pass 未优化我程序的某些部分,但我还需要执行一些后期机器代码优化。问题是通常后期的机器代码优化会优化我的通行证所做的工作。无论如何要在不修改 LLVM 的情况下禁用特定的后期机器代码优化?

不是真的。

您可以阻止后期机器代码优化器执行一些特定的操作,但它们相当具有侵入性:

  • 您可以通过在 IR 中插入障碍来防止代码移动。 LLVM 的 IR 中存在保证不会生成任何代码的障碍。
  • 您有时可以 select 使用内部函数来执行特定的机器指令。
  • 您可以使 "dead" 加载和存储保持易变。

但一般来说,如果您想以机器优化不会干扰的方式转换程序,则需要在机器级别 转换程序。 LLVM 支持编写对机器代码进行操作的非常后期的转换过程,并且可以在所有机器代码优化完成 运行ning 之后 极度 安排其中之一。但是,您现在必须处理机器代码,而不是高级和抽象的 IR。

为了理解为什么这些东西如此内在地联系在一起,让我们考虑一下寄存器分配器。大多数人不想在寄存器分配已经发生后尝试进行转换,因为那真的很难。所以这是一个经典的机器优化,有人在转换后仍然 想要 到 运行。然而,如果没有机器优化器的其余部分,LLVM 的寄存器分配器并不能很好地工作。它是假设发生代码移动以将代码移入和移出循环以改善寄存器压力的方式编写的。它还被编写为具有复杂的 coalescing 步骤 运行,依此类推。