On Fri, 19 Oct 2012, Jan Hubicka wrote:

> > On Fri, 19 Oct 2012, Jan Hubicka wrote:
> > 
> > > Hi,
> > > this patch fixes off-by-one error in the testcase attached.  The problem 
> > > is that
> > > dominance based test used by record_estimate to check whether the given 
> > > statement
> > > must be executed at last iteration of the loop is wrong ignoring the side 
> > > effect
> > > of other statements that may terminate the program.
> > > It also does not work for mulitple exits as excercised by cunroll-2.c 
> > > testcase.
> > > 
> > > This patch makes simple approach of computing set of all statements that 
> > > must
> > > by executed last iteration first time record_estimate is executed this 
> > > way.
> > > The set is computed conservatively walking header BB and its signle 
> > > successors
> > > (possibly diving into nested loop) stopping on first BB with multiple 
> > > exits.
> > > 
> > > Better result can be computed by
> > > 1) estimating what loops are known to be finite
> > > 2) inserting fake edges for all infinite loop and all statements with 
> > > side effect
> > >    that may terminate the execution
> > > 3) using the post dominance info.
> > 
> > would using post-dom info even work?  That only says that _if_ the
> > dominated stmt executed then it came through the dominator.  It
> > doesn't deal with functions that may not return.
> 
> With fake edges inserted it will. We do have code for that used in profiling 
> that
> also needs this stronger definition of CFG.

Huh, but then we will need to split blocks.  I don't think that's viable.

> > 
> > What about the conservative variant of simply
> > 
> >       else
> >         delta = double_int_one;
> 
> I think it would be bad idea: it makes us to completely unroll one interation
> too many that bloats code for no benefit. No optimization cancels the path in
> CFG because of undefined effect and thus the code will be output (unless 
> someone
> smarter, like VRP, cleans up later, but it is more an exception than rule.)
> > 
> > ?  I don't like all the code you add, nor the use of ->aux.
> 
> Neither I really do, but what are the alternatives?

See above ;)

> My first implementation simply checked that stmt is in the loop header and
> walked up to the beggining of basic blocks looking for side effects.  Then I
> become worried about possibility of gigantic basic blocks with many array
> stores within the loop, so I decided to record the reachable statements 
> instead
> of repeating the walk.
> Loop count estimation is recursive (i.e. it dives into inner loops), thus I
> ended up with using AUX.  I can for sure put this separately or add extra
> reference argument passed over the whole call stack, but there are quite many
> functions that can leads to record_estimate. (I have nothing against that
> alternative however if AUX looks ugly)

I am worried about passes trying to use AUX.  We should at least document
that it is for internal use only.

> > 
> > >     i_bound += delta;
> > 
> > Another alternative would be to not use i_bound for the
> > strong upper bound but only the estimate (thus conservatively
> > use i_bound + 1 for the upper bound if !is_exit).
> 
> We can not derrive realistic estimate based on this: the loop may exit much 
> earlier.
> We can only lower the estimate if it is already there and greater than this 
> bound.
> This can probably happen with profile feedback and I can implement it later,
> I do not think it is terribly important though.
> 
> Honza
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend

Reply via email to