This site is currently read-only as we are migrating to Oracle Forums for an improved community experience. You will not be able to initiate activity until January 31st, when you will be able to use this site as normal.

    Forum Stats

  • 3,890,583 Users
  • 2,269,776 Discussions


Studio 12.5 miscompiles std::atomic<int>::fetch_add

koval Member Posts: 72 Blue Ribbon

Studio 12.5 C++ compiler generates incorrect code for fetch_add method in std::atomic

The problem occurs at optimization level -xO3 and higher

#include <atomic>std::atomic<int> counter = ATOMIC_VAR_INIT(0);int main(){    if (counter.fetch_add(1, std::memory_order_release) == 0)        counter.fetch_sub(1, std::memory_order_release);    return counter;}

The if generates following assembly:

{      514  } movl $1,%eax{      514  } lock xaddl %eax,counter{           } movl %eax,-12(%ebp) / sym=.CV0{      514  } jne .L77000030.57{      524  } .L77000028.58:{      524  } movl $-1,%eax{      524  } lock xaddl %eax,counter{      396  } .L77000030.57:{      396  } movl counter,%eax

The jump (514) suggests that the optimizer assumes xaddl setting flags for the original value (i.e. result of function fetch_add) which is wrong - xaddl sets the flags to represent result of addition, i.e. the new value

The bug causes QMutex class of Qt 5.9 to get into infinite loop, there is code which tests result of fetch_add against 0 like in my example.


  • Fedor-Oracle
    Fedor-Oracle Studio C++ engineer St.Petersburg, RussiaMember Posts: 131
    edited Aug 1, 2017 5:09AM

    > xaddl sets the flags to represent result of addition, i.e. the new value

    Indeed, it should be doing something like:

        xaddl %eax, counter

        testl %eax, %eax

    so current 12.5 behavior is surely a bug.

    Studio 12.6 seems to be doing it right, so the bug must be fixed, though I cant tell exactly which bug fix it was.

    You might want to switch to 12.6, as it has quite a share of C++11-related bug fixes.



  • Steve.Clamage-Oracle
    Steve.Clamage-Oracle Oracle Studio C++ Project Lead Santa Clara, CA, USAMember Posts: 775
    edited Aug 1, 2017 2:03PM

    Your problem looks like bug 24312660, which was fixed in Studio 12.6.

    If you have a Studio service contract, you could request a fix in a patch via  your support channel.

    But as Fedor has already noted, upgrading to Studio 12.6 is likely a better solution.

  • koval
    koval Member Posts: 72 Blue Ribbon
    edited Aug 1, 2017 9:06PM

    I am giving a try to 12.6, seems like this bug disappeared indeed

  • Alexgreen-Oracle
    Alexgreen-Oracle Member Posts: 2
    edited Aug 3, 2017 10:29AM

    The CR which fixed that problem is - 25726453

This discussion has been closed.