[Bug rtl-optimization/92656] The zero_extend insn can't be eliminated in the combine pass

segher at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Thu Dec 19 18:09:00 GMT 2019


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

--- Comment #2 from Segher Boessenkool <segher at gcc dot gnu.org> ---
Trying 104 -> 105:
  104: r125:SI=zero_extend(r101:SI#0)
      REG_DEAD r101:SI
  105: r127:SI={(r100:SI!=0)?r125:SI:r79:SI}
      REG_DEAD r125:SI
      REG_DEAD r100:SI
      REG_DEAD r79:SI
Failed to match this instruction:
(set (reg/v:SI 127 [ result ])
    (if_then_else:SI (ne (reg:SI 100)
            (const_int 0 [0]))
        (zero_extend:SI (subreg:HI (reg:SI 101) 0))
        (reg/v:SI 79 [ result ])))
Failed to match this instruction:
(set (reg/v:SI 127 [ result ])
    (if_then_else:SI (ne (reg:SI 100)
            (const_int 0 [0]))
        (and:SI (reg:SI 101)
            (const_int 65535 [0xffff]))
        (reg/v:SI 79 [ result ])))


Combine does not know r101 has all the high bits clear, apparently.  r101 is
formed via

insn_cost 4 for    77: r94:SI=0x4000
insn_cost 4 for    78: r93:SI=r94:SI+0x2
      REG_DEAD r94:SI
      REG_EQUAL 0x4002
insn_cost 8 for    24: r79:SI=zero_extend(r95:SI#0)
      REG_DEAD r95:SI
insn_cost 4 for   103: r101:SI=r79:SI^r93:SI

(insn 24 is a HImode subreg), so it could have seen that.  But the way nonzero
bits are tracked is not very predictable or dependable (it depends on the order
that combine looks at insns, which changes if insns combine where they didn't
before, etc.)

This whole nonzero_bits thing should be handled by dataflow.


More information about the Gcc-bugs mailing list