GCC在每次优化之后获取汇编代码?

从维基百科上的优化编译器,

编译器优化通常是使用一系列优化转换来实现的,这些转换算法采用一个程序并将其转换为产生语义等价的输出程序,从而使用较少的资源。

而GCC有很多优化选项。

我想在使用不同的标志(例如-O1-O2-O3等)进行编译时,在GCC执行每次优化之后研究生成的程序集(一个-S给出)。

我怎样才能做到这一点?

编辑:我的输入将是C代码。


中间表示可以使用-fdump-tree-all开关保存到文件中。

有更多细粒度的-fdump交换机可供选择。

详情请参阅gcc手册。

为了能够阅读这些表述,请查看GCC内部手册。


尽管可能需要一小段代码,但使用-S和各种选项进行编译时,难点在于了解实际发生了什么变化。 只需稍作更改就可以使代码完全不同 - 进入寄存器的一个变量意味着寄存器不再可用于某些内容,从而对函数中的所有其余代码造成连锁效应。

我今天早些时候比较了两个几乎完全相同的函数的相同代码(在C ++上做了一个问题),并且源代码中有一处不同。 在一个for-loop内使用哪个变量用于终止条件会导致汇编代码行改变。 因为编译器决定以不同的方式安排寄存器,所以使用一个不同的寄存器作为主变量之一,然后其他所有内容都会因此而改变。

我已经看到了一些情况,在函数中添加一个小的改变将它从内联移到不内联,这又对调用该代码的程序中的所有代码进行了重大更改。

所以,是的,无论如何,用不同的优化编译非常简单的代码,并使用-S来检查编译器生成的代码。 然后比较不同的变体,看看它有什么影响。 但是,除非您习惯了阅读汇编代码,并且了解您实际正在寻找的内容,否则通常很难看到树木的森林。

同样值得考虑的是,优化步骤经常协同工作 - 只需一步即可完成工作(内联导致分支合并,注册使用等)。


使用switch -S编译来获取汇编代码。 这应该适用于任何级别的优化。 例如,要获得在O2模式下生成的汇编代码,请尝试:

    g++/gcc -S -O2 input.cpp

将生成一个相应的input.s ,其中包含生成的汇编代码。 对所需的任何优化级别重复此操作。

链接地址: http://www.djcxy.com/p/80739.html

上一篇: Get Assembly code after every optimization GCC makes?

下一篇: Sufficient conditions for foldl and foldr equivalence