8139750: [BACKOUT] Elide more final field's write memory barrier with escape analysis result
Reviewed-by: kvn
This commit is contained in:
parent
6c269ab6a9
commit
74f8cc939b
@ -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(); }
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user