http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54041
Mikael Pettersson <mikpe at it dot uu.se> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |mikpe at it dot uu.se --- Comment #3 from Mikael Pettersson <mikpe at it dot uu.se> 2012-07-20 10:22:03 UTC --- Was this originally seen with an out-of-tree port? m68k-linux-gcc -mshort is an unusual combination, and I would expect it to be essentially unsupported as -mshort changes the ABI. For m68k-elf the option might make sense, but I wasn't able to reproduce the ICE for m68k-elf, only m68k-linux. The ICE comes from explow.c: rtx convert_memory_address_addr_space (enum machine_mode to_mode ATTRIBUTE_UNUSED, rtx x, addr_space_t as ATTRIBUTE_UNUSED) { #ifndef POINTERS_EXTEND_UNSIGNED gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode); return x; #else /* defined(POINTERS_EXTEND_UNSIGNED) */ m68k doesn't define P_E_U, but with -mshort to_mode apparently ends up being shorter, so the above assertion fails. The documentation for P_E_U states: " You need not define this macro if the @code{ptr_mode}, @code{Pmode} and @code{word_mode} are all the same width. " -mshort changes word_mode, invalidating the condition for not defining P_E_U. In this case a truncation is asked for. convert_memory_address_addr_space does perform truncations, but only when P_E_U is defined. Defining P_E_U to 0 around c_m_a_a_s eliminated the ICE and generated reasonable-looking code. I'm not sure if the bug is that the m68k backend doesn't define P_E_U even though is permits -mshort, or that c_m_a_a_s is wrong and should perform truncations also when P_E_U is undefined.