Hello,

> > I have run into following problem with dom. One of the places
> > where cfg_altered is set is wrong:
> It's not really wrong, it's set this way on purpose, specifically
> to avoid the compile-time explosion you're seeing.

This works by pure luck only, I think.  In fact, the only thing
that prevents dom from unrolling loops just now is

  if (need_ssa_update_p ())
    return false;

condition in tree_can_merge_blocks_p, that prevents block merging
and keeps cfg unchanged.  While I do not have a testcase for this,
I would not be suprised if dom could be persuaded to completely unroll
a loop as it is.

Nevertheless, could you please add at least a short comment explaining
that this obvious mistake is an intended one to tree-ssa-dom.c?

> > So I tried the obvious fix (the patch above).  This fixes the problem,
> > but also causes dom to completely unroll loops sometimes, for
> > example for
> > 
> > void bar(int);
> > 
> > void foo(void)
> > {
> >   int i;
> > 
> >   for (i = 0; i < 10000; i++)
> >     {
> >       if (i & 65536)
> >         abort ();
> >       bar(i);
> >     }
> > }
> > 
> > (two exit conditions are necessary; for some reason, this won't
> > happen if "if (i & 65536) abort ();" is removed).  This of course
> > is not desirable (and it is very, very slow).  Any idea how to fix
> > the first problem without introducing the second one?
> I think the way to do this is to somehow limit the iterations when
> one or more backedges there threaded.
> 
> This may also fall out of the work Steven has started.  His changes
> limit DOM's ability to thread jumps when blocks get large, which is
> precisely what happens when DOM unrolls this loop completely. We
> get a single very very large basic block.  You might poke around with
> his change a little.

No, it unfortunately cannot help.  The new blocks are placed before the
loop, and jump threading only occurs inside the loop, so the sizes of
copied blocks remain small.

I guess the only real fix is to remove jump threading from dom and make
a separate, non-iterative pass for it.  Which of course is quite a bit
of work.

Zdenek

Reply via email to