首页 > 解决方案 > gcc 或 clang 未优化函数指针间接 - 错误或有意?

问题描述

给定以下两个函数:

int f() { return 0; }
int g() { return 1; }

以下代码根据 boolean 调用其中一个b

int t0(bool b) { return (b ? &f : &g)(); }
int t1(bool b) { return b ? f() : g(); }
int t2(bool b) { return b ? t0(true) : t0(false); }

两者都g++ (trunk)未能优化以下代码clang++ (trunk)-std=c++2a -Ofast -march=native

int main(int ac, char**) { return t0(ac & 1); }

生成以下组件:

main:
  and edi, 1
  mov eax, OFFSET FLAT:f()
  mov edx, OFFSET FLAT:g()
  cmove rax, rdx
  jmp rax

调用t1or t2(而不是t0)产生以下优化的程序集:

main:
        mov     eax, edi
        not     eax
        and     eax, 1
        ret

一切都可以gcc.godbolt.org上实时复制。


我觉得令人费解的是,t0直接调用main并没有得到优化,而调用它t2是可以的。

t0调用不产生与 or 相同的程序集t1是否有原因t2还是两者都错过了优化g++ (trunk)机会clang++ (trunk)

标签: c++optimizationfunction-pointerscompiler-optimizationconditional-operator

解决方案


推荐阅读