# HG changeset patch # User Doug Simon # Date 1367962733 -7200 # Node ID 66db0353f55a3093e075d40fad80f96497cac160 # Parent 1a87230c775df6d368027b8df344bcd50660875d compilation is explicitly given a CallingConvention for the graph being compiled instead of deriving it from a method diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/CodeUtil.java Tue May 07 23:38:53 2013 +0200 @@ -326,9 +326,17 @@ public static CallingConvention getCallingConvention(CodeCacheProvider codeCache, CallingConvention.Type type, ResolvedJavaMethod method, boolean stackOnly) { Signature sig = method.getSignature(); JavaType retType = sig.getReturnType(null); - JavaType[] argTypes = new JavaType[sig.getParameterCount(!Modifier.isStatic(method.getModifiers()))]; - for (int i = 0; i < argTypes.length; i++) { - argTypes[i] = sig.getParameterType(i, null); + int sigCount = sig.getParameterCount(false); + JavaType[] argTypes; + int argIndex = 0; + if (!Modifier.isStatic(method.getModifiers())) { + argTypes = new JavaType[sigCount + 1]; + argTypes[argIndex++] = method.getDeclaringClass(); + } else { + argTypes = new JavaType[sigCount]; + } + for (int i = 0; i < sigCount; i++) { + argTypes[argIndex++] = sig.getParameterType(i, null); } RegisterConfig registerConfig = codeCache.lookupRegisterConfig(); diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue May 07 23:38:53 2013 +0200 @@ -92,8 +92,8 @@ } } - public AMD64LIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - super(graph, runtime, target, frameMap, method, lir); + public AMD64LIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + super(graph, runtime, target, frameMap, method, cc, lir); lir.spillMoveFactory = new AMD64SpillMoveFactory(); } @@ -919,8 +919,7 @@ sig[i] = node.arguments.get(i).stamp().javaType(runtime); } - CallingConvention cc = frameMap.registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false); - Value[] parameters = visitInvokeArguments(cc, node.arguments); + Value[] parameters = visitInvokeArguments(frameMap.registerConfig.getCallingConvention(CallingConvention.Type.JavaCall, null, sig, target(), false), node.arguments); append(new AMD64BreakpointOp(parameters)); } diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java --- a/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx.test/src/com/oracle/graal/compiler/ptx/test/PTXTestBase.java Tue May 07 23:38:53 2013 +0200 @@ -22,11 +22,11 @@ */ package com.oracle.graal.compiler.ptx.test; +import static com.oracle.graal.api.code.CodeUtil.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; -import com.oracle.graal.api.code.CompilationResult; -import com.oracle.graal.api.code.SpeculationLog; -import com.oracle.graal.api.code.TargetDescription; +import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.CallingConvention.*; import com.oracle.graal.api.runtime.Graal; import com.oracle.graal.compiler.GraalCompiler; import com.oracle.graal.compiler.ptx.PTXBackend; @@ -56,8 +56,9 @@ phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); phasePlan.addPhase(PhasePosition.AFTER_PARSING, new PTXPhase()); new PTXPhase().apply(graph); + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); CompilationResult result = GraalCompiler.compileMethod(runtime, graalRuntime().getReplacements(), - ptxBackend, target, graph.method(), graph, null, phasePlan, + ptxBackend, target, graph.method(), graph, cc, null, phasePlan, OptimisticOptimizations.NONE, new SpeculationLog()); return result; } diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXBackend.java Tue May 07 23:38:53 2013 +0200 @@ -42,8 +42,8 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - return new PTXLIRGenerator(graph, runtime(), target, frameMap, method, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + return new PTXLIRGenerator(graph, runtime(), target, frameMap, method, cc, lir); } class HotSpotFrameContext implements FrameContext { diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Tue May 07 23:38:53 2013 +0200 @@ -28,11 +28,7 @@ import static com.oracle.graal.lir.ptx.PTXBitManipulationOp.IntrinsicOpcode.*; import static com.oracle.graal.lir.ptx.PTXCompare.*; -import com.oracle.graal.api.code.CodeCacheProvider; -import com.oracle.graal.api.code.DeoptimizationAction; -import com.oracle.graal.api.code.RuntimeCallTarget; -import com.oracle.graal.api.code.StackSlot; -import com.oracle.graal.api.code.TargetDescription; +import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.RuntimeCallTarget.Descriptor; import com.oracle.graal.api.meta.*; import com.oracle.graal.asm.NumUtil; @@ -85,8 +81,8 @@ } } - public PTXLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - super(graph, runtime, target, frameMap, method, lir); + public PTXLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + super(graph, runtime, target, frameMap, method, cc, lir); lir.spillMoveFactory = new PTXSpillMoveFactory(); } diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue May 07 23:38:53 2013 +0200 @@ -38,8 +38,8 @@ */ public class SPARCLIRGenerator extends LIRGenerator { - public SPARCLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - super(graph, runtime, target, frameMap, method, lir); + public SPARCLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + super(graph, runtime, target, frameMap, method, cc, lir); // SPARC: Implement lir generator. } diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/GraalCompilerTest.java Tue May 07 23:38:53 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.compiler.test; +import static com.oracle.graal.api.code.CodeUtil.*; + import java.lang.reflect.*; import java.util.*; import java.util.concurrent.*; @@ -29,6 +31,7 @@ import org.junit.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.api.runtime.*; import com.oracle.graal.compiler.*; @@ -410,7 +413,8 @@ phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); phasePlan.addPhase(PhasePosition.LOW_LEVEL, new WriteBarrierAdditionPhase()); editPhasePlan(method, graph, phasePlan); - CompilationResult compResult = GraalCompiler.compileMethod(runtime(), replacements, backend, runtime().getTarget(), method, graph, null, phasePlan, OptimisticOptimizations.ALL, + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); + CompilationResult compResult = GraalCompiler.compileMethod(runtime, replacements, backend, runtime().getTarget(), method, graph, cc, null, phasePlan, OptimisticOptimizations.ALL, new SpeculationLog()); if (printCompilation) { TTY.println(String.format("@%-6d Graal %-70s %-45s %-50s | %4dms %5dB", id, "", "", "", System.currentTimeMillis() - start, compResult.getTargetCodeSize())); diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/InfopointReasonTest.java Tue May 07 23:38:53 2013 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.compiler.test; +import static com.oracle.graal.api.code.CodeUtil.*; import static org.junit.Assert.*; import java.lang.reflect.*; @@ -29,6 +30,7 @@ import org.junit.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.code.CompilationResult.Call; import com.oracle.graal.api.code.CompilationResult.Infopoint; import com.oracle.graal.compiler.*; @@ -56,7 +58,8 @@ public void callInfopoints() { final Method method = getMethod("testMethod"); final StructuredGraph graph = parse(method); - final CompilationResult cr = GraalCompiler.compileMethod(runtime, replacements, backend, runtime.getTarget(), runtime.lookupJavaMethod(method), graph, null, getDefaultPhasePlan(), + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); + final CompilationResult cr = GraalCompiler.compileMethod(runtime, replacements, backend, runtime.getTarget(), runtime.lookupJavaMethod(method), graph, cc, null, getDefaultPhasePlan(), OptimisticOptimizations.ALL, new SpeculationLog()); for (Infopoint sp : cr.getInfopoints()) { assertNotNull(sp.reason); @@ -77,7 +80,8 @@ } } assertTrue(graphLineSPs > 0); - final CompilationResult cr = GraalCompiler.compileMethod(runtime, replacements, backend, runtime.getTarget(), runtime.lookupJavaMethod(method), graph, null, getDefaultPhasePlan(true), + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); + final CompilationResult cr = GraalCompiler.compileMethod(runtime, replacements, backend, runtime.getTarget(), runtime.lookupJavaMethod(method), graph, cc, null, getDefaultPhasePlan(true), OptimisticOptimizations.ALL, new SpeculationLog()); int lineSPs = 0; for (Infopoint sp : cr.getInfopoints()) { diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/backend/AllocatorTest.java Tue May 07 23:38:53 2013 +0200 @@ -22,12 +22,15 @@ */ package com.oracle.graal.compiler.test.backend; +import static com.oracle.graal.api.code.CodeUtil.*; + import java.util.*; import java.util.concurrent.*; import org.junit.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.CallingConvention.Type; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.test.*; @@ -123,7 +126,8 @@ @Override public RegisterStats call() { - GraalCompiler.emitLIR(backend, backend.target, lir, graph, graph.method()); + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); + GraalCompiler.emitLIR(backend, backend.target, lir, graph, graph.method(), cc); return new RegisterStats(lir); } }); diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue May 07 23:38:53 2013 +0200 @@ -50,8 +50,8 @@ public class GraalCompiler { public static CompilationResult compileMethod(final GraalCodeCacheProvider runtime, final Replacements replacements, final Backend backend, final TargetDescription target, - final ResolvedJavaMethod method, final StructuredGraph graph, final GraphCache cache, final PhasePlan plan, final OptimisticOptimizations optimisticOpts, - final SpeculationLog speculationLog) { + final ResolvedJavaMethod method, final StructuredGraph graph, final CallingConvention cc, final GraphCache cache, final PhasePlan plan, + final OptimisticOptimizations optimisticOpts, final SpeculationLog speculationLog) { assert (method.getModifiers() & Modifier.NATIVE) == 0 : "compiling native methods is not supported"; final CompilationResult compilationResult = new CompilationResult(); @@ -68,7 +68,7 @@ final LIRGenerator lirGen = Debug.scope("BackEnd", lir, new Callable() { public LIRGenerator call() { - return emitLIR(backend, target, lir, graph, method); + return emitLIR(backend, target, lir, graph, method, cc); } }); Debug.scope("CodeGen", lirGen, new Runnable() { @@ -174,9 +174,9 @@ } - public static LIRGenerator emitLIR(Backend backend, final TargetDescription target, final LIR lir, StructuredGraph graph, final ResolvedJavaMethod method) { + public static LIRGenerator emitLIR(Backend backend, final TargetDescription target, final LIR lir, StructuredGraph graph, final ResolvedJavaMethod method, CallingConvention cc) { final FrameMap frameMap = backend.newFrameMap(); - final LIRGenerator lirGen = backend.newLIRGenerator(graph, frameMap, method, lir); + final LIRGenerator lirGen = backend.newLIRGenerator(graph, frameMap, method, cc, lir); Debug.scope("LIRGen", lirGen, new Runnable() { diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue May 07 23:38:53 2013 +0200 @@ -62,6 +62,7 @@ protected final CodeCacheProvider runtime; protected final TargetDescription target; protected final ResolvedJavaMethod method; + protected final CallingConvention cc; protected final DebugInfoBuilder debugInfoBuilder; @@ -85,12 +86,17 @@ */ public abstract boolean canStoreConstant(Constant c); - public LIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { + public LIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { this.graph = graph; this.runtime = runtime; this.target = target; this.frameMap = frameMap; this.method = method; + if (graph.getEntryBCI() == StructuredGraph.INVOCATION_ENTRY_BCI) { + this.cc = cc; + } else { + this.cc = frameMap.registerConfig.getCallingConvention(JavaCallee, method.getSignature().getReturnType(null), new JavaType[]{runtime.lookupJavaType(long.class)}, target, false); + } this.nodeOperands = graph.createNodeMap(); this.lir = lir; this.debugInfoBuilder = createDebugInfoBuilder(nodeOperands); @@ -423,12 +429,8 @@ ((LIRLowerable) node).generate(this); } - protected CallingConvention createCallingConvention() { - return frameMap.registerConfig.getCallingConvention(JavaCallee, method.getSignature().getReturnType(null), MetaUtil.signatureToTypes(method), target, false); - } - protected void emitPrologue() { - CallingConvention incomingArguments = createCallingConvention(); + CallingConvention incomingArguments = cc; Value[] params = new Value[incomingArguments.getArgumentCount()]; for (int i = 0; i < params.length; i++) { @@ -594,10 +596,10 @@ @Override public void emitInvoke(Invoke x) { LoweredCallTargetNode callTarget = (LoweredCallTargetNode) x.callTarget(); - CallingConvention cc = frameMap.registerConfig.getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(runtime), callTarget.signature(), target(), false); - frameMap.callsMethod(cc); + CallingConvention invokeCc = frameMap.registerConfig.getCallingConvention(callTarget.callType(), x.asNode().stamp().javaType(runtime), callTarget.signature(), target(), false); + frameMap.callsMethod(invokeCc); - Value[] parameters = visitInvokeArguments(cc, callTarget.arguments()); + Value[] parameters = visitInvokeArguments(invokeCc, callTarget.arguments()); LabelRef exceptionEdge = null; if (x instanceof InvokeWithExceptionNode) { @@ -605,11 +607,11 @@ } LIRFrameState callState = stateWithExceptionEdge(x, exceptionEdge); - Value result = cc.getReturn(); + Value result = invokeCc.getReturn(); if (callTarget instanceof DirectCallTargetNode) { - emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, cc.getTemporaries(), callState); + emitDirectCall((DirectCallTargetNode) callTarget, result, parameters, invokeCc.getTemporaries(), callState); } else if (callTarget instanceof IndirectCallTargetNode) { - emitIndirectCall((IndirectCallTargetNode) callTarget, result, parameters, cc.getTemporaries(), callState); + emitIndirectCall((IndirectCallTargetNode) callTarget, result, parameters, invokeCc.getTemporaries(), callState); } else { throw GraalInternalError.shouldNotReachHere(); } @@ -640,13 +642,13 @@ return value; } - public Value[] visitInvokeArguments(CallingConvention cc, Collection arguments) { + public Value[] visitInvokeArguments(CallingConvention invokeCc, Collection arguments) { // for each argument, load it into the correct location Value[] result = new Value[arguments.size()]; int j = 0; for (ValueNode arg : arguments) { if (arg != null) { - AllocatableValue operand = toStackKind(cc.getArgument(j)); + AllocatableValue operand = toStackKind(invokeCc.getArgument(j)); emitMove(operand, operand(arg)); result[j] = operand; j++; @@ -658,23 +660,23 @@ } @Override - public Variable emitCall(RuntimeCallTarget callTarget, CallingConvention cc, DeoptimizingNode info, Value... args) { + public Variable emitCall(RuntimeCallTarget callTarget, CallingConvention callCc, DeoptimizingNode info, Value... args) { LIRFrameState state = info != null ? state(info) : null; // move the arguments into the correct location - frameMap.callsMethod(cc); - assert cc.getArgumentCount() == args.length : "argument count mismatch"; + frameMap.callsMethod(callCc); + assert callCc.getArgumentCount() == args.length : "argument count mismatch"; Value[] argLocations = new Value[args.length]; for (int i = 0; i < args.length; i++) { Value arg = args[i]; - AllocatableValue loc = cc.getArgument(i); + AllocatableValue loc = callCc.getArgument(i); emitMove(loc, arg); argLocations[i] = loc; } - emitCall(callTarget, cc.getReturn(), argLocations, cc.getTemporaries(), state); + emitCall(callTarget, callCc.getReturn(), argLocations, callCc.getTemporaries(), state); - if (isLegal(cc.getReturn())) { - return emitMove(cc.getReturn()); + if (isLegal(callCc.getReturn())) { + return emitMove(callCc.getReturn()); } else { return null; } @@ -683,12 +685,12 @@ @Override public void visitRuntimeCall(RuntimeCallNode x) { RuntimeCallTarget call = runtime.lookupRuntimeCall(x.getDescriptor()); - CallingConvention cc = call.getCallingConvention(); - frameMap.callsMethod(cc); - Value resultOperand = cc.getReturn(); - Value[] args = visitInvokeArguments(cc, x.arguments()); + CallingConvention callCc = call.getCallingConvention(); + frameMap.callsMethod(callCc); + Value resultOperand = callCc.getReturn(); + Value[] args = visitInvokeArguments(callCc, x.arguments()); - emitCall(call, resultOperand, args, cc.getTemporaries(), state(x)); + emitCall(call, resultOperand, args, callCc.getTemporaries(), state(x)); if (isLegal(resultOperand)) { setResult(x, emitMove(resultOperand)); diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/Backend.java Tue May 07 23:38:53 2013 +0200 @@ -51,7 +51,7 @@ return new FrameMap(runtime, target, runtime.lookupRegisterConfig()); } - public abstract LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, LIR lir); + public abstract LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir); protected abstract AbstractAssembler createAssembler(FrameMap frameMap); diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackend.java Tue May 07 23:38:53 2013 +0200 @@ -64,8 +64,8 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - return new AMD64HotSpotLIRGenerator(graph, runtime(), target, frameMap, method, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + return new AMD64HotSpotLIRGenerator(graph, runtime(), target, frameMap, method, cc, lir); } /** diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue May 07 23:38:53 2013 +0200 @@ -23,7 +23,6 @@ package com.oracle.graal.hotspot.amd64; import static com.oracle.graal.amd64.AMD64.*; -import static com.oracle.graal.api.code.CallingConvention.Type.*; import static com.oracle.graal.api.code.ValueUtil.*; import static com.oracle.graal.hotspot.HotSpotBackend.*; @@ -60,8 +59,8 @@ return (HotSpotRuntime) runtime; } - protected AMD64HotSpotLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - super(graph, runtime, target, frameMap, method, lir); + protected AMD64HotSpotLIRGenerator(StructuredGraph graph, CodeCacheProvider runtime, TargetDescription target, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + super(graph, runtime, target, frameMap, method, cc, lir); } /** @@ -139,7 +138,7 @@ @Override protected void emitPrologue() { - CallingConvention incomingArguments = createCallingConvention(); + CallingConvention incomingArguments = cc; RegisterValue rbpParam = rbp.asValue(Kind.Long); Value[] params = new Value[incomingArguments.getArgumentCount() + 1]; @@ -203,7 +202,7 @@ } @Override - public Variable emitCall(RuntimeCallTarget callTarget, CallingConvention cc, DeoptimizingNode info, Value... args) { + public Variable emitCall(RuntimeCallTarget callTarget, CallingConvention callCc, DeoptimizingNode info, Value... args) { Stub stub = runtime().asStub(method); boolean isCRuntimeCall = ((HotSpotRuntimeCallTarget) callTarget).isCRuntimeCall(); assert !isCRuntimeCall || stub != null : "direct call to C runtime can only be made from compiled stubs, not from " + method; @@ -225,7 +224,7 @@ append(new AMD64HotSpotCRuntimeCallPrologueOp()); } - Variable result = super.emitCall(callTarget, cc, info, args); + Variable result = super.emitCall(callTarget, callCc, info, args); if (isCRuntimeCall) { append(new AMD64HotSpotCRuntimeCallEpilogueOp()); @@ -261,20 +260,6 @@ } @Override - protected CallingConvention createCallingConvention() { - Stub stub = runtime().asStub(method); - if (stub != null) { - return stub.getLinkage().getCallingConvention(); - } - - if (graph.getEntryBCI() == StructuredGraph.INVOCATION_ENTRY_BCI) { - return super.createCallingConvention(); - } else { - return frameMap.registerConfig.getCallingConvention(JavaCallee, method.getSignature().getReturnType(null), new JavaType[]{runtime.lookupJavaType(long.class)}, target, false); - } - } - - @Override public void visitSafepointNode(SafepointNode i) { LIRFrameState info = state(i); append(new AMD64SafepointOp(info, runtime().config, this)); @@ -340,9 +325,9 @@ @Override public void emitUnwind(Value exception) { RuntimeCallTarget stub = getRuntime().lookupRuntimeCall(HotSpotBackend.UNWIND_EXCEPTION_TO_CALLER); - CallingConvention cc = stub.getCallingConvention(); - assert cc.getArgumentCount() == 2; - RegisterValue exceptionParameter = (RegisterValue) cc.getArgument(0); + CallingConvention stubCc = stub.getCallingConvention(); + assert stubCc.getArgumentCount() == 2; + RegisterValue exceptionParameter = (RegisterValue) stubCc.getArgument(0); emitMove(exceptionParameter, exception); append(new AMD64HotSpotUnwindOp(exceptionParameter)); } @@ -366,10 +351,10 @@ public void emitJumpToExceptionHandlerInCaller(ValueNode handlerInCallerPc, ValueNode exception, ValueNode exceptionPc) { Variable handler = load(operand(handlerInCallerPc)); RuntimeCallTarget stub = getRuntime().lookupRuntimeCall(EXCEPTION_HANDLER_IN_CALLER); - CallingConvention cc = stub.getCallingConvention(); - assert cc.getArgumentCount() == 2; - RegisterValue exceptionFixed = (RegisterValue) cc.getArgument(0); - RegisterValue exceptionPcFixed = (RegisterValue) cc.getArgument(1); + CallingConvention stubCc = stub.getCallingConvention(); + assert stubCc.getArgumentCount() == 2; + RegisterValue exceptionFixed = (RegisterValue) stubCc.getArgument(0); + RegisterValue exceptionPcFixed = (RegisterValue) stubCc.getArgument(1); emitMove(exceptionFixed, operand(exception)); emitMove(exceptionPcFixed, operand(exceptionPc)); AMD64HotSpotJumpToExceptionHandlerInCallerOp op = new AMD64HotSpotJumpToExceptionHandlerInCallerOp(handler, exceptionFixed, exceptionPcFixed); diff -r 1a87230c775d -r 66db0353f55a 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 May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotBackend.java Tue May 07 23:38:53 2013 +0200 @@ -43,8 +43,8 @@ } @Override - public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, LIR lir) { - return new SPARCLIRGenerator(graph, this.runtime(), this.target, frameMap, method, lir); + public LIRGenerator newLIRGenerator(StructuredGraph graph, FrameMap frameMap, ResolvedJavaMethod method, CallingConvention cc, LIR lir) { + return new SPARCLIRGenerator(graph, this.runtime(), this.target, frameMap, method, cc, lir); } @Override diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/CompilationTask.java Tue May 07 23:38:53 2013 +0200 @@ -22,6 +22,7 @@ */ package com.oracle.graal.hotspot; +import static com.oracle.graal.api.code.CodeUtil.*; import static com.oracle.graal.nodes.StructuredGraph.*; import static com.oracle.graal.phases.common.InliningUtil.*; @@ -29,6 +30,7 @@ import java.util.concurrent.*; import com.oracle.graal.api.code.*; +import com.oracle.graal.api.code.CallingConvention.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.*; import com.oracle.graal.debug.*; @@ -157,7 +159,9 @@ graph = graph.copy(); } InlinedBytecodes.add(method.getCodeSize()); - return GraalCompiler.compileMethod(graalRuntime.getRuntime(), replacements, graalRuntime.getBackend(), graalRuntime.getTarget(), method, graph, graalRuntime.getCache(), plan, + HotSpotRuntime runtime = graalRuntime.getRuntime(); + CallingConvention cc = getCallingConvention(runtime, Type.JavaCallee, graph.method(), false); + return GraalCompiler.compileMethod(runtime, replacements, graalRuntime.getBackend(), graalRuntime.getTarget(), method, graph, cc, graalRuntime.getCache(), plan, optimisticOpts, method.getSpeculationLog()); } }); diff -r 1a87230c775d -r 66db0353f55a graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Tue May 07 22:42:46 2013 +0200 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/Stub.java Tue May 07 23:38:53 2013 +0200 @@ -55,7 +55,8 @@ import com.oracle.graal.phases.*; import com.oracle.graal.phases.PhasePlan.PhasePosition; import com.oracle.graal.replacements.*; -import com.oracle.graal.replacements.Snippet.*; +import com.oracle.graal.replacements.Snippet.ConstantParameter; +import com.oracle.graal.replacements.Snippet.Fold; import com.oracle.graal.replacements.SnippetTemplate.AbstractTemplates; import com.oracle.graal.replacements.SnippetTemplate.Arguments; import com.oracle.graal.replacements.SnippetTemplate.SnippetInfo; @@ -206,7 +207,8 @@ PhasePlan phasePlan = new PhasePlan(); GraphBuilderPhase graphBuilderPhase = new GraphBuilderPhase(runtime, GraphBuilderConfiguration.getDefault(), OptimisticOptimizations.ALL); phasePlan.addPhase(PhasePosition.AFTER_PARSING, graphBuilderPhase); - final CompilationResult compResult = GraalCompiler.compileMethod(runtime(), replacements, backend, runtime().getTarget(), getMethod(), graph, null, phasePlan, + CallingConvention cc = linkage.getCallingConvention(); + final CompilationResult compResult = GraalCompiler.compileMethod(runtime(), replacements, backend, runtime().getTarget(), getMethod(), graph, cc, null, phasePlan, OptimisticOptimizations.ALL, new SpeculationLog()); assert checkStubInvariants(compResult);