< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/nodes/ArrayEqualsNode.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2013, 2018, 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. --- 1,7 ---- /* ! * Copyright (c) 2013, 2019, 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.
*** 24,38 **** --- 24,41 ---- package org.graalvm.compiler.replacements.nodes; import static org.graalvm.compiler.nodeinfo.InputType.Memory; + import org.graalvm.compiler.api.replacements.Snippet; + import org.graalvm.compiler.core.common.spi.ForeignCallLinkage; import org.graalvm.compiler.core.common.type.StampFactory; import org.graalvm.compiler.graph.Node; import org.graalvm.compiler.graph.NodeClass; import org.graalvm.compiler.graph.spi.Canonicalizable; import org.graalvm.compiler.graph.spi.CanonicalizerTool; + import org.graalvm.compiler.lir.gen.LIRGeneratorTool; import org.graalvm.compiler.nodeinfo.NodeCycles; import org.graalvm.compiler.nodeinfo.NodeInfo; import org.graalvm.compiler.nodeinfo.NodeSize; import org.graalvm.compiler.nodes.ConstantNode; import org.graalvm.compiler.nodes.FixedWithNextNode;
*** 46,70 **** --- 49,83 ---- import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool; import org.graalvm.compiler.nodes.spi.Virtualizable; import org.graalvm.compiler.nodes.spi.VirtualizerTool; import org.graalvm.compiler.nodes.util.GraphUtil; import org.graalvm.compiler.nodes.virtual.VirtualObjectNode; + import org.graalvm.compiler.options.Option; + import org.graalvm.compiler.options.OptionKey; import jdk.internal.vm.compiler.word.LocationIdentity; import jdk.vm.ci.meta.ConstantReflectionProvider; import jdk.vm.ci.meta.JavaConstant; import jdk.vm.ci.meta.JavaKind; + import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.Value; // JaCoCo Exclude /** * Compares two arrays with the same length. */ @NodeInfo(cycles = NodeCycles.CYCLES_UNKNOWN, size = NodeSize.SIZE_128) public final class ArrayEqualsNode extends FixedWithNextNode implements LIRLowerable, Canonicalizable, Virtualizable, MemoryAccess { + public static class Options { + // @formatter:off + @Option(help = "Use Array equals stubs instead of embedding all the emitted code.") + public static final OptionKey<Boolean> ArrayEqualsStubs = new OptionKey<>(true); + // @formatter:on + } + public static final NodeClass<ArrayEqualsNode> TYPE = NodeClass.create(ArrayEqualsNode.class); /** {@link JavaKind} of the arrays to compare. */ protected final JavaKind kind; /** One array to be tested for equality. */
*** 176,186 **** } } } @NodeIntrinsic ! static native boolean equals(Object array1, Object array2, int length, @ConstantNodeParameter JavaKind kind); public static boolean equals(boolean[] array1, boolean[] array2, int length) { return equals(array1, array2, length, JavaKind.Boolean); } --- 189,199 ---- } } } @NodeIntrinsic ! public static native boolean equals(Object array1, Object array2, int length, @ConstantNodeParameter JavaKind kind); public static boolean equals(boolean[] array1, boolean[] array2, int length) { return equals(array1, array2, length, JavaKind.Boolean); }
*** 212,226 **** return equals(array1, array2, length, JavaKind.Double); } @Override public void generate(NodeLIRBuilderTool gen) { int constantLength = -1; if (length.isConstant()) { constantLength = length.asJavaConstant().asInt(); } ! Value result = gen.getLIRGeneratorTool().emitArrayEquals(kind, gen.operand(array1), gen.operand(array2), gen.operand(length), constantLength, false); gen.setResult(this, result); } @Override public LocationIdentity getLocationIdentity() { --- 225,253 ---- return equals(array1, array2, length, JavaKind.Double); } @Override public void generate(NodeLIRBuilderTool gen) { + LIRGeneratorTool tool = gen.getLIRGeneratorTool(); int constantLength = -1; if (length.isConstant()) { constantLength = length.asJavaConstant().asInt(); } ! ! if (Options.ArrayEqualsStubs.getValue(graph().getOptions())) { ! ResolvedJavaMethod method = graph().method(); ! if (method != null && method.getAnnotation(Snippet.class) == null) { ! ForeignCallLinkage linkage = tool.lookupArrayEqualsStub(kind, constantLength); ! if (linkage != null) { ! Value result = tool.emitForeignCall(linkage, null, gen.operand(array1), gen.operand(array2), gen.operand(length)); ! gen.setResult(this, result); ! return; ! } ! } ! } ! ! Value result = tool.emitArrayEquals(kind, gen.operand(array1), gen.operand(array2), gen.operand(length), constantLength, false); gen.setResult(this, result); } @Override public LocationIdentity getLocationIdentity() {
< prev index next >