RFR: 8324751: C2 SuperWord: Aliasing Analysis runtime check [v17]

Vladimir Kozlov kvn at openjdk.org
Tue Aug 19 17:42:49 UTC 2025


On Tue, 19 Aug 2025 16:58:55 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

>> TODO work that arose during review process / recent merges with master:
>> 
>> - Vladimir asked for benchmark where predicate is disabled, only multiversioning. Show that peek performance is identical but compilation time a bit higher.
>> - Vladimir: consider disabling `UseAutoVectorizationSpeculativeAliasingChecks` if neither predicate nor multiversioning are available.
>> - Test failure with multiversioning: `/home/empeter/Documents/oracle/jtreg/bin/jtreg -va -s -jdk:/home/empeter/Documents/oracle/jdk-fork6/build/linux-x64-debug/jdk -javaoptions:"-Djdk.test.lib.random.seed=-9045761078153722515" -J-Djavatest.maxOutputSize=10000000 /home/empeter/Documents/oracle/jdk-fork6/open/test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java`
>> - See if we can harden some of the IR rules in `TestAliasingFuzzer.java` after JDK-8356176.
>> 
>> ---------------
>> 
>> This is a big patch, but about 3.5k lines are tests. And a large part of the VM changes is comments / proofs.
>> 
>> I am adding a dynamic (runtime) aliasing check to the auto-vectorizer (SuperWord). We use the infrastructure from https://github.com/openjdk/jdk/pull/22016:
>> - Use the auto-vectorization `predicate` when available: we speculate that there is no aliasing, else we trap and re-compile without the predicate.
>> - If the predicate is not available, we use `multiversioning`, i.e. we have a `fast_loop` where there is no aliasing, and hence vectorization. And a `slow_loop` if the check fails, with no vectorization.
>> 
>> --------------------------
>> 
>> **Where to start reviewing**
>> 
>> - `src/hotspot/share/opto/mempointer.hpp`:
>>   - Read the class comment for `MemPointerRawSummand`.
>>   - Familiarize yourself with the `MemPointer Linearity Corrolary`. We need it for the proofs of the aliasing runtime checks.
>> 
>> - `src/hotspot/share/opto/vectorization.cpp`:
>>   - Read the explanations and proofs above `VPointer::can_make_speculative_aliasing_check_with`. It explains how the aliasing runtime check works.
>> 
>> - `src/hotspot/share/opto/vtransform.hpp`:
>>   - Understand the difference between weak and strong edges.
>> 
>> If you need to see some examples, then look at the tests:
>> - `test/hotspot/jtreg/compiler/loopopts/superword/TestAliasing.java`: simple array cases. IR rules that check for vectors and in somecases if we used multiversioning.
>> - `test/micro/org/openjdk/bench/vm/compiler/VectorAliasing.java`: the miro-benchmarks I show below. Simple array cases.
>> - `test/hotspot/jtreg/compiler...
>
> Emanuel Peter has updated the pull request incrementally with one additional commit since the last revision:
> 
>   more documentation for Vladimir

src/hotspot/share/opto/vtransform.cpp line 402:

> 400: // Runtime Checks:
> 401: //   Some required properties cannot be proven statically, and require a
> 402: //   runtime check:

Good comment !

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

PR Review Comment: https://git.openjdk.org/jdk/pull/24278#discussion_r2285916216


More information about the hotspot-compiler-dev mailing list