https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80874
Bug ID: 80874 Summary: gcc does not emit cmov for minmax Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: denis.campredon at gmail dot com Target Milestone: --- Hello, Considering the following code: ------------------ struct pair { int min, max; }; pair minmax1(int x, int y) { if (x > y) return {y, x}; else return {x, y}; } #include <algorithm> std::pair<int, int> minmax2(int x, int y) { return std::minmax(x, y); } auto minmax3(int x, int y) { return std::minmax(x, y); } ------------------- I've found that for minmax1 and minmax 2, gcc fails to emit cmov at -03. Instead it produces the following: minmax1(int, int): cmp edi, esi jle .L2 mov eax, edi mov edi, esi mov esi, eax .L2: mov eax, edi sal rsi, 32 or rax, rsi ret ------------ For minmax3, the asm should be the same (I think), but it produces a more complex code.