# HG changeset patch # User Gilles Duboscq # Date 1371136536 -7200 # Node ID 595f1f253ef489dd5c0f801e02dfa980a527f0b6 # Parent 6b34d50d3d24ed9b3b405b8e6408dc986168920e Use createAnchoredReceiver to create the invokes's receiver check before inlining diff -r 6b34d50d3d24 -r 595f1f253ef4 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Fri Jun 14 11:16:41 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java Thu Jun 13 17:15:36 2013 +0200 @@ -491,15 +491,13 @@ LoadHubNode receiverHub = graph.add(new LoadHubNode(receiver, typeHub.kind())); CompareNode typeCheck = CompareNode.createCompareNode(Condition.EQ, receiverHub, typeHub); FixedGuardNode guard = graph.add(new FixedGuardNode(typeCheck, DeoptimizationReason.TypeCheckedInliningViolated, DeoptimizationAction.InvalidateReprofile)); - ValueAnchorNode anchor = graph.add(new ValueAnchorNode()); assert invoke.predecessor() != null; - ValueNode anchoredReceiver = createAnchoredReceiver(graph, anchor, type, receiver, true); + ValueNode anchoredReceiver = createAnchoredReceiver(graph, guard, type, receiver, true); invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); graph.addBeforeFixed(invoke.asNode(), receiverHub); graph.addBeforeFixed(invoke.asNode(), guard); - graph.addBeforeFixed(invoke.asNode(), anchor); } @Override @@ -1228,8 +1226,12 @@ } private static PiNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ResolvedJavaType commonType, ValueNode receiver, boolean exact) { + return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType)); + } + + private static PiNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ValueNode receiver, Stamp stamp) { // to avoid that floating reads on receiver fields float above the type check - return graph.unique(new PiNode(receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType), anchor)); + return graph.unique(new PiNode(receiver, stamp, anchor)); } // TODO (chaeubl): cleanup this method @@ -1298,9 +1300,17 @@ FrameState stateAfter = invoke.stateAfter(); assert stateAfter == null || stateAfter.isAlive(); - GuardingNode receiverNullCheckNode = null; if (receiverNullCheck) { - receiverNullCheckNode = receiverNullCheck(invoke); + GuardingNode receiverNullCheckNode = receiverNullCheck(invoke); + if (receiverNullCheckNode != null) { + ValueNode receiver = invoke.callTarget().arguments().get(0); + Stamp piStamp = receiver.stamp(); + if (piStamp instanceof ObjectStamp) { + piStamp = piStamp.join(StampFactory.objectNonNull()); + } + ValueNode anchoredReceiver = createAnchoredReceiver(graph, receiverNullCheckNode, receiver, piStamp); + invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); + } } IdentityHashMap replacements = new IdentityHashMap<>(); @@ -1313,18 +1323,7 @@ if (node == entryPointNode || node == entryPointNode.stateAfter()) { // Do nothing. } else if (node instanceof LocalNode) { - int localIndex = ((LocalNode) node).index(); - ValueNode parameter = parameters.get(localIndex); - if (receiverNullCheckNode != null && localIndex == 0) { - Stamp piStamp = parameter.stamp(); - if (piStamp instanceof ObjectStamp) { - piStamp = piStamp.join(StampFactory.objectNonNull()); - } - PiNode piReceiver = graph.add(new PiNode(parameter, piStamp)); - piReceiver.setGuard(receiverNullCheckNode); - parameter = piReceiver; - } - replacements.put(node, parameter); + replacements.put(node, parameters.get(((LocalNode) node).index())); } else { nodes.add(node); if (node instanceof ReturnNode) {