changeset 19171:5adc03d22312

Merge.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Fri, 06 Feb 2015 03:25:19 +0100
parents 3b2e98f9e47c (current diff) d4f80cf249d0 (diff)
children 76090119f89c
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java
diffstat 13 files changed, 131 insertions(+), 82 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Fri Feb 06 03:25:19 2015 +0100
@@ -278,11 +278,9 @@
             JavaConstant c = asConstant(value);
             if (c.isNull() || SPARCAssembler.isSimm11(c)) {
                 return value;
-            } else {
-                return load(c);
             }
         }
-        return emitMove(value);
+        return load(value);
     }
 
     @Override
@@ -417,7 +415,8 @@
     protected void emitTableSwitch(int lowKey, LabelRef defaultTarget, LabelRef[] targets, Value key) {
         // Making a copy of the switch value is necessary because jump table destroys the input
         // value
-        Variable tmp = emitMove(key);
+        Variable tmp = newVariable(key.getLIRKind());
+        emitMove(tmp, key);
         append(new TableSwitchOp(lowKey, defaultTarget, targets, tmp, newVariable(LIRKind.value(target().wordKind))));
     }
 
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java	Fri Feb 06 03:25:19 2015 +0100
@@ -172,7 +172,7 @@
         LIRKind wordKind = LIRKind.value(getProviders().getCodeCache().getTarget().wordKind);
         RegisterValue thread = getProviders().getRegisters().getThreadRegister().asValue(wordKind);
         SPARCAddressValue pendingDeoptAddress = new SPARCAddressValue(wordKind, thread, offset);
-        append(new StoreOp(v.getKind(), pendingDeoptAddress, emitMove(v), null));
+        append(new StoreOp(v.getKind(), pendingDeoptAddress, load(v), null));
     }
 
     @Override
@@ -221,15 +221,14 @@
     }
 
     public Variable emitCompareAndSwap(Value address, Value expectedValue, Value newValue, Value trueValue, Value falseValue) {
-        Variable newValueTemp = newVariable(newValue.getLIRKind());
-        emitMove(newValueTemp, newValue);
 
         LIRKind kind = newValue.getLIRKind();
         assert kind.equals(expectedValue.getLIRKind());
         Kind memKind = (Kind) kind.getPlatformKind();
         SPARCAddressValue addressValue = asAddressValue(address);
-        append(new CompareAndSwapOp(asAllocatable(addressValue), asAllocatable(expectedValue), asAllocatable(newValueTemp)));
-        return emitConditionalMove(memKind, expectedValue, newValueTemp, Condition.EQ, true, trueValue, falseValue);
+        Variable result = newVariable(newValue.getLIRKind());
+        append(new CompareAndSwapOp(result, asAllocatable(addressValue), asAllocatable(expectedValue), asAllocatable(newValue)));
+        return emitConditionalMove(memKind, expectedValue, result, Condition.EQ, true, trueValue, falseValue);
     }
 
     public StackSlot getDeoptimizationRescueSlot() {
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotNodeLIRBuilder.java	Fri Feb 06 03:25:19 2015 +0100
@@ -76,8 +76,6 @@
         Value offset = operand(x.offset());
         Variable cmpValue = (Variable) gen.loadNonConst(operand(x.expectedValue()));
         Variable newValue = gen.load(operand(x.newValue()));
-        Variable newValueTemp = gen.newVariable(newValue.getLIRKind());
-        getGen().emitMove(newValueTemp, newValue);
         LIRKind kind = cmpValue.getLIRKind();
         assert kind.equals(newValue.getLIRKind());
 
@@ -92,8 +90,9 @@
             }
         }
 
-        append(new CompareAndSwapOp(address, cmpValue, newValueTemp));
-        setResult(x, gen.emitMove(newValueTemp));
+        Variable result = gen.newVariable(newValue.getLIRKind());
+        append(new CompareAndSwapOp(result, address, cmpValue, newValue));
+        setResult(x, result);
     }
 
     @Override
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/HotSpotGraphBuilderPluginsProvider.java	Fri Feb 06 03:25:19 2015 +0100
@@ -22,6 +22,8 @@
  */
 package com.oracle.graal.hotspot.replacements;
 
+import static com.oracle.graal.java.GraphBuilderContext.*;
+
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.runtime.*;
 import com.oracle.graal.compiler.common.type.*;
@@ -47,9 +49,8 @@
                 if (objectStamp.isExactType() && objectStamp.nonNull()) {
                     mirror = builder.append(ConstantNode.forConstant(objectStamp.type().getJavaClass(), metaAccess));
                 } else {
-                    GuardingPiNode pi = builder.append(new GuardingPiNode(rcvr));
                     StampProvider stampProvider = builder.getStampProvider();
-                    LoadHubNode hub = builder.append(new LoadHubNode(stampProvider, pi));
+                    LoadHubNode hub = builder.append(new LoadHubNode(stampProvider, makeNonNull(builder, rcvr)));
                     mirror = builder.append(new HubGetClassNode(builder.getMetaAccess(), hub));
                 }
                 builder.push(Kind.Object, mirror);
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraalDirectivePlugins.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraalDirectivePlugins.java	Fri Feb 06 03:25:19 2015 +0100
@@ -32,40 +32,37 @@
 
 public class GraalDirectivePlugins {
 
-    private static ResolvedJavaMethod lookup(MetaAccessProvider metaAccess, String name, Class<?>... parameterTypes) {
-        return Registration.resolve(metaAccess, GraalDirectives.class, name, parameterTypes);
-    }
-
     public static void registerPlugins(MetaAccessProvider metaAccess, GraphBuilderPlugins plugins) {
-        plugins.register(lookup(metaAccess, "deoptimize"), new InvocationPlugin() {
+        Registration r = new Registration(plugins, metaAccess, GraalDirectives.class);
+        r.register0("deoptimize", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext builder) {
                 builder.append(new DeoptimizeNode(DeoptimizationAction.None, DeoptimizationReason.TransferToInterpreter));
                 return true;
             }
         });
 
-        plugins.register(lookup(metaAccess, "deoptimizeAndInvalidate"), new InvocationPlugin() {
+        r.register0("deoptimizeAndInvalidate", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext builder) {
                 builder.append(new DeoptimizeNode(DeoptimizationAction.InvalidateReprofile, DeoptimizationReason.TransferToInterpreter));
                 return true;
             }
         });
 
-        plugins.register(lookup(metaAccess, "inCompiledCode"), new InvocationPlugin() {
+        r.register0("inCompiledCode", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext builder) {
                 builder.push(Kind.Int, builder.append(ConstantNode.forInt(1)));
                 return true;
             }
         });
 
-        plugins.register(lookup(metaAccess, "controlFlowAnchor"), new InvocationPlugin() {
+        r.register0("controlFlowAnchor", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext builder) {
                 builder.append(new ControlFlowAnchorNode());
                 return true;
             }
         });
 
-        plugins.register(lookup(metaAccess, "injectBranchProbability", double.class, boolean.class), new InvocationPlugin() {
+        r.register2("injectBranchProbability", double.class, boolean.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext builder, ValueNode probability, ValueNode condition) {
                 builder.push(Kind.Int, builder.append(new BranchProbabilityNode(probability, condition)));
                 return true;
@@ -92,10 +89,10 @@
                     cls = kind.toJavaClass();
             }
 
-            plugins.register(lookup(metaAccess, "blackhole", cls), blackholePlugin);
+            r.register1("blackhole", cls, blackholePlugin);
 
             final Kind stackKind = kind.getStackKind();
-            plugins.register(lookup(metaAccess, "opaque", cls), new InvocationPlugin() {
+            r.register1("opaque", cls, new InvocationPlugin() {
                 public boolean apply(GraphBuilderContext builder, ValueNode value) {
                     builder.push(stackKind, builder.append(new OpaqueNode(value)));
                     return true;
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderContext.java	Fri Feb 06 03:25:19 2015 +0100
@@ -39,7 +39,7 @@
 
     <T extends FixedWithNextNode> T append(T fixed);
 
-    <T extends FloatingNode> T append(T v);
+    <T extends FloatingNode> T append(T value);
 
     StampProvider getStampProvider();
 
@@ -48,4 +48,15 @@
     Assumptions getAssumptions();
 
     void push(Kind kind, ValueNode value);
+
+    /**
+     * @see GuardingPiNode#makeNonNull(ValueNode)
+     */
+    static ValueNode makeNonNull(GraphBuilderContext builder, ValueNode value) {
+        ValueNode nonNullValue = GuardingPiNode.makeNonNull(value);
+        if (nonNullValue != value) {
+            builder.append((FixedWithNextNode) nonNullValue);
+        }
+        return nonNullValue;
+    }
 }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Fri Feb 06 03:25:19 2015 +0100
@@ -38,11 +38,15 @@
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
+import com.oracle.graal.graph.Graph.Mark;
 import com.oracle.graal.graph.Node.ValueNumberable;
+import com.oracle.graal.graph.iterators.*;
 import com.oracle.graal.java.BciBlockMapping.BciBlock;
 import com.oracle.graal.java.BciBlockMapping.ExceptionDispatchBlock;
 import com.oracle.graal.java.BciBlockMapping.LocalLiveness;
-import com.oracle.graal.java.GraphBuilderPlugins.*;
+import com.oracle.graal.java.GraphBuilderPlugins.InlineInvokePlugin;
+import com.oracle.graal.java.GraphBuilderPlugins.InvocationPlugin;
+import com.oracle.graal.java.GraphBuilderPlugins.LoopExplosionPlugin;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
 import com.oracle.graal.nodes.calc.*;
@@ -855,14 +859,8 @@
                 }
 
                 if (graphBuilderPlugins != null) {
-                    InvocationPlugin plugin = graphBuilderPlugins.lookupInvocation(targetMethod);
-                    if (plugin != null) {
-                        int beforeStackSize = frameState.stackSize;
-                        if (plugin.apply(this, args)) {
-                            assert beforeStackSize + resultType.getSlotCount() == frameState.stackSize;
-                            return;
-                        }
-                        assert beforeStackSize == frameState.stackSize;
+                    if (tryUsingInvocationPlugin(args, targetMethod, resultType)) {
+                        return;
                     }
                 }
 
@@ -887,6 +885,36 @@
                 }
             }
 
+            private boolean tryUsingInvocationPlugin(ValueNode[] args, ResolvedJavaMethod targetMethod, Kind resultType) {
+                InvocationPlugin plugin = graphBuilderPlugins.lookupInvocation(targetMethod);
+                if (plugin != null) {
+                    int beforeStackSize = frameState.stackSize;
+                    boolean needsNullCheck = !targetMethod.isStatic() && !StampTool.isPointerNonNull(args[0].stamp());
+                    int nodeCount = currentGraph.getNodeCount();
+                    Mark mark = needsNullCheck ? currentGraph.getMark() : null;
+                    if (InvocationPlugin.execute(this, plugin, args)) {
+                        assert beforeStackSize + resultType.getSlotCount() == frameState.stackSize : "plugin manipulated the stack incorrectly";
+                        assert !needsNullCheck || containsNullCheckOf(currentGraph.getNewNodes(mark), args[0]) : "plugin needs to null check the receiver of " + targetMethod + ": " + args[0];
+                        return true;
+                    }
+                    assert nodeCount == currentGraph.getNodeCount() : "plugin that returns false must not create new nodes";
+                    assert beforeStackSize == frameState.stackSize : "plugin that returns false must modify the stack";
+                }
+                return false;
+            }
+
+            private boolean containsNullCheckOf(NodeIterable<Node> nodes, Node value) {
+                for (Node n : nodes) {
+                    if (n instanceof GuardingPiNode) {
+                        GuardingPiNode pi = (GuardingPiNode) n;
+                        if (pi.condition() instanceof IsNullNode) {
+                            return ((IsNullNode) pi.condition()).getValue() == value;
+                        }
+                    }
+                }
+                return false;
+            }
+
             private void parseAndInlineCallee(ResolvedJavaMethod targetMethod, ValueNode[] args) {
                 BytecodeParser parser = new BytecodeParser(metaAccess, targetMethod, graphBuilderConfig, optimisticOpts, StructuredGraph.INVOCATION_ENTRY_BCI);
                 final FrameState[] lazyFrameState = new FrameState[1];
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugins.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugins.java	Fri Feb 06 03:25:19 2015 +0100
@@ -66,52 +66,53 @@
      */
     public interface InvocationPlugin extends GraphBuilderPlugin {
         /**
-         * Tries to handle an invocation to a method with no arguments.
-         *
-         * @return {@code true} this plugin handled the invocation
+         * @see #execute(GraphBuilderContext, InvocationPlugin, ValueNode[])
          */
         default boolean apply(GraphBuilderContext builder) {
             throw invalidHandler(builder);
         }
 
         /**
-         * Tries to handle an invocation to a method with one argument.
-         *
-         * @return {@code true} this plugin handled the invocation
+         * @see #execute(GraphBuilderContext, InvocationPlugin, ValueNode[])
          */
         default boolean apply(GraphBuilderContext builder, ValueNode arg) {
             throw invalidHandler(builder, arg);
         }
 
         /**
-         * Tries to handle an invocation to a method with two arguments.
-         *
-         * @return {@code true} this plugin handled the invocation
+         * @see #execute(GraphBuilderContext, InvocationPlugin, ValueNode[])
          */
         default boolean apply(GraphBuilderContext builder, ValueNode arg1, ValueNode arg2) {
             throw invalidHandler(builder, arg1, arg2);
         }
 
         /**
-         * Tries to handle an invocation to a method with three arguments.
-         *
-         * @return {@code true} this plugin handled the invocation
+         * @see #execute(GraphBuilderContext, InvocationPlugin, ValueNode[])
          */
         default boolean apply(GraphBuilderContext builder, ValueNode arg1, ValueNode arg2, ValueNode arg3) {
             throw invalidHandler(builder, arg1, arg2, arg3);
         }
 
-        default boolean apply(GraphBuilderContext builder, ValueNode[] args) {
+        /**
+         * Executes a given plugin against a set of invocation arguments by dispatching to the
+         * plugin's {@code apply(...)} method that matches the number of arguments.
+         *
+         * @return {@code true} if the plugin handled the invocation, {@code false} if the graph
+         *         builder should process the invoke further (e.g., by inlining it or creating an
+         *         {@link Invoke} node). A plugin that does not handle an invocation must not modify
+         *         the graph being constructed.
+         */
+        static boolean execute(GraphBuilderContext builder, InvocationPlugin plugin, ValueNode[] args) {
             if (args.length == 0) {
-                return apply(builder);
+                return plugin.apply(builder);
             } else if (args.length == 1) {
-                return apply(builder, args[0]);
+                return plugin.apply(builder, args[0]);
             } else if (args.length == 2) {
-                return apply(builder, args[0], args[1]);
+                return plugin.apply(builder, args[0], args[1]);
             } else if (args.length == 3) {
-                return apply(builder, args[0], args[1], args[2]);
+                return plugin.apply(builder, args[0], args[1], args[2]);
             } else {
-                throw invalidHandler(builder, args);
+                throw plugin.invalidHandler(builder, args);
             }
         }
 
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/StandardGraphBuilderPluginsProvider.java	Fri Feb 06 03:25:19 2015 +0100
@@ -22,21 +22,16 @@
  */
 package com.oracle.graal.java;
 
-import static com.oracle.graal.api.meta.DeoptimizationAction.*;
-import static com.oracle.graal.api.meta.DeoptimizationReason.*;
-import static com.oracle.graal.compiler.common.type.StampFactory.*;
+import static com.oracle.graal.java.GraphBuilderContext.*;
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.api.runtime.*;
-import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.java.GraphBuilderPlugins.InvocationPlugin;
 import com.oracle.graal.java.GraphBuilderPlugins.Registration;
 import com.oracle.graal.java.GraphBuilderPlugins.Registration.Receiver;
 import com.oracle.graal.nodes.*;
-import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
 import com.oracle.graal.nodes.java.*;
-import com.oracle.graal.nodes.type.*;
 
 /**
  * Provider of non-runtime specific {@link GraphBuilderPlugin}s.
@@ -93,14 +88,7 @@
         }
 
         public boolean apply(GraphBuilderContext builder, ValueNode value) {
-            ValueNode nonNullValue = value;
-            ObjectStamp receiverStamp = (ObjectStamp) value.stamp();
-            if (!StampTool.isPointerNonNull(receiverStamp)) {
-                IsNullNode condition = builder.append(new IsNullNode(value));
-                Stamp stamp = receiverStamp.join(objectNonNull());
-                nonNullValue = builder.append(new GuardingPiNode(value, condition, true, NullCheckException, InvalidateReprofile, stamp));
-            }
-            builder.push(kind.getStackKind(), builder.append(new UnboxNode(nonNullValue, kind)));
+            builder.push(kind.getStackKind(), builder.append(new UnboxNode(makeNonNull(builder, value), kind)));
             return true;
         }
 
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Fri Feb 06 03:25:19 2015 +0100
@@ -436,12 +436,13 @@
     @Opcode("CAS")
     public static class CompareAndSwapOp extends SPARCLIRInstruction {
 
-        // @Def protected AllocatableValue result;
-        @Use protected AllocatableValue address;
-        @Use protected AllocatableValue cmpValue;
-        @Use protected AllocatableValue newValue;
+        @Def({REG, HINT}) protected AllocatableValue result;
+        @Alive({REG}) protected AllocatableValue address;
+        @Alive({REG}) protected AllocatableValue cmpValue;
+        @Use({REG}) protected AllocatableValue newValue;
 
-        public CompareAndSwapOp(AllocatableValue address, AllocatableValue cmpValue, AllocatableValue newValue) {
+        public CompareAndSwapOp(AllocatableValue result, AllocatableValue address, AllocatableValue cmpValue, AllocatableValue newValue) {
+            this.result = result;
             this.address = address;
             this.cmpValue = cmpValue;
             this.newValue = newValue;
@@ -449,7 +450,8 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            compareAndSwap(masm, address, cmpValue, newValue);
+            move(crb, masm, result, newValue, delayedControlTransfer);
+            compareAndSwap(masm, address, cmpValue, result);
         }
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardingPiNode.java	Fri Feb 06 03:25:19 2015 +0100
@@ -22,6 +22,10 @@
  */
 package com.oracle.graal.nodes;
 
+import static com.oracle.graal.api.meta.DeoptimizationAction.*;
+import static com.oracle.graal.api.meta.DeoptimizationReason.*;
+import static com.oracle.graal.compiler.common.type.StampFactory.*;
+
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
@@ -65,6 +69,21 @@
         return action;
     }
 
+    /**
+     * Returns a node whose stamp is guaranteed to be {@linkplain StampTool#isPointerNonNull(Stamp)
+     * non-null}. If {@code value} already has such a stamp, then it is returned. Otherwise a fixed
+     * node guarding {@code value} is returned where the guard performs a null check.
+     */
+    public static ValueNode makeNonNull(ValueNode value) {
+        ObjectStamp receiverStamp = (ObjectStamp) value.stamp();
+        if (!StampTool.isPointerNonNull(receiverStamp)) {
+            IsNullNode condition = value.graph().unique(new IsNullNode(value));
+            Stamp stamp = receiverStamp.join(objectNonNull());
+            return new GuardingPiNode(value, condition, true, NullCheckException, InvalidateReprofile, stamp);
+        }
+        return value;
+    }
+
     public GuardingPiNode(ValueNode object) {
         this(object, object.graph().unique(new IsNullNode(object)), true, DeoptimizationReason.NullCheckException, DeoptimizationAction.None, object.stamp().join(StampFactory.objectNonNull()));
     }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/GraalDirectivesSubstitutions.java	Fri Feb 06 03:24:50 2015 +0100
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/GraalDirectivesSubstitutions.java	Fri Feb 06 03:25:19 2015 +0100
@@ -48,6 +48,11 @@
         return true;
     }
 
+    /*
+     * This needs to be a @MacroSubstitution, not a @MethodSubstitution, because we want to get a
+     * unique ControlFlowAnchorNode for each occurrence of this call. With @MethodSubstitution, we
+     * would get a clone of a single cached node.
+     */
     @MacroSubstitution(forced = true, macro = ControlFlowAnchorNode.class)
     public static native void controlFlowAnchor();
 
--- a/mx/mx_graal.py	Fri Feb 06 03:24:50 2015 +0100
+++ b/mx/mx_graal.py	Fri Feb 06 03:25:19 2015 +0100
@@ -1484,6 +1484,14 @@
     with Task('BuildHotSpotGraal: fastdebug,product', tasks):
         buildvms(['--vms', 'graal,server', '--builds', 'fastdebug,product'])
 
+    with VM('server', 'product'):  # hosted mode
+        with Task('UnitTests:hosted-product', tasks):
+            unittest(['--enable-timing', '--verbose', '--fail-fast'])
+
+    with VM('server', 'product'):  # hosted mode
+        with Task('UnitTests-BaselineCompiler:hosted-product', tasks):
+            unittest(['--enable-timing', '--verbose', '--whitelist', 'test/whitelist_baseline.txt', '-G:+UseBaselineCompiler'])
+
     with VM('graal', 'fastdebug'):
         with Task('BootstrapWithSystemAssertions:fastdebug', tasks):
             vm(['-esa', '-XX:-TieredCompilation', '-version'])
@@ -1510,14 +1518,6 @@
         with Task('BootstrapWithImmutableCode:product', tasks):
             vm(['-XX:-TieredCompilation', '-G:+ImmutableCode', '-G:+VerifyPhases', '-esa', '-version'])
 
-    with VM('server', 'product'):  # hosted mode
-        with Task('UnitTests:hosted-product', tasks):
-            unittest(['--enable-timing', '--verbose', '--fail-fast'])
-
-    with VM('server', 'product'):  # hosted mode
-        with Task('UnitTests-BaselineCompiler:hosted-product', tasks):
-            unittest(['--enable-timing', '--verbose', '--whitelist', 'test/whitelist_baseline.txt', '-G:+UseBaselineCompiler'])
-
     for vmbuild in ['fastdebug', 'product']:
         for test in sanitycheck.getDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild) + sanitycheck.getScalaDacapos(level=sanitycheck.SanityCheckLevel.Gate, gateBuildLevel=vmbuild):
             with Task(str(test) + ':' + vmbuild, tasks) as t: