http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58365
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- That is actually the crossjumping pass after csa (jump2; though yes, previously it has been part of csa). In any case, I don't see anything wrong with the cross jumping, it turns the two: (set (mem/c:BLK (reg:DI 5 di [81]) [3 D.1761+0 S20 A32]) (mem/c:BLK (reg:DI 4 si [82]) [3 x6+0 S20 A32])) and (set (mem/c:BLK (reg:DI 5 di [84]) [3 D.1761+0 S20 A32]) (mem/u/c:BLK (reg:DI 4 si [85]) [3 x7+0 S20 A128])) into: (set (mem/c:BLK (reg:DI 5 di [84]) [3 D.1761+0 S20 A32]) (mem/u/c:BLK (reg:DI 4 si [85]) [3 S20 A32])) (note, MEM_EXPR cleared), where si is set conditionally to x6 or x7. And then we have the: (insn 29 27 31 6 (set (mem/c:SI (const:DI (plus:DI (symbol_ref:DI ("x6") <var_decl 0x7f9ce47572f8 x6>) (const_int 4 [0x4]))) [2 x6.x2+0 S4 A32]) (const_int 1 [0x1])) pr58365.c:31 86 {*movsi_internal} (nil)) store that sched2 moves over the above rep_movsi, although there is a (conditional, may, but doesn't have to) aliasing case.