aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/opto/library_call.cpp
diff options
context:
space:
mode:
authortwisti <none@none>2012-06-12 14:31:44 -0700
committertwisti <none@none>2012-06-12 14:31:44 -0700
commit18d70d36ba60e0ddaf1678ab763d010b498e1854 (patch)
treed3513e891481de9ff40dec60fd24f13d13412a47 /src/share/vm/opto/library_call.cpp
parent1556698c8e7406a136a579565a4dbfb7087a8ef6 (diff)
7174218: remove AtomicLongCSImpl intrinsics
Reviewed-by: kvn, twisti Contributed-by: Krystal Mok <sajia@taobao.com>
Diffstat (limited to 'src/share/vm/opto/library_call.cpp')
-rw-r--r--src/share/vm/opto/library_call.cpp119
1 files changed, 0 insertions, 119 deletions
diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp
index 56ea23b48..f9d740efd 100644
--- a/src/share/vm/opto/library_call.cpp
+++ b/src/share/vm/opto/library_call.cpp
@@ -192,8 +192,6 @@ class LibraryCallKit : public GraphKit {
void copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, bool is_array, bool card_mark);
bool inline_native_clone(bool is_virtual);
bool inline_native_Reflection_getCallerClass();
- bool inline_native_AtomicLong_get();
- bool inline_native_AtomicLong_attemptUpdate();
bool is_method_invoke_or_aux_frame(JVMState* jvms);
// Helper function for inlining native object hash method
bool inline_native_hashcode(bool is_virtual, bool is_static);
@@ -331,11 +329,6 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) {
// We do not intrinsify this. The optimizer does fine with it.
return NULL;
- case vmIntrinsics::_get_AtomicLong:
- case vmIntrinsics::_attemptUpdate:
- if (!InlineAtomicLong) return NULL;
- break;
-
case vmIntrinsics::_getCallerClass:
if (!UseNewReflection) return NULL;
if (!InlineReflectionGetCallerClass) return NULL;
@@ -711,11 +704,6 @@ bool LibraryCallKit::try_to_inline() {
case vmIntrinsics::_reverseBytes_c:
return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id());
- case vmIntrinsics::_get_AtomicLong:
- return inline_native_AtomicLong_get();
- case vmIntrinsics::_attemptUpdate:
- return inline_native_AtomicLong_attemptUpdate();
-
case vmIntrinsics::_getCallerClass:
return inline_native_Reflection_getCallerClass();
@@ -4006,113 +3994,6 @@ bool LibraryCallKit::is_method_invoke_or_aux_frame(JVMState* jvms) {
return false;
}
-static int value_field_offset = -1; // offset of the "value" field of AtomicLongCSImpl. This is needed by
- // inline_native_AtomicLong_attemptUpdate() but it has no way of
- // computing it since there is no lookup field by name function in the
- // CI interface. This is computed and set by inline_native_AtomicLong_get().
- // Using a static variable here is safe even if we have multiple compilation
- // threads because the offset is constant. At worst the same offset will be
- // computed and stored multiple
-
-bool LibraryCallKit::inline_native_AtomicLong_get() {
- // Restore the stack and pop off the argument
- _sp+=1;
- Node *obj = pop();
-
- // get the offset of the "value" field. Since the CI interfaces
- // does not provide a way to look up a field by name, we scan the bytecodes
- // to get the field index. We expect the first 2 instructions of the method
- // to be:
- // 0 aload_0
- // 1 getfield "value"
- ciMethod* method = callee();
- if (value_field_offset == -1)
- {
- ciField* value_field;
- ciBytecodeStream iter(method);
- Bytecodes::Code bc = iter.next();
-
- if ((bc != Bytecodes::_aload_0) &&
- ((bc != Bytecodes::_aload) || (iter.get_index() != 0)))
- return false;
- bc = iter.next();
- if (bc != Bytecodes::_getfield)
- return false;
- bool ignore;
- value_field = iter.get_field(ignore);
- value_field_offset = value_field->offset_in_bytes();
- }
-
- // Null check without removing any arguments.
- _sp++;
- obj = do_null_check(obj, T_OBJECT);
- _sp--;
- // Check for locking null object
- if (stopped()) return true;
-
- Node *adr = basic_plus_adr(obj, obj, value_field_offset);
- const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
- int alias_idx = C->get_alias_index(adr_type);
-
- Node *result = _gvn.transform(new (C, 3) LoadLLockedNode(control(), memory(alias_idx), adr));
-
- push_pair(result);
-
- return true;
-}
-
-bool LibraryCallKit::inline_native_AtomicLong_attemptUpdate() {
- // Restore the stack and pop off the arguments
- _sp+=5;
- Node *newVal = pop_pair();
- Node *oldVal = pop_pair();
- Node *obj = pop();
-
- // we need the offset of the "value" field which was computed when
- // inlining the get() method. Give up if we don't have it.
- if (value_field_offset == -1)
- return false;
-
- // Null check without removing any arguments.
- _sp+=5;
- obj = do_null_check(obj, T_OBJECT);
- _sp-=5;
- // Check for locking null object
- if (stopped()) return true;
-
- Node *adr = basic_plus_adr(obj, obj, value_field_offset);
- const TypePtr *adr_type = _gvn.type(adr)->is_ptr();
- int alias_idx = C->get_alias_index(adr_type);
-
- Node *cas = _gvn.transform(new (C, 5) StoreLConditionalNode(control(), memory(alias_idx), adr, newVal, oldVal));
- Node *store_proj = _gvn.transform( new (C, 1) SCMemProjNode(cas));
- set_memory(store_proj, alias_idx);
- Node *bol = _gvn.transform( new (C, 2) BoolNode( cas, BoolTest::eq ) );
-
- Node *result;
- // CMove node is not used to be able fold a possible check code
- // after attemptUpdate() call. This code could be transformed
- // into CMove node by loop optimizations.
- {
- RegionNode *r = new (C, 3) RegionNode(3);
- result = new (C, 3) PhiNode(r, TypeInt::BOOL);
-
- Node *iff = create_and_xform_if(control(), bol, PROB_FAIR, COUNT_UNKNOWN);
- Node *iftrue = opt_iff(r, iff);
- r->init_req(1, iftrue);
- result->init_req(1, intcon(1));
- result->init_req(2, intcon(0));
-
- set_control(_gvn.transform(r));
- record_for_igvn(r);
-
- C->set_has_split_ifs(true); // Has chance for split-if optimization
- }
-
- push(_gvn.transform(result));
- return true;
-}
-
bool LibraryCallKit::inline_fp_conversions(vmIntrinsics::ID id) {
// restore the arguments
_sp += arg_size();