* optabs.c (expand_atomic_load): Do not assume compare_and_swap will
authoramacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Feb 2012 15:26:02 +0000 (15:26 +0000)
committeramacleod <amacleod@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 8 Feb 2012 15:26:02 +0000 (15:26 +0000)
succeed for larger than word integers.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@184009 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/optabs.c

index 71cdd93..1c56ebe 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-08  Andrew MacLeod  <amacleod@redhat.com>
+
+       * optabs.c (expand_atomic_load): Do not assume compare_and_swap will
+       always succeed for integers larger than a native word.
+
 2012-02-08  Richard Guenther  <rguenther@suse.de>
 
        PR rtl-optimization/52170
index 87cce8e..b0ecdf0 100644 (file)
@@ -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.  */