[8u/9] RFR (S): 8154831: CastII/ConvI2L for a range check is prematurely eliminated

Vladimir Ivanov vladimir.x.ivanov at oracle.com
Thu May 19 17:45:45 UTC 2016


http://cr.openjdk.java.net/~vlivanov/8154831/webrev.9.00/
http://cr.openjdk.java.net/~vlivanov/8154831/webrev.8u.00/
https://bugs.openjdk.java.net/browse/JDK-8154831

CastII node prematurely goes away and causes a cascade of other 
eliminations which severely corrupts the graph (the actual crash happens 
due to a memory edge coming from a non-dominating region).

CastII is replaced with TOP due to a type conflict (ranges don't 
intersect) between the actual type of the value being range checked and 
the type CastII tries to assign.

It happens on effectively dead path (range check always fails) which C2 
can't eliminate due to a missing transformation for CmpU:

    Bool [lt] (CmpU (ConI #-1) (… #int)) => (ConI #0)

The fix is to add the missing case in CmpUNode::sub(). It enables dead 
path elimination along with CastII.

Also, fixed a couple of missing cases in 8u (not applicable in 9):
   * CastII nodes shouldn't be eliminated during CCP pass;
   * CastII comparion should take _range_check_dependency flag into 
account.

Testing:
   * JPRT (8u/9);
   * RBT for 9 (hs-tier0-comp - in progress);
   * replay of problematic compilation (8u).

Thanks!

Best regards,
Vladimir Ivanov


More information about the hotspot-compiler-dev mailing list