changeset 21202:a03e95b6d629

MoveResolver: refactor handling of blocked registers.
author Josef Eisl <josef.eisl@jku.at>
date Mon, 27 Apr 2015 16:26:14 +0200
parents 5b913e452629
children 9f45587ad8f5
files graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/MoveResolver.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/PhiResolver.java
diffstat 1 files changed, 18 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/MoveResolver.java	Wed Apr 29 13:19:43 2015 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/MoveResolver.java	Mon Apr 27 16:26:14 2015 +0200
@@ -29,6 +29,7 @@
 
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.lir.*;
 
@@ -47,13 +48,18 @@
     private boolean multipleReadsAllowed;
     private final int[] registerBlocked;
 
-    private int registerBlocked(int reg) {
-        return registerBlocked[reg];
+    private void setValueBlocked(Value location, int direction) {
+        assert direction == 1 || direction == -1 : "out of bounds";
+        if (isRegister(location)) {
+            registerBlocked[asRegister(location).number] += direction;
+        }
     }
 
-    private void setRegisterBlocked(int reg, int direction) {
-        assert direction == 1 || direction == -1 : "out of bounds";
-        registerBlocked[reg] += direction;
+    private int valueBlocked(Value location) {
+        if (isRegister(location)) {
+            return registerBlocked[asRegister(location).number];
+        }
+        throw GraalInternalError.shouldNotReachHere("unhandled value " + location);
     }
 
     void setMultipleReadsAllowed() {
@@ -80,7 +86,7 @@
     boolean checkEmpty() {
         assert mappingFrom.size() == 0 && mappingFromOpr.size() == 0 && mappingTo.size() == 0 : "list must be empty before and after processing";
         for (int i = 0; i < allocator.registers.length; i++) {
-            assert registerBlocked(i) == 0 : "register map must be empty before and after processing";
+            assert registerBlocked[i] == 0 : "register map must be empty before and after processing";
         }
         assert !multipleReadsAllowed : "must have default value";
         return true;
@@ -149,9 +155,9 @@
     private void blockRegisters(Interval interval) {
         Value location = interval.location();
         if (isRegister(location)) {
-            int reg = asRegister(location).number;
-            assert multipleReadsAllowed || registerBlocked(reg) == 0 : "register already marked as used";
-            setRegisterBlocked(reg, 1);
+            assert multipleReadsAllowed || valueBlocked(location) == 0 : "register already marked as used";
+            int direction = 1;
+            setValueBlocked(location, direction);
         }
     }
 
@@ -159,9 +165,8 @@
     private void unblockRegisters(Interval interval) {
         Value location = interval.location();
         if (isRegister(location)) {
-            int reg = asRegister(location).number;
-            assert registerBlocked(reg) > 0 : "register already marked as unused";
-            setRegisterBlocked(reg, -1);
+            assert valueBlocked(location) > 0 : "register already marked as unused";
+            setValueBlocked(location, -1);
         }
     }
 
@@ -174,7 +179,7 @@
 
         Value reg = to.location();
         if (isRegister(reg)) {
-            if (registerBlocked(asRegister(reg).number) > 1 || (registerBlocked(asRegister(reg).number) == 1 && !reg.equals(fromReg))) {
+            if (valueBlocked(reg) > 1 || (valueBlocked(reg) == 1 && !reg.equals(fromReg))) {
                 return false;
             }
         }