https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68269
mrs at gcc dot gnu.org <mrs at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|rtl-optimization |target --- Comment #5 from mrs at gcc dot gnu.org <mrs at gcc dot gnu.org> --- Ok, at least ia64-elf works. /* This assert keeps the simplification from producing a result that cannot be represented in a CONST_DOUBLE but a lot of upstream callers expect that this function never fails to simplify something and so you if you added this to the test above the code would die later anyway. If this assert happens, you just need to make the port support wide int. */ => gcc_assert (width <= HOST_BITS_PER_DOUBLE_INT); So, the meaning is entirely clear. You can either have bad answers and remove the assert, or fix the port to use wide-int, those are the only two options. Anyway, the wide-int code was done, because gcc can't work without it. You're just hitting one of those corners. gcc is processing: (set (zero_extract:DI (subreg:DI (reg:OI 381) 0) (const_int 32 [0x20]) (const_int 0 [0])) (subreg:DI (reg:SI 382) 0)) with expand_field_assignment, and inner is: (reg:OI 381) and compute_mode winds up being OImode. It then goes on to end the world trying in vein to do wide-int things, but can't. So, I'd recommend fixing the port to be wide-int based.