combine: Add added_notes_insn
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 17 Nov 2017 14:53:29 +0000 (15:53 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 17 Nov 2017 14:53:29 +0000 (15:53 +0100)
commitf1b7bc164cb370b15c6e62d65120e6494729ac0c
tree5e9aaec9a490509e5915b56f470e26eacc2d6f34
parent58b46683bd70c20c2543d60ca28af4dec4ec0443
combine: Add added_notes_insn

This patch makes combine reconsider insns it added notes to.  This
matters for example if the note is a REG_DEAD; without the note the
setter of the register has to be kept around in the result of
combinations, so it cannot be a 2->1 combination, and the cost of
the result is higher than without that extra set, so try_combine may
refuse the combination with the set, but allow it without the set.

This fixes a regression for powerpc: pr69946.c has started to fail
after the bitfield expansion changes.  GCC used to generate

        lwz 3,0(9)
        rlwinm 3,3,12,20,23
        ori 3,3,0x11
        rotldi 3,3,52
        bl bar

but now it does

        lwz 3,0(9)
        rldicr 3,3,32,3
        srdi 3,3,48
        ori 3,3,0x110
        sldi 3,3,48
        bl bar

(an instruction too many).  After this patch it is

        lwz 3,0(9)
        rlwinm 3,3,16,16,19
        ori 3,3,0x110
        sldi 3,3,48
        bl bar

(the testcase still does not pass, it looks for very specific insns).

* combine.c (added_notes_insn): New.
(try_combine): Handle added_notes_insn like added_links_insn.
Rewrite return value code.
(distribute_notes): Set added_notes_insn to the earliest insn we added
a note to.

From-SVN: r254875
gcc/ChangeLog
gcc/combine.c