< prev index next >
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.replacements.test/src/org/graalvm/compiler/replacements/test/ReplacementsParseTest.java
Print this page
@@ -22,10 +22,11 @@
*/
package org.graalvm.compiler.replacements.test;
+import static org.graalvm.compiler.debug.DebugOptions.DumpOnError;
import static org.graalvm.compiler.java.BytecodeParserOptions.InlinePartialIntrinsicExitDuringParsing;
import java.util.function.Function;
import org.graalvm.compiler.api.directives.GraalDirectives;
@@ -38,19 +39,23 @@
import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
import org.graalvm.compiler.core.common.spi.ForeignCallsProvider;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.debug.DebugContext;
+import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.graph.GraalGraphError;
import org.graalvm.compiler.graph.Node.ConstantNodeParameter;
import org.graalvm.compiler.graph.Node.NodeIntrinsic;
+import org.graalvm.compiler.java.BytecodeParser.BytecodeParserError;
import org.graalvm.compiler.nodes.FrameState;
import org.graalvm.compiler.nodes.PiNode;
import org.graalvm.compiler.nodes.StructuredGraph;
+import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
+import org.graalvm.compiler.nodes.StructuredGraph.Builder;
import org.graalvm.compiler.nodes.ValueNode;
-import org.graalvm.compiler.nodes.extended.OpaqueNode;
import org.graalvm.compiler.nodes.extended.ForeignCallNode;
+import org.graalvm.compiler.nodes.extended.OpaqueNode;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin.Receiver;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Registration;
@@ -62,12 +67,14 @@
import org.graalvm.compiler.phases.common.FloatingReadPhase;
import org.graalvm.compiler.phases.common.FrameStateAssignmentPhase;
import org.graalvm.compiler.phases.common.GuardLoweringPhase;
import org.graalvm.compiler.phases.common.LoweringPhase;
import org.graalvm.compiler.phases.tiers.HighTierContext;
+import org.graalvm.compiler.test.GraalTest;
import jdk.internal.vm.compiler.word.LocationIdentity;
import org.junit.Assert;
+import org.junit.Assume;
import org.junit.BeforeClass;
import org.junit.Test;
import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.meta.JavaKind;
@@ -188,10 +195,14 @@
}
static int nonVoidIntrinsicWithOptimizedSplit(int x) {
return x;
}
+
+ static int div(int x, int y) {
+ return x / y;
+ }
}
@ClassSubstitution(TestObject.class)
static class TestObjectSubstitutions {
@@ -285,10 +296,16 @@
nonVoidIntrinsicWithCallStub(x);
}
return x;
}
+ @MethodSubstitution
+ static int div(int x, int y) {
+ assert y != 0;
+ return x / y;
+ }
+
public static void nonVoidIntrinsicWithCallStub(int zLen) {
nonVoidIntrinsicWithCallStub(STUB_CALL, zLen);
}
static final ForeignCallDescriptor STUB_CALL = new ForeignCallDescriptor("stubCall", void.class, int.class);
@@ -309,10 +326,11 @@
r.registerMethodSubstitution(TestObjectSubstitutions.class, "stringizeId", Receiver.class);
r.registerMethodSubstitution(TestObjectSubstitutions.class, "copyFirst", byte[].class, byte[].class, boolean.class);
r.registerMethodSubstitution(TestObjectSubstitutions.class, "copyFirstL2R", byte[].class, byte[].class);
r.registerMethodSubstitution(TestObjectSubstitutions.class, "nonVoidIntrinsicWithCall", int.class, int.class);
r.registerMethodSubstitution(TestObjectSubstitutions.class, "nonVoidIntrinsicWithOptimizedSplit", int.class);
+ r.registerMethodSubstitution(TestObjectSubstitutions.class, "div", int.class, int.class);
if (replacementBytecodeProvider.supportsInvokedynamic()) {
r.registerMethodSubstitution(TestObjectSubstitutions.class, "identity", String.class);
}
super.registerInvocationPlugins(invocationPlugins);
@@ -355,10 +373,11 @@
* constructor is deleted.
*/
@Test
public void testNextAfter() {
+ Assume.assumeFalse(GraalTest.Java8OrEarlier);
double[] inArray = new double[1024];
double[] outArray = new double[1024];
for (int i = 0; i < inArray.length; i++) {
inArray[i] = -0.0;
}
@@ -588,10 +607,27 @@
@Test
public void testNonVoidIntrinsicWithOptimizedSplit() {
testGraph("nonVoidIntrinsicWithOptimizedSplit");
}
+ public static int div(int x, int y) {
+ return TestObject.div(x, y);
+ }
+
+ @Test
+ public void testAssertionInMethodSubstitution() {
+ try {
+ ResolvedJavaMethod method = getResolvedJavaMethod("div");
+ // avoid dumping graphs and printing exception since and exception is expected
+ OptionValues options = new OptionValues(getInitialOptions(), DumpOnError, false);
+ parse(new Builder(options, getDebugContext(options, null, method), AllowAssumptions.YES).method(method).compilationId(getCompilationId(method)), getEagerGraphBuilderSuite());
+ throw GraalError.shouldNotReachHere("BytecodeParser should have complained about using assertion in an intrinsic.");
+ } catch (BytecodeParserError e) {
+ // Expected behavior
+ }
+ }
+
@SuppressWarnings("try")
private void testGraph(String name) {
StructuredGraph graph = parseEager(name, StructuredGraph.AllowAssumptions.YES);
try (DebugContext.Scope s0 = graph.getDebug().scope(name, graph)) {
for (OpaqueNode node : graph.getNodes().filter(OpaqueNode.class)) {
< prev index next >