Mercurial > hg > truffle
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; } }