<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class="">Dmitry,</div><div class=""><br class=""></div><div class="">After some digging around I think your original fix is ok. In addition to !_LP64 can you add ifdef X86?</div><div class=""><span style="orphans: 2; text-align: -webkit-auto; widows: 2; -webkit-text-decorations-in-effect: none;" class=""><br class=""></span></div><div class=""><span style="orphans: 2; text-align: -webkit-auto; widows: 2; -webkit-text-decorations-in-effect: none;" class="">igor</span></div><div class=""><span style="border-collapse: separate; font-variant-ligatures: normal; font-variant-east-asian: normal; font-variant-position: normal; line-height: normal; border-spacing: 0px; -webkit-text-decorations-in-effect: none;" class="Apple-style-span"><br class=""><br class=""></span>

</div>
<div><br class=""><blockquote type="cite" class=""><div class="">On Mar 6, 2019, at 3:07 AM, Dmitry Cherepanov <<a href="mailto:dcherepanov@azul.com" class="">dcherepanov@azul.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Igor,<br class=""><br class="">Sorry for the delay in responding.<br class=""><br class="">I updated comp_op (in c1_LIRAssembler_x86.cpp) to make use of tmp1 for this case. The changes: <a href="http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.03/" class="">http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.03/</a><br class=""><br class="">For this change, I got assertion failed (from cpu_regnrLo, in c1_LIR.hpp). Sorry if this is an obvious question - Am I correctly understand that another part of this solution should be an additional change that would allocate tmp1? Or is there an existing code that should take care of it already and just need to enable the allocation of tmp1 for this case?<br class=""><br class="">Another question: given that this is a major issue on x86 32bit system, would you mind if we proceed with the current minimal/low-risk fix (<a href="http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.01/" class="">http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.01/</a>) and create new JBS issue to investigate more generic approach separately?<br class=""><br class="">Thanks,<br class=""><br class="">Dmitry<br class=""><br class=""><blockquote type="cite" class="">On Oct 2, 2018, at 8:09 PM, Igor Veresov <<a href="mailto:igor.veresov@oracle.com" class="">igor.veresov@oracle.com</a>> wrote:<br class=""><br class="">Right, I forgot how it works. Sorry for the confusion. I think there is no way to explicitly describe a register kill in C1. I guess the only option is to just avoid clobbering opr1. So may be we should make use of tmp1 for lir_cmp to save/restore opr1? Again, tmp1 would have to be allocated only for this particular case.<br class=""><br class="">igor<br class=""><br class=""><br class=""><br class=""><blockquote type="cite" class="">On Oct 1, 2018, at 7:15 AM, Dmitry Cherepanov <<a href="mailto:dcherepanov@azul.com" class="">dcherepanov@azul.com</a>> wrote:<br class=""><br class="">Hi Igor,<br class=""><br class="">Thanks for the suggestions. I tried to make the opr1 a temporary<br class=""><br class=""><a href="http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.02/" class="">http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.02/</a><br class=""><br class="">but the generated code still has the problem. Looking into the log with -XX:TraceLinearScanLevel=4 (http://cr.openjdk.java.net/~dcherepanov/8211100/TraceLinearScanLevel.02.log) seems like the reason for this is that the opr1 (virtual register R165 in the log) is also an input operand and its range becomes wider and the shorter ranges (corresponding to the opr1 marked as temp) are merged to the single range. Can the input operand be temporary at the same time?<br class=""><br class="">Dmitry<br class=""><br class=""><blockquote type="cite" class="">On Sep 27, 2018, at 2:18 AM, Igor Veresov <igor.veresov@oracle.com> wrote:<br class=""><br class="">Edit: It may be more consistent to check for is_double_cpu() instead of T_LONG. Although that’s semantically equivalent.<br class=""><br class=""><blockquote type="cite" class="">On Sep 26, 2018, at 9:35 AM, Igor Veresov <igor.veresov@oracle.com> wrote:<br class=""><br class="">It doesn’t seem to me like the proper way to fix it. The problem is that the cmp is destroying opr1 without telling the register allocator about it.<br class=""><br class="">One possible solution would be to make opr1 also a temp (see LIR_OpVisitState::visit(LIR_Op* op) in c1_LIR.cpp), only for x86 32bit and only if the operand type is T_LONG. <br class="">Another solution is to maintain a temporary register for lir_cmp and use it to save/restore opr1 when emitting the code in LIR_Assembler::comp_op(). Again, the temporary register has to be there only for x86 32bit and T_LONG.<br class=""><br class="">igor<br class=""><br class=""><br class=""><blockquote type="cite" class="">On Sep 26, 2018, at 1:29 AM, Tobias Hartmann <tobias.hartmann@oracle.com> wrote:<br class=""><br class="">Hi Dmitry,<br class=""><br class="">this looks good to me but Igor (who implemented 8201447) should have a look as well.<br class=""><br class="">Best regards,<br class="">Tobias<br class=""><br class="">On 26.09.2018 09:04, Dmitry Cherepanov wrote:<br class=""><blockquote type="cite" class="">Hi Tobias,<br class=""><br class="">Thanks for the review, updated patch avoids the additional move on x86_64 and includes the<br class="">regression test.<br class=""><br class="">http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.01/<br class=""><http://cr.openjdk.java.net/%7Edcherepanov/8211100/webrev.01/><br class=""><br class="">Dmitry<br class=""><br class=""><blockquote type="cite" class="">On Sep 25, 2018, at 6:40 PM, Tobias Hartmann <tobias.hartmann@oracle.com<br class=""><mailto:tobias.hartmann@oracle.com>> wrote:<br class=""><br class="">Hi Dmitry,<br class=""><br class="">Shouldn't this at least be guarded by an #ifndef _LP64 to avoid the additional move on x86_64?<br class=""><br class="">Could you please add the regression test to the webrev? Or did this reproduce with other tests?<br class=""><br class="">Thanks,<br class="">Tobias<br class=""><br class="">On 25.09.2018 16:00, Dmitry Cherepanov wrote:<br class=""><blockquote type="cite" class="">Hello,<br class=""><br class="">Please review a patch that resolves issue in x86 32bit builds. It slightly adjusts the fix for<br class="">JDK-8201447 (C1 does backedge profiling incorrectly) by creating a copy of the left operand and<br class="">using it for incrementing backedge counter.<br class=""><br class="">JBS issue: https://bugs.openjdk.java.net/browse/JDK-8211100<br class="">webrev: http://cr.openjdk.java.net/~dcherepanov/8211100/webrev.00/<br class=""><http://cr.openjdk.java.net/%7Edcherepanov/8211100/webrev.00/><br class=""><br class="">Thanks,<br class=""><br class="">Dmitry<br class=""></blockquote></blockquote></blockquote></blockquote><br class=""></blockquote><br class=""></blockquote><br class=""></blockquote><br class=""></blockquote><br class=""></div></div></blockquote></div><br class=""></body></html>