Mercurial > hg > graal-compiler
changeset 22447:cc1f997e6185
TraceRA: intoduce ShadowedRegisterValue.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Thu, 13 Aug 2015 11:18:25 +0200 |
parents | 68c0237791e8 |
children | 417ae972af50 |
files | graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/ShadowedRegisterValue.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceUtil.java |
diffstat | 5 files changed, 114 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/ShadowedRegisterValue.java Thu Aug 13 11:18:25 2015 +0200 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.lir.alloc.trace; + +import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; + +import java.util.*; + +import jdk.internal.jvmci.code.*; +import jdk.internal.jvmci.meta.*; + +import com.oracle.graal.lir.*; +import com.oracle.graal.lir.LIRInstruction.OperandFlag; +import com.oracle.graal.lir.LIRInstruction.OperandMode; + +/** + * Represents a {@link #register} which has a shadow copy on the {@link #stackslot stack}. + * <p> + * Note: {@link ShadowedRegisterValue} does not follow the contract of {@link CompositeValue}, for + * instance the {@link #forEachComponent} does not visit {@link #register} or {@link #stackslot} but + * the {@link CompositeValue} itself. Therefore it should be only used in the context of the + * {@link TraceRegisterAllocationPhase}. + */ +final class ShadowedRegisterValue extends CompositeValue { + private static final EnumSet<OperandFlag> flags = EnumSet.of(COMPOSITE); + private static final EnumSet<OperandFlag> registerFlags = EnumSet.of(REG); + private static final EnumSet<OperandFlag> stackslotFlags = EnumSet.of(STACK); + + @Component({REG}) protected RegisterValue register; + @Component({STACK}) protected StackSlotValue stackslot; + + public ShadowedRegisterValue(RegisterValue register, StackSlotValue stackslot) { + super(register.getLIRKind()); + assert (register.getLIRKind().equals(stackslot.getLIRKind())); + this.register = register; + this.stackslot = stackslot; + } + + public RegisterValue getRegister() { + return register; + } + + public StackSlotValue getStackSlot() { + return stackslot; + } + + @Override + public Value forEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueProcedure proc) { + /* TODO(jeisl) This is a hack to be able to replace the composite value with the register. */ + return proc.doValue(inst, this, mode, flags); + } + + @Override + protected void visitEachComponent(LIRInstruction inst, OperandMode mode, InstructionValueConsumer proc) { + proc.visitValue(inst, register, mode, registerFlags); + proc.visitValue(inst, stackslot, mode, stackslotFlags); + } + +}
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java Tue Aug 11 18:12:05 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java Thu Aug 13 11:18:25 2015 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.lir.alloc.trace; +import static com.oracle.graal.lir.alloc.trace.TraceUtil.*; import static jdk.internal.jvmci.code.ValueUtil.*; import java.util.*; @@ -60,7 +61,7 @@ TraceGlobalMoveResolver moveResolver = new TraceGlobalMoveResolver(lirGenRes, spillMoveFactory, arch); PhiValueVisitor visitor = (Value phiIn, Value phiOut) -> { if (!isIllegal(phiIn) && !TraceGlobalMoveResolver.isMoveToSelf(phiOut, phiIn)) { - moveResolver.addMapping(phiOut, (AllocatableValue) phiIn); + moveResolver.addMapping(getFromValue(phiOut), (AllocatableValue) phiIn); } }; @@ -93,4 +94,8 @@ } } } + + private static Value getFromValue(Value from) { + return isShadowedRegisterValue(from) ? asShadowedRegisterValue(from).getRegister() : from; + } }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java Tue Aug 11 18:12:05 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java Thu Aug 13 11:18:25 2015 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.lir.alloc.trace; +import static com.oracle.graal.lir.alloc.trace.TraceUtil.*; import static jdk.internal.jvmci.code.ValueUtil.*; import java.util.*; @@ -226,7 +227,18 @@ if (to.equals(from)) { return true; } - if (from != null && isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { + if (from == null) { + return false; + } + if (isShadowedRegisterValue(from)) { + ShadowedRegisterValue shadowed = asShadowedRegisterValue(from); + // TODO(jeisl)if (isStackSlotValue(to)) { + // return to.equals(shadowed.getStackSlot()); + // } + if (isRegister(to)) { + return asRegister(to).equals(asRegister(shadowed.getRegister())); + } + } else if (isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { assert LIRKind.verifyMoveKinds(to.getLIRKind(), from.getLIRKind()) : String.format("Same register but Kind mismatch %s <- %s", to, from); return true; }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java Tue Aug 11 18:12:05 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceLinearScanAssignLocationsPhase.java Thu Aug 13 11:18:25 2015 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.lir.alloc.trace; import static jdk.internal.jvmci.code.ValueUtil.*; +import jdk.internal.jvmci.code.*; import jdk.internal.jvmci.meta.*; import com.oracle.graal.compiler.common.alloc.TraceBuilder.TraceBuilderResult; @@ -64,6 +65,9 @@ assert mode != OperandMode.DEF; return interval.getMaterializedValue(); } + if (interval.alwaysInMemory() && isRegister(interval.location())) { + return new ShadowedRegisterValue((RegisterValue) interval.location(), interval.spillSlot()); + } return interval.location(); }
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceUtil.java Tue Aug 11 18:12:05 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceUtil.java Thu Aug 13 11:18:25 2015 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.lir.alloc.trace; +import jdk.internal.jvmci.meta.*; + import com.oracle.graal.compiler.common.alloc.TraceBuilder.TraceBuilderResult; import com.oracle.graal.compiler.common.cfg.*; @@ -39,4 +41,14 @@ } return bestPred; } + + static boolean isShadowedRegisterValue(Value value) { + assert value != null; + return value instanceof ShadowedRegisterValue; + } + + static ShadowedRegisterValue asShadowedRegisterValue(Value value) { + assert isShadowedRegisterValue(value); + return (ShadowedRegisterValue) value; + } }