Files
archived-llvm/lib
Tom Stellard a093ef43dd Merging r288433:
------------------------------------------------------------------------
r288433 | oranevskyy | 2016-12-01 14:58:35 -0800 (Thu, 01 Dec 2016) | 24 lines

[ARM] Fix for 64-bit CAS expansion on ARM32 with -O0

Summary:
This patch fixes comparison of 64-bit atomic with its expected value in CMP_SWAP_64 expansion.

Currently, the low words are compared with CMP, while the high words are compared with SBC. SBC expects the carry flag to be set if CMP detects a difference. CMP might leave the carry unset for unequal arguments though if the first one is >= than the second. This might cause the comparison logic to detect false equality.

Example of the broken C++ code:
```
std::atomic<long long> at(2);

long long ll = 1;
std::atomic_compare_exchange_strong(&at, &ll, 3);
```
Even though the atomic `at` and the expected value `ll` are not equal and `atomic_compare_exchange_strong` returns `false`, `at` is changed to 3.

The patch replaces SBC with CMPEQ.

Reviewers: t.p.northover

Subscribers: aemerson, rengolin, llvm-commits, asl

Differential Revision: https://reviews.llvm.org/D27315

------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_39@288847 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 20:09:33 +00:00
..
2016-11-23 17:26:28 +00:00
2016-07-04 08:01:29 +00:00
2016-12-02 02:06:41 +00:00
2016-08-03 19:52:03 +00:00
2016-01-26 21:29:08 +00:00
2016-11-25 01:47:20 +00:00
2016-07-18 16:29:27 +00:00
2016-11-16 18:48:06 +00:00
2016-12-06 20:09:33 +00:00
2016-11-28 21:35:41 +00:00
2016-03-01 21:29:33 +00:00