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