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.

Reply via email to