changeset 14818:3d04915a55c6

added kindinterface for valuenode and variable and started to generalize some methods used for bytecodeparsing
author Niclas Adlertz <niclas.adlertz@oracle.com>
date Wed, 19 Mar 2014 10:29:07 +0000
parents 80147dac0d6e
children fb4b44ae8f5c
files graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParseHelper.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KindInterface.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java
diffstat 7 files changed, 143 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java	Tue Mar 18 09:56:20 2014 +0000
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java	Wed Mar 19 10:29:07 2014 +0000
@@ -3,7 +3,7 @@
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.nodes.*;
 
-public abstract class AbstractFrameStateBuilder<T> {
+public abstract class AbstractFrameStateBuilder<T extends KindInterface> {
 
     protected final ResolvedJavaMethod method;
     protected int stackSize;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParseHelper.java	Wed Mar 19 10:29:07 2014 +0000
@@ -0,0 +1,116 @@
+package com.oracle.graal.java;
+
+import static com.oracle.graal.bytecode.Bytecodes.*;
+
+import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
+import com.oracle.graal.nodes.*;
+
+public class BytecodeParseHelper<T extends KindInterface> {
+
+    private AbstractFrameStateBuilder<T> frameState;
+
+    public BytecodeParseHelper(AbstractFrameStateBuilder<T> frameState) {
+        this.frameState = frameState;
+    }
+
+    public void setCurrentFrameState(AbstractFrameStateBuilder<T> frameState) {
+        this.frameState = frameState;
+    }
+
+    public void loadLocal(int index, Kind kind) {
+        frameState.push(kind, frameState.loadLocal(index));
+    }
+
+    public void storeLocal(Kind kind, int index) {
+        T value;
+        if (kind == Kind.Object) {
+            value = frameState.xpop();
+            // astore and astore_<n> may be used to store a returnAddress (jsr)
+            assert value.getKind() == Kind.Object || value.getKind() == Kind.Int;
+        } else {
+            value = frameState.pop(kind);
+        }
+        frameState.storeLocal(index, value);
+    }
+
+    public void stackOp(int opcode) {
+        switch (opcode) {
+            case POP: {
+                frameState.xpop();
+                break;
+            }
+            case POP2: {
+                frameState.xpop();
+                frameState.xpop();
+                break;
+            }
+            case DUP: {
+                T w = frameState.xpop();
+                frameState.xpush(w);
+                frameState.xpush(w);
+                break;
+            }
+            case DUP_X1: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                frameState.xpush(w1);
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                break;
+            }
+            case DUP_X2: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                T w3 = frameState.xpop();
+                frameState.xpush(w1);
+                frameState.xpush(w3);
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                break;
+            }
+            case DUP2: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                break;
+            }
+            case DUP2_X1: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                T w3 = frameState.xpop();
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                frameState.xpush(w3);
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                break;
+            }
+            case DUP2_X2: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                T w3 = frameState.xpop();
+                T w4 = frameState.xpop();
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                frameState.xpush(w4);
+                frameState.xpush(w3);
+                frameState.xpush(w2);
+                frameState.xpush(w1);
+                break;
+            }
+            case SWAP: {
+                T w1 = frameState.xpop();
+                T w2 = frameState.xpop();
+                frameState.xpush(w1);
+                frameState.xpush(w2);
+                break;
+            }
+            default:
+                throw GraalInternalError.shouldNotReachHere();
+        }
+    }
+}
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Mar 18 09:56:20 2014 +0000
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Mar 19 10:29:07 2014 +0000
@@ -118,6 +118,7 @@
         private BytecodeStream stream;           // the bytecode stream
 
         protected HIRFrameStateBuilder frameState;          // the current execution state
+        private BytecodeParseHelper<ValueNode> parseHelper;
         private Block currentBlock;
 
         private ValueNode methodSynchronizedObject;
@@ -203,6 +204,7 @@
             methodSynchronizedObject = null;
             this.currentGraph = graph;
             this.frameState = new HIRFrameStateBuilder(method, graph, graphBuilderConfig.eagerResolving());
+            this.parseHelper = new BytecodeParseHelper<>(frameState);
             TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method);
             try {
                 build();
@@ -304,10 +306,6 @@
             return stream.currentBCI();
         }
 
-        private void loadLocal(int index, Kind kind) {
-            frameState.push(kind, frameState.loadLocal(index));
-        }
-
         private void storeLocal(Kind kind, int index) {
             ValueNode value;
             if (kind == Kind.Object) {
@@ -572,7 +570,6 @@
                 default:
                     throw GraalInternalError.shouldNotReachHere();
             }
-
         }
 
         private void genArithmeticOp(Kind result, int opcode) {
@@ -1640,6 +1637,7 @@
 
             lastInstr = block.firstInstruction;
             frameState = block.entryState;
+            parseHelper.setCurrentFrameState(frameState);
             currentBlock = block;
 
             frameState.cleanupDeletedPhis();
@@ -1893,31 +1891,31 @@
             case LDC            : // fall through
             case LDC_W          : // fall through
             case LDC2_W         : genLoadConstant(stream.readCPI(), opcode); break;
-            case ILOAD          : loadLocal(stream.readLocalIndex(), Kind.Int); break;
-            case LLOAD          : loadLocal(stream.readLocalIndex(), Kind.Long); break;
-            case FLOAD          : loadLocal(stream.readLocalIndex(), Kind.Float); break;
-            case DLOAD          : loadLocal(stream.readLocalIndex(), Kind.Double); break;
-            case ALOAD          : loadLocal(stream.readLocalIndex(), Kind.Object); break;
+            case ILOAD          : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Int); break;
+            case LLOAD          : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Long); break;
+            case FLOAD          : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Float); break;
+            case DLOAD          : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Double); break;
+            case ALOAD          : parseHelper.loadLocal(stream.readLocalIndex(), Kind.Object); break;
             case ILOAD_0        : // fall through
             case ILOAD_1        : // fall through
             case ILOAD_2        : // fall through
-            case ILOAD_3        : loadLocal(opcode - ILOAD_0, Kind.Int); break;
+            case ILOAD_3        : parseHelper.loadLocal(opcode - ILOAD_0, Kind.Int); break;
             case LLOAD_0        : // fall through
             case LLOAD_1        : // fall through
             case LLOAD_2        : // fall through
-            case LLOAD_3        : loadLocal(opcode - LLOAD_0, Kind.Long); break;
+            case LLOAD_3        : parseHelper.loadLocal(opcode - LLOAD_0, Kind.Long); break;
             case FLOAD_0        : // fall through
             case FLOAD_1        : // fall through
             case FLOAD_2        : // fall through
-            case FLOAD_3        : loadLocal(opcode - FLOAD_0, Kind.Float); break;
+            case FLOAD_3        : parseHelper.loadLocal(opcode - FLOAD_0, Kind.Float); break;
             case DLOAD_0        : // fall through
             case DLOAD_1        : // fall through
             case DLOAD_2        : // fall through
-            case DLOAD_3        : loadLocal(opcode - DLOAD_0, Kind.Double); break;
+            case DLOAD_3        : parseHelper.loadLocal(opcode - DLOAD_0, Kind.Double); break;
             case ALOAD_0        : // fall through
             case ALOAD_1        : // fall through
             case ALOAD_2        : // fall through
-            case ALOAD_3        : loadLocal(opcode - ALOAD_0, Kind.Object); break;
+            case ALOAD_3        : parseHelper.loadLocal(opcode - ALOAD_0, Kind.Object); break;
             case IALOAD         : genLoadIndexed(Kind.Int   ); break;
             case LALOAD         : genLoadIndexed(Kind.Long  ); break;
             case FALOAD         : genLoadIndexed(Kind.Float ); break;
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java	Tue Mar 18 09:56:20 2014 +0000
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/Variable.java	Wed Mar 19 10:29:07 2014 +0000
@@ -24,12 +24,13 @@
 
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.nodes.*;
 
 /**
  * Represents a value that is yet to be bound to a machine location (such as a {@link RegisterValue}
  * or {@link StackSlot}) by a register allocator.
  */
-public final class Variable extends AllocatableValue {
+public final class Variable extends AllocatableValue implements KindInterface {
 
     private static final long serialVersionUID = 4507578431686109809L;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/KindInterface.java	Wed Mar 19 10:29:07 2014 +0000
@@ -0,0 +1,9 @@
+package com.oracle.graal.nodes;
+
+import com.oracle.graal.api.meta.*;
+
+public interface KindInterface {
+
+    public Kind getKind();
+
+}
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Tue Mar 18 09:56:20 2014 +0000
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java	Wed Mar 19 10:29:07 2014 +0000
@@ -31,7 +31,7 @@
  * This class represents a value within the graph, including local variables, phis, and all other
  * instructions.
  */
-public abstract class ValueNode extends ScheduledNode implements StampProvider {
+public abstract class ValueNode extends ScheduledNode implements StampProvider, KindInterface {
 
     /**
      * The kind of this value. This is {@link Kind#Void} for instructions that produce no value.
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java	Tue Mar 18 09:56:20 2014 +0000
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNodeUtil.java	Wed Mar 19 10:29:07 2014 +0000
@@ -87,7 +87,7 @@
     /**
      * Converts a given instruction to a value string. The representation of an node as a value is
      * formed by concatenating the {@linkplain com.oracle.graal.api.meta.Kind#getTypeChar character}
-     * denoting its {@linkplain ValueNode#kind kind} and its id. For example, {@code "i13"}.
+     * denoting its {@linkplain ValueNode#getKind kind} and its id. For example, {@code "i13"}.
      * 
      * @param value the instruction to convert to a value string. If {@code value == null}, then "-"
      *            is returned.