changeset 15540:57131f2e001c

BciBlockMapping: make loop information more accessible.
author Josef Eisl <josef.eisl@jku.at>
date Tue, 06 May 2014 11:09:19 +0200
parents c2f4d7dd944d
children 667c911b97c4
files graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java
diffstat 1 files changed, 72 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java	Tue Apr 29 18:06:45 2014 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java	Tue May 06 11:09:19 2014 +0200
@@ -182,6 +182,67 @@
             return predecessors.get(index);
         }
 
+        /**
+         * Get the loop id of the inner most loop.
+         *
+         * @return the loop id of the most inner loop or -1 if not part of any loop
+         */
+        public int getLoopId() {
+            long l = loops;
+            if (l == 0) {
+                return -1;
+            }
+            int pos = 0;
+            for (int lMask = 1; (l & lMask) == 0; lMask = lMask << 1) {
+                pos++;
+            }
+            return pos;
+        }
+
+        /**
+         * Iterate over loop ids.
+         */
+        public Iterable<Integer> loopIdIterable() {
+            return new Iterable<Integer>() {
+                public Iterator<Integer> iterator() {
+                    return idIterator(loops);
+                }
+            };
+        }
+
+        /**
+         * Iterate over exit ids.
+         */
+        public Iterable<Integer> exitIdIterable() {
+            return new Iterable<Integer>() {
+                public Iterator<Integer> iterator() {
+                    return idIterator(exits);
+                }
+            };
+        }
+
+        private static Iterator<Integer> idIterator(long field) {
+            return new Iterator<Integer>() {
+
+                long l = field;
+                int pos = 0;
+                int lMask = 1;
+
+                public Integer next() {
+                    for (; (l & lMask) == 0; lMask = lMask << 1) {
+                        pos++;
+                    }
+                    l &= ~lMask;
+                    return pos;
+                }
+
+                public boolean hasNext() {
+                    return l != 0;
+                }
+            };
+
+        }
+
         public double probability() {
             return 1D;
         }
@@ -635,26 +696,12 @@
                     sb.append(" ");
                 }
                 sb.append(n).append("  Loop : ");
-                long l = b.loops;
-                int pos = 0;
-                while (l != 0) {
-                    int lMask = 1 << pos;
-                    if ((l & lMask) != 0) {
-                        sb.append("B").append(loopHeaders[pos].getId()).append(" ");
-                        l &= ~lMask;
-                    }
-                    pos++;
+                for (int pos : b.loopIdIterable()) {
+                    sb.append("B").append(loopHeaders[pos].getId()).append(" ");
                 }
                 sb.append(n).append("  Exits : ");
-                l = b.exits;
-                pos = 0;
-                while (l != 0) {
-                    int lMask = 1 << pos;
-                    if ((l & lMask) != 0) {
-                        sb.append("B").append(loopHeaders[pos].getId()).append(" ");
-                        l &= ~lMask;
-                    }
-                    pos++;
+                for (int pos : b.exitIdIterable()) {
+                    sb.append("B").append(loopHeaders[pos].getId()).append(" ");
                 }
                 sb.append(n);
             }
@@ -663,6 +710,13 @@
     }
 
     /**
+     * Get the header block for a loop index.
+     */
+    public BciBlock getLoopHeader(int index) {
+        return loopHeaders[index];
+    }
+
+    /**
      * The next available loop number.
      */
     private int nextLoop;