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

            Bug ID: 97417
           Summary: RISC-V Unnecessary andi instruction when loading
                    volatile bool
           Product: gcc
           Version: 10.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kjetilos at gmail dot com
  Target Milestone: ---

When loading a volatile bool value I see that the compiler adds unnecessary
andi instruction. Here is reproducer:

#include <stdbool.h>

extern volatile bool active;

int foo(void)
{
  if (!active) {
    return 42;
  } else {
    return -42;
  }
}

And the code generated looks like this:

foo:
        lui     a5,%hi(active)
        lbu     a5,%lo(active)(a5)
        li      a0,42
        andi    a5,a5,0xff
        beq     a5,zero,.L1
        li      a0,-42
.L1:
        ret

The andi instruction seems to be unnecessary since lbu is zero extending the
byte.

ref. https://github.com/riscv/riscv-gnu-toolchain/issues/737

Reply via email to