# HG changeset patch # User Doug Simon # Date 1368712276 -7200 # Node ID 1313dd590c6223ed5f6ead5aaface4ceba360d37 # Parent b88f69f806813b6e67d94dc547122c39dfc969fd made RuntimeCallNode no longer be a StateSplit; for runtime calls that are state splits, the new RuntimeCallStateSplitNode class should be used diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Thu May 16 15:51:16 2013 +0200 @@ -681,21 +681,6 @@ } } - @Override - public void visitRuntimeCall(RuntimeCallNode x) { - RuntimeCallTarget call = runtime.lookupRuntimeCall(x.getDescriptor()); - CallingConvention callCc = call.getCallingConvention(); - frameMap.callsMethod(callCc); - Value resultOperand = callCc.getReturn(); - Value[] args = visitInvokeArguments(callCc, x.arguments()); - - emitCall(call, resultOperand, args, callCc.getTemporaries(), state(x)); - - if (isLegal(resultOperand)) { - setResult(x, emitMove(resultOperand)); - } - } - /** * This method tries to create a switch implementation that is optimal for the given switch. It * will either generate a sequential if/then/else cascade, a set of range tests or a table diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Thu May 16 15:51:16 2013 +0200 @@ -714,7 +714,7 @@ StartNode newStart = graph.add(new StartNode()); LocalNode buffer = graph.unique(new LocalNode(0, StampFactory.forKind(wordKind()))); RuntimeCallNode migrationEnd = graph.add(new RuntimeCallNode(OSR_MIGRATION_END, buffer)); - migrationEnd.setStateAfter(osrStart.stateAfter()); + newStart.setStateAfter(osrStart.stateAfter()); newStart.setNext(migrationEnd); FixedNode next = osrStart.next(); diff -r b88f69f80681 -r 1313dd590c62 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 Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Thu May 16 15:51:16 2013 +0200 @@ -941,7 +941,7 @@ ValueNode exception = ConstantNode.forObject(cachedNullPointerException, runtime, currentGraph); trueSucc.setNext(handleException(exception, bci())); } else { - RuntimeCallNode call = currentGraph.add(new RuntimeCallNode(CREATE_NULL_POINTER_EXCEPTION)); + RuntimeCallStateSplitNode call = currentGraph.add(new RuntimeCallStateSplitNode(CREATE_NULL_POINTER_EXCEPTION)); call.setStateAfter(frameState.create(bci())); trueSucc.setNext(call); call.setNext(handleException(call, bci())); @@ -967,7 +967,7 @@ ValueNode exception = ConstantNode.forObject(cachedArrayIndexOutOfBoundsException, runtime, currentGraph); falseSucc.setNext(handleException(exception, bci())); } else { - RuntimeCallNode call = currentGraph.add(new RuntimeCallNode(CREATE_OUT_OF_BOUNDS_EXCEPTION, index)); + RuntimeCallStateSplitNode call = currentGraph.add(new RuntimeCallStateSplitNode(CREATE_OUT_OF_BOUNDS_EXCEPTION, index)); call.setStateAfter(frameState.create(bci())); falseSucc.setNext(call); call.setNext(handleException(call, bci())); diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Thu May 16 15:51:16 2013 +0200 @@ -22,22 +22,24 @@ */ package com.oracle.graal.nodes.extended; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.extended.LocationNode.LocationIdentity; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; @NodeInfo(nameTemplate = "RuntimeCall#{p#descriptor/s}") -public final class RuntimeCallNode extends AbstractCallNode implements LIRLowerable, DeoptimizingNode { +public class RuntimeCallNode extends DeoptimizingFixedWithNextNode implements LIRLowerable, DeoptimizingNode { + + @Input private final NodeInputList arguments; private final Descriptor descriptor; - @Input private FrameState deoptState; public RuntimeCallNode(Descriptor descriptor, ValueNode... arguments) { - super(StampFactory.forKind(Kind.fromJavaClass(descriptor.getResultType())), arguments); + super(StampFactory.forKind(Kind.fromJavaClass(descriptor.getResultType()))); + this.arguments = new NodeInputList<>(this, arguments); this.descriptor = descriptor; } @@ -45,19 +47,21 @@ return descriptor; } - @Override - public boolean hasSideEffect() { - return descriptor.hasSideEffect(); - } - - @Override - public LocationIdentity[] getLocationIdentities() { - return new LocationIdentity[]{LocationNode.ANY_LOCATION}; + public NodeInputList arguments() { + return arguments; } @Override public void generate(LIRGeneratorTool gen) { - gen.visitRuntimeCall(this); + RuntimeCallTarget stub = gen.getRuntime().lookupRuntimeCall(descriptor); + Value[] args = new Value[arguments.size()]; + for (int i = 0; i < args.length; i++) { + args[i] = gen.operand(arguments.get(i)); + } + Value result = gen.emitCall(stub, stub.getCallingConvention(), this, args); + if (result != null) { + gen.setResult(this, result); + } } @Override @@ -74,36 +78,7 @@ } @Override - public FrameState getDeoptimizationState() { - if (deoptState != null) { - return deoptState; - } else if (stateAfter() != null) { - FrameState stateDuring = stateAfter(); - if ((stateDuring.stackSize() > 0 && stateDuring.stackAt(stateDuring.stackSize() - 1) == this) || (stateDuring.stackSize() > 1 && stateDuring.stackAt(stateDuring.stackSize() - 2) == this)) { - stateDuring = stateDuring.duplicateModified(stateDuring.bci, stateDuring.rethrowException(), this.kind()); - } - updateUsages(deoptState, stateDuring); - return deoptState = stateDuring; - } - return null; - } - - @Override - public void setDeoptimizationState(FrameState f) { - if (deoptState != null) { - throw new IllegalStateException(); - } - updateUsages(deoptState, f); - deoptState = f; - } - - @Override public DeoptimizationReason getDeoptimizationReason() { return null; } - - @Override - public boolean isCallSiteDeoptimization() { - return stateAfter() != null; - } } diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallStateSplitNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallStateSplitNode.java Thu May 16 15:51:16 2013 +0200 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.graal.nodes.extended; + +import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; +import com.oracle.graal.graph.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; + +/** + * A foreign call that is also a state split. + */ +@NodeInfo(nameTemplate = "RuntimeCallStateSplit#{p#descriptor/s}") +public class RuntimeCallStateSplitNode extends RuntimeCallNode implements LIRLowerable, StateSplit, DeoptimizingNode { + + @Input(notDataflow = true) private FrameState stateAfter; + + public RuntimeCallStateSplitNode(Descriptor descriptor, ValueNode... arguments) { + super(descriptor, arguments); + } + + public FrameState stateAfter() { + return stateAfter; + } + + public void setStateAfter(FrameState x) { + assert x == null || x.isAlive() : "frame state must be in a graph"; + updateUsages(stateAfter, x); + stateAfter = x; + } + + public boolean hasSideEffect() { + return getDescriptor().hasSideEffect(); + } + + @Override + public FrameState getDeoptimizationState() { + if (super.getDeoptimizationState() != null) { + return super.getDeoptimizationState(); + } else if (stateAfter() != null) { + FrameState stateDuring = stateAfter(); + if ((stateDuring.stackSize() > 0 && stateDuring.stackAt(stateDuring.stackSize() - 1) == this) || (stateDuring.stackSize() > 1 && stateDuring.stackAt(stateDuring.stackSize() - 2) == this)) { + stateDuring = stateDuring.duplicateModified(stateDuring.bci, stateDuring.rethrowException(), this.kind()); + } + setDeoptimizationState(stateDuring); + return stateDuring; + } + return null; + } + + @Override + public void setDeoptimizationState(FrameState f) { + if (super.getDeoptimizationState() != null) { + throw new IllegalStateException(); + } + super.setDeoptimizationState(f); + } +} diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Thu May 16 15:51:16 2013 +0200 @@ -111,8 +111,6 @@ void emitInvoke(Invoke i); - void visitRuntimeCall(RuntimeCallNode i); - // Handling of block-end nodes still needs to be unified in the LIRGenerator. void visitMerge(MergeNode i); diff -r b88f69f80681 -r 1313dd590c62 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/Log.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/Log.java Wed May 15 22:39:26 2013 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/Log.java Thu May 16 15:51:16 2013 +0200 @@ -33,8 +33,7 @@ //JaCoCo Exclude /** - * Provides {@link PrintStream}-like logging facility. This should only be used in - * {@linkplain Snippet snippets}. + * Provides {@link PrintStream}-like logging facility. */ public final class Log { @@ -42,7 +41,7 @@ public static final Descriptor LOG_OBJECT = new Descriptor("logObject", false, void.class, Object.class, int.class); public static final Descriptor LOG_PRINTF = new Descriptor("logPrintf", false, void.class, Object.class, long.class, long.class, long.class); - // Note: Must be kept in sync with constants in c1_Runtime1.hpp + // Note: Must be kept in sync with constants in graalRuntime.hpp private static final int LOG_OBJECT_NEWLINE = 0x01; private static final int LOG_OBJECT_STRING = 0x02; private static final int LOG_OBJECT_ADDRESS = 0x04;