Mercurial > hg > graal-compiler
changeset 7866:b66708ba752b
remove dependency on "latest possible" schedule from OnStackReplacementPhase
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Wed, 13 Feb 2013 15:53:03 +0100 |
parents | 7c251679c07f |
children | f4aec4c242ff |
files | graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java |
diffstat | 1 files changed, 26 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java Tue Feb 26 14:16:45 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/phases/OnStackReplacementPhase.java Wed Feb 13 15:53:03 2013 +0100 @@ -33,7 +33,9 @@ import com.oracle.graal.graph.iterators.*; import com.oracle.graal.loop.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.util.*; import com.oracle.graal.phases.*; @@ -41,7 +43,28 @@ public class OnStackReplacementPhase extends Phase { - public static final Descriptor OSR_MIGRATION_END = new Descriptor("OSR_migration_end", true, void.class, long.class); + public static final Descriptor OSR_MIGRATION_END = new Descriptor("OSR_migration_end", true, null, void.class, long.class); + + public class OSREntryProxyNode extends FloatingNode implements LIRLowerable { + + @Input private ValueNode object; + @Input(notDataflow = true) private final RuntimeCallNode anchor; + + public OSREntryProxyNode(ValueNode object, RuntimeCallNode anchor) { + super(object.stamp()); + this.object = object; + this.anchor = anchor; + } + + public RuntimeCallNode getAnchor() { + return anchor; + } + + @Override + public void generate(LIRGeneratorTool generator) { + generator.setResult(this, generator.operand(object)); + } + } @Override protected void run(StructuredGraph graph) { @@ -116,7 +139,8 @@ int size = (value.kind() == Kind.Long || value.kind() == Kind.Double) ? 2 : 1; int offset = localsOffset - (i + size - 1) * 8; UnsafeLoadNode load = graph.add(new UnsafeLoadNode(buffer, offset, ConstantNode.forInt(0, graph), value.kind())); - proxy.replaceAndDelete(load); + OSREntryProxyNode newProxy = graph.add(new OSREntryProxyNode(load, migrationEnd)); + proxy.replaceAndDelete(newProxy); graph.addBeforeFixed(migrationEnd, load); } }