# HG changeset patch # User Thomas Wuerthinger # Date 1308572852 -7200 # Node ID 0ef7a8219b45bc58484dcbe6a07eef9bd43c6012 # Parent 1305cb3809c163c85911960fea2743b997b7c4b0 Delegate load field lowering to runtime. diff -r 1305cb3809c1 -r 0ef7a8219b45 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Mon Jun 20 14:07:11 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Mon Jun 20 14:27:32 2011 +0200 @@ -104,7 +104,7 @@ new LoopPhase().apply(graph); - new LoweringPhase().apply(graph); + new LoweringPhase(compilation.runtime).apply(graph); IdentifyBlocksPhase schedule = new IdentifyBlocksPhase(true); schedule.apply(graph); diff -r 1305cb3809c1 -r 0ef7a8219b45 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Mon Jun 20 14:07:11 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Mon Jun 20 14:27:32 2011 +0200 @@ -25,8 +25,8 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.CanonicalizerOp; +import com.oracle.max.graal.compiler.phases.*; import com.oracle.max.graal.compiler.phases.LoweringPhase.LoweringOp; -import com.oracle.max.graal.compiler.phases.LoweringPhase.LoweringTool; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; import com.sun.cri.ri.*; @@ -36,7 +36,6 @@ */ public final class LoadField extends AccessField { private static final LoadFieldCanonicalizerOp CANONICALIZER = new LoadFieldCanonicalizerOp(); - private static final LoadFieldLoweringOp LOWERING = new LoadFieldLoweringOp(); private static final int INPUT_COUNT = 0; private static final int SUCCESSOR_COUNT = 0; @@ -120,31 +119,11 @@ if (clazz == CanonicalizerOp.class) { return (T) CANONICALIZER; } else if (clazz == LoweringOp.class) { - return (T) LOWERING; + return (T) LoweringPhase.DELEGATE_TO_RUNTIME; } return super.lookup(clazz); } - private static class LoadFieldLoweringOp implements LoweringOp { - - @Override - public Node lower(Node n, LoweringTool tool) { - LoadField field = (LoadField) n; - if (field.isVolatile()) { - return null; - } - Graph graph = field.graph(); - int displacement = field.field().offset(); - assert field.kind != CiKind.Illegal; - MemoryRead memoryRead = new MemoryRead(field.field().kind(), displacement, graph); - memoryRead.setGuard(new IsNonNull(field.object(), graph)); - memoryRead.setNext(field.next()); - memoryRead.setLocation(field.object()); - return memoryRead; - } - - } - private static class LoadFieldCanonicalizerOp implements CanonicalizerOp { @Override public Node canonical(Node node) { diff -r 1305cb3809c1 -r 0ef7a8219b45 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Mon Jun 20 14:07:11 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Mon Jun 20 14:27:32 2011 +0200 @@ -26,8 +26,24 @@ import com.oracle.max.graal.compiler.schedule.*; import com.oracle.max.graal.compiler.util.*; import com.oracle.max.graal.graph.*; +import com.sun.cri.ci.*; +import com.sun.cri.ri.*; public class LoweringPhase extends Phase { + + public static final LoweringOp DELEGATE_TO_RUNTIME = new LoweringOp() { + @Override + public Node lower(Node n, CiLoweringTool tool) { + return tool.getRuntime().lower(n, tool); + } + }; + + private final RiRuntime runtime; + + public LoweringPhase(RiRuntime runtime) { + this.runtime = runtime; + } + @Override protected void run(final Graph graph) { final IdentifyBlocksPhase s = new IdentifyBlocksPhase(false); @@ -36,9 +52,9 @@ for (Block b : s.getBlocks()) { //final Node firstNode = b.firstNode(); - final LoweringTool loweringTool = new LoweringTool() { + final CiLoweringTool loweringTool = new CiLoweringTool() { @Override - public Node createStructuredBlockAnchor() { + public Node getGuardAnchor() { throw Util.unimplemented(); // if (!(firstNode instanceof Anchor) && !(firstNode instanceof Merge)) { // Anchor a = new Anchor(graph); @@ -51,6 +67,11 @@ // } // return firstNode; } + + @Override + public RiRuntime getRuntime() { + return runtime; + } }; for (final Node n : b.getInstructions()) { @@ -67,11 +88,7 @@ } } - public interface LoweringTool { - Node createStructuredBlockAnchor(); - } - public interface LoweringOp extends Op { - Node lower(Node n, LoweringTool tool); + Node lower(Node n, CiLoweringTool tool); } } diff -r 1305cb3809c1 -r 0ef7a8219b45 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Mon Jun 20 14:07:11 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java Mon Jun 20 14:27:32 2011 +0200 @@ -26,6 +26,8 @@ import java.lang.reflect.*; import java.util.*; +import com.oracle.max.graal.compiler.ir.*; +import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; import com.sun.cri.ci.CiTargetMethod.Call; import com.sun.cri.ci.CiTargetMethod.DataPatch; @@ -135,11 +137,6 @@ return ((HotSpotTypeResolved) method.holder()).constantPool(); } - @Override - public RiOsrFrame getOsrFrame(RiMethod method, int bci) { - return null; - } - public Class getJavaClass(CiConstant c) { return null; } @@ -242,4 +239,23 @@ public Object asJavaObject(CiConstant c) { return null; } + + @Override + public Node lower(Node n, CiLoweringTool tool) { + if (n instanceof LoadField) { + LoadField field = (LoadField) n; + if (field.isVolatile()) { + return null; + } + Graph graph = field.graph(); + int displacement = field.field().offset(); + assert field.kind != CiKind.Illegal; + MemoryRead memoryRead = new MemoryRead(field.field().kind(), displacement, graph); + memoryRead.setGuard(new IsNonNull(field.object(), graph)); + memoryRead.setNext(field.next()); + memoryRead.setLocation(field.object()); + return memoryRead; + } + return null; + } }