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

            Bug ID: 116778
           Summary: [lra][avr] Wrong code with -mlra (bitfld-lra.c)
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gjl at gcc dot gnu.org
  Target Milestone: ---

Created attachment 59145
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59145&action=edit
bitfld-lra.c: C test case

$ avr-gcc -mmcu=atmega128 -dumpbase "" -save-temps -dp  -Os -mlra bitfld-lra.c
-o bitfld-lra.elf

produces wrong code for the attached test case

struct
{
  unsigned long long u33 : 33;
  unsigned long long u40 : 40;
  unsigned long long u41 : 41;
} a = { 0x100000, 0, 0x100000 }, b = { 1LL << 32, 0, 0 };
long long f = 1LL << 32, g = 1LL << 32;

int main (void)
{
  if (a.u33 * a.u33 != 0 || a.u33 * a.u40 * a.u33 != 0
      || a.u41 * a.u33 != 1LL << 40)
    __builtin_abort();

  if (b.u33 + g != 1LL << 33 || b.u33 + f != 1LL << 33 || g + g != 1LL << 33)
    __builtin_abort();
}

For the first addition "b.u33 + g != 1LL << 33" the asm reads something like

        ldd r13,Y+1      ;  660 [c=4 l=1]  movqi_insn/3
        mov r14,r13      ;  661 [c=4 l=1]  movqi_insn/0
        lds r15,g+5      ;  662 [c=4 l=2]  movqi_insn/3
        lds r16,g+6      ;  663 [c=4 l=2]  movqi_insn/3
        lds r17,g+7      ;  664 [c=4 l=2]  movqi_insn/3
        call __adddi3    ;  665 [c=32 l=2]  *adddi3_insn

where __adddi3 performs R10[8] + R18[8].  However, R13 has a wrong value of
0x01 due to the load insns 660 and 661 so that the value in R10[8] is
0x0101000000 instead of 0x0100000000 when __adddi3 is called.

Target: avr
Configured with: ../../source/gcc-master/configure --target=avr --disable-nls
--with-dwarf2 --with-gnu-as --with-gnu-ld --disable-shared
--enable-languages=c,c++
Thread model: single
Supported LTO compression algorithms: zlib
gcc version 15.0.0 20240918 (experimental) (GCC)

Reply via email to