Mercurial > hg > graal-compiler
changeset 22419:0074919ff69c
compiler intrinsic for "ensureVirtualized" functionality
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 10 Aug 2015 15:59:08 +0200 |
parents | d003c4c1782b |
children | 440c505123b4 |
files | graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/TruffleEnsureVirtualizedTest.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java |
diffstat | 2 files changed, 290 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/TruffleEnsureVirtualizedTest.java Mon Aug 10 15:59:08 2015 +0200 @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2015, 2015, 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.truffle.test; + +import jdk.internal.jvmci.code.*; + +import org.junit.*; + +import com.oracle.graal.api.directives.*; +import com.oracle.graal.truffle.test.nodes.*; +import com.oracle.truffle.api.frame.*; + +public class TruffleEnsureVirtualizedTest extends PartialEvaluationTest { + + private abstract class TestNode extends AbstractTestNode { + @Override + public int execute(VirtualFrame frame) { + executeVoid(frame); + return 0; + } + + public abstract void executeVoid(VirtualFrame frame); + } + + private void testEnsureVirtualized(boolean bailoutExpected, TestNode node) { + RootTestNode rootNode = new RootTestNode(new FrameDescriptor(), "ensureVirtualized", node); + try { + compileHelper("ensureVirtualized", rootNode, new Object[0]); + if (bailoutExpected) { + Assert.fail("Expected bailout exception due to ensureVirtualized"); + } + } catch (BailoutException e) { + if (!bailoutExpected) { + throw e; + } + } + } + + public static int intField; + public static boolean booleanField; + public static Object field; + + @Test + public void test1() { + testEnsureVirtualized(false, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + GraalDirectives.ensureVirtualized(object); + } + }); + } + + @Test + public void test2() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + GraalDirectives.ensureVirtualized(object); + field = object; // assert here + } + }); + } + + @Test + public void test3() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + field = object; + GraalDirectives.ensureVirtualized(object); // assert here + } + }); + } + + @Test + public void testHere1() { + testEnsureVirtualized(false, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + GraalDirectives.ensureVirtualizedHere(object); + } + }); + } + + @Test + public void testHere2() { + testEnsureVirtualized(false, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + GraalDirectives.ensureVirtualizedHere(object); + field = object; + } + }); + } + + @Test + public void testHere3() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + field = object; + GraalDirectives.ensureVirtualizedHere(object); // assert here + } + }); + } + + @Test + public void testBoxing1() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = intField; + GraalDirectives.ensureVirtualizedHere(object); // assert here + } + }); + } + + @Test + public void testBoxing2() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = intField; + GraalDirectives.ensureVirtualized(object); // assert here + field = object; + } + }); + } + + @Test + public void testControlFlow1() { + testEnsureVirtualized(false, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + if (booleanField) { + GraalDirectives.ensureVirtualized(object); + } + field = object; + } + }); + } + + @Test + public void testControlFlow2() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + if (booleanField) { + GraalDirectives.ensureVirtualized(object); + } else { + GraalDirectives.ensureVirtualized(object); + } + field = object; // assert here + } + }); + } + + @Test + public void testControlFlow3() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + GraalDirectives.ensureVirtualized(object); + if (booleanField) { + field = 1; + } else { + field = 2; + } + field = object; // assert here + } + }); + } + + @Test + public void testControlFlow4() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + if (booleanField) { + field = object; + } else { + field = 2; + } + GraalDirectives.ensureVirtualized(object); // assert here + } + }); + } + + @Test + public void testControlFlow5() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + if (booleanField) { + field = object; + } else { + field = 2; + } + GraalDirectives.ensureVirtualizedHere(object); // assert here + } + }); + } + + public static final class TestClass { + Object a; + Object b; + } + + @Test + public void testIndirect1() { + testEnsureVirtualized(true, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + TestClass t = new TestClass(); + t.a = object; + GraalDirectives.ensureVirtualized(object); + + if (booleanField) { + field = t; // assert here + } else { + field = 2; + } + } + }); + } + + @Test + public void testIndirect2() { + testEnsureVirtualized(false, new TestNode() { + @Override + public void executeVoid(VirtualFrame frame) { + Integer object = new Integer(intField); + TestClass t = new TestClass(); + t.a = object; + GraalDirectives.ensureVirtualized(t); + + if (booleanField) { + field = object; + } else { + field = 2; + } + } + }); + } +}
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java Mon Aug 10 15:57:05 2015 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java Mon Aug 10 15:59:08 2015 +0200 @@ -38,6 +38,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.replacements.nodes.arithmetic.*; import com.oracle.graal.truffle.*; import com.oracle.graal.truffle.nodes.*; @@ -203,6 +204,18 @@ return true; } }); + r.register1("ensureVirtualized", Object.class, new InvocationPlugin() { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { + b.add(new EnsureVirtualizedNode(object, false)); + return true; + } + }); + r.register1("ensureVirtualizedHere", Object.class, new InvocationPlugin() { + public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object) { + b.add(new EnsureVirtualizedNode(object, true)); + return true; + } + }); } public static void registerCompilerAssertsPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {