<div><br></div>This must be a hotspot bug, Tom, it&#39;s insane. So.<div><br></div><div>I&#39;ve created a branch to run all the tests in sequence and dump loop counters to stdout. There&#39;s also -XX:PrintCompilation so that you can see what got compiled. So, do these:</div>

<div><br></div><div>git pull</div><div>git co JVM_BUG</div><div><br></div><div>the problematic loop now looks like this:</div><div><br></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            int c0, c1 = 0;</font></div>

</div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            // ...</font></div><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            for (c0 = ALPHABET_SIZE - 2, j = m; 0 &lt; j; --c0)</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                for (c1 = ALPHABET_SIZE - 1; c0 &lt; c1; j = i, --c1)</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    System.err.println(&quot;C0: &quot; + c0 + &quot; C1: &quot; + c1);</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    i = bucket_B[(c0) * ALPHABET_SIZE + (c1)];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    if (1 &lt; (j - i))</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        ssSort(PAb, i, j, buf, bufsize, 2, n, SA[i] == (m - 1));</font></div>

<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                    }</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                }</font></div><div>

<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">            }</font></div></div><div><br></div><div>even not knowing what other elements are, c0 and c1 are local variables that are not modified anywhere inside the loop other than decremented on every loop run (inside and outside). The output is as one would expect, from the start:</div>

<div><br></div><div><div>C0: 254 C1: 255</div><div>C0: 253 C1: 255</div><div>C0: 253 C1: 254</div><div>C0: 252 C1: 255</div><div>C0: 252 C1: 254</div><div>C0: 252 C1: 253</div><div>...</div></div><div><br></div><div>so both counters are decrement... until this happens (run 1):</div>

<div><br></div><div>...</div><div><div>C0: 74 C1: 77</div><div>C0: 74 C1: 76</div><div>C0: 74 C1: 75</div><div>C0: 254 C1: 255</div><div>C0: 254 C1: 255</div><div>[forever]</div></div><div><br></div><div>And run2, for example:</div>

<div>...</div><div><div>C0: 68 C1: 70</div><div>C0: 68 C1: 69</div><div>C0: 254 C1: 255</div><div>C0: 254 C1: 255</div><div>C0: 254 C1: 255</div></div><div><br></div><div>note that counter values:</div><div><br></div><div>

<div>C0: 254 C1: 255</div><div><br></div></div><div>are actually what it all started with, but why it&#39;d never decrement again is beyond me.</div><div><br></div><div>The compilation dump shows that nothing special happens before the code falls into an endless loop (I assume stdout writes are sequential when they go via Maven&#39;s test plugin, but don&#39;t know for sure).</div>

<div><br></div><div>I also checked with:</div><div><br></div><div><div>java version &quot;1.7.0-ea&quot;</div><div>Java(TM) SE Runtime Environment (build 1.7.0-ea-b104)</div><div>Java HotSpot(TM) 64-Bit Server VM (build 19.0-b05, mixed mode)</div>

</div><div><br></div><div>and it exhibits the same problem. Sadly, I don&#39;t know how to use gdb to hack into a running VM instance to inspect what is actually happening, but if I can be of any further help, let me know.</div>

<div><br></div><div>Dawid</div><div><br><div class="gmail_quote">On Thu, Mar 3, 2011 at 10:39 PM, Dawid Weiss <span dir="ltr">&lt;<a href="mailto:dawid.weiss@gmail.com">dawid.weiss@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> </div><div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Inserting the breakpoint would deopt the code and you&#39;ll resume in the interpreter so you&#39;ll end up avoiding the JITed code which presumably is where the bug is.<br>


</blockquote><div><br></div></div><div>Yep, I realize this is the case, I even mentioned it in my original post. Let me double check that we&#39;re not doing something non-deterministic first though... but if you&#39;d like to try then...</div>

<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>I agree.  It sounds like we&#39;re screwing up the bounds somehow.  Is there a jar file I can grab to run this test easily?</div>


</blockquote><div><br></div></div><div>Mind this is happening infrequently (but on different machines, different OSs, etc.).  Here&#39;s the procedure:</div><div><br></div><div>git clone git@github.com:carrotsearch/jsuffixarrays.git</div>


<div>cd jsuffixarrays</div><div># while (true)? {</div><div>mvn test</div><div># }</div><div><br></div><div>I&#39;ve just done the above and it hung on the first execution... the next one it didn&#39;t, the third one it did again. So maybe it is happening more frequently than less. The JRE I did it on is:</div>


<div><br></div><div><div>java version &quot;1.6.0_20&quot;</div><div>Java(TM) SE Runtime Environment (build 1.6.0_20-b02)</div><div>Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01, mixed mode)</div></div><div><br></div>


<div>But it applies to newer versions as well.</div><div><br></div><div>The particular class that is causing this is DivSufSort (DivSufSortTest), but I don&#39;t know what causes this to happen, so I&#39;d run all of them (these are parallel testng tests).</div>


<div> </div><div>I also didn&#39;t check with the trunk HotSpot, so it may be something that&#39;s already been fixed.</div><div><br>Dawid</div></div><br>
</blockquote></div><br></div>