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.

Reply via email to