# HG changeset patch # User Thomas Wuerthinger # Date 1420989908 -3600 # Node ID adf3a8581a6721771ec76542ab4b2fc79528d698 # Parent b51cfbc2bd071903816c72c428a3902b2837d213 Factor JSR info data into separate data structure from BciBlock. diff -r b51cfbc2bd07 -r adf3a8581a67 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Sun Jan 11 15:56:45 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Sun Jan 11 16:25:08 2015 +0100 @@ -1166,8 +1166,8 @@ for (int i = bci + 1; i < stream.nextBCI(); ++i) { sb.append(' ').append(stream.readUByte(i)); } - if (!currentBlock.jsrScope.isEmpty()) { - sb.append(' ').append(currentBlock.jsrScope); + if (!currentBlock.getJsrScope().isEmpty()) { + sb.append(' ').append(currentBlock.getJsrScope()); } Debug.log("%s", sb); } diff -r b51cfbc2bd07 -r adf3a8581a67 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 Sun Jan 11 15:56:45 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Sun Jan 11 16:25:08 2015 +0100 @@ -97,17 +97,20 @@ private boolean visited; private boolean active; public long loops; + public JSRData jsrData; - public HashMap jsrAlternatives; - public JsrScope jsrScope = JsrScope.EMPTY_SCOPE; - public BciBlock jsrSuccessor; - public int jsrReturnBci; - public BciBlock retSuccessor; - public boolean endsWithRet = false; + public static class JSRData { + public HashMap jsrAlternatives; + public JsrScope jsrScope = JsrScope.EMPTY_SCOPE; + public BciBlock jsrSuccessor; + public int jsrReturnBci; + public BciBlock retSuccessor; + public boolean endsWithRet = false; + } public BciBlock() { - this.successors = new ArrayList<>(); - this.predecessors = new ArrayList<>(); + this.successors = new ArrayList<>(4); + this.predecessors = new ArrayList<>(4); } public BciBlock exceptionDispatchBlock() { @@ -251,6 +254,88 @@ public BciBlock getPostdominator() { return null; } + + private JSRData getOrCreateJSRData() { + if (jsrData == null) { + jsrData = new JSRData(); + } + return jsrData; + } + + public void setEndsWithRet() { + getOrCreateJSRData().endsWithRet = true; + } + + public JsrScope getJsrScope() { + if (this.jsrData == null) { + return JsrScope.EMPTY_SCOPE; + } else { + return jsrData.jsrScope; + } + } + + public boolean endsWithRet() { + if (this.jsrData == null) { + return false; + } else { + return jsrData.endsWithRet; + } + } + + public void setRetSuccessor(BciBlock bciBlock) { + this.getOrCreateJSRData().retSuccessor = bciBlock; + } + + public BciBlock getRetSuccessor() { + if (this.jsrData == null) { + return null; + } else { + return jsrData.retSuccessor; + } + } + + public BciBlock getJsrSuccessor() { + if (this.jsrData == null) { + return null; + } else { + return jsrData.jsrSuccessor; + } + } + + public int getJsrReturnBci() { + if (this.jsrData == null) { + return -1; + } else { + return jsrData.jsrReturnBci; + } + } + + public HashMap getJsrAlternatives() { + if (this.jsrData == null) { + return null; + } else { + return jsrData.jsrAlternatives; + } + } + + public void initJsrAlternatives() { + JSRData data = this.getOrCreateJSRData(); + if (data.jsrAlternatives == null) { + data.jsrAlternatives = new HashMap<>(); + } + } + + public void setJsrScope(JsrScope nextScope) { + this.getOrCreateJSRData().jsrScope = nextScope; + } + + public void setJsrSuccessor(BciBlock clone) { + this.getOrCreateJSRData().jsrSuccessor = clone; + } + + public void setJsrReturnBci(int bci) { + this.getOrCreateJSRData().jsrReturnBci = bci; + } } public static class ExceptionDispatchBlock extends BciBlock { @@ -445,14 +530,14 @@ throw new JsrNotSupportedBailout("jsr target bci 0 not allowed"); } BciBlock b1 = makeBlock(target); - current.jsrSuccessor = b1; - current.jsrReturnBci = stream.nextBCI(); + current.setJsrSuccessor(b1); + current.setJsrReturnBci(stream.nextBCI()); current = null; addSuccessor(bci, b1); break; } case RET: { - current.endsWithRet = true; + current.setEndsWithRet(); current = null; break; } @@ -553,46 +638,44 @@ private void createJsrAlternatives(BciBlock block) { jsrVisited.add(block); - JsrScope scope = block.jsrScope; + JsrScope scope = block.getJsrScope(); - if (block.endsWithRet) { - block.retSuccessor = blockMap[scope.nextReturnAddress()]; - block.getSuccessors().add(block.retSuccessor); - assert block.retSuccessor != block.jsrSuccessor; + if (block.endsWithRet()) { + block.setRetSuccessor(blockMap[scope.nextReturnAddress()]); + block.getSuccessors().add(block.getRetSuccessor()); + assert block.getRetSuccessor() != block.getJsrSuccessor(); } - Debug.log("JSR alternatives block %s sux %s jsrSux %s retSux %s jsrScope %s", block, block.getSuccessors(), block.jsrSuccessor, block.retSuccessor, block.jsrScope); + Debug.log("JSR alternatives block %s sux %s jsrSux %s retSux %s jsrScope %s", block, block.getSuccessors(), block.getJsrSuccessor(), block.getRetSuccessor(), block.getJsrScope()); - if (block.jsrSuccessor != null || !scope.isEmpty()) { + if (block.getJsrSuccessor() != null || !scope.isEmpty()) { for (int i = 0; i < block.getSuccessorCount(); i++) { BciBlock successor = block.getSuccessor(i); JsrScope nextScope = scope; - if (successor == block.jsrSuccessor) { - nextScope = scope.push(block.jsrReturnBci); + if (successor == block.getJsrSuccessor()) { + nextScope = scope.push(block.getJsrReturnBci()); } - if (successor == block.retSuccessor) { + if (successor == block.getRetSuccessor()) { nextScope = scope.pop(); } - if (!successor.jsrScope.isPrefixOf(nextScope)) { - throw new JsrNotSupportedBailout("unstructured control flow (" + successor.jsrScope + " " + nextScope + ")"); + if (!successor.getJsrScope().isPrefixOf(nextScope)) { + throw new JsrNotSupportedBailout("unstructured control flow (" + successor.getJsrScope() + " " + nextScope + ")"); } if (!nextScope.isEmpty()) { BciBlock clone; - if (successor.jsrAlternatives != null && successor.jsrAlternatives.containsKey(nextScope)) { - clone = successor.jsrAlternatives.get(nextScope); + if (successor.getJsrAlternatives() != null && successor.getJsrAlternatives().containsKey(nextScope)) { + clone = successor.getJsrAlternatives().get(nextScope); } else { - if (successor.jsrAlternatives == null) { - successor.jsrAlternatives = new HashMap<>(); - } + successor.initJsrAlternatives(); clone = successor.copy(); - clone.jsrScope = nextScope; - successor.jsrAlternatives.put(nextScope, clone); + clone.setJsrScope(nextScope); + successor.getJsrAlternatives().put(nextScope, clone); } block.getSuccessors().set(i, clone); - if (successor == block.jsrSuccessor) { - block.jsrSuccessor = clone; + if (successor == block.getJsrSuccessor()) { + block.setJsrSuccessor(clone); } - if (successor == block.retSuccessor) { - block.retSuccessor = clone; + if (successor == block.getRetSuccessor()) { + block.setRetSuccessor(clone); } } } diff -r b51cfbc2bd07 -r adf3a8581a67 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 Sun Jan 11 15:56:45 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Jan 11 16:25:08 2015 +0100 @@ -877,14 +877,14 @@ @Override protected void genJsr(int dest) { - BciBlock successor = currentBlock.jsrSuccessor; + BciBlock successor = currentBlock.getJsrSuccessor(); assert successor.startBci == dest : successor.startBci + " != " + dest + " @" + bci(); - JsrScope scope = currentBlock.jsrScope; + JsrScope scope = currentBlock.getJsrScope(); int nextBci = getStream().nextBCI(); - if (!successor.jsrScope.pop().equals(scope)) { + if (!successor.getJsrScope().pop().equals(scope)) { throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)"); } - if (successor.jsrScope.nextReturnAddress() != nextBci) { + if (successor.getJsrScope().nextReturnAddress() != nextBci) { throw new JsrNotSupportedBailout("unstructured control flow (internal limitation)"); } ConstantNode nextBciNode = getJsrConstant(nextBci); @@ -894,15 +894,15 @@ @Override protected void genRet(int localIndex) { - BciBlock successor = currentBlock.retSuccessor; + BciBlock successor = currentBlock.getRetSuccessor(); ValueNode local = frameState.loadLocal(localIndex); - JsrScope scope = currentBlock.jsrScope; + JsrScope scope = currentBlock.getJsrScope(); int retAddress = scope.nextReturnAddress(); ConstantNode returnBciNode = getJsrConstant(retAddress); LogicNode guard = IntegerEqualsNode.create(local, returnBciNode); guard = currentGraph.unique(guard); append(FixedGuardNode.create(guard, JavaSubroutineMismatch, InvalidateReprofile)); - if (!successor.jsrScope.equals(scope.pop())) { + if (!successor.getJsrScope().equals(scope.pop())) { throw new JsrNotSupportedBailout("unstructured control flow (ret leaves more than one scope)"); } appendGoto(createTarget(successor, frameState)); @@ -1324,7 +1324,7 @@ traceState(); traceInstruction(bci, opcode, bci == block.startBci); if (bci == entryBCI) { - if (block.jsrScope != JsrScope.EMPTY_SCOPE) { + if (block.getJsrScope() != JsrScope.EMPTY_SCOPE) { throw new BailoutException("OSR into a JSR scope is not supported"); } EntryMarkerNode x = append(EntryMarkerNode.create());