https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109407

            Bug ID: 109407
           Summary: instruction cmpxchgl run error when using with g++ -O
           Product: gcc
           Version: 9.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: johgjc at yeah dot net
  Target Milestone: ---

Created attachment 54810
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=54810&action=edit
a simple test code

the following code,
when using g++ test.cpp, the a.out is a endless loop as expected.
when using g++ -O2 test.cpp, the a.out returns and prints dwOriV=8

#include<cstdint>
#include<cstdio>
int main(){
    volatile int dwOriV = 32;
    int8_t dwRtnV = 0;
    int dwExpV = 16;
    int dwDstV = 8;
    while(true){
        __asm__ __volatile__(
        "lock;"
        "cmpxchgl %[NEW_VALUE], %[DST];"
        "sete %[RET];"
        : [RET] "=q"(dwRtnV),[DST] "+m"(dwOriV)
        :[NEW_VALUE] "r"(dwDstV), "a"(dwExpV)
        : "memory", "cc"
        );
        if(dwRtnV) {break;}
    }
    printf("%d",dwOriV);
    return 0;
}


my gcc version:
gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Reply via email to