https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90571
Bug ID: 90571 Summary: Missed optimization opportunity when returning function pointers based on run-time boolean Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: vittorio.romeo at outlook dot com Target Milestone: --- Given the following two functions: int f() { return 0; } int g() { return 1; } And the following code to invoke one of them depending on a 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); } Both `g++ (trunk)` and `clang++ (trunk)` with `-std=c++2a -Ofast -march=native` fail to optimize the following code: int main(int ac, char**) { return t0(ac & 1); } Producing the following assembly: > main: > and edi, 1 > mov eax, OFFSET FLAT:f() > mov edx, OFFSET FLAT:g() > cmove rax, rdx > jmp rax > Invoking `t1` or `t2` (instead of `t0`) produces the following optimized assembly: > main: > mov eax, edi > not eax > and eax, 1 > ret Everything can be reproduced live on **gcc.godbolt.org**: https://godbolt.org/z/gh7270