【发布时间】:2019-08-05 14:20:28
【问题描述】:
int test1(int a, int b) {
if (__builtin_expect(a < b, 0))
return a / b;
return b;
}
被clang用-O3 -march=native编译到
test1(int, int): # @test1(int, int)
cmp edi, esi
jl .LBB0_1
mov eax, esi
ret
.LBB0_1:
mov eax, edi
cdq
idiv esi
mov esi, eax
mov eax, esi # moving eax back and forth
ret
为什么eax 在idiv 之后来回移动?
gcc 有类似的行为,所以这似乎是有意的。
带有-O3 -march=native 的gcc 将代码编译为
test1(int, int):
mov r8d, esi
cmp edi, esi
jl .L4
mov eax, r8d
ret
.L4:
mov eax, edi
cdq
idiv esi
mov r8d, eax
mov eax, r8d #back and forth mov
ret
【问题讨论】:
-
我不认为这是故意的。似乎
expect混淆了两个编译器。 -
@geza 我发现两个编译器不太可能有相同的问题
-
如果去掉expect,就可以看到额外的move是从哪里来的。
标签: c++ gcc assembly x86-64 micro-optimization