编译器优化绝对值

时间:2015-07-24 01:06:55

标签: c gcc optimization

我的问题已经结束了,答案可能太复杂了,我无法理解,但如果你有一些高级评论,我会非常感谢他们!

我写了一个简单的绝对值函数

int absval(int val)
{
    return (val<0) ? -val: val;
}

然后用-O标志和-S选项用gcc编译它。 gcc生成以下汇编代码

movl    %edi, %edx
sarl    $31, %edx
movl    %edx, %eax
xorl    %edi, %eax
subl    %edx, %eax
ret

我理解汇编代码如何找到数字的绝对值,我很困惑的是编译器如何得到这个代码。具体而言,它消除了任何控制流程。旧版本的gcc是否会生成相同的代码?

1 个答案:

答案 0 :(得分:3)

优化通常通过模式匹配算法实现。编译器编写器硬编码一组固定的模式,供优化器查找并使编译器为它们生成最佳代码。

换句话说,编译器被硬编码以识别各种上下文中的这种特定的“否定否定”模式,并为其生成无分支机器代码。

在实际的编译器中,模式不一定像“否定的否定”一样具体。它可能是一些更高级别的元模式,一旦代码中的特定细节被替换为“负面”,就会减少“否定”。但无论如何都会发生某种模式匹配。