[jdk17] Integrated: 8269230: C2: main loop in micro benchmark never executed

Roland Westrelin roland at openjdk.java.net
Thu Jul 1 07:45:10 UTC 2021


On Mon, 28 Jun 2021 08:20:17 GMT, Roland Westrelin <roland at openjdk.org> wrote:

> The benchmark loop is roughly:
> 
> for (int i = 0; i < limit; i++) {
>   if (!(i < max_jint && i > min_jint)) {
>     uncommon_trap();
>   }
> }
> 
> which IfNode::fold_compares() tranforms to:
> 
> for (int i = 0; i < limit; i++) {
>   if (!(i - min_jint - 1 <u -2)) {
>     uncommon_trap();
>   }
> }
> 
> Range elimination then adjusts loop limits so the unsigned comparison
> can be removed. The new limit is:
> 
> min(limit, max(-2 + min_jint + 1, min_jint)) = min(limit, min_jint) = min_jint
> 
> and the main loop is never executed.
> 
> The logic that protects against overflows during range check
> elimination is what causes the main loop to never be executed. As a
> fix, I propose delaying IfNode::fold_compares() if the resulting test
> compares with a potential negative number which could then cause RC
> overflow code to trigger. I think that would preserve the most
> interesting cases for IfNode::fold_compares() when it comes to range
> check elimination:
> 
> i >= 0 && i < array.length

This pull request has now been integrated.

Changeset: c67a7b03
Author:    Roland Westrelin <roland at openjdk.org>
URL:       https://git.openjdk.java.net/jdk17/commit/c67a7b039de0dbb379123fb49780ae5b246dcf74
Stats:     164 lines in 2 files changed: 164 ins; 0 del; 0 mod

8269230: C2: main loop in micro benchmark never executed

Co-authored-by: Maurizio Cimadamore <mcimadamore at openjdk.org>
Reviewed-by: kvn, iveresov

-------------

PR: https://git.openjdk.java.net/jdk17/pull/156


More information about the hotspot-compiler-dev mailing list