On Tue, May 03, 2016 at 02:33:36PM +0200, Bernd Schmidt wrote:
> 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
Err, is loop depth accurate in 254r.sched1?
In the ira dump, I see them all at loop depth 1.
So I expect that DF doesn't see the death because we're in a loop.
> 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.
We won't move into a loop from outside.
if (bb_loop_depth (use_bb) > bb_loop_depth (def_bb))
continue;
--
Alan Modra
Australia Development Lab, IBM