Hello, At some point in convert_move we have:
<< /* No special multiword conversion insn; do it by hand. */ start_sequence (); /* Since we will turn this into a no conflict block, we must ensure that the source does not overlap the target. */ if (reg_overlap_mentioned_p (to, from)) from = force_reg (from_mode, from); ... emit a multi-insn sequence ... >> With a previous version of the compiler, we happened to get there pretty easily with MEM_P(from) and the multi-insn sequence producing multiple memory references to the source. The original problem we had with this was the introduction of an artificial race condition in addition to the potential performance impact. We had fixed this with the attached patch, which simply forces "from" into a REG if it is a MEM, in addition to the current condition. While our original testcases don't expose the problem with current versions of the compiler, the issue appears to remain latent and the change still looks sensible in any case. We have been running with it for years across several versions of gcc on numerous platforms. I have just bootstrapped and regtested with mainline on x86_64-linux. OK to commit ? Thanks in advance, Olivier 2012-04056 Olivier Hainque <hain...@adacore.com> * expr.c (convert_move): Latch mem integer inputs into a register before expanding a multi-instructions sequence.