Mercurial > hg > graal-compiler
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;