changeset 15632:dcaf3993ad17

Merge with 55be15d24e45e5636ee14d657616c6ffac039178
author Michael Van De Vanter <michael.van.de.vanter@oracle.com>
date Tue, 13 May 2014 18:31:18 -0700
parents 8de99b84c9cd (current diff) 55be15d24e45 (diff)
children f02fb7c5a1cc 8c34e2cc4add
files
diffstat 58 files changed, 702 insertions(+), 659 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64NodeLIRBuilder.java	Tue May 13 18:31:18 2014 -0700
@@ -274,40 +274,9 @@
     }
 
     private Value emitReinterpretMemory(PlatformKind to, Access access) {
-        Kind from = getMemoryKind(access);
-        assert to != from : "should have been eliminated";
-
-        /*
-         * Conversions between integer to floating point types require moves between CPU and FPU
-         * registers.
-         */
-        switch ((Kind) to) {
-            case Int:
-                switch (from) {
-                    case Float:
-                        return emitConvert2MemoryOp(to, MOV_F2I, access);
-                }
-                break;
-            case Long:
-                switch (from) {
-                    case Double:
-                        return emitConvert2MemoryOp(to, MOV_D2L, access);
-                }
-                break;
-            case Float:
-                switch (from) {
-                    case Int:
-                        return emitConvert2MemoryOp(to, MOV_I2F, access);
-                }
-                break;
-            case Double:
-                switch (from) {
-                    case Long:
-                        return emitConvert2MemoryOp(to, MOV_L2D, access);
-                }
-                break;
-        }
-        throw GraalInternalError.shouldNotReachHere();
+        AMD64AddressValue address = makeAddress(access);
+        LIRFrameState state = getState(access);
+        return getLIRGeneratorTool().emitLoad(to, address, state);
     }
 
     protected AMD64Arithmetic getOp(ValueNode operation, Access access) {
--- a/graal/com.oracle.graal.compiler.hsail.test.infra/src/com/oracle/graal/compiler/hsail/test/infra/GraalKernelTester.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test.infra/src/com/oracle/graal/compiler/hsail/test/infra/GraalKernelTester.java	Tue May 13 18:31:18 2014 -0700
@@ -139,14 +139,6 @@
     }
 
     /**
-     * Determines if the runtime supports {@link StackSlot}s in {@link DebugInfo} associated with
-     * HSAIL code.
-     */
-    public boolean canHandleDeoptStackSlots() {
-        return false;
-    }
-
-    /**
      * Determines if the runtime has the capabilities required by this test.
      */
     protected boolean supportsRequiredCapabilities() {
--- a/graal/com.oracle.graal.compiler.hsail.test.infra/src/com/oracle/graal/compiler/hsail/test/infra/KernelTester.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test.infra/src/com/oracle/graal/compiler/hsail/test/infra/KernelTester.java	Tue May 13 18:31:18 2014 -0700
@@ -34,16 +34,19 @@
 import java.util.logging.*;
 
 import com.amd.okra.*;
+import com.oracle.graal.test.*;
 
 /**
  * Abstract class on which the HSAIL unit tests are built. Executes a method or lambda on both the
  * Java side and the Okra side and compares the results for fields that are annotated with
- * {@link KernelTester.Result}.
+ * {@link Result}.
  */
-public abstract class KernelTester {
+public abstract class KernelTester extends GraalTest {
 
     /**
-     * Denotes a field whose value is to be compared as part of computing the result of a test.
+     * Denotes a field whose value is to be
+     * {@linkplain KernelTester#assertResultFieldsEqual(KernelTester) compared} as part of computing
+     * the result of a test.
      */
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.FIELD)
@@ -129,171 +132,27 @@
 
     public abstract void runTest();
 
-    // Default comparison is to compare all things marked @Result.
-    public boolean compareResults(KernelTester base) {
+    /**
+     * Asserts that the value of all {@link Result} annotated fields in this object and
+     * {@code other} are {@linkplain #assertDeepEquals(Object, Object) equal}.
+     *
+     * @throws AssertionError if the value of a result field in this and {@code other} are not equal
+     */
+    public void assertResultFieldsEqual(KernelTester other) {
         Class<?> clazz = this.getClass();
         while (clazz != null && clazz != KernelTester.class) {
             for (Field f : clazz.getDeclaredFields()) {
                 if (!Modifier.isStatic(f.getModifiers())) {
                     Result annos = f.getAnnotation(Result.class);
                     if (annos != null) {
-                        logger.fine("@Result field = " + f);
-                        Object myResult = getFieldFromObject(f, this);
-                        Object otherResult = getFieldFromObject(f, base);
-                        boolean same = compareObjects(myResult, otherResult);
-                        logger.fine("comparing " + myResult + ", " + otherResult + ", match=" + same);
-                        if (!same) {
-                            logger.severe("mismatch comparing " + f + ", " + myResult + " vs. " + otherResult);
-                            logSevere("FAILED!!! " + this.getClass());
-                            return false;
-                        }
+                        Object actualResult = getFieldFromObject(f, this);
+                        Object expectedResult = getFieldFromObject(f, other);
+                        assertDeepEquals(f.toString(), expectedResult, actualResult);
                     }
                 }
             }
             clazz = clazz.getSuperclass();
         }
-        logInfo("PASSED: " + this.getClass());
-        return true;
-    }
-
-    private boolean compareObjects(Object first, Object second) {
-        if (first == null) {
-            return (second == null);
-        }
-        if (second == null) {
-            return (first == null);
-        }
-        Class<?> clazz = first.getClass();
-        if (clazz != second.getClass()) {
-            return false;
-        }
-        if (!clazz.isArray()) {
-            // Non arrays.
-            if (clazz.equals(float.class) || clazz.equals(double.class)) {
-                return isEqualsFP((double) first, (double) second);
-            } else {
-                return first.equals(second);
-            }
-        } else {
-            // Handle the case where Objects are arrays.
-            ArrayComparer comparer;
-            if (clazz.equals(float[].class) || clazz.equals(double[].class)) {
-                comparer = new FPArrayComparer();
-            } else if (clazz.equals(long[].class) || clazz.equals(int[].class) || clazz.equals(byte[].class)) {
-                comparer = new IntArrayComparer();
-            } else if (clazz.equals(boolean[].class)) {
-                comparer = new BooleanArrayComparer();
-            } else {
-                comparer = new ObjArrayComparer();
-            }
-            return comparer.compareArrays(first, second);
-        }
-    }
-
-    static final int MISMATCHLIMIT = 10;
-    static final int ELEMENTDISPLAYLIMIT = 20;
-
-    public int getMisMatchLimit() {
-        return MISMATCHLIMIT;
-    }
-
-    public int getElementDisplayLimit() {
-        return ELEMENTDISPLAYLIMIT;
-    }
-
-    abstract class ArrayComparer {
-
-        abstract Object getElement(Object ary, int index);
-
-        // Equality test, can be overridden
-        boolean isEquals(Object firstElement, Object secondElement) {
-            return firstElement.equals(secondElement);
-        }
-
-        boolean compareArrays(Object first, Object second) {
-            int len = Array.getLength(first);
-            if (len != Array.getLength(second)) {
-                return false;
-            }
-            // If info logLevel, build string of first few elements from first array.
-            if (logLevel.intValue() <= Level.INFO.intValue()) {
-                StringBuilder sb = new StringBuilder();
-                for (int i = 0; i < Math.min(len, getElementDisplayLimit()); i++) {
-                    sb.append(getElement(first, i));
-                    sb.append(", ");
-                }
-                logger.info(sb.toString());
-            }
-            boolean success = true;
-            int mismatches = 0;
-            for (int i = 0; i < len; i++) {
-                Object firstElement = getElement(first, i);
-                Object secondElement = getElement(second, i);
-                if (!isEquals(firstElement, secondElement)) {
-                    logSevere("mismatch at index " + i + ", expected " + secondElement + ", saw " + firstElement);
-                    success = false;
-                    mismatches++;
-                    if (mismatches >= getMisMatchLimit()) {
-                        logSevere("...Truncated");
-                        break;
-                    }
-                }
-            }
-            return success;
-        }
-    }
-
-    class FPArrayComparer extends ArrayComparer {
-
-        @Override
-        Object getElement(Object ary, int index) {
-            return Array.getDouble(ary, index);
-        }
-
-        @Override
-        boolean isEquals(Object firstElement, Object secondElement) {
-            return isEqualsFP((double) firstElement, (double) secondElement);
-        }
-    }
-
-    class IntArrayComparer extends ArrayComparer {
-
-        @Override
-        Object getElement(Object ary, int index) {
-            return Array.getLong(ary, index);
-        }
-    }
-
-    class BooleanArrayComparer extends ArrayComparer {
-
-        @Override
-        Object getElement(Object ary, int index) {
-            return Array.getBoolean(ary, index);
-        }
-    }
-
-    class ObjArrayComparer extends ArrayComparer {
-
-        @Override
-        Object getElement(Object ary, int index) {
-            return Array.get(ary, index);
-        }
-
-        @Override
-        boolean isEquals(Object firstElement, Object secondElement) {
-            return compareObjects(firstElement, secondElement);
-        }
-    }
-
-    /**
-     * Tests two floating point values for equality.
-     */
-    public boolean isEqualsFP(double first, double second) {
-        // Special case for checking whether expected and actual values are both NaNs.
-        if (Double.isNaN(first) && Double.isNaN(second)) {
-            return true;
-        }
-        return first == second;
     }
 
     public void setDispatchMode(DispatchMode dispatchMode) {
@@ -761,8 +620,8 @@
         }
     }
 
-    private void compareOkraToSeq(HsailMode hsailModeToUse) {
-        compareOkraToSeq(hsailModeToUse, false);
+    private void assertOkraEqualsSeq(HsailMode hsailModeToUse) {
+        assertOkraEqualsSeq(hsailModeToUse, false);
     }
 
     /**
@@ -770,7 +629,7 @@
      * runOkraFirst flag controls which order they are done in. Note the compiler must use eager
      * resolving if Okra is done first.
      */
-    private void compareOkraToSeq(HsailMode hsailModeToUse, boolean useLambda) {
+    private void assertOkraEqualsSeq(HsailMode hsailModeToUse, boolean useLambda) {
         KernelTester testerSeq;
         if (runOkraFirst) {
             runOkraInstance(hsailModeToUse, useLambda);
@@ -779,7 +638,7 @@
             testerSeq = runSeqInstance();
             runOkraInstance(hsailModeToUse, useLambda);
         }
-        assertTrue("failed comparison to SEQ", compareResults(testerSeq));
+        assertResultFieldsEqual(testerSeq);
     }
 
     private void runOkraInstance(HsailMode hsailModeToUse, boolean useLambda) {
@@ -800,19 +659,19 @@
     }
 
     public void testGeneratedHsail() {
-        compareOkraToSeq(HsailMode.COMPILED);
+        assertOkraEqualsSeq(HsailMode.COMPILED);
     }
 
     public void testGeneratedHsailUsingLambdaMethod() {
-        compareOkraToSeq(HsailMode.COMPILED, true);
+        assertOkraEqualsSeq(HsailMode.COMPILED, true);
     }
 
     public void testInjectedHsail() {
-        newInstance().compareOkraToSeq(HsailMode.INJECT_HSAIL);
+        newInstance().assertOkraEqualsSeq(HsailMode.INJECT_HSAIL);
     }
 
     public void testInjectedOpencl() {
-        newInstance().compareOkraToSeq(HsailMode.INJECT_OCL);
+        newInstance().assertOkraEqualsSeq(HsailMode.INJECT_OCL);
     }
 
     protected static Object getFieldFromObject(Field f, Object fromObj) {
--- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/BoundsCatchManyBase.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/BoundsCatchManyBase.java	Tue May 13 18:31:18 2014 -0700
@@ -33,11 +33,6 @@
         return (gid < 4096 && gid % 512 == 1);
     }
 
-    @Override
-    public int getMisMatchLimit() {
-        return 1000;
-    }
-
     public void run(int gid) {
         int outval = getOutval(gid);
         try {
--- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/FloatDivPrecisionTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/FloatDivPrecisionTest.java	Tue May 13 18:31:18 2014 -0700
@@ -49,8 +49,8 @@
     }
 
     @Override
-    public boolean isEqualsFP(double first, double second) {
-        return Math.abs(first - second) == 0;
+    protected double equalFloatsOrDoublesDelta() {
+        return 0.0D;
     }
 
     @Test
--- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/ObjSpillDeoptBase.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/ObjSpillDeoptBase.java	Tue May 13 18:31:18 2014 -0700
@@ -86,4 +86,8 @@
         dispatchMethodKernel(getSize());
     }
 
+    @Override
+    protected boolean supportsRequiredCapabilities() {
+        return canDeoptimize();
+    }
 }
--- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/StaticDoubleSpillBoundsCatchOneTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/StaticDoubleSpillBoundsCatchOneTest.java	Tue May 13 18:31:18 2014 -0700
@@ -130,9 +130,13 @@
         dispatchMethodKernel(size, out, in, aux);
     }
 
+    @Override
+    protected boolean supportsRequiredCapabilities() {
+        return canDeoptimize();
+    }
+
     @Test
     public void test() {
         testGeneratedHsail();
     }
-
 }
--- a/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/StaticDoubleSpillBoundsCatchTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.hsail.test/src/com/oracle/graal/compiler/hsail/test/StaticDoubleSpillBoundsCatchTest.java	Tue May 13 18:31:18 2014 -0700
@@ -133,6 +133,11 @@
         dispatchMethodKernel(size, out, in, aux);
     }
 
+    @Override
+    protected boolean supportsRequiredCapabilities() {
+        return canDeoptimize();
+    }
+
     @Test
     public void test() {
         testGeneratedHsail();
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/BoxingEliminationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/BoxingEliminationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -300,7 +300,7 @@
 
     final ValueNode getResult(String snippet) {
         processMethod(snippet);
-        assertEquals(1, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(1, graph.getNodes(ReturnNode.class).count());
         return graph.getNodes(ReturnNode.class).first().result();
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CompareCanonicalizerTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/CompareCanonicalizerTest.java	Tue May 13 18:31:18 2014 -0700
@@ -132,7 +132,7 @@
         result = getResult(getCanonicalizedGraph("integerTestCanonicalization2"));
         assertTrue(result.isConstant() && result.asConstant().asLong() == 1);
         StructuredGraph graph = getCanonicalizedGraph("integerTestCanonicalization3");
-        assertEquals(1, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(1, graph.getNodes(ReturnNode.class).count());
         assertTrue(graph.getNodes(ReturnNode.class).first().result() instanceof ConditionalNode);
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ConditionalEliminationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -100,7 +100,7 @@
         new ConditionalEliminationPhase(getMetaAccess()).apply(graph, context);
         canonicalizer.apply(graph, context);
 
-        assertEquals(1, graph.getNodes().filter(GuardNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(GuardNode.class).count());
     }
 
     public static String testInstanceOfCheckCastSnippet(Object e) {
@@ -123,7 +123,7 @@
         new ConditionalEliminationPhase(getMetaAccess()).apply(graph, context);
         canonicalizer.apply(graph, context);
 
-        assertEquals(0, graph.getNodes().filter(GuardNode.class).count());
+        assertDeepEquals(0, graph.getNodes().filter(GuardNode.class).count());
     }
 
 }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSenReduTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSenReduTest.java	Tue May 13 18:31:18 2014 -0700
@@ -61,7 +61,7 @@
 
     @Test
     public void redundantCheckCastTest() {
-        assertEquals(i7, redundantCheckCastSnippet(i7));
+        assertDeepEquals(i7, redundantCheckCastSnippet(i7));
         StructuredGraph result = afterFlowSensitiveReduce("redundantCheckCastSnippet");
         nodeCountEquals(result, CheckCastNode.class, 0);
         nodeCountEquals(result, InstanceOfNode.class, 1);
@@ -79,7 +79,7 @@
     @Test
     public void redundantInstanceOfTest01() {
         String snippet = "redundantInstanceOfSnippet01";
-        assertEquals(true, redundantInstanceOfSnippet01(i7));
+        assertDeepEquals(true, redundantInstanceOfSnippet01(i7));
         nodeCountEquals(afterFlowSensitiveReduce(snippet), InstanceOfNode.class, 1);
     }
 
@@ -100,9 +100,9 @@
     @Test
     public void redundantInstanceOfTest02() {
         String snippet = "redundantInstanceOfSnippet02";
-        assertEquals(i7, redundantInstanceOfSnippet02(i7));
+        assertDeepEquals(i7, redundantInstanceOfSnippet02(i7));
         int ioAfter = getNodes(afterFlowSensitiveReduce(snippet), InstanceOfNode.class).size();
-        assertEquals(ioAfter, 1);
+        assertDeepEquals(ioAfter, 1);
     }
 
     /*
@@ -121,18 +121,18 @@
     @Test
     public void devirtualizationTest() {
         String snippet = "devirtualizationSnippet";
-        assertEquals(i7, devirtualizationSnippet(i7, i7));
+        assertDeepEquals(i7, devirtualizationSnippet(i7, i7));
         nodeCountEquals(afterFlowSensitiveReduce(snippet), CheckCastNode.class, 0);
 
         StructuredGraph graph = afterFlowSensitiveReduce(snippet);
-        assertEquals(0, graph.getNodes().filter(CheckCastNode.class).count());
+        assertDeepEquals(0, graph.getNodes().filter(CheckCastNode.class).count());
 
         List<InvokeNode> invokeNodes = getNodes(afterFlowSensitiveReduce(snippet), InvokeNode.class);
-        assertEquals(1, invokeNodes.size());
+        assertDeepEquals(1, invokeNodes.size());
 
         MethodCallTargetNode target = (MethodCallTargetNode) invokeNodes.get(0).callTarget();
-        assertEquals(MethodCallTargetNode.InvokeKind.Special, target.invokeKind());
-        assertEquals("HotSpotMethod<Integer.intValue()>", target.targetMethod().toString());
+        assertDeepEquals(MethodCallTargetNode.InvokeKind.Special, target.invokeKind());
+        assertDeepEquals("HotSpotMethod<Integer.intValue()>", target.targetMethod().toString());
     }
 
     /*
@@ -154,7 +154,7 @@
     @Test
     public void t5a() {
         String snippet = "t5Snippet";
-        assertEquals(false, t5Snippet(null, true));
+        assertDeepEquals(false, t5Snippet(null, true));
         StructuredGraph resultGraph = canonicalize(afterFlowSensitiveReduce(snippet));
         nodeCountEquals(resultGraph, ReturnNode.class, 2);
 
@@ -164,8 +164,8 @@
         ConstantNode c1 = (ConstantNode) iter.next().result();
         ConstantNode c2 = (ConstantNode) iter.next().result();
 
-        assertEquals(c1, c2);
-        assertEquals(0, c1.getValue().asInt());
+        assertDeepEquals(c1, c2);
+        assertDeepEquals(0, c1.getValue().asInt());
     }
 
     @Test
@@ -215,16 +215,16 @@
         StructuredGraph graph = afterFlowSensitiveReduce(snippet);
         graph = dce(canonicalize(graph));
         // TODO how to simplify IfNode(false)
-        assertEquals(1, getNodes(graph, InstanceOfNode.class).size());
+        assertDeepEquals(1, getNodes(graph, InstanceOfNode.class).size());
 
         List<ReturnNode> returnNodes = getNodes(graph, ReturnNode.class);
-        assertEquals(2, returnNodes.size());
+        assertDeepEquals(2, returnNodes.size());
         Iterator<ReturnNode> iter = returnNodes.iterator();
 
         ConstantNode c1 = (ConstantNode) iter.next().result();
         ConstantNode c2 = (ConstantNode) iter.next().result();
 
-        assertEquals(c1, c2);
+        assertDeepEquals(c1, c2);
         Assert.assertTrue(c1.getValue().isNull());
     }
 
@@ -253,14 +253,14 @@
         String snippet = "devirtualizationSnippet02";
         StructuredGraph graph = afterFlowSensitiveReduce(snippet);
 
-        assertEquals(1, getNodes(graph, InvokeNode.class).size());
+        assertDeepEquals(1, getNodes(graph, InvokeNode.class).size());
 
         List<InvokeNode> invokeNodes = getNodes(graph, InvokeNode.class);
-        assertEquals(1, invokeNodes.size());
+        assertDeepEquals(1, invokeNodes.size());
 
         MethodCallTargetNode target = (MethodCallTargetNode) invokeNodes.get(0).callTarget();
-        assertEquals(MethodCallTargetNode.InvokeKind.Special, target.invokeKind());
-        assertEquals("HotSpotMethod<Integer.intValue()>", target.targetMethod().toString());
+        assertDeepEquals(MethodCallTargetNode.InvokeKind.Special, target.invokeKind());
+        assertDeepEquals("HotSpotMethod<Integer.intValue()>", target.targetMethod().toString());
     }
 
     /*
@@ -312,7 +312,7 @@
         dce(graph);
 
         List<ReturnNode> returnNodes = getNodes(graph, ReturnNode.class);
-        assertEquals(2, returnNodes.size());
+        assertDeepEquals(2, returnNodes.size());
         Iterator<ReturnNode> iter = returnNodes.iterator();
 
         ValueNode c1 = GraphUtil.unproxify(iter.next().result());
@@ -339,7 +339,7 @@
         String snippet = "deduplicateInstanceOfSnippet";
         StructuredGraph graph = afterFlowSensitiveReduce(snippet);
         List<InstanceOfNode> ioNodes = getNodes(graph, InstanceOfNode.class);
-        assertEquals(1, ioNodes.size());
+        assertDeepEquals(1, ioNodes.size());
 
     }
 
@@ -371,7 +371,7 @@
     }
 
     public <N extends Node> void nodeCountEquals(StructuredGraph graph, Class<N> nodeClass, int expected) {
-        assertEquals(expected, getNodes(graph, nodeClass).size());
+        assertDeepEquals(expected, getNodes(graph, nodeClass).size());
     }
 
     public StructuredGraph afterFlowSensitiveReduce(String snippet) {
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSensitiveReductionTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/FlowSensitiveReductionTest.java	Tue May 13 18:31:18 2014 -0700
@@ -209,7 +209,7 @@
         new FlowSensitiveReductionPhase(getMetaAccess()).apply(graph, context);
 
         InvokeNode invoke = graph.getNodes().filter(InvokeNode.class).first();
-        assertEquals(InvokeKind.Special, ((MethodCallTargetNode) invoke.callTarget()).invokeKind());
+        assertDeepEquals(InvokeKind.Special, ((MethodCallTargetNode) invoke.callTarget()).invokeKind());
     }
 
     public static void testTypeMergingSnippet(Object o, boolean b) {
@@ -240,7 +240,7 @@
         new FlowSensitiveReductionPhase(getMetaAccess()).apply(graph, context);
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), null));
 
-        assertEquals(0, graph.getNodes().filter(StoreFieldNode.class).count());
+        assertDeepEquals(0, graph.getNodes().filter(StoreFieldNode.class).count());
     }
 
     public static String testInstanceOfCheckCastSnippet(Object e) {
@@ -258,7 +258,7 @@
         new FlowSensitiveReductionPhase(getMetaAccess()).apply(graph, context);
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), null));
 
-        assertEquals(0, graph.getNodes().filter(CheckCastNode.class).count());
+        assertDeepEquals(0, graph.getNodes().filter(CheckCastNode.class).count());
     }
 
     public static int testDuplicateNullChecksSnippet(Object a) {
@@ -287,7 +287,7 @@
         new FlowSensitiveReductionPhase(getMetaAccess()).apply(graph, context);
         canonicalizer.apply(graph, context);
 
-        assertEquals(1, graph.getNodes().filter(GuardNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(GuardNode.class).count());
     }
 
 }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java	Tue May 13 18:31:18 2014 -0700
@@ -27,7 +27,6 @@
 import static com.oracle.graal.compiler.common.GraalOptions.*;
 import static com.oracle.graal.nodes.ConstantNode.*;
 
-import java.io.*;
 import java.lang.reflect.*;
 import java.util.*;
 import java.util.concurrent.atomic.*;
@@ -277,76 +276,6 @@
 
     private static AtomicInteger compilationId = new AtomicInteger();
 
-    /**
-     * Compares two given objects for {@linkplain Assert#assertEquals(Object, Object) equality}.
-     * Does a deep copy equality comparison if {@code expected} is an array.
-     */
-    protected void assertEquals(Object expected, Object actual) {
-        if (expected != null && expected.getClass().isArray()) {
-            Assert.assertTrue(expected != null);
-            Assert.assertTrue(actual != null);
-            Assert.assertEquals(expected.getClass(), actual.getClass());
-            if (expected instanceof int[]) {
-                Assert.assertArrayEquals((int[]) expected, (int[]) actual);
-            } else if (expected instanceof byte[]) {
-                Assert.assertArrayEquals((byte[]) expected, (byte[]) actual);
-            } else if (expected instanceof char[]) {
-                Assert.assertArrayEquals((char[]) expected, (char[]) actual);
-            } else if (expected instanceof short[]) {
-                Assert.assertArrayEquals((short[]) expected, (short[]) actual);
-            } else if (expected instanceof float[]) {
-                Assert.assertArrayEquals((float[]) expected, (float[]) actual, 0.0f);
-            } else if (expected instanceof long[]) {
-                Assert.assertArrayEquals((long[]) expected, (long[]) actual);
-            } else if (expected instanceof double[]) {
-                Assert.assertArrayEquals((double[]) expected, (double[]) actual, 0.0d);
-            } else if (expected instanceof boolean[]) {
-                new ExactComparisonCriteria().arrayEquals(null, expected, actual);
-            } else if (expected instanceof Object[]) {
-                Assert.assertArrayEquals((Object[]) expected, (Object[]) actual);
-            } else {
-                Assert.fail("non-array value encountered: " + expected);
-            }
-        } else {
-            Assert.assertEquals(expected, actual);
-        }
-    }
-
-    @SuppressWarnings("serial")
-    public static class MultiCauseAssertionError extends AssertionError {
-
-        private Throwable[] causes;
-
-        public MultiCauseAssertionError(String message, Throwable... causes) {
-            super(message);
-            this.causes = causes;
-        }
-
-        @Override
-        public void printStackTrace(PrintStream out) {
-            super.printStackTrace(out);
-            int num = 0;
-            for (Throwable cause : causes) {
-                if (cause != null) {
-                    out.print("cause " + (num++));
-                    cause.printStackTrace(out);
-                }
-            }
-        }
-
-        @Override
-        public void printStackTrace(PrintWriter out) {
-            super.printStackTrace(out);
-            int num = 0;
-            for (Throwable cause : causes) {
-                if (cause != null) {
-                    out.print("cause " + (num++) + ": ");
-                    cause.printStackTrace(out);
-                }
-            }
-        }
-    }
-
     protected void testN(int n, final String name, final Object... args) {
         final List<Throwable> errors = new ArrayList<>(n);
         Thread[] threads = new Thread[n];
@@ -599,7 +528,7 @@
                 actual.exception.printStackTrace();
                 Assert.fail("expected " + expect.returnValue + " but got an exception");
             }
-            assertEquals(expect.returnValue, actual.returnValue);
+            assertDeepEquals(expect.returnValue, actual.returnValue);
         }
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java	Tue May 13 18:31:18 2014 -0700
@@ -66,7 +66,7 @@
         for (Infopoint sp : cr.getInfopoints()) {
             assertNotNull(sp.reason);
             if (sp instanceof Call) {
-                assertEquals(InfopointReason.CALL, sp.reason);
+                assertDeepEquals(InfopointReason.CALL, sp.reason);
             }
         }
     }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/LockEliminationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/LockEliminationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -65,8 +65,8 @@
         StructuredGraph graph = getGraph("testSynchronizedSnippet");
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), null));
         new LockEliminationPhase().apply(graph);
-        assertEquals(1, graph.getNodes().filter(MonitorEnterNode.class).count());
-        assertEquals(1, graph.getNodes().filter(MonitorExitNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(MonitorEnterNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(MonitorExitNode.class).count());
     }
 
     public static void testSynchronizedMethodSnippet(A x) {
@@ -83,8 +83,8 @@
         StructuredGraph graph = getGraph("testSynchronizedMethodSnippet");
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), null));
         new LockEliminationPhase().apply(graph);
-        assertEquals(1, graph.getNodes().filter(MonitorEnterNode.class).count());
-        assertEquals(1, graph.getNodes().filter(MonitorExitNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(MonitorEnterNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(MonitorExitNode.class).count());
     }
 
     private StructuredGraph getGraph(String snippet) {
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MemoryScheduleTest.java	Tue May 13 18:31:18 2014 -0700
@@ -164,7 +164,7 @@
     @Test
     public void testLoop1() {
         SchedulePhase schedule = getFinalSchedule("testLoop1Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(6, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(6, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, true);
         assertReadWithinAllReturnBlocks(schedule, false);
     }
@@ -189,7 +189,7 @@
     @Test
     public void testLoop2() {
         SchedulePhase schedule = getFinalSchedule("testLoop2Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(6, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(6, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, true);
     }
@@ -211,7 +211,7 @@
     @Test
     public void testLoop3() {
         SchedulePhase schedule = getFinalSchedule("testLoop3Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(6, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(6, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, true);
         assertReadWithinAllReturnBlocks(schedule, false);
     }
@@ -247,7 +247,7 @@
     @Test
     public void testLoop5() {
         SchedulePhase schedule = getFinalSchedule("testLoop5Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(10, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(10, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, false);
     }
@@ -264,10 +264,10 @@
     public void testArrayCopy() {
         SchedulePhase schedule = getFinalSchedule("testArrayCopySnippet", TestMode.INLINED_WITHOUT_FRAMESTATES);
         StructuredGraph graph = schedule.getCFG().getStartBlock().getBeginNode().graph();
-        assertEquals(1, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(1, graph.getNodes(ReturnNode.class).count());
         ReturnNode ret = graph.getNodes(ReturnNode.class).first();
         assertTrue(ret.result() + " should be a FloatingReadNode", ret.result() instanceof FloatingReadNode);
-        assertEquals(schedule.getCFG().blockFor(ret), schedule.getCFG().blockFor(ret.result()));
+        assertDeepEquals(schedule.getCFG().blockFor(ret), schedule.getCFG().blockFor(ret.result()));
         assertReadWithinAllReturnBlocks(schedule, true);
     }
 
@@ -285,7 +285,7 @@
     @Test
     public void testIfRead1() {
         SchedulePhase schedule = getFinalSchedule("testIfRead1Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(3, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(3, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, true);
         assertReadAndWriteInSameBlock(schedule, false);
     }
@@ -306,8 +306,8 @@
     @Test
     public void testIfRead2() {
         SchedulePhase schedule = getFinalSchedule("testIfRead2Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(3, schedule.getCFG().getBlocks().size());
-        assertEquals(1, schedule.getCFG().graph.getNodes().filter(FloatingReadNode.class).count());
+        assertDeepEquals(3, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(1, schedule.getCFG().graph.getNodes().filter(FloatingReadNode.class).count());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, false);
         assertReadAndWriteInSameBlock(schedule, false);
@@ -328,7 +328,7 @@
     @Test
     public void testIfRead3() {
         SchedulePhase schedule = getFinalSchedule("testIfRead3Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(4, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(4, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, true);
     }
@@ -349,7 +349,7 @@
     @Test
     public void testIfRead4() {
         SchedulePhase schedule = getFinalSchedule("testIfRead4Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(3, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(3, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, false);
         assertReadAndWriteInSameBlock(schedule, true);
@@ -368,7 +368,7 @@
     @Test
     public void testIfRead5() {
         SchedulePhase schedule = getFinalSchedule("testIfRead5Snippet", TestMode.WITHOUT_FRAMESTATES);
-        assertEquals(4, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(4, schedule.getCFG().getBlocks().size());
         assertReadWithinStartBlock(schedule, false);
         assertReadWithinAllReturnBlocks(schedule, true);
         assertReadAndWriteInSameBlock(schedule, false);
@@ -397,9 +397,9 @@
         StructuredGraph graph = schedule.getCFG().graph;
         NodeIterable<WriteNode> writeNodes = graph.getNodes().filter(WriteNode.class);
 
-        assertEquals(1, schedule.getCFG().getBlocks().size());
-        assertEquals(8, writeNodes.count());
-        assertEquals(1, graph.getNodes().filter(FloatingReadNode.class).count());
+        assertDeepEquals(1, schedule.getCFG().getBlocks().size());
+        assertDeepEquals(8, writeNodes.count());
+        assertDeepEquals(1, graph.getNodes().filter(FloatingReadNode.class).count());
 
         FloatingReadNode read = graph.getNodes().filter(FloatingReadNode.class).first();
 
@@ -554,7 +554,7 @@
             }
             returnBlocks++;
         }
-        assertEquals(withRead == returnBlocks, withinReturnBlock);
+        assertDeepEquals(withRead == returnBlocks, withinReturnBlock);
     }
 
     private void assertReadWithinStartBlock(SchedulePhase schedule, boolean withinStartBlock) {
@@ -564,7 +564,7 @@
                 readEncountered = true;
             }
         }
-        assertEquals(withinStartBlock, readEncountered);
+        assertDeepEquals(withinStartBlock, readEncountered);
     }
 
     private static void assertReadAndWriteInSameBlock(SchedulePhase schedule, boolean inSame) {
@@ -617,7 +617,7 @@
 
                 SchedulePhase schedule = new SchedulePhase(schedulingStrategy, memsched);
                 schedule.apply(graph);
-                assertEquals(1, graph.getNodes().filter(StartNode.class).count());
+                assertDeepEquals(1, graph.getNodes().filter(StartNode.class).count());
                 return schedule;
             }
         } catch (Throwable e) {
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MergeCanonicalizerTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/MergeCanonicalizerTest.java	Tue May 13 18:31:18 2014 -0700
@@ -61,6 +61,6 @@
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), new Assumptions(false)));
         new CanonicalizerPhase(true).apply(graph, new PhaseContext(getProviders(), new Assumptions(false)));
         Debug.dump(graph, "Graph");
-        assertEquals(returnCount, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(returnCount, graph.getNodes(ReturnNode.class).count());
     }
 }
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/SimpleCFGTest.java	Tue May 13 18:31:18 2014 -0700
@@ -65,24 +65,24 @@
 
         List<Block> blocks = cfg.getBlocks();
         // check number of blocks
-        assertEquals(4, blocks.size());
+        assertDeepEquals(4, blocks.size());
 
         // check block - node assignment
-        assertEquals(blocks.get(0), cfg.blockFor(graph.start()));
-        assertEquals(blocks.get(0), cfg.blockFor(ifNode));
-        assertEquals(blocks.get(1), cfg.blockFor(trueBegin));
-        assertEquals(blocks.get(1), cfg.blockFor(trueEnd));
-        assertEquals(blocks.get(2), cfg.blockFor(falseBegin));
-        assertEquals(blocks.get(2), cfg.blockFor(falseEnd));
-        assertEquals(blocks.get(3), cfg.blockFor(merge));
-        assertEquals(blocks.get(3), cfg.blockFor(returnNode));
+        assertDeepEquals(blocks.get(0), cfg.blockFor(graph.start()));
+        assertDeepEquals(blocks.get(0), cfg.blockFor(ifNode));
+        assertDeepEquals(blocks.get(1), cfg.blockFor(trueBegin));
+        assertDeepEquals(blocks.get(1), cfg.blockFor(trueEnd));
+        assertDeepEquals(blocks.get(2), cfg.blockFor(falseBegin));
+        assertDeepEquals(blocks.get(2), cfg.blockFor(falseEnd));
+        assertDeepEquals(blocks.get(3), cfg.blockFor(merge));
+        assertDeepEquals(blocks.get(3), cfg.blockFor(returnNode));
 
         // check postOrder
         Iterator<Block> it = cfg.postOrder().iterator();
         for (int i = blocks.size() - 1; i >= 0; i--) {
             assertTrue(it.hasNext());
             Block b = it.next();
-            assertEquals(blocks.get(i), b);
+            assertDeepEquals(blocks.get(i), b);
         }
 
         // check dominators
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EAMergingTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EAMergingTest.java	Tue May 13 18:31:18 2014 -0700
@@ -33,7 +33,7 @@
     @Test
     public void testSimpleMerge() {
         testEscapeAnalysis("simpleMergeSnippet", null, false);
-        assertEquals(1, returnNodes.size());
+        assertDeepEquals(1, returnNodes.size());
         assertTrue(returnNodes.get(0).result() instanceof ValuePhiNode);
         PhiNode phi = (PhiNode) returnNodes.get(0).result();
         assertTrue(phi.valueAt(0) instanceof ParameterNode);
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/IterativeInliningTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/IterativeInliningTest.java	Tue May 13 18:31:18 2014 -0700
@@ -74,12 +74,12 @@
     public void testSimple() {
         ValueNode result = getReturn("testSimpleSnippet").result();
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
-        assertEquals(graph.getParameter(0), result);
+        assertDeepEquals(graph.getParameter(0), result);
     }
 
     final ReturnNode getReturn(String snippet) {
         processMethod(snippet);
-        assertEquals(1, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(1, graph.getNodes(ReturnNode.class).count());
         return graph.getNodes(ReturnNode.class).first();
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PEAReadEliminationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -87,7 +87,7 @@
         ValueNode result = getReturn("testSimpleSnippet").result();
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
         assertTrue(result.isConstant());
-        assertEquals(2, result.asConstant().asInt());
+        assertDeepEquals(2, result.asConstant().asInt());
     }
 
     @SuppressWarnings("all")
@@ -115,7 +115,7 @@
     public void testParam() {
         ValueNode result = getReturn("testParamSnippet").result();
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
-        assertEquals(graph.getParameter(1), result);
+        assertDeepEquals(graph.getParameter(1), result);
     }
 
     @SuppressWarnings("all")
@@ -129,7 +129,7 @@
     public void testMaterialized() {
         ValueNode result = getReturn("testMaterializedSnippet").result();
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
-        assertEquals(graph.getParameter(0), result);
+        assertDeepEquals(graph.getParameter(0), result);
     }
 
     @SuppressWarnings("all")
@@ -145,7 +145,7 @@
     public void testSimpleLoop() {
         ValueNode result = getReturn("testSimpleLoopSnippet").result();
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
-        assertEquals(graph.getParameter(1), result);
+        assertDeepEquals(graph.getParameter(1), result);
     }
 
     @SuppressWarnings("all")
@@ -162,7 +162,7 @@
     @Test
     public void testBadLoop() {
         ValueNode result = getReturn("testBadLoopSnippet").result();
-        assertEquals(0, graph.getNodes().filter(LoadFieldNode.class).count());
+        assertDeepEquals(0, graph.getNodes().filter(LoadFieldNode.class).count());
         assertTrue(result instanceof ProxyNode);
         assertTrue(((ProxyNode) result).value() instanceof ValuePhiNode);
     }
@@ -180,7 +180,7 @@
     @Test
     public void testBadLoop2() {
         ValueNode result = getReturn("testBadLoop2Snippet").result();
-        assertEquals(1, graph.getNodes().filter(LoadFieldNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(LoadFieldNode.class).count());
         assertTrue(result instanceof LoadFieldNode);
     }
 
@@ -199,7 +199,7 @@
         processMethod("testPhiSnippet");
         assertTrue(graph.getNodes().filter(LoadFieldNode.class).isEmpty());
         List<ReturnNode> returnNodes = graph.getNodes(ReturnNode.class).snapshot();
-        assertEquals(2, returnNodes.size());
+        assertDeepEquals(2, returnNodes.size());
         assertTrue(returnNodes.get(0).predecessor() instanceof StoreFieldNode);
         assertTrue(returnNodes.get(1).predecessor() instanceof StoreFieldNode);
         assertTrue(returnNodes.get(0).result().isConstant());
@@ -215,7 +215,7 @@
     @Test
     public void testSimpleStore() {
         processMethod("testSimpleStoreSnippet");
-        assertEquals(1, graph.getNodes().filter(StoreFieldNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(StoreFieldNode.class).count());
     }
 
     public static int testValueProxySnippet(boolean b, TestObject o) {
@@ -233,12 +233,12 @@
     @Test
     public void testValueProxy() {
         processMethod("testValueProxySnippet");
-        assertEquals(2, graph.getNodes().filter(LoadFieldNode.class).count());
+        assertDeepEquals(2, graph.getNodes().filter(LoadFieldNode.class).count());
     }
 
     final ReturnNode getReturn(String snippet) {
         processMethod(snippet);
-        assertEquals(1, graph.getNodes(ReturnNode.class).count());
+        assertDeepEquals(1, graph.getNodes(ReturnNode.class).count());
         return graph.getNodes(ReturnNode.class).first();
     }
 
--- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/PartialEscapeAnalysisTest.java	Tue May 13 18:31:18 2014 -0700
@@ -171,7 +171,7 @@
     @Test
     public void testReference1() {
         prepareGraph("testReference1Snippet", false);
-        assertEquals(1, graph.getNodes().filter(NewInstanceNode.class).count());
+        assertDeepEquals(1, graph.getNodes().filter(NewInstanceNode.class).count());
     }
 
     @SafeVarargs
--- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java	Tue May 13 18:31:18 2014 -0700
@@ -374,11 +374,16 @@
             throw new GraalInternalError("Cannot execute GPU kernel if device is not initialized");
         }
         int[] oopMapArray = ((HSAILHotSpotNmethod) kernel).getOopMapArray();
-        int saveAreaCounts = OopMapArrayBuilder.getSaveAreaCounts(oopMapArray);
-        int numDRegs = (saveAreaCounts >> 8) & 0xff;
-        int numStackSlots = (saveAreaCounts >> 16);
-        // pessimistically assume that any of the DRegs or stackslots could be oops
-        Object[] oopsSaveArea = new Object[maxDeoptIndex * (numDRegs + numStackSlots)];
+        Object[] oopsSaveArea;
+        if (getRuntime().getConfig().useHSAILDeoptimization) {
+            int saveAreaCounts = OopMapArrayBuilder.getSaveAreaCounts(oopMapArray);
+            int numDRegs = (saveAreaCounts >> 8) & 0xff;
+            int numStackSlots = (saveAreaCounts >> 16);
+            // pessimistically assume that any of the DRegs or stackslots could be oops
+            oopsSaveArea = new Object[maxDeoptIndex * (numDRegs + numStackSlots)];
+        } else {
+            oopsSaveArea = null;
+        }
         return executeKernel0(kernel, jobSize, args, oopsSaveArea, donorThreadPool.get().getThreads(), HsailAllocBytesPerWorkitem.getValue(), oopMapArray);
     }
 
@@ -765,7 +770,7 @@
             // numStackSlots is the number of 8-byte locations used for stack variables
             int numStackSlots = (numStackSlotBytes + 7) / 8;
 
-            final int offsetToDeoptSaveStates = config.hsailSaveStatesOffset0;
+            final int offsetToDeoptSaveStates = config.hsailDeoptimizationInfoHeaderSize;
             final int bytesPerSaveArea = 4 * numSRegs + 8 * numDRegs + 8 * numStackSlots;
             final int sizeofKernelDeopt = config.hsailKernelDeoptimizationHeaderSize + config.hsailFrameHeaderSize + bytesPerSaveArea;
             final int offsetToNeverRanArray = config.hsailNeverRanArrayOffset;
@@ -854,7 +859,7 @@
             asm.emitComment("// store PC");
             asm.emitStore(Kind.Int, codeBufferOffsetReg, pcStoreAddr);
 
-            asm.emitComment("// store regCounts (" + numSRegs + " $s registers and " + numDRegs + " $d registers" + numStackSlots + " stack slots)");
+            asm.emitComment("// store regCounts (" + numSRegs + " $s registers, " + numDRegs + " $d registers, " + numStackSlots + " stack slots)");
             asm.emitStore(Kind.Int, Constant.forInt(numSRegs + (numDRegs << 8) + (numStackSlots << 16)), regCountsAddr);
 
             // loop thru the usedValues storing each of the registers that are used.
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/AheadOfTimeCompilationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -66,19 +66,19 @@
     @Test
     public void testStaticFinalObjectAOT() {
         StructuredGraph result = compile("getStaticFinalObject", true);
-        assertEquals(1, getConstantNodes(result).count());
-        assertEquals(getCodeCache().getTarget().wordKind, getConstantNodes(result).first().getKind());
-        assertEquals(2, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(1, getConstantNodes(result).count());
+        assertDeepEquals(getCodeCache().getTarget().wordKind, getConstantNodes(result).first().getKind());
+        assertDeepEquals(2, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     @Test
     public void testStaticFinalObject() {
         StructuredGraph result = compile("getStaticFinalObject", false);
-        assertEquals(1, getConstantNodes(result).count());
-        assertEquals(Kind.Object, getConstantNodes(result).first().getKind());
-        assertEquals(0, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(1, getConstantNodes(result).count());
+        assertDeepEquals(Kind.Object, getConstantNodes(result).first().getKind());
+        assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     public static Class<AheadOfTimeCompilationTest> getClassObject() {
@@ -90,12 +90,12 @@
         StructuredGraph result = compile("getClassObject", true);
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
-        assertEquals(1, filter.count());
+        assertDeepEquals(1, filter.count());
         HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) getMetaAccess().lookupJavaType(AheadOfTimeCompilationTest.class);
-        assertEquals(type.klass(), filter.first().asConstant());
+        assertDeepEquals(type.klass(), filter.first().asConstant());
 
-        assertEquals(1, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(1, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     @Test
@@ -103,13 +103,13 @@
         StructuredGraph result = compile("getClassObject", false);
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
-        assertEquals(1, filter.count());
+        assertDeepEquals(1, filter.count());
         Object mirror = HotSpotObjectConstant.asObject(filter.first().asConstant());
-        assertEquals(Class.class, mirror.getClass());
-        assertEquals(AheadOfTimeCompilationTest.class, mirror);
+        assertDeepEquals(Class.class, mirror.getClass());
+        assertDeepEquals(AheadOfTimeCompilationTest.class, mirror);
 
-        assertEquals(0, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     public static Class<Integer> getPrimitiveClassObject() {
@@ -120,24 +120,24 @@
     public void testPrimitiveClassObjectAOT() {
         StructuredGraph result = compile("getPrimitiveClassObject", true);
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
-        assertEquals(1, filter.count());
-        assertEquals(getCodeCache().getTarget().wordKind, filter.first().getKind());
+        assertDeepEquals(1, filter.count());
+        assertDeepEquals(getCodeCache().getTarget().wordKind, filter.first().getKind());
 
-        assertEquals(2, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(2, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     @Test
     public void testPrimitiveClassObject() {
         StructuredGraph result = compile("getPrimitiveClassObject", false);
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
-        assertEquals(1, filter.count());
+        assertDeepEquals(1, filter.count());
         Object mirror = HotSpotObjectConstant.asObject(filter.first().asConstant());
-        assertEquals(Class.class, mirror.getClass());
-        assertEquals(Integer.TYPE, mirror);
+        assertDeepEquals(Class.class, mirror.getClass());
+        assertDeepEquals(Integer.TYPE, mirror);
 
-        assertEquals(0, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     public static String getStringObject() {
@@ -159,13 +159,13 @@
         StructuredGraph result = compile("getStringObject", compileAOT);
 
         NodeIterable<ConstantNode> filter = getConstantNodes(result);
-        assertEquals(1, filter.count());
+        assertDeepEquals(1, filter.count());
         Object mirror = HotSpotObjectConstant.asObject(filter.first().asConstant());
-        assertEquals(String.class, mirror.getClass());
-        assertEquals("test string", mirror);
+        assertDeepEquals(String.class, mirror.getClass());
+        assertDeepEquals("test string", mirror);
 
-        assertEquals(0, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes().filter(ReadNode.class).count());
+        assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes().filter(ReadNode.class).count());
     }
 
     public static Boolean getBoxedBoolean() {
@@ -177,23 +177,23 @@
     public void testBoxedBooleanAOT() {
         StructuredGraph result = compile("getBoxedBoolean", true);
 
-        assertEquals(2, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(1, result.getNodes(PiNode.class).count());
-        assertEquals(1, getConstantNodes(result).count());
+        assertDeepEquals(2, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(1, result.getNodes(PiNode.class).count());
+        assertDeepEquals(1, getConstantNodes(result).count());
         ConstantNode constant = getConstantNodes(result).first();
-        assertEquals(Kind.Long, constant.getKind());
-        assertEquals(((HotSpotResolvedObjectType) getMetaAccess().lookupJavaType(Boolean.class)).klass(), constant.asConstant());
+        assertDeepEquals(Kind.Long, constant.getKind());
+        assertDeepEquals(((HotSpotResolvedObjectType) getMetaAccess().lookupJavaType(Boolean.class)).klass(), constant.asConstant());
     }
 
     @Test
     public void testBoxedBoolean() {
         StructuredGraph result = compile("getBoxedBoolean", false);
-        assertEquals(0, result.getNodes(FloatingReadNode.class).count());
-        assertEquals(0, result.getNodes(PiNode.class).count());
-        assertEquals(1, getConstantNodes(result).count());
+        assertDeepEquals(0, result.getNodes(FloatingReadNode.class).count());
+        assertDeepEquals(0, result.getNodes(PiNode.class).count());
+        assertDeepEquals(1, getConstantNodes(result).count());
         ConstantNode constant = getConstantNodes(result).first();
-        assertEquals(Kind.Object, constant.getKind());
-        assertEquals(Boolean.TRUE, HotSpotObjectConstant.asObject(constant.asConstant()));
+        assertDeepEquals(Kind.Object, constant.getKind());
+        assertDeepEquals(Boolean.TRUE, HotSpotObjectConstant.asObject(constant.asConstant()));
     }
 
     private StructuredGraph compile(String test, boolean compileAOT) {
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/ExplicitExceptionTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/ExplicitExceptionTest.java	Tue May 13 18:31:18 2014 -0700
@@ -37,7 +37,7 @@
     @Override
     protected InstalledCode getCode(ResolvedJavaMethod method, StructuredGraph graph) {
         InstalledCode installedCode = super.getCode(method, graph);
-        assertEquals(expectedForeignCallCount, graph.getNodes().filter(ForeignCallNode.class).count());
+        assertDeepEquals(expectedForeignCallCount, graph.getNodes().filter(ForeignCallNode.class).count());
         return installedCode;
     }
 
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMethodSubstitutionTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMethodSubstitutionTest.java	Tue May 13 18:31:18 2014 -0700
@@ -45,8 +45,8 @@
 
         Object obj = new Object();
 
-        assertEquals("a string".getClass(), ObjectSubstitutions.getClass("a string"));
-        assertEquals(obj.hashCode(), ObjectSubstitutions.hashCode(obj));
+        assertDeepEquals("a string".getClass(), ObjectSubstitutions.getClass("a string"));
+        assertDeepEquals(obj.hashCode(), ObjectSubstitutions.hashCode(obj));
     }
 
     @SuppressWarnings("all")
@@ -75,14 +75,14 @@
         test("getComponentType");
 
         for (Class<?> c : new Class[]{getClass(), Cloneable.class, int[].class, String[][].class}) {
-            assertEquals(c.getModifiers(), ClassSubstitutions.getModifiers(c));
-            assertEquals(c.isInterface(), ClassSubstitutions.isInterface(c));
-            assertEquals(c.isArray(), ClassSubstitutions.isArray(c));
-            assertEquals(c.isPrimitive(), ClassSubstitutions.isPrimitive(c));
-            assertEquals(c.getSuperclass(), ClassSubstitutions.getSuperclass(c));
-            assertEquals(c.getComponentType(), ClassSubstitutions.getComponentType(c));
+            assertDeepEquals(c.getModifiers(), ClassSubstitutions.getModifiers(c));
+            assertDeepEquals(c.isInterface(), ClassSubstitutions.isInterface(c));
+            assertDeepEquals(c.isArray(), ClassSubstitutions.isArray(c));
+            assertDeepEquals(c.isPrimitive(), ClassSubstitutions.isPrimitive(c));
+            assertDeepEquals(c.getSuperclass(), ClassSubstitutions.getSuperclass(c));
+            assertDeepEquals(c.getComponentType(), ClassSubstitutions.getComponentType(c));
             for (Object o : new Object[]{this, new int[5], new String[2][], new Object()}) {
-                assertEquals(c.isInstance(o), ClassSubstitutions.isInstance(c, o));
+                assertDeepEquals(c.isInstance(o), ClassSubstitutions.isInstance(c, o));
             }
         }
     }
@@ -134,8 +134,8 @@
         test("threadInterrupted");
 
         Thread currentThread = Thread.currentThread();
-        assertEquals(currentThread, ThreadSubstitutions.currentThread());
-        assertEquals(currentThread.isInterrupted(), ThreadSubstitutions.isInterrupted(currentThread, false));
+        assertDeepEquals(currentThread, ThreadSubstitutions.currentThread());
+        assertDeepEquals(currentThread.isInterrupted(), ThreadSubstitutions.isInterrupted(currentThread, false));
     }
 
     @SuppressWarnings("all")
@@ -161,7 +161,7 @@
         SystemSubstitutions.currentTimeMillis();
         SystemSubstitutions.nanoTime();
         for (Object o : new Object[]{this, new int[5], new String[2][], new Object()}) {
-            assertEquals(System.identityHashCode(o), SystemSubstitutions.identityHashCode(o));
+            assertDeepEquals(System.identityHashCode(o), SystemSubstitutions.identityHashCode(o));
         }
     }
 
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMonitorValueTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotMonitorValueTest.java	Tue May 13 18:31:18 2014 -0700
@@ -51,8 +51,8 @@
                         BytecodeFrame caller = frame.caller();
                         assertNotNull(caller);
                         assertNull(caller.caller());
-                        assertEquals(2, frame.numLocks);
-                        assertEquals(2, caller.numLocks);
+                        assertDeepEquals(2, frame.numLocks);
+                        assertDeepEquals(2, caller.numLocks);
                         HotSpotMonitorValue lock1 = (HotSpotMonitorValue) frame.getLockValue(0);
                         HotSpotMonitorValue lock2 = (HotSpotMonitorValue) frame.getLockValue(1);
                         HotSpotMonitorValue lock3 = (HotSpotMonitorValue) caller.getLockValue(0);
@@ -67,7 +67,7 @@
                                 }
                             }
                         }
-                        assertEquals(lock3.getOwner(), lock4.getOwner());
+                        assertDeepEquals(lock3.getOwner(), lock4.getOwner());
                         assertThat(lock1.getOwner(), not(lock2.getOwner()));
                         return super.addMethod(method, compResult);
                     }
--- a/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotNmethodTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot.test/src/com/oracle/graal/hotspot/test/HotSpotNmethodTest.java	Tue May 13 18:31:18 2014 -0700
@@ -43,7 +43,7 @@
         Object result;
         try {
             result = nmethod.executeVarargs(null, "b", "c");
-            assertEquals(43, result);
+            assertDeepEquals(43, result);
         } catch (InvalidInstalledCodeException e) {
             Assert.fail("Code was invalidated");
         }
@@ -66,7 +66,7 @@
         Object result;
         try {
             result = nmethod.executeVarargs(nmethod, null, null);
-            assertEquals(43, result);
+            assertDeepEquals(43, result);
         } catch (InvalidInstalledCodeException e) {
             Assert.fail("Code was invalidated");
         }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java	Tue May 13 18:31:18 2014 -0700
@@ -1033,9 +1033,9 @@
     @HotSpotVMField(name = "HSAILFrame::_pc_offset", type = "jint", get = HotSpotVMField.Type.OFFSET) @Stable public int hsailFramePcOffset;
     @HotSpotVMField(name = "HSAILFrame::_num_s_regs", type = "jbyte", get = HotSpotVMField.Type.OFFSET) @Stable public int hsailFrameNumSRegOffset;
     @HotSpotVMField(name = "HSAILFrame::_num_d_regs", type = "jbyte", get = HotSpotVMField.Type.OFFSET) @Stable public int hsailFrameNumDRegOffset;
-    @HotSpotVMConstant(name = "sizeof(HSAILFrame)") @Stable public int hsailFrameHeaderSize;
-    @HotSpotVMConstant(name = "sizeof(Hsail::HSAILKernelDeoptimization)") @Stable public int hsailKernelDeoptimizationHeaderSize;
-    @HotSpotVMField(name = "Hsail::HSAILDeoptimizationInfo::_deopt_save_states[0]", type = "Hsail::HSAILKernelDeoptimization", get = HotSpotVMField.Type.OFFSET) @Stable public int hsailSaveStatesOffset0;
+    @HotSpotVMType(name = "HSAILFrame", get = HotSpotVMType.Type.SIZE) @Stable public int hsailFrameHeaderSize;
+    @HotSpotVMType(name = "Hsail::HSAILKernelDeoptimization", get = HotSpotVMType.Type.SIZE) @Stable public int hsailKernelDeoptimizationHeaderSize;
+    @HotSpotVMType(name = "Hsail::HSAILDeoptimizationInfo", get = HotSpotVMType.Type.SIZE) @Stable public int hsailDeoptimizationInfoHeaderSize;
 
     /**
      * Mark word right shift to get identity hash code.
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConstant.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConstant.java	Tue May 13 18:31:18 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,10 +24,18 @@
 
 import java.lang.annotation.*;
 
+/**
+ * Refers to a C++ constant in the VM.
+ */
 @Target(ElementType.FIELD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface HotSpotVMConstant {
 
+    /**
+     * Returns the name of the constant.
+     *
+     * @return name of constant
+     */
     String name();
 
     /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMField.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMField.java	Tue May 13 18:31:18 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,21 +24,53 @@
 
 import java.lang.annotation.*;
 
+/**
+ * Refers to a C++ field in the VM.
+ */
 @Target(ElementType.FIELD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface HotSpotVMField {
 
+    /**
+     * Types of information this annotation can return.
+     */
     enum Type {
+        /**
+         * Returns the offset of this field within the type. Only valid for instance fields.
+         */
         OFFSET,
+
+        /**
+         * Returns the absolute address of this field. Only valid for static fields.
+         */
         ADDRESS,
+
+        /**
+         * Returns the value of this field. Only valid for static fields.
+         */
         VALUE;
     }
 
-    String name();
+    /**
+     * Specifies what type of information to return.
+     *
+     * @see Type
+     */
+    Type get();
 
+    /**
+     * Returns the type name containing this field.
+     *
+     * @return name of containing type
+     */
     String type();
 
-    Type get();
+    /**
+     * Returns the name of this field.
+     *
+     * @return name of field
+     */
+    String name();
 
     /**
      * List of architectures where this constant is required. Names are derived from
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMFlag.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMFlag.java	Tue May 13 18:31:18 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,10 +24,18 @@
 
 import java.lang.annotation.*;
 
+/**
+ * Refers to a C++ flag in the VM.
+ */
 @Target(ElementType.FIELD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface HotSpotVMFlag {
 
+    /**
+     * Returns the name of this flag.
+     *
+     * @return name of flag.
+     */
     String name();
 
     /**
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMType.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMType.java	Tue May 13 18:31:18 2014 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -24,15 +24,34 @@
 
 import java.lang.annotation.*;
 
+/**
+ * Refers to a C++ type in the VM.
+ */
 @Target(ElementType.FIELD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface HotSpotVMType {
 
+    /**
+     * Types of information this annotation can return.
+     */
     enum Type {
+        /**
+         * Returns the size of the type (C++ {@code sizeof()}).
+         */
         SIZE;
     }
 
-    String name();
+    /**
+     * Specifies what type of information to return.
+     *
+     * @see Type
+     */
+    Type get();
 
-    Type get();
+    /**
+     * Returns the name of the type.
+     *
+     * @return name of type
+     */
+    String name();
 }
--- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/JTTTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/JTTTest.java	Tue May 13 18:31:18 2014 -0700
@@ -80,11 +80,11 @@
     Double delta;
 
     @Override
-    protected void assertEquals(Object expected, Object actual) {
+    protected void assertDeepEquals(Object expected, Object actual) {
         if (delta != null) {
             Assert.assertEquals(((Number) expected).doubleValue(), ((Number) actual).doubleValue(), delta);
         } else {
-            super.assertEquals(expected, actual);
+            super.assertDeepEquals(expected, actual);
         }
     }
 
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/FrameStateAssignmentPhase.java	Tue May 13 18:31:18 2014 -0700
@@ -109,6 +109,7 @@
         if (graph.getGuardsStage().ordinal() < GuardsStage.AFTER_FSA.ordinal()) {
             ReentrantNodeIterator.apply(new FrameStateAssignmentClosure(), graph.start(), null);
             graph.setGuardsStage(GuardsStage.AFTER_FSA);
+            graph.getNodes(FrameState.class).filter(state -> state.usages().isEmpty()).forEach(GraphUtil::killWithUnusedFloatingInputs);
         }
     }
 
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/ComputeInliningRelevance.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/ComputeInliningRelevance.java	Tue May 13 18:31:18 2014 -0700
@@ -230,7 +230,7 @@
             assert !Double.isNaN(invokeProbability);
 
             double relevance = (invokeProbability / getFastPathMinProbability()) * Math.min(1.0, getScopeRelevanceWithinParent());
-            assert !Double.isNaN(relevance);
+            assert !Double.isNaN(relevance) : invoke + ": " + relevance + " / " + invokeProbability + " / " + getFastPathMinProbability() + " / " + getScopeRelevanceWithinParent();
             return relevance;
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/DepthSearchUtil.java	Tue May 13 18:31:18 2014 -0700
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.phases.common.inlining;
+
+import com.oracle.graal.api.meta.Constant;
+import com.oracle.graal.api.meta.ResolvedJavaMethod;
+import com.oracle.graal.compiler.common.type.Stamp;
+import com.oracle.graal.debug.Debug;
+import com.oracle.graal.graph.NodeInputList;
+import com.oracle.graal.nodes.*;
+import com.oracle.graal.phases.common.CanonicalizerPhase;
+import com.oracle.graal.phases.common.DeadCodeEliminationPhase;
+import com.oracle.graal.phases.tiers.HighTierContext;
+
+import static com.oracle.graal.compiler.common.GraalOptions.OptCanonicalizer;
+
+/**
+ * The workings of {@link InliningPhase#run(StructuredGraph, HighTierContext)} include delving into
+ * a callsite to explore inlining opportunities. The utilities used for that are grouped in this
+ * class.
+ */
+public class DepthSearchUtil {
+
+    private DepthSearchUtil() {
+        // no instances
+    }
+
+    static InliningUtil.Inlineable getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, HighTierContext context, CanonicalizerPhase canonicalizer) {
+        Class<? extends FixedWithNextNode> macroNodeClass = InliningUtil.getMacroNodeClass(context.getReplacements(), method);
+        if (macroNodeClass != null) {
+            return new InliningUtil.InlineableMacroNode(macroNodeClass);
+        } else {
+            return new InliningUtil.InlineableGraph(buildGraph(method, invoke, context, canonicalizer));
+        }
+    }
+
+    private static StructuredGraph buildGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context, CanonicalizerPhase canonicalizer) {
+        final StructuredGraph newGraph;
+        final boolean parseBytecodes;
+
+        // TODO (chaeubl): copying the graph is only necessary if it is modified or if it contains
+        // any invokes
+        StructuredGraph intrinsicGraph = InliningUtil.getIntrinsicGraph(context.getReplacements(), method);
+        if (intrinsicGraph != null) {
+            newGraph = intrinsicGraph.copy();
+            parseBytecodes = false;
+        } else {
+            StructuredGraph cachedGraph = getCachedGraph(method, context);
+            if (cachedGraph != null) {
+                newGraph = cachedGraph.copy();
+                parseBytecodes = false;
+            } else {
+                newGraph = new StructuredGraph(method);
+                parseBytecodes = true;
+            }
+        }
+
+        try (Debug.Scope s = Debug.scope("InlineGraph", newGraph)) {
+            if (parseBytecodes) {
+                parseBytecodes(newGraph, context, canonicalizer);
+            }
+
+            boolean callerHasMoreInformationAboutArguments = false;
+            NodeInputList<ValueNode> args = invoke.callTarget().arguments();
+            for (ParameterNode param : newGraph.getNodes(ParameterNode.class).snapshot()) {
+                ValueNode arg = args.get(param.index());
+                if (arg.isConstant()) {
+                    Constant constant = arg.asConstant();
+                    newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph));
+                    callerHasMoreInformationAboutArguments = true;
+                } else {
+                    Stamp joinedStamp = param.stamp().join(arg.stamp());
+                    if (joinedStamp != null && !joinedStamp.equals(param.stamp())) {
+                        param.setStamp(joinedStamp);
+                        callerHasMoreInformationAboutArguments = true;
+                    }
+                }
+            }
+
+            if (!callerHasMoreInformationAboutArguments) {
+                // TODO (chaeubl): if args are not more concrete, inlining should be avoided
+                // in most cases or we could at least use the previous graph size + invoke
+                // probability to check the inlining
+            }
+
+            if (OptCanonicalizer.getValue()) {
+                canonicalizer.apply(newGraph, context);
+            }
+
+            return newGraph;
+        } catch (Throwable e) {
+            throw Debug.handle(e);
+        }
+    }
+
+    private static StructuredGraph getCachedGraph(ResolvedJavaMethod method, HighTierContext context) {
+        if (context.getGraphCache() != null) {
+            StructuredGraph cachedGraph = context.getGraphCache().get(method);
+            if (cachedGraph != null) {
+                return cachedGraph;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * This method builds the IR nodes for <code>newGraph</code> and canonicalizes them. Provided
+     * profiling info is mature, the resulting graph is cached.
+     */
+    private static StructuredGraph parseBytecodes(StructuredGraph newGraph, HighTierContext context, CanonicalizerPhase canonicalizer) {
+        final boolean hasMatureProfilingInfo = newGraph.method().getProfilingInfo().isMature();
+
+        if (context.getGraphBuilderSuite() != null) {
+            context.getGraphBuilderSuite().apply(newGraph, context);
+        }
+        assert newGraph.start().next() != null : "graph needs to be populated during PhasePosition.AFTER_PARSING";
+
+        new DeadCodeEliminationPhase().apply(newGraph);
+
+        if (OptCanonicalizer.getValue()) {
+            canonicalizer.apply(newGraph, context);
+        }
+
+        if (hasMatureProfilingInfo && context.getGraphCache() != null) {
+            context.getGraphCache().put(newGraph.method(), newGraph.copy());
+        }
+        return newGraph;
+    }
+}
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningPhase.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/inlining/InliningPhase.java	Tue May 13 18:31:18 2014 -0700
@@ -31,7 +31,6 @@
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.*;
-import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.debug.Debug.Scope;
 import com.oracle.graal.graph.Graph.Mark;
@@ -93,14 +92,75 @@
         return inliningCount;
     }
 
+    /**
+     * <p>
+     * The space of inlining decisions is explored depth-first with the help of a stack realized by
+     * {@link InliningData}. At any point in time, its topmost element consist of:
+     * <ul>
+     * <li>
+     * one or more {@link GraphInfo}s of inlining candidates, all of them corresponding to a single
+     * callsite (details below). For example, "exact inline" leads to a single candidate.</li>
+     * <li>
+     * the callsite (for the targets above) is tracked as a {@link MethodInvocation}. The difference
+     * between {@link MethodInvocation#totalGraphs()} and {@link MethodInvocation#processedGraphs()}
+     * indicates the topmost {@link GraphInfo}s that might be delved-into to explore inlining
+     * opportunities.</li>
+     * </ul>
+     * </p>
+     *
+     * <p>
+     * The bottom-most element in the stack consists of:
+     * <ul>
+     * <li>
+     * a single {@link GraphInfo} (the root one, for the method on which inlining was called)</li>
+     * <li>
+     * a single {@link MethodInvocation} (the {@link MethodInvocation#isRoot} one, ie the unknown
+     * caller of the root graph)</li>
+     * </ul>
+     *
+     * </p>
+     *
+     * <p>
+     * The stack grows and shrinks as choices are made among the alternatives below:
+     * <ol>
+     * <li>
+     * not worth inlining: pop any remaining graphs not yet delved into, pop the current invocation.
+     * </li>
+     * <li>
+     * process next invoke: delve into one of the callsites hosted in the current candidate graph,
+     * determine whether any inlining should be performed in it</li>
+     * <li>
+     * try to inline: move past the current inlining candidate (remove it from the topmost element).
+     * If that was the last one then try to inline the callsite that is (still) in the topmost
+     * element of {@link InliningData}, and then remove such callsite.</li>
+     * </ol>
+     * </p>
+     *
+     * <p>
+     * Some facts about the alternatives above:
+     * <ul>
+     * <li>
+     * the first step amounts to backtracking, the 2nd one to delving, and the 3rd one also involves
+     * bakctraking (however after may-be inlining).</li>
+     * <li>
+     * the choice of abandon-and-backtrack or delve-into is depends on
+     * {@link InliningPolicy#isWorthInlining} and {@link InliningPolicy#continueInlining}.</li>
+     * <li>
+     * the 3rd choice is picked when both of the previous one aren't picked</li>
+     * <li>
+     * as part of trying-to-inline, {@link InliningPolicy#isWorthInlining} again sees use, but
+     * that's another story.</li>
+     * </ul>
+     * </p>
+     *
+     */
     @Override
     protected void run(final StructuredGraph graph, final HighTierContext context) {
-        final InliningData data = new InliningData(graph, context.getAssumptions());
+        final InliningData data = new InliningData(graph, context.getAssumptions(), maxMethodPerInlining, canonicalizer);
         ToDoubleFunction<FixedNode> probabilities = new FixedNodeProbabilityCache();
 
         while (data.hasUnprocessedGraphs()) {
             final MethodInvocation currentInvocation = data.currentInvocation();
-            GraphInfo graphInfo = data.currentGraph();
             if (!currentInvocation.isRoot() &&
                             !inliningPolicy.isWorthInlining(probabilities, context.getReplacements(), currentInvocation.callee(), data.inliningDepth(), currentInvocation.probability(),
                                             currentInvocation.relevance(), false)) {
@@ -108,8 +168,8 @@
                 assert remainingGraphs > 0;
                 data.popGraphs(remainingGraphs);
                 data.popInvocation();
-            } else if (graphInfo.hasRemainingInvokes() && inliningPolicy.continueInlining(graphInfo.graph())) {
-                processNextInvoke(data, graphInfo, context);
+            } else if (data.currentGraph().hasRemainingInvokes() && inliningPolicy.continueInlining(data.currentGraph().graph())) {
+                data.processNextInvoke(context);
             } else {
                 data.popGraph();
                 if (!currentInvocation.isRoot()) {
@@ -132,33 +192,6 @@
         assert data.graphCount() == 0;
     }
 
-    /**
-     * Process the next invoke and enqueue all its graphs for processing.
-     */
-    private void processNextInvoke(InliningData data, GraphInfo graphInfo, HighTierContext context) {
-        Invoke invoke = graphInfo.popInvoke();
-        MethodInvocation callerInvocation = data.currentInvocation();
-        Assumptions parentAssumptions = callerInvocation.assumptions();
-        InlineInfo info = InliningUtil.getInlineInfo(data, invoke, maxMethodPerInlining, context.getReplacements(), parentAssumptions, context.getOptimisticOptimizations());
-
-        if (info != null) {
-            double invokeProbability = graphInfo.invokeProbability(invoke);
-            double invokeRelevance = graphInfo.invokeRelevance(invoke);
-            MethodInvocation calleeInvocation = data.pushInvocation(info, parentAssumptions, invokeProbability, invokeRelevance);
-
-            for (int i = 0; i < info.numberOfMethods(); i++) {
-                Inlineable elem = getInlineableElement(info.methodAt(i), info.invoke(), context.replaceAssumptions(calleeInvocation.assumptions()));
-                info.setInlinableElement(i, elem);
-                if (elem instanceof InlineableGraph) {
-                    data.pushGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i));
-                } else {
-                    assert elem instanceof InlineableMacroNode;
-                    data.pushDummyGraph();
-                }
-            }
-        }
-    }
-
     private void tryToInline(ToDoubleFunction<FixedNode> probabilities, GraphInfo callerGraphInfo, MethodInvocation calleeInfo, MethodInvocation parentInvocation, int inliningDepth,
                     HighTierContext context) {
         InlineInfo callee = calleeInfo.callee();
@@ -210,104 +243,6 @@
         }
     }
 
-    private Inlineable getInlineableElement(final ResolvedJavaMethod method, Invoke invoke, HighTierContext context) {
-        Class<? extends FixedWithNextNode> macroNodeClass = InliningUtil.getMacroNodeClass(context.getReplacements(), method);
-        if (macroNodeClass != null) {
-            return new InlineableMacroNode(macroNodeClass);
-        } else {
-            return new InlineableGraph(buildGraph(method, invoke, context));
-        }
-    }
-
-    private StructuredGraph buildGraph(final ResolvedJavaMethod method, final Invoke invoke, final HighTierContext context) {
-        final StructuredGraph newGraph;
-        final boolean parseBytecodes;
-
-        // TODO (chaeubl): copying the graph is only necessary if it is modified or if it contains
-        // any invokes
-        StructuredGraph intrinsicGraph = InliningUtil.getIntrinsicGraph(context.getReplacements(), method);
-        if (intrinsicGraph != null) {
-            newGraph = intrinsicGraph.copy();
-            parseBytecodes = false;
-        } else {
-            StructuredGraph cachedGraph = getCachedGraph(method, context);
-            if (cachedGraph != null) {
-                newGraph = cachedGraph.copy();
-                parseBytecodes = false;
-            } else {
-                newGraph = new StructuredGraph(method);
-                parseBytecodes = true;
-            }
-        }
-
-        try (Scope s = Debug.scope("InlineGraph", newGraph)) {
-            if (parseBytecodes) {
-                parseBytecodes(newGraph, context);
-            }
-
-            boolean callerHasMoreInformationAboutArguments = false;
-            NodeInputList<ValueNode> args = invoke.callTarget().arguments();
-            for (ParameterNode param : newGraph.getNodes(ParameterNode.class).snapshot()) {
-                ValueNode arg = args.get(param.index());
-                if (arg.isConstant()) {
-                    Constant constant = arg.asConstant();
-                    newGraph.replaceFloating(param, ConstantNode.forConstant(constant, context.getMetaAccess(), newGraph));
-                    callerHasMoreInformationAboutArguments = true;
-                } else {
-                    Stamp joinedStamp = param.stamp().join(arg.stamp());
-                    if (joinedStamp != null && !joinedStamp.equals(param.stamp())) {
-                        param.setStamp(joinedStamp);
-                        callerHasMoreInformationAboutArguments = true;
-                    }
-                }
-            }
-
-            if (!callerHasMoreInformationAboutArguments) {
-                // TODO (chaeubl): if args are not more concrete, inlining should be avoided
-                // in most cases or we could at least use the previous graph size + invoke
-                // probability to check the inlining
-            }
-
-            if (OptCanonicalizer.getValue()) {
-                canonicalizer.apply(newGraph, context);
-            }
-
-            return newGraph;
-        } catch (Throwable e) {
-            throw Debug.handle(e);
-        }
-    }
-
-    private static StructuredGraph getCachedGraph(ResolvedJavaMethod method, HighTierContext context) {
-        if (context.getGraphCache() != null) {
-            StructuredGraph cachedGraph = context.getGraphCache().get(method);
-            if (cachedGraph != null) {
-                return cachedGraph;
-            }
-        }
-        return null;
-    }
-
-    private StructuredGraph parseBytecodes(StructuredGraph newGraph, HighTierContext context) {
-        boolean hasMatureProfilingInfo = newGraph.method().getProfilingInfo().isMature();
-
-        if (context.getGraphBuilderSuite() != null) {
-            context.getGraphBuilderSuite().apply(newGraph, context);
-        }
-        assert newGraph.start().next() != null : "graph needs to be populated during PhasePosition.AFTER_PARSING";
-
-        new DeadCodeEliminationPhase().apply(newGraph);
-
-        if (OptCanonicalizer.getValue()) {
-            canonicalizer.apply(newGraph, context);
-        }
-
-        if (hasMatureProfilingInfo && context.getGraphCache() != null) {
-            context.getGraphCache().put(newGraph.method(), newGraph.copy());
-        }
-        return newGraph;
-    }
-
     private abstract static class AbstractInliningPolicy implements InliningPolicy {
 
         protected final Map<Invoke, Double> hints;
@@ -490,18 +425,50 @@
          */
         private final ArrayDeque<GraphInfo> graphQueue;
         private final ArrayDeque<MethodInvocation> invocationQueue;
+        private final int maxMethodPerInlining;
+        private final CanonicalizerPhase canonicalizer;
 
         private int maxGraphs;
 
-        public InliningData(StructuredGraph rootGraph, Assumptions rootAssumptions) {
+        public InliningData(StructuredGraph rootGraph, Assumptions rootAssumptions, int maxMethodPerInlining, CanonicalizerPhase canonicalizer) {
             this.graphQueue = new ArrayDeque<>();
             this.invocationQueue = new ArrayDeque<>();
+            this.maxMethodPerInlining = maxMethodPerInlining;
+            this.canonicalizer = canonicalizer;
             this.maxGraphs = 1;
 
             invocationQueue.push(new MethodInvocation(null, rootAssumptions, 1.0, 1.0));
             pushGraph(rootGraph, 1.0, 1.0);
         }
 
+        /**
+         * Process the next invoke and enqueue all its graphs for processing.
+         */
+        void processNextInvoke(HighTierContext context) {
+            GraphInfo graphInfo = currentGraph();
+            Invoke invoke = graphInfo.popInvoke();
+            MethodInvocation callerInvocation = currentInvocation();
+            Assumptions parentAssumptions = callerInvocation.assumptions();
+            InlineInfo info = InliningUtil.getInlineInfo(this, invoke, maxMethodPerInlining, context.getReplacements(), parentAssumptions, context.getOptimisticOptimizations());
+
+            if (info != null) {
+                double invokeProbability = graphInfo.invokeProbability(invoke);
+                double invokeRelevance = graphInfo.invokeRelevance(invoke);
+                MethodInvocation calleeInvocation = pushInvocation(info, parentAssumptions, invokeProbability, invokeRelevance);
+
+                for (int i = 0; i < info.numberOfMethods(); i++) {
+                    Inlineable elem = DepthSearchUtil.getInlineableElement(info.methodAt(i), info.invoke(), context.replaceAssumptions(calleeInvocation.assumptions()), canonicalizer);
+                    info.setInlinableElement(i, elem);
+                    if (elem instanceof InlineableGraph) {
+                        pushGraph(((InlineableGraph) elem).getGraph(), invokeProbability * info.probabilityAt(i), invokeRelevance * info.relevanceAt(i));
+                    } else {
+                        assert elem instanceof InlineableMacroNode;
+                        pushDummyGraph();
+                    }
+                }
+            }
+        }
+
         public int graphCount() {
             return graphQueue.size();
         }
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/ArraysSubstitutionsTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/ArraysSubstitutionsTest.java	Tue May 13 18:31:18 2014 -0700
@@ -79,9 +79,9 @@
             Object arg1 = args1[i];
             Object arg2 = args2[i];
             // Verify that the original method and the substitution produce the same value
-            assertEquals(invokeSafe(testMethod, null, arg1, arg2), invokeSafe(realMethod, null, arg1, arg2));
+            assertDeepEquals(invokeSafe(testMethod, null, arg1, arg2), invokeSafe(realMethod, null, arg1, arg2));
             // Verify that the generated code and the original produce the same value
-            assertEquals(executeVarargsSafe(code, arg1, arg2), invokeSafe(realMethod, null, arg1, arg2));
+            assertDeepEquals(executeVarargsSafe(code, arg1, arg2), invokeSafe(realMethod, null, arg1, arg2));
         }
     }
 
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/NewArrayTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/NewArrayTest.java	Tue May 13 18:31:18 2014 -0700
@@ -32,10 +32,10 @@
 public class NewArrayTest extends GraalCompilerTest {
 
     @Override
-    protected void assertEquals(Object expected, Object actual) {
+    protected void assertDeepEquals(Object expected, Object actual) {
         Assert.assertTrue(expected != null);
         Assert.assertTrue(actual != null);
-        super.assertEquals(expected.getClass(), actual.getClass());
+        super.assertDeepEquals(expected.getClass(), actual.getClass());
         if (expected instanceof int[]) {
             Assert.assertArrayEquals((int[]) expected, (int[]) actual);
         } else if (expected instanceof byte[]) {
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/NewInstanceTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/NewInstanceTest.java	Tue May 13 18:31:18 2014 -0700
@@ -34,10 +34,10 @@
 public class NewInstanceTest extends GraalCompilerTest {
 
     @Override
-    protected void assertEquals(Object expected, Object actual) {
+    protected void assertDeepEquals(Object expected, Object actual) {
         Assert.assertTrue(expected != null);
         Assert.assertTrue(actual != null);
-        super.assertEquals(expected.getClass(), actual.getClass());
+        super.assertDeepEquals(expected.getClass(), actual.getClass());
 
         if (expected instanceof Object[]) {
             Assert.assertTrue(actual instanceof Object[]);
@@ -45,12 +45,12 @@
             Object[] aArr = (Object[]) actual;
             Assert.assertTrue(eArr.length == aArr.length);
             for (int i = 0; i < eArr.length; i++) {
-                assertEquals(eArr[i], aArr[i]);
+                assertDeepEquals(eArr[i], aArr[i]);
             }
         } else if (expected.getClass() != Object.class) {
             try {
                 expected.getClass().getDeclaredMethod("equals", Object.class);
-                super.assertEquals(expected, actual);
+                super.assertDeepEquals(expected, actual);
             } catch (Exception e) {
             }
         }
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/StandardMethodSubstitutionsTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/StandardMethodSubstitutionsTest.java	Tue May 13 18:31:18 2014 -0700
@@ -44,12 +44,12 @@
         test("math");
 
         double value = 34567.891D;
-        assertEquals(Math.sqrt(value), MathSubstitutionsX86.sqrt(value));
-        assertEquals(Math.log(value), MathSubstitutionsX86.log(value));
-        assertEquals(Math.log10(value), MathSubstitutionsX86.log10(value));
-        assertEquals(Math.sin(value), MathSubstitutionsX86.sin(value));
-        assertEquals(Math.cos(value), MathSubstitutionsX86.cos(value));
-        assertEquals(Math.tan(value), MathSubstitutionsX86.tan(value));
+        assertDeepEquals(Math.sqrt(value), MathSubstitutionsX86.sqrt(value));
+        assertDeepEquals(Math.log(value), MathSubstitutionsX86.log(value));
+        assertDeepEquals(Math.log10(value), MathSubstitutionsX86.log10(value));
+        assertDeepEquals(Math.sin(value), MathSubstitutionsX86.sin(value));
+        assertDeepEquals(Math.cos(value), MathSubstitutionsX86.cos(value));
+        assertDeepEquals(Math.tan(value), MathSubstitutionsX86.tan(value));
     }
 
     @SuppressWarnings("all")
@@ -98,9 +98,9 @@
         assert optional || code != null;
         for (Object l : args) {
             // Verify that the original method and the substitution produce the same value
-            assertEquals(invokeSafe(testMethod, l), invokeSafe(realMethod, l));
+            assertDeepEquals(invokeSafe(testMethod, l), invokeSafe(realMethod, l));
             // Verify that the generated code and the original produce the same value
-            assertEquals(executeVarargsSafe(code, l), invokeSafe(realMethod, l));
+            assertDeepEquals(executeVarargsSafe(code, l), invokeSafe(realMethod, l));
         }
     }
 
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/StringSubstitutionsTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/StringSubstitutionsTest.java	Tue May 13 18:31:18 2014 -0700
@@ -73,9 +73,9 @@
             Object arg1 = args1[i];
             Object arg2 = args2[i];
             // Verify that the original method and the substitution produce the same value
-            assertEquals(invokeSafe(testMethod, null, arg1, arg2), invokeSafe(realMethod, arg1, arg2));
+            assertDeepEquals(invokeSafe(testMethod, null, arg1, arg2), invokeSafe(realMethod, arg1, arg2));
             // Verify that the generated code and the original produce the same value
-            assertEquals(executeVarargsSafe(code, arg1, arg2), invokeSafe(realMethod, arg1, arg2));
+            assertDeepEquals(executeVarargsSafe(code, arg1, arg2), invokeSafe(realMethod, arg1, arg2));
         }
     }
 
--- a/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/UnsafeSubstitutionsTest.java	Tue May 13 18:31:18 2014 -0700
@@ -69,14 +69,14 @@
         {
             Object expected = invokeSafe(originalMethod, receiver, args1);
             Object actual = invokeSafe(testMethod, null, args2);
-            assertEquals(expected, actual);
+            assertDeepEquals(expected, actual);
         }
 
         // Verify that the generated code and the original produce the same value
         {
             Object expected = invokeSafe(originalMethod, receiver, args1);
             Object actual = executeVarargsSafe(code, args2);
-            assertEquals(expected, actual);
+            assertDeepEquals(expected, actual);
         }
     }
 
@@ -201,18 +201,18 @@
 
         AtomicInteger a1 = new AtomicInteger(42);
         AtomicInteger a2 = new AtomicInteger(42);
-        assertEquals(unsafe.compareAndSwapInt(a1, off(a1, "value"), 42, 53), compareAndSwapInt(unsafe, a2, off(a2, "value"), 42, 53));
-        assertEquals(a1.get(), a2.get());
+        assertDeepEquals(unsafe.compareAndSwapInt(a1, off(a1, "value"), 42, 53), compareAndSwapInt(unsafe, a2, off(a2, "value"), 42, 53));
+        assertDeepEquals(a1.get(), a2.get());
 
         AtomicLong l1 = new AtomicLong(42);
         AtomicLong l2 = new AtomicLong(42);
-        assertEquals(unsafe.compareAndSwapLong(l1, off(l1, "value"), 42, 53), compareAndSwapLong(unsafe, l2, off(l2, "value"), 42, 53));
-        assertEquals(l1.get(), l2.get());
+        assertDeepEquals(unsafe.compareAndSwapLong(l1, off(l1, "value"), 42, 53), compareAndSwapLong(unsafe, l2, off(l2, "value"), 42, 53));
+        assertDeepEquals(l1.get(), l2.get());
 
         AtomicReference<String> o1 = new AtomicReference<>("42");
         AtomicReference<String> o2 = new AtomicReference<>("42");
-        assertEquals(unsafe.compareAndSwapObject(o1, off(o1, "value"), "42", "53"), compareAndSwapObject(unsafe, o2, off(o2, "value"), "42", "53"));
-        assertEquals(o1.get(), o2.get());
+        assertDeepEquals(unsafe.compareAndSwapObject(o1, off(o1, "value"), "42", "53"), compareAndSwapObject(unsafe, o2, off(o2, "value"), "42", "53"));
+        assertDeepEquals(o1.get(), o2.get());
 
         Foo f1 = new Foo();
         f1.test("z", "Boolean", Boolean.TRUE);
--- a/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalTest.java	Tue May 13 18:31:18 2014 -0700
@@ -22,15 +22,17 @@
  */
 package com.oracle.graal.test;
 
+import java.io.*;
 import java.lang.reflect.*;
 import java.util.*;
 
 import org.junit.*;
+import org.junit.internal.*;
 
 /**
  * Base class for Graal tests.
  * <p>
- * This contains common utility methods that are used in multiple test projects.
+ * This contains common utility methods and classes that are used in tests.
  */
 public class GraalTest {
 
@@ -69,4 +71,118 @@
             throw new RuntimeException("method not found: " + methodName + "" + Arrays.toString(parameterTypes));
         }
     }
+
+    /**
+     * Compares two given objects for {@linkplain Assert#assertEquals(Object, Object) equality}.
+     * Does a deep copy equality comparison if {@code expected} is an array.
+     */
+    protected void assertDeepEquals(Object expected, Object actual) {
+        assertDeepEquals(null, expected, actual);
+    }
+
+    /**
+     * Compares two given objects for {@linkplain Assert#assertEquals(Object, Object) equality}.
+     * Does a deep copy equality comparison if {@code expected} is an array.
+     *
+     * @param message the identifying message for the {@link AssertionError}
+     */
+    protected void assertDeepEquals(String message, Object expected, Object actual) {
+        assertDeepEquals(message, expected, actual, equalFloatsOrDoublesDelta());
+    }
+
+    /**
+     * Compares two given values for equality, doing a recursive test if both values are arrays of
+     * the same type.
+     *
+     * @param message the identifying message for the {@link AssertionError}
+     * @param delta the maximum delta between two doubles or floats for which both numbers are still
+     *            considered equal.
+     */
+    protected void assertDeepEquals(String message, Object expected, Object actual, double delta) {
+        if (expected != null && actual != null) {
+            Class<?> expectedClass = expected.getClass();
+            Class<?> actualClass = actual.getClass();
+            if (expectedClass.isArray()) {
+                Assert.assertTrue(message, expected != null);
+                Assert.assertTrue(message, actual != null);
+                Assert.assertEquals(message, expectedClass, actual.getClass());
+                if (expected instanceof int[]) {
+                    Assert.assertArrayEquals(message, (int[]) expected, (int[]) actual);
+                } else if (expected instanceof byte[]) {
+                    Assert.assertArrayEquals(message, (byte[]) expected, (byte[]) actual);
+                } else if (expected instanceof char[]) {
+                    Assert.assertArrayEquals(message, (char[]) expected, (char[]) actual);
+                } else if (expected instanceof short[]) {
+                    Assert.assertArrayEquals(message, (short[]) expected, (short[]) actual);
+                } else if (expected instanceof float[]) {
+                    Assert.assertArrayEquals(message, (float[]) expected, (float[]) actual, (float) delta);
+                } else if (expected instanceof long[]) {
+                    Assert.assertArrayEquals(message, (long[]) expected, (long[]) actual);
+                } else if (expected instanceof double[]) {
+                    Assert.assertArrayEquals(message, (double[]) expected, (double[]) actual, delta);
+                } else if (expected instanceof boolean[]) {
+                    new ExactComparisonCriteria().arrayEquals(message, expected, actual);
+                } else if (expected instanceof Object[]) {
+                    new ComparisonCriteria() {
+                        @Override
+                        protected void assertElementsEqual(Object e, Object a) {
+                            assertDeepEquals(message, e, a, delta);
+                        }
+                    }.arrayEquals(message, expected, actual);
+                } else {
+                    Assert.fail((message == null ? "" : message) + "non-array value encountered: " + expected);
+                }
+            } else if (expectedClass.equals(double.class) && actualClass.equals(double.class)) {
+                Assert.assertEquals((double) expected, (double) actual, delta);
+            } else if (expectedClass.equals(float.class) && actualClass.equals(float.class)) {
+                Assert.assertEquals((float) expected, (float) actual, delta);
+            }
+        } else {
+            Assert.assertEquals(message, expected, actual);
+        }
+    }
+
+    /**
+     * Gets the value used by {@link #assertDeepEquals(Object, Object)} and
+     * {@link #assertDeepEquals(String, Object, Object)} for the maximum delta between two doubles
+     * or floats for which both numbers are still considered equal.
+     */
+    protected double equalFloatsOrDoublesDelta() {
+        return 0.0D;
+    }
+
+    @SuppressWarnings("serial")
+    public static class MultiCauseAssertionError extends AssertionError {
+
+        private Throwable[] causes;
+
+        public MultiCauseAssertionError(String message, Throwable... causes) {
+            super(message);
+            this.causes = causes;
+        }
+
+        @Override
+        public void printStackTrace(PrintStream out) {
+            super.printStackTrace(out);
+            int num = 0;
+            for (Throwable cause : causes) {
+                if (cause != null) {
+                    out.print("cause " + (num++));
+                    cause.printStackTrace(out);
+                }
+            }
+        }
+
+        @Override
+        public void printStackTrace(PrintWriter out) {
+            super.printStackTrace(out);
+            int num = 0;
+            for (Throwable cause : causes) {
+                if (cause != null) {
+                    out.print("cause " + (num++) + ": ");
+                    cause.printStackTrace(out);
+                }
+            }
+        }
+    }
 }
--- a/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.test/src/com/oracle/graal/test/GraalVerboseTextListener.java	Tue May 13 18:31:18 2014 -0700
@@ -65,7 +65,8 @@
 
     @Override
     public void testFailed(Failure failure) {
-        getWriter().print("FAILED");
+        getWriter().println("FAILED");
+        failure.getException().printStackTrace(getWriter());
     }
 
     @Override
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/AssumptionPartialEvaluationTest.java	Tue May 13 18:29:55 2014 -0700
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/AssumptionPartialEvaluationTest.java	Tue May 13 18:31:18 2014 -0700
@@ -46,7 +46,7 @@
         InstalledCode installedCode = assertPartialEvalEquals("constant42", rootNode);
         Assert.assertTrue(installedCode.isValid());
         try {
-            assertEquals(42, installedCode.executeVarargs(null, null, null));
+            assertDeepEquals(42, installedCode.executeVarargs(null, null, null));
         } catch (InvalidInstalledCodeException e) {
             Assert.fail("Code must not have been invalidated.");
         }
--- a/mx/projects	Tue May 13 18:29:55 2014 -0700
+++ b/mx/projects	Tue May 13 18:31:18 2014 -0700
@@ -652,7 +652,7 @@
 # graal.compiler.hsail.test.infra - HSAIL compiler test infrastructure
 project@com.oracle.graal.compiler.hsail.test.infra@subDir=graal
 project@com.oracle.graal.compiler.hsail.test.infra@sourceDirs=src
-project@com.oracle.graal.compiler.hsail.test.infra@dependencies=com.oracle.graal.hotspot.hsail,JUNIT,OKRA_WITH_SIM
+project@com.oracle.graal.compiler.hsail.test.infra@dependencies=com.oracle.graal.test,com.oracle.graal.hotspot.hsail,OKRA_WITH_SIM
 project@com.oracle.graal.compiler.hsail.test.infra@checkstyle=com.oracle.graal.graph
 project@com.oracle.graal.compiler.hsail.test.infra@javaCompliance=1.8
 
--- a/src/gpu/hsail/vm/gpu_hsail.cpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/gpu/hsail/vm/gpu_hsail.cpp	Tue May 13 18:31:18 2014 -0700
@@ -392,19 +392,16 @@
   // Reset the kernel arguments
   _okra_clearargs(kernel);
 
-  // get how many bytes per deopt save area are required
-  int saveAreaCounts = OopSaver::getSaveAreaCounts(oop_map_array);
-  int numSRegs = saveAreaCounts & 0xff;
-  int numDRegs = (saveAreaCounts >> 8) & 0xff;
-  int numStackSlots = (saveAreaCounts >> 16);
-  int bytesPerSaveArea = numSRegs * 4 + (numDRegs + numStackSlots) * 8;
-
   HSAILDeoptimizationInfo* e;
   if (UseHSAILDeoptimization) {
-    e = new (MAX_DEOPT_SLOTS, bytesPerSaveArea) HSAILDeoptimizationInfo(MAX_DEOPT_SLOTS, bytesPerSaveArea);
-    e->set_never_ran_array(NEW_C_HEAP_ARRAY(jboolean, dimX, mtInternal));
-    memset(e->never_ran_array(), 0, dimX * sizeof(jboolean));
-    e->set_donor_threads(donorThreads);
+    // get how many bytes per deopt save area are required
+    int saveAreaCounts = OopSaver::getSaveAreaCounts(oop_map_array);
+    int numSRegs = saveAreaCounts & 0xff;
+    int numDRegs = (saveAreaCounts >> 8) & 0xff;
+    int numStackSlots = (saveAreaCounts >> 16);
+    int bytesPerSaveArea = numSRegs * 4 + (numDRegs + numStackSlots) * 8;
+
+    e = new (MAX_DEOPT_SLOTS, bytesPerSaveArea) HSAILDeoptimizationInfo(MAX_DEOPT_SLOTS, bytesPerSaveArea, dimX, donorThreads);
   }
 
   // This object sets up the kernel arguments
@@ -455,7 +452,6 @@
   }
 
   if (UseHSAILDeoptimization) {
-    kernelStats.incDeopts();
     // check if any workitem requested a deopt
     int deoptcode = e->deopt_occurred();
     if (deoptcode != 1) {
@@ -470,6 +466,7 @@
         guarantee(deoptcode == 1, msg);
       }
     } else {
+      kernelStats.incDeopts();
 
       {
         TraceTime t3("handle deoptimizing workitems", TraceGPUInteraction);
@@ -586,7 +583,6 @@
       } // end of never-ran handling
     }
 
-    FREE_C_HEAP_ARRAY(jboolean, e->never_ran_array(), mtInternal);
     delete e;
   }
   kernelStats.finishDispatch();
--- a/src/gpu/hsail/vm/gpu_hsail.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/gpu/hsail/vm/gpu_hsail.hpp	Tue May 13 18:31:18 2014 -0700
@@ -37,7 +37,7 @@
    private:
     // TODO: separate workitemid and actionAndReason out
     // since they are there only once even if there are multiple frames
-    // for now, though we only ever have one hsail fram
+    // for now, though we only ever have one hsail frame
     jint  _workitemid;
     jint  _actionAndReason;
     // the first (innermost) "hsail frame" starts after the above fields
@@ -56,51 +56,63 @@
 // TODO: query the device to get this number
 #define MAX_DEOPT_SLOTS    (8 * 40 * 64)
 
-  class HSAILDeoptimizationInfo : public ResourceObj {
+  class HSAILDeoptimizationInfo : public CHeapObj<mtInternal> {
     friend class VMStructs;
    private:
     jint* _notice_safepoints;
     jint _deopt_occurred;
     jint _deopt_next_index;
     JavaThread** _donor_threads;
-    jboolean * _never_ran_array;
     jint _num_slots;
-    jint _bytesPerSaveArea;
     jint _deopt_span;
+    char _ignore;
+    // keep a pointer last so save area following it is word aligned
+    jboolean * _never_ran_array; 
 
    public:
     HSAILKernelDeoptimization _deopt_save_states[1];  // number and size of these can vary per kernel
 
-    inline HSAILDeoptimizationInfo(int numSlots, int bytesPerSaveArea) {
+    static inline size_t hdr_size() {
+      return sizeof(HSAILDeoptimizationInfo);
+    }
+
+    inline jbyte * save_area_start() {
+      return (jbyte*) (this) + hdr_size();
+    }
+
+    inline HSAILDeoptimizationInfo(int numSlots, int bytesPerSaveArea, int dimX, JavaThread** donorThreads) {
       _notice_safepoints = &Hsail::_notice_safepoints;
       _deopt_occurred = 0;
       _deopt_next_index = 0;
       _num_slots = numSlots;
-      _bytesPerSaveArea = bytesPerSaveArea;
+      _never_ran_array = NEW_C_HEAP_ARRAY(jboolean, dimX, mtInternal);
+      memset(_never_ran_array, 0, dimX * sizeof(jboolean));
+      _donor_threads = donorThreads;
       _deopt_span = sizeof(HSAILKernelDeoptimization) + sizeof(HSAILFrame) + bytesPerSaveArea;
       if (TraceGPUInteraction) {
         tty->print_cr("HSAILDeoptimizationInfo allocated, %d slots of size %d, total size = 0x%lx bytes", _num_slots, _deopt_span, (_num_slots * _deopt_span + sizeof(HSAILDeoptimizationInfo)));
       }
     }
 
+    inline ~HSAILDeoptimizationInfo() {
+      FREE_C_HEAP_ARRAY(jboolean, _never_ran_array, mtInternal);
+    }
+
     inline jint deopt_occurred() {
       return _deopt_occurred;
     }
     inline jint num_deopts() { return _deopt_next_index; }
     inline jboolean *never_ran_array() { return _never_ran_array; }
-    inline void  set_never_ran_array(jboolean *p) { _never_ran_array = p; }
-    inline void  set_donor_threads(JavaThread **threads) { _donor_threads = threads; }
     inline jint num_slots() {return _num_slots;}
 
     inline HSAILKernelDeoptimization * get_deopt_save_state(int slot) {
       // use _deopt_span to index into _deopt_states
-      char *p = (char *) _deopt_save_states;
-      p += _deopt_span * slot;
-      return (HSAILKernelDeoptimization *) p;
+      return (HSAILKernelDeoptimization *) (save_area_start() + _deopt_span * slot);
     }
 
     void * operator new (size_t hdrSize, int numSlots, int bytesPerSaveArea) {
-      size_t totalSizeBytes = hdrSize + numSlots * (sizeof(HSAILKernelDeoptimization) + bytesPerSaveArea);
+      assert(hdrSize <= hdr_size(), "");
+      size_t totalSizeBytes = hdr_size()  + numSlots * (sizeof(HSAILKernelDeoptimization) + sizeof(HSAILFrame) + bytesPerSaveArea);
       return NEW_C_HEAP_ARRAY(char, totalSizeBytes, mtInternal);
     }
 
@@ -109,7 +121,6 @@
     }
   };
 
-
 private:
 
   static JNINativeMethod HSAIL_methods[];
--- a/src/gpu/hsail/vm/vmStructs_hsail.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/gpu/hsail/vm/vmStructs_hsail.hpp	Tue May 13 18:31:18 2014 -0700
@@ -46,7 +46,6 @@
   nonstatic_field(Hsail::HSAILDeoptimizationInfo, _deopt_next_index,                       jint)                                      \
   nonstatic_field(Hsail::HSAILDeoptimizationInfo, _donor_threads,                          JavaThread**)                              \
   nonstatic_field(Hsail::HSAILDeoptimizationInfo, _never_ran_array,                        jboolean *)                                \
-  nonstatic_field(Hsail::HSAILDeoptimizationInfo, _deopt_save_states[0],                   Hsail::HSAILKernelDeoptimization)          \
 
 #define VM_TYPES_GPU_HSAIL(declare_type, declare_toplevel_type)                 \
   declare_toplevel_type(HSAILFrame)                                  \
@@ -54,8 +53,4 @@
   declare_toplevel_type(Hsail::HSAILKernelDeoptimization)            \
   declare_toplevel_type(Hsail::HSAILDeoptimizationInfo)
 
-#define VM_INT_CONSTANTS_GPU_HSAIL(declare_constant)                                                                                  \
-  declare_constant(sizeof(HSAILFrame))                                                                                                \
-  declare_constant(sizeof(Hsail::HSAILKernelDeoptimization))                                                                          \
-
 #endif // GPU_HSAIL_VM_VMSTRUCTS_HSAIL_HPP
--- a/src/share/vm/classfile/systemDictionary.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/classfile/systemDictionary.hpp	Tue May 13 18:31:18 2014 -0700
@@ -203,7 +203,6 @@
   do_klass(HotSpotCodeInfo_klass,                 com_oracle_graal_hotspot_meta_HotSpotCodeInfo,                Opt) \
   do_klass(HotSpotInstalledCode_klass,            com_oracle_graal_hotspot_meta_HotSpotInstalledCode,           Opt) \
   do_klass(HotSpotNmethod_klass,                  com_oracle_graal_hotspot_meta_HotSpotNmethod,                 Opt) \
-  do_klass(HotSpotJavaType_klass,                 com_oracle_graal_hotspot_meta_HotSpotJavaType,                Opt) \
   do_klass(HotSpotResolvedJavaMethod_klass,       com_oracle_graal_hotspot_meta_HotSpotResolvedJavaMethod,      Opt) \
   do_klass(HotSpotResolvedObjectType_klass,       com_oracle_graal_hotspot_meta_HotSpotResolvedObjectType,      Opt) \
   do_klass(HotSpotMonitorValue_klass,             com_oracle_graal_hotspot_meta_HotSpotMonitorValue,            Opt) \
--- a/src/share/vm/classfile/vmSymbols.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/classfile/vmSymbols.hpp	Tue May 13 18:31:18 2014 -0700
@@ -312,7 +312,6 @@
   template(com_oracle_graal_hotspot_meta_HotSpotCodeInfo,            "com/oracle/graal/hotspot/meta/HotSpotCodeInfo")                 \
   template(com_oracle_graal_hotspot_meta_HotSpotInstalledCode,       "com/oracle/graal/hotspot/meta/HotSpotInstalledCode")            \
   template(com_oracle_graal_hotspot_meta_HotSpotNmethod,             "com/oracle/graal/hotspot/meta/HotSpotNmethod")                  \
-  template(com_oracle_graal_hotspot_meta_HotSpotJavaType,            "com/oracle/graal/hotspot/meta/HotSpotJavaType")                 \
   template(com_oracle_graal_hotspot_meta_HotSpotResolvedJavaMethod,  "com/oracle/graal/hotspot/meta/HotSpotResolvedJavaMethod")       \
   template(com_oracle_graal_hotspot_meta_HotSpotResolvedObjectType,  "com/oracle/graal/hotspot/meta/HotSpotResolvedObjectType")       \
   template(com_oracle_graal_hotspot_meta_HotSpotMonitorValue,        "com/oracle/graal/hotspot/meta/HotSpotMonitorValue")             \
@@ -323,12 +322,10 @@
   template(com_oracle_graal_api_meta_Constant,                       "com/oracle/graal/api/meta/Constant")                            \
   template(com_oracle_graal_api_meta_PrimitiveConstant,              "com/oracle/graal/api/meta/PrimitiveConstant")                   \
   template(com_oracle_graal_api_meta_NullConstant,                   "com/oracle/graal/api/meta/NullConstant")                        \
-  template(com_oracle_graal_api_meta_ConstantPool,                   "com/oracle/graal/api/meta/ConstantPool")                        \
   template(com_oracle_graal_api_meta_ExceptionHandler,               "com/oracle/graal/api/meta/ExceptionHandler")                    \
   template(com_oracle_graal_api_meta_JavaMethod,                     "com/oracle/graal/api/meta/JavaMethod")                          \
   template(com_oracle_graal_api_meta_JavaType,                       "com/oracle/graal/api/meta/JavaType")                            \
   template(com_oracle_graal_api_meta_Kind,                           "com/oracle/graal/api/meta/Kind")                                \
-  template(com_oracle_graal_api_meta_ResolvedJavaField,              "com/oracle/graal/api/meta/ResolvedJavaField")                   \
   template(com_oracle_graal_api_meta_Value,                          "com/oracle/graal/api/meta/Value")                               \
   /* graal.api.code */                                                                                                                \
   template(com_oracle_graal_api_code_Assumptions,                    "com/oracle/graal/api/code/Assumptions")                         \
--- a/src/share/vm/graal/graalJavaAccess.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/graal/graalJavaAccess.hpp	Tue May 13 18:31:18 2014 -0700
@@ -52,13 +52,8 @@
     oop_field(HotSpotResolvedObjectType, javaClass, "Ljava/lang/Class;")                                                                                       \
   end_class                                                                                                                                                    \
   start_class(HotSpotResolvedJavaMethod)                                                                                                                       \
-    oop_field(HotSpotResolvedJavaMethod, name, "Ljava/lang/String;")                                                                                           \
-    oop_field(HotSpotResolvedJavaMethod, holder, "Lcom/oracle/graal/hotspot/meta/HotSpotResolvedObjectType;")                                                  \
     long_field(HotSpotResolvedJavaMethod, metaspaceMethod)                                                                                                     \
   end_class                                                                                                                                                    \
-  start_class(HotSpotJavaType)                                                                                                                                 \
-    oop_field(HotSpotJavaType, name, "Ljava/lang/String;")                                                                                                     \
-  end_class                                                                                                                                                    \
   start_class(InstalledCode)                                                                                                                                   \
     long_field(InstalledCode, address)                                                                                                                         \
     long_field(InstalledCode, version)                                                                                                                         \
--- a/src/share/vm/runtime/mutexLocker.cpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/runtime/mutexLocker.cpp	Tue May 13 18:31:18 2014 -0700
@@ -133,10 +133,6 @@
 Mutex*   JfrThreadGroups_lock         = NULL;
 #endif
 
-#ifdef GRAAL
-Monitor* GraalInitialization_lock     = NULL;
-#endif
-
 #define MAX_NUM_MUTEX 128
 static Monitor * _mutex_array[MAX_NUM_MUTEX];
 static int _num_mutex;
@@ -284,10 +280,6 @@
   def(JfrStream_lock               , Mutex,   nonleaf+2,   true);
   def(JfrStacktrace_lock           , Mutex,   special,     true );
 #endif
-
-#ifdef GRAAL
-  def(GraalInitialization_lock     , Monitor, nonleaf+5,   false);
-#endif
 }
 
 GCMutexLocker::GCMutexLocker(Monitor * mutex) {
--- a/src/share/vm/runtime/mutexLocker.hpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/runtime/mutexLocker.hpp	Tue May 13 18:31:18 2014 -0700
@@ -146,10 +146,6 @@
 extern Mutex*   JfrThreadGroups_lock;            // protects JFR access to Thread Groups
 #endif
 
-#ifdef GRAAL
-extern Monitor* GraalInitialization_lock;        // ensures exactly 1 thread initializes Graal
-#endif
-
 // A MutexLocker provides mutual exclusion with respect to a given mutex
 // for the scope which contains the locker.  The lock is an OS lock, not
 // an object lock, and the two do not interoperate.  Do not use Mutex-based
--- a/src/share/vm/runtime/vmStructs.cpp	Tue May 13 18:29:55 2014 -0700
+++ b/src/share/vm/runtime/vmStructs.cpp	Tue May 13 18:31:18 2014 -0700
@@ -3124,7 +3124,6 @@
   VM_INT_CONSTANTS_GRAAL(GENERATE_VM_INT_CONSTANT_ENTRY,
                          GENERATE_PREPROCESSOR_VM_INT_CONSTANT_ENTRY)
 
-  VM_INT_CONSTANTS_GPU_HSAIL(GENERATE_VM_INT_CONSTANT_ENTRY)
 #endif
 
 #if INCLUDE_ALL_GCS