# HG changeset patch # User Doug Simon # Date 1375819932 -7200 # Node ID cf9603cd8b13b45f57d4ee6c1ffa9ee988c95abf # Parent 5c153c59ba626b38849dd6fd7b2248ed7bc90d5d# Parent 038a598da996c566b0d33575e694b65734752aff Merge. diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Aug 06 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Tue Aug 06 22:12:12 2013 +0200 @@ -109,7 +109,7 @@ protected final HotSpotGraalRuntime graalRuntime; private final Suites defaultSuites; - private CheckCastSnippets.Templates checkcastSnippets; + private CheckCastDynamicSnippets.Templates checkcastDynamicSnippets; private InstanceOfSnippets.Templates instanceofSnippets; private NewObjectSnippets.Templates newObjectSnippets; private MonitorSnippets.Templates monitorSnippets; @@ -336,7 +336,7 @@ r.registerSubstitutions(ReflectionSubstitutions.class); } - checkcastSnippets = new CheckCastSnippets.Templates(this, r, graalRuntime.getTarget()); + checkcastDynamicSnippets = new CheckCastDynamicSnippets.Templates(this, r, graalRuntime.getTarget()); instanceofSnippets = new InstanceOfSnippets.Templates(this, r, graalRuntime.getTarget()); newObjectSnippets = new NewObjectSnippets.Templates(this, r, graalRuntime.getTarget()); monitorSnippets = new MonitorSnippets.Templates(this, r, graalRuntime.getTarget(), c.useFastLocking); @@ -765,8 +765,6 @@ } graph.removeFixed(commit); } - } else if (n instanceof CheckCastNode) { - checkcastSnippets.lower((CheckCastNode) n, tool); } else if (n instanceof OSRStartNode) { if (tool.getLoweringType() == LoweringType.AFTER_GUARDS) { OSRStartNode osrStart = (OSRStartNode) n; @@ -795,7 +793,7 @@ osrStart.safeDelete(); } } else if (n instanceof CheckCastDynamicNode) { - checkcastSnippets.lower((CheckCastDynamicNode) n); + checkcastDynamicSnippets.lower((CheckCastDynamicNode) n); } else if (n instanceof InstanceOfNode) { instanceofSnippets.lower((InstanceOfNode) n, tool); } else if (n instanceof InstanceOfDynamicNode) { diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastDynamicSnippets.java Tue Aug 06 22:12:12 2013 +0200 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2012, 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.hotspot.replacements; + +import static com.oracle.graal.api.code.DeoptimizationAction.*; +import static com.oracle.graal.api.meta.DeoptimizationReason.*; +import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; +import static com.oracle.graal.hotspot.replacements.TypeCheckSnippetUtils.*; +import static com.oracle.graal.nodes.extended.BranchProbabilityNode.*; +import static com.oracle.graal.nodes.extended.UnsafeCastNode.*; +import static com.oracle.graal.replacements.SnippetTemplate.*; + +import com.oracle.graal.api.code.*; +import com.oracle.graal.debug.*; +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.java.*; +import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; +import com.oracle.graal.replacements.*; +import com.oracle.graal.replacements.Snippet.ConstantParameter; +import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; +import com.oracle.graal.replacements.SnippetTemplate.Arguments; +import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; +import com.oracle.graal.word.*; + +/** + * Snippet used for lowering {@link CheckCastDynamicNode}. + */ +public class CheckCastDynamicSnippets implements Snippets { + + @Snippet + public static Object checkcastDynamic(Word hub, Object object, @ConstantParameter boolean checkNull) { + if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { + isNull.inc(); + } else { + Word objectHub = loadHub(object); + if (!checkUnknownSubType(hub, objectHub)) { + DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); + } + } + BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); + return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); + } + + public static class Templates extends AbstractTemplates { + + private final SnippetInfo dynamic = snippet(CheckCastDynamicSnippets.class, "checkcastDynamic"); + + public Templates(CodeCacheProvider runtime, Replacements replacements, TargetDescription target) { + super(runtime, replacements, target); + } + + public void lower(CheckCastDynamicNode checkcast) { + StructuredGraph graph = checkcast.graph(); + ValueNode object = checkcast.object(); + + Arguments args = new Arguments(dynamic); + args.add("hub", checkcast.hub()); + args.add("object", object); + args.addConst("checkNull", !object.stamp().nonNull()); + + SnippetTemplate template = template(args); + Debug.log("Lowering dynamic checkcast in %s: node=%s, template=%s, arguments=%s", graph, checkcast, template, args); + template.instantiate(runtime, checkcast, DEFAULT_REPLACER, args); + } + } +} diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastSnippets.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/CheckCastSnippets.java Tue Aug 06 21:28:58 2013 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,215 +0,0 @@ -/* - * Copyright (c) 2012, 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.hotspot.replacements; - -import static com.oracle.graal.api.code.DeoptimizationAction.*; -import static com.oracle.graal.api.meta.DeoptimizationReason.*; -import static com.oracle.graal.hotspot.replacements.HotSpotReplacementsUtil.*; -import static com.oracle.graal.hotspot.replacements.TypeCheckSnippetUtils.*; -import static com.oracle.graal.nodes.extended.BranchProbabilityNode.*; -import static com.oracle.graal.nodes.extended.UnsafeCastNode.*; -import static com.oracle.graal.phases.GraalOptions.*; -import static com.oracle.graal.replacements.SnippetTemplate.*; - -import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; -import com.oracle.graal.debug.*; -import com.oracle.graal.graph.Node.NodeIntrinsic; -import com.oracle.graal.hotspot.meta.*; -import com.oracle.graal.nodes.*; -import com.oracle.graal.nodes.java.*; -import com.oracle.graal.nodes.spi.*; -import com.oracle.graal.nodes.type.*; -import com.oracle.graal.replacements.*; -import com.oracle.graal.replacements.Snippet.ConstantParameter; -import com.oracle.graal.replacements.Snippet.VarargsParameter; -import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; -import com.oracle.graal.replacements.SnippetTemplate.Arguments; -import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; -import com.oracle.graal.replacements.nodes.*; -import com.oracle.graal.word.*; - -/** - * Snippets used for implementing the type test of a checkcast instruction. - * - * The type tests implemented are described in the paper Fast subtype checking in the HotSpot JVM by - * Cliff Click and John Rose. - */ -public class CheckCastSnippets implements Snippets { - - @NodeIntrinsic(BreakpointNode.class) - static native void bkpt(Object object, Word hub, Word objectHub); - - /** - * Type test used when the type being tested against is a final type. - */ - @Snippet - public static Object checkcastExact(Object object, Word exactHub, @ConstantParameter boolean checkNull) { - if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { - isNull.inc(); - } else { - Word objectHub = loadHub(object); - if (objectHub.notEqual(exactHub)) { - exactMiss.inc(); - DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); - } - exactHit.inc(); - } - /* - * make sure that the unsafeCast is done *after* the check above, cf. ReadAfterCheckCast - */ - BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); - return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); - } - - /** - * Type test used when the type being tested against is a restricted primary type. - * - * This test ignores use of hints altogether as the display-based type check only involves one - * extra load where the second load should hit the same cache line as the first. - */ - @Snippet - public static Object checkcastPrimary(Word hub, Object object, @ConstantParameter int superCheckOffset, @ConstantParameter boolean checkNull) { - if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { - isNull.inc(); - } else { - Word objectHub = loadHub(object); - if (objectHub.readWord(superCheckOffset, LocationIdentity.FINAL_LOCATION).notEqual(hub)) { - displayMiss.inc(); - DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); - } - displayHit.inc(); - } - BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); - return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); - } - - /** - * Type test used when the type being tested against is a restricted secondary type. - */ - @Snippet - public static Object checkcastSecondary(Word hub, Object object, @VarargsParameter Word[] hints, @ConstantParameter boolean checkNull) { - if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { - isNull.inc(); - } else { - Word objectHub = loadHub(object); - // if we get an exact match: succeed immediately - ExplodeLoopNode.explodeLoop(); - for (int i = 0; i < hints.length; i++) { - Word hintHub = hints[i]; - if (hintHub.equal(objectHub)) { - hintsHit.inc(); - BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); - return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); - } - } - if (!checkSecondarySubType(hub, objectHub)) { - DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); - } - } - BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); - return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); - } - - /** - * Type test used when the type being tested against is not known at compile time (e.g. the type - * test in an object array store check). - */ - @Snippet - public static Object checkcastDynamic(Word hub, Object object, @ConstantParameter boolean checkNull) { - if (checkNull && probability(NOT_FREQUENT_PROBABILITY, object == null)) { - isNull.inc(); - } else { - Word objectHub = loadHub(object); - if (!checkUnknownSubType(hub, objectHub)) { - DeoptimizeNode.deopt(InvalidateReprofile, ClassCastException); - } - } - BeginNode anchorNode = BeginNode.anchor(StampFactory.forNodeIntrinsic()); - return unsafeCast(verifyOop(object), StampFactory.forNodeIntrinsic(), anchorNode); - } - - public static class Templates extends AbstractTemplates { - - private final SnippetInfo exact = snippet(CheckCastSnippets.class, "checkcastExact"); - private final SnippetInfo primary = snippet(CheckCastSnippets.class, "checkcastPrimary"); - private final SnippetInfo secondary = snippet(CheckCastSnippets.class, "checkcastSecondary"); - private final SnippetInfo dynamic = snippet(CheckCastSnippets.class, "checkcastDynamic"); - - public Templates(CodeCacheProvider runtime, Replacements replacements, TargetDescription target) { - super(runtime, replacements, target); - } - - /** - * Lowers a checkcast node. - */ - public void lower(CheckCastNode checkcast, LoweringTool tool) { - StructuredGraph graph = checkcast.graph(); - ValueNode object = checkcast.object(); - HotSpotResolvedObjectType type = (HotSpotResolvedObjectType) checkcast.type(); - TypeCheckHints hintInfo = new TypeCheckHints(checkcast.type(), checkcast.profile(), tool.assumptions(), CheckcastMinHintHitProbability.getValue(), CheckcastMaxHints.getValue()); - ValueNode hub = ConstantNode.forConstant(type.klass(), runtime, checkcast.graph()); - - Arguments args; - if (hintInfo.exact != null) { - args = new Arguments(exact); - args.add("object", object); - args.add("exactHub", ConstantNode.forConstant(((HotSpotResolvedObjectType) hintInfo.exact).klass(), runtime, graph)); - } else if (type.isPrimaryType()) { - args = new Arguments(primary); - args.add("hub", hub); - args.add("object", object); - args.addConst("superCheckOffset", type.superCheckOffset()); - } else { - ConstantNode[] hints = createHints(hintInfo, runtime, true, graph).hubs; - args = new Arguments(secondary); - args.add("hub", hub); - args.add("object", object); - args.addVarargs("hints", Word.class, StampFactory.forKind(getWordKind()), hints); - } - args.addConst("checkNull", !object.stamp().nonNull()); - - SnippetTemplate template = template(args); - Debug.log("Lowering checkcast in %s: node=%s, template=%s, arguments=%s", graph, checkcast, template, args); - template.instantiate(runtime, checkcast, DEFAULT_REPLACER, args); - } - - /** - * Lowers a dynamic checkcast node. - */ - public void lower(CheckCastDynamicNode checkcast) { - StructuredGraph graph = checkcast.graph(); - ValueNode object = checkcast.object(); - - Arguments args = new Arguments(dynamic); - args.add("hub", checkcast.type()); - args.add("object", object); - args.addConst("checkNull", !object.stamp().nonNull()); - - SnippetTemplate template = template(args); - Debug.log("Lowering dynamic checkcast in %s: node=%s, template=%s, arguments=%s", graph, checkcast, template, args); - template.instantiate(runtime, checkcast, DEFAULT_REPLACER, args); - } - } -} diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/CRC32_update.java --- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/CRC32_update.java Tue Aug 06 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/CRC32_update.java Tue Aug 06 22:12:12 2013 +0200 @@ -28,6 +28,10 @@ import com.oracle.graal.jtt.*; +/** + * Tests compiled call to {@link CRC32#update(int, int)}. + */ +@SuppressWarnings("javadoc") public class CRC32_update extends JTTTest { public static long test(byte[] input) { diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/CRC32_updateBytes.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/jdk/CRC32_updateBytes.java Tue Aug 06 22:12:12 2013 +0200 @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2007, 2012, 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.jtt.jdk; + +import java.util.zip.*; + +import org.junit.*; + +import com.oracle.graal.jtt.*; + +/** + * Tests compiled call to {@link CRC32#updateBytes(int, byte[], int, int)}. + */ +@SuppressWarnings("javadoc") +public class CRC32_updateBytes extends JTTTest { + + public static long test(byte[] input) { + CRC32 crc = new CRC32(); + crc.update(input, 0, input.length); + return crc.getValue(); + } + + @Test + public void run0() throws Throwable { + runTest("test", "some string".getBytes()); + } + +} diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Tue Aug 06 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Tue Aug 06 22:12:12 2013 +0200 @@ -35,7 +35,7 @@ public final class CheckCastDynamicNode extends FixedWithNextNode implements Canonicalizable, Lowerable, Node.IterableNodeType { @Input private ValueNode object; - @Input private ValueNode type; + @Input private ValueNode hub; /** * Determines the exception thrown by this node if the check fails: {@link ClassCastException} @@ -44,12 +44,12 @@ private final boolean forStoreCheck; /** - * @param type the type being cast to - * @param object the instruction producing the object + * @param hub the type being cast to + * @param object the object being cast */ - public CheckCastDynamicNode(ValueNode type, ValueNode object, boolean forStoreCheck) { + public CheckCastDynamicNode(ValueNode hub, ValueNode object, boolean forStoreCheck) { super(object.stamp()); - this.type = type; + this.hub = hub; this.object = object; this.forStoreCheck = forStoreCheck; } @@ -79,8 +79,8 @@ if (object().objectStamp().alwaysNull()) { return object(); } - if (type().isConstant() && type().kind() == Kind.Object && type().asConstant().asObject() instanceof Class) { - Class clazz = (Class) type().asConstant().asObject(); + if (hub.isConstant() && hub.kind() == Kind.Object && hub.asConstant().asObject() instanceof Class) { + Class clazz = (Class) hub.asConstant().asObject(); ResolvedJavaType t = tool.runtime().lookupJavaType(clazz); return graph().add(new CheckCastNode(t, object(), null, forStoreCheck)); } @@ -94,8 +94,8 @@ /** * Gets the runtime-loaded type being cast to. */ - public ValueNode type() { - return type; + public ValueNode hub() { + return hub; } @NodeIntrinsic diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Tue Aug 06 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Tue Aug 06 22:12:12 2013 +0200 @@ -69,10 +69,6 @@ return forStoreCheck; } - // TODO (ds) remove once performance regression in compiler.sunflow (and other benchmarks) - // caused by new lowering is fixed - private static final boolean useNewLowering = true; // Boolean.getBoolean("graal.checkcast.useNewLowering"); - /** * Lowers a {@link CheckCastNode} to a {@link GuardingPiNode}. That is: * @@ -101,33 +97,29 @@ */ @Override public void lower(LoweringTool tool, LoweringType loweringType) { - if (useNewLowering) { - InstanceOfNode typeTest = graph().add(new InstanceOfNode(type, object, profile)); - Stamp stamp = StampFactory.declared(type).join(object.stamp()); - ValueNode condition; - if (stamp == null) { - // This is a check cast that will always fail - condition = LogicConstantNode.contradiction(graph()); - stamp = StampFactory.declared(type); - } else if (object.stamp().nonNull()) { + InstanceOfNode typeTest = graph().add(new InstanceOfNode(type, object, profile)); + Stamp stamp = StampFactory.declared(type).join(object.stamp()); + ValueNode condition; + if (stamp == null) { + // This is a check cast that will always fail + condition = LogicConstantNode.contradiction(graph()); + stamp = StampFactory.declared(type); + } else if (object.stamp().nonNull()) { + condition = typeTest; + } else { + if (profile != null && profile.getNullSeen() == TriState.FALSE) { + FixedGuardNode nullGuard = graph().add(new FixedGuardNode(graph().unique(new IsNullNode(object)), UnreachedCode, DeoptimizationAction.InvalidateReprofile, true)); + graph().addBeforeFixed(this, nullGuard); condition = typeTest; + stamp = stamp.join(StampFactory.objectNonNull()); } else { - if (profile != null && profile.getNullSeen() == TriState.FALSE) { - FixedGuardNode nullGuard = graph().add(new FixedGuardNode(graph().unique(new IsNullNode(object)), UnreachedCode, DeoptimizationAction.InvalidateReprofile, true)); - graph().addBeforeFixed(this, nullGuard); - condition = typeTest; - stamp = stamp.join(StampFactory.objectNonNull()); - } else { - // TODO (ds) replace with probability of null-seen when available - double shortCircuitProbability = NOT_FREQUENT_PROBABILITY; - condition = graph().unique(new ShortCircuitOrNode(graph().unique(new IsNullNode(object)), false, typeTest, false, shortCircuitProbability)); - } + // TODO (ds) replace with probability of null-seen when available + double shortCircuitProbability = NOT_FREQUENT_PROBABILITY; + condition = graph().unique(new ShortCircuitOrNode(graph().unique(new IsNullNode(object)), false, typeTest, false, shortCircuitProbability)); } - GuardingPiNode checkedObject = graph().add(new GuardingPiNode(object, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, stamp)); - graph().replaceFixedWithFixed(this, checkedObject); - } else { - tool.getRuntime().lower(this, tool); } + GuardingPiNode checkedObject = graph().add(new GuardingPiNode(object, condition, false, forStoreCheck ? ArrayStoreException : ClassCastException, InvalidateReprofile, stamp)); + graph().replaceFixedWithFixed(this, checkedObject); } @Override diff -r 038a598da996 -r cf9603cd8b13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java Tue Aug 06 21:28:58 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfDynamicNode.java Tue Aug 06 22:12:12 2013 +0200 @@ -39,16 +39,13 @@ @Input private ValueNode mirror; /** - * Constructs a new InstanceOfNode. - * - * @param mirror the {@link Class} value representing the target target type of the instanceof - * check - * @param object the object being tested by the instanceof + * @param mirror the {@link Class} value representing the target target type of the test + * @param object the object being tested */ public InstanceOfDynamicNode(ValueNode mirror, ValueNode object) { this.mirror = mirror; this.object = object; - assert mirror.kind() == Kind.Object; + assert mirror.kind() == Kind.Object : mirror.kind(); assert mirror.objectStamp().isExactType(); assert mirror.objectStamp().type().getName().equals("Ljava/lang/Class;"); } diff -r 038a598da996 -r cf9603cd8b13 mx/commands.py --- a/mx/commands.py Tue Aug 06 21:28:58 2013 +0200 +++ b/mx/commands.py Tue Aug 06 22:12:12 2013 +0200 @@ -763,7 +763,14 @@ prefixArgs = ['-esa', '-ea'] else: prefixArgs = ['-XX:-BootstrapGraal', '-esa', '-ea'] - vm(prefixArgs + vmArgs + ['-cp', projectscp + os.pathsep + mxdir, name] + [testfile]) + with open(testfile) as fp: + testclasses = [l.rstrip() for l in fp.readlines()] + if len(testclasses) == 1: + # Execute Junit directly when one test is being run. This simplifies + # replaying the VM execution in a native debugger (e.g., gdb). + vm(prefixArgs + vmArgs + ['-cp', projectscp, 'org.junit.runner.JUnitCore'] + testclasses) + else: + vm(prefixArgs + vmArgs + ['-cp', projectscp + os.pathsep + mxdir, name] + [testfile]) try: _run_tests(args, harness, annotations, testfile) diff -r 038a598da996 -r cf9603cd8b13 src/cpu/x86/vm/templateInterpreter_x86_64.cpp --- a/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Tue Aug 06 21:28:58 2013 +0200 +++ b/src/cpu/x86/vm/templateInterpreter_x86_64.cpp Tue Aug 06 22:12:12 2013 +0200 @@ -925,7 +925,7 @@ address entry = __ pc(); // rbx,: Method* - // rsi: senderSP must preserved for slow path, set SP to it on fast path + // r13: senderSP must preserved for slow path, set SP to it on fast path // rdx: scratch // rdi: scratch @@ -956,7 +956,7 @@ // _areturn __ pop(rdi); // get return address - __ mov(rsp, rsi); // set sp to sender sp + __ mov(rsp, r13); // set sp to sender sp __ jmp(rdi); // generate a vanilla native entry as the slow path @@ -995,20 +995,24 @@ const Register crc = c_rarg0; // crc const Register buf = c_rarg1; // source java byte array address const Register len = c_rarg2; // length + const Register off = len; // offset (never overlaps with 'len') // Arguments are reversed on java expression stack - __ movl(len, Address(rsp, wordSize)); // Length // Calculate address of start element if (kind == Interpreter::java_util_zip_CRC32_updateByteBuffer) { __ movptr(buf, Address(rsp, 3*wordSize)); // long buf - __ addptr(buf, Address(rsp, 2*wordSize)); // + offset + __ movl(len, Address(rsp, 2*wordSize)); // offset + __ addq(buf, len); // + offset __ movl(crc, Address(rsp, 5*wordSize)); // Initial CRC } else { __ movptr(buf, Address(rsp, 3*wordSize)); // byte[] array __ addptr(buf, arrayOopDesc::base_offset_in_bytes(T_BYTE)); // + header size - __ addptr(buf, Address(rsp, 2*wordSize)); // + offset + __ movl(len, Address(rsp, 2*wordSize)); // offset + __ addq(buf, len); // + offset __ movl(crc, Address(rsp, 4*wordSize)); // Initial CRC } + // Can now load 'len' since we're finished with 'off' + __ movl(len, Address(rsp, wordSize)); // Length __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, StubRoutines::updateBytesCRC32()), crc, buf, len); // result in rax diff -r 038a598da996 -r cf9603cd8b13 src/share/vm/runtime/arguments.cpp --- a/src/share/vm/runtime/arguments.cpp Tue Aug 06 21:28:58 2013 +0200 +++ b/src/share/vm/runtime/arguments.cpp Tue Aug 06 22:12:12 2013 +0200 @@ -2218,15 +2218,6 @@ warning("forcing ScavengeRootsInCode non-zero because Graal is enabled"); ScavengeRootsInCode = 1; } - - if (UseCRC32Intrinsics) { - // For some yet to be determined reason, enabling CRC32 intrinsics causes - // a Graal compiled call to 'static java.util.zip.CRC32.update(int crc, int b)' - // to crash the VM - warning("disabling CRC32 intrinsics because Graal is enabled"); - } - // This prevents the flag being set to true by VM_Version::get_processor_features() - FLAG_SET_CMDLINE(bool, UseCRC32Intrinsics, false); #endif // Need to limit the extent of the padding to reasonable size.