https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69896
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bernds at gcc dot gnu.org --- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Yeah, in *.postreload we had: (insn 250 28 30 2 (set (reg:TI 3 bx [235]) (mem/j/c:TI (plus:DI (reg/f:DI 7 sp) (const_int 704 [0x2c0])) [1 v32u128_1+0 S16 A256])) pr69896.c:13 84 {*movti_internal} (nil)) (insn 30 250 273 2 (set (reg:TI 40 r11 [orig:98 _15 ] [98]) (reg:TI 3 bx [235])) pr69896.c:13 84 {*movti_internal} (nil)) (note 273 30 31 2 NOTE_INSN_DELETED) (insn 31 273 32 2 (set (reg:SI 3 bx [orig:99 _16 ] [99]) (reg:SI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} (nil)) ... (insn 271 37 278 2 (set (mem/c:TI (plus:DI (reg/f:DI 7 sp) (const_int 32 [0x20])) [6 %sfp+-352 S16 A128]) (reg:TI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 84 {*movti_internal} (nil)) (uses of reg:SI 3 bx [orig:99 _16 ] [99]) were removed during *.postreload). Then in *.split2 we get: (insn 279 28 280 2 (set (reg:DI 3 bx [235]) (mem/j/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 704 [0x2c0])) [1 v32u128_1+0 S8 A256])) pr69896.c:13 85 {*movdi_internal} (nil)) (insn 280 279 281 2 (set (reg:DI 4 si [+8 ]) (mem/j/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 712 [0x2c8])) [1 v32u128_1+8 S8 A64])) pr69896.c:13 85 {*movdi_internal} (nil)) (insn 281 280 282 2 (set (reg:DI 40 r11 [orig:98 _15 ] [98]) (reg:DI 3 bx [235])) pr69896.c:13 85 {*movdi_internal} (nil)) (insn 282 281 273 2 (set (reg:DI 41 r12 [ _15+8 ]) (reg:DI 4 si [+8 ])) pr69896.c:13 85 {*movdi_internal} (nil)) (note 273 282 31 2 NOTE_INSN_DELETED) (insn 31 273 32 2 (set (reg:SI 3 bx [orig:99 _16 ] [99]) (reg:SI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} (nil)) ... (insn 283 37 284 2 (set (mem/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 32 [0x20])) [6 %sfp+-352 S8 A128]) (reg:DI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 85 {*movdi_internal} (nil)) (insn 284 283 278 2 (set (mem/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 40 [0x28])) [6 %sfp+-344 S8 A64]) (reg:DI 41 r12 [ _15+8 ])) pr69896.c:13 85 {*movdi_internal} (nil)) I believe it is the *.pro_and_epilogue pass that makes the invalid transformation: (insn 31 273 32 2 (set (reg:SI 3 bx [orig:99 _16 ] [99]) - (reg:SI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} + (reg:SI 3 bx [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} (nil)) is fine, but (insn 283 37 284 2 (set (mem/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 32 [0x20])) [6 %sfp+-352 S8 A128]) - (reg:DI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 85 {*movdi_internal} + (reg:DI 3 bx [orig:98 _15 ] [98])) pr69896.c:13 85 {*movdi_internal} (nil)) is wrong, unless insn 31 is removed or turned into DImode assignment instead of SImode. (insn 284 283 278 2 (set (mem/c:DI (plus:DI (reg/f:DI 7 sp) (const_int 40 [0x28])) [6 %sfp+-344 S8 A64]) - (reg:DI 41 r12 [ _15+8 ])) pr69896.c:13 85 {*movdi_internal} + (reg:DI 4 si [orig:41 _15+8 ] [41])) pr69896.c:13 85 {*movdi_internal} (nil)) (note 278 284 251 2 NOTE_INSN_DELETED) (insn 251 278 38 2 (set (reg:SI 4 si [236]) - (reg:SI 40 r11 [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} + (reg:SI 3 bx [orig:98 _15 ] [98])) pr69896.c:13 86 {*movsi_internal} (nil)) (insn 38 251 39 2 (set (mem/c:SI (plus:DI (reg/f:DI 7 sp) (const_int 88 [0x58])) [3 S4 A64]) - (reg:SI 4 si [236])) pr69896.c:13 86 {*movsi_internal} + (reg:SI 3 bx [236])) pr69896.c:13 86 {*movsi_internal} (nil)) are all fine. -fno-shrink-wrapping indeed fixes this, as the invalid transformation is not performed.