summaryrefslogtreecommitdiff
path: root/lib/Support
diff options
context:
space:
mode:
authorTom Stellard <thomas.stellard@amd.com>2016-12-06 20:09:33 +0000
committerTom Stellard <thomas.stellard@amd.com>2016-12-06 20:09:33 +0000
commita093ef43dd592b729da46db4ff3057fef9a46023 (patch)
tree1ffb77d71b2e83ab6625126da2ac29c71753316a /lib/Support
parentb2d6212d1a051d750fbbc6e71607ad76153e04f0 (diff)
downloadllvm-release_39.tar.gz
Merging r288433:release_39
------------------------------------------------------------------------ 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
Diffstat (limited to 'lib/Support')
0 files changed, 0 insertions, 0 deletions