# HG changeset patch # User Christian Humer # Date 1387142412 -3600 # Node ID d4c6dd07be763878fe2ced63d1a0c688cc4e2fe7 # Parent 8531c47138dc56abf22dfc3442d7aa63e1db1bea SL: added exemplary uses of new profiling utility BranchProfile to SL. diff -r 8531c47138dc -r d4c6dd07be76 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/IfNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/IfNode.java Sun Dec 15 22:19:19 2013 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/IfNode.java Sun Dec 15 22:20:12 2013 +0100 @@ -24,6 +24,7 @@ import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.utilities.*; @NodeChild(value = "conditionNode", type = ConditionNode.class) public abstract class IfNode extends StatementNode { @@ -31,6 +32,9 @@ @Child private StatementNode thenPartNode; @Child private StatementNode elsePartNode; + private final BranchProfile ifBranch = new BranchProfile(); + private final BranchProfile elseBranch = new BranchProfile(); + public IfNode(StatementNode thenPart, StatementNode elsePart) { this.thenPartNode = adoptChild(thenPart); this.elsePartNode = adoptChild(elsePart); @@ -43,9 +47,11 @@ @Specialization public void doVoid(VirtualFrame frame, boolean condition) { if (condition) { + ifBranch.enter(); thenPartNode.executeVoid(frame); } else { if (elsePartNode != null) { + elseBranch.enter(); elsePartNode.executeVoid(frame); } } diff -r 8531c47138dc -r d4c6dd07be76 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadArgumentNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadArgumentNode.java Sun Dec 15 22:19:19 2013 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadArgumentNode.java Sun Dec 15 22:20:12 2013 +0100 @@ -23,12 +23,16 @@ package com.oracle.truffle.sl.nodes; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.sl.runtime.*; public class ReadArgumentNode extends TypedNode { private final int index; + private final BranchProfile outOfBounds = new BranchProfile(); + private final BranchProfile inBounds = new BranchProfile(); + public ReadArgumentNode(int index) { this.index = index; } @@ -37,8 +41,10 @@ public Object executeGeneric(VirtualFrame frame) { Object[] args = SLArguments.get(frame).arguments; if (index < args.length) { + inBounds.enter(); return args[index]; } else { + outOfBounds.enter(); return SLNull.INSTANCE; } } diff -r 8531c47138dc -r d4c6dd07be76 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadFunctionNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadFunctionNode.java Sun Dec 15 22:19:19 2013 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/ReadFunctionNode.java Sun Dec 15 22:20:12 2013 +0100 @@ -23,16 +23,15 @@ package com.oracle.truffle.sl.nodes; import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.utilities.*; import com.oracle.truffle.sl.runtime.*; public final class ReadFunctionNode extends TypedNode { private final SLFunctionRegistry registry; private final String name; - - @CompilationFinal private boolean seenInvalidFunction; + private final BranchProfile invalidFunction = new BranchProfile(); public ReadFunctionNode(SLFunctionRegistry registry, String name) { this.registry = registry; @@ -50,14 +49,8 @@ if (target != null) { return target; } - if (!seenInvalidFunction) { - CompilerDirectives.transferToInterpreter(); - seenInvalidFunction = true; - } - if (seenInvalidFunction) { - throw new RuntimeException("Function with name '" + name + "' not found."); - } - return null; + invalidFunction.enter(); + throw new RuntimeException("Function with name '" + name + "' not found."); } } diff -r 8531c47138dc -r d4c6dd07be76 graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WhileNode.java --- a/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WhileNode.java Sun Dec 15 22:19:19 2013 +0100 +++ b/graal/com.oracle.truffle.sl/src/com/oracle/truffle/sl/nodes/WhileNode.java Sun Dec 15 22:20:12 2013 +0100 @@ -23,6 +23,7 @@ package com.oracle.truffle.sl.nodes; import com.oracle.truffle.api.frame.*; +import com.oracle.truffle.api.utilities.*; public class WhileNode extends StatementNode { @@ -33,6 +34,11 @@ private final BreakException breakTarget; private final ContinueException continueTarget; + private final BranchProfile continueMismatch = new BranchProfile(); + private final BranchProfile continueMatch = new BranchProfile(); + private final BranchProfile breakMismatch = new BranchProfile(); + private final BranchProfile breakMatch = new BranchProfile(); + public WhileNode(ConditionNode condition, StatementNode body) { this.condition = adoptChild(condition); this.body = adoptChild(body); @@ -49,15 +55,19 @@ body.executeVoid(frame); } catch (ContinueException ex) { if (ex != continueTarget) { + continueMismatch.enter(); throw ex; } + continueMatch.enter(); // Fall through to next loop iteration. } } } catch (BreakException ex) { if (ex != breakTarget) { + breakMismatch.enter(); throw ex; } + breakMatch.enter(); // Done executing this loop, exit method to execute statement following the loop. } }