int S; volatile int vS; int* pS; volatile int* pvS; int A[10]; volatile int vA[10]; struct { int x; } F; struct { volatile int x; } vF; struct { int x; } F2; volatile struct { int x; } vF2; struct { struct { int y; } x; } F3; volatile struct { struct { int y; } x; } vF3; struct { int x:3; } BF; struct { volatile int x:3; } vBF; typedef int v4si __attribute__ ((vector_size (16))); v4si V; volatile v4si vV; // union? void main() { int i; // load i=S; i=vS; i=*pS; i=*pvS; i=A[2]; i=vA[2]; i=F.x; i=vF.x; i=F2.x; i=vF2.x; i=F3.x.y; i=vF3.x.y; i=BF.x; i=vBF.x; i=V[3]; i=vV[3]; // i=V.yx; // i=vV.zy; // store S=i; vS=i; *pS=i; *pvS=i; A[2]=i; vA[2]=i; F.x=i; vF.x=i; F2.x=i; vF2.x=i; BF.x=i; // even if the return value of this statement isn't used (like here) // clang add a volatile load which can't be removed. // is it the correct behavior? vBF.x=i; // this don't help: // (void)(vBF.x=i); V[3]=i; vV[3]=i; // other ops: ++S; ++vS; i+=S; i+=vS; }