<div dir="ltr">Hi Kris,<div><br></div><div>I guess that without the line<div><br></div><div><span style="font-size:12.571428298950195px"><font face="courier new, monospace">if (a.length == 0) throw new Exception();</font></span><br>
</div><div><span style="font-family:arial,sans-serif;font-size:12.571428298950195px"><br></span></div><div style><span style="font-family:arial,sans-serif;font-size:12.571428298950195px">it looks the same (just throwing another Exception), right?</span></div>
<div><span style="font-family:arial,sans-serif;font-size:12.571428298950195px"><br></span></div></div><div style><span style="font-family:arial,sans-serif;font-size:12.571428298950195px">Regards, Martin.</span></div></div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Feb 13, 2014 at 9:18 AM, Krystal Mok <span dir="ltr">&lt;<a href="mailto:rednaxelafx@gmail.com" target="_blank">rednaxelafx@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi John,<div><br></div><div>Nice to hear from you!</div><div><br></div><div>I ran a couple of tests on the patch, one of them is:</div>
<div><br></div><div><div>public class ArrayRangeCheck {</div><div>  private static Object foo(Object[] a, int x) throws Exception {</div>
<div>    if (a.length == 0) throw new Exception();</div><div>    return a[x &amp; (a.length - 1)];</div><div>  }</div><div>  </div><div>  public static void main(String[] args) throws Exception {</div><div>    Object[] a = new Object[8];</div>

<div>    foo(a, 6);</div><div>    foo(a, 6);</div><div>    System.in.read();</div><div>  }</div><div>}</div></div><div><br></div><div>Ran with:</div><div><br></div><div>$ java -XX:CompileCommand=&quot;compileonly ArrayRangeCheck foo&quot; -XX:-TieredCompilation -XX:CICompilerCount=1 -XX:CompileThreshold=1 -XX:PrintIdealGraphLevel=4 -XX:PrintIdealGraphFile=ideal.xml -XX:+PrintCompilation -XX:+PrintAssembly ArrayRangeCheck<br>

</div><div><br></div><div>And confirmed that in this case the range check is indeed elided: there&#39;s only one a.length != 0 check dominating the actual element load, and the else branch goes to the exception throwing code.</div>

<div><br></div><div>Thanks,</div><div>Kris</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Feb 12, 2014 at 9:47 PM, John Rose <span dir="ltr">&lt;<a href="mailto:john.r.rose@oracle.com" target="_blank">john.r.rose@oracle.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div>One point behind the bug report is to give a little reward to Java coders who write dominating tests that exclude a.length==0, as:</div>

<div><br></div><div> if (a.length == 0) goAway();</div><div> else return a[i &amp; a.length-1];</div><div><br></div><div>Kris, can your patch do this?  The logic in IfNode can probably elide the duplicate dominating test, if the right normalizations occur.  😀</div>

<span><font color="#888888"><div><br>– John</div></font></span><div><div><br>On Feb 12, 2014, at 6:05 PM, Martin Grajcar &lt;<a href="mailto:maaartinus@gmail.com" target="_blank">maaartinus@gmail.com</a>&gt; wrote:<br>
<br></div><blockquote type="cite">That&#39;s what I&#39;ve meant with <font face="courier new, monospace">goAway</font>. My point was the jump using already computed flags</blockquote></div></div></blockquote></div><br></div>

</div></div></blockquote></div><br></div>