[aarch64-port-dev ] RFR: 8144993: Elide redundant memory barrier after AllocationNode

Aleksey Shipilev aleksey.shipilev at oracle.com
Tue Dec 15 09:05:44 UTC 2015


Also, I think this is a duplicate of:
 https://bugs.openjdk.java.net/browse/JDK-8032481

-Aleksey

On 12/15/2015 05:40 AM, Vladimir Kozlov wrote:
> Very interesting!
> 
> Please, add short statement to the comment in /macro.cpp for your case.
> 
> Changes looks fine to me. One nit could be to delay bytecode analysis
> until macro expansion - it may reduce compilation time. Bytecode
> analysis of each constructor could be expensive.
> 
> Thanks,
> Vladimir
> 
> On 12/10/15 6:48 AM, Hui Shi wrote:
>> Hi All,
>>
>>
>> Could some one help comments this change?
>>
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8144993
>>
>> webrev: http://cr.openjdk.java.net/~hshi/8144993/webrev/
>>
>>
>> This patch aims to remove redundant memory barrier after allocation
>> node, on AArch64 it removes redundant dmb when creating object. The
>> motivation is dmb instructions after commonly used object allocation,
>> for example string and boxing objects is redundant with dmb inserted for
>> final field write. In following small case:____
>>
>> __ __
>>
>> String foo(String s)____
>>
>> {____
>>
>>     String copy = new String(s);____
>>
>>     return copy;____
>>
>> }____
>>
>> __ __
>>
>> There are two dmb instructions in generated code. First one is
>> membar_storestore, inserted in PhaseMacroExpand::expand_allocate_common.
>> Second one is membar_release, inserted at exit of initializer method as
>> final fields write happens. Allocated String doesn't escape in String
>> initializer method, membar_release includes membar_storestore semantic.
>> So first one can be removed safely.____
>>
>> __ __
>>
>>    0x0000007f85bbfa8c: prfm      pstl1keep, [x11,#256]____
>>
>>    0x0000007f85bbfa90: str       xzr, [x0,#16]____
>>
>>    0x0000007f85bbfa94: dmb       ishst        // first dmb to remove____
>>
>>    ....____
>>
>> ____
>>
>>    0x0000007fa01d83c0: ldrsb     w10, [x20,#20]____
>>
>>    0x0000007fa01d83c4: ldr       w12, [x20,#16]____
>>
>>    0x0000007fa01d83c8: ldr       x11, [sp,#8]____
>>
>>    0x0000007fa01d83cc: strb      w10, [x11,#20]____
>>
>>    0x0000007fa01d83d0: str       w12, [x11,#16]____
>>
>>    0x0000007fa01d83d4: dmb       ish        // second dmb____
>>
>> __ __
>>
>>
>> Patch targets this pattern and remove redundant memory barrier for
>> allocation node.____
>>
>> 1. When inserting memory barrier for final field write. If final fields'
>> object allocation node is available, invoke
>> AllocationNode::compute_MemBar_redundancy(initializer method).____
>>
>> 2. In AllocationNode:____
>>
>>      2.1 Add a new field _is_allocation_MemBar_redundant flag indicate
>> if memory barrier after allocation node is redundant.____
>>
>>     2.2 Add method compute_MemBar_redundancy, set
>>   _is_allocation_MemBar_redundant true if first parameter "this" does
>> not escape in initializer method according to BCEscapeAnalyzer.____
>>
>> 3. skip inserting memory barrier in
>> PhaseMacroExpand::expand_allocate_common, when AllocationNode's
>> _is_allocation_MemBar_redundant flagis true.
>>
>>
>> Regards
>>
>> Hui
>>




More information about the aarch64-port-dev mailing list