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;
+    }
 }