[Bug rtl-optimization/69896] [6 Regression] wrong code with -frename-registers @ x64_64
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Feb 22 13:47:00 GMT 2016
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.
More information about the Gcc-bugs
mailing list