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