Mercurial > hg > graal-jvmci-8
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java @ 10600:e93efe3ba5f4
Truffle-DSL: rewritten polymorphic optimization for simpler generated code.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Tue, 02 Jul 2013 14:51:05 +0200 |
parents | 79041ab43660 |
children | b8fe1fe004ec |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Mon Jul 01 21:08:20 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Tue Jul 02 14:51:05 2013 +0200 @@ -33,9 +33,10 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.nodes.*; import com.oracle.truffle.dsl.processor.*; -import com.oracle.truffle.dsl.processor.node.NodeChildData.*; +import com.oracle.truffle.dsl.processor.node.NodeChildData.Cardinality; +import com.oracle.truffle.dsl.processor.node.NodeChildData.ExecutionKind; import com.oracle.truffle.dsl.processor.template.*; -import com.oracle.truffle.dsl.processor.template.TemplateMethod.*; +import com.oracle.truffle.dsl.processor.template.TemplateMethod.Signature; import com.oracle.truffle.dsl.processor.typesystem.*; public class NodeParser extends TemplateParser<NodeData> { @@ -200,7 +201,7 @@ for (NodeData splittedNode : nodes) { finalizeSpecializations(elements, splittedNode); verifyNode(splittedNode, elements); - splittedNode.setPolymorphicSpecializations(createPolymorphicSpecializations(splittedNode)); + createPolymorphicSpecializations(splittedNode); assignShortCircuitsToSpecializations(splittedNode); } @@ -212,13 +213,14 @@ return node; } - private List<SpecializationData> createPolymorphicSpecializations(NodeData node) { + private void createPolymorphicSpecializations(NodeData node) { if (!node.needsRewrites(context) || node.getPolymorphicDepth() <= 1) { - return Collections.emptyList(); + node.setPolymorphicSpecializations(Collections.<SpecializationData> emptyList()); + return; } Signature genericSignature = node.getGenericSpecialization().getSignature(); - Set<Signature> signatures = new HashSet<>(); + Set<Signature> signatures = new TreeSet<>(); for (SpecializationData specialization1 : node.getSpecializations()) { Signature signature = specialization1.getSignature(); @@ -247,8 +249,8 @@ } List<Signature> sortedSignatures = new ArrayList<>(signatures); - Collections.sort(sortedSignatures); + SpecializationData polymorphicGeneric = null; List<SpecializationData> specializations = new ArrayList<>(); SpecializationData generic = node.getGenericSpecialization(); for (Signature signature : sortedSignatures) { @@ -256,15 +258,15 @@ specialization.forceFrame(context.getTruffleTypes().getFrame()); specialization.setNode(node); specialization.updateSignature(signature); + specializations.add(specialization); - if (specialization.isGenericSpecialization(context)) { - specializations.add(0, specialization); - } else { - specializations.add(specialization); + if (genericSignature.equals(signature)) { + polymorphicGeneric = specialization; } } - return specializations; + node.setGenericPolymoprhicSpecialization(polymorphicGeneric); + node.setPolymorphicSpecializations(specializations); } private NodeData parseNodeData(TypeElement templateType, TypeMirror nodeType, List<? extends Element> elements, List<TypeElement> lookupTypes) { @@ -1071,7 +1073,7 @@ } private static Map<Integer, List<ExecutableTypeData>> groupExecutableTypes(List<ExecutableTypeData> executableTypes) { - Map<Integer, List<ExecutableTypeData>> groupedTypes = new HashMap<>(); + Map<Integer, List<ExecutableTypeData>> groupedTypes = new TreeMap<>(); for (ExecutableTypeData type : executableTypes) { int evaluatedCount = type.getEvaluatedCount();