aboutsummaryrefslogtreecommitdiff
path: root/gcc/optabs.c
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2012-02-08 15:26:02 +0000
committerAndrew Macleod <amacleod@gcc.gnu.org>2012-02-08 15:26:02 +0000
commitc51ec0a3d68c86ba9b2e2d0c61556fee8308d570 (patch)
treee3024248b27228597cb8c312498b83acfe993d15 /gcc/optabs.c
parentea72cc1dcab80a27beb22a2c9f0b4110392ec56d (diff)
downloadgcc-c51ec0a3d68c86ba9b2e2d0c61556fee8308d570.zip
gcc-c51ec0a3d68c86ba9b2e2d0c61556fee8308d570.tar.gz
gcc-c51ec0a3d68c86ba9b2e2d0c61556fee8308d570.tar.bz2
optabs.c (expand_atomic_load): Do not assume compare_and_swap will succeed for larger than word integers.
* optabs.c (expand_atomic_load): Do not assume compare_and_swap will succeed for larger than word integers. From-SVN: r184009
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r--gcc/optabs.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c
index 87cce8e..b0ecdf0 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -7665,9 +7665,12 @@ expand_atomic_load (rtx target, rtx mem, enum memmodel model)
/* Issue val = compare_and_swap (mem, 0, 0).
This may cause the occasional harmless store of 0 when the value is
already 0, but it seems to be OK according to the standards guys. */
- expand_atomic_compare_and_swap (NULL, &target, mem, const0_rtx,
- const0_rtx, false, model, model);
- return target;
+ if (expand_atomic_compare_and_swap (NULL, &target, mem, const0_rtx,
+ const0_rtx, false, model, model))
+ return target;
+ else
+ /* Otherwise there is no atomic load, leave the library call. */
+ return NULL_RTX;
}
/* Otherwise assume loads are atomic, and emit the proper barriers. */