# HG changeset patch # User Thomas Wuerthinger # Date 1422373945 -3600 # Node ID 78f9a57525af2f79d87c49a4143e8e5a5951d1e3 # Parent b648ac155f1b09ebbfa3f396c9b0b5656457aa61 Pass a lambda to the ReentrantBlockIterator instead of a set. diff -r b648ac155f1b -r 78f9a57525af graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Tue Jan 27 16:16:06 2015 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java Tue Jan 27 16:52:25 2015 +0100 @@ -23,8 +23,8 @@ package com.oracle.graal.phases.graph; import java.util.*; +import java.util.function.*; -import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -61,7 +61,7 @@ } public static LoopInfo processLoop(BlockIteratorClosure closure, Loop loop, StateT initialState) { - Map blockEndStates = apply(closure, loop.getHeader(), initialState, CollectionsFactory.newSet(loop.getBlocks())); + Map blockEndStates = apply(closure, loop.getHeader(), initialState, block -> !(block.getLoop() == loop || block.isLoopHeader())); List predecessors = loop.getHeader().getPredecessors(); LoopInfo info = new LoopInfo<>(predecessors.size() - 1, loop.getExits().size()); @@ -84,7 +84,7 @@ apply(closure, start, closure.getInitialState(), null); } - public static Map apply(BlockIteratorClosure closure, Block start, StateT initialState, Set boundary) { + public static Map apply(BlockIteratorClosure closure, Block start, StateT initialState, Predicate stopAtBlock) { Deque blockQueue = new ArrayDeque<>(); /* * States are stored on EndNodes before merges, and on BeginNodes after ControlSplitNodes. @@ -96,7 +96,7 @@ while (true) { Block next = null; - if (boundary != null && !boundary.contains(current)) { + if (stopAtBlock != null && stopAtBlock.test(current)) { states.put(current.getBeginNode(), state); } else { state = closure.processBlock(current, state); diff -r b648ac155f1b -r 78f9a57525af graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Jan 27 16:16:06 2015 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Tue Jan 27 16:52:25 2015 +0100 @@ -533,7 +533,7 @@ closure = new NewMemoryScheduleClosure(); } Map states; - states = ReentrantBlockIterator.apply(closure, currentBlock, new KillSet(), region); + states = ReentrantBlockIterator.apply(closure, currentBlock, new KillSet(), (block) -> !region.contains(block)); KillSet mergeState = states.get(dominatedBlock.getBeginNode()); if (mergeState.isKilled(locid)) { diff -r b648ac155f1b -r 78f9a57525af 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 Tue Jan 27 16:16:06 2015 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Tue Jan 27 16:52:25 2015 +0100 @@ -177,9 +177,7 @@ assert info.exitStates.size() == loop.getExits().size(); loopEntryStates.put((LoopBeginNode) loop.getHeader().getBeginNode(), loopEntryState); - for (int i = 0; i < loop.getExits().size(); i++) { - assert info.exitStates.get(i) != null : "no loop exit state at " + loop.getExits().get(i) + " / " + loop.getHeader(); - } + assert assertExitStatesNonEmpty(loop, info); return info.exitStates; } else { @@ -192,6 +190,13 @@ throw new GraalInternalError("too many iterations at %s", loop); } + private boolean assertExitStatesNonEmpty(Loop loop, LoopInfo info) { + for (int i = 0; i < loop.getExits().size(); i++) { + assert info.exitStates.get(i) != null : "no loop exit state at " + loop.getExits().get(i) + " / " + loop.getHeader(); + } + return true; + } + protected abstract void processLoopExit(LoopExitNode exitNode, BlockT initialState, BlockT exitState, GraphEffectList effects); protected abstract MergeProcessor createMergeProcessor(Block merge);