Mercurial > hg > graal-compiler
changeset 19629:0e90dbf0b9fd
Add merge boolean property to ExplodeLoop annotation to indicate that backward branches should be merged if possible.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Fri, 27 Feb 2015 14:06:36 +0100 |
parents | 34e984e9560e |
children | 490f2c54c28a |
files | graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java |
diffstat | 5 files changed, 19 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Feb 27 14:02:15 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Fri Feb 27 14:06:36 2015 +0100 @@ -203,6 +203,7 @@ private FixedWithNextNode lastInstr; // the last instruction added private final boolean explodeLoops; + private final boolean mergeExplosions; private Stack<ExplodedLoopContext> explodeLoopsContext; private int nextPeelIteration = 1; private boolean controlFlowSplit; @@ -230,8 +231,14 @@ LoopExplosionPlugin loopExplosionPlugin = graphBuilderConfig.getLoopExplosionPlugin(); if (loopExplosionPlugin != null) { explodeLoops = loopExplosionPlugin.shouldExplodeLoops(method); + if (explodeLoops) { + mergeExplosions = loopExplosionPlugin.shouldMergeExplosions(method); + } else { + mergeExplosions = false; + } } else { explodeLoops = false; + mergeExplosions = false; } }
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Fri Feb 27 14:02:15 2015 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugin.java Fri Feb 27 14:06:36 2015 +0100 @@ -73,6 +73,8 @@ public interface LoopExplosionPlugin extends GraphBuilderPlugin { boolean shouldExplodeLoops(ResolvedJavaMethod method); + + boolean shouldMergeExplosions(ResolvedJavaMethod method); } public interface ParameterPlugin extends GraphBuilderPlugin {
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java Fri Feb 27 14:02:15 2015 +0100 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/BytecodeInterpreterPartialEvaluationTest.java Fri Feb 27 14:06:36 2015 +0100 @@ -41,15 +41,11 @@ public static class Program extends RootNode { @CompilationFinal final byte[] bytecodes; - private final int maxStack; - private final int maxLocals; @CompilationFinal private final FrameSlot[] locals; @CompilationFinal private final FrameSlot[] stack; public Program(byte[] bytecodes, int maxLocals, int maxStack) { this.bytecodes = bytecodes; - this.maxLocals = maxLocals; - this.maxStack = maxStack; locals = new FrameSlot[maxLocals]; stack = new FrameSlot[maxStack]; for (int i = 0; i < maxLocals; ++i) { @@ -80,7 +76,7 @@ } @Override - @ExplodeLoop + @ExplodeLoop(merge = true) public Object execute(VirtualFrame frame) { int topOfStack = -1; int bci = 0;
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Fri Feb 27 14:02:15 2015 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java Fri Feb 27 14:06:36 2015 +0100 @@ -238,6 +238,14 @@ return method.getAnnotation(ExplodeLoop.class) != null; } + public boolean shouldMergeExplosions(ResolvedJavaMethod method) { + ExplodeLoop explodeLoop = method.getAnnotation(ExplodeLoop.class); + if (explodeLoop != null) { + return explodeLoop.merge(); + } + return false; + } + } @SuppressWarnings("unused")
--- a/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java Fri Feb 27 14:02:15 2015 +0100 +++ b/graal/com.oracle.truffle.api/src/com/oracle/truffle/api/nodes/ExplodeLoop.java Fri Feb 27 14:06:36 2015 +0100 @@ -33,4 +33,5 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ExplodeLoop { + boolean merge() default false; }