changeset 19854:4178f9830a27

Assign the state after when appending the node and not automatically in the main graph builder loop.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sat, 14 Mar 2015 19:15:51 +0100
parents 77c667701cf3
children edd37b7d6679
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultGenericInvocationPlugin.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/WordOperationPlugin.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java
diffstat 8 files changed, 81 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Sat Mar 14 19:15:51 2015 +0100
@@ -101,13 +101,17 @@
         Registration r = new Registration(plugins, metaAccess, System.class);
         r.register0("currentTimeMillis", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
-                b.push(Kind.Long, b.append(new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_MILLIS, StampFactory.forKind(Kind.Long))));
+                ForeignCallNode foreignCall = new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_MILLIS, StampFactory.forKind(Kind.Long));
+                b.push(Kind.Long, b.append(foreignCall));
+                foreignCall.setStateAfter(b.createStateAfter());
                 return true;
             }
         });
         r.register0("nanoTime", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod) {
-                b.push(Kind.Long, b.append(new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_NANOS, StampFactory.forKind(Kind.Long))));
+                ForeignCallNode foreignCall = new ForeignCallNode(foreignCalls, SystemSubstitutions.JAVA_TIME_NANOS, StampFactory.forKind(Kind.Long));
+                b.push(Kind.Long, b.append(foreignCall));
+                foreignCall.setStateAfter(b.createStateAfter());
                 return true;
             }
         });
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Sat Mar 14 19:15:51 2015 +0100
@@ -358,7 +358,7 @@
         }
     }
 
-    protected abstract ValueNode genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value);
+    protected abstract void genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value);
 
     private void genStoreIndexed(Kind kind) {
         emitExplicitExceptions(frameState.peek(2), frameState.peek(1));
@@ -366,7 +366,7 @@
         ValueNode value = frameState.pop(kind.getStackKind());
         ValueNode index = frameState.ipop();
         ValueNode array = frameState.apop();
-        append(genStoreIndexed(array, index, kind, value));
+        genStoreIndexed(array, index, kind, value);
     }
 
     private void stackOp(int opcode) {
@@ -870,7 +870,7 @@
         EXPLICIT_EXCEPTIONS.increment();
     }
 
-    protected abstract ValueNode genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value);
+    protected abstract void genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value);
 
     private void genPutField(JavaField field) {
         emitExplicitExceptions(frameState.peek(1), null);
@@ -878,7 +878,7 @@
         ValueNode value = frameState.pop(field.getKind().getStackKind());
         ValueNode receiver = frameState.apop();
         if (field instanceof ResolvedJavaField && ((ResolvedJavaField) field).getDeclaringClass().isInitialized()) {
-            appendOptimizedStoreField(genStoreField(receiver, (ResolvedJavaField) field, value));
+            genStoreField(receiver, (ResolvedJavaField) field, value);
         } else {
             handleUnresolvedStoreField(field, value, receiver);
         }
@@ -903,16 +903,12 @@
     private void genPutStatic(JavaField field) {
         ValueNode value = frameState.pop(field.getKind().getStackKind());
         if (field instanceof ResolvedJavaField && ((ResolvedJavaType) field.getDeclaringClass()).isInitialized()) {
-            appendOptimizedStoreField(genStoreField(null, (ResolvedJavaField) field, value));
+            genStoreField(null, (ResolvedJavaField) field, value);
         } else {
             handleUnresolvedStoreField(field, value, null);
         }
     }
 
-    protected void appendOptimizedStoreField(ValueNode store) {
-        append(store);
-    }
-
     protected void appendOptimizedLoadField(Kind kind, ValueNode load) {
         // append the load to the instruction
         ValueNode optimized = append(load);
@@ -931,9 +927,9 @@
 
     protected abstract void genReturn(ValueNode x, Kind kind);
 
-    protected abstract ValueNode genMonitorEnter(ValueNode x);
+    protected abstract void genMonitorEnter(ValueNode x, int bci);
 
-    protected abstract ValueNode genMonitorExit(ValueNode x, ValueNode returnValue);
+    protected abstract void genMonitorExit(ValueNode x, ValueNode returnValue, int bci);
 
     protected abstract void genJsr(int dest);
 
@@ -1293,8 +1289,8 @@
         case ATHROW         : genThrow(); break;
         case CHECKCAST      : genCheckCast(); break;
         case INSTANCEOF     : genInstanceOf(); break;
-        case MONITORENTER   : genMonitorEnter(frameState.apop()); break;
-        case MONITOREXIT    : genMonitorExit(frameState.apop(), null); break;
+        case MONITORENTER   : genMonitorEnter(frameState.apop(), stream.nextBCI()); break;
+        case MONITOREXIT    : genMonitorExit(frameState.apop(), null, stream.nextBCI()); break;
         case MULTIANEWARRAY : genNewMultiArray(stream.readCPI()); break;
         case IFNULL         : genIfNull(Condition.EQ); break;
         case IFNONNULL      : genIfNull(Condition.NE); break;
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java	Sat Mar 14 19:15:51 2015 +0100
@@ -84,6 +84,8 @@
 
     StructuredGraph getGraph();
 
+    FrameState createStateAfter();
+
     /**
      * Gets the parsing context for the method that inlines the method being parsed by this context.
      */
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Sat Mar 14 19:15:51 2015 +0100
@@ -352,10 +352,9 @@
                     if (method.isSynchronized()) {
                         // add a monitor enter to the start block
                         methodSynchronizedObject = synchronizedObject(frameState, method);
-                        MonitorEnterNode monitorEnter = genMonitorEnter(methodSynchronizedObject);
                         frameState.clearNonLiveLocals(startBlock, liveness, true);
                         assert bci() == 0;
-                        monitorEnter.setStateAfter(createFrameState(bci()));
+                        genMonitorEnter(methodSynchronizedObject, bci());
                     }
 
                     if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
@@ -761,8 +760,10 @@
             }
 
             @Override
-            protected ValueNode genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value) {
-                return new StoreIndexedNode(array, index, kind, value);
+            protected void genStoreIndexed(ValueNode array, ValueNode index, Kind kind, ValueNode value) {
+                StoreIndexedNode storeIndexed = new StoreIndexedNode(array, index, kind, value);
+                append(storeIndexed);
+                storeIndexed.setStateAfter(this.createStateAfter());
             }
 
             @Override
@@ -978,8 +979,10 @@
             }
 
             @Override
-            protected ValueNode genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value) {
-                return new StoreFieldNode(receiver, field, value);
+            protected void genStoreField(ValueNode receiver, ResolvedJavaField field, ValueNode value) {
+                StoreFieldNode storeFieldNode = new StoreFieldNode(receiver, field, value);
+                append(storeFieldNode);
+                storeFieldNode.setStateAfter(this.createFrameState(stream.nextBCI()));
             }
 
             /**
@@ -1123,6 +1126,12 @@
                 }
 
                 if (tryInline(args, targetMethod, invokeKind, returnType)) {
+// if (lastInstr instanceof StateSplit) {
+// StateSplit stateSplit = (StateSplit) lastInstr;
+// if (stateSplit.stateAfter() == null) {
+// stateSplit.setStateAfter(this.createStateAfter());
+// }
+// }
                     return;
                 }
 
@@ -1307,6 +1316,7 @@
             protected InvokeNode createInvoke(CallTargetNode callTarget, Kind resultType) {
                 InvokeNode invoke = append(new InvokeNode(callTarget, bci()));
                 frameState.pushReturn(resultType, invoke);
+                invoke.setStateAfter(createFrameState(stream.nextBCI()));
                 return invoke;
             }
 
@@ -1357,22 +1367,22 @@
             }
 
             @Override
-            protected MonitorEnterNode genMonitorEnter(ValueNode x) {
+            protected void genMonitorEnter(ValueNode x, int bci) {
                 MonitorIdNode monitorId = currentGraph.add(new MonitorIdNode(frameState.lockDepth()));
                 MonitorEnterNode monitorEnter = append(new MonitorEnterNode(x, monitorId));
                 frameState.pushLock(x, monitorId);
-                return monitorEnter;
+                monitorEnter.setStateAfter(createFrameState(bci));
             }
 
             @Override
-            protected MonitorExitNode genMonitorExit(ValueNode x, ValueNode escapedReturnValue) {
+            protected void genMonitorExit(ValueNode x, ValueNode escapedReturnValue, int bci) {
                 MonitorIdNode monitorId = frameState.peekMonitorId();
                 ValueNode lockedObject = frameState.popLock();
                 if (GraphUtil.originalValue(lockedObject) != GraphUtil.originalValue(x)) {
                     throw bailout(String.format("unbalanced monitors: mismatch at monitorexit, %s != %s", GraphUtil.originalValue(x), GraphUtil.originalValue(lockedObject)));
                 }
                 MonitorExitNode monitorExit = append(new MonitorExitNode(x, monitorId, escapedReturnValue));
-                return monitorExit;
+                monitorExit.setStateAfter(createFrameState(bci));
             }
 
             @Override
@@ -1927,11 +1937,10 @@
 
             private void synchronizedEpilogue(int bci, ValueNode currentReturnValue, Kind currentReturnValueKind) {
                 if (method.isSynchronized()) {
-                    MonitorExitNode monitorExit = genMonitorExit(methodSynchronizedObject, currentReturnValue);
                     if (currentReturnValue != null) {
                         frameState.push(currentReturnValueKind, currentReturnValue);
                     }
-                    monitorExit.setStateAfter(createFrameState(bci));
+                    genMonitorExit(methodSynchronizedObject, currentReturnValue, bci);
                     assert !frameState.rethrowException();
                 }
             }
@@ -2062,19 +2071,8 @@
                     stream.next();
                     bci = stream.currentBCI();
 
-                    if (bci > block.endBci) {
-                        frameState.clearNonLiveLocals(currentBlock, liveness, false);
-                    }
-                    if (lastInstr instanceof StateSplit) {
-                        if (lastInstr instanceof BeginNode) {
-                            // BeginNodes do not need a frame state
-                        } else {
-                            StateSplit stateSplit = (StateSplit) lastInstr;
-                            if (stateSplit.stateAfter() == null) {
-                                stateSplit.setStateAfter(createFrameState(bci));
-                            }
-                        }
-                    }
+                    assert block == currentBlock;
+                    assert !(lastInstr instanceof StateSplit) || lastInstr instanceof BeginNode || ((StateSplit) lastInstr).stateAfter() != null : lastInstr;
                     lastInstr = finishInstruction(lastInstr, frameState);
                     if (bci < endBCI) {
                         if (bci > block.endBci) {
@@ -2388,8 +2386,15 @@
             }
 
             private FrameState createFrameState(int bci) {
+                if (currentBlock != null && bci > currentBlock.endBci) {
+                    frameState.clearNonLiveLocals(currentBlock, liveness, false);
+                }
                 return frameState.create(bci);
             }
+
+            public FrameState createStateAfter() {
+                return createFrameState(stream.nextBCI());
+            }
         }
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultGenericInvocationPlugin.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultGenericInvocationPlugin.java	Sat Mar 14 19:15:51 2015 +0100
@@ -100,7 +100,9 @@
         if (res instanceof UnsafeCopyNode) {
             UnsafeCopyNode copy = (UnsafeCopyNode) res;
             UnsafeLoadNode value = b.append(new UnsafeLoadNode(copy.sourceObject(), copy.sourceOffset(), copy.accessKind(), copy.getLocationIdentity()));
-            b.append(new UnsafeStoreNode(copy.destinationObject(), copy.destinationOffset(), value, copy.accessKind(), copy.getLocationIdentity()));
+            UnsafeStoreNode unsafeStore = new UnsafeStoreNode(copy.destinationObject(), copy.destinationOffset(), value, copy.accessKind(), copy.getLocationIdentity());
+            b.append(unsafeStore);
+            unsafeStore.setStateAfter(b.createStateAfter());
             return true;
         } else if (res instanceof ForeignCallNode) {
             ForeignCallNode foreign = (ForeignCallNode) res;
@@ -115,6 +117,13 @@
             assert res.getKind().getStackKind() == Kind.Void;
         }
 
+        if (res instanceof StateSplit) {
+            StateSplit stateSplit = (StateSplit) res;
+            if (stateSplit.stateAfter() == null) {
+                stateSplit.setStateAfter(b.createStateAfter());
+            }
+        }
+
         return true;
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java	Sat Mar 14 19:15:51 2015 +0100
@@ -108,7 +108,9 @@
             Class<?> javaClass = kind == Kind.Object ? Object.class : kind.toJavaClass();
             r.register5("compareAndSwap" + kind.name(), Receiver.class, Object.class, long.class, javaClass, javaClass, new InvocationPlugin() {
                 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode ignoredUnsafe, ValueNode object, ValueNode offset, ValueNode expected, ValueNode x) {
-                    b.push(Kind.Boolean.getStackKind(), b.append(new CompareAndSwapNode(object, offset, expected, x, kind, LocationIdentity.any())));
+                    CompareAndSwapNode compareAndSwap = new CompareAndSwapNode(object, offset, expected, x, kind, LocationIdentity.any());
+                    b.push(Kind.Boolean.getStackKind(), b.append(compareAndSwap));
+                    compareAndSwap.setStateAfter(b.createStateAfter());
                     return true;
                 }
             });
@@ -116,14 +118,18 @@
             if (getAndSetEnabled(arch)) {
                 r.register4("getAndSet" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
                     public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode ignoredUnsafe, ValueNode object, ValueNode offset, ValueNode value) {
-                        b.push(kind.getStackKind(), b.append(new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any())));
+                        AtomicReadAndWriteNode atomicReadWrite = new AtomicReadAndWriteNode(object, offset, value, kind, LocationIdentity.any());
+                        b.push(kind.getStackKind(), b.append(atomicReadWrite));
+                        atomicReadWrite.setStateAfter(b.createStateAfter());
                         return true;
                     }
                 });
                 if (kind != Kind.Object) {
                     r.register4("getAndAdd" + kind.name(), Receiver.class, Object.class, long.class, javaClass, new InvocationPlugin() {
                         public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode ignoredUnsafe, ValueNode object, ValueNode offset, ValueNode delta) {
-                            b.push(kind.getStackKind(), b.append(new AtomicReadAndAddNode(object, offset, delta, LocationIdentity.any())));
+                            AtomicReadAndAddNode atomicReadAdd = new AtomicReadAndAddNode(object, offset, delta, LocationIdentity.any());
+                            b.push(kind.getStackKind(), b.append(atomicReadAdd));
+                            atomicReadAdd.setStateAfter(b.createStateAfter());
                             return true;
                         }
                     });
@@ -347,7 +353,9 @@
         r.register1("<init>", Receiver.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode object) {
                 if (RegisterFinalizerNode.mayHaveFinalizer(object, b.getAssumptions())) {
-                    b.append(new RegisterFinalizerNode(object));
+                    RegisterFinalizerNode registerFinalizer = new RegisterFinalizerNode(object);
+                    b.append(registerFinalizer);
+                    registerFinalizer.setStateAfter(b.createStateAfter());
                 }
                 return true;
             }
@@ -406,7 +414,9 @@
             });
             r.register3("put" + c.getSimpleName() + "Unsafe", Node.class, long.class, c, new InvocationPlugin() {
                 public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, ValueNode node, ValueNode offset, ValueNode value) {
-                    b.append(new UnsafeStoreNode(node, offset, value, Kind.Object, LocationIdentity.any()));
+                    UnsafeStoreNode unsafeStore = new UnsafeStoreNode(node, offset, value, Kind.Object, LocationIdentity.any());
+                    b.append(unsafeStore);
+                    unsafeStore.setStateAfter(b.createStateAfter());
                     return true;
                 }
             });
@@ -516,7 +526,9 @@
             if (isVolatile) {
                 b.append(new MembarNode(JMM_PRE_VOLATILE_WRITE));
             }
-            b.append(new UnsafeStoreNode(object, offset, value, kind, LocationIdentity.any()));
+            UnsafeStoreNode unsafeStore = new UnsafeStoreNode(object, offset, value, kind, LocationIdentity.any());
+            b.append(unsafeStore);
+            unsafeStore.setStateAfter(b.createStateAfter());
             if (isVolatile) {
                 b.append(new MembarNode(JMM_PRE_VOLATILE_WRITE));
             }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/WordOperationPlugin.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/WordOperationPlugin.java	Sat Mar 14 19:15:51 2015 +0100
@@ -246,7 +246,9 @@
         final BarrierType barrier = (op == Opcode.WRITE_BARRIERED ? BarrierType.PRECISE : BarrierType.NONE);
         final boolean compressible = (op == Opcode.WRITE_OBJECT || op == Opcode.WRITE_BARRIERED);
         final boolean initialize = (op == Opcode.INITIALIZE);
-        b.append(new JavaWriteNode(writeKind, base, value, location, barrier, compressible, initialize));
+        JavaWriteNode writeNode = new JavaWriteNode(writeKind, base, value, location, barrier, compressible, initialize);
+        b.append(writeNode);
+        writeNode.setStateAfter(b.createStateAfter());
     }
 
     public LocationNode makeLocation(GraphBuilderContext b, ValueNode offset, LocationIdentity locationIdentity) {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Sat Mar 14 17:59:33 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Sat Mar 14 19:15:51 2015 +0100
@@ -368,7 +368,9 @@
                     locationIdentity = ObjectLocationIdentity.create(locationArgument.asJavaConstant());
                 }
 
-                b.append(new UnsafeStoreNode(object, offset, value, kind, locationIdentity, null));
+                UnsafeStoreNode unsafeStore = new UnsafeStoreNode(object, offset, value, kind, locationIdentity, null);
+                b.append(unsafeStore);
+                unsafeStore.setStateAfter(b.createStateAfter());
                 return true;
             }
             // TODO: should we throw GraalInternalError.shouldNotReachHere() here?