RFR: 8261447: MethodInvocationCounters frequently run into overflow [v8]
Igor Veresov
iveresov at openjdk.java.net
Tue Mar 2 20:50:44 UTC 2021
On Thu, 25 Feb 2021 16:36:38 GMT, Igor Veresov <iveresov at openjdk.org> wrote:
>> Lutz Schmidt has updated the pull request incrementally with one additional commit since the last revision:
>>
>> comment changes requested by TheRealMDoerr
>
> src/hotspot/share/runtime/java.cpp line 100:
>
>> 98: int compare_methods(Method** a, Method** b) {
>> 99: return (int32_t)(((uint32_t)(*b)->invocation_count() + (*b)->compiled_invocation_count())
>> 100: - ((uint32_t)(*a)->invocation_count() + (*a)->compiled_invocation_count()));
>
> Is this correct? The arithmetic look to be: (int32_t) (uint64_t - uint64_t). If the 64 values inside don't fit in 32, you'll get a negative number which would break the sorting logic.
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?
-------------
PR: https://git.openjdk.java.net/jdk/pull/2511
More information about the hotspot-dev
mailing list