Mercurial > hg > graal-compiler
changeset 21065:986f1c0d6f55
Truffle-DSL: do not generate polymorphic nodes for nodes with all parameters evaluated in all execute methods.
author | Christian Humer <christian.humer@oracle.com> |
---|---|
date | Fri, 17 Apr 2015 16:18:17 +0200 |
parents | 28117ede7606 |
children | 82539241ff38 |
files | graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java |
diffstat | 2 files changed, 20 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Tue Apr 21 10:32:52 2015 +0200 +++ b/graal/com.oracle.truffle.api.dsl/src/com/oracle/truffle/api/dsl/internal/SpecializationNode.java Fri Apr 17 16:18:17 2015 +0200 @@ -504,7 +504,15 @@ if (merged == generated) { // new node if (start.count() == 2) { - insertAt(start, start.createPolymorphic(), "insert polymorphic"); + SpecializationNode polymorphic = start.createPolymorphic(); + /* + * For nodes with all parameters evaluated in the execute method we do not need a + * polymorphic node. the generated code returns null in createPolymorphic in this + * case. + */ + if (polymorphic != null) { + insertAt(start, polymorphic, "insert polymorphic"); + } } SpecializationNode current = start; while (current != null && current.index < generated.index) {
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Tue Apr 21 10:32:52 2015 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/generator/NodeGenFactory.java Fri Apr 17 16:18:17 2015 +0200 @@ -420,6 +420,17 @@ } private boolean needsPolymorphic() { + int signatureSize = node.getSignatureSize(); + boolean allEvaluated = true; + for (ExecutableTypeData type : usedTypes) { + if (type.getEvaluatedCount() != signatureSize) { + allEvaluated = false; + } + } + if (allEvaluated) { + return false; + } + if (reachableSpecializations.size() != 1) { return true; }