Mercurial > hg > truffle
changeset 16373:74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Wed, 11 Jun 2014 20:24:10 +0200 |
parents | 73d7935be896 |
children | d908e75a0990 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java |
diffstat | 1 files changed, 24 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Jun 11 19:22:36 2014 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java Wed Jun 11 20:24:10 2014 +0200 @@ -1995,13 +1995,14 @@ } // iterate all blocks where the interval has use positions for (AbstractBlock<?> splitBlock : blocksForSplitChild(splitChild)) { - assert dominates(defBlock, splitBlock) : String.format("Definition does not dominate the spill block %s !dom %s (interval %s)", defBlock, splitBlock, interval); - Debug.log("Split interval %s, block %s", splitChild, splitBlock); - if (spillBlock == null) { - spillBlock = splitBlock; - } else { - spillBlock = nearestCommonDominator(spillBlock, splitBlock); - assert spillBlock != null; + if (dominates(defBlock, splitBlock)) { + Debug.log("Split interval %s, block %s", splitChild, splitBlock); + if (spillBlock == null) { + spillBlock = splitBlock; + } else { + spillBlock = nearestCommonDominator(spillBlock, splitBlock); + assert spillBlock != null; + } } } } @@ -2053,41 +2054,35 @@ */ private class UseBlockIterator implements Iterator<AbstractBlock<?>> { - int nextOpId; - Interval interval; - Range currentRange; + Range range; + AbstractBlock<?> block; public UseBlockIterator(Interval interval) { - // the first use position is the begin of the interval - nextOpId = interval.from(); - this.interval = interval; - this.currentRange = interval.first(); + range = interval.first(); + block = blockForId(range.from); } public AbstractBlock<?> next() { - AbstractBlock<?> block = blockForId(nextOpId); - + AbstractBlock<?> currentBlock = block; int nextBlockIndex = block.getLinearScanNumber() + 1; if (nextBlockIndex < sortedBlocks.size()) { - int from = getFirstLirInstructionId(sortedBlocks.get(nextBlockIndex)); - assert from > nextOpId : "cannot go backwards"; - assert from > maxOpId() || isBlockBegin(from) : "nextOpId is not a block begin"; - assert from > maxOpId() || blockForId(from).getLinearScanNumber() == block.getLinearScanNumber() + 1 : "nextOpId is not the beginning of the next block"; - nextOpId = interval.nextUsage(RegisterPriority.None, from); - if (nextOpId > currentRange.from) { - // jump to next range - nextOpId = currentRange.from; - currentRange = currentRange.next; + block = sortedBlocks.get(nextBlockIndex); + if (range.to < getFirstLirInstructionId(block)) { + range = range.next; + if (range == Range.EndMarker) { + block = null; + } else { + block = blockForId(range.from); + } } } else { - // already at last the last block - nextOpId = Integer.MAX_VALUE; + block = null; } - return block; + return currentBlock; } public boolean hasNext() { - return nextOpId < interval.to(); + return block != null; } }