RFR(S): 8072753 Nondeterministic wrong answer on arithmetic

Igor Veresov igor.veresov at oracle.com
Mon Feb 16 19:43:53 UTC 2015


Sometimes when we try to do the counter loop detection during OSRs we get a non-canonical loop shape (while-do), in which case we would try to invert it (convert it to do-while). Specifically the following transformation takes place:
    i = init; while(i < limit) { i+= stride; }
    is converted to
    i = init; do {  i+= stride; } while(i < limit+stride);
Note that the loop condition check occurs _after_ the induction variable is incremented. And, as a result, (i + stride) can overflow.

There are two solutions possible:
- check the type of init, which in most cases will be tight enough to make a proper decision (also the check is only require when the inversion takes place).
- insert extra predicate to guard for the condition.

Since the described case is rare (OSR only) and the fix needs to be backported down to 6 (which doesn’t have predicates) I decided to go the first route for now. The benchmark runs didn’t show any change in performance.

Webrev: http://cr.openjdk.java.net/~iveresov/8072753/webrev.00/

Thanks,
igor


More information about the hotspot-compiler-dev mailing list