Mercurial > hg > truffle
changeset 11193:6879565ee10b
Truffle-DSL: Fixed the second specialization is unreachable if two specializations have the exactly same signature (also guards) and are ordered next to each other.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 01 Aug 2013 20:52:03 +0200 |
parents | 0460c44aef60 |
children | 14d5ff4683e0 |
files | graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java |
diffstat | 3 files changed, 33 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Thu Aug 01 20:48:56 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/NodeParser.java Thu Aug 01 20:52:03 2013 +0200 @@ -665,6 +665,7 @@ } // calculate reachability + SpecializationData prev = null; int specializationCount = 0; boolean reachable = true; for (SpecializationData specialization : specializations) { @@ -672,7 +673,9 @@ specialization.setReachable(true); continue; } - if (!reachable && specialization.getMethod() != null) { + if (prev != null && prev.equalsGuards(specialization) && prev.getExceptions().isEmpty()) { + specialization.addError("%s is not reachable.", specialization.isGeneric() ? "Generic" : "Specialization"); + } else if (!reachable && specialization.getMethod() != null) { specialization.addError("%s is not reachable.", specialization.isGeneric() ? "Generic" : "Specialization"); } specialization.setReachable(reachable); @@ -682,6 +685,7 @@ if (!specialization.isGeneric()) { specializationCount++; } + prev = specialization; } // initialize polymorphic depth
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java Thu Aug 01 20:48:56 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationData.java Thu Aug 01 20:52:03 2013 +0200 @@ -259,4 +259,11 @@ getParameters().add(0, new ActualParameter(frameSpec, frameType, -1, false)); } } + + public boolean equalsGuards(SpecializationData specialization) { + if (assumptions.equals(specialization.getAssumptions()) && guards.equals(specialization.getGuards()) && getSignature().equalsParameters(specialization.getSignature())) { + return true; + } + return false; + } }
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java Thu Aug 01 20:48:56 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/template/TemplateMethod.java Thu Aug 01 20:52:03 2013 +0200 @@ -216,6 +216,20 @@ return signature; } + public ActualParameter getSignatureParameter(int searchIndex) { + int index = 0; + for (ActualParameter parameter : getParameters()) { + if (!parameter.getSpecification().isSignature()) { + continue; + } + if (index == searchIndex) { + return parameter; + } + index++; + } + return null; + } + public void updateSignature(Signature signature) { assert signature.size() >= 1; int signatureIndex = 0; @@ -366,6 +380,13 @@ return signature; } + public boolean equalsParameters(Signature other) { + if (size() != other.size()) { + return false; + } + return types.subList(1, types.size()).equals(other.types.subList(1, other.types.size())); + } + @Override public boolean equals(Object obj) { if (obj instanceof Signature) {