Skip to content

Commit 6f16115

Browse files
committed
Adapt JDK-8334717: Add JVMCI support for APX EGPRs
1 parent 9c6fc20 commit 6f16115

File tree

37 files changed

+225
-218
lines changed

37 files changed

+225
-218
lines changed

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/asm/aarch64/test/AArch64AddressingModeTest.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -29,16 +29,16 @@
2929

3030
import java.util.EnumSet;
3131

32+
import org.junit.Assert;
33+
import org.junit.Before;
34+
import org.junit.Test;
35+
3236
import jdk.graal.compiler.asm.aarch64.AArch64Address;
3337
import jdk.graal.compiler.asm.aarch64.AArch64Assembler;
3438
import jdk.graal.compiler.asm.aarch64.AArch64MacroAssembler;
3539
import jdk.graal.compiler.core.aarch64.test.AArch64TestMacroAssembler;
3640
import jdk.graal.compiler.core.common.NumUtil;
3741
import jdk.graal.compiler.test.GraalTest;
38-
import org.junit.Assert;
39-
import org.junit.Before;
40-
import org.junit.Test;
41-
4242
import jdk.vm.ci.aarch64.AArch64;
4343
import jdk.vm.ci.aarch64.AArch64.CPUFeature;
4444
import jdk.vm.ci.code.Architecture;
@@ -59,16 +59,11 @@ private static EnumSet<AArch64.CPUFeature> computeFeatures() {
5959
return features;
6060
}
6161

62-
private static EnumSet<AArch64.Flag> computeFlags() {
63-
EnumSet<AArch64.Flag> flags = EnumSet.noneOf(AArch64.Flag.class);
64-
return flags;
65-
}
66-
6762
private static TargetDescription createTarget() {
6863
final int stackFrameAlignment = 16;
6964
final int implicitNullCheckLimit = 4096;
7065
final boolean inlineObjects = true;
71-
Architecture arch = new AArch64(computeFeatures(), computeFlags());
66+
Architecture arch = new AArch64(computeFeatures());
7267
return new TargetDescription(arch, true, stackFrameAlignment, implicitNullCheckLimit, inlineObjects);
7368
}
7469

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/amd64/test/AMD64HotSpotFrameOmissionTest.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -28,16 +28,14 @@
2828

2929
import java.util.Arrays;
3030

31-
import jdk.graal.compiler.core.test.GraalCompilerTest;
3231
import org.junit.Assert;
3332
import org.junit.Ignore;
3433
import org.junit.Test;
3534

3635
import jdk.graal.compiler.asm.amd64.AMD64Assembler;
37-
36+
import jdk.graal.compiler.core.test.GraalCompilerTest;
3837
import jdk.vm.ci.code.InstalledCode;
3938
import jdk.vm.ci.code.Register;
40-
import jdk.vm.ci.code.RegisterArray;
4139
import jdk.vm.ci.code.TargetDescription;
4240
import jdk.vm.ci.hotspot.HotSpotCallingConventionType;
4341
import jdk.vm.ci.meta.JavaKind;
@@ -128,7 +126,6 @@ private void testHelper(String name, CodeGenerator gen) {
128126
}
129127

130128
private Register getArgumentRegister(int index, JavaKind kind) {
131-
RegisterArray regs = getCodeCache().getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, kind);
132-
return regs.get(index);
129+
return getCodeCache().getRegisterConfig().getCallingConventionRegisters(HotSpotCallingConventionType.JavaCall, kind).get(index);
133130
}
134131
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64Assembler.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,10 @@ private enum OpAssertion {
232232
}
233233

234234
protected boolean checkOperands(AMD64Op op, OperandSize size, Register resultReg, Register inputReg) {
235-
assert resultReg == null || resultCategory.equals(resultReg.getRegisterCategory()) : "invalid result register " + resultReg + " used in " + op;
236-
assert inputReg == null || inputCategory.equals(inputReg.getRegisterCategory()) : "invalid input register " + inputReg + " used in " + op;
235+
GraalError.guarantee(resultReg == null || resultCategory.equals(resultReg.getRegisterCategory()), "invalid result register %s used in %s ", resultReg, op);
236+
GraalError.guarantee(inputReg == null || inputCategory.equals(inputReg.getRegisterCategory()), "invalid input register %s used in %s ", inputReg, op);
237+
GraalError.guarantee(resultReg == null || !inRC(CPU, resultReg) || (resultReg.encoding < 16), "APX register %s used in %s is not yet supported", resultReg, op);
238+
GraalError.guarantee(inputReg == null || !inRC(CPU, inputReg) || (inputReg.encoding < 16), "APX register %s used in %s is not yet supported", inputReg, op);
237239

238240
for (OperandSize s : allowedSizes) {
239241
if (size == s) {

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/asm/amd64/AMD64BaseAssembler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,9 @@ protected static int getRXB(Register reg, Register rm) {
584584
* There is an SIB byte: In that case, X extends SIB.index and B extends SIB.base.
585585
*/
586586
protected static int getRXB(Register reg, AMD64Address rm) {
587-
assert !isInvalidEncoding(reg);
587+
GraalError.guarantee(!isInvalidEncoding(reg), "invalid encoding %s", reg);
588+
GraalError.guarantee(rm.getBase() == null || rm.getBase().encoding < 16, "APX register used in %s not yet supported", rm);
589+
GraalError.guarantee(rm.getIndex() == null || rm.getIndex().encoding < 16, "APX register used in %s not yet supported", rm);
588590
int rxb = (reg == null ? 0 : reg.encoding & 0x08) >> 1;
589591
if (!isInvalidEncoding(rm.getIndex())) {
590592
rxb |= (rm.getIndex().encoding & 0x08) >> 2;

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/core/common/alloc/RegisterAllocationConfig.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
2525
package jdk.graal.compiler.core.common.alloc;
2626

2727
import java.util.Arrays;
28+
import java.util.List;
2829

2930
import org.graalvm.collections.EconomicMap;
3031
import org.graalvm.collections.Equivalence;
@@ -33,7 +34,6 @@
3334
import jdk.graal.compiler.debug.Assertions;
3435
import jdk.vm.ci.code.Register;
3536
import jdk.vm.ci.code.Register.RegisterCategory;
36-
import jdk.vm.ci.code.RegisterArray;
3737
import jdk.vm.ci.code.RegisterConfig;
3838
import jdk.vm.ci.meta.PlatformKind;
3939

@@ -44,18 +44,18 @@
4444
public class RegisterAllocationConfig {
4545

4646
public static final class AllocatableRegisters {
47-
public final Register[] allocatableRegisters;
47+
public final List<Register> allocatableRegisters;
4848
public final int minRegisterNumber;
4949
public final int maxRegisterNumber;
5050

51-
public AllocatableRegisters(RegisterArray allocatableRegisters, int minRegisterNumber, int maxRegisterNumber) {
52-
this.allocatableRegisters = allocatableRegisters.toArray();
51+
public AllocatableRegisters(List<Register> allocatableRegisters, int minRegisterNumber, int maxRegisterNumber) {
52+
this.allocatableRegisters = allocatableRegisters;
5353
this.minRegisterNumber = minRegisterNumber;
5454
this.maxRegisterNumber = maxRegisterNumber;
5555
assert verify(allocatableRegisters, minRegisterNumber, maxRegisterNumber);
5656
}
5757

58-
private static boolean verify(RegisterArray allocatableRegisters, int minRegisterNumber, int maxRegisterNumber) {
58+
private static boolean verify(List<Register> allocatableRegisters, int minRegisterNumber, int maxRegisterNumber) {
5959
int min = Integer.MAX_VALUE;
6060
int max = Integer.MIN_VALUE;
6161
for (Register reg : allocatableRegisters) {
@@ -79,7 +79,7 @@ private static boolean verify(RegisterArray allocatableRegisters, int minRegiste
7979
* after the register name in the {@code spec}. In this case, {@code null} is returned instead
8080
* of throwing an exception.
8181
*/
82-
private static Register findRegister(String spec, RegisterArray all) {
82+
private static Register findRegister(String spec, List<Register> all) {
8383
boolean optional = false;
8484
String name = spec;
8585
if (spec.endsWith("?")) {
@@ -97,7 +97,7 @@ private static Register findRegister(String spec, RegisterArray all) {
9797
throw new IllegalArgumentException("register " + name + " is not allocatable");
9898
}
9999

100-
protected RegisterArray initAllocatable(RegisterArray registers) {
100+
protected List<Register> initAllocatable(List<Register> registers) {
101101
if (allocationRestrictedTo != null) {
102102
Register[] regs = new Register[allocationRestrictedTo.length];
103103
int i = 0;
@@ -109,7 +109,7 @@ protected RegisterArray initAllocatable(RegisterArray registers) {
109109
regs[i++] = register;
110110
}
111111
}
112-
return new RegisterArray(regs);
112+
return List.of(regs);
113113
}
114114

115115
return registers;
@@ -118,7 +118,7 @@ protected RegisterArray initAllocatable(RegisterArray registers) {
118118
protected final RegisterConfig registerConfig;
119119
private final EconomicMap<PlatformKind.Key, AllocatableRegisters> categorized = EconomicMap.create(Equivalence.DEFAULT);
120120
private final String[] allocationRestrictedTo;
121-
private RegisterArray cachedRegisters;
121+
private List<Register> cachedRegisters;
122122

123123
/**
124124
* @param allocationRestrictedTo if not {@code null}, register allocation will be restricted to
@@ -153,10 +153,10 @@ public AllocatableRegisters getAllocatableRegisters(PlatformKind kind) {
153153
* @return {@code null} if there are no allocatable registers for the given kind
154154
*/
155155
public RegisterCategory getRegisterCategory(PlatformKind kind) {
156-
return getAllocatableRegisters(kind).allocatableRegisters[0].getRegisterCategory();
156+
return getAllocatableRegisters(kind).allocatableRegisters.get(0).getRegisterCategory();
157157
}
158158

159-
private static AllocatableRegisters createAllocatableRegisters(RegisterArray registers) {
159+
private static AllocatableRegisters createAllocatableRegisters(List<Register> registers) {
160160
if (registers.size() == 0) {
161161
return null;
162162
}
@@ -177,7 +177,7 @@ private static AllocatableRegisters createAllocatableRegisters(RegisterArray reg
177177
/**
178178
* Gets the set of registers that can be used by the register allocator.
179179
*/
180-
public RegisterArray getAllocatableRegisters() {
180+
public List<Register> getAllocatableRegisters() {
181181
if (cachedRegisters == null) {
182182
cachedRegisters = initAllocatable(registerConfig.getAllocatableRegisters());
183183
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotForeignCallLinkage.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -27,10 +27,10 @@
2727
import java.util.BitSet;
2828
import java.util.List;
2929

30-
import jdk.graal.compiler.core.common.LibGraalSupport;
3130
import org.graalvm.collections.EconomicMap;
3231
import org.graalvm.collections.EconomicSet;
3332

33+
import jdk.graal.compiler.core.common.LibGraalSupport;
3434
import jdk.graal.compiler.core.common.spi.ForeignCallDescriptor.CallSideEffect;
3535
import jdk.graal.compiler.core.common.spi.ForeignCallLinkage;
3636
import jdk.graal.compiler.core.common.spi.ForeignCallSignature;
@@ -54,7 +54,6 @@
5454
import jdk.graal.compiler.serviceprovider.GlobalAtomicLong;
5555
import jdk.internal.misc.Unsafe;
5656
import jdk.vm.ci.code.Register;
57-
import jdk.vm.ci.code.RegisterArray;
5857
import jdk.vm.ci.meta.InvokeTarget;
5958

6059
/**
@@ -290,7 +289,7 @@ enum RegisterEffect {
290289
* @param killedRegisters see {@link Stub#getDestroyedCallerRegisters()}
291290
*/
292291
record CodeInfo(long start, EconomicSet<Register> killedRegisters) {
293-
public static CodeInfo fromMemory(long memory, RegisterArray allRegisters) {
292+
public static CodeInfo fromMemory(long memory, List<Register> allRegisters) {
294293
Unsafe unsafe = Unsafe.getUnsafe();
295294
// @formatter:off
296295
int offset = 0;
@@ -361,7 +360,7 @@ static HotSpotForeignCallLinkageImpl.CodeInfo getCodeInfo(Stub stub, Backend bac
361360
data.set(codeInfo.toMemory());
362361
return codeInfo;
363362
}
364-
RegisterArray allRegisters = backend.getCodeCache().getTarget().arch.getRegisters();
363+
List<Register> allRegisters = backend.getCodeCache().getTarget().arch.getRegisters();
365364
return HotSpotForeignCallLinkageImpl.CodeInfo.fromMemory(codeInfoInMemory, allRegisters);
366365
}
367366

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotBackendFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2025, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2018, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -147,7 +147,7 @@ protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider graa
147147

148148
@Override
149149
protected Value[] createNativeABICallerSaveRegisters(@SuppressWarnings("unused") GraalHotSpotVMConfig config, RegisterConfig regConfig) {
150-
List<Register> callerSave = new ArrayList<>(regConfig.getAllocatableRegisters().asList());
150+
List<Register> callerSave = new ArrayList<>(regConfig.getAllocatableRegisters());
151151
// Removing callee-saved registers.
152152
/* General Purpose Registers. */
153153
callerSave.remove(AArch64.r19);

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotLIRGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public Variable emitForeignCall(ForeignCallLinkage linkage, LIRFrameState state,
343343
AArch64SaveRegistersOp save = null;
344344
Stub stub = getStub();
345345
if (destroysRegisters && stub != null && stub.getLinkage().getEffect() == HotSpotForeignCallLinkage.RegisterEffect.COMPUTES_REGISTERS_KILLED) {
346-
Register[] savedRegisters = getRegisterConfig().getAllocatableRegisters().toArray();
346+
Register[] savedRegisters = getRegisterConfig().getAllocatableRegisters().toArray(Register[]::new);
347347
save = emitSaveAllRegisters(savedRegisters);
348348
}
349349

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotNodeLIRBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -102,7 +102,7 @@ protected void emitPrologue(StructuredGraph graph) {
102102
Stub stub = result.getStub();
103103
if (stub != null && stub.getLinkage().getEffect() == HotSpotForeignCallLinkage.RegisterEffect.KILLS_NO_REGISTERS) {
104104
assert stub.getLinkage().getDescriptor().getTransition() != HotSpotForeignCallDescriptor.Transition.SAFEPOINT : stub;
105-
Register[] savedRegisters = getGen().getRegisterConfig().getAllocatableRegisters().toArray();
105+
Register[] savedRegisters = getGen().getRegisterConfig().getAllocatableRegisters().toArray(Register[]::new);
106106
AArch64SaveRegistersOp saveOp = getGen().emitSaveAllRegisters(savedRegisters);
107107
result.setSaveOnEntry(saveOp);
108108
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/aarch64/AArch64HotSpotRegisterAllocationConfig.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -89,10 +89,10 @@
8989

9090
import java.util.ArrayList;
9191
import java.util.BitSet;
92+
import java.util.List;
9293

9394
import jdk.graal.compiler.core.common.alloc.RegisterAllocationConfig;
9495
import jdk.vm.ci.code.Register;
95-
import jdk.vm.ci.code.RegisterArray;
9696
import jdk.vm.ci.code.RegisterConfig;
9797

9898
public class AArch64HotSpotRegisterAllocationConfig extends RegisterAllocationConfig {
@@ -129,7 +129,7 @@ public AArch64HotSpotRegisterAllocationConfig(RegisterConfig registerConfig, Str
129129
}
130130

131131
@Override
132-
protected RegisterArray initAllocatable(RegisterArray registers) {
132+
protected List<Register> initAllocatable(List<Register> registers) {
133133
BitSet regMap = new BitSet(registerConfig.getAllocatableRegisters().size());
134134
for (Register reg : registers) {
135135
regMap.set(reg.number);
@@ -145,6 +145,6 @@ protected RegisterArray initAllocatable(RegisterArray registers) {
145145
}
146146
}
147147

148-
return super.initAllocatable(new RegisterArray(allocatableRegisters));
148+
return super.initAllocatable(List.copyOf(allocatableRegisters));
149149
}
150150
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -130,7 +130,7 @@ protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runt
130130

131131
@Override
132132
protected Value[] createNativeABICallerSaveRegisters(GraalHotSpotVMConfig config, RegisterConfig regConfig) {
133-
List<Register> callerSave = new ArrayList<>(regConfig.getAllocatableRegisters().asList());
133+
List<Register> callerSave = new ArrayList<>(regConfig.getAllocatableRegisters());
134134
if (config.osName.equals("windows")) {
135135
// http://msdn.microsoft.com/en-us/library/9z1stfyw.aspx
136136
callerSave.remove(AMD64.rdi);

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/amd64/AMD64HotSpotLIRGenerator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,6 @@
9090
import jdk.vm.ci.amd64.AMD64Kind;
9191
import jdk.vm.ci.code.CallingConvention;
9292
import jdk.vm.ci.code.Register;
93-
import jdk.vm.ci.code.RegisterArray;
9493
import jdk.vm.ci.code.RegisterConfig;
9594
import jdk.vm.ci.code.RegisterValue;
9695
import jdk.vm.ci.meta.AllocatableValue;
@@ -378,7 +377,7 @@ public AMD64SaveRegistersOp emitSaveAllRegisters(boolean forSafepoint) {
378377
* @param exclude
379378
*/
380379
protected Register[] getSaveableRegisters(boolean forSafepoint, AllocatableValue exclude) {
381-
RegisterArray allocatableRegisters = getResult().getRegisterAllocationConfig().getAllocatableRegisters();
380+
List<Register> allocatableRegisters = getResult().getRegisterAllocationConfig().getAllocatableRegisters();
382381

383382
ArrayList<Register> registers = new ArrayList<>(allocatableRegisters.size());
384383
for (Register reg : allocatableRegisters) {

0 commit comments

Comments
 (0)