changeset 18818:adf3a8581a67

Factor JSR info data into separate data structure from BciBlock.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 11 Jan 2015 16:25:08 +0100
parents b51cfbc2bd07
children 42d1f20e54ea
files 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 3 files changed, 127 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- 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);
     }
--- 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<JsrScope, BciBlock> 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<JsrScope, BciBlock> 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<JsrScope, BciBlock> 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);
                     }
                 }
             }
--- 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());