# HG changeset patch # User Josef Eisl # Date 1430126469 -7200 # Node ID 50a21b1fe8b7e6182f5f471c81b62aec4c0b7e33 # Parent 00bbd2badfd361314bcb99e90f42d8244f444103 StackSlotAllocation: add support for hints. diff -r 00bbd2badfd3 -r 50a21b1fe8b7 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/FixPointIntervalBuilder.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/FixPointIntervalBuilder.java Wed Apr 29 09:28:58 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/FixPointIntervalBuilder.java Mon Apr 27 11:21:09 2015 +0200 @@ -189,6 +189,7 @@ if (isVirtualStackSlot(operand)) { VirtualStackSlot vslot = asVirtualStackSlot(operand); addUse(vslot, inst, flags); + addRegisterHint(inst, vslot, mode, flags, false); usePos.add(inst); Debug.log("set operand: %s", operand); currentSet.set(vslot.getId()); @@ -201,6 +202,7 @@ if (isVirtualStackSlot(operand)) { VirtualStackSlot vslot = asVirtualStackSlot(operand); addDef(vslot, inst); + addRegisterHint(inst, vslot, mode, flags, true); usePos.add(inst); Debug.log("clear operand: %s", operand); currentSet.clear(vslot.getId()); @@ -229,6 +231,32 @@ interval.addFrom(inst.id()); } + void addRegisterHint(final LIRInstruction op, VirtualStackSlot targetValue, OperandMode mode, EnumSet flags, final boolean hintAtDef) { + if (flags.contains(OperandFlag.HINT)) { + + op.forEachRegisterHint(targetValue, mode, (registerHint, valueMode, valueFlags) -> { + if (isStackSlotValue(registerHint)) { + assert isVirtualStackSlot(registerHint) : "Hint is not a VirtualStackSlot: " + registerHint; + StackInterval from = getOrCreateInterval((VirtualStackSlot) registerHint); + StackInterval to = getOrCreateInterval(targetValue); + + /* hints always point from def to use */ + if (hintAtDef) { + to.setLocationHint(from); + } else { + from.setLocationHint(to); + } + if (Debug.isLogEnabled()) { + Debug.log("operation %s at opId %d: added hint from interval %d to %d", op, op.id(), from, to); + } + + return registerHint; + } + return null; + }); + } + } + } private StackInterval get(VirtualStackSlot stackSlot) { diff -r 00bbd2badfd3 -r 50a21b1fe8b7 graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackInterval.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackInterval.java Wed Apr 29 09:28:58 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/stackslotalloc/StackInterval.java Mon Apr 27 11:21:09 2015 +0200 @@ -30,6 +30,7 @@ private static final int INVALID_START = Integer.MAX_VALUE; private static final int INVALID_END = Integer.MIN_VALUE; private final VirtualStackSlot operand; + private StackInterval hint; private final LIRKind kind; private int from = INVALID_START; private int to = INVALID_END; @@ -98,7 +99,15 @@ @Override public String toString() { - return String.format("SI[%d-%d] k=%s o=%s l=%s", from, to, kind, operand, location); + return String.format("SI[%d-%d] k=%s o=%s l=%s h=%s", from, to, kind, operand, location, hint.getOperand()); + } + + public void setLocationHint(StackInterval locationHint) { + hint = locationHint; + } + + public StackInterval locationHint() { + return hint; } } diff -r 00bbd2badfd3 -r 50a21b1fe8b7 graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java --- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Wed Apr 29 09:28:58 2015 +0200 +++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/CFGPrinter.java Mon Apr 27 11:21:09 2015 +0200 @@ -576,7 +576,8 @@ out.printf("\"[%s|%c]\"", interval.getOperand(), interval.getOperand().getKind().getTypeChar()); } - out.printf("%s -1 ", interval.getOperand()); + StackInterval hint = interval.locationHint(); + out.printf("%s %s ", interval.getOperand(), hint != null ? hint.getOperand() : -1); out.printf("[%d, %d[", interval.from(), interval.to());