Mercurial > hg > graal-compiler
changeset 22453:9149dd8d7343
TraceRA: TraceLinearScanAssignLocationsPhase: handle outgoing operands before others.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Thu, 13 Aug 2015 13:28:35 +0200 |
parents | 0c3050170ba8 |
children | 2f6d931cd4be |
files | graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java |
diffstat | 1 files changed, 27 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java Thu Aug 13 13:11:01 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java Thu Aug 13 13:28:35 2015 +0200 @@ -22,13 +22,18 @@ */ package com.oracle.graal.lir.alloc.trace; +import static com.oracle.graal.lir.LIRValueUtil.*; import static jdk.internal.jvmci.code.ValueUtil.*; + +import java.util.*; + import jdk.internal.jvmci.code.*; import jdk.internal.jvmci.meta.*; import com.oracle.graal.compiler.common.alloc.TraceBuilder.TraceBuilderResult; import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.lir.*; +import com.oracle.graal.lir.LIRInstruction.OperandFlag; import com.oracle.graal.lir.LIRInstruction.OperandMode; import com.oracle.graal.lir.StandardOp.BlockEndOp; import com.oracle.graal.lir.alloc.lsra.*; @@ -48,33 +53,31 @@ } @Override - protected Value colorLirOperand(LIRInstruction op, Variable operand, OperandMode mode) { - if (!isBlockEndWithEdgeToUnallocatedTrace(op, mode)) { - return super.colorLirOperand(op, operand, mode); + protected boolean assignLocations(LIRInstruction op) { + if (isBlockEndWithEdgeToUnallocatedTrace(op)) { + ((BlockEndOp) op).forEachOutgoingValue(colorOutgoingValues); } - - int opId = op.id(); - Interval interval = allocator.intervalFor(operand); - assert interval != null : "interval must exist"; - - /* - * Operands are not changed when an interval is split during allocation, so search the right - * interval here. - */ - interval = allocator.splitChildAtOpId(interval, opId, mode); - - if (isIllegal(interval.location()) && interval.canMaterialize()) { - assert mode != OperandMode.DEF; - return interval.getMaterializedValue(); - } - if (interval.alwaysInMemory() && isRegister(interval.location())) { - return new ShadowedRegisterValue((RegisterValue) interval.location(), interval.spillSlot()); - } - return interval.location(); + return super.assignLocations(op); } - private boolean isBlockEndWithEdgeToUnallocatedTrace(LIRInstruction op, OperandMode mode) { - if (!(op instanceof BlockEndOp) || !OperandMode.ALIVE.equals(mode)) { + private InstructionValueProcedure colorOutgoingValues = new InstructionValueProcedure() { + + public Value doValue(LIRInstruction instruction, Value value, OperandMode mode, EnumSet<OperandFlag> flags) { + if (isRegister(value) || isVariable(value)) { + Interval interval = allocator.intervalFor(value); + assert interval != null : "interval must exist"; + interval = allocator.splitChildAtOpId(interval, instruction.id(), mode); + + if (interval.alwaysInMemory() && isRegister(interval.location())) { + return new ShadowedRegisterValue((RegisterValue) interval.location(), interval.spillSlot()); + } + } + return value; + } + }; + + private boolean isBlockEndWithEdgeToUnallocatedTrace(LIRInstruction op) { + if (!(op instanceof BlockEndOp)) { return false; } AbstractBlockBase<?> block = allocator.blockForId(op.id());