< prev index next >

src/share/vm/gc/shared/c2_BarrierSetCodeGen.cpp

Print this page
rev 13551 : imported patch gcinterface-aarch64-5.patch

@@ -271,20 +271,11 @@
       default:
         ShouldNotReachHere();
     }
   }
 
-  pin_atomic_op(kit, load_store, alias_idx);
-
-  Node* result = load_store;
-#ifdef _LP64
-  if (is_obj && adr->bottom_type()->is_ptr_to_narrowoop()) {
-    result = kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
-  }
-#endif
-
-  return result;
+  return load_store;
 }
 
 Node* C2BarrierSetCodeGen::cas_bool_at_resolved(GraphKit* kit, Node* obj, Node* adr, const TypePtr* adr_type, int alias_idx,
                                                 Node* expected_val, Node* new_val, const Type* value_type,
                                                 Node* mem, BasicType bt, C2DecoratorSet decorators) {

@@ -350,12 +341,10 @@
       default:
         ShouldNotReachHere();
     }
   }
 
-  pin_atomic_op(kit, load_store, alias_idx);
-
   return load_store;
 }
 
 Node* C2BarrierSetCodeGen::swap_at_resolved(GraphKit* kit, Node* obj, Node* adr, const TypePtr* adr_type, int alias_idx,
                                             Node* new_val, const Type* value_type,

@@ -433,20 +422,33 @@
                                       BasicType bt, C2DecoratorSet decorators) {
   decorators = fixup_decorators(decorators);
   Node* mem = atomic_op_membar_prologue(kit, decorators, alias_idx);
   Node* load_store = NULL;
   Node* result = cas_val_at_resolved(kit, obj, adr, adr_type, alias_idx, expected_val, new_val, value_type, mem, load_store, bt, decorators);
+
+  pin_atomic_op(kit, result, alias_idx);
+
+#ifdef _LP64
+  bool is_obj = bt == T_OBJECT || bt == T_ARRAY;
+  if (is_obj && adr->bottom_type()->is_ptr_to_narrowoop()) {
+    result = kit->gvn().transform(new DecodeNNode(load_store, load_store->get_ptr_type()));
+  }
+#endif
+
   atomic_op_membar_epilogue(kit, decorators);
   return result;
 }
 
 Node* C2BarrierSetCodeGen::cas_bool_at(GraphKit* kit, Node* obj, Node* adr, const TypePtr* adr_type, int alias_idx,
                                        Node* expected_val, Node* new_val, const Type* value_type,
                                        BasicType bt, C2DecoratorSet decorators) {
   decorators = fixup_decorators(decorators);
   Node* mem = atomic_op_membar_prologue(kit, decorators, alias_idx);
   Node* result = cas_bool_at_resolved(kit, obj, adr, adr_type, alias_idx, expected_val, new_val, value_type, mem, bt, decorators);
+
+  pin_atomic_op(kit, result, alias_idx);
+
   atomic_op_membar_epilogue(kit, decorators);
   return result;
 }
 
 Node* C2BarrierSetCodeGen::swap_at(GraphKit* kit, Node* obj, Node* adr, const TypePtr* adr_type, int alias_idx,
< prev index next >