changeset 16987:39d979dae809

need extra logic when computing Node iterable ids and USE_GENERATED_NODES == true
author Doug Simon <doug.simon@oracle.com>
date Wed, 27 Aug 2014 22:11:13 +0200
parents f7359a0ce946
children 225ce2657c55
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/NodeClass.java
diffstat 1 files changed, 18 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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<NodeClass> 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);