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

Georg-Johann Lay <gjl at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2018-07-16
     Ever confirmed|0                           |1

--- Comment #2 from Georg-Johann Lay <gjl at gcc dot gnu.org> ---
IMO the problem are the early returns in avr.c::avr_out_lpm() that bypass the
reset to 0 of RAMPZ at the end of that function if RAMPD is present:

http://gcc.gnu.org/viewcvs/gcc/trunk/gcc/config/avr/avr.c?view=markup&pathrev=257301#l3703

Affected is code for the devices in -mmcu=avrxmega5 and avrxmega7. A test case
for 1-byte reads is

char func1 (const __flash2 char *p)
{
    return *p;
}

func1:
        movw r30,r24     ;  16  [c=4 l=1]  *movhi/0
        ldi r18,2        ;  11  [c=4 l=3]  movqi_insn/3
        out __RAMPZ__,r18
        elpm r24,Z
/* epilogue start */
        ret              ;  19  [c=0 l=1]  return

I found no code to cover the wrong parts of the 2-byte and 4-byte reads.

Reply via email to