On 05/03/2016 02:20 PM, Alan Modra wrote:

diff --git a/gcc/ira.c b/gcc/ira.c
index a38e67e..cf5be35 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3742,6 +3742,16 @@ combine_and_move_insns (void)
          if (use_insn == BB_HEAD (use_bb))
            BB_HEAD (use_bb) = new_insn;

+         /* Since regno now dies in use_insn we can't leave any
+            equivalence for a reg set by use_insn as the equivalence
+            must reference regno.  */

"now dies" is the first part that I stumbled over. Doesn't it die there
regardless of the move?

Yes, but DF doesn't seem to see that..  If the def insn was left in
its original bb we have the reg live practically everywhere.  Search
for "DI 1381" in attached pre-patch dumps.

Ok, we have blocks 160 -> 43 -> 44, all of which have loop depth of 0, so it looks like we should have a death note? I could see how such a move would create a new death if the def was moved into a loop from outside.

So maybe df has a bug, or loop_depth isn't accurate (which would be bad since ira is relying on it)? Would you mind investigating a bit further what was going on?


Bernd

Reply via email to