我写了一个简单的C++功能,以检查的编译器优化:这段代码为什么会产生比等效的C++/Clang更多的程序集?
bool f1(bool a, bool b) {
return !a || (a && b);
}
之后,我在签锈相当于:
fn f1(a: bool, b: bool) -> bool {
!a || (a && b)
}
我以前godbolt检查汇编输出。
C++代码(通过与-O3标志铛编译)的结果如下:
f1(bool, bool): # @f1(bool, bool)
xor dil, 1
or dil, sil
mov eax, edi
ret
和防锈等效的结果为更长:
example::f1:
push rbp
mov rbp, rsp
mov al, sil
mov cl, dil
mov dl, cl
xor dl, -1
test dl, 1
mov byte ptr [rbp - 3], al
mov byte ptr [rbp - 4], cl
jne .LBB0_1
jmp .LBB0_3
.LBB0_1:
mov byte ptr [rbp - 2], 1
jmp .LBB0_4
.LBB0_2:
mov byte ptr [rbp - 2], 0
jmp .LBB0_4
.LBB0_3:
mov al, byte ptr [rbp - 4]
test al, 1
jne .LBB0_7
jmp .LBB0_6
.LBB0_4:
mov al, byte ptr [rbp - 2]
and al, 1
movzx eax, al
pop rbp
ret
.LBB0_5:
mov byte ptr [rbp - 1], 1
jmp .LBB0_8
.LBB0_6:
mov byte ptr [rbp - 1], 0
jmp .LBB0_8
.LBB0_7:
mov al, byte ptr [rbp - 3]
test al, 1
jne .LBB0_5
jmp .LBB0_6
.LBB0_8:
test byte ptr [rbp - 1], 1
jne .LBB0_1
jmp .LBB0_2
我也试图与-O
选项,但输出为空(删除未使用的功能)。
我故意不使用任何库来保持输出清洁。请注意,clang
和rustc
都使用LLVM作为后端。什么解释这种巨大的产出差异?如果它只是禁用 - 优化开关问题,我怎么能看到来自rustc
的优化输出?
你用'-O'(在释放模式)编译? – Boiethios
@Boiethios是的,但它删除了整个代码(未使用)。使函数'酒吧extern'工作:) – jaskmar