https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116414
Bug ID: 116414 Summary: Missed optimization: Branch elimination and memory writes Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: madhur4127 at gmail dot com Target Milestone: --- Godbolt: https://godbolt.org/z/oKrGfh34z Code: ``` #include <optional> #include <cstdint> std::optional<uint16_t> x(uint16_t x) { return x <= 1 ? std::nullopt : std::optional{x}; } ``` GCC trunk generates a branch and uses memory writes whereas it could just use `eax` like clang ``` x(unsigned short): cmp di, 1 jbe .L5 mov WORD PTR [rsp-4], di mov BYTE PTR [rsp-2], 1 mov eax, DWORD PTR [rsp-4] ret .L5: mov BYTE PTR [rsp-2], 0 mov eax, DWORD PTR [rsp-4] ret ``` clang: ``` x(unsigned short): xor eax, eax cmp di, 2 setae al shl eax, 16 or eax, edi ret ```