Mercurial > hg > truffle
comparison graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java @ 10706:8d961f93725c
Use GuardedValueNode in the inlining
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 09 Jul 2013 18:17:55 +0200 |
parents | bebc9672f45e |
children | 438dd12ff25b |
comparison
equal
deleted
inserted
replaced
10705:fd53f9f7007b | 10706:8d961f93725c |
---|---|
659 invoke.setNext(null); | 659 invoke.setNext(null); |
660 returnMerge.setNext(continuation); | 660 returnMerge.setNext(continuation); |
661 invoke.asNode().replaceAtUsages(returnValuePhi); | 661 invoke.asNode().replaceAtUsages(returnValuePhi); |
662 invoke.asNode().replaceAndDelete(null); | 662 invoke.asNode().replaceAndDelete(null); |
663 | 663 |
664 ArrayList<PiNode> replacementNodes = new ArrayList<>(); | 664 ArrayList<GuardedValueNode> replacementNodes = new ArrayList<>(); |
665 | 665 |
666 // do the actual inlining for every invoke | 666 // do the actual inlining for every invoke |
667 for (int i = 0; i < numberOfMethods; i++) { | 667 for (int i = 0; i < numberOfMethods; i++) { |
668 AbstractBeginNode node = successors[i]; | 668 AbstractBeginNode node = successors[i]; |
669 Invoke invokeForInlining = (Invoke) node.next(); | 669 Invoke invokeForInlining = (Invoke) node.next(); |
675 commonType = getLeastCommonType(i); | 675 commonType = getLeastCommonType(i); |
676 } | 676 } |
677 | 677 |
678 ValueNode receiver = ((MethodCallTargetNode) invokeForInlining.callTarget()).receiver(); | 678 ValueNode receiver = ((MethodCallTargetNode) invokeForInlining.callTarget()).receiver(); |
679 boolean exact = (getTypeCount(i) == 1 && !methodDispatch); | 679 boolean exact = (getTypeCount(i) == 1 && !methodDispatch); |
680 PiNode anchoredReceiver = createAnchoredReceiver(graph, node, commonType, receiver, exact); | 680 GuardedValueNode anchoredReceiver = createAnchoredReceiver(graph, node, commonType, receiver, exact); |
681 invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver); | 681 invokeForInlining.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
682 | 682 |
683 inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false); | 683 inline(invokeForInlining, methodAt(i), inlineableElementAt(i), assumptions, false); |
684 | 684 |
685 replacementNodes.add(anchoredReceiver); | 685 replacementNodes.add(anchoredReceiver); |
954 AbstractBeginNode[] successors = new AbstractBeginNode[]{invocationEntry, unknownTypeSux}; | 954 AbstractBeginNode[] successors = new AbstractBeginNode[]{invocationEntry, unknownTypeSux}; |
955 createDispatchOnTypeBeforeInvoke(graph, successors, true, runtime); | 955 createDispatchOnTypeBeforeInvoke(graph, successors, true, runtime); |
956 | 956 |
957 invocationEntry.setNext(invoke.asNode()); | 957 invocationEntry.setNext(invoke.asNode()); |
958 ValueNode receiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); | 958 ValueNode receiver = ((MethodCallTargetNode) invoke.callTarget()).receiver(); |
959 PiNode anchoredReceiver = createAnchoredReceiver(graph, invocationEntry, target.getDeclaringClass(), receiver, false); | 959 GuardedValueNode anchoredReceiver = createAnchoredReceiver(graph, invocationEntry, target.getDeclaringClass(), receiver, false); |
960 invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); | 960 invoke.callTarget().replaceFirstInput(receiver, anchoredReceiver); |
961 replaceInvokeCallTarget(invoke, graph, kind, target); | 961 replaceInvokeCallTarget(invoke, graph, kind, target); |
962 } | 962 } |
963 | 963 |
964 private static AbstractBeginNode createUnknownTypeSuccessor(StructuredGraph graph) { | 964 private static AbstractBeginNode createUnknownTypeSuccessor(StructuredGraph graph) { |
1214 } | 1214 } |
1215 return new MultiTypeGuardInlineInfo(invoke, concreteMethods, concreteMethodsProbabilities, usedTypes, typesToConcretes, notRecordedTypeProbability); | 1215 return new MultiTypeGuardInlineInfo(invoke, concreteMethods, concreteMethodsProbabilities, usedTypes, typesToConcretes, notRecordedTypeProbability); |
1216 } | 1216 } |
1217 } | 1217 } |
1218 | 1218 |
1219 private static PiNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ResolvedJavaType commonType, ValueNode receiver, boolean exact) { | 1219 private static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ResolvedJavaType commonType, ValueNode receiver, boolean exact) { |
1220 return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType)); | 1220 return createAnchoredReceiver(graph, anchor, receiver, exact ? StampFactory.exactNonNull(commonType) : StampFactory.declaredNonNull(commonType)); |
1221 } | 1221 } |
1222 | 1222 |
1223 private static PiNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ValueNode receiver, Stamp stamp) { | 1223 private static GuardedValueNode createAnchoredReceiver(StructuredGraph graph, GuardingNode anchor, ValueNode receiver, Stamp stamp) { |
1224 // to avoid that floating reads on receiver fields float above the type check | 1224 // to avoid that floating reads on receiver fields float above the type check |
1225 return graph.unique(new PiNode(receiver, stamp, anchor)); | 1225 return graph.unique(new GuardedValueNode(receiver, anchor, stamp)); |
1226 } | 1226 } |
1227 | 1227 |
1228 // TODO (chaeubl): cleanup this method | 1228 // TODO (chaeubl): cleanup this method |
1229 private static boolean checkInvokeConditions(Invoke invoke) { | 1229 private static boolean checkInvokeConditions(Invoke invoke) { |
1230 if (invoke.predecessor() == null || !invoke.asNode().isAlive()) { | 1230 if (invoke.predecessor() == null || !invoke.asNode().isAlive()) { |