https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119709

            Bug ID: 119709
           Summary: RISC-V: Why volatile int16_t variables generate extra
                    shift instructions in compiler output
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bigmagicreadsun at gmail dot com
  Target Milestone: ---

When compiling the following code with RISC-V GCC:

<C>
#include <stdint.h>
volatile int16_t x;
int get() {
  return x;
}
The generated assembly is:

<ASM>
get:
        lui     a5,%hi(x)
        lhu     a0,%lo(x)(a5)
        slli    a0,a0,16
        srai    a0,a0,16
        ret
x:
        .zero   2
(Full example: Godbolt link: https://godbolt.org/z/Y93T4c7M7)

Why does the compiler generate redundant shift operations (slli + srai) instead
of directly using lh?

When I change x to volatile uint16_t x, GCC correctly generates an lhu
instruction without shifts. Why does this behavior occur?

Reply via email to