https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120070
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |law at gcc dot gnu.org, | |schwab at gcc dot gnu.org --- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- -fno-ext-dce also works. Before ext-dce we have: (insn 12 11 13 4 (parallel [ (set (reg:DI 49 [ _34 ]) (sign_extend:DI (reg:SI 32 [ _2 ]))) (clobber (scratch:SI)) ]) "pr120070.c":11:10 93 {extendsidi2} (nil)) (insn 13 12 14 4 (set (reg:SI 50 [ _35 ]) (ashift:SI (reg:SI 44 [ xlog_lsn_sub_low.3_32 ]) (const_int 9 [0x9]))) "pr120070.c":11:56 311 {ashlsi3} (expr_list:REG_DEAD (reg:SI 44 [ xlog_lsn_sub_low.3_32 ]) (nil))) (insn 14 13 15 4 (parallel [ (set (reg:DI 51 [ _36 ]) (sign_extend:DI (reg:SI 50 [ _35 ]))) (clobber (scratch:SI)) ]) "pr120070.c":11:56 93 {extendsidi2} (expr_list:REG_DEAD (reg:SI 50 [ _35 ]) (nil))) (insn 15 14 68 4 (parallel [ (set (reg:DI 48 [ _38 ]) (minus:DI (reg:DI 49 [ _34 ]) (reg:DI 51 [ _36 ]))) (clobber (scratch:SI)) ]) "pr120070.c":11:36 175 {subdi3} (expr_list:REG_DEAD (reg:DI 51 [ _36 ]) (expr_list:REG_DEAD (reg:DI 49 [ _34 ]) (nil)))) ... (insn 18 17 19 6 (set (reg:SI 35 [ _6 ]) (minus:SI (reg:SI 32 [ _2 ]) (subreg:SI (reg:DI 48 [ _38 ]) 4))) "pr120070.c":17:36 discrim 1 176 {subsi3} (expr_list:REG_DEAD (reg:DI 48 [ _38 ]) (expr_list:REG_DEAD (reg:SI 32 [ _2 ]) (nil)))) which is the only use of DI 48, so we actually only care about the low 32 bits of the subtraction. ext-dce figures out the upper bits aren't needed and uses paradoxical subregs instead of the sign extensions: (insn 12 11 13 4 (set (reg:DI 49 [ _34 ]) (subreg:DI (reg:SI 32 [ _2 ]) 0)) "pr120070.c":11:10 76 {*m68k.md:1609} (nil)) (insn 13 12 14 4 (set (reg:SI 50 [ _35 ]) (ashift:SI (reg:SI 44 [ xlog_lsn_sub_low.3_32 ]) (const_int 9 [0x9]))) "pr120070.c":11:56 311 {ashlsi3} (expr_list:REG_DEAD (reg:SI 44 [ xlog_lsn_sub_low.3_32 ]) (nil))) (insn 14 13 15 4 (set (reg:DI 51 [ _36 ]) (subreg:DI (reg:SI 50 [ _35 ]) 0)) "pr120070.c":11:56 76 {*m68k.md:1609} (expr_list:REG_DEAD (reg:SI 50 [ _35 ]) (nil))) (insn 15 14 68 4 (parallel [ (set (reg:DI 48 [ _38 ]) (minus:DI (reg:DI 49 [ _34 ]) (reg:DI 51 [ _36 ]))) (clobber (scratch:SI)) ]) "pr120070.c":11:36 175 {subdi3} (expr_list:REG_DEAD (reg:DI 51 [ _36 ]) (expr_list:REG_DEAD (reg:DI 49 [ _34 ]) (nil)))) Combine then propagates those. Reload decides then to put (reg:SI 32 [ _2 ]) into (reg:SI %d1) and (reg:SI 50 [ _35 ]) into (reg:SI %d0) and then uses (reg:DI %d0) for the first paradoxical subreg and (reg:DI -1) for the second.