Integrated: 8335392: C2 MergeStores: enhanced pointer parsing
Emanuel Peter
epeter at openjdk.org
Tue Nov 5 11:49:47 UTC 2024
On Mon, 1 Jul 2024 13:32:01 GMT, Emanuel Peter <epeter at openjdk.org> wrote:
> **Background**
> I am introducing the `MemPointer`, for enhanced pointer parsing. For now, it replaces the much more limited `ArrayPointer` in `MergeStores` (see https://github.com/openjdk/jdk/pull/16245), but eventually it is supposed to be used widely in optimizations for pointer analysis: adjacency, aliasing, etc. I also plan to refactor the `VPointer` from auto-vectorization with it, and unlock more pointer patterns that way - possibly including scatter/gather.
>
> **Details**
>
> The `MemPointer` decomposes a pointer into the form `pointer = con + sum_i(scale_i * variable_i)` - a linear form with a sum of variables and scale-coefficients, plus some constant offset.
>
> This form allows us to perform aliasing checks - basically we can check if two pointers are always at a constant offset. This allows us to answer many questions, including if two pointers are adjacent. `MergeStores` needs to know if two stores are adjacent, so that we can safely merge them.
>
> More details can be found in the description in `mempointer.hpp`. Please read them when reviewing!
>
> `MemPointer` is more powerful than the previous `ArrayPointer`: the latter only allows arrays, the former also allows native memory accesses, `Unsafe` and `MemorySegement`.
>
> **What this change enables**
>
> Before this change, we only allowed merging stores to arrays, where the store had to have the same type as the array element (`StoreB` on `byte[]`, `StoreI` on `int[]`).
>
> Now we can do:
> - Merging `Unsafe` stores to array. Including "mismatched size": e.g. `putChar` to `byte[]`.
> - Merging `Unsafe` stores to native memory.
> - Merging `MemorySegment`: with array, native, ByteBuffer backing types.
> - However: there is still some problem with RangeCheck smearing (a type of RC elimination) for the examples I have tried. Without RC's smeared, we can only ever merge 2 neighbouring stores. I hope we can improve this with better RangeCheck smearing. `MemorySegment` introduce `checkIndexL`, the long-variant of the RangeCheck. Normal array accesses only use the equivalent of `checkIndex`, the int-variant that we already optimize away much better.
>
> **Dealing with Overflows**
>
> We have to be very careful with overflows when dealing with pointers. For this, I introduced a `NoOverflowInt`. It allows us to do "normal" int operations on it, and tracks if there was ever an overflow. This way, we can do all overflow checks implicitly, and do not clutter the code with overflow-checks or - God forbid - forget overflow-checks.
>
> **Bench...
This pull request has now been integrated.
Changeset: f3671bee
Author: Emanuel Peter <epeter at openjdk.org>
URL: https://git.openjdk.org/jdk/commit/f3671beefb3ff07441a905e25619f0d1a0a2fe15
Stats: 2687 lines in 16 files changed: 2417 ins; 212 del; 58 mod
8335392: C2 MergeStores: enhanced pointer parsing
Co-authored-by: Christian Hagedorn <chagedorn at openjdk.org>
Reviewed-by: kvn, chagedorn
-------------
PR: https://git.openjdk.org/jdk/pull/19970
More information about the hotspot-compiler-dev
mailing list