# HG changeset patch # User Thomas Wuerthinger # Date 1420988205 -3600 # Node ID b51cfbc2bd071903816c72c428a3902b2837d213 # Parent 972009398b3005862c0bf9efd59ac1ecf9c46474 Make allocation of loop header array in BciBlockMapping lazy. diff -r 972009398b30 -r b51cfbc2bd07 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java --- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Sun Jan 11 02:39:07 2015 +0100 +++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java Sun Jan 11 15:56:45 2015 +0100 @@ -100,7 +100,7 @@ throw Debug.handle(e); } - loopHeaders = blockMap.loopHeaders; + loopHeaders = blockMap.getLoopHeaders(); liveness = blockMap.liveness; blockVisited = new BciBlockBitMap(blockMap); // add predecessors diff -r 972009398b30 -r b51cfbc2bd07 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 02:39:07 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java Sun Jan 11 15:56:45 2015 +0100 @@ -920,7 +920,7 @@ protected abstract void iterateBytecodesForBlock(BciBlock block); - public void processBytecode(int bci, int opcode) { + public final void processBytecode(int bci, int opcode) { int cpi; // Checkstyle: stop @@ -1148,26 +1148,28 @@ return frameState; } - protected final int traceLevel = Options.TraceBytecodeParserLevel.getValue(); - protected void traceInstruction(int bci, int opcode, boolean blockStart) { - if (traceLevel >= TRACELEVEL_INSTRUCTIONS && Debug.isLogEnabled()) { - StringBuilder sb = new StringBuilder(40); - sb.append(blockStart ? '+' : '|'); - if (bci < 10) { - sb.append(" "); - } else if (bci < 100) { - sb.append(' '); - } - sb.append(bci).append(": ").append(Bytecodes.nameOf(opcode)); - for (int i = bci + 1; i < stream.nextBCI(); ++i) { - sb.append(' ').append(stream.readUByte(i)); - } - if (!currentBlock.jsrScope.isEmpty()) { - sb.append(' ').append(currentBlock.jsrScope); - } - Debug.log("%s", sb); + if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_INSTRUCTIONS && Debug.isLogEnabled()) { + traceInstructionHelper(bci, opcode, blockStart); } } + private void traceInstructionHelper(int bci, int opcode, boolean blockStart) { + StringBuilder sb = new StringBuilder(40); + sb.append(blockStart ? '+' : '|'); + if (bci < 10) { + sb.append(" "); + } else if (bci < 100) { + sb.append(' '); + } + sb.append(bci).append(": ").append(Bytecodes.nameOf(opcode)); + for (int i = bci + 1; i < stream.nextBCI(); ++i) { + sb.append(' ').append(stream.readUByte(i)); + } + if (!currentBlock.jsrScope.isEmpty()) { + sb.append(' ').append(currentBlock.jsrScope); + } + Debug.log("%s", sb); + } + } diff -r 972009398b30 -r b51cfbc2bd07 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 02:39:07 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java Sun Jan 11 15:56:45 2015 +0100 @@ -272,7 +272,10 @@ private final BytecodeStream stream; private final ExceptionHandler[] exceptionHandlers; private BciBlock[] blockMap; - public BciBlock[] loopHeaders; + private BciBlock[] loopHeaders; + + private static final int LOOP_HEADER_MAX_CAPACITY = Long.SIZE; + private static final int LOOP_HEADER_INITIAL_CAPACITY = 4; private final boolean doLivenessAnalysis; public LocalLiveness liveness; @@ -285,12 +288,11 @@ private BciBlockMapping(ResolvedJavaMethod method, boolean doLivenessAnalysis) { this.doLivenessAnalysis = doLivenessAnalysis; this.method = method; - exceptionHandlers = method.getExceptionHandlers(); - stream = new BytecodeStream(method.getCode()); + this.exceptionHandlers = method.getExceptionHandlers(); + this.stream = new BytecodeStream(method.getCode()); int codeSize = method.getCodeSize(); this.blockMap = new BciBlock[codeSize]; this.blocks = new ArrayList<>(); - this.loopHeaders = new BciBlock[codeSize < 64 ? codeSize : 64]; } /** @@ -744,7 +746,7 @@ // checking for correctness. throw new BailoutException("Loop formed by an exception handler"); } - if (nextLoop >= Long.SIZE) { + if (nextLoop >= LOOP_HEADER_MAX_CAPACITY) { // This restriction can be removed by using a fall-back to a BitSet in case we have // more than 64 loops // Don't compile such methods for now, until we see a concrete case that allows @@ -755,6 +757,11 @@ assert block.loops == 0; block.loops = 1L << nextLoop; Debug.log("makeLoopHeader(%s) -> %x", block, block.loops); + if (loopHeaders == null) { + loopHeaders = new BciBlock[LOOP_HEADER_INITIAL_CAPACITY]; + } else if (nextLoop >= loopHeaders.length) { + loopHeaders = Arrays.copyOf(loopHeaders, LOOP_HEADER_MAX_CAPACITY); + } loopHeaders[nextLoop] = block; block.loopId = nextLoop; nextLoop++; @@ -1082,10 +1089,11 @@ private final long[] localsLiveKill; public SmallLocalLiveness() { - localsLiveIn = new long[blocks.size()]; - localsLiveOut = new long[blocks.size()]; - localsLiveGen = new long[blocks.size()]; - localsLiveKill = new long[blocks.size()]; + int blockSize = blocks.size(); + localsLiveIn = new long[blockSize]; + localsLiveOut = new long[blockSize]; + localsLiveGen = new long[blockSize]; + localsLiveKill = new long[blockSize]; } private String debugString(long value) { @@ -1249,4 +1257,8 @@ return block.getId() >= Integer.MAX_VALUE ? true : localsLiveOut[block.getId()].get(local); } } + + public BciBlock[] getLoopHeaders() { + return loopHeaders; + } } diff -r 972009398b30 -r b51cfbc2bd07 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 02:39:07 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Sun Jan 11 15:56:45 2015 +0100 @@ -230,7 +230,7 @@ // compute the block map, setup exception handlers and get the entrypoint(s) BciBlockMapping blockMap = BciBlockMapping.create(method, graphBuilderConfig.doLivenessAnalysis()); - loopHeaders = blockMap.loopHeaders; + loopHeaders = blockMap.getLoopHeaders(); liveness = blockMap.liveness; lastInstr = currentGraph.start(); @@ -1386,16 +1386,20 @@ } private void traceState() { - if (traceLevel >= TRACELEVEL_STATE && Debug.isLogEnabled()) { - Debug.log(String.format("| state [nr locals = %d, stack depth = %d, method = %s]", frameState.localsSize(), frameState.stackSize(), method)); - for (int i = 0; i < frameState.localsSize(); ++i) { - ValueNode value = frameState.localAt(i); - Debug.log(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); - } - for (int i = 0; i < frameState.stackSize(); ++i) { - ValueNode value = frameState.stackAt(i); - Debug.log(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); - } + if (Debug.isEnabled() && Options.TraceBytecodeParserLevel.getValue() >= TRACELEVEL_STATE && Debug.isLogEnabled()) { + traceStateHelper(); + } + } + + private void traceStateHelper() { + Debug.log(String.format("| state [nr locals = %d, stack depth = %d, method = %s]", frameState.localsSize(), frameState.stackSize(), method)); + for (int i = 0; i < frameState.localsSize(); ++i) { + ValueNode value = frameState.localAt(i); + Debug.log(String.format("| local[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); + } + for (int i = 0; i < frameState.stackSize(); ++i) { + ValueNode value = frameState.stackAt(i); + Debug.log(String.format("| stack[%d] = %-8s : %s", i, value == null ? "bogus" : value.getKind().getJavaName(), value)); } }