Mercurial > hg > graal-jvmci-8
changeset 5462:fc58f934f9a1
allow a framestate to flow though a framestate-less loop
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 01 Jun 2012 11:03:50 +0200 |
parents | 425c74c9444d |
children | b6311d367bd6 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java |
diffstat | 1 files changed, 18 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Jun 01 11:02:36 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Fri Jun 01 11:03:50 2012 +0200 @@ -352,9 +352,20 @@ for (Block pred : block.getPredecessors()) { if (fs == null) { fs = blockLastState.get(pred); - } else if (fs != blockLastState.get(pred)) { - fs = null; - break; + } else { + if (blockLastState.get(pred) == null) { + // Only a back edge can have a null state for its enclosing block. + assert pred.getEndNode() instanceof LoopEndNode; + + if (block.getBeginNode().stateAfter() == null) { + // We'll assert later that the begin and end of a framestate-less loop + // share the frame state that flowed into the loop + blockLastState.put(pred, fs); + } + } else if (fs != blockLastState.get(pred)) { + fs = null; + break; + } } } if (GraalOptions.TraceLIRGeneratorLevel >= 2) { @@ -433,6 +444,10 @@ TTY.println("END Generating LIR for block B" + block.getId()); } + // Check that the begin and end of a framestate-less loop + // share the frame state that flowed into the loop + assert blockLastState.get(block) == null || blockLastState.get(block) == lastState; + blockLocks.put(currentBlock, curLocks); blockLastState.put(block, lastState); currentBlock = null;