# HG changeset patch # User Lukas Stadler # Date 1371219994 -7200 # Node ID 33b3cd0222c81a42730d55d8160df18174806e29 # Parent 30499c84823d8247ab44da1b938293fcfe527a5e PEA: allowed for defered effects on ends in MergeProcessor diff -r 30499c84823d -r 33b3cd0222c8 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Fri Jun 14 16:25:49 2013 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Fri Jun 14 16:26:34 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.virtual.phases.ea; +import static com.oracle.graal.phases.GraalOptions.*; + import java.util.*; import com.oracle.graal.debug.*; @@ -82,7 +84,9 @@ @Override protected Void processBlock(Block block, Void currentState) { apply(blockEffects.get(block), block); - Debug.dump(graph, "after processing block %s", block); + if (TraceEscapeAnalysis.getValue()) { + Debug.dump(graph, "after processing block %s", block); + } return currentState; } @@ -109,7 +113,7 @@ @Override protected BlockT processBlock(Block block, BlockT state) { - VirtualUtil.trace("\nBlock: %s (", block); + VirtualUtil.trace("\nBlock: %s, preds: %s, succ: %s (", block, block.getPredecessors(), block.getSuccessors()); GraphEffectList effects = blockEffects.get(block); FixedWithNextNode lastFixedNode = null; @@ -130,6 +134,7 @@ assert blockEffects.get(merge).isEmpty(); MergeProcessor processor = createMergeProcessor(merge); processor.merge(states); + processor.commitEnds(states); blockEffects.get(merge).addAll(processor.mergeEffects); blockEffects.get(merge).addAll(processor.afterMergeEffects); return processor.newState; @@ -138,7 +143,7 @@ @Override protected final List processLoop(Loop loop, BlockT initialState) { BlockT loopEntryState = initialState; - BlockT lastMergedState = initialState; + BlockT lastMergedState = cloneState(initialState); MergeProcessor mergeProcessor = createMergeProcessor(loop.header); for (int iteration = 0; iteration < 10; iteration++) { LoopInfo info = ReentrantBlockIterator.processLoop(this, loop, cloneState(lastMergedState)); @@ -154,6 +159,8 @@ Debug.log("%s", lastMergedState); if (mergeProcessor.newState.equivalentTo(lastMergedState)) { + mergeProcessor.commitEnds(states); + blockEffects.get(loop.header).insertAll(mergeProcessor.mergeEffects, 0); loopMergeEffects.put(loop, mergeProcessor.afterMergeEffects); @@ -198,6 +205,12 @@ protected void merge(List states) { newState = getInitialState(); newState.meetAliases(states); + mergeEffects.clear(); + afterMergeEffects.clear(); + } + + @SuppressWarnings("unused") + protected void commitEnds(List states) { } } }