# HG changeset patch # User Josef Eisl # Date 1395146951 -3600 # Node ID 73774616a6b31961a538f35734521c2d883c488b # Parent 6352a2b94ca7e7817ddce7c1ad50c186a9bab8ec Decoupled LIRGenerator and LIRGenerationResult. diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -87,9 +87,9 @@ } } - public AMD64LIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); - lir.setSpillMoveFactory(new AMD64SpillMoveFactory()); + public AMD64LIRGenerator(StructuredGraph graph, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); + lirGenRes.getLIR().setSpillMoveFactory(new AMD64SpillMoveFactory()); } @Override @@ -982,7 +982,7 @@ sig[i] = node.arguments().get(i).stamp().javaType(getMetaAccess()); } - Value[] parameters = visitInvokeArguments(getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments()); + Value[] parameters = visitInvokeArguments(res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments()); append(new AMD64BreakpointOp(parameters)); } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java --- a/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler.hsail/src/com/oracle/graal/compiler/hsail/HSAILLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -76,9 +76,9 @@ } } - public HSAILLIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); - lir.setSpillMoveFactory(new HSAILSpillMoveFactory()); + public HSAILLIRGenerator(StructuredGraph graph, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); + lirGenRes.getLIR().setSpillMoveFactory(new HSAILSpillMoveFactory()); } @Override diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -89,11 +89,11 @@ } } - public PTXLIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); - lir.setSpillMoveFactory(new PTXSpillMoveFactory()); + public PTXLIRGenerator(StructuredGraph graph, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); + lirGenRes.getLIR().setSpillMoveFactory(new PTXSpillMoveFactory()); int callVariables = cc.getArgumentCount() + (cc.getReturn().equals(Value.ILLEGAL) ? 0 : 1); - lir.setFirstVariableNumber(callVariables); + lirGenRes.getLIR().setFirstVariableNumber(callVariables); nextPredRegNum = 0; } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -78,9 +78,9 @@ } } - public SPARCLIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); - lir.setSpillMoveFactory(new SPARCSpillMoveFactory()); + public SPARCLIRGenerator(StructuredGraph graph, Providers providers, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); + lirGenRes.getLIR().setSpillMoveFactory(new SPARCSpillMoveFactory()); } @Override @@ -930,7 +930,7 @@ sig[i] = node.arguments().get(i).stamp().javaType(getMetaAccess()); } - Value[] parameters = visitInvokeArguments(getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments()); + Value[] parameters = visitInvokeArguments(res.getFrameMap().registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments()); append(new SPARCBreakpointOp(parameters)); } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Tue Mar 18 13:49:11 2014 +0100 @@ -120,7 +120,7 @@ } CallingConvention cc = getCallingConvention(getCodeCache(), Type.JavaCallee, graph.method(), false); - LIRGenerator lirGen = GraalCompiler.emitLIR(getBackend(), getBackend().getTarget(), schedule, graph, null, cc); + LIRGenerationResult lirGen = GraalCompiler.emitLIR(getBackend(), getBackend().getTarget(), schedule, graph, null, cc); return new RegisterStats(lirGen.getLIR()); } } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Mar 18 13:49:11 2014 +0100 @@ -145,7 +145,7 @@ throw Debug.handle(e); } try (TimerCloseable a = BackEnd.start()) { - LIRGenerator lirGen = null; + LIRGenerationResult lirGen = null; lirGen = emitLIR(backend, target, schedule, graph, stub, cc); try (Scope s = Debug.scope("CodeGen", lirGen)) { emitCode(backend, assumptions, lirGen, compilationResult, installedCodeOwner, factory); @@ -210,18 +210,7 @@ } - private static void emitBlock(LIRGenerator lirGen, Block b, StructuredGraph graph, BlockMap> blockMap) { - if (lirGen.getLIR().getLIRforBlock(b) == null) { - for (Block pred : b.getPredecessors()) { - if (!b.isLoopHeader() || !pred.isLoopEnd()) { - emitBlock(lirGen, pred, graph, blockMap); - } - } - lirGen.doBlock(b, graph, blockMap); - } - } - - public static LIRGenerator emitLIR(Backend backend, TargetDescription target, SchedulePhase schedule, StructuredGraph graph, Object stub, CallingConvention cc) { + public static LIRGenerationResult emitLIR(Backend backend, TargetDescription target, SchedulePhase schedule, StructuredGraph graph, Object stub, CallingConvention cc) { Block[] blocks = schedule.getCFG().getBlocks(); Block startBlock = schedule.getCFG().getStartBlock(); assert startBlock != null; @@ -247,12 +236,12 @@ } try (Scope ds = Debug.scope("BackEnd", lir)) { FrameMap frameMap = backend.newFrameMap(); - LIRGenerator lirGen = backend.newLIRGenerator(graph, stub, frameMap, cc, lir); + LIRGenerationResult lirRes = backend.newLIRGenerationResult(lir, frameMap, stub); + LIRGenerator lirGen = backend.newLIRGenerator(graph, cc, lirRes); + NodeLIRGenerator nodeLirGen = new NodeLIRGenerator(); try (Scope s = Debug.scope("LIRGen", lirGen)) { - for (Block b : linearScanOrder) { - emitBlock(lirGen, b, graph, schedule.getBlockToNodesMap()); - } + nodeLirGen.generate(graph, lirRes, lirGen, linearScanOrder, schedule.getBlockToNodesMap()); lirGen.beforeRegisterAllocation(); Debug.dump(lir, "After LIR generation"); @@ -280,16 +269,16 @@ } catch (Throwable e) { throw Debug.handle(e); } - return lirGen; + return lirRes; } catch (Throwable e) { throw Debug.handle(e); } } - public static void emitCode(Backend backend, Assumptions assumptions, LIRGenerator lirGen, CompilationResult compilationResult, ResolvedJavaMethod installedCodeOwner, + public static void emitCode(Backend backend, Assumptions assumptions, LIRGenerationResult lirGenRes, CompilationResult compilationResult, ResolvedJavaMethod installedCodeOwner, CompilationResultBuilderFactory factory) { - CompilationResultBuilder crb = backend.newCompilationResultBuilder(lirGen, compilationResult, factory); - backend.emitCode(crb, lirGen.getLIR(), installedCodeOwner); + CompilationResultBuilder crb = backend.newCompilationResultBuilder(lirGenRes, compilationResult, factory); + backend.emitCode(crb, lirGenRes.getLIR(), installedCodeOwner); crb.finish(); if (!assumptions.isEmpty()) { compilationResult.setAssumptions(assumptions); diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResult.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResult.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResult.java Tue Mar 18 13:49:11 2014 +0100 @@ -30,4 +30,6 @@ LIR getLIR(); boolean hasForeignCall(); + + void setForeignCall(boolean b); } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResultBase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResultBase.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerationResultBase.java Tue Mar 18 13:49:11 2014 +0100 @@ -24,15 +24,36 @@ import com.oracle.graal.lir.*; -public abstract class LIRGenerationResultBase implements LIRGenerationResult { +public class LIRGenerationResultBase implements LIRGenerationResult { private final LIR lir; + private final FrameMap frameMap; + /** + * Records whether the code being generated makes at least one foreign call. + */ + private boolean hasForeignCall; - public LIRGenerationResultBase(LIR lir) { + public LIRGenerationResultBase(LIR lir, FrameMap frameMap) { this.lir = lir; + this.frameMap = frameMap; } public LIR getLIR() { return lir; } + /** + * Determines whether the code being generated makes at least one foreign call. + */ + public boolean hasForeignCall() { + return hasForeignCall; + } + + public final void setForeignCall(boolean hasForeignCall) { + this.hasForeignCall = hasForeignCall; + } + + public final FrameMap getFrameMap() { + return frameMap; + } + } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -57,7 +57,7 @@ /** * This class traverses the HIR instructions and generates LIR instructions from them. */ -public abstract class LIRGenerator extends LIRGenerationResultBase implements LIRGeneratorTool, LIRTypeTool, LIRGenerationResult { +public abstract class LIRGenerator implements LIRGeneratorTool, LIRTypeTool { public static class Options { // @formatter:off @@ -68,7 +68,6 @@ // @formatter:on } - private final FrameMap frameMap; private final Providers providers; private final CallingConvention cc; @@ -153,10 +152,7 @@ private ValueNode currentInstruction; private ValueNode lastInstructionPrinted; // Debugging only - /** - * Records whether the code being generated makes at least one foreign call. - */ - private boolean hasForeignCall; + protected LIRGenerationResult res; /** * Checks whether the supplied constant can be used without loading it into a register for store @@ -168,10 +164,9 @@ */ public abstract boolean canStoreConstant(Constant c, boolean isCompressed); - public LIRGenerator(StructuredGraph graph, Providers providers, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(lir); + public LIRGenerator(StructuredGraph graph, Providers providers, CallingConvention cc, LIRGenerationResult res) { + this.res = res; this.providers = providers; - this.frameMap = frameMap; this.cc = cc; this.nodeOperands = graph.createNodeMap(); this.debugInfoBuilder = createDebugInfoBuilder(nodeOperands); @@ -217,13 +212,6 @@ } /** - * Determines whether the code being generated makes at least one foreign call. - */ - public boolean hasForeignCall() { - return hasForeignCall; - } - - /** * Returns the operand that has been previously initialized by * {@link #setResult(ValueNode, Value)} with the result of an instruction. * @@ -254,17 +242,17 @@ } LoadConstant load = constantLoads.get(value); if (load == null) { - int index = getLIR().getLIRforBlock(currentBlock).size(); + int index = res.getLIR().getLIRforBlock(currentBlock).size(); loadedValue = emitMove(value); - LIRInstruction op = getLIR().getLIRforBlock(currentBlock).get(index); + LIRInstruction op = res.getLIR().getLIRforBlock(currentBlock).get(index); constantLoads.put(value, new LoadConstant(loadedValue, currentBlock, index, op)); } else { Block dominator = ControlFlowGraph.commonDominator(load.block, currentBlock); loadedValue = load.variable; if (dominator != load.block) { - load.unpin(getLIR()); + load.unpin(res.getLIR()); } else { - assert load.block != currentBlock || load.index < getLIR().getLIRforBlock(currentBlock).size(); + assert load.block != currentBlock || load.index < res.getLIR().getLIRforBlock(currentBlock).size(); } load.block = dominator; } @@ -294,12 +282,12 @@ */ @Override public Variable newVariable(PlatformKind platformKind) { - return new Variable(platformKind, getLIR().nextVariable()); + return new Variable(platformKind, res.getLIR().nextVariable()); } @Override public RegisterAttributes attributes(Register register) { - return frameMap.registerConfig.getAttributesMap()[register.number]; + return res.getFrameMap().registerConfig.getAttributesMap()[register.number]; } @Override @@ -339,12 +327,12 @@ } public LabelRef getLIRBlock(FixedNode b) { - assert getLIR().getControlFlowGraph() instanceof ControlFlowGraph; - Block result = ((ControlFlowGraph) getLIR().getControlFlowGraph()).blockFor(b); + assert res.getLIR().getControlFlowGraph() instanceof ControlFlowGraph; + Block result = ((ControlFlowGraph) res.getLIR().getControlFlowGraph()).blockFor(b); int suxIndex = currentBlock.getSuccessors().indexOf(result); assert suxIndex != -1 : "Block not in successor list of current block"; - return LabelRef.forSuccessor(getLIR(), currentBlock, suxIndex); + return LabelRef.forSuccessor(res.getLIR(), currentBlock, suxIndex); } /** @@ -391,7 +379,7 @@ if (kind == Kind.Void) { return ILLEGAL; } - return frameMap.registerConfig.getReturnRegister(kind).asValue(kind); + return res.getFrameMap().registerConfig.getReturnRegister(kind).asValue(kind); } public void append(LIRInstruction op) { @@ -405,7 +393,7 @@ TTY.println(); } assert LIRVerifier.verify(op); - getLIR().getLIRforBlock(currentBlock).add(op); + res.getLIR().getLIRforBlock(currentBlock).add(op); } public void doBlock(Block block, StructuredGraph graph, BlockMap> blockMap) { @@ -416,8 +404,8 @@ currentBlock = block; // set up the list of LIR instructions - assert getLIR().getLIRforBlock(block) == null : "LIR list already computed for this block"; - getLIR().setLIRforBlock(block, new ArrayList()); + assert res.getLIR().getLIRforBlock(block) == null : "LIR list already computed for this block"; + res.getLIR().setLIRforBlock(block, new ArrayList()); append(new LabelOp(new Label(block.getId()), block.isAligned())); @@ -425,7 +413,7 @@ TTY.println("BEGIN Generating LIR for block B" + block.getId()); } - if (block == getLIR().getControlFlowGraph().getStartBlock()) { + if (block == res.getLIR().getControlFlowGraph().getStartBlock()) { assert block.getPredecessorCount() == 0; emitPrologue(graph); } else { @@ -472,7 +460,7 @@ emitJump(getLIRBlock((FixedNode) successors.first())); } - assert verifyBlock(getLIR(), block); + assert verifyBlock(res.getLIR(), block); if (traceLevel >= 1) { TTY.println("END Generating LIR for block B" + block.getId()); @@ -488,7 +476,7 @@ protected abstract boolean peephole(ValueNode valueNode); private boolean hasBlockEnd(Block block) { - List ops = getLIR().getLIRforBlock(block); + List ops = res.getLIR().getLIRforBlock(block); if (ops.size() == 0) { return false; } @@ -529,8 +517,8 @@ params[i] = toStackKind(incomingArguments.getArgument(i)); if (ValueUtil.isStackSlot(params[i])) { StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !getLIR().hasArgInCallerFrame()) { - getLIR().setHasArgInCallerFrame(); + if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { + res.getLIR().setHasArgInCallerFrame(); } } } @@ -545,7 +533,7 @@ } public void emitIncomingValues(Value[] params) { - ((LabelOp) getLIR().getLIRforBlock(currentBlock).get(0)).setIncomingValues(params); + ((LabelOp) res.getLIR().getLIRforBlock(currentBlock).get(0)).setIncomingValues(params); } @Override @@ -684,8 +672,8 @@ @Override public void emitInvoke(Invoke x) { LoweredCallTargetNode callTarget = (LoweredCallTargetNode) x.callTarget(); - CallingConvention invokeCc = frameMap.registerConfig.getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(getMetaAccess()), callTarget.signature(), target(), false); - frameMap.callsMethod(invokeCc); + CallingConvention invokeCc = res.getFrameMap().registerConfig.getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(getMetaAccess()), callTarget.signature(), target(), false); + res.getFrameMap().callsMethod(invokeCc); Value[] parameters = visitInvokeArguments(invokeCc, callTarget.arguments()); @@ -765,7 +753,7 @@ // move the arguments into the correct location CallingConvention linkageCc = linkage.getOutgoingCallingConvention(); - frameMap.callsMethod(linkageCc); + res.getFrameMap().callsMethod(linkageCc); assert linkageCc.getArgumentCount() == args.length : "argument count mismatch"; Value[] argLocations = new Value[args.length]; for (int i = 0; i < args.length; i++) { @@ -774,7 +762,7 @@ emitMove(loc, arg); argLocations[i] = loc; } - this.hasForeignCall = true; + res.setForeignCall(true); emitForeignCall(linkage, linkageCc.getReturn(), argLocations, linkage.getTemporaries(), state); if (isLegal(linkageCc.getReturn())) { @@ -859,10 +847,6 @@ return nodeOperands; } - public final FrameMap getFrameMap() { - return frameMap; - } - public CallingConvention getCallingConvention() { return cc; } @@ -894,13 +878,13 @@ outOfLoopDominator = outOfLoopDominator.getDominator(); } if (outOfLoopDominator != lc.block) { - lc.unpin(getLIR()); + lc.unpin(res.getLIR()); lc.block = outOfLoopDominator; } } if (lc.index != -1) { - assert getLIR().getLIRforBlock(lc.block).get(lc.index) == lc.op; + assert res.getLIR().getLIRforBlock(lc.block).get(lc.index) == lc.op; iter.remove(); } } @@ -921,7 +905,7 @@ } int groupSize = groupEnd - groupBegin; - List ops = getLIR().getLIRforBlock(block); + List ops = res.getLIR().getLIRforBlock(block); int lastIndex = ops.size() - 1; assert ops.get(lastIndex) instanceof BlockEndOp; int insertionIndex = lastIndex; @@ -1020,4 +1004,9 @@ public abstract void emitByteSwap(Variable result, Value operand); public abstract void emitArrayEquals(Kind kind, Variable result, Value array1, Value array2, Value length); + + @Deprecated + public FrameMap getFrameMap() { + return res.getFrameMap(); + } } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRGenerator.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/NodeLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2014, 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.compiler.gen; + +import java.util.*; + +import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.cfg.*; + +public class NodeLIRGenerator { + + public LIRGenerationResult generate(StructuredGraph graph, LIRGenerationResult lirRes, LIRGenerator lirGen, List linearScanOrder, BlockMap> blockMap) { + + for (Block b : linearScanOrder) { + emitBlock(lirRes, lirGen, b, graph, blockMap); + } + return null; + } + + private static void emitBlock(LIRGenerationResult lirRes, LIRGenerator lirGen, Block b, StructuredGraph graph, BlockMap> blockMap) { + if (lirRes.getLIR().getLIRforBlock(b) == null) { + for (Block pred : b.getPredecessors()) { + if (!b.isLoopHeader() || !pred.isLoopEnd()) { + emitBlock(lirRes, lirGen, pred, graph, blockMap); + } + } + lirGen.doBlock(b, graph, blockMap); + } + + } +} diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue Mar 18 13:49:11 2014 +0100 @@ -65,7 +65,9 @@ public abstract FrameMap newFrameMap(); - public abstract LIRGenerator newLIRGenerator(StructuredGraph graph, Object stub, FrameMap frameMap, CallingConvention cc, LIR lir); + public abstract LIRGenerator newLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes); + + public abstract LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub); /** * Creates the assembler used to emit the machine code. diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue Mar 18 13:49:11 2014 +0100 @@ -72,8 +72,13 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, Object stub, FrameMap frameMap, CallingConvention cc, LIR lir) { - return new AMD64HotSpotLIRGenerator(graph, stub, getProviders(), getRuntime().getConfig(), frameMap, cc, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes) { + return new AMD64HotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), cc, lirGenRes); + } + + @Override + public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { + return new AMD64HotSpotLIRGenerationResult(lir, frameMap, stub); } /** @@ -192,14 +197,14 @@ } @Override - public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGen, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { + public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRen, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { // Omit the frame if the method: // - has no spill slots or other slots allocated during register allocation // - has no callee-saved registers // - has no incoming arguments passed on the stack // - has no deoptimization points // - makes no foreign calls (which require an aligned stack) - AMD64HotSpotLIRGenerationResult gen = (AMD64HotSpotLIRGenerationResult) lirGen; + AMD64HotSpotLIRGenerationResult gen = (AMD64HotSpotLIRGenerationResult) lirGenRen; FrameMap frameMap = gen.getFrameMap(); LIR lir = gen.getLIR(); assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame"; diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerationResult.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerationResult.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerationResult.java Tue Mar 18 13:49:11 2014 +0100 @@ -30,12 +30,41 @@ import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.SaveRegistersOp; -public interface AMD64HotSpotLIRGenerationResult extends LIRGenerationResult { +public class AMD64HotSpotLIRGenerationResult extends LIRGenerationResultBase { - StackSlot getDeoptimizationRescueSlot(); + /** + * The slot reserved for storing the original return address when a frame is marked for + * deoptimization. The return address slot in the callee is overwritten with the address of a + * deoptimization stub. + */ + private StackSlot deoptimizationRescueSlot; + private final Object stub; + + /** + * Map from debug infos that need to be updated with callee save information to the operations + * that provide the information. + */ + private Map calleeSaveInfo = new HashMap<>(); - Stub getStub(); + public AMD64HotSpotLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { + super(lir, frameMap); + this.stub = stub; + } + + StackSlot getDeoptimizationRescueSlot() { + return deoptimizationRescueSlot; + } - Map getCalleeSaveInfo(); + public final void setDeoptimizationRescueSlot(StackSlot deoptimizationRescueSlot) { + this.deoptimizationRescueSlot = deoptimizationRescueSlot; + } + + Stub getStub() { + return (Stub) stub; + } + + Map getCalleeSaveInfo() { + return calleeSaveInfo; + } } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -50,7 +50,6 @@ import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.NoOp; -import com.oracle.graal.lir.StandardOp.SaveRegistersOp; import com.oracle.graal.lir.amd64.*; import com.oracle.graal.lir.amd64.AMD64ControlFlow.CondMoveOp; import com.oracle.graal.lir.amd64.AMD64Move.CompareAndSwapOp; @@ -67,17 +66,14 @@ /** * LIR generator specialized for AMD64 HotSpot. */ -public class AMD64HotSpotLIRGenerator extends AMD64LIRGenerator implements HotSpotLIRGenerator, AMD64HotSpotLIRGenerationResult { +public class AMD64HotSpotLIRGenerator extends AMD64LIRGenerator implements HotSpotLIRGenerator { private final HotSpotVMConfig config; - private final Object stub; - - protected AMD64HotSpotLIRGenerator(StructuredGraph graph, Object stub, HotSpotProviders providers, HotSpotVMConfig config, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); + protected AMD64HotSpotLIRGenerator(StructuredGraph graph, HotSpotProviders providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); assert config.basicLockSize == 8; this.config = config; - this.stub = stub; } @Override @@ -86,13 +82,6 @@ } /** - * The slot reserved for storing the original return address when a frame is marked for - * deoptimization. The return address slot in the callee is overwritten with the address of a - * deoptimization stub. - */ - private StackSlot deoptimizationRescueSlot; - - /** * Utility for emitting the instruction to save RBP. */ class SaveRbp { @@ -106,7 +95,7 @@ public SaveRbp(NoOp placeholder) { this.placeholder = placeholder; - this.reservedSlot = getFrameMap().allocateSpillSlot(Kind.Long); + this.reservedSlot = res.getFrameMap().allocateSpillSlot(Kind.Long); assert reservedSlot.getRawOffset() == -16 : reservedSlot.getRawOffset(); } @@ -120,11 +109,11 @@ if (useStack) { dst = reservedSlot; } else { - getFrameMap().freeSpillSlot(reservedSlot); + res.getFrameMap().freeSpillSlot(reservedSlot); dst = newVariable(Kind.Long); } - placeholder.replace(getLIR(), new MoveFromRegOp(dst, rbp.asValue(Kind.Long))); + placeholder.replace(res.getLIR(), new MoveFromRegOp(dst, rbp.asValue(Kind.Long))); return dst; } } @@ -146,7 +135,7 @@ @Override protected DebugInfoBuilder createDebugInfoBuilder(NodeMap nodeOperands) { - HotSpotLockStack lockStack = new HotSpotLockStack(getFrameMap(), Kind.Long); + HotSpotLockStack lockStack = new HotSpotLockStack(res.getFrameMap(), Kind.Long); return new HotSpotDebugInfoBuilder(nodeOperands, lockStack); } @@ -165,8 +154,8 @@ params[i] = toStackKind(incomingArguments.getArgument(i)); if (isStackSlot(params[i])) { StackSlot slot = ValueUtil.asStackSlot(params[i]); - if (slot.isInCallerFrame() && !getLIR().hasArgInCallerFrame()) { - getLIR().setHasArgInCallerFrame(); + if (slot.isInCallerFrame() && !res.getLIR().hasArgInCallerFrame()) { + res.getLIR().setHasArgInCallerFrame(); } } } @@ -174,7 +163,7 @@ emitIncomingValues(params); - saveRbp = new SaveRbp(new NoOp(currentBlock, getLIR().getLIRforBlock(currentBlock).size())); + saveRbp = new SaveRbp(new NoOp(currentBlock, res.getLIR().getLIRforBlock(currentBlock).size())); append(saveRbp.placeholder); for (ParameterNode param : graph.getNodes(ParameterNode.class)) { @@ -207,15 +196,9 @@ @Override protected boolean needOnlyOopMaps() { // Stubs only need oop maps - return stub != null; + return ((AMD64HotSpotLIRGenerationResult) res).getStub() != null; } - /** - * Map from debug infos that need to be updated with callee save information to the operations - * that provide the information. - */ - private Map calleeSaveInfo = new HashMap<>(); - private LIRFrameState currentRuntimeCallInfo; @Override @@ -235,7 +218,7 @@ } public Stub getStub() { - return (Stub) stub; + return ((AMD64HotSpotLIRGenerationResult) res).getStub(); } @Override @@ -247,12 +230,12 @@ if (destroysRegisters) { if (getStub() != null) { if (getStub().preservesRegisters()) { - Register[] savedRegisters = getFrameMap().registerConfig.getAllocatableRegisters(); + Register[] savedRegisters = res.getFrameMap().registerConfig.getAllocatableRegisters(); savedRegisterLocations = new StackSlot[savedRegisters.length]; for (int i = 0; i < savedRegisters.length; i++) { PlatformKind kind = target().arch.getLargestStorableKind(savedRegisters[i].getRegisterCategory()); assert kind != Kind.Illegal; - StackSlot spillSlot = getFrameMap().allocateSpillSlot(kind); + StackSlot spillSlot = res.getFrameMap().allocateSpillSlot(kind); savedRegisterLocations[i] = spillSlot; } save = emitSaveRegisters(savedRegisters, savedRegisterLocations); @@ -263,7 +246,7 @@ Variable result; if (linkage.canDeoptimize()) { - assert info != null || stub != null; + assert info != null || ((AMD64HotSpotLIRGenerationResult) res).getStub() != null; Register thread = getProviders().getRegisters().getThreadRegister(); append(new AMD64HotSpotCRuntimeCallPrologueOp(config.threadLastJavaSpOffset(), thread)); result = super.emitForeignCall(linkage, info, args); @@ -275,8 +258,8 @@ if (destroysRegisters) { if (getStub() != null) { if (getStub().preservesRegisters()) { - assert !calleeSaveInfo.containsKey(currentRuntimeCallInfo); - calleeSaveInfo.put(currentRuntimeCallInfo, save); + assert !((AMD64HotSpotLIRGenerationResult) res).getCalleeSaveInfo().containsKey(currentRuntimeCallInfo); + ((AMD64HotSpotLIRGenerationResult) res).getCalleeSaveInfo().put(currentRuntimeCallInfo, save); emitRestoreRegisters(save); } else { @@ -295,14 +278,14 @@ } protected boolean zapRegisters() { - Register[] zappedRegisters = getFrameMap().registerConfig.getAllocatableRegisters(); + Register[] zappedRegisters = res.getFrameMap().registerConfig.getAllocatableRegisters(); Constant[] zapValues = new Constant[zappedRegisters.length]; for (int i = 0; i < zappedRegisters.length; i++) { PlatformKind kind = target().arch.getLargestStorableKind(zappedRegisters[i].getRegisterCategory()); assert kind != Kind.Illegal; zapValues[i] = zapValueForKind(kind); } - calleeSaveInfo.put(currentRuntimeCallInfo, emitZapRegisters(zappedRegisters, zapValues)); + ((AMD64HotSpotLIRGenerationResult) res).getCalleeSaveInfo().put(currentRuntimeCallInfo, emitZapRegisters(zappedRegisters, zapValues)); return true; } @@ -349,7 +332,7 @@ @Override public void emitCCall(long address, CallingConvention nativeCallingConvention, Value[] args, int numberOfFloatingPointArguments) { Value[] argLocations = new Value[args.length]; - getFrameMap().callsMethod(nativeCallingConvention); + res.getFrameMap().callsMethod(nativeCallingConvention); // TODO(mg): in case a native function uses floating point varargs, the ABI requires that // RAX contains the length of the varargs AllocatableValue numberOfFloatingPointArgumentsRegister = AMD64.rax.asValue(); @@ -448,10 +431,10 @@ @Override public void beforeRegisterAllocation() { super.beforeRegisterAllocation(); - boolean hasDebugInfo = getLIR().hasDebugInfo(); + boolean hasDebugInfo = res.getLIR().hasDebugInfo(); AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo); if (hasDebugInfo) { - deoptimizationRescueSlot = getFrameMap().allocateSpillSlot(Kind.Long); + ((AMD64HotSpotLIRGenerationResult) res).setDeoptimizationRescueSlot(res.getFrameMap().allocateSpillSlot(Kind.Long)); } for (AMD64HotSpotEpilogueOp op : epilogueOps) { @@ -596,13 +579,4 @@ AMD64AddressValue addr = emitAddress(operand(address), 0, loadNonConst(operand(distance)), 1); append(new AMD64PrefetchOp(addr, config.allocatePrefetchInstr)); } - - public StackSlot getDeoptimizationRescueSlot() { - return deoptimizationRescueSlot; - } - - public Map getCalleeSaveInfo() { - return calleeSaveInfo; - } - } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotBackend.java Tue Mar 18 13:49:11 2014 +0100 @@ -188,8 +188,13 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, Object stub, FrameMap frameMap, CallingConvention cc, LIR lir) { - return new HSAILHotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), frameMap, cc, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes) { + return new HSAILHotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), cc, lirGenRes); + } + + @Override + public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { + return new LIRGenerationResultBase(lir, frameMap); } class HotSpotFrameContext implements FrameContext { @@ -215,8 +220,8 @@ } @Override - public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGen, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { - FrameMap frameMap = lirGen.getFrameMap(); + public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { + FrameMap frameMap = lirGenRes.getFrameMap(); Assembler masm = createAssembler(frameMap); HotSpotFrameContext frameContext = new HotSpotFrameContext(); CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult); @@ -402,4 +407,5 @@ asm.emitString0("};"); asm.emitString(""); } + } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.hsail/src/com/oracle/graal/hotspot/hsail/HSAILHotSpotLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -26,9 +26,12 @@ import sun.misc.*; import com.oracle.graal.api.code.*; + import static com.oracle.graal.api.code.ValueUtil.asConstant; import static com.oracle.graal.api.code.ValueUtil.isConstant; + import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.gen.*; import com.oracle.graal.compiler.hsail.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.lir.*; @@ -49,8 +52,8 @@ private final HotSpotVMConfig config; - public HSAILHotSpotLIRGenerator(StructuredGraph graph, Providers providers, HotSpotVMConfig config, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); + public HSAILHotSpotLIRGenerator(StructuredGraph graph, Providers providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); this.config = config; } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotBackend.java Tue Mar 18 13:49:11 2014 +0100 @@ -327,13 +327,13 @@ } @Override - public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGen, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { + public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { // Omit the frame of the method: // - has no spill slots or other slots allocated during register allocation // - has no callee-saved registers // - has no incoming arguments passed on the stack // - has no instructions with debug info - FrameMap frameMap = lirGen.getFrameMap(); + FrameMap frameMap = lirGenRes.getFrameMap(); Assembler masm = createAssembler(frameMap); PTXFrameContext frameContext = new PTXFrameContext(); CompilationResultBuilder crb = factory.createBuilder(getCodeCache(), getForeignCalls(), frameMap, masm, frameContext, compilationResult); @@ -342,13 +342,18 @@ } @Override + public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { + return new LIRGenerationResultBase(lir, frameMap); + } + + @Override protected Assembler createAssembler(FrameMap frameMap) { return new PTXMacroAssembler(getTarget(), frameMap.registerConfig); } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, Object stub, FrameMap frameMap, CallingConvention cc, LIR lir) { - return new PTXHotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), frameMap, cc, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes) { + return new PTXHotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), cc, lirGenRes); } private static void emitKernelEntry(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod codeCacheOwner) { diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.ptx/src/com/oracle/graal/hotspot/ptx/PTXHotSpotLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -23,29 +23,23 @@ package com.oracle.graal.hotspot.ptx; -import com.oracle.graal.api.code.CallingConvention; -import com.oracle.graal.api.code.StackSlot; -import com.oracle.graal.api.meta.DeoptimizationAction; -import com.oracle.graal.api.meta.DeoptimizationReason; -import com.oracle.graal.api.meta.Value; -import com.oracle.graal.compiler.ptx.PTXLIRGenerator; -import com.oracle.graal.graph.GraalInternalError; -import com.oracle.graal.hotspot.HotSpotLIRGenerator; -import com.oracle.graal.hotspot.HotSpotVMConfig; -import com.oracle.graal.hotspot.meta.HotSpotProviders; -import com.oracle.graal.hotspot.nodes.DirectCompareAndSwapNode; -import com.oracle.graal.lir.FrameMap; -import com.oracle.graal.lir.LIR; -import com.oracle.graal.nodes.StructuredGraph; -import com.oracle.graal.nodes.ValueNode; +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.gen.*; +import com.oracle.graal.compiler.ptx.*; +import com.oracle.graal.graph.*; +import com.oracle.graal.hotspot.*; +import com.oracle.graal.hotspot.meta.*; +import com.oracle.graal.hotspot.nodes.*; +import com.oracle.graal.nodes.*; /** * LIR generator specialized for PTX HotSpot. */ public class PTXHotSpotLIRGenerator extends PTXLIRGenerator implements HotSpotLIRGenerator { - protected PTXHotSpotLIRGenerator(StructuredGraph graph, HotSpotProviders providers, HotSpotVMConfig config, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); + protected PTXHotSpotLIRGenerator(StructuredGraph graph, HotSpotProviders providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); assert config.basicLockSize == 8; } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue Mar 18 13:49:11 2014 +0100 @@ -79,8 +79,8 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, Object stub, FrameMap frameMap, CallingConvention cc, LIR lir) { - return new SPARCHotSpotLIRGenerator(graph, stub, getProviders(), getRuntime().getConfig(), frameMap, cc, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, CallingConvention cc, LIRGenerationResult lirGenRes) { + return new SPARCHotSpotLIRGenerator(graph, getProviders(), getRuntime().getConfig(), cc, lirGenRes); } /** @@ -159,8 +159,8 @@ } @Override - public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGen, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { - SPARCHotSpotLIRGenerationResult gen = (SPARCHotSpotLIRGenerationResult) lirGen; + public CompilationResultBuilder newCompilationResultBuilder(LIRGenerationResult lirGenRes, CompilationResult compilationResult, CompilationResultBuilderFactory factory) { + SPARCHotSpotLIRGenerationResult gen = (SPARCHotSpotLIRGenerationResult) lirGenRes; FrameMap frameMap = gen.getFrameMap(); assert gen.getDeoptimizationRescueSlot() == null || frameMap.frameNeedsAllocating() : "method that can deoptimize must have a frame"; @@ -186,6 +186,11 @@ } @Override + public LIRGenerationResult newLIRGenerationResult(LIR lir, FrameMap frameMap, Object stub) { + return new LIRGenerationResultBase(lir, frameMap); + } + + @Override public void emitCode(CompilationResultBuilder crb, LIR lir, ResolvedJavaMethod installedCodeOwner) { SPARCMacroAssembler masm = (SPARCMacroAssembler) crb.asm; FrameMap frameMap = crb.frameMap; @@ -240,4 +245,5 @@ public NativeFunctionInterface getNativeFunctionInterface() { throw GraalInternalError.unimplemented("No NativeFunctionInterface of SPARC"); } + } diff -r 6352a2b94ca7 -r 73774616a6b3 graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Tue Mar 18 10:28:27 2014 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Tue Mar 18 13:49:11 2014 +0100 @@ -48,15 +48,13 @@ import com.oracle.graal.nodes.extended.*; import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind; -public class SPARCHotSpotLIRGenerator extends SPARCLIRGenerator implements HotSpotLIRGenerator, SPARCHotSpotLIRGenerationResult { +public class SPARCHotSpotLIRGenerator extends SPARCLIRGenerator implements HotSpotLIRGenerator { private final HotSpotVMConfig config; - private final Object stub; - public SPARCHotSpotLIRGenerator(StructuredGraph graph, Object stub, HotSpotProviders providers, HotSpotVMConfig config, FrameMap frameMap, CallingConvention cc, LIR lir) { - super(graph, providers, frameMap, cc, lir); + public SPARCHotSpotLIRGenerator(StructuredGraph graph, HotSpotProviders providers, HotSpotVMConfig config, CallingConvention cc, LIRGenerationResult lirGenRes) { + super(graph, providers, cc, lirGenRes); this.config = config; - this.stub = stub; } @Override @@ -73,7 +71,7 @@ @Override protected DebugInfoBuilder createDebugInfoBuilder(NodeMap nodeOperands) { - HotSpotLockStack lockStack = new HotSpotLockStack(getFrameMap(), Kind.Long); + HotSpotLockStack lockStack = new HotSpotLockStack(res.getFrameMap(), Kind.Long); return new HotSpotDebugInfoBuilder(nodeOperands, lockStack); } @@ -85,11 +83,11 @@ @Override protected boolean needOnlyOopMaps() { // Stubs only need oop maps - return stub != null; + return getStub() != null; } public Stub getStub() { - return (Stub) stub; + return ((SPARCHotSpotLIRGenerationResult) res).getStub(); } @Override