Mercurial > hg > truffle
changeset 18973:78f9a57525af
Pass a lambda to the ReentrantBlockIterator instead of a set.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Tue, 27 Jan 2015 16:52:25 +0100 |
parents | b648ac155f1b |
children | c597c72e163b |
files | graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ReentrantBlockIterator.java graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java |
diffstat | 3 files changed, 13 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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 <StateT> LoopInfo<StateT> processLoop(BlockIteratorClosure<StateT> closure, Loop<Block> loop, StateT initialState) { - Map<FixedNode, StateT> blockEndStates = apply(closure, loop.getHeader(), initialState, CollectionsFactory.newSet(loop.getBlocks())); + Map<FixedNode, StateT> blockEndStates = apply(closure, loop.getHeader(), initialState, block -> !(block.getLoop() == loop || block.isLoopHeader())); List<Block> predecessors = loop.getHeader().getPredecessors(); LoopInfo<StateT> info = new LoopInfo<>(predecessors.size() - 1, loop.getExits().size()); @@ -84,7 +84,7 @@ apply(closure, start, closure.getInitialState(), null); } - public static <StateT> Map<FixedNode, StateT> apply(BlockIteratorClosure<StateT> closure, Block start, StateT initialState, Set<Block> boundary) { + public static <StateT> Map<FixedNode, StateT> apply(BlockIteratorClosure<StateT> closure, Block start, StateT initialState, Predicate<Block> stopAtBlock) { Deque<Block> 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);
--- 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<FixedNode, KillSet> 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)) {
--- 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<Block> loop, LoopInfo<BlockT> 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);