Mercurial > hg > truffle
diff src/share/vm/opto/parse1.cpp @ 14726:92aa6797d639
Backed out merge changeset: b51e29501f30
Backed out merge revision to its first parent (8f483e200405)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 24 Mar 2014 21:30:43 +0100 |
parents | 3edd4a71588b |
children |
line wrap: on
line diff
--- a/src/share/vm/opto/parse1.cpp Fri Mar 21 16:36:59 2014 -0700 +++ b/src/share/vm/opto/parse1.cpp Mon Mar 24 21:30:43 2014 +0100 @@ -391,8 +391,6 @@ _depth = 1 + (caller->has_method() ? caller->depth() : 0); _wrote_final = false; _wrote_volatile = false; - _wrote_stable = false; - _wrote_fields = false; _alloc_with_final = NULL; _entry_bci = InvocationEntryBci; _tf = NULL; @@ -910,35 +908,26 @@ Node* iophi = _exits.i_o(); _exits.set_i_o(gvn().transform(iophi)); - // Figure out if we need to emit the trailing barrier. The barrier is only - // needed in the constructors, and only in three cases: - // - // 1. The constructor wrote a final. The effects of all initializations - // must be committed to memory before any code after the constructor - // publishes the reference to the newly constructed object. Rather - // than wait for the publication, we simply block the writes here. - // Rather than put a barrier on only those writes which are required - // to complete, we force all writes to complete. - // - // 2. On PPC64, also add MemBarRelease for constructors which write - // volatile fields. As support_IRIW_for_not_multiple_copy_atomic_cpu - // is set on PPC64, no sync instruction is issued after volatile - // stores. We want to guarantee the same behavior as on platforms - // with total store order, although this is not required by the Java - // memory model. So as with finals, we add a barrier here. - // - // 3. Experimental VM option is used to force the barrier if any field - // was written out in the constructor. - // - // "All bets are off" unless the first publication occurs after a - // normal return from the constructor. We do not attempt to detect - // such unusual early publications. But no barrier is needed on - // exceptional returns, since they cannot publish normally. - // - if (method()->is_initializer() && - (wrote_final() || - PPC64_ONLY(wrote_volatile() ||) - (AlwaysSafeConstructors && wrote_fields()))) { + // On PPC64, also add MemBarRelease for constructors which write + // volatile fields. As support_IRIW_for_not_multiple_copy_atomic_cpu + // is set on PPC64, no sync instruction is issued after volatile + // stores. We want to quarantee the same behaviour as on platforms + // with total store order, although this is not required by the Java + // memory model. So as with finals, we add a barrier here. + if (wrote_final() PPC64_ONLY(|| (wrote_volatile() && method()->is_initializer()))) { + // This method (which must be a constructor by the rules of Java) + // wrote a final. The effects of all initializations must be + // committed to memory before any code after the constructor + // publishes the reference to the newly constructor object. + // Rather than wait for the publication, we simply block the + // writes here. Rather than put a barrier on only those writes + // which are required to complete, we force all writes to complete. + // + // "All bets are off" unless the first publication occurs after a + // normal return from the constructor. We do not attempt to detect + // such unusual early publications. But no barrier is needed on + // exceptional returns, since they cannot publish normally. + // _exits.insert_mem_bar(Op_MemBarRelease, alloc_with_final()); #ifndef PRODUCT if (PrintOpto && (Verbose || WizardMode)) { @@ -948,19 +937,6 @@ #endif } - // Any method can write a @Stable field; insert memory barriers after - // those also. If there is a predecessor allocation node, bind the - // barrier there. - if (wrote_stable()) { - _exits.insert_mem_bar(Op_MemBarRelease, alloc_with_final()); -#ifndef PRODUCT - if (PrintOpto && (Verbose || WizardMode)) { - method()->print_name(); - tty->print_cr(" writes @Stable and needs a memory barrier"); - } -#endif - } - for (MergeMemStream mms(_exits.merged_memory()); mms.next_non_empty(); ) { // transform each slice of the original memphi: mms.set_memory(_gvn.transform(mms.memory()));