# HG changeset patch # User Thomas Wuerthinger # Date 1309774902 -7200 # Node ID dcf2b46665a01694d340c66909add5441bccbafa # Parent 1d907446ac7f5a7a09549e91ce434dae5f76e734 Added intrinsification of getClass() diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java --- 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; } diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java --- 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; diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java --- 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(); } diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- 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 diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- 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); } diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java --- 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; } diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java --- 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()); } } } diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java --- 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) { diff -r 1d907446ac7f -r dcf2b46665a0 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java --- 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); } diff -r 1d907446ac7f -r dcf2b46665a0 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 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); } }