changeset 3145:dcf2b46665a0

Added intrinsification of getClass()
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Mon, 04 Jul 2011 12:21:42 +0200
parents 1d907446ac7f
children a8db5b0e499f
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java
diffstat 10 files changed, 34 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java	Mon Jul 04 12:21:42 2011 +0200
@@ -64,10 +64,10 @@
     private final int index;
     private RiType declaredType;
 
-    public Local(CiKind kind, int javaIndex, StartNode start, Graph graph) {
+    public Local(CiKind kind, int javaIndex, Graph graph) {
         super(kind, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         this.index = javaIndex;
-        setStart(start);
+        setStart(graph.start());
     }
 
     /**
@@ -114,7 +114,7 @@
 
     @Override
     public Node copy(Graph into) {
-        Local x = new Local(kind, index, null, into);
+        Local x = new Local(kind, index, into);
         x.setDeclaredType(declaredType());
         return x;
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java	Mon Jul 04 12:21:42 2011 +0200
@@ -32,6 +32,8 @@
     private static final int INPUT_COUNT = 0;
     private static final int SUCCESSOR_COUNT = 0;
 
+    public static final Object FINAL_LOCATION = new Object();
+
     private int displacement;
     private CiKind valueKind;
     private Object locationIdentity;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Mon Jul 04 12:21:42 2011 +0200
@@ -152,7 +152,7 @@
 
                     Node current;
                     if (block.firstNode() instanceof StartNode) {
-                        current = ((StartNode) block.firstNode()).start();
+                        current = ((StartNode) block.firstNode()).next();
                     } else {
                         current = block.firstNode();
                     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Mon Jul 04 12:21:42 2011 +0200
@@ -172,7 +172,7 @@
         Block startBlock = nextBlock(FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI);
         markOnWorkList(startBlock);
         lastInstr = (FixedNodeWithNext) createTarget(startBlock, frameState);
-        graph.start().setStart(lastInstr);
+        graph.start().setNext(lastInstr);
 
         if (isSynchronized(method.accessFlags())) {
             // 4A.1 add a monitor enter to the start block
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Mon Jul 04 12:21:42 2011 +0200
@@ -342,7 +342,9 @@
             graph = (CompilerGraph) compilation.runtime.intrinsicGraph(method, invoke.arguments());
         }
         if (graph != null) {
-            TTY.println("Using intrinsic graph");
+            if (GraalOptions.TraceInlining) {
+                TTY.println("Using intrinsic graph");
+            }
         } else {
             graph = GraphBuilderPhase.cachedGraphs.get(method);
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Mon Jul 04 12:21:42 2011 +0200
@@ -71,8 +71,8 @@
             StartNode startNode = b.firstNode().graph().start();
             if (b.firstNode() == startNode) {
                 WriteMemoryCheckpointNode checkpoint = new WriteMemoryCheckpointNode(startNode.graph());
-                checkpoint.setNext((FixedNode) startNode.start());
-                startNode.setStart(checkpoint);
+                checkpoint.setNext((FixedNode) startNode.next());
+                startNode.setNext(checkpoint);
                 mergeForWrite = checkpoint;
                 mergeForRead = checkpoint;
             }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Mon Jul 04 12:21:42 2011 +0200
@@ -35,14 +35,16 @@
     @Override
     protected void run(Graph graph) {
         for (ReadNode n : graph.getNodes(ReadNode.class)) {
-            Node memoryInput = n.inputs().variablePart().get(0);
-            if (memoryInput instanceof WriteNode) {
-                WriteNode other = (WriteNode) memoryInput;
-                if (other.object() == n.object() && other.location() == n.location()) {
-                    if (GraalOptions.TraceReadElimination) {
-                        TTY.println("Eliminated memory read " + n + "and replaced with node " + other.value());
+            if (n.inputs().variablePart().size() > 0) {
+                Node memoryInput = n.inputs().variablePart().get(0);
+                if (memoryInput instanceof WriteNode) {
+                    WriteNode other = (WriteNode) memoryInput;
+                    if (other.object() == n.object() && other.location() == n.location()) {
+                        if (GraalOptions.TraceReadElimination) {
+                            TTY.println("Eliminated memory read " + n + "and replaced with node " + other.value());
+                        }
+                        n.replaceAndDelete(other.value());
                     }
-                    n.replaceAndDelete(other.value());
                 }
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Mon Jul 04 12:21:42 2011 +0200
@@ -69,12 +69,12 @@
                 this.anchor = (Anchor) firstNode;
             } else if (firstNode == firstNode.graph().start()) {
                 StartNode start = (StartNode) firstNode;
-                if (start.start() instanceof Anchor) {
-                    this.anchor = (Anchor) start.start();
+                if (start.next() instanceof Anchor) {
+                    this.anchor = (Anchor) start.next();
                 } else {
                     Anchor a = new Anchor(firstNode.graph());
-                    a.setNext((FixedNode) firstNode.graph().start().start());
-                    firstNode.graph().start().setStart(a);
+                    a.setNext((FixedNode) firstNode.graph().start().next());
+                    firstNode.graph().start().setNext(a);
                     this.anchor = a;
                 }
             } else if (firstNode instanceof Merge) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java	Mon Jul 04 12:21:42 2011 +0200
@@ -58,7 +58,7 @@
         int index = 0;
         if (!isStatic(method.accessFlags())) {
             // add the receiver and assume it is non null
-            Local local = new Local(method.holder().kind(), javaIndex, graph.start(), graph);
+            Local local = new Local(method.holder().kind(), javaIndex, graph);
             local.setDeclaredType(method.holder());
             storeLocal(javaIndex, local);
             javaIndex = 1;
@@ -70,7 +70,7 @@
         for (int i = 0; i < max; i++) {
             RiType type = sig.argumentTypeAt(i, accessingClass);
             CiKind kind = type.kind().stackKind();
-            Local local = new Local(kind, index, graph.start(), graph);
+            Local local = new Local(kind, index, graph);
             if (type.isResolved()) {
                 local.setDeclaredType(type);
             }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Mon Jul 04 12:03:31 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Mon Jul 04 12:21:42 2011 +0200
@@ -286,7 +286,13 @@
             String fullName = method.name() + method.signature().asString();
             if (holder.name().equals("Ljava/lang/Object;")) {
                 if (fullName.equals("getClass()Ljava/lang/Class;")) {
-
+                    CompilerGraph graph = new CompilerGraph(this);
+                    Local receiver = new Local(CiKind.Object, 0, graph);
+                    ReadNode klassOop = new ReadNode(CiKind.Object, receiver, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.hubOffset, graph), graph);
+                    Return ret = new Return(new ReadNode(CiKind.Object, klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.classMirrorOffset, graph), graph), graph);
+                    graph.start().setNext(ret);
+                    graph.setReturn(ret);
+                    intrinsicGraphs.put(method, graph);
                 }
             }