On 7/10/07, Ramana Radhakrishnan <[EMAIL PROTECTED]> wrote:
Hi,

While upgrading a port of mine to trunk for a testcase I noticed the
following . Its more of a question for a language lawyer I guess.

The test looks like this.

int spinlock[2];

void foo (void)
{
volatile int * spinlock0;

while (*spinlock0 == 0)
{
/* do nothing */
}
}

Store CCP folds away the assignment in the following way :


Folded statement: *spinlock0_1 = 0;
            into: spinlock[0] = 0;

Folded statement: *spinlock1_2 = 0;
            into: spinlock[1] = 0;

Folded statement: D.1498_3 = *spinlock0_1;
            into: D.1498_3 = spinlock[0];

main ()
{
  volatile int * spinlock1;
  volatile int * spinlock0;
  int D.1498;

<bb 2>:
  spinlock0_1 = &spinlock[0];
  spinlock1_2 = &spinlock[1];
  spinlock[0] = 0;
  spinlock[1] = 0;

<bb 3>:
  D.1498_3 = spinlock[0];
  if (D.1498_3 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;

<bb 4>:
  return;

}

which later results in the loop getting optimized away. However
marking spinlock as volatile let the loop remain.


I originally thought this to be a problem . However after chatting
about it on IRC I wasn't sure if this was (un)defined behaviour.   I
looked through the standard but was unable to figure out from the
prose , whether it stated some place that the object pointed to also
should also have the same type qualifiers as the pointer being used to
access this.

We usually try hard to keep this working (the testcase above is not complete
for sure).

Richard.

Reply via email to