RFR: 8373134: C2: Min/Max users of Min/Max uses should be enqueued for GVN [v2]
Dean Long
dlong at openjdk.org
Thu Dec 18 23:19:48 UTC 2025
On Thu, 18 Dec 2025 15:05:08 GMT, Galder Zamarreño <galder at openjdk.org> wrote:
>> Min/Max users of Min/Max uses need to be enqueued respectively to the GVN worklist to see if further optimizations can be applied. Without this, there are cases where additional potential ideal/identity optimizations are not applied. I need this fix to test min/max reassociation implementation with IR tests reliably.
>>
>> Aside from the fix itself, I've refactored `MaxNode` to `MinMaxNode` and added a `is_MinMax` node query to simplify the fix.
>>
>> I have also removed the Min/Max exceptions in `PhaseIterGVN::verify_Identity_for` since this fix fixes `compiler/codegen/TestBooleanVect.java` with `-XX:VerifyIterativeGVN=1110`.
>>
>> To test this I've created a template framework test that validates the fix. I have tested with all Min/Max combinations including Float16, which I've verified with Intel SDE. Float16 does not use `Argument.NUMBER_42` because there's no support for it yet, see [JDK-8373977](https://bugs.openjdk.org/browse/JDK-8373977).
>>
>> During development I noticed that the test only failed when the test had `b, a` parameters in that order, so I added tests for both cases as `a, b` and `b, a` so that all possible orders are covered and they don't slip in the future.
>>
>> I've run tier1-3 tests on linux/x64 successfully.
>
> Galder Zamarreño has updated the pull request with a new target base due to a merge or a rebase. The pull request now contains nine commits:
>
> - Merge branch 'master' into topic.uses-min-max
> - Test Float16
> - Only apply to uses that match original IR node
> - Merge branch 'master' into topic.uses-min-max
> - Use is_MinMax() instead of spelling out individual Min/Max opcodes
> - Refactor MaxNode to MinMaxNode and add is_MinMax() query
> - Add max(a, max(b, c)) patterns to add users of use
> - Add templated test
> - Remove exclude or Min/Max in verify identity
src/hotspot/share/opto/phaseX.cpp line 2609:
> 2607: for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) {
> 2608: Node* u = use->fast_out(i2);
> 2609: if (u->Opcode() == use->Opcode()) {
So there are no Min(Max()) or Max(Min()) patterns we need to worry about? I was expecting this line to be
if (u->is_MinMax()) {
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28895#discussion_r2632963753
More information about the hotspot-compiler-dev
mailing list