# HG changeset patch # User Lukas Stadler # Date 1308062851 -7200 # Node ID 0c0e407faa39bad210c3f4d301168b934de95b1c # Parent 8b2953f6d3252f998d4d1841b170757c3ed45bea another fix to debug info (on-stack parameters), DCE removes unnecessary merges and LoopBegins whose LoopEnd went away diff -r 8b2953f6d325 -r 0c0e407faa39 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Tue Jun 14 16:47:31 2011 +0200 @@ -173,7 +173,7 @@ } for (Entry entry : props.entrySet()) { String key = entry.getKey().toString(); - String value = entry.getValue().toString(); + String value = entry.getValue() == null ? "null" : entry.getValue().toString(); stream.printf("

%s

%n", escape(key), escape(value)); } diff -r 8b2953f6d325 -r 0c0e407faa39 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java Tue Jun 14 16:47:31 2011 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.max.graal.compiler.ir; +import java.util.*; + import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; @@ -75,6 +77,14 @@ } @Override + public Map getDebugProperties() { + Map properties = super.getDebugProperties(); + properties.put("message", message); + properties.put("action", action); + return properties; + } + + @Override public Node copy(Graph into) { Deoptimize x = new Deoptimize(action, into); x.setMessage(message); diff -r 8b2953f6d325 -r 0c0e407faa39 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 Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Tue Jun 14 16:47:31 2011 +0200 @@ -127,7 +127,7 @@ @Override public Node lower(Node n, LoweringTool tool) { LoadField field = (LoadField) n; - return null;//field.field().createLoad(tool); + return null; //field.field().createLoad(tool); } } diff -r 8b2953f6d325 -r 0c0e407faa39 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java Tue Jun 14 16:47:31 2011 +0200 @@ -43,7 +43,7 @@ } } } - assert false : "Begin should always have a LoopEnd"; + assert false : "LoopBegin should always have a LoopEnd"; return null; } diff -r 8b2953f6d325 -r 0c0e407faa39 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Tue Jun 14 16:47:31 2011 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.max.graal.compiler.phases; +import java.util.*; + import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.ir.*; @@ -32,38 +34,42 @@ private NodeFlood flood; private Graph graph; + private ArrayList brokenLoops; @Override protected void run(Graph graph) { this.graph = graph; this.flood = graph.createNodeFlood(); + this.brokenLoops = new ArrayList(); // remove chained Merges -// for (Merge merge : graph.getNodes(Merge.class)) { -// if (merge.predecessors().size() == 1 && merge.usages().size() == 0) { -// if (merge.successors().get(0) instanceof Merge) { -// Node pred = merge.predecessors().get(0); -// int predIndex = merge.predecessorsIndex().get(0); -// pred.successors().setAndClear(predIndex, merge, 0); -// merge.delete(); -// } -// } -// } -// Node startSuccessor = graph.start().successors().get(0); -// if (startSuccessor instanceof Merge) { -// Merge startMerge = (Merge) startSuccessor; -// if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) { -// int predIndex = startMerge.predecessorsIndex().get(0); -// graph.start().successors().setAndClear(predIndex, startMerge, 0); -// startMerge.delete(); -// } -// } + for (Merge merge : graph.getNodes(Merge.class)) { + if (merge.predecessors().size() == 1 && merge.usages().size() == 0) { + if (merge.successors().get(0) instanceof Merge) { + Node pred = merge.predecessors().get(0); + int predIndex = merge.predecessorsIndex().get(0); + pred.successors().setAndClear(predIndex, merge, 0); + merge.delete(); + } + } + } + Node startSuccessor = graph.start().successors().get(0); + if (startSuccessor instanceof Merge) { + Merge startMerge = (Merge) startSuccessor; + if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) { + int predIndex = startMerge.predecessorsIndex().get(0); + graph.start().successors().setAndClear(predIndex, startMerge, 0); + startMerge.delete(); + } + } flood.add(graph.start()); iterateSuccessors(); disconnectCFGNodes(); + deleteBrokenLoops(); + iterateInputs(); disconnectNonCFGNodes(); @@ -72,6 +78,7 @@ new PhiSimplifier(graph); + if (GraalOptions.TraceDeadCodeElimination) { System.out.printf("dead code elimination finished\n"); } @@ -92,6 +99,9 @@ private void disconnectCFGNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) { + if (node instanceof LoopEnd) { + brokenLoops.add(((LoopEnd) node).loopBegin()); + } // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct for (int i = node.successors().size() - 1; i >= 0; i--) { Node successor = node.successors().get(i); @@ -107,6 +117,21 @@ } } + private void deleteBrokenLoops() { + for (LoopBegin loop : brokenLoops) { + assert loop.predecessors().size() == 1; + for (Node usage : new ArrayList(loop.usages())) { + assert usage instanceof Phi; + usage.replace(((Phi) usage).valueAt(0)); + } + + Node pred = loop.predecessors().get(0); + int predIndex = loop.predecessorsIndex().get(0); + pred.successors().setAndClear(predIndex, loop, 0); + loop.delete(); + } + } + private void deleteCFGNodes() { for (Node node : graph.getNodes()) { if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) { diff -r 8b2953f6d325 -r 0c0e407faa39 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 Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Tue Jun 14 16:47:31 2011 +0200 @@ -923,7 +923,9 @@ private void appendInvoke(int opcode, RiMethod target, Value[] args, int cpi, RiConstantPool constantPool) { CiKind resultType = returnKind(target); if (GraalOptions.DeoptALot) { - append(new Deoptimize(DeoptAction.None, graph)); + Deoptimize deoptimize = new Deoptimize(DeoptAction.None, graph); + deoptimize.setMessage("invoke " + target.name()); + append(deoptimize); frameState.pushReturn(resultType, Constant.defaultForKind(resultType, graph)); } else { Invoke invoke = new Invoke(bci(), opcode, resultType.stackKind(), args, target, target.signature().returnType(method.holder()), method.typeProfile(bci()), graph); diff -r 8b2953f6d325 -r 0c0e407faa39 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Tue Jun 14 11:03:14 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Tue Jun 14 16:47:31 2011 +0200 @@ -221,7 +221,7 @@ } } else { Block dominatorBlock = b.getPredecessors().get(0); - for (int i=1; i= 0) { value = new LocationValue(Location::new_stk_loc(locationType, index * HeapWordSize)); } else { - int frame_size_bytes = frame_size + 2 * HeapWordSize; - value = new LocationValue(Location::new_stk_loc(locationType, -(index * HeapWordSize) + frame_size_bytes)); + value = new LocationValue(Location::new_stk_loc(locationType, -(index * HeapWordSize) + frame_size)); } if (type == T_DOUBLE || type == T_LONG) { second = value; diff -r 8b2953f6d325 -r 0c0e407faa39 src/share/vm/graal/graalVMExits.cpp --- a/src/share/vm/graal/graalVMExits.cpp Tue Jun 14 11:03:14 2011 +0200 +++ b/src/share/vm/graal/graalVMExits.cpp Tue Jun 14 16:47:31 2011 +0200 @@ -113,6 +113,7 @@ } void VMExits::shutdownCompiler() { + HandleMark hm; JavaThread* THREAD = JavaThread::current(); JavaValue result(T_VOID); JavaCallArguments args;