RFR: 8359386: Fix incorrect value for max_size of C2CodeStub when APX is used [v3]

Jatin Bhateja jbhateja at openjdk.org
Wed Jun 18 12:53:29 UTC 2025


On Tue, 17 Jun 2025 04:07:14 GMT, Srinivas Vamsi Parasa <sparasa at openjdk.org> wrote:

>> The goal of this PR is to fix the value of max_size of the C2CodeStub hardcoded in the C2_MacroAssembler::convertF2I() function when Intel APX instrucitons are used. Currently, max_size is hardcoded to 23 (introduced in [JDK-8306706](https://bugs.openjdk.org/browse/JDK-8306706)) . However, this value is incorrect when Intel APX instructions with extended general-purpose registers (EGPRs) are used in the code stub as using EGPRs with APX instructions leads to an increase in the instruction encoding size by additional 1 byte.
>> 
>> Without this fix, we see the following error for the C2 compiler tests below:
>> 
>> compiler/vectorization/runner/ArrayTypeConvertTest.java
>> compiler/intrinsics/zip/TestFpRegsABI.java
>> 
>> 
>> 
>> 
>> # A fatal error has been detected by the Java Runtime Environment:
>> #
>> # Internal Error (/src/hotspot/share/opto/c2_CodeStubs.cpp:50), pid=3961123, tid=3961332
>> # assert(max_size >= actual_size) failed: Expected stub size (23) must be larger than or equal to actual stub size (24)
>> #
>> # JRE version: OpenJDK Runtime Environment (26.0) (fastdebug build 26-internal-adhoc.parasa.jdkdemotion)
>> # Java VM: OpenJDK 64-Bit Server VM (fastdebug 26-internal-adhoc.parasa.jdkdemotion, mixed mode, sharing, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
>> # Problematic frame:
>> # V [libjvm.so+0x955a77] C2CodeStubList::emit(C2_MacroAssembler&)+0x227
>> #
>> 
>> 
>> This PR fixes the errors in the above-mentioned tests.
>> 
>> Currently, the ConvertF2I macro works as follows:
>> 
>> 
>> vcvttss2si %xmm1,%eax
>>     cmp    $0x80000000,%eax
>>     je     STUB
>> CONTINUE:
>> 
>> STUB:
>>     sub    $0x8,%rsp
>>     vmovss %xmm1,(%rsp)
>>     call   Stub::f2i_fixup              ;   {runtime_call StubRoutines (initial stubs)}
>>     pop    %rax
>>     jmp    CONTINUE
>> 
>> 
>> The maximum size (max_size) of the stub is precomputed as 23. However, as seen in the convertF2I_slowpath implementation (below), the usage of pop(dst) instruction increases the instruction encoding size by 1 byte if dst is an extended general-purpose register (R16-R31) . 
>> 
>> For example, `pop (r15)` is encoded as `41 5f`, whereas `pop(r21)` is encoded as `d5 10 5d`.         
>> 
>> 
>> 
>> 
>> static void convertF2I_slowpath(C2_MacroAssembler& masm, C2GeneralStub<Register, XMMRegister, address>& stub) {
>> #define __ masm.
>>   Register dst = stub.data<0>();
>>   XMMRegister src = stub.data<1>();
>>   address target = stub.data<2>();
>>   __ bind(stub.entry());
>>   __ subptr(rsp, 8);
>>   __ mo...
>
> Srinivas Vamsi Parasa has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Fix the change in the stub size by 1 byte

My testing passed.

LGTM

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

Marked as reviewed by jbhateja (Reviewer).

PR Review: https://git.openjdk.org/jdk/pull/25787#pullrequestreview-2939079041


More information about the hotspot-compiler-dev mailing list