Mercurial > hg > graal-compiler
changeset 10041:595f1f253ef4
Use createAnchoredReceiver to create the invokes's receiver check before inlining
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Thu, 13 Jun 2013 17:15:36 +0200 |
parents | 6b34d50d3d24 |
children | 0b30da13d86b |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java |
diffstat | 1 files changed, 17 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- 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<Node, Node> 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) {