# HG changeset patch # User Christian Humer # Date 1408815100 -7200 # Node ID 534a87f866dc1d0204bf5c42d7fd13d6679ef274 # Parent 5ede308adf685c1f105ba47fefef2b028ae36603 Truffle: new experimental LoopNode API. diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java --- a/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Sat Aug 23 19:31:48 2014 +0200 +++ b/graal/com.oracle.graal.truffle.hotspot/src/com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime.java Sat Aug 23 19:31:40 2014 +0200 @@ -59,6 +59,7 @@ import com.oracle.truffle.api.CompilerDirectives.SlowPath; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.api.nodes.Node; /** * Implementation of the Truffle runtime when running on top of Graal. @@ -117,6 +118,13 @@ return new OptimizedCallTarget(rootNode, this, TruffleMinInvokeThreshold.getValue(), TruffleCompilationThreshold.getValue(), compilationPolicy, new HotSpotSpeculationLog()); } + public LoopNode createLoopNode(RepeatingNode repeating) { + if (!(repeating instanceof Node)) { + throw new IllegalArgumentException("Repeating node must be of type Node."); + } + return new OptimizedLoopNode(repeating); + } + public DirectCallNode createDirectCallNode(CallTarget target) { if (target instanceof OptimizedCallTarget) { return new OptimizedDirectCallNode((OptimizedCallTarget) target); diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedLoopNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedLoopNode.java Sat Aug 23 19:31:40 2014 +0200 @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2014, 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; + +import com.oracle.truffle.api.*; +import com.oracle.truffle.api.CompilerDirectives.*; +import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.nodes.*; + +/** + * Temporary node for legacy loop count reporting support as it was most likely done in other + * implementations. + */ +public final class OptimizedLoopNode extends LoopNode { + + @CompilationFinal private int loopCount; + + public OptimizedLoopNode(RepeatingNode body) { + super(body); + } + + @Override + public void executeLoop(VirtualFrame frame) { + try { + do { + } while (executeBody(frame)); + } finally { + loopDone(); + } + } + + private final boolean executeBody(VirtualFrame frame) { + boolean result = executeRepeatNode(frame); + if (CompilerDirectives.inInterpreter()) { + if (result) { + loopCount++; + } + } + return result; + } + + private void loopDone() { + if (CompilerDirectives.inInterpreter()) { + getRootNode().reportLoopCount(loopCount); + loopCount = 0; + } + } +} \ No newline at end of file diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleRuntime.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleRuntime.java Sat Aug 23 19:31:48 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/TruffleRuntime.java Sat Aug 23 19:31:40 2014 +0200 @@ -59,6 +59,11 @@ DirectCallNode createDirectCallNode(CallTarget target); /** + * Experimental API. May change without notice. + */ + LoopNode createLoopNode(RepeatingNode body); + + /** * Creates a new runtime specific version of {@link IndirectCallNode}. * * @return the new call node @@ -135,4 +140,5 @@ * Internal API method. Do not use. */ void notifyTransferToInterpreter(); + } diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultLoopNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultLoopNode.java Sat Aug 23 19:31:40 2014 +0200 @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2014, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.truffle.api.impl; + +import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.nodes.*; + +public final class DefaultLoopNode extends LoopNode { + + public DefaultLoopNode(RepeatingNode repeatNode) { + super(repeatNode); + } + + @Override + public void executeLoop(VirtualFrame frame) { + do { + } while (executeRepeatNode(frame)); + } +} diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultTruffleRuntime.java --- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultTruffleRuntime.java Sat Aug 23 19:31:48 2014 +0200 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/impl/DefaultTruffleRuntime.java Sat Aug 23 19:31:40 2014 +0200 @@ -138,4 +138,11 @@ public void notifyTransferToInterpreter() { } + + public LoopNode createLoopNode(RepeatingNode repeating) { + if (!(repeating instanceof Node)) { + throw new IllegalArgumentException("Repeating node must be of type Node."); + } + return new DefaultLoopNode(repeating); + } } diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/LoopNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/LoopNode.java Sat Aug 23 19:31:40 2014 +0200 @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2014, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.truffle.api.nodes; + +import com.oracle.truffle.api.frame.*; + +/** + * Experimental API: may change significantly without notice. + */ +public abstract class LoopNode extends Node { + + /* + * TODO Unfortunately we cannot yet use interface typed fields as child fields. + */ + @Child protected Node repeatingNode; + + public LoopNode(RepeatingNode repeatintNode) { + this.repeatingNode = (Node) repeatintNode; + } + + public abstract void executeLoop(VirtualFrame frame); + + protected final boolean executeRepeatNode(VirtualFrame frame) { + return getRepeatNode().executeRepeating(frame); + } + + public final RepeatingNode getRepeatNode() { + return (RepeatingNode) repeatingNode; + } + +} diff -r 5ede308adf68 -r 534a87f866dc graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RepeatingNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/RepeatingNode.java Sat Aug 23 19:31:40 2014 +0200 @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2012, 2013, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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.truffle.api.nodes; + +import com.oracle.truffle.api.frame.*; + +/** + * Experimental API: may change significantly without notice. + */ +public interface RepeatingNode { + + boolean executeRepeating(VirtualFrame frame); + +}