https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90275
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> --- I think this is related to the *movsi_compare0 ARM define_ins which prevents obvious cleanups, so we end up with: (insn 97 90 98 24 (parallel [ (set (reg:CC 100 cc) (compare:CC (reg:SI 131 [ d_lsm.22 ]) (const_int 0 [0]))) (set (reg:SI 135) (reg:SI 131 [ d_lsm.22 ])) ]) "pr90275.c":18:20 248 {*movsi_compare0} (expr_list:REG_DEAD (reg:SI 131 [ d_lsm.22 ]) (nil))) // unrelated insn that doesn't touch SI 131 or SI 135, but consumes CC register (insn 154 98 155 24 (set (reg:SI 131 [ d_lsm.22 ]) (reg:SI 135)) "pr90275.c":18:20 241 {*arm_movsi_insn} (expr_list:REG_DEAD (reg:SI 135) (nil))) where CSE is unhappy about the pseudo being copied there and back.