combine: Do not call simplify from inside change_zero_ext (PR78232)
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 10 Nov 2016 22:45:39 +0000 (23:45 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 10 Nov 2016 22:45:39 +0000 (23:45 +0100)
commit071af74db674f3dc462ab8a25e091b74830fda2d
treef4dd580ff3206cc32f7ebf4f180b9306bacfe206
parent94903212646d0b90a92afc0ca47a348ab92719c1
combine: Do not call simplify from inside change_zero_ext (PR78232)

When combine splits a three-insn combination into two instructions it
can reuse i2dest for the temporary result of the first new instruction.
However all information it has in reg_stat about that register will be
stale.  This results in the simplify_gen_binary calls in change_zero_ext
using out-of-date information, which makes it think one of the ANDs
generated there always results in 0, and it doesn't get better from there.

This can also happen if a splitter in the MD uses nonzero_bits (for
example).  I tried to make the splitting code in combine save and restore
the i2dest reg_stat info, but that causes one of the acats tests to fail.

This whole reg_stat thing needs an overhaul, and/or we shouldn't reuse
i2dest for unrelated purposes when splitting.

This patch changes change_zero_ext to do the expected simplifications
itself and not call simplify_gen_*.

PR rtl-optimization/78232
* combine.c (try_combine): Add a big comment about why reusing i2dest
is undesirable.
(change_zero_ext): Do not call simplify_gen_binary, do the
simplifications manually.

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