# HG changeset patch # User Roland Schatz # Date 1444212843 -7200 # Node ID 31da25ac2805f93ee1fe45d03abe6ae79cb12e25 # Parent db43de18c17044f0c7b96a8d6e4d862b0f325328 Extra flag in RegisterCategory to determine whether a register is part of the reference map. diff -r db43de18c170 -r 31da25ac2805 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java --- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java Tue Oct 06 10:52:22 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java Wed Oct 07 12:14:03 2015 +0200 @@ -344,7 +344,7 @@ public DefaultRegFormatter(Architecture arch) { registers = new Register[arch.getRegisterReferenceMapSize()]; for (Register r : arch.getAvailableValueRegisters()) { - if (r.getReferenceMapIndex() >= 0) { + if (r.mayContainReference()) { assert registers[r.getReferenceMapIndex()] == null : "overlapping registers " + r + " and " + registers[r.getReferenceMapIndex()] + " in reference map"; registers[r.getReferenceMapIndex()] = r; } diff -r db43de18c170 -r 31da25ac2805 jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java --- a/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java Tue Oct 06 10:52:22 2015 -0700 +++ b/jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java Wed Oct 07 12:14:03 2015 +0200 @@ -82,23 +82,29 @@ private final String name; + private final boolean mayContainReference; private final int referenceMapOffset; private final int referenceMapShift; public RegisterCategory(String name) { - this(name, 0, 0); + this(name, true, 0, 0); } public RegisterCategory(String name, boolean mayContainReference) { - this(name, mayContainReference ? 0 : Integer.MIN_VALUE, 0); + this(name, mayContainReference, 0, 0); } public RegisterCategory(String name, int referenceMapOffset) { - this(name, referenceMapOffset, 0); + this(name, true, referenceMapOffset, 0); } public RegisterCategory(String name, int referenceMapOffset, int referenceMapShift) { + this(name, true, referenceMapOffset, referenceMapShift); + } + + private RegisterCategory(String name, boolean mayContainReference, int referenceMapOffset, int referenceMapShift) { this.name = name; + this.mayContainReference = mayContainReference; this.referenceMapOffset = referenceMapOffset; this.referenceMapShift = referenceMapShift; } @@ -143,9 +149,18 @@ } /** - * Get the start index of this register in the {@link ReferenceMap}. + * Determine whether this register needs to be part of the reference map. + */ + public boolean mayContainReference() { + return registerCategory.mayContainReference; + } + + /** + * Get the start index of this register in the {@link ReferenceMap}. This method may only be + * called if {@link #mayContainReference()} is true. */ public int getReferenceMapIndex() { + assert mayContainReference(); return (encoding << registerCategory.referenceMapShift) + registerCategory.referenceMapOffset; }