changeset 3029:0ef7a8219b45

Delegate load field lowering to runtime.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Mon, 20 Jun 2011 14:27:32 +0200
parents 1305cb3809c1
children 7f807764e7fc
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java
diffstat 4 files changed, 48 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- 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);
--- 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) {
--- 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);
     }
 }
--- 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;
+    }
 }