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
,其中包含生成的汇编代码。 对所需的任何优化级别重复此操作。