<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=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@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:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
p
        {mso-style-priority:99;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:"Courier New";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle23
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle24
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle25
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle26
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Hi Folks,<br>
<br>
I would like to contribute multi-versioning post loops for range check elimination.  Beforehand cfg optimizations after register allocation were where post loop optimizations were done for range checks.  I have added code which produces the desired effect much
 earlier by introducing a safe transformation which will minimally allow a range check free version of the final post loop to execute up until the point it actually has to take a range check exception by re-ranging the limit of the rce’d loop, then exit the
 rce’d post loop and take the range check exception in the legacy loops execution if required.  If during optimization we discover that we know enough to remove the range check version of the post loop, mostly by exposing the load range values into the limit
 logic of the rce’d post loop, we will eliminate the range check post loop altogether much like cfg optimizations did, but much earlier.  This gives optimizations like programmable SIMD (via SuperWord) the opportunity to vectorize the rce’d post loops to a
 single iteration based on mask vectors which map to the residual iterations. Programmable SIMD will be a follow on change set utilizing this code to stage its work. This optimization also exposes the rce’d post loop without flow to other optimizations.  Currently
 I have enabled this optimization for x86 only.  We base this loop on successfully rce’d main loops and if for whatever reason, multiversioning fails, we eliminate the loop we added.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">This code was tested as follows:<o:p></o:p></p>
<p class="MsoNormal"><br>
Bug-id: <a href="https://bugs.openjdk.java.net/browse/JDK-8151573">https://bugs.openjdk.java.net/browse/JDK-8151573</a>
<o:p></o:p></p>
<p class="MsoPlainText"><br>
webrev:<o:p></o:p></p>
<p class="MsoNormal"><a href="http://cr.openjdk.java.net/~mcberg/8151573/webrev.01/">http://cr.openjdk.java.net/~mcberg/8151573/webrev.01/</a>
<o:p></o:p></p>
<p class="MsoNormal"><span style="background:white"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="background:white">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="background:white">Michael</span><o:p></o:p></p>
</div>
</body>
</html>