RFR: 8345766: C2 does not remove useless drem runtime calls

theoweidmannoracle duke at openjdk.org
Wed Dec 18 07:12:19 UTC 2024


C2 currently emits runtime calls if the platform rules do not support lowering floating point remainder operations. For example, for float:

https://github.com/openjdk/jdk/blob/fbbc7c35f422294090b8c7a02a19ab2fb67c7070/src/hotspot/share/opto/parse2.cpp#L2305-L2318

https://github.com/openjdk/jdk/blob/fbbc7c35f422294090b8c7a02a19ab2fb67c7070/src/hotspot/share/opto/parse2.cpp#L1099-L1109

The only platform, which currently supports this, however, is x86_32. On all other platforms, runtime calls are generated directly during parsing, which prevent any constant folding or other idealizations. Even C1 can perform these optimizations, resulting in significantly lower C2 performance compared to C1 for simple test cases. This function was observed to be around 15x slower with C2 compared to C1 due to redundant runtime calls:


public static double process(final double x) {
        double w = (double) 0.1;
        double p = 0;
        p = (double) (3.109615012413746E307 % (w % Z));
        p = (double) (7.614949555185036E307 / (x % x)); // <- return value only dependends on this line
        return (double) (x * p);
}


To fix this, this PR turns ModFNode and ModDNode into macros, which are always created during parsing. They support idealization (constant folding) and are lowered to runtime calls during macro expansion. For simplicity, these operations will now also call into the runtime on x86_32, as this platform is deprecated.

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

Commit messages:
 - Make diff less confusing
 - Remove x86_32 ModF/D implementation
 - Implement for float
 - Implement for double

Changes: https://git.openjdk.org/jdk/pull/22786/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=22786&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8345766
  Stats: 624 lines in 11 files changed: 360 ins; 205 del; 59 mod
  Patch: https://git.openjdk.org/jdk/pull/22786.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/22786/head:pull/22786

PR: https://git.openjdk.org/jdk/pull/22786


More information about the hotspot-compiler-dev mailing list