# HG changeset patch # User Doug Simon # Date 1409170273 -7200 # Node ID 39d979dae8092352b1fb40388543d67251b100ad # Parent f7359a0ce9462bfadc0a6762dc30c516157e360e need extra logic when computing Node iterable ids and USE_GENERATED_NODES == true diff -r f7359a0ce946 -r 39d979dae809 graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java --- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Aug 27 20:12:57 2014 +0200 +++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java Wed Aug 27 22:11:13 2014 +0200 @@ -193,13 +193,19 @@ this.iterableId = nextIterableId++; List existingClasses = new LinkedList<>(); for (FieldIntrospection nodeClass : allClasses.values()) { + // There are duplicate entries in allClasses when using generated nodes + // hence the extra logic below guarded by USE_GENERATED_NODES if (clazz.isAssignableFrom(nodeClass.getClazz())) { - existingClasses.add((NodeClass) nodeClass); + if (!USE_GENERATED_NODES || !existingClasses.contains(nodeClass)) { + existingClasses.add((NodeClass) nodeClass); + } } if (nodeClass.getClazz().isAssignableFrom(clazz) && IterableNodeType.class.isAssignableFrom(nodeClass.getClazz())) { NodeClass superNodeClass = (NodeClass) nodeClass; - superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1); - superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId; + if (!USE_GENERATED_NODES || !containsId(this.iterableId, superNodeClass.iterableIds)) { + superNodeClass.iterableIds = Arrays.copyOf(superNodeClass.iterableIds, superNodeClass.iterableIds.length + 1); + superNodeClass.iterableIds[superNodeClass.iterableIds.length - 1] = this.iterableId; + } } } int[] ids = new int[existingClasses.size() + 1]; @@ -217,6 +223,15 @@ nodeIterableCount = Debug.metric("NodeIterable_%s", shortName); } + private static boolean containsId(int iterableId, int[] iterableIds) { + for (int i : iterableIds) { + if (i == iterableId) { + return true; + } + } + return false; + } + @Override protected void rescanFieldOffsets(CalcOffset calc) { FieldScanner scanner = new FieldScanner(calc);