https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115350
Bug ID: 115350 Summary: Missing optimzation: fold `n = std::min(f ? 0 : 3, -a)` to `n = -a` Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: zhiwuyazhe154 at gmail dot com Target Milestone: --- Godbolt Example: https://godbolt.org/z/j9rj5q6W5 Code Example: unsigned short n; #include <algorithm> void fn1( unsigned short f, unsigned char a) { n = std::min(f ? 0 : 3, -a); // equals to "n = -a" } During the operation, -a will be converted to int type, and its value range is [-255, 0], which must be less than 0 or 3, so “n = std::min(f ? 0 : 3, -a)” is equivalent to "n = -a". GCC -O3: fn1(unsigned short, unsigned char): test di, di je .L5 xor eax, eax test sil, sil jne .L5 mov WORD PTR n[rip], ax ret .L5: movzx eax, sil neg eax mov WORD PTR n[rip], ax ret n: .zero 2 Expected code (CLANG -O3): fn1(unsigned short, unsigned char): neg esi mov word ptr [rip + n], si ret n: .short 0