changeset 18918:e8fd0342d9c4

GraphBuilder simplifications.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Wed, 21 Jan 2015 11:55:37 +0100
parents 323ac2b4d988
children 0061f550ef31
files graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXWrapperBuilder.java graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java
diffstat 6 files changed, 41 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java	Wed Jan 21 11:55:37 2015 +0100
@@ -29,7 +29,6 @@
 import com.oracle.graal.alloc.*;
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.bytecode.*;
 import com.oracle.graal.compiler.alloc.*;
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.compiler.common.calc.*;
@@ -73,9 +72,9 @@
     }
 
     public BaselineBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
-                    BaselineFrameStateBuilder frameState, BytecodeStream stream, int entryBCI, Backend backend) {
+                    BaselineFrameStateBuilder frameState, int entryBCI, Backend backend) {
 
-        super(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, stream, entryBCI);
+        super(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, entryBCI);
         this.backend = backend;
     }
 
@@ -83,7 +82,6 @@
         return lirGenRes;
     }
 
-    @Override
     protected void build() {
         if (PrintProfilingInformation.getValue()) {
             TTY.println("Profiling info for " + method.format("%H.%n(%p)"));
@@ -720,7 +718,6 @@
         resolver.dispose();
     }
 
-    @Override
     protected void processBlock(BciBlock block) {
         frameState = (BaselineFrameStateBuilder) block.entryState;
         setCurrentFrameState(frameState);
--- a/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java	Wed Jan 21 11:55:37 2015 +0100
@@ -52,12 +52,11 @@
     public CompilationResult generate(ResolvedJavaMethod method, int entryBCI, Backend backend, CompilationResult compilationResult, ResolvedJavaMethod installedCodeOwner,
                     CompilationResultBuilderFactory factory, OptimisticOptimizations optimisticOpts) {
         assert method.getCode() != null : "method must contain bytecodes: " + method;
-        BytecodeStream stream = new BytecodeStream(method.getCode());
         TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method);
 
         BaselineFrameStateBuilder frameState = new BaselineFrameStateBuilder(method);
 
-        BaselineBytecodeParser parser = new BaselineBytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, stream, entryBCI, backend);
+        BaselineBytecodeParser parser = new BaselineBytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, entryBCI, backend);
 
         // build blocks and LIR instructions
         try {
--- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXWrapperBuilder.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXWrapperBuilder.java	Wed Jan 21 11:55:37 2015 +0100
@@ -242,7 +242,8 @@
             append(new WriteNode(buf, nullWord, location, BarrierType.NONE, false));
         }
 
-        HIRFrameStateBuilder fsb = new HIRFrameStateBuilder(method, getGraph(), true);
+        HIRFrameStateBuilder fsb = new HIRFrameStateBuilder(method, getGraph());
+        fsb.initializeForMethodStart(true);
         FrameState fs = fsb.create(0);
         getGraph().start().setStateAfter(fs);
 
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java	Wed Jan 21 11:55:37 2015 +0100
@@ -62,15 +62,16 @@
     public static final int TRACELEVEL_STATE = 2;
 
     protected F frameState;
-    protected BytecodeStream stream;
-    protected GraphBuilderConfiguration graphBuilderConfig;
-    protected ResolvedJavaMethod method;
     protected BciBlock currentBlock;
-    protected ProfilingInfo profilingInfo;
-    protected OptimisticOptimizations optimisticOpts;
-    protected ConstantPool constantPool;
+
+    protected final BytecodeStream stream;
+    protected final GraphBuilderConfiguration graphBuilderConfig;
+    protected final ResolvedJavaMethod method;
+    protected final ProfilingInfo profilingInfo;
+    protected final OptimisticOptimizations optimisticOpts;
+    protected final ConstantPool constantPool;
     private final MetaAccessProvider metaAccess;
-    protected int entryBCI;
+    protected final int entryBCI;
 
     /**
      * Meters the number of actual bytecodes parsed.
@@ -78,12 +79,12 @@
     public static final DebugMetric BytecodesParsed = Debug.metric("BytecodesParsed");
 
     public AbstractBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts, F frameState,
-                    BytecodeStream stream, int entryBCI) {
+                    int entryBCI) {
         this.frameState = frameState;
         this.graphBuilderConfig = graphBuilderConfig;
         this.optimisticOpts = optimisticOpts;
         this.metaAccess = metaAccess;
-        this.stream = stream;
+        this.stream = new BytecodeStream(method.getCode());
         this.profilingInfo = method.getProfilingInfo();
         this.constantPool = method.getConstantPool();
         this.entryBCI = entryBCI;
@@ -91,19 +92,10 @@
         assert metaAccess != null;
     }
 
-    /**
-     * Start the bytecode parser.
-     */
-    protected abstract void build();
-
     public void setCurrentFrameState(F frameState) {
         this.frameState = frameState;
     }
 
-    public final void setStream(BytecodeStream stream) {
-        this.stream = stream;
-    }
-
     protected final BytecodeStream getStream() {
         return stream;
     }
@@ -917,8 +909,6 @@
         return optimisticOpts.removeNeverExecutedCode() && entryBCI == StructuredGraph.INVOCATION_ENTRY_BCI;
     }
 
-    protected abstract void processBlock(BciBlock block);
-
     protected abstract void iterateBytecodesForBlock(BciBlock block);
 
     public final void processBytecode(int bci, int opcode) {
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Jan 21 11:55:37 2015 +0100
@@ -82,7 +82,7 @@
 
         private final MetaAccessProvider metaAccess;
 
-        private BytecodeParser parser;
+        private ResolvedJavaMethod rootMethod;
 
         private ValueNode methodSynchronizedObject;
         private ExceptionDispatchBlock unwindBlock;
@@ -93,13 +93,6 @@
         private final OptimisticOptimizations optimisticOpts;
 
         /**
-         * Gets the current frame state being processed by this builder.
-         */
-        protected HIRFrameStateBuilder getCurrentFrameState() {
-            return parser.getFrameState();
-        }
-
-        /**
          * Gets the graph being processed by this builder.
          */
         protected StructuredGraph getGraph() {
@@ -116,6 +109,7 @@
         @Override
         protected void run(StructuredGraph graph) {
             ResolvedJavaMethod method = graph.method();
+            this.rootMethod = method;
             if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
                 lnt = method.getLineNumberTable();
                 previousLineNumber = -1;
@@ -125,28 +119,22 @@
             unwindBlock = null;
             methodSynchronizedObject = null;
             this.currentGraph = graph;
-            HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(method, graph, graphBuilderConfig.eagerResolving());
-            this.parser = createBytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, new BytecodeStream(method.getCode()), entryBCI);
+            HIRFrameStateBuilder frameState = new HIRFrameStateBuilder(method, graph);
+            frameState.initializeForMethodStart(graphBuilderConfig.eagerResolving());
             TTY.Filter filter = new TTY.Filter(PrintFilter.getValue(), method);
             try {
+                BytecodeParser parser = new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, entryBCI);
                 parser.build();
             } finally {
                 filter.remove();
             }
-            parser = null;
 
             ComputeLoopFrequenciesClosure.compute(graph);
         }
 
-        @SuppressWarnings("hiding")
-        protected BytecodeParser createBytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
-                        HIRFrameStateBuilder frameState, BytecodeStream stream, int entryBCI) {
-            return new BytecodeParser(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, stream, entryBCI);
-        }
-
         @Override
         protected String getDetailedName() {
-            return getName() + " " + parser.getMethod().format("%H.%n(%p):%r");
+            return getName() + " " + rootMethod.format("%H.%n(%p):%r");
         }
 
         private static class Target {
@@ -166,11 +154,10 @@
             private LocalLiveness liveness;
 
             public BytecodeParser(MetaAccessProvider metaAccess, ResolvedJavaMethod method, GraphBuilderConfiguration graphBuilderConfig, OptimisticOptimizations optimisticOpts,
-                            HIRFrameStateBuilder frameState, BytecodeStream stream, int entryBCI) {
-                super(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, stream, entryBCI);
+                            HIRFrameStateBuilder frameState, int entryBCI) {
+                super(metaAccess, method, graphBuilderConfig, optimisticOpts, frameState, entryBCI);
             }
 
-            @Override
             protected void build() {
                 if (PrintProfilingInformation.getValue()) {
                     TTY.println("Profiling info for " + method.format("%H.%n(%p)"));
@@ -185,15 +172,16 @@
                     liveness = blockMap.liveness;
 
                     lastInstr = currentGraph.start();
+                    frameState.clearNonLiveLocals(blockMap.startBlock, liveness, true);
+                    assert bci() == 0;
+                    ((StateSplit) lastInstr).setStateAfter(frameState.create(bci()));
+
                     if (method.isSynchronized()) {
                         // add a monitor enter to the start block
-                        currentGraph.start().setStateAfter(frameState.create(BytecodeFrame.BEFORE_BCI));
+                        currentGraph.start().stateAfter().replaceAndDelete(frameState.create(BytecodeFrame.BEFORE_BCI));
                         methodSynchronizedObject = synchronizedObject(frameState, method);
                         genMonitorEnter(methodSynchronizedObject);
                     }
-                    frameState.clearNonLiveLocals(blockMap.startBlock, liveness, true);
-                    assert bci() == 0;
-                    ((StateSplit) lastInstr).setStateAfter(frameState.create(bci()));
 
                     if (graphBuilderConfig.insertNonSafepointDebugInfo()) {
                         append(createInfoPointNode(InfopointReason.METHOD_START));
@@ -208,9 +196,9 @@
                     }
 
                     for (BciBlock block : blockMap.getBlocks()) {
-                        processBlock(block);
+                        processBlock(this, block);
                     }
-                    processBlock(unwindBlock);
+                    processBlock(this, unwindBlock);
 
                     Debug.dump(currentGraph, "After bytecode parsing");
 
@@ -1064,8 +1052,7 @@
                 }
             }
 
-            @Override
-            protected void processBlock(BciBlock block) {
+            protected void processBlock(BytecodeParser parser, BciBlock block) {
                 // Ignore blocks that have no predecessors by the time their bytecodes are parsed
                 if (block == null || block.firstInstruction == null) {
                     Debug.log("Ignoring block %s", block);
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java	Tue Jan 20 17:55:16 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java	Wed Jan 21 11:55:37 2015 +0100
@@ -44,13 +44,22 @@
     private MonitorIdNode[] monitorIds;
     private final StructuredGraph graph;
 
-    public HIRFrameStateBuilder(ResolvedJavaMethod method, StructuredGraph graph, boolean eagerResolve) {
+    /**
+     * Creates a new frame state builder for the given method and the given target graph.
+     * 
+     * @param method the method whose frame is simulated
+     * @param graph the target graph of Graal nodes created by the builder
+     */
+    public HIRFrameStateBuilder(ResolvedJavaMethod method, StructuredGraph graph) {
         super(method);
 
         assert graph != null;
 
         this.monitorIds = EMPTY_MONITOR_ARRAY;
         this.graph = graph;
+    }
+
+    public final void initializeForMethodStart(boolean eagerResolve) {
 
         int javaIndex = 0;
         int index = 0;