https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111835
Bug ID: 111835 Summary: Suboptimal codegen: zero extended load instead of sign extended one Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: lis8215 at gmail dot com Target Milestone: --- In this simplified example: int test (const uint8_t * src, uint8_t * dst) { int8_t tmp = (int8_t)*src; *dst = tmp; return tmp; } GCC prefers to use load with zero extension instead of more rational sign extended load. Then it needs to do explicit sign extension for making return value. I know there's a lot of bugs related to zero/sign ext, but I guessed it's rare special case, and it reproduces in any GCC version available at godbolt and any architecture except x86-64.