The following somewhat contrived example models what happens in our software when accessing some memory-mapped IO registers. There is an address register into which the SW writes the address to be accessed, plus a data register from which it can then read the contents of that address. Both accesses have been replaced by printf/scanf here. ---8<--------------------------------------------------------------------8<--- #include <stdio.h> /* model internal state of address register */ int N; /* write address register */ void writeit(int i) { printf("Writing %d\n", i); N = i; } /* read data register */ int readit(void) { int x; printf("Reading %d\n", N); scanf("%d", &x); return x; } /* convenience macro to read from address i */ #define RD(i) (writeit(i), readit()) int main(void) { if (RD(42) == RD(23)) return 1; return 0; } ---8<--------------------------------------------------------------------8<--- In the main() routine, the intended result is to read from addresses 42 and 23 and compare the results. However, GCC reorders the calls to writeit/readit so that both writes are performed first - in the real HW, this would cause the program to read one of the addresses twice, the other not at all. I tested two GCC versions, which both show similar but not identical results: gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-54): Writing 23 Writing 42 Reading 42 0 Reading 42 0 gcc version 4.1.2 20070626 (Red Hat 4.1.2-14): Writing 42 Writing 23 Reading 23 1 Reading 23 1 Is there any way to force a consistent order of function calls - i.e., to keep GCC from moving calls across the '==' operator? (Preferably one that doesn't involve rewriting the main() function - it is easy for me to change the macro definition, but finding and fixing all places where such a macro is used in this way would require enormous effort - and it wouldn't keep people from reintroducing such problems later). Thanks, Jens. -- mailto:jjk@xxxxxxx phone:+49-7031-4357-122 http://www.bawue.de/~jjk/ fax:+49-7031-4357-483 http://del.icio.us/jjk As the air to a bird, or the sea to a fish, so is contempt to the contemptible. [Blake]