Hi,
Please look at this c code:
typedef struct _PB {
void* data; /* required.*/
int f1_;
float f2_;
} PB;
PB** bar(PB** t);
void qux(PB* c) {
bar(&c); /* c is escaped because of bar */
c->f1_ = 0;
c->f2_ = 0.f;
}
// gcc-5.2.1 with -fno-strict-aliasing -O2 on x86
call bar
movq 8(%rsp), %rax <= load pointer c
movl $0, 8(%rax)
movl $0x00000000, 12(%rax)
// intel-icc-13.0.1 with -fno-strict-aliasing -O2 on x86
call bar(_PB**)
movq (%rsp), %rdx <= load pointer c
movl %ecx, 8(%rdx)
movq (%rsp), %rsi <= load pointer c
movl %ecx, 12(%rsi)
GCC only load pointer c once, but if I implement bar in such way:
PB** bar(PB** t) {
char* ptr = (char*)t;
*t = (PB*)(ptr-8);
return t;
}
Does this volatile C99 standard rule
(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf):
6.5.16 Assignment operators
"3. ... The side effect of updating the stored value of the left operand
shall occur between the previous and the next sequence point."
Thanks,
CY