Mercurial > hg > truffle
diff graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java @ 4408:b197bbb58d2f
Fix and improve tail call.
Fix flagsFor: Allow more than one input.
Inputs and temporaries may only be registers.
Remove redundant moves from emitCode, these are emitted by visitInvokeArguments in TailcallNode.
Skip over empty slot for two-slot values in frame state.
author | Andreas Woess <andreas.woess@jku.at> |
---|---|
date | Sun, 29 Jan 2012 11:27:18 +0100 |
parents | df5547057954 |
children | 7406229b269f |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java Fri Jan 27 17:36:06 2012 +0100 +++ b/graal/com.oracle.max.graal.hotspot/src/com/oracle/max/graal/hotspot/nodes/TailcallNode.java Sun Jan 29 11:27:18 2012 +0100 @@ -30,6 +30,7 @@ import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.hotspot.*; import com.oracle.max.graal.hotspot.target.amd64.*; +import com.oracle.max.graal.java.*; import com.oracle.max.graal.nodes.*; import com.oracle.max.graal.nodes.spi.*; import com.oracle.max.graal.nodes.type.*; @@ -62,10 +63,10 @@ CiKind[] signature = CiUtil.signatureToKinds(method.signature(), isStatic ? null : method.holder().kind(true)); CiCallingConvention cc = gen.frameMap().registerConfig.getCallingConvention(CiCallingConvention.Type.JavaCall, signature, gen.target(), false); - gen.frameMap().callsMethod(cc, CiCallingConvention.Type.JavaCall); + gen.frameMap().callsMethod(cc, CiCallingConvention.Type.JavaCall); // TODO (aw): I think this is unnecessary for a tail call. List<ValueNode> parameters = new ArrayList<>(); - for (int i = 0; i < cc.locations.length; i++) { - parameters.add(frameState.localAt(i)); + for (int i = 0, slot = 0; i < cc.locations.length; i++, slot += FrameStateBuilder.stackSlots(frameState.localAt(slot).kind())) { + parameters.add(frameState.localAt(slot)); } List<CiValue> argList = gen.visitInvokeArguments(cc, parameters, null);