# HG changeset patch # User Thomas Wuerthinger # Date 1421837737 -3600 # Node ID e8fd0342d9c468a73c8349ffea84b1c47feba8f5 # Parent 323ac2b4d9888b1f5361c735c53a56e1775de4e3 GraphBuilder simplifications. diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineBytecodeParser.java --- 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); diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.baseline/src/com/oracle/graal/baseline/BaselineCompiler.java --- 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 { diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXWrapperBuilder.java --- 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); diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.java/src/com/oracle/graal/java/AbstractBytecodeParser.java --- 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) { diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- 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); diff -r 323ac2b4d988 -r e8fd0342d9c4 graal/com.oracle.graal.java/src/com/oracle/graal/java/HIRFrameStateBuilder.java --- 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;