http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58365
--- Comment #6 from Maxim Kuvyrkov <mkuvyrkov at gcc dot gnu.org> --- (In reply to Jakub Jelinek from comment #5) > 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. Jacub, I don't quite understand whether you are saying that the bug is /not/ in csa (at GCC 4.7 age) or whether you are providing additional analysis. I'm debugging the gcc-4.7-era revision 162592 and here the source MEM in rep_movsi references stack variable instead of x6, which causes wrong aliasing decision.