From 85788e4b23ef9b798bbaaf6f6ff5ee3fabff9cf4 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Tue, 17 Jul 2018 10:33:13 -0700 Subject: [PATCH 1/5] Add ProfileBooleanNode for MethodHandle profiling and castReference intrinsic --- .../phases/common/CanonicalizerPhase.java | 3 + .../StandardGraphBuilderPlugins.java | 31 ++++- .../nodes/ProfileBooleanNode.java | 110 ++++++++++++++++++ 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java diff --git a/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java b/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java index ba08d5706c60..97d125e90e8c 100644 --- a/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java +++ b/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java @@ -348,6 +348,9 @@ public boolean tryCanonicalize(final Node node, NodeClass nodeClass) { debug.log(DebugContext.VERBOSE_LEVEL, "Canonicalizer: simplifying %s", node); COUNTER_SIMPLIFICATION_CONSIDERED_NODES.increment(debug); node.simplify(tool); + if (node.isDeleted()) { + debug.log("Canonicalizer: simplified %1s", node); + } return node.isDeleted(); } return false; diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java index 96e28c53e7d3..fe7538843896 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java @@ -60,6 +60,7 @@ import org.graalvm.compiler.nodes.BeginNode; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.DeoptimizeNode; +import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.FixedWithNextNode; @@ -116,6 +117,7 @@ import org.graalvm.compiler.nodes.type.StampTool; import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.nodes.virtual.EnsureVirtualizedNode; +import org.graalvm.compiler.replacements.nodes.ProfileBooleanNode; import org.graalvm.compiler.replacements.nodes.ReverseBytesNode; import org.graalvm.compiler.replacements.nodes.VirtualizableInvokeMacroNode; import org.graalvm.compiler.replacements.nodes.arithmetic.IntegerAddExactNode; @@ -1265,7 +1267,32 @@ public boolean inlineOnly() { private static void registerMethodHandleImplPlugins(InvocationPlugins plugins, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider) { Registration r = new Registration(plugins, "java.lang.invoke.MethodHandleImpl", bytecodeProvider); + // In later JDKs this no longer exists and the usage is replace by Class.cast which is + // already an intrinsic + r.registerOptional2("castReference", Class.class, Object.class, new InvocationPlugin() { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode javaClass, ValueNode object) { + LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getAssumptions(), b.getConstantReflection(), javaClass, object, true)); + if (condition.isTautology()) { + b.addPush(JavaKind.Object, object); + } else { + FixedGuardNode fixedGuard = b.add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); + b.addPush(JavaKind.Object, DynamicPiNode.create(b.getAssumptions(), b.getConstantReflection(), object, fixedGuard, javaClass)); + } + return true; + } + + @Override + public boolean inlineOnly() { + return true; + } + }); r.register2("profileBoolean", boolean.class, int[].class, new InvocationPlugin() { + @Override + public boolean inlineOnly() { + return true; + } + @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode result, ValueNode counters) { if (result.isConstant()) { @@ -1298,7 +1325,9 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec b.addPush(JavaKind.Boolean, newResult); return true; } - return false; + b.addPush(JavaKind.Boolean, + new ProfileBooleanNode(snippetReflection, b.getInvokeKind(), targetMethod, b.bci(), b.getInvokeReturnStamp(b.getAssumptions()), result, counters)); + return true; } }); } diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java new file mode 100644 index 000000000000..41594aa9e86b --- /dev/null +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ProfileBooleanNode.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2018, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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 org.graalvm.compiler.replacements.nodes; + +import static org.graalvm.compiler.nodeinfo.NodeCycles.CYCLES_UNKNOWN; +import static org.graalvm.compiler.nodeinfo.NodeSize.SIZE_UNKNOWN; + +import org.graalvm.compiler.api.replacements.SnippetReflectionProvider; +import org.graalvm.compiler.core.common.type.StampPair; +import org.graalvm.compiler.graph.NodeClass; +import org.graalvm.compiler.graph.spi.Simplifiable; +import org.graalvm.compiler.graph.spi.SimplifierTool; +import org.graalvm.compiler.nodeinfo.NodeInfo; +import org.graalvm.compiler.nodes.CallTargetNode; +import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.FixedGuardNode; +import org.graalvm.compiler.nodes.LogicConstantNode; +import org.graalvm.compiler.nodes.LogicNode; +import org.graalvm.compiler.nodes.NodeView; +import org.graalvm.compiler.nodes.ValueNode; +import org.graalvm.compiler.nodes.calc.IntegerEqualsNode; + +import jdk.vm.ci.meta.DeoptimizationAction; +import jdk.vm.ci.meta.DeoptimizationReason; +import jdk.vm.ci.meta.JavaConstant; +import jdk.vm.ci.meta.ResolvedJavaMethod; + +@NodeInfo(cycles = CYCLES_UNKNOWN, size = SIZE_UNKNOWN) +public class ProfileBooleanNode extends MacroStateSplitNode implements Simplifiable { + public static final NodeClass TYPE = NodeClass.create(ProfileBooleanNode.class); + private final SnippetReflectionProvider snippetReflection; + + public ProfileBooleanNode(SnippetReflectionProvider snippetReflection, CallTargetNode.InvokeKind invokeKind, ResolvedJavaMethod targetMethod, int bci, StampPair returnStamp, + ValueNode... arguments) { + super(TYPE, invokeKind, targetMethod, bci, returnStamp, arguments); + this.snippetReflection = snippetReflection; + } + + ValueNode getResult() { + return getArgument(0); + } + + ValueNode getCounters() { + return getArgument(1); + } + + @Override + public void simplify(SimplifierTool b) { + ValueNode result = getResult(); + if (result.isConstant()) { + replaceAtUsages(result); + graph().removeFixed(this); + return; + } + ValueNode counters = getCounters(); + if (counters.isConstant()) { + ValueNode newResult = result; + int[] counts = snippetReflection.asObject(int[].class, (JavaConstant) counters.asConstant()); + if (counts != null && counts.length == 2) { + int falseCount = counts[0]; + int trueCount = counts[1]; + int totalCount = trueCount + falseCount; + + if (totalCount == 0) { + graph().addBeforeFixed(this, + graph().addOrUniqueWithInputs( + new FixedGuardNode(LogicConstantNode.contradiction(), DeoptimizationReason.TransferToInterpreter, DeoptimizationAction.InvalidateReprofile, + false))); + } else if (falseCount == 0 || trueCount == 0) { + boolean expected = falseCount == 0; + LogicNode condition = graph().addOrUniqueWithInputs( + IntegerEqualsNode.create(b.getConstantReflection(), b.getMetaAccess(), b.getOptions(), null, result, + ConstantNode.forBoolean(!expected), + NodeView.DEFAULT)); + + graph().addBeforeFixed(this, graph().add(new FixedGuardNode(condition, DeoptimizationReason.UnreachedCode, DeoptimizationAction.InvalidateReprofile, true))); + newResult = graph().unique(ConstantNode.forBoolean(expected)); + } else { + // We cannot use BranchProbabilityNode here since there's no guarantee + // the result of MethodHandleImpl.profileBoolean() is used as the + // test in an `if` statement (as required by BranchProbabilityNode). + } + } + replaceAtUsages(newResult); + graph().removeFixed(this); + } + } +} From 8767150c6fb21970f25c6a0f63568ebc6bf581d6 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Wed, 18 Jul 2018 11:40:03 -0700 Subject: [PATCH 2/5] Factor out dynamic cast --- .../meta/HotSpotGraphBuilderPlugins.java | 25 ---------------- .../graalvm/compiler/java/BytecodeParser.java | 19 ++++++++++++ .../graphbuilderconf/GraphBuilderContext.java | 13 ++++++++ .../StandardGraphBuilderPlugins.java | 22 +++++++++----- .../SubstrateGraphBuilderPlugins.java | 30 ------------------- 5 files changed, 46 insertions(+), 63 deletions(-) diff --git a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java index 90641e3b9109..20b5a3aa7159 100644 --- a/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java +++ b/compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotGraphBuilderPlugins.java @@ -69,9 +69,6 @@ import org.graalvm.compiler.hotspot.replacements.arraycopy.ArrayCopyNode; import org.graalvm.compiler.hotspot.word.HotSpotWordTypes; import org.graalvm.compiler.nodes.ConstantNode; -import org.graalvm.compiler.nodes.DynamicPiNode; -import org.graalvm.compiler.nodes.FixedGuardNode; -import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.NamedLocationIdentity; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.ValueNode; @@ -86,7 +83,6 @@ import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; import org.graalvm.compiler.nodes.graphbuilderconf.NodeIntrinsicPluginFactory; -import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode; import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType; import org.graalvm.compiler.nodes.memory.ReadNode; import org.graalvm.compiler.nodes.memory.address.AddressNode; @@ -107,7 +103,6 @@ import jdk.vm.ci.code.CodeUtil; import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.DeoptimizationAction; -import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.ResolvedJavaMethod; @@ -227,26 +222,6 @@ private static void registerClassPlugins(Plugins plugins, GraalHotSpotVMConfig c if (config.getFieldOffset("ArrayKlass::_component_mirror", Integer.class, "oop", Integer.MAX_VALUE) != Integer.MAX_VALUE) { r.registerMethodSubstitution(HotSpotClassSubstitutions.class, "getComponentType", Receiver.class); } - - r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { - ValueNode javaClass = receiver.get(); - LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getAssumptions(), b.getConstantReflection(), javaClass, object, true)); - if (condition.isTautology()) { - b.addPush(JavaKind.Object, object); - } else { - FixedGuardNode fixedGuard = b.add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); - b.addPush(JavaKind.Object, DynamicPiNode.create(b.getAssumptions(), b.getConstantReflection(), object, fixedGuard, javaClass)); - } - return true; - } - - @Override - public boolean inlineOnly() { - return true; - } - }); } private static void registerCallSitePlugins(InvocationPlugins plugins) { diff --git a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java index 1147a9cc7764..71af91a1e0fc 100644 --- a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java +++ b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java @@ -320,6 +320,7 @@ import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.ControlSplitNode; import org.graalvm.compiler.nodes.DeoptimizeNode; +import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.EntryMarkerNode; import org.graalvm.compiler.nodes.EntryProxyNode; @@ -4096,6 +4097,24 @@ protected void genCheckCast(ResolvedJavaType resolvedType, ValueNode objectIn) { frameState.push(JavaKind.Object, castNode); } + @Override + public void genCheckcastDynamic(ValueNode object, ValueNode javaClass) { + LogicNode condition = genUnique(InstanceOfDynamicNode.create(getAssumptions(), getConstantReflection(), javaClass, object, true)); + if (condition.isTautology()) { + frameState.push(JavaKind.Object, object); + } else { + GuardingNode guard; + if (needsExplicitClassCastException(object)) { + // This really needs to convert a Class to a hub but there's no way to do that. + ValueNode hub = javaClass; + guard = emitBytecodeExceptionCheck(condition, true, BytecodeExceptionKind.CLASS_CAST, object, hub); + } else { + guard = append(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); + } + frameState.push(JavaKind.Object, append(DynamicPiNode.create(getAssumptions(), getConstantReflection(), object, guard, javaClass))); + } + } + private void genInstanceOf(int cpi) { JavaType type = lookupType(cpi, INSTANCEOF); ValueNode object = frameState.pop(JavaKind.Object); diff --git a/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java b/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java index c7bdf9592fc7..16099b56c7b8 100644 --- a/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java +++ b/compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/GraphBuilderContext.java @@ -41,6 +41,7 @@ import org.graalvm.compiler.nodes.CallTargetNode; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; import org.graalvm.compiler.nodes.ConstantNode; +import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.NodeView; @@ -52,6 +53,7 @@ import org.graalvm.compiler.nodes.calc.SignExtendNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; +import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode; import org.graalvm.compiler.nodes.type.StampTool; import jdk.vm.ci.code.BailoutException; @@ -291,6 +293,17 @@ default ValueNode nullCheckedValue(ValueNode value, DeoptimizationAction action) return value; } + default void genCheckcastDynamic(ValueNode object, ValueNode javaClass) { + LogicNode condition = InstanceOfDynamicNode.create(getAssumptions(), getConstantReflection(), javaClass, object, true); + if (condition.isTautology()) { + addPush(JavaKind.Object, object); + } else { + append(condition); + FixedGuardNode fixedGuard = add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); + addPush(JavaKind.Object, DynamicPiNode.create(getAssumptions(), getConstantReflection(), object, fixedGuard, javaClass)); + } + } + @SuppressWarnings("unused") default void notifyReplacedCall(ResolvedJavaMethod targetMethod, ConstantNode node) { diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java index fe7538843896..b9a82f53a258 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java @@ -60,7 +60,6 @@ import org.graalvm.compiler.nodes.BeginNode; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.DeoptimizeNode; -import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.FixedGuardNode; import org.graalvm.compiler.nodes.FixedWithNextNode; @@ -795,6 +794,19 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return true; } }); + + r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { + @Override + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { + b.genCheckcastDynamic(object, receiver.get()); + return true; + } + + @Override + public boolean inlineOnly() { + return true; + } + }); } /** @@ -1272,13 +1284,7 @@ private static void registerMethodHandleImplPlugins(InvocationPlugins plugins, S r.registerOptional2("castReference", Class.class, Object.class, new InvocationPlugin() { @Override public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode javaClass, ValueNode object) { - LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getAssumptions(), b.getConstantReflection(), javaClass, object, true)); - if (condition.isTautology()) { - b.addPush(JavaKind.Object, object); - } else { - FixedGuardNode fixedGuard = b.add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); - b.addPush(JavaKind.Object, DynamicPiNode.create(b.getAssumptions(), b.getConstantReflection(), object, fixedGuard, javaClass)); - } + b.genCheckcastDynamic(object, javaClass); return true; } diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java index 48b6e13ecb8f..1d04ef25f7e0 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/snippets/SubstrateGraphBuilderPlugins.java @@ -51,13 +51,9 @@ import org.graalvm.compiler.graph.NodeList; import org.graalvm.compiler.nodes.CallTargetNode.InvokeKind; import org.graalvm.compiler.nodes.ConstantNode; -import org.graalvm.compiler.nodes.DynamicPiNode; -import org.graalvm.compiler.nodes.FixedGuardNode; -import org.graalvm.compiler.nodes.LogicNode; import org.graalvm.compiler.nodes.NodeView; import org.graalvm.compiler.nodes.PiNode; import org.graalvm.compiler.nodes.ValueNode; -import org.graalvm.compiler.nodes.calc.ConditionalNode; import org.graalvm.compiler.nodes.calc.NarrowNode; import org.graalvm.compiler.nodes.calc.ZeroExtendNode; import org.graalvm.compiler.nodes.extended.FixedValueAnchorNode; @@ -69,7 +65,6 @@ import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration; import org.graalvm.compiler.nodes.java.ArrayLengthNode; -import org.graalvm.compiler.nodes.java.InstanceOfDynamicNode; import org.graalvm.compiler.nodes.java.NewArrayNode; import org.graalvm.compiler.nodes.java.StoreIndexedNode; import org.graalvm.compiler.nodes.type.NarrowOopStamp; @@ -128,7 +123,6 @@ import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.DeoptimizationAction; -import jdk.vm.ci.meta.DeoptimizationReason; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.Local; @@ -747,30 +741,6 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec return false; } }); - - r.register2("cast", Receiver.class, Object.class, new InvocationPlugin() { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { - ValueNode toType = receiver.get(); - LogicNode condition = b.append(InstanceOfDynamicNode.create(b.getAssumptions(), b.getConstantReflection(), toType, object, true)); - if (condition.isTautology()) { - b.addPush(JavaKind.Object, object); - } else { - FixedGuardNode fixedGuard = b.add(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); - b.addPush(JavaKind.Object, DynamicPiNode.create(b.getAssumptions(), b.getConstantReflection(), object, fixedGuard, toType)); - } - return true; - } - }); - r.register2("isInstance", Receiver.class, Object.class, new InvocationPlugin() { - @Override - public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { - ValueNode type = receiver.get(); - LogicNode condition = b.append(InstanceOfDynamicNode.create(null, b.getConstantReflection(), type, object, false)); - b.push(JavaKind.Boolean.getStackKind(), b.append(new ConditionalNode(condition).canonical(null))); - return true; - } - }); } private static void registerEdgesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins, boolean analysis) { From 251f0363f6b9aed2e3f4806106de0523c3037e15 Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Fri, 9 Nov 2018 12:13:25 -0800 Subject: [PATCH 3/5] Add primitive class to Class_cast01 test --- .../src/org/graalvm/compiler/jtt/lang/Class_cast01.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/src/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java b/compiler/src/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java index 9808636ec10b..b7d906df5e4d 100644 --- a/compiler/src/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java +++ b/compiler/src/org.graalvm.compiler.jtt/src/org/graalvm/compiler/jtt/lang/Class_cast01.java @@ -26,9 +26,8 @@ */ package org.graalvm.compiler.jtt.lang; -import org.junit.Test; - import org.graalvm.compiler.jtt.JTTTest; +import org.junit.Test; public final class Class_cast01 extends JTTTest { @@ -57,6 +56,11 @@ public static int test(int i) { return -1; } } + if (i == 4) { + if (int.class.cast(object) == null) { + return -1; + } + } return i; } From de974b5963604cd9913791c887b84982d23f52fe Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Fri, 9 Nov 2018 12:13:44 -0800 Subject: [PATCH 4/5] fix message --- .../org/graalvm/compiler/phases/common/CanonicalizerPhase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java b/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java index 97d125e90e8c..4176e50b204e 100644 --- a/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java +++ b/compiler/src/org.graalvm.compiler.phases.common/src/org/graalvm/compiler/phases/common/CanonicalizerPhase.java @@ -349,7 +349,7 @@ public boolean tryCanonicalize(final Node node, NodeClass nodeClass) { COUNTER_SIMPLIFICATION_CONSIDERED_NODES.increment(debug); node.simplify(tool); if (node.isDeleted()) { - debug.log("Canonicalizer: simplified %1s", node); + debug.log("Canonicalizer: simplified %s", node); } return node.isDeleted(); } From 38c4461248c47317fd83c33c99b5e7d3e264f6ba Mon Sep 17 00:00:00 2001 From: Tom Rodriguez Date: Fri, 9 Nov 2018 12:14:07 -0800 Subject: [PATCH 5/5] Disable genCheckcastDynamic with explicit exceptions --- .../graalvm/compiler/java/BytecodeParser.java | 19 ------------------- .../StandardGraphBuilderPlugins.java | 2 +- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java index 71af91a1e0fc..1147a9cc7764 100644 --- a/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java +++ b/compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java @@ -320,7 +320,6 @@ import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.ControlSplitNode; import org.graalvm.compiler.nodes.DeoptimizeNode; -import org.graalvm.compiler.nodes.DynamicPiNode; import org.graalvm.compiler.nodes.EndNode; import org.graalvm.compiler.nodes.EntryMarkerNode; import org.graalvm.compiler.nodes.EntryProxyNode; @@ -4097,24 +4096,6 @@ protected void genCheckCast(ResolvedJavaType resolvedType, ValueNode objectIn) { frameState.push(JavaKind.Object, castNode); } - @Override - public void genCheckcastDynamic(ValueNode object, ValueNode javaClass) { - LogicNode condition = genUnique(InstanceOfDynamicNode.create(getAssumptions(), getConstantReflection(), javaClass, object, true)); - if (condition.isTautology()) { - frameState.push(JavaKind.Object, object); - } else { - GuardingNode guard; - if (needsExplicitClassCastException(object)) { - // This really needs to convert a Class to a hub but there's no way to do that. - ValueNode hub = javaClass; - guard = emitBytecodeExceptionCheck(condition, true, BytecodeExceptionKind.CLASS_CAST, object, hub); - } else { - guard = append(new FixedGuardNode(condition, DeoptimizationReason.ClassCastException, DeoptimizationAction.InvalidateReprofile, false)); - } - frameState.push(JavaKind.Object, append(DynamicPiNode.create(getAssumptions(), getConstantReflection(), object, guard, javaClass))); - } - } - private void genInstanceOf(int cpi) { JavaType type = lookupType(cpi, INSTANCEOF); ValueNode object = frameState.pop(JavaKind.Object); diff --git a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java index b9a82f53a258..3cf67b309d70 100644 --- a/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java +++ b/compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/StandardGraphBuilderPlugins.java @@ -88,13 +88,13 @@ import org.graalvm.compiler.nodes.debug.BindToRegisterNode; import org.graalvm.compiler.nodes.debug.BlackholeNode; import org.graalvm.compiler.nodes.debug.ControlFlowAnchorNode; -import org.graalvm.compiler.nodes.extended.OpaqueNode; import org.graalvm.compiler.nodes.debug.SpillRegistersNode; import org.graalvm.compiler.nodes.extended.BoxNode; import org.graalvm.compiler.nodes.extended.BranchProbabilityNode; import org.graalvm.compiler.nodes.extended.BytecodeExceptionNode.BytecodeExceptionKind; import org.graalvm.compiler.nodes.extended.GetClassNode; import org.graalvm.compiler.nodes.extended.MembarNode; +import org.graalvm.compiler.nodes.extended.OpaqueNode; import org.graalvm.compiler.nodes.extended.RawLoadNode; import org.graalvm.compiler.nodes.extended.RawStoreNode; import org.graalvm.compiler.nodes.extended.UnboxNode;