# HG changeset patch # User Gilles Duboscq # Date 1311253088 -7200 # Node ID cfcd3c52cb08667ae1e27ab96f6c1b7f46e22f1d # Parent 4a6bda6cfe28bb21a63cc22230ba794249751f0f Apply rematerializtion only to GVNed Nodes diff -r 4a6bda6cfe28 -r cfcd3c52cb08 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 Thu Jul 21 11:32:22 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java Thu Jul 21 14:58:08 2011 +0200 @@ -127,21 +127,25 @@ } if (GraalOptions.OptGVN) { + graph.recordModifications(EdgeType.USAGES); // GVN 'ideals' will get new usages new GlobalValueNumberingPhase().apply(graph); if (GraalOptions.Rematerialize) { //new Rematerialization2Phase().apply(graph); new RematerializationPhase().apply(graph); } + graph.stopRecordModifications(); } new LoweringPhase(compilation.runtime).apply(graph); if (GraalOptions.Lower) { new MemoryPhase().apply(graph); if (GraalOptions.OptGVN) { + graph.recordModifications(EdgeType.USAGES); new GlobalValueNumberingPhase().apply(graph); if (GraalOptions.Rematerialize) { new RematerializationPhase().apply(graph); } + graph.stopRecordModifications(); } if (GraalOptions.OptReadElimination) { new ReadEliminationPhase().apply(graph); diff -r 4a6bda6cfe28 -r cfcd3c52cb08 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java Thu Jul 21 11:32:22 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/RematerializationPhase.java Thu Jul 21 14:58:08 2011 +0200 @@ -42,27 +42,34 @@ @Override protected void run(Graph graph) { + Iterable modifiedNodes = graph.getModifiedNodes(); + graph.stopRecordModifications(); + NodeWorkList work = graph.createNodeWorkList(); + for (Node modified : modifiedNodes) { + if (modified instanceof FloatingNode) { + work.add(modified); + } + } + + if (work.isEmpty()) { + return; + } + final IdentifyBlocksPhase s = new IdentifyBlocksPhase(true); s.apply(graph); newNodesToBlock = new HashMap(); nodeToBlock = s.getNodeToBlock(); blocks = s.getBlocks(); - probablityCache = new UsageProbability[blocks.size()]; - NodeWorkList work = graph.createNodeWorkList(); - NodeBitMap done = graph.createNodeBitMap(); - work.addAll(graph.getNodes(FloatingNode.class)); - for (Node node : work) { if (node instanceof Phi || node instanceof Local || node instanceof Constant || node instanceof LocationNode) { - done.mark(node); continue; } boolean delay = false; for (Node usage : node.usages()) { - if (usage instanceof FloatingNode && !(usage instanceof Phi) && done.isNotNewNotMarked(usage)) { + if (usage instanceof FloatingNode && !(usage instanceof Phi) && work.isInQueue(usage)) { delay = true; break; } @@ -71,7 +78,6 @@ work.addAgain(node); continue; } - done.mark(node); Arrays.fill(probablityCache, null); ignoreUsages = true; Block block = nodeToBlock.get(node);