https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69909
--- Comment #4 from Uroš Bizjak <ubizjak at gmail dot com> --- It looks that alias set is already wrong when expanding to RTL: (insn 13 12 14 2 (parallel [ (set (reg/f:DI 113) (plus:DI (reg/f:DI 20 frame) (const_int -64 [0xffffffffffffffc0]))) (clobber (reg:CC 17 flags)) ]) pr69909.c:9 219 {*adddi_1} (nil)) (insn 14 13 15 2 (parallel [ (set (reg/f:DI 114) (plus:DI (reg/f:DI 16 argp) (const_int 64 [0x40]))) (clobber (reg:CC 17 flags)) ]) pr69909.c:9 219 {*adddi_1} (nil)) (insn 15 14 16 2 (set (reg:DI 115) (const_int 8 [0x8])) pr69909.c:9 85 {*movdi_internal} (nil)) (insn 16 15 17 2 (parallel [ (set (reg:DI 115) (const_int 0 [0])) (set (reg/f:DI 113) (plus:DI (ashift:DI (reg:DI 115) (const_int 2 [0x2])) (reg/f:DI 113))) (set (reg/f:DI 114) (plus:DI (ashift:DI (reg:DI 115) (const_int 2 [0x2])) (reg/f:DI 114))) (set (mem:BLK (reg/f:DI 113) [1 S32 A256]) (mem/c:BLK (reg/f:DI 114) [1 v32u32_1+0 S32 A256])) (use (reg:DI 115)) ]) pr69909.c:9 942 {*rep_movsi} (nil)) (insn 17 16 18 2 (set (reg:TI 116) (mem/j/c:TI (plus:DI (reg/f:DI 16 argp) (const_int 144 [0x90])) [2 v32u128_1+16 S16 A128])) pr69909.c:9 84 {*movti_internal} (nil)) (insn 18 17 19 2 (parallel [ (set (reg:TI 103 [ _33 ]) (minus:TI (reg:TI 116) (mem/j/c:TI (plus:DI (reg/f:DI 20 frame) (const_int -48 [0xffffffffffffffd0])) [2 S16 A128]))) (clobber (reg:CC 17 flags)) ]) pr69909.c:9 258 {*subti3_doubleword} (expr_list:REG_EQUAL (minus:TI (mem/j/c:TI (plus:DI (reg/f:DI 16 argp) (const_int 144 [0x90])) [2 v32u128_1+16 S16 A128]) (mem/j/c:TI (plus:DI (reg/f:DI 20 frame) (const_int -48 [0xffffffffffffffd0])) [2 S16 A128])) (nil))) Register 113 points to FP-64, so (insn 16) copies 32 bytes to (FP-64 to FP-32). (Insn 18) later accesses (FP-48 to FP-32), but its alias set [2] is different from (insn 16) [1]. Later passes are free to move (insn 18) above (insn 16).