# HG changeset patch # User Thomas Wuerthinger # Date 1433238343 -7200 # Node ID cd6b1b2189a02697af398b7af066a709d438b1f1 # Parent 5f3dda39d20576c61daaf811a64660c95d4f8c05 Remove GuardingPiNode and replace with FixedGuardNode + PiNode. diff -r 5f3dda39d205 -r cd6b1b2189a0 graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Mon Jun 01 12:55:56 2015 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java Tue Jun 02 11:45:43 2015 +0200 @@ -2907,16 +2907,15 @@ ValueNode checkCastNode = null; if (profile != null) { if (profile.getNullSeen().isFalse()) { - object = append(GuardingPiNode.createNullCheck(object)); + object = appendNullCheck(object); ResolvedJavaType singleType = profile.asSingleType(); if (singleType != null) { LogicNode typeCheck = append(TypeCheckNode.create(singleType, object)); if (typeCheck.isTautology()) { checkCastNode = object; } else { - GuardingPiNode piNode = append(new GuardingPiNode(object, typeCheck, false, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, - StampFactory.exactNonNull(singleType))); - checkCastNode = piNode; + FixedGuardNode fixedGuard = append(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile, false)); + checkCastNode = append(new PiNode(object, StampFactory.exactNonNull(singleType), fixedGuard)); } } } @@ -2927,6 +2926,12 @@ frameState.push(Kind.Object, checkCastNode); } + private ValueNode appendNullCheck(ValueNode object) { + IsNullNode isNull = append(new IsNullNode(object)); + FixedGuardNode fixedGuard = append(new FixedGuardNode(isNull, DeoptimizationReason.NullCheckException, DeoptimizationAction.InvalidateReprofile, true)); + return append(new PiNode(object, object.stamp().join(StampFactory.objectNonNull()), fixedGuard)); + } + private void genInstanceOf() { int cpi = getStream().readCPI(); JavaType type = lookupType(cpi, INSTANCEOF); @@ -2948,7 +2953,7 @@ ValueNode instanceOfNode = null; if (profile != null) { if (profile.getNullSeen().isFalse()) { - object = append(GuardingPiNode.createNullCheck(object)); + object = appendNullCheck(object); ResolvedJavaType singleType = profile.asSingleType(); if (singleType != null) { LogicNode typeCheck = append(TypeCheckNode.create(singleType, object)); diff -r 5f3dda39d205 -r cd6b1b2189a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java Mon Jun 01 12:55:56 2015 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2012, 2015, 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; - -import com.oracle.graal.compiler.common.type.*; -import com.oracle.graal.graph.*; -import com.oracle.graal.graph.spi.*; -import com.oracle.graal.nodeinfo.*; -import com.oracle.graal.nodes.calc.*; -import com.oracle.graal.nodes.extended.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; -import com.oracle.jvmci.meta.*; - -/** - * A node that changes the stamp of its input based on some condition being true. - */ -@NodeInfo(nameTemplate = "GuardingPi(!={p#negated}) {p#reason/s}") -public final class GuardingPiNode extends FixedWithNextNode implements Lowerable, Virtualizable, Canonicalizable, ValueProxy { - - public static final NodeClass TYPE = NodeClass.create(GuardingPiNode.class); - @Input ValueNode object; - @Input(InputType.Condition) LogicNode condition; - protected final DeoptimizationReason reason; - protected final DeoptimizationAction action; - protected final Stamp piStamp; - protected boolean negated; - - public ValueNode object() { - return object; - } - - public LogicNode condition() { - return condition; - } - - public boolean isNegated() { - return negated; - } - - public DeoptimizationReason getReason() { - return reason; - } - - public DeoptimizationAction getAction() { - return action; - } - - public GuardingPiNode(ValueNode object) { - this(object, object.graph().unique(new IsNullNode(object)), true, DeoptimizationReason.NullCheckException, DeoptimizationAction.None, object.stamp().join(StampFactory.objectNonNull())); - } - - public GuardingPiNode(ValueNode object, ValueNode condition, boolean negateCondition, DeoptimizationReason reason, DeoptimizationAction action, Stamp stamp) { - super(TYPE, stamp); - assert stamp != null; - this.piStamp = stamp; - this.object = object; - this.condition = (LogicNode) condition; - this.reason = reason; - this.action = action; - this.negated = negateCondition; - } - - public static ValueNode createNullCheck(ValueNode object) { - ObjectStamp objectStamp = (ObjectStamp) object.stamp(); - if (objectStamp.nonNull()) { - return object; - } else { - return new GuardingPiNode(object); - } - } - - @Override - public void lower(LoweringTool tool) { - GuardingNode guard = tool.createGuard(next(), condition, reason, action, negated); - ValueAnchorNode anchor = graph().add(new ValueAnchorNode((ValueNode) guard)); - if (usages().isNotEmpty()) { - PiNode pi = graph().unique(new PiNode(object, stamp(), (ValueNode) guard)); - replaceAtUsages(pi); - } - graph().replaceFixedWithFixed(this, anchor); - } - - @Override - public void virtualize(VirtualizerTool tool) { - State state = tool.getObjectState(object); - if (state != null && state.getState() == EscapeState.Virtual && StampTool.typeOrNull(this) != null && StampTool.typeOrNull(this).isAssignableFrom(state.getVirtualObject().type())) { - tool.replaceWithVirtual(state.getVirtualObject()); - } - } - - @Override - public boolean inferStamp() { - return updateStamp(piStamp.join(object().stamp())); - } - - @Override - public Node canonical(CanonicalizerTool tool) { - if (stamp().isEmpty()) { - // The guard always fails - return new DeoptimizeNode(action, reason); - } - if (condition instanceof LogicConstantNode) { - LogicConstantNode c = (LogicConstantNode) condition; - if (c.getValue() == negated) { - // The guard always fails - return new DeoptimizeNode(action, reason); - } else if (stamp().equals(object().stamp())) { - // The guard always succeeds, and does not provide new type information - return object; - } else { - // The guard always succeeds, and provides new type information - return new PiNode(object, stamp()); - } - } - return this; - } - - @NodeIntrinsic - public static native Object guardingNonNull(Object object); - - @Override - public ValueNode getOriginalNode() { - return object; - } - - /** - * Casts a value to have an exact, non-null stamp representing {@link Class} that is guarded by - * a null check. - */ - @NodeIntrinsic(GuardingPiNode.class) - public static native Class asNonNullClass(Class c); -} diff -r 5f3dda39d205 -r cd6b1b2189a0 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Mon Jun 01 12:55:56 2015 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Tue Jun 02 11:45:43 2015 +0200 @@ -32,6 +32,7 @@ import com.oracle.graal.nodeinfo.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.jvmci.meta.*; @@ -90,7 +91,7 @@ } /** - * Lowers a {@link CheckCastNode} to a {@link GuardingPiNode}. That is: + * Lowers a {@link CheckCastNode}. That is: * *
      * 1: A a = ...
@@ -118,7 +119,7 @@
     @Override
     public void lower(LoweringTool tool) {
         Stamp newStamp = StampFactory.declaredTrusted(type).improveWith(object().stamp());
-        ValueNode condition;
+        LogicNode condition;
         ValueNode theValue = object;
         if (newStamp.isEmpty()) {
             // This is a check cast that will always fail
@@ -148,9 +149,11 @@
                 condition = LogicNode.or(graph().unique(new IsNullNode(object)), typeTest, shortCircuitProbability);
             }
         }
-        GuardingPiNode checkedObject = graph().add(new GuardingPiNode(theValue, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, newStamp));
-        graph().replaceFixedWithFixed(this, checkedObject);
-        checkedObject.lower(tool);
+        GuardingNode guard = tool.createGuard(next(), condition, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, false);
+        ValueAnchorNode valueAnchor = graph().add(new ValueAnchorNode((ValueNode) guard));
+        PiNode piNode = graph().unique(new PiNode(theValue, newStamp, valueAnchor));
+        this.replaceAtUsages(piNode);
+        graph().replaceFixedWithFixed(this, valueAnchor);
     }
 
     @Override
diff -r 5f3dda39d205 -r cd6b1b2189a0 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	Mon Jun 01 12:55:56 2015 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningUtil.java	Tue Jun 02 11:45:43 2015 +0200
@@ -655,8 +655,9 @@
         if (firstParam.getKind() == Kind.Object && !StampTool.isPointerNonNull(firstParam)) {
             IsNullNode condition = graph.unique(new IsNullNode(firstParam));
             Stamp stamp = firstParam.stamp().join(objectNonNull());
-            GuardingPiNode nonNullReceiver = graph.add(new GuardingPiNode(firstParam, condition, true, NullCheckException, InvalidateReprofile, stamp));
-            graph.addBeforeFixed(invoke.asNode(), nonNullReceiver);
+            FixedGuardNode fixedGuard = graph.add(new FixedGuardNode(condition, NullCheckException, InvalidateReprofile, true));
+            PiNode nonNullReceiver = graph.unique(new PiNode(firstParam, stamp, fixedGuard));
+            graph.addBeforeFixed(invoke.asNode(), fixedGuard);
             callTarget.replaceFirstInput(firstParam, nonNullReceiver);
             return nonNullReceiver;
         }
diff -r 5f3dda39d205 -r cd6b1b2189a0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java	Mon Jun 01 12:55:56 2015 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/InstanceOfSnippetsTemplates.java	Tue Jun 02 11:45:43 2015 +0200
@@ -95,7 +95,7 @@
      */
     protected InstanceOfUsageReplacer createReplacer(FloatingNode instanceOf, Instantiation instantiation, Node usage, final StructuredGraph graph) {
         InstanceOfUsageReplacer replacer;
-        if (usage instanceof IfNode || usage instanceof FixedGuardNode || usage instanceof ShortCircuitOrNode || usage instanceof GuardingPiNode || usage instanceof ConditionAnchorNode) {
+        if (usage instanceof IfNode || usage instanceof FixedGuardNode || usage instanceof ShortCircuitOrNode || usage instanceof ConditionAnchorNode) {
             ValueNode trueValue = ConstantNode.forInt(1, graph);
             ValueNode falseValue = ConstantNode.forInt(0, graph);
             if (instantiation.isInitialized() && (trueValue != instantiation.trueValue || falseValue != instantiation.falseValue)) {
diff -r 5f3dda39d205 -r cd6b1b2189a0 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Mon Jun 01 12:55:56 2015 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/NodeIntrinsificationPhase.java	Tue Jun 02 11:45:43 2015 +0200
@@ -489,12 +489,6 @@
             for (Node piUsage : usage.usages().snapshot()) {
                 checkCheckCastUsage(graph, intrinsifiedNode, usage, piUsage);
             }
-        } else if (usage instanceof GuardingPiNode) {
-            GuardingPiNode pi = (GuardingPiNode) usage;
-            for (Node piUsage : pi.usages().snapshot()) {
-                checkCheckCastUsage(graph, intrinsifiedNode, usage, piUsage);
-            }
-            graph.removeFixed(pi);
         } else {
             DebugScope.forceDump(graph, "exception");
             assert false : sourceLocation(usage) + " has unexpected usage " + usage + " of checkcast " + input + " at " + sourceLocation(input);