# HG changeset patch # User Thomas Wuerthinger # Date 1433189577 -7200 # Node ID 2c6802ac343cc4c4608a9a6d1d9ed51ee648bef3 # Parent 0a203897b1126bd0416188071d6144259053a9c9 Use graph builder plugin instead of node intrinsic for guarding non-null in snippets. diff -r 0a203897b112 -r 2c6802ac343c graal/com.oracle.graal.api.directives/src/com/oracle/graal/api/directives/GraalDirectives.java --- a/graal/com.oracle.graal.api.directives/src/com/oracle/graal/api/directives/GraalDirectives.java Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.api.directives/src/com/oracle/graal/api/directives/GraalDirectives.java Mon Jun 01 22:12:57 2015 +0200 @@ -276,4 +276,11 @@ public static T opaque(T value) { return value; } + + public static T guardingNonNull(T value) { + if (value == null) { + deoptimize(); + } + return value; + } } diff -r 0a203897b112 -r 2c6802ac343c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ObjectCloneSnippets.java Mon Jun 01 22:12:57 2015 +0200 @@ -23,11 +23,12 @@ package com.oracle.graal.hotspot.replacements; import com.oracle.jvmci.meta.Kind; + import java.lang.reflect.*; import java.util.*; +import com.oracle.graal.api.directives.*; import com.oracle.graal.hotspot.replacements.arraycopy.*; -import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.replacements.*; import com.oracle.jvmci.common.*; @@ -114,7 +115,7 @@ @Snippet(removeAllFrameStates = true) public static Object[] objectArrayClone(Object[] src) { - Object[] result = (Object[]) DynamicNewArrayNode.newUninitializedArray(GuardingPiNode.asNonNullClass(src.getClass().getComponentType()), src.length, Kind.Object); + Object[] result = (Object[]) DynamicNewArrayNode.newUninitializedArray(GraalDirectives.guardingNonNull(src.getClass().getComponentType()), src.length, Kind.Object); ArrayCopyCallNode.disjointUninitializedArraycopy(src, 0, result, 0, src.length, Kind.Object); return result; } diff -r 0a203897b112 -r 2c6802ac343c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionSubstitutions.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionSubstitutions.java Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/ReflectionSubstitutions.java Mon Jun 01 22:12:57 2015 +0200 @@ -26,9 +26,9 @@ import java.lang.reflect.*; +import com.oracle.graal.api.directives.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.hotspot.word.*; -import com.oracle.graal.nodes.*; /** * Substitutions for {@link sun.reflect.Reflection} methods. @@ -38,7 +38,7 @@ @MethodSubstitution public static int getClassAccessFlags(Class aClass) { - KlassPointer klass = ClassGetHubNode.readClass(GuardingPiNode.asNonNullClass(aClass)); + KlassPointer klass = ClassGetHubNode.readClass(GraalDirectives.guardingNonNull(aClass)); if (klass.isNull()) { // Class for primitive type return Modifier.ABSTRACT | Modifier.FINAL | Modifier.PUBLIC; diff -r 0a203897b112 -r 2c6802ac343c graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/arraycopy/ArrayCopySnippets.java Mon Jun 01 22:12:57 2015 +0200 @@ -30,14 +30,15 @@ import com.oracle.jvmci.meta.ResolvedJavaMethod; import com.oracle.jvmci.meta.DeoptimizationAction; import com.oracle.jvmci.meta.Kind; + import static com.oracle.graal.compiler.common.GraalOptions.*; import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; -import static com.oracle.graal.nodes.GuardingPiNode.*; import static com.oracle.graal.nodes.extended.BranchProbabilityNode.*; import java.lang.reflect.*; import java.util.*; +import com.oracle.graal.api.directives.*; import com.oracle.graal.api.replacements.*; import com.oracle.graal.graph.*; import com.oracle.graal.hotspot.meta.*; @@ -98,8 +99,8 @@ @Snippet public static void arraycopyZeroLengthIntrinsic(Object src, int srcPos, Object dest, int destPos, int length) { - Object nonNullSrc = guardingNonNull(src); - Object nonNullDest = guardingNonNull(dest); + Object nonNullSrc = GraalDirectives.guardingNonNull(src); + Object nonNullDest = GraalDirectives.guardingNonNull(dest); KlassPointer srcHub = loadHub(nonNullSrc); KlassPointer destHub = loadHub(nonNullDest); checkArrayType(srcHub); @@ -110,8 +111,8 @@ @Snippet public static void arraycopyExactIntrinsic(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Kind elementKind, @ConstantParameter SnippetCounter counter) { - Object nonNullSrc = guardingNonNull(src); - Object nonNullDest = guardingNonNull(dest); + Object nonNullSrc = GraalDirectives.guardingNonNull(src); + Object nonNullDest = GraalDirectives.guardingNonNull(dest); checkLimits(nonNullSrc, srcPos, nonNullDest, destPos, length); counter.inc(); ArrayCopyCallNode.arraycopy(nonNullSrc, srcPos, nonNullDest, destPos, length, elementKind); @@ -128,8 +129,8 @@ */ @Snippet public static void arraycopyPredictedExactIntrinsic(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Kind elementKind, @ConstantParameter SnippetCounter counter) { - Object nonNullSrc = guardingNonNull(src); - Object nonNullDest = guardingNonNull(dest); + Object nonNullSrc = GraalDirectives.guardingNonNull(src); + Object nonNullDest = GraalDirectives.guardingNonNull(dest); KlassPointer srcHub = loadHub(nonNullSrc); KlassPointer destHub = loadHub(nonNullDest); if (probability(SLOW_PATH_PROBABILITY, srcHub != destHub)) { @@ -167,8 +168,8 @@ */ @Snippet public static void arraycopySlowPathIntrinsic(Object src, int srcPos, Object dest, int destPos, int length, @ConstantParameter Kind elementKind, @ConstantParameter SnippetInfo slowPath) { - Object nonNullSrc = guardingNonNull(src); - Object nonNullDest = guardingNonNull(dest); + Object nonNullSrc = GraalDirectives.guardingNonNull(src); + Object nonNullDest = GraalDirectives.guardingNonNull(dest); KlassPointer srcHub = loadHub(nonNullSrc); KlassPointer destHub = loadHub(nonNullDest); checkArrayType(srcHub); @@ -210,8 +211,8 @@ @Snippet public static void arraycopyGeneric(Object src, int srcPos, Object dest, int destPos, int length) { - Object nonNullSrc = guardingNonNull(src); - Object nonNullDest = guardingNonNull(dest); + Object nonNullSrc = GraalDirectives.guardingNonNull(src); + Object nonNullDest = GraalDirectives.guardingNonNull(dest); KlassPointer srcHub = loadHub(nonNullSrc); KlassPointer destHub = loadHub(nonNullDest); if (probability(FAST_PATH_PROBABILITY, srcHub.equal(destHub)) && probability(FAST_PATH_PROBABILITY, nonNullSrc != nonNullDest)) { diff -r 0a203897b112 -r 2c6802ac343c graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ArraySubstitutions.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ArraySubstitutions.java Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/ArraySubstitutions.java Mon Jun 01 22:12:57 2015 +0200 @@ -24,6 +24,7 @@ import static com.oracle.graal.nodes.extended.BranchProbabilityNode.*; +import com.oracle.graal.api.directives.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.jvmci.meta.*; @@ -44,7 +45,7 @@ if (probability(SLOW_PATH_PROBABILITY, componentType == void.class)) { DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); } - return DynamicNewArrayNode.newArray(GuardingPiNode.asNonNullClass(componentType), length); + return DynamicNewArrayNode.newArray(GraalDirectives.guardingNonNull(componentType), length); } public static int getLength(Object array) { diff -r 0a203897b112 -r 2c6802ac343c 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 Mon Jun 01 13:19:48 2015 +0200 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/StandardGraphBuilderPlugins.java Mon Jun 01 22:12:57 2015 +0200 @@ -625,6 +625,24 @@ }); } } + + r.register1("guardingNonNull", Object.class, new InvocationPlugin() { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) { + ObjectStamp objectStamp = (ObjectStamp) value.stamp(); + if (objectStamp.nonNull()) { + b.addPush(value.getKind(), value); + return true; + } else if (objectStamp.alwaysNull()) { + b.add(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.NullCheckException)); + return true; + } + IsNullNode isNull = b.add(new IsNullNode(value)); + FixedGuardNode fixedGuard = b.add(new FixedGuardNode(isNull, DeoptimizationReason.NullCheckException, DeoptimizationAction.None, true)); + Stamp newStamp = objectStamp.improveWith(StampFactory.objectNonNull()); + b.addPush(value.getKind(), new PiNode(value, newStamp, fixedGuard)); + return true; + } + }); } private static void registerJMHBlackholePlugins(InvocationPlugins plugins) {