Mercurial > hg > graal-compiler
changeset 16821:224a89858453
Truffle-DSL: cache primary executes
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Wed, 13 Aug 2014 18:06:26 +0200 |
parents | 0370880ac9ce |
children | 84f1c44b5e9b |
files | graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeElement.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.java |
diffstat | 3 files changed, 20 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Wed Aug 13 18:06:26 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeCodeGenerator.java Wed Aug 13 18:06:26 2014 +0200 @@ -2617,18 +2617,26 @@ NodeData node = specialization.getNode(); CodeTypeElement clazz = getElement(); + List<ExecutableTypeData> primaryExecutes = null; + int lastEvaluatedCount = -1; + for (ExecutableTypeData execType : node.getExecutableTypes()) { if (execType.isFinal()) { continue; } - CodeExecutableElement executeMethod = createExecutableTypeOverride(execType, true); - clazz.add(executeMethod); - CodeTreeBuilder builder = executeMethod.getBuilder(); - CodeTree result = createExecuteBody(builder, specialization, execType); + if (execType.getEvaluatedCount() != lastEvaluatedCount) { + lastEvaluatedCount = execType.getEvaluatedCount(); + primaryExecutes = findFunctionalExecutableType(specialization, lastEvaluatedCount); + } + + CodeTreeBuilder builder = new CodeTreeBuilder(null); + builder.getTree().setEnclosingElement(execType.getMessageElement()); + + CodeTree result = createExecuteBody(builder, specialization, execType, primaryExecutes); if (result != null) { - builder.tree(result); - } else { - clazz.remove(executeMethod); + CodeExecutableElement method = createExecutableTypeOverride(execType, true); + method.createBuilder().tree(result); + clazz.add(method); } } } @@ -2684,11 +2692,9 @@ return builder.getRoot(); } - private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType) { + private CodeTree createExecuteBody(CodeTreeBuilder parent, SpecializationData specialization, ExecutableTypeData execType, List<ExecutableTypeData> primaryExecutes) { CodeTreeBuilder builder = new CodeTreeBuilder(parent); - List<ExecutableTypeData> primaryExecutes = findFunctionalExecutableType(specialization, execType.getEvaluatedCount()); - if (primaryExecutes.contains(execType) || primaryExecutes.isEmpty()) { builder.tree(createFunctionalExecute(builder, specialization, execType)); } else if (needsCastingExecuteMethod(execType)) { @@ -2778,10 +2784,9 @@ List<ExecutableTypeData> filteredTypes = new ArrayList<>(); for (ExecutableTypeData compareType : otherTypes) { - if (!ElementUtils.typeEquals(compareType.getType().getPrimitiveType(), primaryType.getPrimitiveType())) { - continue; + if (ElementUtils.typeEquals(compareType.getType().getPrimitiveType(), primaryType.getPrimitiveType())) { + filteredTypes.add(compareType); } - filteredTypes.add(compareType); } // no direct matches found use generic where the type is Object
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeElement.java Wed Aug 13 18:06:26 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeElement.java Wed Aug 13 18:06:26 2014 +0200 @@ -140,7 +140,7 @@ getAnnotationMirrors().add(annotationMirror); } - protected void setEnclosingElement(Element parent) { + public void setEnclosingElement(Element parent) { this.enclosingElement = parent; }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.java Wed Aug 13 18:06:26 2014 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/java/model/CodeTypeElement.java Wed Aug 13 18:06:26 2014 +0200 @@ -121,7 +121,7 @@ } @Override - protected void setEnclosingElement(Element element) { + public void setEnclosingElement(Element element) { super.setEnclosingElement(element); // update qualified name on container change