https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108548
Bug ID: 108548 Summary: gcc asm goto with outputs not implicitly volatile Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: ndesaulniers at google dot com CC: eli.friedman at gmail dot com, foom at fuhm dot net Target Milestone: --- https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Volatile mentions: > GCC’s optimizers sometimes discard asm statements if they determine there is > no need for the output variables. ... Using the volatile qualifier disables > these optimizations. asm statements that have no output operands and asm goto > statements, are implicitly volatile. So what about asm goto statements that do have outputs, which GCC recently gained support for? Looks like I get different codegen targeting x86 at -O2 with: ``` int foo (void) { void *x; asm goto ( "movq %l1, %0\n\t" "jmp *%0" :"=r"(x):::bar); return 0; bar: return 1; } ``` based on whether the asm goto statement is marked volatile or not. Should asm goto statements with outputs be implicitly volatile (implying a bug currently in GCC) or not (implying the documentation could perhaps be updated)?