changeset 2628:569228710be8

More FrameState work
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Tue, 10 May 2011 16:49:50 +0200
parents b129b7da1397
children 8741e469f674
files graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java graal/GraalCompiler/src/com/sun/c1x/ir/AccessArray.java graal/GraalCompiler/src/com/sun/c1x/ir/AccessField.java graal/GraalCompiler/src/com/sun/c1x/ir/AccessIndexed.java graal/GraalCompiler/src/com/sun/c1x/ir/AccessMonitor.java graal/GraalCompiler/src/com/sun/c1x/ir/ArrayLength.java graal/GraalCompiler/src/com/sun/c1x/ir/Invoke.java graal/GraalCompiler/src/com/sun/c1x/ir/LoadField.java graal/GraalCompiler/src/com/sun/c1x/ir/LoadIndexed.java graal/GraalCompiler/src/com/sun/c1x/ir/MonitorEnter.java graal/GraalCompiler/src/com/sun/c1x/ir/MonitorExit.java graal/GraalCompiler/src/com/sun/c1x/ir/RegisterFinalizer.java graal/GraalCompiler/src/com/sun/c1x/ir/ResolveClass.java graal/GraalCompiler/src/com/sun/c1x/ir/StateSplit.java graal/GraalCompiler/src/com/sun/c1x/ir/StoreField.java graal/GraalCompiler/src/com/sun/c1x/ir/StoreIndexed.java
diffstat 17 files changed, 88 insertions(+), 116 deletions(-) [+]
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/gen/LIRGenerator.java	Tue May 10 16:49:50 2011 +0200
@@ -27,7 +27,6 @@
 import static com.sun.cri.ci.CiCallingConvention.Type.*;
 import static com.sun.cri.ci.CiValue.*;
 
-import java.lang.reflect.*;
 import java.util.*;
 
 import com.sun.c1x.*;
@@ -43,7 +42,6 @@
 import com.sun.c1x.util.*;
 import com.sun.c1x.value.*;
 import com.sun.c1x.value.FrameState.PhiProcedure;
-import com.sun.cri.bytecode.*;
 import com.sun.cri.bytecode.Bytecodes.MemoryBarriers;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -447,29 +445,25 @@
         lir.cmove(i.condition(), tVal, fVal, reg);
     }
 
-    /*protected FrameState stateBeforeInvoke(Invoke invoke) {
+    protected FrameState stateBeforeInvoke(Invoke invoke) {
         FrameState stateAfter = invoke.stateAfter();
         FrameStateBuilder builder = new FrameStateBuilder(compilation.method, invoke.graph());
-        System.out.println("stateBeforeInvoke(" + invoke + "); maxStack=" + compilation.method.maxStackSize());
-        System.out.println("stateAfter=" + stateAfter);
         builder.initializeFrom(stateAfter);
         if (invoke.kind != CiKind.Void) {
-            Value pop = builder.pop(invoke.kind);
-            System.out.println("pop " + pop);
+            builder.pop(invoke.kind);
         }
         int argumentCount = invoke.argumentCount(); // invoke.arguments() iterable?
         for (int i = 0; i < argumentCount; i++) {
             Value arg = invoke.argument(i);
-            System.out.println("push " + arg);
             builder.push(arg.kind, arg);
         }
         return builder.create(invoke.bci());
-    }*/
+    }
 
     @Override
     public void visitInvoke(Invoke x) {
         RiMethod target = x.target();
-        LIRDebugInfo info = stateFor(x);
+        LIRDebugInfo info = stateFor(x, stateBeforeInvoke(x));
 
         XirSnippet snippet = null;
 
@@ -1005,14 +999,18 @@
         return operand;
     }
 
+    private FrameState stateBeforeRegisterFinalizer(RegisterFinalizer rf) {
+        Value object = rf.object();
+        FrameStateBuilder builder = new FrameStateBuilder(compilation.method, rf.graph());
+        builder.initializeFrom(rf.stateAfter());
+        builder.push(object.kind, object);
+        return builder.create(rf.bci());
+    }
+
     @Override
     public void visitRegisterFinalizer(RegisterFinalizer x) {
-        Value object = x.object();
-        CiValue receiver = load(object);
-        FrameStateBuilder builder = new FrameStateBuilder(compilation.method, x.graph());
-        builder.initializeFrom(x.stateAfter());
-        builder.push(object.kind, object);
-        LIRDebugInfo info = stateFor(x, builder.create(x.bci()));
+        CiValue receiver = load(x.object());
+        LIRDebugInfo info = stateFor(x, stateBeforeRegisterFinalizer(x));
         callRuntime(CiRuntimeCall.RegisterFinalizer, info, receiver);
         setNoResult(x);
     }
@@ -1467,10 +1465,10 @@
     }
 
     protected LIRDebugInfo maybeStateFor(Instruction x) {
-        if (lastState == null) {
+        if (x.stateAfter() == null) {
             return null;
         }
-        return stateFor(x, lastState);
+        return stateFor(x, x.stateAfter());
     }
 
     protected LIRDebugInfo stateFor(Instruction x) {
@@ -1651,11 +1649,4 @@
         }
 
     }
-
-    private CiValue emitInvokeKnown(RiMethod method, FrameState stateBefore, Value... args) {
-        boolean isStatic = Modifier.isStatic(method.accessFlags());
-        Invoke invoke = new Invoke(isStatic ? Bytecodes.INVOKESTATIC : Bytecodes.INVOKESPECIAL, method.signature().returnKind(), args, method, null, stateBefore, null);
-        visitInvoke(invoke);
-        return invoke.operand();
-    }
 }
--- a/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/graph/GraphBuilder.java	Tue May 10 16:49:50 2011 +0200
@@ -344,7 +344,7 @@
             // this is a load of class constant which might be unresolved
             RiType riType = (RiType) con;
             if (!riType.isResolved() || C1XOptions.TestPatching) {
-                frameState.push(CiKind.Object, append(new ResolveClass(riType, RiType.Representation.JavaClass, null, graph)));
+                frameState.push(CiKind.Object, append(new ResolveClass(riType, RiType.Representation.JavaClass, graph)));
             } else {
                 frameState.push(CiKind.Object, append(new Constant(riType.getEncoding(Representation.JavaClass), graph)));
             }
@@ -357,27 +357,25 @@
     }
 
     void genLoadIndexed(CiKind kind) {
-        FrameState stateBefore = frameState.create(bci());
         Value index = frameState.ipop();
         Value array = frameState.apop();
         Value length = null;
         if (cseArrayLength(array)) {
-            length = append(new ArrayLength(array, stateBefore, graph));
+            length = append(new ArrayLength(array, graph));
         }
-        Value v = append(new LoadIndexed(array, index, length, kind, stateBefore, graph));
+        Value v = append(new LoadIndexed(array, index, length, kind, graph));
         frameState.push(kind.stackKind(), v);
     }
 
     void genStoreIndexed(CiKind kind) {
-        FrameState stateBefore = frameState.create(bci());
         Value value = frameState.pop(kind.stackKind());
         Value index = frameState.ipop();
         Value array = frameState.apop();
         Value length = null;
         if (cseArrayLength(array)) {
-            length = append(new ArrayLength(array, stateBefore, graph));
+            length = append(new ArrayLength(array, graph));
         }
-        StoreIndexed result = new StoreIndexed(array, index, length, kind, value, stateBefore, graph);
+        StoreIndexed result = new StoreIndexed(array, index, length, kind, value, graph);
         append(result);
         if (memoryMap != null) {
             memoryMap.storeValue(value);
@@ -619,16 +617,14 @@
 
     void genGetField(int cpi, RiField field) {
         // Must copy the state here, because the field holder must still be on the stack.
-        FrameState stateBefore = frameState.create(bci());
-        LoadField load = new LoadField(frameState.apop(), field, stateBefore, graph);
+        LoadField load = new LoadField(frameState.apop(), field, graph);
         appendOptimizedLoadField(field.kind(), load);
     }
 
     void genPutField(int cpi, RiField field) {
         // Must copy the state here, because the field holder must still be on the stack.
-        FrameState stateBefore = frameState.create(bci());
         Value value = frameState.pop(field.kind().stackKind());
-        appendOptimizedStoreField(new StoreField(frameState.apop(), field, value, stateBefore, graph));
+        appendOptimizedStoreField(new StoreField(frameState.apop(), field, value, graph));
     }
 
     void genGetStatic(int cpi, RiField field) {
@@ -642,7 +638,7 @@
             frameState.push(constantValue.kind.stackKind(), appendConstant(constantValue));
         } else {
             Value container = genResolveClass(RiType.Representation.StaticFields, holder, field.isResolved(), cpi);
-            LoadField load = new LoadField(container, field, null, graph);
+            LoadField load = new LoadField(container, field, graph);
             appendOptimizedLoadField(field.kind(), load);
         }
     }
@@ -651,7 +647,7 @@
         RiType holder = field.holder();
         Value container = genResolveClass(RiType.Representation.StaticFields, holder, field.isResolved(), cpi);
         Value value = frameState.pop(field.kind().stackKind());
-        StoreField store = new StoreField(container, field, value, null, graph);
+        StoreField store = new StoreField(container, field, value, graph);
         appendOptimizedStoreField(store);
     }
 
@@ -660,7 +656,7 @@
         if (initialized) {
             holderInstr = appendConstant(holder.getEncoding(representation));
         } else {
-            holderInstr = append(new ResolveClass(holder, representation, null, graph));
+            holderInstr = append(new ResolveClass(holder, representation, graph));
         }
         return holderInstr;
     }
@@ -703,30 +699,25 @@
             // of initialization is required), it can be commoned with static field accesses.
             genResolveClass(RiType.Representation.StaticFields, holder, isInitialized, cpi);
         }
-
-        FrameState stateBefore = frameState.create(bci());
         Value[] args = frameState.popArguments(target.signature().argumentSlots(false));
-        appendInvoke(INVOKESTATIC, target, args, cpi, constantPool, stateBefore);
+        appendInvoke(INVOKESTATIC, target, args, cpi, constantPool);
     }
 
     void genInvokeInterface(RiMethod target, int cpi, RiConstantPool constantPool) {
-        FrameState stateBefore = frameState.create(bci());
         Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
-        genInvokeIndirect(INVOKEINTERFACE, target, args, cpi, constantPool, stateBefore);
+        genInvokeIndirect(INVOKEINTERFACE, target, args, cpi, constantPool);
 
     }
 
     void genInvokeVirtual(RiMethod target, int cpi, RiConstantPool constantPool) {
-        FrameState stateBefore = frameState.create(bci());
         Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
-        genInvokeIndirect(INVOKEVIRTUAL, target, args, cpi, constantPool, stateBefore);
+        genInvokeIndirect(INVOKEVIRTUAL, target, args, cpi, constantPool);
 
     }
 
     void genInvokeSpecial(RiMethod target, RiType knownHolder, int cpi, RiConstantPool constantPool) {
-        FrameState stateBefore = frameState.create(bci());
         Value[] args = frameState.popArguments(target.signature().argumentSlots(true));
-        invokeDirect(target, args, knownHolder, cpi, constantPool, stateBefore);
+        invokeDirect(target, args, knownHolder, cpi, constantPool);
 
     }
 
@@ -762,7 +753,7 @@
         return target;
     }
 
-    private void genInvokeIndirect(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
+    private void genInvokeIndirect(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) {
         Value receiver = args[0];
         // attempt to devirtualize the call
         if (target.isResolved()) {
@@ -771,14 +762,14 @@
             // 0. check for trivial cases
             if (target.canBeStaticallyBound() && !isAbstract(target.accessFlags())) {
                 // check for trivial cases (e.g. final methods, nonvirtual methods)
-                invokeDirect(target, args, target.holder(), cpi, constantPool, stateBefore);
+                invokeDirect(target, args, target.holder(), cpi, constantPool);
                 return;
             }
             // 1. check if the exact type of the receiver can be determined
             RiType exact = getExactType(klass, receiver);
             if (exact != null && exact.isResolved()) {
                 // either the holder class is exact, or the receiver object has an exact type
-                invokeDirect(exact.resolveMethodImpl(target), args, exact, cpi, constantPool, stateBefore);
+                invokeDirect(exact.resolveMethodImpl(target), args, exact, cpi, constantPool);
                 return;
             }
             // 2. check if an assumed leaf method can be found
@@ -787,7 +778,7 @@
                 if (C1XOptions.PrintAssumptions) {
                     TTY.println("Optimistic invoke direct because of leaf method to " + leaf);
                 }
-                invokeDirect(leaf, args, null, cpi, constantPool, stateBefore);
+                invokeDirect(leaf, args, null, cpi, constantPool);
                 return;
             } else if (C1XOptions.PrintAssumptions) {
                 TTY.println("Could not make leaf method assumption for target=" + target + " leaf=" + leaf + " receiver.declaredType=" + receiver.declaredType());
@@ -800,27 +791,27 @@
                     TTY.println("Optimistic invoke direct because of leaf type to " + targetMethod);
                 }
                 // either the holder class is exact, or the receiver object has an exact type
-                invokeDirect(targetMethod, args, exact, cpi, constantPool, stateBefore);
+                invokeDirect(targetMethod, args, exact, cpi, constantPool);
                 return;
             } else if (C1XOptions.PrintAssumptions) {
                 TTY.println("Could not make leaf type assumption for type " + klass);
             }
         }
         // devirtualization failed, produce an actual invokevirtual
-        appendInvoke(opcode, target, args, cpi, constantPool, stateBefore);
+        appendInvoke(opcode, target, args, cpi, constantPool);
     }
 
     private CiKind returnKind(RiMethod target) {
         return target.signature().returnKind();
     }
 
-    private void invokeDirect(RiMethod target, Value[] args, RiType knownHolder, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
-        appendInvoke(INVOKESPECIAL, target, args, cpi, constantPool, stateBefore);
+    private void invokeDirect(RiMethod target, Value[] args, RiType knownHolder, int cpi, RiConstantPool constantPool) {
+        appendInvoke(INVOKESPECIAL, target, args, cpi, constantPool);
     }
 
-    private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool, FrameState stateBefore) {
+    private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) {
         CiKind resultType = returnKind(target);
-        Value result = append(new Invoke(opcode, resultType.stackKind(), args, target, target.signature().returnType(compilation.method.holder()), stateBefore, graph));
+        Value result = append(new Invoke(opcode, resultType.stackKind(), args, target, target.signature().returnType(compilation.method.holder()), graph));
         frameState.pushReturn(resultType, result);
     }
 
@@ -920,7 +911,7 @@
 
         if (needsCheck) {
             // append a call to the finalizer registration
-            append(new RegisterFinalizer(frameState.loadLocal(0), frameState.create(bci()), graph));
+            append(new RegisterFinalizer(frameState.loadLocal(0), graph));
             C1XMetrics.InlinedFinalizerChecks++;
         }
     }
@@ -932,7 +923,6 @@
 
         frameState.clearStack();
         if (Modifier.isSynchronized(method().accessFlags())) {
-            FrameState stateBefore = frameState.create(bci());
             // unlock before exiting the method
             int lockNumber = frameState.locksSize() - 1;
             MonitorAddress lockAddress = null;
@@ -940,7 +930,7 @@
                 lockAddress = new MonitorAddress(lockNumber, graph);
                 append(lockAddress);
             }
-            append(new MonitorExit(rootMethodSynchronizedObject, lockAddress, lockNumber, stateBefore, graph));
+            append(new MonitorExit(rootMethodSynchronizedObject, lockAddress, lockNumber, graph));
             frameState.unlock();
         }
         append(new Return(x, !noSafepoints(), graph));
@@ -961,7 +951,7 @@
             append(lockAddress);
         }
         frameState.push(CiKind.Object, x);
-        MonitorEnter monitorEnter = new MonitorEnter(x, lockAddress, lockNumber, frameState.create(bci()), graph);
+        MonitorEnter monitorEnter = new MonitorEnter(x, lockAddress, lockNumber, graph);
         frameState.apop();
         appendWithoutOptimization(monitorEnter, bci);
         frameState.lock(ir, x, lockNumber + 1);
@@ -979,7 +969,7 @@
             lockAddress = new MonitorAddress(lockNumber, graph);
             append(lockAddress);
         }
-        appendWithoutOptimization(new MonitorExit(x, lockAddress, lockNumber, null, graph), bci);
+        appendWithoutOptimization(new MonitorExit(x, lockAddress, lockNumber, graph), bci);
         frameState.unlock();
         killMemoryMap(); // prevent any optimizations across synchronization
     }
@@ -1091,13 +1081,6 @@
         assert x.next() == null : "instruction should not have been appended yet";
         assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")";
 
-        if (lastInstr instanceof StateSplit) {
-            StateSplit stateSplit = (StateSplit) lastInstr;
-            if (stateSplit.stateAfter() == null) {
-                stateSplit.setStateAfter(frameState.create(bci));
-            }
-        }
-
         if (lastInstr instanceof Base) {
             assert false : "may only happen when inlining intrinsics";
         } else {
@@ -1245,6 +1228,12 @@
                 end = (BlockEnd) lastInstr;
                 break;
             }
+            if (lastInstr instanceof StateSplit) {
+                StateSplit stateSplit = (StateSplit) lastInstr;
+                if (stateSplit.stateAfter() == null && stateSplit.needsStateAfter()) {
+                    stateSplit.setStateAfter(frameState.create(bci));
+                }
+            }
             stream.next();
             bci = stream.currentBCI();
             blockStart = false;
@@ -1519,8 +1508,7 @@
     }
 
     private void genArrayLength() {
-        FrameState stateBefore = frameState.create(bci());
-        frameState.ipush(append(new ArrayLength(frameState.apop(), stateBefore, graph)));
+        frameState.ipush(append(new ArrayLength(frameState.apop(), graph)));
     }
 
     void killMemoryMap() {
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/AccessArray.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/AccessArray.java	Tue May 10 16:49:50 2011 +0200
@@ -23,7 +23,6 @@
 package com.sun.c1x.ir;
 
 import com.oracle.graal.graph.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 
 /**
@@ -66,8 +65,8 @@
      * @param successorCount
      * @param graph
      */
-    public AccessArray(CiKind kind, Value array, FrameState stateAfter, int inputCount, int successorCount, Graph graph) {
-        super(kind, stateAfter, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
+    public AccessArray(CiKind kind, Value array, int inputCount, int successorCount, Graph graph) {
+        super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
         setArray(array);
     }
 
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/AccessField.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/AccessField.java	Tue May 10 16:49:50 2011 +0200
@@ -25,7 +25,6 @@
 import java.lang.reflect.*;
 
 import com.oracle.graal.graph.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -72,8 +71,8 @@
      * @param successorCount
      * @param graph
      */
-    public AccessField(CiKind kind, Value object, RiField field, FrameState stateAfter, int inputCount, int successorCount, Graph graph) {
-        super(kind, stateAfter, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
+    public AccessField(CiKind kind, Value object, RiField field, int inputCount, int successorCount, Graph graph) {
+        super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
         assert object != null : "every field access must reference some object";
         this.field = field;
         setObject(object);
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/AccessIndexed.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/AccessIndexed.java	Tue May 10 16:49:50 2011 +0200
@@ -23,7 +23,6 @@
 package com.sun.c1x.ir;
 
 import com.oracle.graal.graph.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 
 /**
@@ -86,8 +85,8 @@
      * @param successorCount
      * @param graph
      */
-    AccessIndexed(CiKind kind, Value array, Value index, Value length, CiKind elementType, FrameState stateAfter, int inputCount, int successorCount, Graph graph) {
-        super(kind, array, stateAfter, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
+    AccessIndexed(CiKind kind, Value array, Value index, Value length, CiKind elementType, int inputCount, int successorCount, Graph graph) {
+        super(kind, array, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
         setIndex(index);
         setLength(length);
         this.elementType = elementType;
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/AccessMonitor.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/AccessMonitor.java	Tue May 10 16:49:50 2011 +0200
@@ -23,7 +23,6 @@
 package com.sun.c1x.ir;
 
 import com.oracle.graal.graph.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 
 /**
@@ -85,8 +84,8 @@
      * @param successorCount
      * @param graph
      */
-    public AccessMonitor(Value object, Value lockAddress, FrameState stateAfter, int lockNumber, int inputCount, int successorCount, Graph graph) {
-        super(CiKind.Illegal, stateAfter, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
+    public AccessMonitor(Value object, Value lockAddress, int lockNumber, int inputCount, int successorCount, Graph graph) {
+        super(CiKind.Illegal, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
         this.lockNumber = lockNumber;
         setObject(object);
         setLockAddress(lockAddress);
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/ArrayLength.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/ArrayLength.java	Tue May 10 16:49:50 2011 +0200
@@ -25,7 +25,6 @@
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
 import com.sun.c1x.util.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
 
@@ -44,8 +43,8 @@
      * @param array the instruction producing the array
      * @param newFrameState the state after executing this instruction
      */
-    public ArrayLength(Value array, FrameState stateAfter, Graph graph) {
-        super(CiKind.Int, array, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public ArrayLength(Value array, Graph graph) {
+        super(CiKind.Int, array, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     @Override
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/Invoke.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/Invoke.java	Tue May 10 16:49:50 2011 +0200
@@ -25,7 +25,6 @@
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
 import com.sun.c1x.util.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -80,8 +79,8 @@
      * @param target the target method being called
      * @param stateBefore the state before executing the invocation
      */
-    public Invoke(int opcode, CiKind result, Value[] args, RiMethod target, RiType returnType, FrameState stateAfter, Graph graph) {
-        super(result, stateAfter, args.length, SUCCESSOR_COUNT, graph);
+    public Invoke(int opcode, CiKind result, Value[] args, RiMethod target, RiType returnType, Graph graph) {
+        super(result, args.length, SUCCESSOR_COUNT, graph);
         this.opcode = opcode;
         this.target = target;
         this.returnType = returnType;
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/LoadField.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/LoadField.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -45,8 +44,8 @@
      * @param graph
      * @param isLoaded indicates if the class is loaded
      */
-    public LoadField(Value object, RiField field, FrameState stateAfter, Graph graph) {
-        super(field.kind().stackKind(), object, field, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public LoadField(Value object, RiField field, Graph graph) {
+        super(field.kind().stackKind(), object, field, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     /**
@@ -102,4 +101,9 @@
         print(CiUtil.format("%h.%n:%t", field, false)).
         print("]");
     }
+
+    @Override
+    public boolean needsStateAfter() {
+        return this.isVolatile();
+    }
 }
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/LoadIndexed.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/LoadIndexed.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -45,8 +44,8 @@
      * @param stateAfter the after before executing this instruction
      * @param graph
      */
-    public LoadIndexed(Value array, Value index, Value length, CiKind elementType, FrameState stateAfter, Graph graph) {
-        super(elementType.stackKind(), array, index, length, elementType, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public LoadIndexed(Value array, Value index, Value length, CiKind elementType, Graph graph) {
+        super(elementType.stackKind(), array, index, length, elementType, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     /**
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/MonitorEnter.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/MonitorEnter.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 
 /**
  * The {@code MonitorEnter} instruction represents the acquisition of a monitor.
@@ -49,8 +48,8 @@
      * @param stateAfter the state after
      * @param graph
      */
-    public MonitorEnter(Value object, Value lockAddress, int lockNumber, FrameState stateAfter, Graph graph) {
-        super(object, lockAddress, stateAfter, lockNumber, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public MonitorEnter(Value object, Value lockAddress, int lockNumber, Graph graph) {
+        super(object, lockAddress, lockNumber, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     @Override
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/MonitorExit.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/MonitorExit.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 
 /**
  * The {@code MonitorExit} instruction represents a monitor release.
@@ -43,8 +42,8 @@
      * @param stateBefore the state after executing this instruction
      * @param graph
      */
-    public MonitorExit(Value object, Value lockAddress, int lockNumber, FrameState stateAfter, Graph graph) {
-        super(object, lockAddress, stateAfter, lockNumber, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public MonitorExit(Value object, Value lockAddress, int lockNumber, Graph graph) {
+        super(object, lockAddress, lockNumber, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
     @Override
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/RegisterFinalizer.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/RegisterFinalizer.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 
 /**
@@ -58,8 +57,8 @@
         return (Value) inputs().set(super.inputCount() + INPUT_OBJECT, n);
     }
 
-    public RegisterFinalizer(Value object, FrameState stateAfter, Graph graph) {
-        super(CiKind.Void, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public RegisterFinalizer(Value object, Graph graph) {
+        super(CiKind.Void, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setObject(object);
     }
 
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/ResolveClass.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/ResolveClass.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -40,8 +39,8 @@
     public final RiType type;
     public final RiType.Representation portion;
 
-    public ResolveClass(RiType type, RiType.Representation r, FrameState stateAfter, Graph graph) {
-        super(type.getRepresentationKind(r), stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public ResolveClass(RiType type, RiType.Representation r, Graph graph) {
+        super(type.getRepresentationKind(r), INPUT_COUNT, SUCCESSOR_COUNT, graph);
         this.portion = r;
         this.type = type;
         setFlag(Flag.NonNull);
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/StateSplit.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/StateSplit.java	Tue May 10 16:49:50 2011 +0200
@@ -66,9 +66,8 @@
      * @param successorCount
      * @param graph
      */
-    public StateSplit(CiKind kind, FrameState stateAfter, int inputCount, int successorCount, Graph graph) {
+    public StateSplit(CiKind kind, int inputCount, int successorCount, Graph graph) {
         super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph);
-        this.setStateAfter(stateAfter);
     }
 
     @Override
@@ -76,4 +75,7 @@
         return true;
     }
 
+    public boolean needsStateAfter() {
+        return true;
+    }
 }
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/StoreField.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/StoreField.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -67,8 +66,8 @@
      * @param stateAfter the state after the field access
      * @param graph
      */
-    public StoreField(Value object, RiField field, Value value, FrameState stateAfter, Graph graph) {
-        super(CiKind.Void, object, field, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public StoreField(Value object, RiField field, Value value, Graph graph) {
+        super(CiKind.Void, object, field, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setValue(value);
     }
 
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/StoreIndexed.java	Tue May 10 14:34:03 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/StoreIndexed.java	Tue May 10 16:49:50 2011 +0200
@@ -24,7 +24,6 @@
 
 import com.oracle.graal.graph.*;
 import com.sun.c1x.debug.*;
-import com.sun.c1x.value.*;
 import com.sun.cri.ci.*;
 
 /**
@@ -68,8 +67,8 @@
      * @param stateAfter the state after executing this instruction
      * @param graph
      */
-    public StoreIndexed(Value array, Value index, Value length, CiKind elementType, Value value, FrameState stateAfter, Graph graph) {
-        super(CiKind.Void, array, index, length, elementType, stateAfter, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    public StoreIndexed(Value array, Value index, Value length, CiKind elementType, Value value, Graph graph) {
+        super(CiKind.Void, array, index, length, elementType, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setValue(value);
     }