RFR: 8346989: Deoptimization and re-compilation cycle with C2 compiled code
Emanuel Peter
epeter at openjdk.org
Fri Mar 7 14:22:30 UTC 2025
On Wed, 5 Mar 2025 12:56:48 GMT, Marc Chevalier <duke at openjdk.org> wrote:
> `Math.*Exact` intrinsics can cause many deopt when used repeatedly with problematic arguments.
> This fix proposes not to rely on intrinsics after `too_many_traps()` has been reached.
>
> Benchmark show that this issue affects every Math.*Exact functions. And this fix improve them all.
>
> tl;dr:
> - C1: no problem, no change
> - C2:
> - with intrinsics:
> - with overflow: clear improvement. Was way worse than C1, now is similar (~4s => ~600ms)
> - without overflow: no problem, no change
> - without intrinsics: no problem, no change
>
> Before the fix:
>
> Benchmark (SIZE) Mode Cnt Score Error Units
> MathExact.C1_1.loopAddIInBounds 1000000 avgt 3 1.272 ± 0.048 ms/op
> MathExact.C1_1.loopAddIOverflow 1000000 avgt 3 641.917 ± 58.238 ms/op
> MathExact.C1_1.loopAddLInBounds 1000000 avgt 3 1.402 ± 0.842 ms/op
> MathExact.C1_1.loopAddLOverflow 1000000 avgt 3 671.013 ± 229.425 ms/op
> MathExact.C1_1.loopDecrementIInBounds 1000000 avgt 3 3.722 ± 22.244 ms/op
> MathExact.C1_1.loopDecrementIOverflow 1000000 avgt 3 653.341 ± 279.003 ms/op
> MathExact.C1_1.loopDecrementLInBounds 1000000 avgt 3 2.525 ± 0.810 ms/op
> MathExact.C1_1.loopDecrementLOverflow 1000000 avgt 3 656.750 ± 141.792 ms/op
> MathExact.C1_1.loopIncrementIInBounds 1000000 avgt 3 4.621 ± 12.822 ms/op
> MathExact.C1_1.loopIncrementIOverflow 1000000 avgt 3 651.608 ± 274.396 ms/op
> MathExact.C1_1.loopIncrementLInBounds 1000000 avgt 3 2.576 ± 3.316 ms/op
> MathExact.C1_1.loopIncrementLOverflow 1000000 avgt 3 662.216 ± 71.879 ms/op
> MathExact.C1_1.loopMultiplyIInBounds 1000000 avgt 3 1.402 ± 0.587 ms/op
> MathExact.C1_1.loopMultiplyIOverflow 1000000 avgt 3 615.836 ± 252.137 ms/op
> MathExact.C1_1.loopMultiplyLInBounds 1000000 avgt 3 2.906 ± 5.718 ms/op
> MathExact.C1_1.loopMultiplyLOverflow 1000000 avgt 3 655.576 ± 147.432 ms/op
> MathExact.C1_1.loopNegateIInBounds 1000000 avgt 3 2.023 ± 0.027 ms/op
> MathExact.C1_1.loopNegateIOverflow 1000000 avgt 3 639.136 ± 30.841 ms/op
> MathExact.C1_1.loopNegateLInBounds 1000000 avgt 3 2.422 ± 3.59...
The benchmark generally looks good to me, I only have some minor suggestions ;)
Ah. And is this only about `multiplyExact`, or are there other methods affected? Would be nice to extend the benchmark to those as well.
And yet another idea: you could probably write an IR test that checks that we at first have the compilation with the trap, and another test where we trap too much and then get a different compilation (without the intrinsic?).
Plus: the issue title is very generic. I think it should mention something about `Math.*Exact` as well ;)
test/micro/org/openjdk/bench/vm/compiler/MultiplyExact.java line 47:
> 45: try {
> 46: return square(i);
> 47: } catch (Throwable e) {
Can you catch a more specific exception? Catching very general exceptions can often mask other bugs. I suppose this is only a benchmark, but it would still be good practice ;)
test/micro/org/openjdk/bench/vm/compiler/MultiplyExact.java line 62:
> 60:
> 61: @Fork(value = 1)
> 62: public static class C2 extends MultiplyExact {}
What about a C2 version where you just disable the intrinsic?
-------------
PR Review: https://git.openjdk.org/jdk/pull/23916#pullrequestreview-2663529726
PR Comment: https://git.openjdk.org/jdk/pull/23916#issuecomment-2703023122
PR Review Comment: https://git.openjdk.org/jdk/pull/23916#discussion_r1982809388
PR Review Comment: https://git.openjdk.org/jdk/pull/23916#discussion_r1982808076
More information about the hotspot-compiler-dev
mailing list