https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108766
Bug ID: 108766 Summary: unaligned byteswapped 16bit load is just bad Product: gcc Version: 13.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Target: riscv Take: ``` short f(unsigned char *a) { return a[0] << 8 | a[1]; } ``` `-O2 -march=rv64iadc_zba_zbb_zbc_zbs_zicsr` produces: ``` lbu a5,1(a0) lbu a4,0(a0) slli a0,a5,8 or a0,a0,a4 slliw a5,a0,8 srli a0,a0,8 or a0,a0,a5 sext.h a0,a0 ret ``` That is just horrible. It should just be: ``` lbu a5,1(a0) lbu a4,0(a0) slli a0,a4,8 or a0,a0,a5 sext.h a0,a0 ret ``` It is trying to do an unaligned short load and then a byteswap.