changeset 22662:31da25ac2805

Extra flag in RegisterCategory to determine whether a register is part of the reference map.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 07 Oct 2015 12:14:03 +0200
parents db43de18c170
children 41b97852175d
files jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/CodeUtil.java jvmci/jdk.internal.jvmci.code/src/jdk/internal/jvmci/code/Register.java
diffstat 2 files changed, 20 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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;
                 }
--- 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;
     }