#define add(new) \ ({ int __old; \ asm ("addl %1, %0" \ : "=g" (__old) : "g" (new)); \ __old; \ }) void tst(void) { int x = 15; add(x); }
But according to gcc manual, "if an asm has output operands, GCC assumes for optimization purposes the instruction has no side effects except to change the output operands." In the above example, it is obvious that the asm has an output operand. But, in terms of the inline instruction, namely the addl, the output operand is **changed** indeed. Why does the gcc consider the asm having no side effects?
It considers the asm as having no side effects _except to change the output operands_. You didn't use the output, so GCC is free to remove the asm altogether: the resulting assembler code will still do the same thing (namely, nothing). Segher