RFR: 8224162: assert(profile.count() == 0) failed: sanity in InlineTree::is_not_reached

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Wed May 29 12:02:20 UTC 2019


Thanks, Jie.

> http://cr.openjdk.java.net/~jiefu/8224162/webrev.05/

src/hotspot/share/ci/ciMethod.cpp:

          if (count >= 0) {
            count += receivers_count_total;
+          // Check and handle the overflow condition
+          if (count < 0) {
+            count = max_jint;
+          }
          }

There are other places where overflow can occur:

           int rcount = call->receiver_count(i) + epsilon;

           receivers_count_total += rcount;

Maybe introduce a helper routine for saturating addition?


src/hotspot/share/oops/methodData.hpp:

    uint count() const {
-    return uint_at(count_off);
+    intptr_t raw_data = intptr_at(count_off);
+    if (raw_data > max_jint) {
+      raw_data = max_jint;
+    } else if (raw_data < min_jint) {
+      raw_data = min_jint;
+    }
+    return uint(raw_data);
    }

Should uintptr_t be used here instead? It looks like this version won't 
work as expected on 32-bit platforms (since uint => intrptr_t conversion 
becomes lossy).

Also, I don't understand why you added comparison against min_jint. 
Since counts are unsigned, the following should be enough:

   uint count() const {
     uintx raw_data = (uintx)intptr_at(count_off);
     if (raw_data > max_jint) {
       raw_data = max_jint;
     }
     return uint(raw_data);
   }

Best regards,
Vladimir Ivanov

> On 2019/5/23 下午6:21, Vladimir Ivanov wrote:
>> I'm still in favor of fixing the root cause than putting band-aids in 
>> otherwise perfectly valid code.
>>
>> I don't consider fixing CounterData::count() and its usages to 
>> properly handle overflow as overly complicated. There's a limited 
>> number of usages and they don't properly handle overflow as well. So, 
>> fixing the bug is highly desireable even though it has been left 
>> unnoticed for a long time.
> 


More information about the hotspot-compiler-dev mailing list