# HG changeset patch # User Josef Eisl # Date 1430144774 -7200 # Node ID a03e95b6d629ebeec00f1c11b6985045012b93ad # Parent 5b913e45262925e3477c3f629d8ea622e5fc4a2c MoveResolver: refactor handling of blocked registers. diff -r 5b913e452629 -r a03e95b6d629 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/MoveResolver.java --- 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; } }