On 06/30/2011 11:01 AM, Sebastian Pop wrote:
On Thu, Jun 30, 2011 at 10:03, Richard Guenther<rguent...@suse.de>  wrote:
But what do you do for

  for (unsigned char i = 128; i<  255; ++i)

?  You change 128 to -128 which is wrong.

Yes, 128 gets translated to -128.
And 255 gets translated to -1.
And so the loop iteration domain gets translated in the polyhedral form
as going from -128 to -1 with strides of 1.
So this particular program is not miscompiled by graphite:

int main ()
{
   unsigned char j;
   int x[300];
   for (j = 128; j<  255; j++)
     x[j] = j;

   for (j = 128; j<  255; j++)
     if (x[j] != j)
       __builtin_abort ();

   return 0;
}

I was trying to build a program that fails to attach to the PR.

So yes, you also have to
deal with modulo arithmetic in graphite.

I'm trying to understand where we have to deal with the modulo arithmetic.
Tobias, what are you doing in Polly?
Do you insert the loop iteration domain constraints with the modulo
of the types?

Hi Sebastian,

this is neither handed correctly in Polly.

Just to be able to understand Polly and Graphite:
LLVM has a different way of representing integer arithmetic. GCC uses explicit signed and unsigned types, whereas LLVM uses integer types that do not specify signedness, but on which either signed or unsigned operations are applied (For operations like add, subtract or multiply the signed and unsigned operations are actually the same). All operations in LLVM follow modulo arithmetics, except when they are marked 'no signed overflow' or 'no unsigned overflow'.

For Polly the correct solution is that as long as the operations are marked 'no signed overflow' or 'no unsigned overflow' we do not need modulo arithmetics. Modulo semantics are needed for operations that can have overflow and for most casts. At the moment we do not allow casts in Polly and we just assume that no overflow will occur. This is incorrect, but, as most C code works on signed integers which have undefined overflow semantics, it works most of the time. My next project is to add modulo arithmetics to Polly as soon as we cannot prove that no overflow will occur. This is the last major bug in Polly.

For Graphite I am not sure. Can overflows occur in the signed types of GCC or follow they the C signed types where overflows are undefined? In case overflow in signed types is undefined we should be safe as long as we disallow typecasts. As soon as unsigned types with defined overflow semantics occur, we most probably need modulo semantics to handle this correctly.

As a first step to make Graphite correct, I would just bail out if overflows can occur. Those games with sign extensions may work for the case where 255 is used as a -1, but in general I do not believe they are sufficient to express modulo semantics.

Adding real support for modulo semantics is probably the way to go, however it might be difficult. The first problem is that I do not know of a convenient way to express modulo semantics in PPL. isl provides so called existentially quantified dimensions, that allow us to easily express modulo semantics. In PPL we can express the same by adding additional dimensions. However, these additional dimensions are not automatically managed, such that we must ensure manually that they are handled correctly in the various polyhedral operations we perform. Also even if we would be able to express modulo semantics, there is still the problem that we will step into untested terrain. Neither CLooG nor the other tools have been tested with this. I personally do not expect a lot of correctness problems, however due to the introduction of large integer constants and additional dimensions we may face compile time problems or the creation of non-optimal code. Research wise an interesting topic.

So as a first step. Would it be OK to limit Graphite to signed types for the moment and remove the sext hack?

Cheers
Tobi

Reply via email to