8139750: [BACKOUT] Elide more final field's write memory barrier with escape analysis result

Reviewed-by: kvn
This commit is contained in:
Roland Westrelin 2015-10-16 15:48:18 +02:00
parent 6c269ab6a9
commit 74f8cc939b
3 changed files with 5 additions and 35 deletions

View File

@ -343,7 +343,6 @@ class Parse : public GraphKit {
bool _count_invocations; // update and test invocation counter
bool _method_data_update; // update method data oop
Node* _alloc_with_final; // An allocation node with final field
Node* _alloc_with_stable; // An allocation node with stable field
// Variables which track Java semantics during bytecode parsing:
@ -399,25 +398,6 @@ class Parse : public GraphKit {
_alloc_with_final = n;
}
Node* alloc_with_stable() const {
if (_alloc_with_stable == NodeSentinel) {
return NULL;
}
return _alloc_with_stable;
}
void set_alloc_with_stable(Node* n) {
if (_alloc_with_stable == NodeSentinel) {
// uninitialized status, initialize with current input, can be
// null or valid node.
_alloc_with_stable = n;
} else if (_alloc_with_stable != n) {
// _alloc_with_stable isn't equal to n
_alloc_with_stable = NULL;
}
// _alloc_with_stable is equal with n, do nothing
}
Block* block() const { return _block; }
ciBytecodeStream& iter() { return _iter; }
Bytecodes::Code bc() const { return _iter.cur_bc(); }

View File

@ -397,7 +397,6 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
_wrote_stable = false;
_wrote_fields = false;
_alloc_with_final = NULL;
_alloc_with_stable = NodeSentinel;
_entry_bci = InvocationEntryBci;
_tf = NULL;
_block = NULL;
@ -971,7 +970,7 @@ void Parse::do_exits() {
// those also. If there is a predecessor allocation node, bind the
// barrier there.
if (wrote_stable()) {
_exits.insert_mem_bar(Op_MemBarRelease, alloc_with_stable());
_exits.insert_mem_bar(Op_MemBarRelease, alloc_with_final());
#ifndef PRODUCT
if (PrintOpto && (Verbose || WizardMode)) {
method()->print_name();

View File

@ -313,19 +313,10 @@ void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
// Preserve allocation ptr to create precedent edge to it in membar
// generated on exit from constructor.
if (AllocateNode::Ideal_allocation(obj, &_gvn) != NULL) {
if (field->is_final()) {
set_alloc_with_final(obj);
}
if (field->is_stable()) {
set_alloc_with_stable(obj);
}
} else if (field->is_stable()) {
// This stable field doesn't have an allocation, set
// alloc_with_stable as NULL: its initial value is NodeSentinel,
// if it is not set to NULL here, next set_alloc_with_stable
// call might set none-NULL value successfully.
set_alloc_with_stable(NULL);
if (C->eliminate_boxing() &&
adr_type->isa_oopptr() && adr_type->is_oopptr()->is_ptr_to_boxed_value() &&
AllocateNode::Ideal_allocation(obj, &_gvn) != NULL) {
set_alloc_with_final(obj);
}
}
}