On Wed, Oct 7, 2009 at 7:21 PM, Tobias Grosser
<gros...@fim.uni-passau.de> wrote:
> On Wed, 2009-10-07 at 18:30 +0200, Tobias Grosser wrote:
>> On Wed, 2009-10-07 at 17:44 +0200, Richard Guenther wrote:
>> > On Wed, Oct 7, 2009 at 5:35 PM, Tobias Grosser
>> > <gros...@fim.uni-passau.de> wrote:
>> > > On Wed, 2009-10-07 at 17:23 +0200, Richard Guenther wrote:
>> > >> On Wed, Oct 7, 2009 at 5:16 PM, Tobias Grosser
>> > >> <gros...@fim.uni-passau.de> wrote:
>> > >> > On Wed, 2009-10-07 at 16:42 +0200, Richard Guenther wrote:
>> > >> >> On Wed, Oct 7, 2009 at 4:37 PM, Tobias Grosser
>> > >> >> <gros...@fim.uni-passau.de> wrote:
>> > >> >> > I try to analyse this code:
>> > >> >> > ------------------------------------------------------
>> > >> >> > int foo (int N)
>> > >> >> > {
>> > >> >> >  int ftab[257];
>> > >> >> >  int i, j;
>> > >> >> >
>> > >> >> >  for (i = 0; i < N  - 7488645; i++)
>> > >> >> >    j = ftab [i];
>> > >> >> >
>> > >> >> >  return j;
>> > >> >> > }
>> > >> >> > ------------------------------------------------------
>> > >> >> >
>> > >> >> > The number of iterations I get is:
>> > >> >> >
>> > >> >> > (unsigned int) N_5(D) + 0x0ffffffff
>> > >> >> >
>> > >> >> > However I expect it to be
>> > >> >> >
>> > >> >> > (unsigned int) N_5(D) + (-1)
>> > >> >>
>> > >> >> No, that would be (unsigned int) (N_5(D) + -1) instead.
>> > >> >>
>> > >> >> It's fold that canonicalizes this to the above form - you
>> > >> >> simply have to deal with it (unsigned arithmetic, that is).
>> > >> >
>> > >> > OK. So I need to understand this better.
>> > >> >
>> > >> > E.g:
>> > >> >
>> > >> > int foo (int N)
>> > >> > {
>> > >> >  int ftab[257];
>> > >> >  int i, j;
>> > >> >
>> > >> >  for (i = 0; i < N  - 50; i++)
>> > >> >    j = ftab [i];
>> > >> >
>> > >> >  return j;
>> > >> > }
>> > >> >
>> > >> > Number of latch executions: (unsigned int) N_5(D) + 0x0ffffffcd
>> > >> >
>> > >> > What happens if N == 5? I would expect the number of latch iterations 
>> > >> > to
>> > >> > be 0 as i < 5 - 50 is always false. However using the upper 
>> > >> > expression I
>> > >> > get something like
>> > >> > 5 + 0x0ffffffcd == 0x0ffffffd2
>> > >> > what is a lot bigger than 0.
>> > >>
>> > >> It's undefined if N == 5 because the loop counter would overflow.
>> > >
>> > >
>> > > Why?
>> > >
>> > > The loop
>> > >
>> > > for (i=0; i < 5 - 50; i++)
>> > >
>> > > is equivalent to
>> > >
>> > > for (i=0; i < -45; i++)
>> > >
>> > > Which just evaluates to false and will not be executed. How can the loop
>> > > counter overflow?
>> >
>> > Ah, indeed.  Sorry for being confused.  Is tree-niter-desc->assumptions
>> > or ->may_be_zero non-NULL?
>>
>> Yes both. I attached the gdb content for both.
>
> (gdb) call debug_generic_expr (ndesc.assumptions)
> 1
> (gdb) call debug_generic_expr (ndesc.may_be_zero)
> 0
> (gdb) call debug_tree (ndesc.assumptions)
>  <integer_cst 0x29605658 type <boolean_type 0x296145b0 _Bool> constant
> 1>
> (gdb) call debug_tree (ndesc.may_be_zero)
>  <integer_cst 0x29605620 type <boolean_type 0x296145b0 _Bool> constant
> 0>
>
> So it seems the "niter" expression should contain the correct solution
> for every N. The cases where "niter" is not valid are not fullfilled
> following the description in tree-flow.h

Yes, I would think so.  Maybe Zdenek knows more.

Richard.

> Tobias
>
>

Reply via email to