<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0cm;
        mso-margin-bottom-alt:auto;
        margin-left:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.apple-converted-space
        {mso-style-name:apple-converted-space;}
span.EmailStyle20
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="DE" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="mso-fareast-language:EN-US">Hi Igor,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">I understand that there are more important things to work on at the moment. Thanks for taking some time for reviewing my proposal.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">With JVMTI “can_access_local_variables”, should_retain_local_variables() is true which keeps locals alive (ciMethod::liveness_at_bci) until they get reused (or a conflicting type).<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">(For debugging, locals need to get kept alive within their scopes, but scope information may not be available, so C1 needs to be conservative enough.)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">So “can_access_local_variables” causes the “for_each_local_value” iterator to find locals which would otherwise have been considered dead out after their last usage.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">In my schematic example, C1 calls setup_phi_for_local for the object in line 803 in recent c1_Instruction.cpp when coming from Block 1. When coming from Block 2, C1 reaches line 832
 because “existing_state->is_same(new_state)”. The code after line 847 is not used.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Best regards,<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Martin<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Igor Veresov <igor.veresov@oracle.com>
<br>
<b>Sent:</b> Donnerstag, 13. Dezember 2018 00:03<br>
<b>To:</b> Doerr, Martin <martin.doerr@sap.com><br>
<b>Cc:</b> hotspot-compiler-dev@openjdk.java.net<br>
<b>Subject:</b> Re: RFR(S): 8214352: C1: Unnecessary "compilation bailout: block join failed" with JVMTI (off-list)<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Martin,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Sorry I’ve got distracted from this review. I’m trying to understand why the phi is created in the first place. There is a code just below your change in c1_Instruction.cpp that should invalidate the local. Have you found out why doesn’t
 it work?<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span class="apple-style-span"><span style="font-family:"Helvetica",sans-serif;color:black">igor</span></span><span style="font-family:"Helvetica",sans-serif;color:black"><br>
<br>
<br>
<br>
</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">On Dec 10, 2018, at 5:24 AM, Doerr, Martin <<a href="mailto:martin.doerr@sap.com">martin.doerr@sap.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">Hi Igor,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">just let me know if you need more explanations. I know, the change is small, but not trivial.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">I can target this enhancement to jdk13 if you don’t have time at the moment even though it is tested very well.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">The real life bailouts seem to be hard to analyze, but they can be observed often:</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">jdk/bin/java -XX:+PrintBailouts -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n -Djava.io.tmpdir=results -jar OctaneLauncher.jar</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">starting runNashorn.js</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Richards: 95.9</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">DeltaBlue: 71.9</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Crypto: 315</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">RayTrace: 320</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">EarleyBoyer: 652</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: too many stack slots used</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">RegExp: 268</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: too many stack slots used</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Splay: 356</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">SplayLatency: 228</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">NavierStokes: 450</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: CodeBuffer overflow</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: CodeBuffer overflow</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: CodeBuffer overflow</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">compilation bailout: block join failed</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">… (also many other bailout reasons)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">The “compilation bailout: block join failed” completely disappear with my change, so I still think this change is worth the effort.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Best regards,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Martin</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<div>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span class="apple-converted-space"><span lang="EN-US"> </span></span><span lang="EN-US">hotspot-compiler-dev <<a href="mailto:hotspot-compiler-dev-bounces@openjdk.java.net"><span style="color:purple">hotspot-compiler-dev-bounces@openjdk.java.net</span></a>><span class="apple-converted-space"> </span><b>On
 Behalf Of<span class="apple-converted-space"> </span></b>Doerr, Martin<br>
<b>Sent:</b><span class="apple-converted-space"> </span>Dienstag, 4. Dezember 2018 18:46<br>
<b>To:</b><span class="apple-converted-space"> </span>Igor Veresov <<a href="mailto:igor.veresov@oracle.com"><span style="color:purple">igor.veresov@oracle.com</span></a>><br>
<b>Cc:</b><span class="apple-converted-space"> </span>Vladimir Kozlov <<a href="mailto:vladimir.kozlov@oracle.com"><span style="color:purple">vladimir.kozlov@oracle.com</span></a>>;<span class="apple-converted-space"> </span><a href="mailto:hotspot-compiler-dev@openjdk.java.net"><span style="color:purple">hotspot-compiler-dev@openjdk.java.net</span></a><br>
<b>Subject:</b><span class="apple-converted-space"> </span>[CAUTION] RE: RFR(S): 8214352: C1: Unnecessary "compilation bailout: block join failed" with JVMTI</span><o:p></o:p></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Hi Igor,</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">thank you for looking at my proposal.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Let me try to explain it by a schematic example.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Block 1</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">local 1 used for some object (assignment and usage)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Block 2</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">local 1 used for an int (assignment and usage)</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">loop: if ... goto Block 2</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">C1 creates a Phi function (with input local 1 of type object) when looking at the edge from Block 1 to Block 2 (GraphBuilder::iterate_bytecodes_for_block => BlockBegin::try_merge => setup_phi_for_local).</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">When looking at the backedge (the loop in Block 2), BlockBegin::try_merge sees the "existing_value" of type object and the "new_value" of type int coming from the backedge.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">This is the point at which we know that we are beyond the life ranges of local l. It's dead because a life local can't have conflicting types.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">I think the appropriate treatment is to invalidate the local and the Phi function. Seems like an old version had already done this according to the comment "The old code invalidated the phi function here" probably because
 linear scan had issues and the problematic case was rare enough (without JVMTI). But now we have a bailout in LIRGenerator::move_to_phi which handles the really problematic case, so we can use the invalidation in BlockBegin::try_merge again which is far better
 when using JVMTI.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">AFAIK, this matches what C2 would do.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US">Hope this makes it more clear. Let me know if I missed anything.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-US"> </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks and best regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Martin<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<div>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span class="apple-converted-space"><span lang="EN-US"> </span></span><span lang="EN-US">Igor Veresov <<a href="mailto:igor.veresov@oracle.com"><span style="color:purple">igor.veresov@oracle.com</span></a>><span class="apple-converted-space"> </span><br>
<b>Sent:</b><span class="apple-converted-space"> </span>Dienstag, 4. Dezember 2018 18:13<br>
<b>To:</b><span class="apple-converted-space"> </span>Doerr, Martin <<a href="mailto:martin.doerr@sap.com"><span style="color:purple">martin.doerr@sap.com</span></a>><br>
<b>Cc:</b><span class="apple-converted-space"> </span>Vladimir Kozlov <<a href="mailto:vladimir.kozlov@oracle.com"><span style="color:purple">vladimir.kozlov@oracle.com</span></a>>;<span class="apple-converted-space"> </span><a href="mailto:hotspot-compiler-dev@openjdk.java.net"><span style="color:purple">hotspot-compiler-dev@openjdk.java.net</span></a><br>
<b>Subject:</b><span class="apple-converted-space"> </span>Re: RFR(S): 8214352: C1: Unnecessary "compilation bailout: block join failed" with JVMTI</span><o:p></o:p></p>
</div>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">So how and why does it happen that a phi has different input types?<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span class="apple-style-span"><span style="font-family:"Helvetica",sans-serif">igor</span></span><span style="font-family:"Helvetica",sans-serif"><br>
<br>
<br>
<br>
</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt"> <o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal">On Dec 3, 2018, at 2:24 AM, Doerr, Martin <<a href="mailto:martin.doerr@sap.com"><span style="color:purple">martin.doerr@sap.com</span></a>> wrote:<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal" style="margin-bottom:12.0pt">Hi Vladimir,<br>
<br>
thanks for reviewing. I hope a C1 expert can find some time to take a look.<br>
<br>
Best regards,<br>
Martin<br>
<br>
<br>
-----Original Message-----<br>
From: hotspot-compiler-dev <<a href="mailto:hotspot-compiler-dev-bounces@openjdk.java.net"><span style="color:purple">hotspot-compiler-dev-bounces@openjdk.java.net</span></a>> On Behalf Of Vladimir Kozlov<br>
Sent: Sonntag, 2. Dezember 2018 01:50<br>
To:<span class="apple-converted-space"> </span><a href="mailto:hotspot-compiler-dev@openjdk.java.net"><span style="color:purple">hotspot-compiler-dev@openjdk.java.net</span></a><br>
Subject: Re: RFR(S): 8214352: C1: Unnecessary "compilation bailout: block join failed" with JVMTI<br>
<br>
Seems fine to me but I am not C1 expert.<br>
<br>
Regards,<br>
Vladimir<br>
<br>
On 11/27/18 3:03 AM, Doerr, Martin wrote:<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal" style="margin-bottom:12.0pt">Hi,<br>
<br>
C1 currently bails out when a local value is derived from a Phi with different types.<br>
<br>
According to comments, this case is supposed to be very rare, but it's not so rare when a JVMTI agent is used<span class="apple-converted-space"> </span><br>
(capability "can_access_local_variables").<br>
<br>
I'd like to fix this.<br>
<br>
Issue with more detailed description:<br>
<br>
<a href="https://bugs.openjdk.java.net/browse/JDK-8214352"><span style="color:purple">https://bugs.openjdk.java.net/browse/JDK-8214352</span></a><br>
<br>
Webrev:<br>
<br>
<a href="http://cr.openjdk.java.net/~mdoerr/8214352_c1_phi/webrev.00/"><span style="color:purple">http://cr.openjdk.java.net/~mdoerr/8214352_c1_phi/webrev.00/</span></a><span class="apple-converted-space"> </span><br>
<<a href="http://cr.openjdk.java.net/%7Emdoerr/8214352_c1_phi/webrev.00/"><span style="color:purple">http://cr.openjdk.java.net/%7Emdoerr/8214352_c1_phi/webrev.00/</span></a>><br>
<br>
Patch successfully ran through a substantial amount of tests with enabled "can_access_local_variables". Please review.<br>
<br>
Best regards,<br>
<br>
Martin<o:p></o:p></p>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>