changeset 23000:e7a33f98252a

NodeLIRBuilder: generalize allowObjectConstantToStackMove to allowConstantToStackMove and move it to MoveFactory.
author Josef Eisl <josef.eisl@jku.at>
date Mon, 16 Nov 2015 15:46:07 +0100
parents 585a12d31a00
children 8fbac394a175
files graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MoveFactory.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCMoveFactory.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotMoveFactory.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/VerifyingMoveFactory.java
diffstat 6 files changed, 31 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MoveFactory.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64MoveFactory.java	Mon Nov 16 15:46:07 2015 +0100
@@ -44,7 +44,7 @@
 import com.oracle.graal.lir.amd64.AMD64Move.MoveToRegOp;
 import com.oracle.graal.lir.framemap.FrameMapBuilder;
 
-public class AMD64MoveFactory extends AMD64MoveFactoryBase {
+public abstract class AMD64MoveFactory extends AMD64MoveFactoryBase {
 
     private final FrameMapBuilder frameMapBuilder;
 
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCMoveFactory.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCMoveFactory.java	Mon Nov 16 15:46:07 2015 +0100
@@ -106,4 +106,10 @@
                 return false;
         }
     }
+
+    @Override
+    public boolean allowConstantToStackMove(Constant value) {
+        return false;
+    }
+
 }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRBuilder.java	Mon Nov 16 15:46:07 2015 +0100
@@ -67,6 +67,7 @@
 import com.oracle.graal.lir.FullInfopointOp;
 import com.oracle.graal.lir.LIRFrameState;
 import com.oracle.graal.lir.LIRInstruction;
+import com.oracle.graal.lir.LIRValueUtil;
 import com.oracle.graal.lir.LabelRef;
 import com.oracle.graal.lir.SimpleInfopointOp;
 import com.oracle.graal.lir.StandardOp.JumpOp;
@@ -81,7 +82,6 @@
 import com.oracle.graal.nodes.AbstractBeginNode;
 import com.oracle.graal.nodes.AbstractEndNode;
 import com.oracle.graal.nodes.AbstractMergeNode;
-import com.oracle.graal.nodes.ConstantNode;
 import com.oracle.graal.nodes.DeoptimizingNode;
 import com.oracle.graal.nodes.DirectCallTargetNode;
 import com.oracle.graal.nodes.FixedNode;
@@ -144,13 +144,6 @@
         nodeMatchRules.lirBuilder = this;
     }
 
-    /**
-     * @return {@code true} if object constant to stack moves are supported.
-     */
-    protected boolean allowObjectConstantToStackMove() {
-        return true;
-    }
-
     public NodeMatchRules getNodeMatchRules() {
         return nodeMatchRules;
     }
@@ -300,10 +293,11 @@
                  * new Variable.
                  */
                 value = gen.emitMove(value);
-            } else if (!allowObjectConstantToStackMove() && node instanceof ConstantNode && !value.getLIRKind().isValue()) {
+            } else if (LIRValueUtil.isConstantValue(value) && !gen.getMoveFactory().allowConstantToStackMove(LIRValueUtil.asConstant(value))) {
                 /*
-                 * Object constants are not allowed as inputs for PHIs. Explicitly create a copy of
-                 * this value to force it into a register. The new variable is only used in the PHI.
+                 * Some constants are not allowed as inputs for PHIs in certain backends. Explicitly
+                 * create a copy of this value to force it into a register. The new variable is only
+                 * used in the PHI.
                  */
                 Variable result = gen.newVariable(value.getLIRKind());
                 gen.emitMove(result, value);
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotMoveFactory.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotMoveFactory.java	Mon Nov 16 15:46:07 2015 +0100
@@ -23,6 +23,7 @@
 package com.oracle.graal.hotspot.amd64;
 
 import jdk.vm.ci.hotspot.HotSpotCompressedNullConstant;
+import jdk.vm.ci.hotspot.HotSpotConstant;
 import jdk.vm.ci.hotspot.HotSpotMetaspaceConstant;
 import jdk.vm.ci.hotspot.HotSpotObjectConstant;
 import jdk.vm.ci.meta.AllocatableValue;
@@ -51,6 +52,14 @@
     }
 
     @Override
+    public boolean allowConstantToStackMove(Constant value) {
+        if (value instanceof HotSpotConstant) {
+            return ((HotSpotConstant) value).isCompressed();
+        }
+        return true;
+    }
+
+    @Override
     public AMD64LIRInstruction createLoad(AllocatableValue dst, Constant src) {
         if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(src)) {
             return super.createLoad(dst, JavaConstant.INT_0);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGeneratorTool.java	Mon Nov 16 15:46:07 2015 +0100
@@ -67,6 +67,12 @@
          */
         boolean canInlineConstant(JavaConstant c);
 
+        /**
+         * @param constant The constant that might be moved to a stack slot.
+         * @return {@code true} if constant to stack moves are supported for this constant.
+         */
+        boolean allowConstantToStackMove(Constant constant);
+
         LIRInstruction createMove(AllocatableValue result, Value input);
 
         LIRInstruction createStackMove(AllocatableValue result, AllocatableValue input);
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/VerifyingMoveFactory.java	Tue Nov 17 12:20:13 2015 +0100
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/VerifyingMoveFactory.java	Mon Nov 16 15:46:07 2015 +0100
@@ -54,6 +54,10 @@
         return inner.canInlineConstant(c);
     }
 
+    public boolean allowConstantToStackMove(Constant constant) {
+        return inner.allowConstantToStackMove(constant);
+    }
+
     public LIRInstruction createMove(AllocatableValue result, Value input) {
         LIRInstruction inst = inner.createMove(result, input);
         assert checkResult(inst, result, input);