RFR: 8371603: C2: assert(_inputs.at(alias_idx) == nullptr || _inputs.at(alias_idx) == load->in(1)) failed
Xiaohong Gong
xgong at openjdk.org
Thu Dec 4 01:49:37 UTC 2025
**Problem:**
This issue occurs on a 256-bit SVE machine, caused by the following problematic pattern in `LoadVectorNode::Ideal()`:
Node* LoadVectorNode::Ideal(PhaseGVN* phase, bool can_reshape) {
const TypeVect* vt = vect_type();
if (Matcher::vector_needs_partial_operations(this, vt)) {
return VectorNode::try_to_gen_masked_vector(phase, this, vt);
}
return LoadNode::Ideal(phase, can_reshape);
}
The condition `Matcher::vector_needs_partial_operations(this, vt)` returns true for `LoadVectorNode` with 256-bit vector size even when the vector size equals the maximum vector size on SVE. In such cases, when `VectorNode::try_to_gen_masked_vector()` returns `nullptr`, the method exits early without calling `LoadNode::Ideal()`. This results in missing crucial optimizations that would normally be applied by the superclass.
This code was introduced by https://bugs.openjdk.org/browse/JDK-8286941 to generate vector masks for partial vector operations, but it failed to ensure that the superclass `Ideal()` method is always invoked when no transformation is applied.
**Solution:**
This patch addresses the issue through two changes:
1. Refine `Matcher::vector_needs_partial_operations()` to return true only when the vector node genuinely represents a partial vector operation that requires masking.
2. Modify `VectorNode::try_to_gen_masked_vector()` to never return `nullptr`, ensuring the superclass `Ideal()` method is always invoked when no transformation is applied.
**Testing:**
- Verified on different SVE platforms with different vector sizes (128|256|512 bits).
- Verified on X86 platforms with different avx options (-XX:UseAVX=1|2|3).
- Added two new IR tests to verify 1) previously missing optimizations for `LoadVector/StoreVector` are now applied, and 2) that mask and the correct IR patterns are generated for partial vector operations.
-------------
Commit messages:
- 8371603: C2: assert(_inputs.at(alias_idx) == nullptr || _inputs.at(alias_idx) == load->in(1)) failed
Changes: https://git.openjdk.org/jdk/pull/28651/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=28651&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8371603
Stats: 619 lines in 8 files changed: 577 ins; 15 del; 27 mod
Patch: https://git.openjdk.org/jdk/pull/28651.diff
Fetch: git fetch https://git.openjdk.org/jdk.git pull/28651/head:pull/28651
PR: https://git.openjdk.org/jdk/pull/28651
More information about the hotspot-compiler-dev
mailing list