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