/* { dg-do compile } */ /* { dg-options "-O2" } */ /* This was causing PRE to insert the value of the ADDR variable, to remove the invariant cast but in doing so, it was creating a non-invariant expression out of the invariant one, causing a later failure in PRE. */ struct sMCB { unsigned char type; }; extern void foo (void); unsigned char mem_readb(char *pt) __attribute__((nothrow)); void DOS_FreeProcessMemory(unsigned short pspseg) { while (1) { if (pspseg) foo (); char *addr = (char*)(&((sMCB*)0)->type); if (mem_readb(addr)==0x5a) break; } };