Integrated: 8324751: C2 SuperWord: Aliasing Analysis runtime check

Emanuel Peter epeter at openjdk.org
Thu Aug 28 05:56:06 UTC 2025


On Thu, 27 Mar 2025 13:00:20 GMT, Emanuel Peter <epeter at openjdk.org> wrote:

> 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/loopopts/superword/TestMemorySegmentAliasing.java`: a bit advanced, but similar cases.
> - `test/hotspot/jtreg/compiler/loopopts/superword/TestAliasingFuzzer.java`: very large and rather compliex. Generates random loops, some with and some without aliasing at runtime. IR verification, but mostly currently only for array cases, MemorySegment cases have some issues (see comments).
> --------------------------
> 
> **Details**
> 
> Most fundamentally:
> - I had to refactor / extend `MemPointer` so that we have access to `MemPointerRawSummand`s.
> - These raw summands us to reconstruct the `VPointer` at any `iv` value with `VPointer::make_pointer_expression(Node* iv_value)`.
>    - With the raw summands, a pointer may look like this: `p = base + ConvI2L(x + 2) + ConvI2L(y + 2)`
>   - With "regular" summands, this gets simplified to `p = base + 4L +ConvI2L(x) + ConvI2L(y)`
>   - For aliasing analysis (adjacency and overlap), the "regu...

This pull request has now been integrated.

Changeset: 443b1726
Author:    Emanuel Peter <epeter at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/443b17263876355ef508ae68ddad6c108de29db8
Stats:     5828 lines in 29 files changed: 5579 ins; 18 del; 231 mod

8324751: C2 SuperWord: Aliasing Analysis runtime check

Reviewed-by: kvn, mhaessig

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

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


More information about the hotspot-compiler-dev mailing list