# HG changeset patch # User Thomas Wuerthinger # Date 1426356951 -3600 # Node ID 4178f9830a274ba8b324044a5aeb391d58a94cfb # Parent 77c667701cf350b54d9f688741f181831d21e2c2 Assign the state after when appending the node and not automatically in the main graph builder loop. diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java --- 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; } }); diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java --- 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; diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java --- 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. */ diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- 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()); + } } } diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/DefaultGenericInvocationPlugin.java --- 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; } diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java --- 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("", 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)); } diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/WordOperationPlugin.java --- 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) { diff -r 77c667701cf3 -r 4178f9830a27 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java --- 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?