# HG changeset patch # User Josef Eisl # Date 1399367359 -7200 # Node ID 57131f2e001ca14c35a35e48eb3b9d579a782fdc # Parent c2f4d7dd944dd5d80a44a8401a8349760053177d BciBlockMapping: make loop information more accessible. diff -r c2f4d7dd944d -r 57131f2e001c graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java --- 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 loopIdIterable() { + return new Iterable() { + public Iterator iterator() { + return idIterator(loops); + } + }; + } + + /** + * Iterate over exit ids. + */ + public Iterable exitIdIterable() { + return new Iterable() { + public Iterator iterator() { + return idIterator(exits); + } + }; + } + + private static Iterator idIterator(long field) { + return new Iterator() { + + 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;