RFR: 8261447: MethodInvocationCounters frequently run into overflow [v8]
Igor Veresov
iveresov at openjdk.java.net
Tue Mar 2 23:45:52 UTC 2021
On Tue, 2 Mar 2021 21:08:38 GMT, Lutz Schmidt <lucy at openjdk.org> wrote:
>> I see that you've fixed the types since the last comment, but it think it's still broken (and has been before).
>> How about:
>> int64_t diff = ((*b)->compiled_invocation_count() - (*a)->compiled_invocation_count()) + ((*b)->invocation_count() - (*a)->invocation_count());
>> if (diff > 0) return 1;
>> else if (diff < 0) return -1;
>> else return 0;
>> It's kind of hacky too, because it assumes that compiled_invocation_count() are positive and didn't overflow. But at least we'd get rid of a possible overflow during summation. What do you think?
>
> Right. As soon as there is overflow, the original formula doesn't do the trick either.
> We can fix it as long as either (unsigned int)invocation_count() does not wrap around from 2^32-1 to 0. The entire expression is calculated as int64_t, protecting us from overflow for the next few years. If we then calculate the return value as you propose, we are good.
In your new code here casts to uint32_t are probably unnecessary.
-------------
PR: https://git.openjdk.java.net/jdk/pull/2511
More information about the hotspot-dev
mailing list