gpt4 book ai didi

assembly - 为什么 bool = bool 的代码生成存在差异?整数 : int

转载 作者:行者123 更新时间:2023-12-03 06:24:27 24 4
gpt4 key购买 nike

这段代码...

bool condSet(int cond, int a, int b) {
return cond ? a : b;
}

..为 gcc 6.3 生成...

    test    edx, edx
setne al
test edi, edi
jne .L6
rep ret
.L6:
test esi, esi
setne al
ret

.. 对于国际商会 17...

    test      edi, edi
cmovne edx, esi
mov eax, 1
test edx, edx
cmove eax, edx
ret

..对于 clang 3.9

    test    edi, edi
cmove esi, edx
test esi, esi
setne al
ret

为什么对于代码模式,我们会有这些我期望常见的差异?它们都依赖于条件指令,setne,cmovne,cmove,但是gcc也有一个分支,并且它们都使用不同的指令和参数顺序

编译器中的哪个 channel 负责生成此代码?差异是由于寄存器分配的方式造成的吗?一般数据流分析是如何完成的;或者生成代码时编译器模式是否与此模式匹配?

代码和汇编列表:https://godbolt.org/g/7heVGz

最佳答案

使用 test/cmov 策略将返回类型更改为 int 会导致所有三个编译器生成无分支代码。

我猜 gcc 认为对条件两边进行 bool 化工作量太大,因此决定使用分支。也许它没有意识到这是相同的工作,并且表达式实际上可以通过其他方式完成(选择正确的输入,然后对其进行 bool 化)。

它生成的代码对 b 进行 bool 化,然后才测试条件并对 a 进行 bool 化。因此,当 cond 为 true 时,它​​实际上运行 test/setnz 对。

这听起来像是一个错过优化的错误。 (或者是一个优化运行错误,它通过将返回类型应用于 ?: 的两个输入而不是仅应用于结果来搬起石头砸自己的脚)。

报告为GCC Bug 78947 .

<小时/>

在问题解决之前,您可以 get gcc to make code like clang / icc将其分为两个步骤:

bool condSet(int cond, int a, int b) {
int tmp = cond ? a : b; // better asm from gcc this way
return tmp;
}

关于assembly - 为什么 bool = bool 的代码生成存在差异?整数 : int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com