https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111617
Bug ID: 111617 Summary: Unnecessary instructions generated when comparing mixed-sign small integers Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: davidfromonline at gmail dot com Target Milestone: --- Compiling with `-std=c2x -O3` ```c bool a(signed char x, unsigned char y) { return x == y; } bool b(short x, unsigned short y) { return x == y; } bool c(int x, unsigned y) { return x == y; } bool d(long x, unsigned long y) { return x == y; } bool e(long long x, unsigned long long y) { return x == y; } ``` causes gcc to generate ```asm a: movsx edi, dil movzx esi, sil cmp edi, esi sete al ret b: movsx edi, di movzx esi, si cmp edi, esi sete al ret c: cmp edi, esi sete al ret d: cmp rdi, rsi sete al ret e: cmp rdi, rsi sete al ret ``` The `movsx` and `movzx` seem unnecessary, and are not emitted by clang. See it live: https://godbolt.org/z/dfc93f7Pv