RFR(S): 8166742 : SIGFPE in C2 Loop IV elimination
Vladimir Kozlov
vladimir.kozlov at oracle.com
Tue Sep 27 16:48:44 UTC 2016
So why it is SIGFPE when both values are 'int'?
I thought it is incorrect results cause SIGFPE that is why I suggested
to check for integer overflow.
Lets then go with your second suggested change here. But let check that
ratio is small first and do cast to (jint) otherwise the long check is
useless:
// The ratio of the two strides cannot be represented as an int
// if stride_con2 is min_int and stride_con is -1.
jlong ratio_conl = ((jlong)stride_con2 / stride_con);
if ((ratio_conl < 0x80000000L) &&
(jint)(ratio_conl * stride_con) == stride_con2) { // Check for exact
jint ratio_con = (jint)ratio_conl;
Thanks,
Vladimir
On 9/27/16 7:56 AM, Chuck Rasbold wrote:
>
>
> On Mon, Sep 26, 2016 at 5:35 PM, Vladimir Kozlov
> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
>
> Slightly different (cast after /) and jlong type:
>
> jlong ratio_conl = (jlong) (stride_con2 / stride_con);
>
>
> The division above won't work (at least, it raises a SIGFPE on my Linux
> x86 platform) when stride_con2 == min_jint and stride_con == -1.
>
>
> if ((ratio_conl * stride_con) == (jlong)stride_con2) { // Check
> for exact
>
>
> What would be the value of ratio_conl such that this test fails? I
> think I'm missing something...
>
> -- Chuck
>
>
> Vladimir
>
> On 9/26/16 5:01 PM, Chuck Rasbold wrote:
>
> Just to confirm, are you suggesting that the ratio be first
> computed as a 64 bit quantity, effectively along the lines of...
>
> long ratio_conl = ((long) stride_con2) / stride_con;
>
> if ((ratio_conl * stride_con) == stride_con2 &&
> ratio_conl < 0x8000000 ) { // Check for exact
> int ratio_con = (int) ratio_conl;
>
>
> On Mon, Sep 26, 2016 at 3:45 PM, Vladimir Kozlov
> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>
> <mailto:vladimir.kozlov at oracle.com
> <mailto:vladimir.kozlov at oracle.com>>> wrote:
>
> Hi Chuck
>
> Can you do 'long' arithmetic in existing condition to catch
> integer overflow instead?
>
> if ((ratio_con * stride_con) == stride_con2) { // Check for
> exact
>
> thanks,
> Vladimir
>
>
>
> On 9/26/16 3:18 PM, Chuck Rasbold wrote:
>
> A small fix for an edge case crash in C2...
>
> Bug: https://bugs.openjdk.java.net/browse/JDK-8166742
> <https://bugs.openjdk.java.net/browse/JDK-8166742>
> <https://bugs.openjdk.java.net/browse/JDK-8166742
> <https://bugs.openjdk.java.net/browse/JDK-8166742>>
> Webrev:
> http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/
> <http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/>
> <http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/
> <http://cr.openjdk.java.net/~rasbold/8166742/webrev.00/>>
>
> Requesting a sponsor and reviews. Thanks.
>
> -- Chuck
>
>
>
More information about the hotspot-compiler-dev
mailing list