On Wed, Dec 02, 2015 at 08:19:05PM +0100, Jakub Jelinek wrote:
> On Wed, Dec 02, 2015 at 06:21:47PM +0000, Segher Boessenkool wrote:
> > --- a/gcc/shrink-wrap.c
> > +++ b/gcc/shrink-wrap.c
> > @@ -752,7 +752,11 @@ try_shrink_wrapping (edge *entry_edge, bitmap_head 
> > *bb_with,
> >  
> >    /* If we can move PRO back without having to duplicate more blocks, do 
> > so.
> >       We can move back to a block PRE if every path from PRE will eventually
> > -     need a prologue, that is, PRO is a post-dominator of PRE.  */
> > +     need a prologue, that is, PRO is a post-dominator of PRE.  We might
> > +     need to duplicate PRE if there is any path from a successor of PRE 
> > back
> > +     to PRE, so don't allow that either (but self-loops are fine, as are 
> > any
> > +     other loops entirely dominated by PRE; this in general seems too
> > +     expensive to check for, for such an uncommon case).  */
> 
> So, what will happen if PRE self-loops?

The prologue is put in a new block before the chosen one (as always).

> It would be nice to have it covered by a testcase.

If I knew how to prepare one, that stayed stable for more than about
two weeks, yes :-/

> > +     bool ok = true;
> > +
> > +     if (!can_get_prologue (pre, prologue_clobbered))
> > +       ok = false;
> > +
> > +     FOR_EACH_EDGE (e, ei, pre->succs)
> > +       if (e->dest != pre
> > +           && dominated_by_p (CDI_POST_DOMINATORS, e->dest, pre))
> > +         ok = false;
> 
> I wonder if it wouldn't be better to:
> 
>       if (!can_get_prologue (pre, prologue_clobbered))
>         ok = false;
>       else
>         FOR_EACH_EDGE (e, ei, pre->succs)
>           if (e->dest != pre
>               && dominated_by_p (CDI_POST_DOMINATORS, e->dest, pre))
>             {
>               ok = false;
>               break;
>             }
> 
> so that it doesn't walk or continue walking the edges if not needed.

If the compiler is any good, neither does my code, right?  :-)

I think it is more important to have this code readable than a teeny
tiny bit faster.  It is all linear (assuming dominator lookups are O(1)),
which isn't too hard to ascertain (yeah, famous last words).


Segher

Reply via email to