<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span style="font-size:12.8000001907349px">Probably not.  See </span><a href="http://www.hboehm.info/c++mm/no_write_fences.html" rel="noreferrer" target="_blank" style="font-size:12.8000001907349px">http://www.hboehm.info/c++mm/no_write_fences.html<br></a><span style="font-size:12.8000001907349px">for an explanation.</span></blockquote><div><br></div><div>Is that really relevant to final/stable field writes though?</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 2, 2015 at 9:41 AM, Andrew Haley <span dir="ltr"><<a href="mailto:aph@redhat.com" target="_blank">aph@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 09/02/2015 02:25 PM, Hui Shi wrote:<br>
<br>
> Could anyone help review and comments this change?  This change<br>
> involves memory barrier, escape analysis and maybe PPC.<br>
><br>
> In C2 compiler, MemBarRelease node is generated at end of method if<br>
> it writes final/stable field. Is it better to use MemBarStoreStore<br>
> here?<br>
<br>
</span>Probably not.  See <a href="http://www.hboehm.info/c++mm/no_write_fences.html" rel="noreferrer" target="_blank">http://www.hboehm.info/c++mm/no_write_fences.html</a><br>
for an explanation.<br>
<span class=""><br>
>  Reasons are:<br>
<br>
> 1. MemBarRelease represents loadstore + storestore barrier, it costs<br>
> more than MemBarStoreStore on RMO(Relax Memory Order) platforms like<br>
> aarch64.<br>
>     For attached small case TestWriteFinal_MemoryBarrier.java, with<br>
> storestore memory barrier it is 40% faster on aarch64.<br>
<br>
</span>On at least one AArch64 implementation, you mean?<br>
<span class=""><br>
> 2. According to JSR133 cook book, it only requires storestore<br>
> barrier. Are there some corner cases needs loadstore barrier?<br>
> 3. In C1 implementation (GraphBuilder::method_return), it only<br>
> inserts storestore barrier (lir_membar_storestore), barrier for<br>
> stable field in C1 is missing, maybe we need add memory barrier in<br>
> C1 too for stable field?<br>
<br>
</span>Probably, but C1 is much more conservative with its optimizations.<br>
<span class=""><br>
> Browsing hotspot repository history, is this an early conservative<br>
> handling which not updated yet?<br>
> 1. MemBarRelease is used for final field store since first hotspot<br>
> version. At that time, MemBarStoreStore is not defined yet.<br>
> 2 .MemBarStoreStore is added later for barrier after object<br>
> allocation and array copy<br>
> (<a href="http://hg.openjdk.java.net/aarch64-port/jdk8/hotspot/rev/1dc233a8c7fe" rel="noreferrer" target="_blank">http://hg.openjdk.java.net/aarch64-port/jdk8/hotspot/rev/1dc233a8c7fe</a>)<br>
<br>
</span>StoreStore is fine for object allocation; any other field writes<br>
should probably use a release.  But this part of C2 is extremely<br>
delicate, and various parts of it "know" in what circumstances<br>
StoreStore is used, and know that those circumstances are very<br>
limited.<br>
<span class=""><br>
> This is not true for MemBar node after final fields store, whose<br>
> MemBarNode::Precedent input is initialized with<br>
> _alloc_with_final. Checking Parse::do_put_xxx<br>
<br>
> 1. _alloc_with_final might not be set. For example object type is<br>
> not boxed type.<br>
> 2. _alloc_with_final is set with store obj node, this usually is<br>
> CheckCastPP instead of<br>
> allocation->proj_out(AllocateNode::RawAddress). if not align with<br>
> MemBarStoreStore 's assumption, this will trigger assertion in above<br>
> ConnectionGraph::optimize_ideal_graph code.<br>
><br>
> In attached patch, changes include:<br>
<br>
</span>I'd really like you to attach your patches more firmly or use a web<br>
site!<br>
<br>
But really, I'm not going to accept a weakening of the barrier because of<br>
"Why ordering constraints are never limited to loads or stores"<br>
<span class="HOEnZb"><font color="#888888"><br>
Andrew.<br>
</font></span></blockquote></div><br></div>