This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Can a float volatile asm be used as optimization barrier?


#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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]