# HG changeset patch # User Gilles Duboscq # Date 1308130260 -7200 # Node ID 228276b7813b2429e9307d388706fc95966c6874 # Parent 42681ed31c4d16c7ef521a412bc028b37d616ff0# Parent ec86f14be4cffc3120288a9f75a9186abc444ec6 Merge diff -r 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Wed Jun 15 11:31:00 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 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java Wed Jun 15 11:31:00 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 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Wed Jun 15 11:31:00 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 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java Wed Jun 15 11:31:00 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 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Jun 15 11:31:00 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 42681ed31c4d -r 228276b7813b 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 Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Wed Jun 15 11:31:00 2011 +0200 @@ -820,7 +820,7 @@ LoadField load = new LoadField(container, field, graph); appendOptimizedLoadField(kind, load); } else { - append(new Deoptimize(DeoptAction.InvalidateRecompile, graph)); + // deopt will be generated by genTypeOrDeopt, not needed here frameState.push(kind.stackKind(), append(Constant.defaultForKind(kind, graph))); } } @@ -834,7 +834,7 @@ StoreField store = new StoreField(container, field, value, graph); appendOptimizedStoreField(store); } else { - append(new Deoptimize(DeoptAction.InvalidateRecompile, graph)); + // deopt will be generated by genTypeOrDeopt, not needed here } } @@ -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 42681ed31c4d -r 228276b7813b graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Wed Jun 15 11:31:00 2011 +0200 @@ -56,10 +56,8 @@ if (!loopNodes.isMarked(init) && backEdge instanceof IntegerAdd && loopNodes.isMarked(backEdge)) { IntegerAdd add = (IntegerAdd) backEdge; int addUsageCount = 0; - System.out.println("BackEdge usages :"); for (Node u : add.usages()) { if (u != loopEnd.stateBefore()) { - System.out.println(" - " + u); addUsageCount++; } } diff -r 42681ed31c4d -r 228276b7813b graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java diff -r 42681ed31c4d -r 228276b7813b graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Wed Jun 15 11:31:00 2011 +0200 @@ -65,7 +65,7 @@ check(node); bitMap.clear(node.id()); } - + public void clearAll() { bitMap.clearAll(); } diff -r 42681ed31c4d -r 228276b7813b graal/com.oracle.max.graal.graphviz/.checkstyle --- a/graal/com.oracle.max.graal.graphviz/.checkstyle Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.graphviz/.checkstyle Wed Jun 15 11:31:00 2011 +0200 @@ -1,7 +1,7 @@ - + diff -r 42681ed31c4d -r 228276b7813b graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java --- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java Wed Jun 15 11:20:26 2011 +0200 +++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/VMExitsNative.java Wed Jun 15 11:31:00 2011 +0200 @@ -103,11 +103,12 @@ public abstract class Sandbox { public void start() throws Throwable { - PrintStream oldOut = System.out; - PrintStream oldErr = System.err; + // (ls) removed output and error stream rewiring, this influences applications and, for example, makes dacapo tests fail. +// PrintStream oldOut = System.out; +// PrintStream oldErr = System.err; run(); - System.setOut(oldOut); - System.setErr(oldErr); +// System.setOut(oldOut); +// System.setErr(oldErr); } protected abstract void run() throws Throwable; diff -r 42681ed31c4d -r 228276b7813b runfop.sh diff -r 42681ed31c4d -r 228276b7813b src/share/vm/graal/graalCodeInstaller.cpp --- a/src/share/vm/graal/graalCodeInstaller.cpp Wed Jun 15 11:20:26 2011 +0200 +++ b/src/share/vm/graal/graalCodeInstaller.cpp Wed Jun 15 11:31:00 2011 +0200 @@ -156,8 +156,7 @@ if (index >= 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 42681ed31c4d -r 228276b7813b src/share/vm/graal/graalVMExits.cpp --- a/src/share/vm/graal/graalVMExits.cpp Wed Jun 15 11:20:26 2011 +0200 +++ b/src/share/vm/graal/graalVMExits.cpp Wed Jun 15 11:31:00 2011 +0200 @@ -113,6 +113,7 @@ } void VMExits::shutdownCompiler() { + HandleMark hm; JavaThread* THREAD = JavaThread::current(); JavaValue result(T_VOID); JavaCallArguments args;