<div dir="ltr"><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif">Hi All,</p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><br></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif">Could some one help comments this change?</p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><br></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif">Bug:  <a href="https://bugs.openjdk.java.net/browse/JDK-8144993" target="_blank">https://bugs.openjdk.java.net/browse/JDK-8144993</a></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif">webrev:  <a href="http://cr.openjdk.java.net/~hshi/8144993/webrev/" target="_blank">http://cr.openjdk.java.net/~hshi/8144993/webrev/</a></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"><br></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">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:<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">String foo(String s)<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">{<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">   String copy = new String(s);<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">   return copy;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">}<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">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.<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007f85bbfa8c: prfm      pstl1keep, [x11,#256]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007f85bbfa90: str       xzr, [x0,#16]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007f85bbfa94: dmb       ishst        // first dmb to remove<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  ....<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"> <u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83c0: ldrsb     w10, [x20,#20]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83c4: ldr       w12, [x20,#16]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83c8: ldr       x11, [sp,#8]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83cc: strb      w10, [x11,#20]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83d0: str       w12, [x11,#16]<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">  0x0000007fa01d83d4: dmb       ish        // second dmb<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><br></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">Patch targets this pattern and remove redundant memory barrier for allocation node.<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">1. When inserting memory barrier for final field write. If final fields' object allocation node is available, invoke AllocationNode::compute_MemBar_redundancy(initializer method).<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">2. In AllocationNode:<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">    2.1 Add a new field _is_allocation_MemBar_redundant flag indicate if memory barrier after allocation node is redundant.<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">   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.<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span lang="EN-US">3. skip inserting memory barrier in PhaseMacroExpand::expand_allocate_common, when AllocationNode's  </span>_is_allocation_MemBar_redundant flag<span style="font-size:10.5pt"> </span><span style="font-size:10.5pt">is true.</span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span style="font-size:10.5pt"><br></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span style="font-size:10.5pt">Regards</span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;text-align:justify;font-size:10.5pt;font-family:Calibri,sans-serif"><span style="font-size:10.5pt">Hui</span></p></div>