Am 24.09.23 um 03:48 schrieb Ricardo Cosme:
Hi,

I have a question regarding the reordering of statements involving a builtin function and extended asm volatile expressions in avr-gcc.

Consider the following code snippet:

//C++
{
   asm volatile(/* template plus operands */);
   __builtin_avr_delay_cycles(cycles);
   asm volatile(/* template plus operands */);
}

I understand that the compiler is allowed to reorder statements as long as it doesn't affect the observable behavior of the program. However, in this specific case, the __builtin_avr_delay_cycles function is a compiler intrinsic.

Assuming there are no other expressions on the above block, is it possible for the compiler to reorder the three statements?

Cheers,
Ricardo Cosme

No. __builtin_avr_delay_cycles is implicitly volatile, so it may not
be reordered against other volatile statements.

This also applies to built-ins like __builtin_avr_sei/cli/nop/nops/wdr/sleep,
whereas arithmetic built-ins like __builtin_avr_swap/fmul/insert_bits
etc. are purely arithmetic any may be reordered or optimized out.

The volatile built-ins also have a memory clobber similar to

__asm volatile ("" ::: "memory");

so they may not be reordered against memory accesses.  They may be
reordered against arithmetic operations like divisions though, cf.

https://stackoverflow.com/q/37897848/1556746


Johann

Reply via email to