src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java
changeset 48861 47f19ff9903c
parent 47216 71c04702a3d5
child 49873 26ebfe8ce852
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java	Fri Feb 02 10:37:48 2018 -0500
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BciBlockMapping.java	Fri Feb 02 17:28:17 2018 -0800
@@ -86,6 +86,8 @@
 import java.util.List;
 import java.util.TreeSet;
 
+import org.graalvm.collections.EconomicMap;
+import org.graalvm.collections.Equivalence;
 import org.graalvm.compiler.bytecode.Bytecode;
 import org.graalvm.compiler.bytecode.BytecodeLookupSwitch;
 import org.graalvm.compiler.bytecode.BytecodeStream;
@@ -95,8 +97,6 @@
 import org.graalvm.compiler.core.common.PermanentBailoutException;
 import org.graalvm.compiler.debug.DebugContext;
 import org.graalvm.compiler.options.OptionValues;
-import org.graalvm.util.EconomicMap;
-import org.graalvm.util.Equivalence;
 
 import jdk.vm.ci.code.BytecodeFrame;
 import jdk.vm.ci.meta.ExceptionHandler;
@@ -415,9 +415,6 @@
     }
 
     public static class ExceptionDispatchBlock extends BciBlock {
-
-        private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> exceptionDispatch = EconomicMap.create(Equivalence.DEFAULT);
-
         public ExceptionHandler handler;
         public int deoptBci;
     }
@@ -748,15 +745,6 @@
         }
     }
 
-    private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> initialExceptionDispatch;
-
-    private EconomicMap<ExceptionHandler, ExceptionDispatchBlock> getInitialExceptionDispatch() {
-        if (initialExceptionDispatch == null) {
-            initialExceptionDispatch = EconomicMap.create(Equivalence.DEFAULT);
-        }
-        return initialExceptionDispatch;
-    }
-
     private ExceptionDispatchBlock handleExceptions(BciBlock[] blockMap, int bci) {
         ExceptionDispatchBlock lastHandler = null;
 
@@ -769,20 +757,17 @@
                     lastHandler = null;
                 }
 
-                EconomicMap<ExceptionHandler, ExceptionDispatchBlock> exceptionDispatch = lastHandler != null ? lastHandler.exceptionDispatch : getInitialExceptionDispatch();
-                ExceptionDispatchBlock curHandler = exceptionDispatch.get(h);
-                if (curHandler == null) {
-                    curHandler = new ExceptionDispatchBlock();
-                    blocksNotYetAssignedId++;
-                    curHandler.startBci = -1;
-                    curHandler.endBci = -1;
-                    curHandler.deoptBci = bci;
-                    curHandler.handler = h;
-                    curHandler.addSuccessor(blockMap[h.getHandlerBCI()]);
-                    if (lastHandler != null) {
-                        curHandler.addSuccessor(lastHandler);
-                    }
-                    exceptionDispatch.put(h, curHandler);
+                // We do not reuse exception dispatch blocks, because nested exception handlers
+                // might have problems reasoning about the correct frame state.
+                ExceptionDispatchBlock curHandler = new ExceptionDispatchBlock();
+                blocksNotYetAssignedId++;
+                curHandler.startBci = -1;
+                curHandler.endBci = -1;
+                curHandler.deoptBci = bci;
+                curHandler.handler = h;
+                curHandler.addSuccessor(blockMap[h.getHandlerBCI()]);
+                if (lastHandler != null) {
+                    curHandler.addSuccessor(lastHandler);
                 }
                 lastHandler = curHandler;
             }