Integrated: 8371603: C2: Missing Ideal optimizations for load and store vectors on SVE

Xiaohong Gong xgong at openjdk.org
Wed Dec 10 02:12:44 UTC 2025


On Thu, 4 Dec 2025 01:41:19 GMT, Xiaohong Gong <xgong at openjdk.org> wrote:

> **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.

This pull request has now been integrated.

Changeset: b6732d60
Author:    Xiaohong Gong <xgong at openjdk.org>
URL:       https://git.openjdk.org/jdk/commit/b6732d6048259de68a3dd5b4f66ac82f87270404
Stats:     638 lines in 8 files changed: 582 ins; 19 del; 37 mod

8371603: C2: Missing Ideal optimizations for load and store vectors on SVE

Co-authored-by: Emanuel Peter <epeter at openjdk.org>
Reviewed-by: epeter, erfang, haosun

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

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


More information about the hotspot-compiler-dev mailing list