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