# HG changeset patch # User Gilles Duboscq # Date 1308216913 -7200 # Node ID 183389909fe3ac2c6f452b63e6025105902ee4a7 # Parent a8e8035916a3b8ed0c781dbe1b3a39a48d931c53 Begin making LoopBegin not be a Merge anymore diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java Thu Jun 16 11:35:13 2011 +0200 @@ -133,4 +133,5 @@ public static boolean PrintLIRWithAssembly = ____; public static boolean OptCanonicalizer = true; + public static boolean OptLoops = true; } diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java Thu Jun 16 11:35:13 2011 +0200 @@ -193,7 +193,7 @@ assert numSux == 2 : "method should not be called otherwise"; - if ( instructions.get(instructions.size() - 1).code != LIROpcode.Branch) { + if (instructions.get(instructions.size() - 1).code != LIROpcode.Branch) { for (Node n : block.getInstructions()) { TTY.println("instr: " + n); } diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 16 11:35:13 2011 +0200 @@ -1433,7 +1433,7 @@ @Override public void visitLoopEnd(LoopEnd x) { setNoResult(x); - moveToPhi(x.loopBegin(), x.loopBegin().endCount()); + //moveToPhi(x.loopBegin(), x.loopBegin().endCount()); //TODO gd lir.jump(getLIRBlock(x.loopBegin())); } @@ -1459,6 +1459,7 @@ } } resolver.dispose(); + /* //TODO (gd) remove that later if (merge instanceof LoopBegin) { for (Node usage : merge.usages()) { @@ -1479,7 +1480,7 @@ } } } - } + }*/ } /** diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Thu Jun 16 11:35:13 2011 +0200 @@ -70,19 +70,14 @@ public void build() { new GraphBuilderPhase(compilation, compilation.method, false, false).apply(compilation.graph); - //printGraph("After GraphBuilding", compilation.graph); - if (GraalOptions.TestGraphDuplication) { new DuplicationPhase().apply(compilation.graph); - //printGraph("After Duplication", compilation.graph); } new DeadCodeEliminationPhase().apply(compilation.graph); - //printGraph("After DeadCodeElimination", compilation.graph); if (GraalOptions.Inline) { new InliningPhase(compilation, this, GraalOptions.TraceInlining).apply(compilation.graph); - //printGraph("After Ininling", compilation.graph); } if (GraalOptions.Time) { @@ -94,10 +89,11 @@ if (GraalOptions.OptCanonicalizer) { new CanonicalizerPhase().apply(graph); new DeadCodeEliminationPhase().apply(compilation.graph); - printGraph("After Canonicalization", graph); } - new LoopPhase().apply(graph); + if (GraalOptions.OptLoops) { + new LoopPhase().apply(graph); + } new LoweringPhase().apply(graph); diff -r a8e8035916a3 -r 183389909fe3 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 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java Thu Jun 16 11:35:13 2011 +0200 @@ -24,14 +24,15 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.graph.*; +import com.sun.cri.ci.*; -public class LoopBegin extends Merge { +public class LoopBegin extends Instruction { private static final int INPUT_COUNT = 0; private static final int SUCCESSOR_COUNT = 0; public LoopBegin(Graph graph) { - super(INPUT_COUNT, SUCCESSOR_COUNT, graph); + super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); } public LoopEnd loopEnd() { diff -r a8e8035916a3 -r 183389909fe3 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 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Thu Jun 16 11:35:13 2011 +0200 @@ -45,7 +45,7 @@ // remove chained Merges for (Merge merge : graph.getNodes(Merge.class)) { - if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopEnd) && !(merge instanceof LoopBegin)) { + if (merge.endCount() == 1 && merge.usages().size() == 0 && !(merge instanceof LoopEnd)) { merge.endAt(0).replace(merge.next()); merge.delete(); } diff -r a8e8035916a3 -r 183389909fe3 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 Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Thu Jun 16 11:35:13 2011 +0200 @@ -244,7 +244,7 @@ clipNode.setNode(new IsNonNull(parameters[0], compilation.graph)); pred = clipNode; } else { - pred = new Placeholder(compilation.graph);//(Instruction) invoke.predecessors().get(0);//new Merge(compilation.graph); + pred = new Placeholder(compilation.graph); //(Instruction) invoke.predecessors().get(0);//new Merge(compilation.graph); } invoke.predecessors().get(0).successors().replace(invoke, pred); replacements.put(startNode, pred); @@ -263,7 +263,7 @@ } if (pred instanceof Placeholder) { - pred.replace(((Placeholder)pred).next()); + pred.replace(((Placeholder) pred).next()); } if (returnNode != null) { diff -r a8e8035916a3 -r 183389909fe3 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 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Thu Jun 16 11:35:13 2011 +0200 @@ -61,14 +61,16 @@ if (c2 != null && c1.stride().valueEqual(c2.stride())) { acounters[j] = null; CiKind kind = c1.kind; - IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph); + /*IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph); IntegerAdd addStride = new IntegerAdd(kind, sub, c1.stride(), graph); IntegerAdd add = new IntegerAdd(kind, c1, addStride, graph); Phi phi = new Phi(kind, loopBegin, graph); // TODO (gd) assumes order on loopBegin preds phi.addInput(c2.init()); phi.addInput(add); - c2.replace(phi); - //System.out.println("--> merged Loop Counters"); + c2.replace(phi);*/ + IntegerSub sub = new IntegerSub(kind, c2.init(), c1.init(), graph); + IntegerAdd add = new IntegerAdd(kind, c1, sub, graph); + c2.replace(add); } } } diff -r a8e8035916a3 -r 183389909fe3 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 Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 16 11:35:13 2011 +0200 @@ -196,11 +196,11 @@ // Add successors of loop end nodes. Makes the graph cyclic. for (Block block : blocks) { - Node n = block.firstNode(); - if (n instanceof LoopBegin) { - LoopBegin loopBegin = (LoopBegin) n; - assert loopBegin.loopEnd() != null; - nodeToBlock.get(loopBegin.loopEnd()).addSuccessor(block); + Node n = block.lastNode(); + if (n instanceof LoopEnd) { + LoopEnd loopEnd = (LoopEnd) n; + assert loopEnd.loopBegin() != null; + block.addSuccessor(nodeToBlock.get(loopEnd.loopBegin())); } } @@ -309,13 +309,13 @@ EndNode pred = merge.endAt(i); block = getCommonDominator(block, nodeToBlock.get(pred)); } - } else if (usage instanceof LoopCounter) { + /*} else if (usage instanceof LoopCounter) { //TODO gd LoopCounter counter = (LoopCounter) usage; if (n == counter.init()) { LoopBegin loopBegin = counter.loopBegin(); Block mergeBlock = nodeToBlock.get(loopBegin); block = getCommonDominator(block, mergeBlock.dominator()); - } + }*/ } else { block = getCommonDominator(block, assignLatestPossibleBlockToNode(usage)); } diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java Thu Jun 16 11:35:13 2011 +0200 @@ -485,7 +485,7 @@ @Override public void visitLoopBegin(LoopBegin x) { - visitMerge(x); + } @Override diff -r a8e8035916a3 -r 183389909fe3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Wed Jun 15 21:20:44 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Thu Jun 16 11:35:13 2011 +0200 @@ -387,11 +387,7 @@ phi.addInput((x == y) ? phi : y); } - if (block instanceof LoopBegin) { -// assert phi.valueCount() == ((LoopBegin) block).loopEnd().predecessors().size() + 1 : "loop, valueCount=" + phi.valueCount() + " predSize= " + ((LoopBegin) block).loopEnd().predecessors().size(); - } else { - assert phi.valueCount() == block.endCount() + 1 : "valueCount=" + phi.valueCount() + " predSize= " + block.endCount(); - } + assert phi.valueCount() == block.endCount() + 1 : "valueCount=" + phi.valueCount() + " predSize= " + block.endCount(); } } } diff -r a8e8035916a3 -r 183389909fe3 runfop.sh --- a/runfop.sh Wed Jun 15 21:20:44 2011 +0200 +++ b/runfop.sh Thu Jun 16 11:35:13 2011 +0200 @@ -15,4 +15,4 @@ echo "DACAPO is not defined. It must point to a Dacapo benchmark directory." exit 1; fi -${JDK7}/bin/java -client -d64 -graal -Xms1g -Xmx2g -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar $* Harness --preserve -n 5 fop +${JDK7}/bin/java -client -d64 -graal -Xms1g -Xmx2g -G:-OptLoops -esa -classpath ${DACAPO}/dacapo-9.12-bach.jar $* Harness --preserve -n 5 fop