https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119731
--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> --- ``` void f(long *a, int *b) { *b = *a; } ``` Shows the difference. propagating insn 7 into insn 8, replacing: (set (mem:SI (reg/v/f:DI 22 [ bD.1854 ]) [2 *b_5(D)+0 S4 A32]) (subreg:SI (reg:DI 23 [ *a_4(D) ]) 0)) successfully matched this instruction to *movsi: (set (mem:SI (reg/v/f:DI 22 [ bD.1854 ]) [2 *b_5(D)+0 S4 A32]) (mem:SI (reg/v/f:DI 21 [ aD.1853 ]) [1 *a_4(D)+0 S4 A64])) Note one most RISC like targets in GCC have the a check in their mov to make sure that either operand is a reg so reload/LRA does not need to create a temporary:. e.g rs6000: "gpc_reg_operand (operands[0], <MODE>mode) || gpc_reg_operand (operands[1], <MODE>mode)" aarch64: "(register_operand (operands[0], <MODE>mode) || aarch64_reg_or_zero (operands[1], <MODE>mode))" Which might prevent this case from happening.