Query regarding volatiles and store CCP.

Ramana Radhakrishnan ramana.r@gmail.com
Tue Jul 10 16:08:00 GMT 2007


Hi Richard,



On 7/10/07, Richard Guenther <richard.guenther@gmail.com> wrote:
> On 7/10/07, Ramana Radhakrishnan <ramana.r@gmail.com> 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).


Ah yes, I'd missed out an assignment . void foo (void)
> > {
> > volatile int * spinlock0;

Should be volatile int *spinlock0 = &spinlock[0];
}

Filed as PR 32721.

cheers
Ramana


>
> Richard.
>


-- 
Ramana Radhakrishnan



More information about the Gcc mailing list