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)?
  • [Bug c/108548] New: gcc asm go... ndesaulniers at google dot com via Gcc-bugs

Reply via email to