RFR: 8341272: Factory to create wide iinc instruction with small arguments

Chen Liang liach at openjdk.org
Wed Dec 10 00:00:48 UTC 2025


On Tue, 9 Dec 2025 20:59:58 GMT, Trevor Bond <duke at openjdk.org> wrote:

> Add a new factory method to `IncrementInstruction` that allows the explicit creation of a wide iinc instruction, even with a `slot` and `constant` that could fit into a normal iinc instruction. Previously, only one factory for iinc instructions existed, which inferred the type of instruction needed given the size of `slot` and `constant`. Add additional test cases for the new factory as well. All tier 1 tests and classfile tests have passed with these changes.

Since this is an API addition, this will require a CSR. Once we have settled with the javadocs, I can create a CSR (which requires a JBS account)

src/java.base/share/classes/java/lang/classfile/instruction/IncrementInstruction.java line 95:

> 93:      * <p>
> 94:      * The ranges of {@code slot} and {@code constant} are restricted by the
> 95:      * {@code op} and its {@linkplain Opcode#sizeIfFixed() size}:

Since there are only two possible Opcodes `IINC` and `IINC_W`, you can just name them instead of specifying by their size.

I know you copied from the load and store instructions; I had to use size there because listing all of `ILOAD_0`, `ILOAD_1`, `ILOAD_2`, `ILOAD_3` is less concise than using the size.

You can look at `DiscontinuedInstruction.RetInstruction` for a better template to follow.

src/java.base/share/classes/java/lang/classfile/instruction/IncrementInstruction.java line 118:

> 116:      *         {@link Opcode.Kind#INCREMENT} or {@code slot} or
> 117:      *         {@code constant} is out of range
> 118:      */

Suggestion:

     *         {@code constant} is out of range
     * @since 27
     */

src/java.base/share/classes/jdk/internal/classfile/impl/BytecodeHelpers.java line 456:

> 454:         boolean requiresWide = validateAndIsWideIinc(slot, constant);
> 455:         int size = opcode.sizeIfFixed();
> 456:         if ((size == 3 && requiresWide)) {

Suggestion:

        if (validateAndIsWideIinc(slot, constant) && opcode != Opcode.IINC_W) {

test/jdk/jdk/classfile/InstructionValidationTest.java line 265:

> 263: 
> 264:     @Test
> 265:     void testExplicitIincConstant() {

Each method tests one instruction interface, so I think you should merge this into `testIincConstant()`.

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

PR Comment: https://git.openjdk.org/jdk/pull/28729#issuecomment-3634775601
PR Review Comment: https://git.openjdk.org/jdk/pull/28729#discussion_r2604710736
PR Review Comment: https://git.openjdk.org/jdk/pull/28729#discussion_r2604730390
PR Review Comment: https://git.openjdk.org/jdk/pull/28729#discussion_r2604718223
PR Review Comment: https://git.openjdk.org/jdk/pull/28729#discussion_r2604727924


More information about the core-libs-dev mailing list