< 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 >