https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112830
Georg-Johann Lay <gjl at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |avr Keywords| |addr-space, | |ice-on-valid-code --- Comment #1 from Georg-Johann Lay <gjl at gcc dot gnu.org> --- In explow.cc, we have: rtx convert_memory_address_addr_space_1 (...) { #ifndef POINTERS_EXTEND_UNSIGNED gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode); // line 302 return x; #else /* defined(POINTERS_EXTEND_UNSIGNED) */ so it seems the backend has to define POINTERS_EXTEND_UNSIGNED, which it currently doesn't. However, the documentation of PEU reads: > Macro: POINTERS_EXTEND_UNSIGNED > A C expression that determines how pointers should be extended from > ptr_mode to either Pmode or word_mode. It is greater than zero if > pointers should be zero-extended, zero if they should be sign-extended, > and negative if some other sort of conversion is needed. In the last case, > the extension is done by the target’s ptr_extend instruction. > You need not define this macro if the ptr_mode, Pmode and word_mode are > all the same width. The avr backend has: Pmode = word_mode = HImode (16 bits), mode for ADDR_SPACE_GENERIC PSImode = 24 bits, mode for ADDR_SPACE_MEMX, aka. __memx So it appear the middle-end wants to "extend" a pointer from 24-bit PSImode to 16-bit Pmode, which makes no sense. Apart from that, the code does not require any pointer adjustments. One guess is that the middle-end tries to expand the memcpy, because insn cpymemhi only support CONST_INT lengths, and gets somethig wrong about address spaces. The backend defines TARGET_ADDR_SPACE_CONVERT, and TARGET_ADDR_SPACE_ADDRESS_MODE is the same like TARGET_ADDR_SPACE_POINTER_MODE for all address spaces.