aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-05-04 00:13:35 +0930
committerAlan Modra <amodra@gcc.gnu.org>2016-05-04 00:13:35 +0930
commitfcc861d975cf423c23c1eb62508afffb7d9e2221 (patch)
treeb7e5fae121b10c3ecaa3f41fe7e34024ab63a9f2
parentf3d9004571a9fa52f2aa2cbbee82a4e4c1e9e65b (diff)
downloadgcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.zip
gcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.tar.gz
gcc-fcc861d975cf423c23c1eb62508afffb7d9e2221.tar.bz2
PR70890, stage2 miscompilation
PR rtl-optimization/70890 * ira.c (combine_and_move_insns): When moving def_insn, remove equivs on use_insn. From-SVN: r235825
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira.c16
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 095e502..7cd0bd4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-05-03 Alan Modra <amodra@gmail.com>
+
+ PR rtl-optimization/70890
+ * ira.c (combine_and_move_insns): When moving def_insn, remove
+ equivs on use_insn.
+
2016-05-03 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390.md ("*r<noxa>sbg_<mode>_sll")
diff --git a/gcc/ira.c b/gcc/ira.c
index d383a55..55b4bd7 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3742,6 +3742,22 @@ combine_and_move_insns (void)
if (use_insn == BB_HEAD (use_bb))
BB_HEAD (use_bb) = new_insn;
+ /* We know regno dies in use_insn, but inside a loop
+ REG_DEAD notes might be missing when def_insn was in
+ another basic block. However, when we move def_insn into
+ this bb we'll definitely get a REG_DEAD note and reload
+ will see the death. It's possible that update_equiv_regs
+ set up an equivalence referencing regno for a reg set by
+ use_insn, when regno was seen as non-local. Now that
+ regno is local to this block, and dies, such an
+ equivalence is invalid. */
+ if (find_reg_note (use_insn, REG_EQUIV, NULL_RTX))
+ {
+ rtx set = single_set (use_insn);
+ if (set && REG_P (SET_DEST (set)))
+ no_equiv (SET_DEST (set), set, NULL);
+ }
+
ira_reg_equiv[regno].init_insns
= gen_rtx_INSN_LIST (VOIDmode, new_insn, NULL_RTX);
bitmap_set_bit (cleared_regs, regno);