# HG changeset patch # User Thomas Wuerthinger # Date 1420994807 -3600 # Node ID fad37aaed6d27bd1189c1d0bfc598b3c0bb4e783 # Parent e4b2cbda1ae6f15cf7f7a069bc149e81f330c04e Add utilities isDirect and isIndirect to InvokeKind. diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotNodeLIRBuilder.java Sun Jan 11 17:46:47 2015 +0100 @@ -150,10 +150,10 @@ @Override protected void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { InvokeKind invokeKind = ((HotSpotDirectCallTargetNode) callTarget).invokeKind(); - if (invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual) { + if (invokeKind.isIndirect()) { append(new AMD64HotspotDirectVirtualCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind, runtime.getConfig())); } else { - assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; + assert invokeKind.isDirect(); HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod(); assert !resolvedMethod.isAbstract() : "Cannot make direct call to abstract method."; append(new AMD64HotspotDirectStaticCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind)); diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectStaticCallOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectStaticCallOp.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectStaticCallOp.java Sun Jan 11 17:46:47 2015 +0100 @@ -41,7 +41,7 @@ AMD64HotspotDirectStaticCallOp(ResolvedJavaMethod target, Value result, Value[] parameters, Value[] temps, LIRFrameState state, InvokeKind invokeKind) { super(target, result, parameters, temps, state); - assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; + assert invokeKind.isDirect(); this.invokeKind = invokeKind; } diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotspotDirectVirtualCallOp.java Sun Jan 11 17:46:47 2015 +0100 @@ -46,7 +46,7 @@ super(target, result, parameters, temps, state); this.invokeKind = invokeKind; this.config = config; - assert invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual; + assert invokeKind.isIndirect(); } @Override diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java Sun Jan 11 17:46:47 2015 +0100 @@ -99,10 +99,10 @@ @Override protected void emitDirectCall(DirectCallTargetNode callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState callState) { InvokeKind invokeKind = ((HotSpotDirectCallTargetNode) callTarget).invokeKind(); - if (invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual) { + if (invokeKind.isIndirect()) { append(new SPARCHotspotDirectVirtualCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind, runtime.getConfig())); } else { - assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; + assert invokeKind.isDirect(); HotSpotResolvedJavaMethod resolvedMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod(); assert !resolvedMethod.isAbstract() : "Cannot make direct call to abstract method."; append(new SPARCHotspotDirectStaticCallOp(callTarget.targetMethod(), result, parameters, temps, callState, invokeKind)); diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectStaticCallOp.java Sun Jan 11 17:46:47 2015 +0100 @@ -41,7 +41,7 @@ SPARCHotspotDirectStaticCallOp(ResolvedJavaMethod target, Value result, Value[] parameters, Value[] temps, LIRFrameState state, InvokeKind invokeKind) { super(target, result, parameters, temps, state); - assert invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special; + assert invokeKind.isDirect(); this.invokeKind = invokeKind; } diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotspotDirectVirtualCallOp.java Sun Jan 11 17:46:47 2015 +0100 @@ -49,7 +49,7 @@ super(target, result, parameters, temps, state); this.invokeKind = invokeKind; this.config = config; - assert invokeKind == InvokeKind.Interface || invokeKind == InvokeKind.Virtual; + assert invokeKind.isIndirect(); } @Override diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/DefaultHotSpotLoweringProvider.java Sun Jan 11 17:46:47 2015 +0100 @@ -43,7 +43,6 @@ import com.oracle.graal.hotspot.replacements.arraycopy.*; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.HeapAccess.BarrierType; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.debug.*; @@ -234,8 +233,7 @@ JavaType[] signature = callTarget.targetMethod().getSignature().toParameterTypes(callTarget.isStatic() ? null : callTarget.targetMethod().getDeclaringClass()); LoweredCallTargetNode loweredCallTarget = null; - boolean isVirtualOrInterface = callTarget.invokeKind() == InvokeKind.Virtual || callTarget.invokeKind() == InvokeKind.Interface; - if (InlineVTableStubs.getValue() && isVirtualOrInterface && (AlwaysInlineVTableStubs.getValue() || invoke.isPolymorphic())) { + if (InlineVTableStubs.getValue() && callTarget.invokeKind().isIndirect() && (AlwaysInlineVTableStubs.getValue() || invoke.isPolymorphic())) { HotSpotResolvedJavaMethod hsMethod = (HotSpotResolvedJavaMethod) callTarget.targetMethod(); ResolvedJavaType receiverType = invoke.getReceiverType(); if (hsMethod.isInVirtualMethodTable(receiverType)) { diff -r e4b2cbda1ae6 -r fad37aaed6d2 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 Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Jan 11 17:46:47 2015 +0100 @@ -789,18 +789,18 @@ if (graphBuilderConfig.eagerResolving()) { returnType = returnType.resolve(targetMethod.getDeclaringClass()); } - if (invokeKind != InvokeKind.Static) { + if (invokeKind.hasReceiver()) { emitExplicitExceptions(args[0], null); - if (invokeKind != InvokeKind.Special && this.optimisticOpts.useTypeCheckHints()) { + if (invokeKind.isIndirect() && this.optimisticOpts.useTypeCheckHints()) { JavaTypeProfile profile = profilingInfo.getTypeProfile(bci()); args[0] = TypeProfileProxyNode.proxify(args[0], profile); } } + MethodCallTargetNode callTarget = currentGraph.add(createMethodCallTarget(invokeKind, targetMethod, args, returnType)); // be conservative if information was not recorded (could result in endless - // recompiles - // otherwise) + // recompiles otherwise) if (graphBuilderConfig.omitAllExceptionEdges() || (optimisticOpts.useExceptionProbability() && profilingInfo.getExceptionSeen(bci()) == TriState.FALSE)) { createInvoke(callTarget, resultType); } else { diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/CallTargetNode.java Sun Jan 11 17:46:47 2015 +0100 @@ -33,14 +33,28 @@ @NodeInfo(allowedUsageTypes = {InputType.Extension}) public abstract class CallTargetNode extends ValueNode implements LIRLowerable { public enum InvokeKind { - Interface, - Special, - Static, - Virtual; + Interface(false), + Special(true), + Static(true), + Virtual(false); + + private InvokeKind(boolean direct) { + this.direct = direct; + } + + private boolean direct; public boolean hasReceiver() { return this != Static; } + + public boolean isDirect() { + return direct; + } + + public boolean isIndirect() { + return !direct; + } } @Input protected NodeInputList arguments; diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java Sun Jan 11 17:46:47 2015 +0100 @@ -80,7 +80,7 @@ for (Node n : usages()) { assertTrue(n instanceof Invoke, "call target can only be used from an invoke (%s)", n); } - if (invokeKind() == InvokeKind.Special || invokeKind() == InvokeKind.Static) { + if (invokeKind().isDirect()) { assertFalse(targetMethod().isAbstract(), "special calls or static calls are only allowed for concrete methods (%s)", targetMethod()); } if (invokeKind() == InvokeKind.Static) { @@ -102,7 +102,7 @@ @Override public void simplify(SimplifierTool tool) { - if (invokeKind() == InvokeKind.Interface || invokeKind() == InvokeKind.Virtual) { + if (invokeKind().isIndirect()) { // attempt to devirtualize the call // check for trivial cases (e.g. final methods, nonvirtual methods) diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java Sun Jan 11 17:46:47 2015 +0100 @@ -797,7 +797,7 @@ if (invoke.callTarget() instanceof MethodCallTargetNode) { MethodCallTargetNode callTarget = (MethodCallTargetNode) invoke.callTarget(); ValueNode receiver = callTarget.receiver(); - if (receiver != null && (callTarget.invokeKind() == InvokeKind.Interface || callTarget.invokeKind() == InvokeKind.Virtual)) { + if (receiver != null && callTarget.invokeKind().isIndirect()) { ResolvedJavaType type = state.getNodeType(receiver); if (!Objects.equals(type, StampTool.typeOrNull(receiver))) { ResolvedJavaMethod method = type.resolveConcreteMethod(callTarget.targetMethod(), invoke.getContextType()); diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/cfs/FlowSensitiveReduction.java Sun Jan 11 17:46:47 2015 +0100 @@ -306,8 +306,7 @@ */ private MethodCallTargetNode deverbosifyInputsCopyOnWrite(MethodCallTargetNode parent) { final CallTargetNode.InvokeKind ik = parent.invokeKind(); - final boolean shouldTryDevirt = (ik == CallTargetNode.InvokeKind.Interface || ik == CallTargetNode.InvokeKind.Virtual); - boolean shouldDowncastReceiver = shouldTryDevirt; + boolean shouldDowncastReceiver = ik.isIndirect(); MethodCallTargetNode changed = null; for (ValueNode i : FlowUtil.distinctValueAndConditionInputs(parent)) { ValueNode j = (ValueNode) reasoner.deverbosify(i); diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java Sun Jan 11 17:46:47 2015 +0100 @@ -526,7 +526,7 @@ public static FixedWithNextNode inlineMacroNode(Invoke invoke, ResolvedJavaMethod concrete, Class macroNodeClass) throws GraalInternalError { StructuredGraph graph = invoke.asNode().graph(); if (!concrete.equals(((MethodCallTargetNode) invoke.callTarget()).targetMethod())) { - assert ((MethodCallTargetNode) invoke.callTarget()).invokeKind() != InvokeKind.Static; + assert ((MethodCallTargetNode) invoke.callTarget()).invokeKind().hasReceiver(); InliningUtil.replaceInvokeCallTarget(invoke, graph, InvokeKind.Special, concrete); } diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/walker/InliningData.java Sun Jan 11 17:46:47 2015 +0100 @@ -158,7 +158,7 @@ return getExactInlineInfo(invoke, targetMethod); } - assert callTarget.invokeKind() == CallTargetNode.InvokeKind.Virtual || callTarget.invokeKind() == CallTargetNode.InvokeKind.Interface; + assert callTarget.invokeKind().isIndirect(); ResolvedJavaType holder = targetMethod.getDeclaringClass(); if (!(callTarget.receiver().stamp() instanceof ObjectStamp)) { diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ReplacementsImpl.java Sun Jan 11 17:46:47 2015 +0100 @@ -47,7 +47,6 @@ import com.oracle.graal.java.*; import com.oracle.graal.java.GraphBuilderPhase.Instance; import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.phases.*; @@ -681,8 +680,7 @@ InliningUtil.inlineMacroNode(callTarget.invoke(), callee, macroNodeClass); } else { StructuredGraph intrinsicGraph = InliningUtil.getIntrinsicGraph(replacements, callee); - if ((callTarget.invokeKind() == InvokeKind.Static || callTarget.invokeKind() == InvokeKind.Special) && - (policy.shouldInline(callee, methodToParse) || (intrinsicGraph != null && policy.shouldUseReplacement(callee, methodToParse)))) { + if (callTarget.invokeKind().isDirect() && (policy.shouldInline(callee, methodToParse) || (intrinsicGraph != null && policy.shouldUseReplacement(callee, methodToParse)))) { StructuredGraph targetGraph; if (intrinsicGraph != null && policy.shouldUseReplacement(callee, methodToParse)) { targetGraph = intrinsicGraph; diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Sun Jan 11 17:46:47 2015 +0100 @@ -235,8 +235,7 @@ while (true) { for (MethodCallTargetNode methodCallTargetNode : graph.getNewNodes(mark).filter(MethodCallTargetNode.class)) { - InvokeKind kind = methodCallTargetNode.invokeKind(); - if (kind == InvokeKind.Static || kind == InvokeKind.Special) { + if (methodCallTargetNode.invokeKind().isDirect()) { ValueNode receiver = methodCallTargetNode.receiver(); if (receiver != null && receiver.isConstant() && profileClass.isAssignableFrom(receiver.stamp().javaType(metaAccess))) { queue.addFirst(methodCallTargetNode); @@ -256,7 +255,7 @@ } InvokeKind kind = methodCallTargetNode.invokeKind(); try (Indent id1 = Debug.logAndIndent("try inlining %s, kind = %s", methodCallTargetNode.targetMethod(), kind)) { - if (kind == InvokeKind.Static || kind == InvokeKind.Special) { + if (kind.isDirect()) { if ((TraceTruffleCompilationHistogram.getValue() || TraceTruffleCompilationDetails.getValue()) && kind == InvokeKind.Special && methodCallTargetNode.receiver().isConstant()) { constantReceivers.add(methodCallTargetNode.receiver().asJavaConstant()); } diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCacheImpl.java Sun Jan 11 17:46:47 2015 +0100 @@ -34,7 +34,6 @@ import com.oracle.graal.graph.Node; import com.oracle.graal.graph.spi.*; import com.oracle.graal.java.*; -import com.oracle.graal.nodes.CallTargetNode.InvokeKind; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.type.*; @@ -331,8 +330,8 @@ } protected boolean shouldInline(MethodCallTargetNode methodCallTargetNode) { - boolean result = (methodCallTargetNode.invokeKind() == InvokeKind.Special || methodCallTargetNode.invokeKind() == InvokeKind.Static) && methodCallTargetNode.targetMethod().canBeInlined() && - !methodCallTargetNode.targetMethod().isNative() && methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) == null && + boolean result = methodCallTargetNode.invokeKind().isDirect() && methodCallTargetNode.targetMethod().canBeInlined() && !methodCallTargetNode.targetMethod().isNative() && + methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) == null && methodCallTargetNode.targetMethod().getAnnotation(CompilerDirectives.TruffleBoundary.class) == null && !methodCallTargetNode.targetMethod().getDeclaringClass().equals(stringBuilderClass); return result; diff -r e4b2cbda1ae6 -r fad37aaed6d2 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java Sun Jan 11 17:24:53 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/phases/ReplaceIntrinsicsPhase.java Sun Jan 11 17:46:47 2015 +0100 @@ -46,7 +46,7 @@ for (MethodCallTargetNode methodCallTarget : graph.getNodes(MethodCallTargetNode.class)) { if (methodCallTarget.isAlive()) { InvokeKind invokeKind = methodCallTarget.invokeKind(); - if (invokeKind == InvokeKind.Static || invokeKind == InvokeKind.Special) { + if (invokeKind.isDirect()) { Class macroSubstitution = replacements.getMacroSubstitution(methodCallTarget.targetMethod()); if (macroSubstitution != null) { InliningUtil.inlineMacroNode(methodCallTarget.invoke(), methodCallTarget.targetMethod(), macroSubstitution);