RFR(S): 8072753 Nondeterministic wrong answer on arithmetic

Vladimir Kozlov vladimir.kozlov at oracle.com
Mon Feb 16 19:57:12 UTC 2015

Good. Thank you for performance testing.


On 2/16/15 11:43 AM, Igor Veresov wrote:
> 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