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()) {