https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102392
Bug ID: 102392 Summary: Failure to optimize out sign extension when input is non-negative Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: gabravier at gmail dot com Target Milestone: --- #include <stdint.h> void f(int64_t x); void g(int32_t x) { if (x < 0) __builtin_unreachable(); f(x); } This can be optimized to avoid the sign extension since x can't be under 0. This optimization is done by LLVM, but not by GCC. Sample resulting assembly from GCC: g: movsx rdi, edi jmp f from LLVM: g: mov edi, edi jmp f (PS: I originally found this while looking at the code that led me to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102391: an error check earlier in the code (not in the example cited there) wound up making this assumption possible, and slightly changed the assembly code emitted by LLVM there to be even more efficient)