# HG changeset patch # User Josef Eisl # Date 1447333015 -3600 # Node ID fe8534ad7e6e814d4c4ac23552ac771eb3355e0b # Parent a55fe96b8e0a2e0aeec868ef65653b3c1c2fd2c5 TraceRA: TraceGlobalMoveResolutionPhase: proper handling of ShadowedRegisterValue in LabelOp.incoming. diff -r a55fe96b8e0a -r fe8534ad7e6e graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java Thu Nov 12 14:01:02 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolutionPhase.java Thu Nov 12 13:56:55 2015 +0100 @@ -22,9 +22,11 @@ */ package com.oracle.graal.lir.alloc.trace; +import static com.oracle.graal.lir.LIRValueUtil.isStackSlotValue; import static com.oracle.graal.lir.alloc.trace.TraceUtil.asShadowedRegisterValue; import static com.oracle.graal.lir.alloc.trace.TraceUtil.isShadowedRegisterValue; import static jdk.vm.ci.code.ValueUtil.isIllegal; +import static jdk.vm.ci.code.ValueUtil.isRegister; import java.util.List; @@ -66,7 +68,41 @@ TraceGlobalMoveResolver moveResolver = new TraceGlobalMoveResolver(lirGenRes, spillMoveFactory, arch); PhiValueVisitor visitor = (Value phiIn, Value phiOut) -> { if (!isIllegal(phiIn) && !TraceGlobalMoveResolver.isMoveToSelf(phiOut, phiIn)) { - moveResolver.addMapping(getFromValue(phiOut), (AllocatableValue) phiIn); + // prepare input/output values. + final Value src; + final Value srcShadow; + if (isShadowedRegisterValue(phiOut)) { + ShadowedRegisterValue phiOutSh = asShadowedRegisterValue(phiOut); + src = phiOutSh.getRegister(); + srcShadow = phiOutSh.getStackSlot(); + } else { + src = phiOut; + srcShadow = null; + } + assert src != null; + assert srcShadow == null || isRegister(src) && isStackSlotValue(srcShadow) : "Unexpected shadowed value: " + phiOut; + + final Value dst; + final Value dstShadow; + if (isShadowedRegisterValue(phiIn)) { + ShadowedRegisterValue phiInSh = asShadowedRegisterValue(phiIn); + dst = phiInSh.getRegister(); + dstShadow = phiInSh.getStackSlot(); + } else { + dst = phiIn; + dstShadow = null; + } + assert dst != null; + assert dstShadow == null || isRegister(dst) && isStackSlotValue(dstShadow) : "Unexpected shadowed value: " + phiIn; + + // set dst + if (!dst.equals(src)) { + moveResolver.addMapping(src, (AllocatableValue) dst); + } + // set dst_shadow + if (dstShadow != null && !dstShadow.equals(src)) { + moveResolver.addMapping(src, (AllocatableValue) dstShadow); + } } }; @@ -99,8 +135,4 @@ } } } - - private static Value getFromValue(Value from) { - return isShadowedRegisterValue(from) ? asShadowedRegisterValue(from).getRegister() : from; - } } diff -r a55fe96b8e0a -r fe8534ad7e6e graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java --- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java Thu Nov 12 14:01:02 2015 +0100 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/trace/TraceGlobalMoveResolver.java Thu Nov 12 13:56:55 2015 +0100 @@ -251,14 +251,36 @@ return false; } if (isShadowedRegisterValue(from)) { + /* From is a shadowed register. */ + if (isShadowedRegisterValue(to)) { + // both shadowed but not equal + return false; + } ShadowedRegisterValue shadowed = asShadowedRegisterValue(from); - // TODO(jeisl)if (isStackSlotValue(to)) { - // return to.equals(shadowed.getStackSlot()); - // } - if (isRegister(to)) { - return asRegister(to).equals(asRegister(shadowed.getRegister())); + if (isRegisterToRegisterMoveToSelf(shadowed.getRegister(), to)) { + return true; + } + if (isStackSlotValue(to)) { + return to.equals(shadowed.getStackSlot()); } - } else if (isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { + } else { + /* + * A shadowed destination value is never a self move it both values are not equal. Fall + * through. + */ + // if (isShadowedRegisterValue(to)) return false; + + return isRegisterToRegisterMoveToSelf(from, to); + } + return false; + } + + private static boolean isRegisterToRegisterMoveToSelf(Value from, Value to) { + if (to.equals(from)) { + return true; + } + if (isRegister(from) && isRegister(to) && asRegister(from).equals(asRegister(to))) { + // Values differ but Registers are the same assert LIRKind.verifyMoveKinds(to.getLIRKind(), from.getLIRKind()) : String.format("Same register but Kind mismatch %s <- %s", to, from); return true; }