# HG changeset patch # User Josef Eisl # Date 1396894741 -7200 # Node ID c9bf91560c8215f69082b00f6a31665fac03a22b # Parent 14e542e27076b166be0cef0c9e7228d926bc15c0 BciBlock: make entryState abstract. diff -r 14e542e27076 -r c9bf91560c82 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRFrameStateBuilder.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRFrameStateBuilder.java Mon Apr 07 19:41:40 2014 +0200 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/LIRFrameStateBuilder.java Mon Apr 07 20:19:01 2014 +0200 @@ -24,7 +24,6 @@ package com.oracle.graal.baseline; import com.oracle.graal.api.meta.*; -import com.oracle.graal.graph.*; import com.oracle.graal.java.*; public class LIRFrameStateBuilder extends AbstractFrameStateBuilder { @@ -46,13 +45,59 @@ } @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("[locals: ["); + for (int i = 0; i < locals.length; i++) { + sb.append(i == 0 ? "" : ",").append(locals[i] == null ? "_" : locals[i].toString()); + } + sb.append("] stack: ["); + for (int i = 0; i < stackSize; i++) { + sb.append(i == 0 ? "" : ",").append(stack[i] == null ? "_" : stack[i].toString()); + } + sb.append("] locks: ["); + for (int i = 0; i < lockedObjects.length; i++) { + sb.append(i == 0 ? "" : ",").append(lockedObjects[i].toString()); + } + sb.append("]"); + if (rethrowException) { + sb.append(" rethrowException"); + } + sb.append("]"); + return sb.toString(); + } + + @Override public LIRFrameStateBuilder copy() { return new LIRFrameStateBuilder(method); } + private static boolean isCompatible(Value x, Value y) { + if (x == null && y == null) { + return true; + } + if ((x == null || y == null) || (x.getKind() != y.getKind())) { + return false; + } + return true; + + } + @Override public boolean isCompatibleWith(LIRFrameStateBuilder other) { - // TODO Auto-generated method stub - throw GraalInternalError.unimplemented("Auto-generated method stub"); + assert method.equals(other.method) && localsSize() == other.localsSize() : "Can only compare frame states of the same method"; + + if (stackSize() != other.stackSize()) { + return false; + } + for (int i = 0; i < stackSize(); i++) { + if (!isCompatible(stackAt(i), other.stackAt(i))) { + return false; + } + } + if (lockedObjects.length != other.lockedObjects.length) { + return false; + } + return true; } } diff -r 14e542e27076 -r c9bf91560c82 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java Mon Apr 07 19:41:40 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractFrameStateBuilder.java Mon Apr 07 20:19:01 2014 +0200 @@ -27,6 +27,8 @@ import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.java.BciBlockMapping.BciBlock; +import com.oracle.graal.java.BciBlockMapping.LocalLiveness; public abstract class AbstractFrameStateBuilder> { @@ -66,6 +68,25 @@ public abstract boolean isCompatibleWith(S other); + public void clearNonLiveLocals(BciBlock block, LocalLiveness liveness, boolean liveIn) { + if (liveness == null) { + return; + } + if (liveIn) { + for (int i = 0; i < locals.length; i++) { + if (!liveness.localIsLiveIn(block, i)) { + locals[i] = null; + } + } + } else { + for (int i = 0; i < locals.length; i++) { + if (!liveness.localIsLiveOut(block, i)) { + locals[i] = null; + } + } + } + } + /** * @see BytecodeFrame#rethrowException */ diff -r 14e542e27076 -r c9bf91560c82 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 Mon Apr 07 19:41:40 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Mon Apr 07 20:19:01 2014 +0200 @@ -83,11 +83,7 @@ public int loopId; public FixedWithNextNode firstInstruction; - public HIRFrameStateBuilder entryState; - - // public ArrayList successors = new ArrayList<>(2); - // public ArrayList predecessors = new ArrayList<>(2); // only used in the - // baseline + public AbstractFrameStateBuilder entryState; public long exits; diff -r 14e542e27076 -r c9bf91560c82 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Apr 07 19:41:40 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Mon Apr 07 20:19:01 2014 +0200 @@ -115,9 +115,6 @@ } } - private BciBlock[] loopHeaders; - private LocalLiveness liveness; - /** * Gets the current frame state being processed by this builder. */ @@ -193,6 +190,8 @@ class BytecodeParser extends AbstractBytecodeParser { + private BciBlock[] loopHeaders; + private LocalLiveness liveness; /** * Head of placeholder list. */ @@ -977,7 +976,7 @@ } lastLoopExit = loopExit; Debug.log("Target %s (%s) Exits %s, scanning framestates...", targetBlock, target, loop); - newState.insertLoopProxies(loopExit, loop.entryState); + newState.insertLoopProxies(loopExit, (HIRFrameStateBuilder) loop.entryState); loopExit.setStateAfter(newState.create(bci)); } @@ -1019,7 +1018,7 @@ } // We already saw this block before, so we have to merge states. - if (!block.entryState.isCompatibleWith(state)) { + if (!((HIRFrameStateBuilder) block.entryState).isCompatibleWith(state)) { throw new BailoutException("stacks do not match; bytecodes would not verify"); } @@ -1032,7 +1031,7 @@ LoopBeginNode loopBegin = (LoopBeginNode) block.firstInstruction; Target target = checkLoopExit(currentGraph.add(new LoopEndNode(loopBegin)), block, state); FixedNode result = target.fixed; - block.entryState.merge(loopBegin, target.state); + ((HIRFrameStateBuilder) block.entryState).merge(loopBegin, target.state); Debug.log("createTarget %s: merging backward branch to loop header %s, result: %s", block, loopBegin, result); return result; @@ -1067,7 +1066,7 @@ AbstractEndNode newEnd = currentGraph.add(new EndNode()); Target target = checkLoopExit(newEnd, block, state); FixedNode result = target.fixed; - block.entryState.merge(mergeNode, target.state); + ((HIRFrameStateBuilder) block.entryState).merge(mergeNode, target.state); mergeNode.addForwardEnd(newEnd); Debug.log("createTarget %s: merging state, result: %s", block, result); @@ -1105,7 +1104,7 @@ try (Indent indent = Debug.logAndIndent("Parsing block %s firstInstruction: %s loopHeader: %b", block, block.firstInstruction, block.isLoopHeader)) { lastInstr = block.firstInstruction; - frameState = block.entryState; + frameState = (HIRFrameStateBuilder) block.entryState; parser.setCurrentFrameState(frameState); currentBlock = block; diff -r 14e542e27076 -r c9bf91560c82 graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java Mon Apr 07 19:41:40 2014 +0200 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java Mon Apr 07 20:19:01 2014 +0200 @@ -31,8 +31,6 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.Node.Verbosity; -import com.oracle.graal.java.BciBlockMapping.BciBlock; -import com.oracle.graal.java.BciBlockMapping.LocalLiveness; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.java.*; @@ -305,25 +303,6 @@ } } - public void clearNonLiveLocals(BciBlock block, LocalLiveness liveness, boolean liveIn) { - if (liveness == null) { - return; - } - if (liveIn) { - for (int i = 0; i < locals.length; i++) { - if (!liveness.localIsLiveIn(block, i)) { - locals[i] = null; - } - } - } else { - for (int i = 0; i < locals.length; i++) { - if (!liveness.localIsLiveOut(block, i)) { - locals[i] = null; - } - } - } - } - /** * Adds a locked monitor to this frame state. *