https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57690

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
6.1+ produces shr:
        addq    $8, %rsp
        .cfi_def_cfa_offset 8
        shrl    $2, %eax

combine dump for GCC 6.1:
Trying 8 -> 9:
Failed to match this instruction:
(set (reg:DI 91)
    (zero_extract:DI (reg:SI 87 [ _3 ])
        (const_int 30 [0x1e])
        (const_int 2 [0x2])))

Combine dump for 5.4:
Trying 8 -> 9:
Successfully matched this instruction:
(set (reg:DI 92 [ D.1847 ])
    (zero_extract:DI (subreg:DI (reg:SI 87 [ D.1846 ]) 0)
        (const_int 30 [0x1e])
        (const_int 2 [0x2])))
allowing combination of insns 8 and 9
original costs 4 + 1 = 5
replacement cost 4
deferring deletion of insn with uid = 8.
modifying insn i3     9: {r92:DI=zero_extract(r87:SI#0,0x1e,0x2);clobber
flags:CC;}
      REG_UNUSED flags:CC
      REG_DEAD r87:SI
deferring rescan insn with uid = 9.
starting the processing of deferred insns
rescanning insn with uid = 9.
ending the processing of deferred insns

But I think GCC 6.1+ is producing invalid RTL in combine.  And it is no longer
matching the instruction.

I think the 6.1 behavior started with r6-2022.

Reply via email to