https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116136
Richard Sandiford <rsandifo at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rsandifo at gcc dot gnu.org --- Comment #2 from Richard Sandiford <rsandifo at gcc dot gnu.org> --- I was curious how far back this went, but it seems to be present in the original combine.c commit: /* Changing mode twice with SUBREG => just change it once, or not at all if changing back to starting mode. */ if (GET_CODE (SUBREG_REG (x)) == SUBREG) { if (mode == GET_MODE (SUBREG_REG (SUBREG_REG (x))) && SUBREG_WORD (x) == 0 && SUBREG_WORD (SUBREG_REG (x)) == 0) return SUBREG_REG (SUBREG_REG (x)); Kind-of amazed that this went undetected so long, especially since multiword big-endian values were much more common back in the day.