On Thu, Feb 23, 2017 at 10:43:36PM +0000, Matthew Fortune wrote:
> This is an ICE that will be reproducible on a primary target so is still
> appropriate to pursue in stage4 as far as I understand.  I'm hoping to
> find time to work with Toma on this issue.

Ah.  Is there a PR for it yet?  Please open one, if not.

> > Can't whatever creates those jump insns keep the cfg in shape?  That
> > would avoid all issues here.
> 
> The problem, I think, is that these instructions are not yet in the cfg
> and are being inserted on an edge.  The jump is produced from the inline
> memcpy expansion we do for MIPS.

So this is generated during expand?  I don't see how it ends up on an
edge.

> In some cases there will be no loop,
> some cases there will be a loop ending with the conditional jump and
> some cases will have a loop and other instructions after the conditional
> jump. The 1st and 3rd form will get through the logic in
> commit_one_edge_insertion (albeit that the 3rd form will have incorrect
> cfg actually) but the 2nd form is rejected because of ending with a jump.

You can easily turn the 2nd form into the 3rd by emitting some no-op
instruction last.  If you can live with 3rd for GCC 7, that may be a
good solution for now.

> Other than coping with the potential for sub blocks here or letting them
> through and leaving later code to split the blocks then I see no other
> way forward.  I agree it should be possible to process just the blocks
> with jump instructions in the middle and that is actually going to be
> exactly one block in this case.  I don't know if updating the CFG while
> edges are being iterated on in commit_edge_insertions is safe though
> and am somewhat out of my comfort zone in general!

Yeah I'm really not seeing where/when your movmem is emitted.


Segher

Reply via email to