https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89795
--- Comment #5 from Eric Botcazou <ebotcazou at gcc dot gnu.org> --- So the combiner first eliminates a ZERO_EXTEND between 2 instructions as redundant, which is OK in isolation, but IRA (combine_and_move_insns) later combines again the same 2 instructions without using the WORD_REGISTER_OPERATIONS semantics of the combiner. This mini-combine pass in IRA isn't always run: /* Don't move insns if live range shrinkage or register pressure-sensitive scheduling were done because it will not improve allocation but likely worsen insn scheduling. */ if (optimize && !flag_live_range_shrinkage && !(flag_sched_pressure && flag_schedule_insns)) combine_and_move_insns (); which explains the need to -fno-sched-pressure on the ARM.