<div dir="ltr">Thanks, Vladimir!</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 28, 2016 at 9:47 AM, Vladimir Kozlov <span dir="ltr"><<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 9/27/16 1:57 PM, Chuck Rasbold wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Sorry for not being transparent enough.  Here's an external reference<br>
that describes the problem<br>
that is being encountered by the division:<br>
<br>
<a href="https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Signed-Integer-Division.html" rel="noreferrer" target="_blank">https://www.gnu.org/software/a<wbr>utoconf/manual/autoconf-2.67/h<wbr>tml_node/Signed-Integer-Divisi<wbr>on.html</a><br>
<br>
That's why the original fix targeted a very specific case.  One can't<br>
represent ratio_con as a 32 bit value in that case.<br>
Worse, trying to compute it by division causes a SIGFPE.<br>
<br>
Do you think the revised code below is as straightforward as the original?<br>
</blockquote>
<br></span>
Okay, looks like it is very special only one case and not a range of cases. Lets use your original fix then.<br>
<br>
I will sponsor it.<br>
<br>
Thanks,<br>
Vladimir<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
<br>
-- Chuck<br>
<br>
On Tue, Sep 27, 2016 at 9:48 AM, Vladimir Kozlov<br></span><span class="">
<<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a> <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>>> wrote:<br>
<br>
    So why it is SIGFPE when both values are 'int'?<br>
<br>
    I thought it is incorrect results cause SIGFPE that is why I<br>
    suggested to check for integer overflow.<br>
<br>
    Lets then go with your second suggested change here. But let check<br>
    that ratio is small first and do cast to (jint) otherwise the long<br>
    check is useless:<br>
<br>
      // The ratio of the two strides cannot be represented as an int<br>
      // if stride_con2 is min_int and stride_con is -1.<br>
      jlong ratio_conl = ((jlong)stride_con2 / stride_con);<br>
<br>
      if ((ratio_conl < 0x80000000L) &&<br>
          (jint)(ratio_conl * stride_con) == stride_con2) { // Check for<br>
    exact<br>
         jint ratio_con = (jint)ratio_conl;<br>
<br>
    Thanks,<br>
    Vladimir<br>
<br>
    On 9/27/16 7:56 AM, Chuck Rasbold wrote:<br>
<br>
<br>
<br>
        On Mon, Sep 26, 2016 at 5:35 PM, Vladimir Kozlov<br>
        <<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a> <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>><br></span><div><div class="h5">
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>>>> wrote:<br>
<br>
            Slightly different (cast after /) and jlong type:<br>
<br>
              jlong ratio_conl = (jlong) (stride_con2 / stride_con);<br>
<br>
<br>
        The division above won't work (at least, it raises a SIGFPE on<br>
        my Linux<br>
        x86 platform) when stride_con2 == min_jint   and stride_con == -1.<br>
<br>
<br>
              if ((ratio_conl * stride_con) == (jlong)stride_con2) { //<br>
        Check<br>
            for exact<br>
<br>
<br>
        What would be the value of ratio_conl such that this test fails?  I<br>
        think I'm missing something...<br>
<br>
        -- Chuck<br>
<br>
<br>
            Vladimir<br>
<br>
            On 9/26/16 5:01 PM, Chuck Rasbold wrote:<br>
<br>
                Just to confirm, are you suggesting that the ratio be first<br>
                computed as a 64 bit quantity, effectively along the<br>
        lines of...<br>
<br>
                   long ratio_conl = ((long) stride_con2) / stride_con;<br>
<br>
                   if ((ratio_conl * stride_con) == stride_con2 &&<br>
                       ratio_conl < 0x8000000 ) { // Check for exact<br>
                     int ratio_con = (int) ratio_conl;<br>
<br>
<br>
                On Mon, Sep 26, 2016 at 3:45 PM, Vladimir Kozlov<br>
                <<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle.com</a><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>>><br>
                <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>><br>
                <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a><br>
        <mailto:<a href="mailto:vladimir.kozlov@oracle.com" target="_blank">vladimir.kozlov@oracle<wbr>.com</a>>>>> wrote:<br>
<br>
                    Hi Chuck<br>
<br>
                    Can you do 'long' arithmetic in existing condition<br>
        to catch<br>
                integer overflow instead?<br>
<br>
                    if ((ratio_con * stride_con) == stride_con2) { //<br>
        Check for<br>
                exact<br>
<br>
                    thanks,<br>
                    Vladimir<br>
<br>
<br>
<br>
                    On 9/26/16 3:18 PM, Chuck Rasbold wrote:<br>
<br>
                        A small fix for an edge case crash in C2...<br>
<br>
                        Bug:<br>
        <a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net/<wbr>browse/JDK-8166742</a><br>
        <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a>><br>
                <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a><br>
        <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a>>><br>
                <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a><br>
        <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a>><br>
                <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a><br>
        <<a href="https://bugs.openjdk.java.net/browse/JDK-8166742" rel="noreferrer" target="_blank">https://bugs.openjdk.java.net<wbr>/browse/JDK-8166742</a>>>><br>
                        Webrev:<br>
                <a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~ra<wbr>sbold/8166742/webrev.00/</a><br>
        <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a>><br>
                <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a><br>
        <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a>>><br>
                <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a><br>
        <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a>><br>
                <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a><br>
        <<a href="http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/" rel="noreferrer" target="_blank">http://cr.openjdk.java.net/~r<wbr>asbold/8166742/webrev.00/</a>>>><br>
<br>
                        Requesting a sponsor and reviews.  Thanks.<br>
<br>
                        -- Chuck<br>
<br>
<br>
<br>
<br>
</div></div></blockquote>
</blockquote></div><br></div>