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

时间:2016-05-30 16:21:50

标签: optimization llvm llvm-ir

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

1 个答案:

答案 0 :(得分:1)

不是。

有一些具体的事情你可以阻止后期的机器代码优化器做,但它们是相当侵入性的:

  • 您可以通过在IR中插入障碍来阻止代码移动。 LLVM的IR存在障碍,保证不生成任何代码。
  • 您有时可以使用内在函数选择特定的机器指令。
  • 你可以通过使它们变得不稳定来使“死”的装载和存储保持不变。

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

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

相关问题