|
1
7
如果gcc和clang还没有一个重复的open for gcc和clang,那么您应该报告一个遗漏的优化bug。 (在这种情况下,gcc和clang都有相同的漏掉优化的情况并不少见; 不 假设某个东西是非法的仅仅因为编译器没有这样做。 做 执行优化:这可能是编译器的错误,或者至少有些编译器开发人员根据他们对任何标准的解释,认为它是安全的。)
我们可以看到GCC返回它自己的传入参数,而不是返回
ABI需要一个具有内存类型返回值的函数来返回RAX中的“隐藏”指针 1 . GCC/clang已经意识到,通过传递自己的返回值空间,而不是分配新的空间,可以省去实际的复制。但是,要进行tailcall优化,他们必须意识到可以将被调用者的RAX值保留在RAX中,而不是将传入的RDI保存在呼叫保留寄存器中。 如果ABI不需要返回RAX中的隐藏指针,我希望gcc/clang在作为优化的tailcall的一部分传递传入的RDI时不会有任何问题。
通常编译器喜欢缩短依赖链;这可能就是这里的原因。编译器不知道
如中所述 What prevents the usage of a function argument as hidden pointer? 如果调用者希望将地址存储在某个地方(如果它是静态地址或堆栈地址),那么将指针放在寄存器中只会在调用者中保存一个LEA。 然而,这个案子很接近 要有用。 修改 通话后的那个空间。然后它有助于轻松访问该空间,例如在返回之前修改返回值。
与GCC9.1复制相比,实际的clangasm至少仍然使用返回值优化。( Godbolt
将 必须保存一个指针,如果ABI没有在RAX中提供它)。我没试过那个案子。 |
|
|
2
-1
System V AMD64 - ABI
将从寄存器中的函数返回数据
编译器总是错过优化。与Scheme不同,C语言没有尾部调用优化。GCC和Clang已经表示,他们没有计划尝试和保证尾部调用优化。这听起来像是OP可以尝试询问编译器开发人员,或者用这些编译器打开一个bug。 |
|
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 1 年前 |
|
|
MysteryMoose · GCC下故意忽略初始化器警告中的过量元素 1 年前 |
|
|
Ken P · 如何利用[*]printf格式类型规范警告? 2 年前 |
|
fghoussen · 在C结构体中,为什么打包、对齐似乎会进行填充? 2 年前 |
|
|
adversarr · 全局变量何时导出到可执行文件? 2 年前 |