# HG changeset patch # User Christian Humer # Date 1377861334 -7200 # Node ID 5d72a3f5a31d86bc808594f0cd387d62c2729b00 # Parent b010fd3de42d9fe9da6b70c2e501ce148051ffca Truffle-DSL: fixed a bug in else connections for specialization grouping. diff -r b010fd3de42d -r 5d72a3f5a31d graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java --- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Fri Aug 30 13:11:48 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/node/SpecializationGroup.java Fri Aug 30 13:15:34 2013 +0200 @@ -41,12 +41,14 @@ private final List typeGuards; private final List guards; + private final NodeData node; private final SpecializationData specialization; private final List children = new ArrayList<>(); private SpecializationGroup parent; private SpecializationGroup(SpecializationData data) { + this.node = data.getNode(); this.assumptions = new ArrayList<>(); this.typeGuards = new ArrayList<>(); this.guards = new ArrayList<>(); @@ -61,9 +63,11 @@ } public SpecializationGroup(List children, List assumptionMatches, List typeGuardsMatches, List guardMatches) { + assert !children.isEmpty() : "children must not be empty"; this.assumptions = assumptionMatches; this.typeGuards = typeGuardsMatches; this.guards = guardMatches; + this.node = children.get(0).node; this.specialization = null; updateChildren(children); } @@ -114,8 +118,7 @@ return null; } GuardData previousGuard = previous.getGuards().get(elseConnectedGuards.size()); - if (guard.getMethod().equals(previousGuard.getMethod())) { - assert guard.isNegated() != previousGuard.isNegated(); + if (guard.getMethod().equals(previousGuard.getMethod()) && guard.isNegated() != previousGuard.isNegated()) { return guard; } } @@ -205,16 +208,29 @@ for (Iterator iterator = guardMatches.iterator(); iterator.hasNext();) { GuardData guardMatch = iterator.next(); - List guardTypes = TemplateMethod.getSignatureTypes(guardMatch.getParameters()); - for (int i = 0; i < guardTypes.size(); i++) { - TypeMirror guardType = guardTypes.get(i); - int signatureIndex = i + 1; + int signatureIndex = 0; + for (ActualParameter parameter : guardMatch.getParameters()) { + signatureIndex++; + if (parameter.getSpecification().isSignature()) { + continue; + } + + TypeMirror guardType = parameter.getType(); // object guards can be safely moved up if (Utils.isObject(guardType)) { continue; } + // generic guards can be safely moved up + SpecializationData generic = first.node.getGenericSpecialization(); + if (generic != null) { + ActualParameter genericParameter = generic.findParameter(parameter.getLocalName()); + if (genericParameter != null && Utils.typeEquals(genericParameter.getType(), guardType)) { + continue; + } + } + // signature index required for moving up guards if (containsIndex(typeGuardsMatches, signatureIndex) || (first.getParent() != null && first.getParent().containsTypeGuardIndex(signatureIndex))) { continue;