<div dir="ltr"><div>Fixing regression <a href="https://bugs.openjdk.java.net/browse/JDK-8139750" target="_blank">https://bugs.openjdk.java.net/browse/JDK-8139750</a>, root cause is stable field's allocation doesn't always dominate MemBarRelease node created for stable field write. Could someone help review and sponsor this changeset?<br></div><div><br></div><div>bug: <a href="https://bugs.openjdk.java.net/browse/JDK-8139758" rel="noreferrer" style="font-size:12.8px" target="_blank">https://bugs.openjdk.java.net/browse/JDK-8139758</a></div><div>webrev: <a href="http://cr.openjdk.java.net/~hshi/8139758/webrev_v2/" target="_blank">http://cr.openjdk.java.net/~hshi/8139758/webrev_v2/</a><br></div><div><br></div><div>Analyzing java/util/Map/Defaults.java Error message is "assert(!had_error) failed: bad dominance". Assertion fails because MemBarRelease's Precedent input (checkCastPP node) doesn't dominate MemBarRelease node. Checking fail compilation method java/lang/invoke/MethodType.makeImpl</div><div><div>1. early return when mt is not null.</div><div>2. stable field write is applied on newly created MethodType object.</div><div>3. MemBarRelease is created with Precedent input (allocation "new MethodType(rtype, ptypes, trusted)")</div><div>4. MemBarRelease is created at the exit of this method. As early return exits in this method, MemBarRealse is not dominated by its Precedent input.</div><div>This problem doesn't show up before my early change, because Precedent input is only set for boxed type instance and no stable field in boxed type.</div><div> </div><div>    MethodType makeImpl(Class<?> rtype, Class<?>[] ptypes, boolean trusted) {</div><div>        MethodType mt = internTable.get(new MethodType(ptypes, rtype));</div><div>        if (mt != null)</div><div>            return mt;</div><div>        if (ptypes.length == 0) {</div><div>            ptypes = NO_PTYPES; trusted = true;</div><div>        }</div><div>        mt = new MethodType(rtype, ptypes, trusted);</div><div>        // promote the object to the Real Thing, and reprobe</div><div>        mt.form = MethodTypeForm.findForm(mt);  // stable field write</div><div>        return internTable.add(mt);</div><div>    }</div><div>        </div><div>For this reason, adding Precedent input for stable field store's MemBarRealse is skipped in new patch. For final field store, allocation always dominate MemBarRelease. Because allocation is immediately before initializer method and method has only one entry.</div><div> </div><div>New patch includes:</div><div>1. In do_put_xxx, set_alloc_with_final when filed is final and can find its allocation. Remove constrains for boxed type check.</div><div>2. Skip setting MemBarRelease's Precedent input for stable field write. There is no performance degradation here, before this change MemBarRelease precedent input isn't set as alloc_with_final is only update for boxed class and no stable field in boxed class.</div><div><br></div><div>Early discussion about why these constrains need removed and can be removed is in </div><div><a href="http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2015-October/019196.html" target="_blank">http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/2015-October/019196.html</a></div></div><div><div><br></div><div>Regards </div></div><div>Shi Hui</div></div>