changeset 18817:b51cfbc2bd07

Make allocation of loop header array in BciBlockMapping lazy.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 11 Jan 2015 15:56:45 +0100
parents 972009398b30
children adf3a8581a67
files graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BciBlockMapping.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java
diffstat 4 files changed, 58 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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);
+    }
+
 }
--- 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;
+    }
 }
--- 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));
                 }
             }