< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.phases/src/org/graalvm/compiler/phases/graph/ReentrantBlockIterator.java

Print this page




  60 
  61         protected abstract StateT getInitialState();
  62 
  63         protected abstract StateT processBlock(Block block, StateT currentState);
  64 
  65         protected abstract StateT merge(Block merge, List<StateT> states);
  66 
  67         protected abstract StateT cloneState(StateT oldState);
  68 
  69         protected abstract List<StateT> processLoop(Loop<Block> loop, StateT initialState);
  70     }
  71 
  72     private ReentrantBlockIterator() {
  73         // no instances allowed
  74     }
  75 
  76     public static <StateT> LoopInfo<StateT> processLoop(BlockIteratorClosure<StateT> closure, Loop<Block> loop, StateT initialState) {
  77         EconomicMap<FixedNode, StateT> blockEndStates = apply(closure, loop.getHeader(), initialState, block -> !(block.getLoop() == loop || block.isLoopHeader()));
  78 
  79         Block[] predecessors = loop.getHeader().getPredecessors();
  80         LoopInfo<StateT> info = new LoopInfo<>(predecessors.length - 1, loop.getExits().size());
  81         for (int i = 1; i < predecessors.length; i++) {
  82             StateT endState = blockEndStates.get(predecessors[i].getEndNode());
  83             // make sure all end states are unique objects
  84             info.endStates.add(closure.cloneState(endState));
  85         }
  86         for (Block loopExit : loop.getExits()) {
  87             assert loopExit.getPredecessorCount() == 1;
  88             assert blockEndStates.containsKey(loopExit.getBeginNode()) : loopExit.getBeginNode() + " " + blockEndStates;
  89             StateT exitState = blockEndStates.get(loopExit.getBeginNode());
  90             // make sure all exit states are unique objects
  91             info.exitStates.add(closure.cloneState(exitState));
  92         }
  93         return info;
  94     }
  95 
  96     public static <StateT> void apply(BlockIteratorClosure<StateT> closure, Block start) {
  97         apply(closure, start, closure.getInitialState(), null);
  98     }
  99 
 100     public static <StateT> EconomicMap<FixedNode, StateT> apply(BlockIteratorClosure<StateT> closure, Block start, StateT initialState, Predicate<Block> stopAtBlock) {
 101         Deque<Block> blockQueue = new ArrayDeque<>();
 102         /*
 103          * States are stored on EndNodes before merges, and on BeginNodes after ControlSplitNodes.
 104          */
 105         EconomicMap<FixedNode, StateT> states = EconomicMap.create(Equivalence.IDENTITY);
 106 


 193 
 194     private static <StateT> ArrayList<StateT> mergeStates(EconomicMap<FixedNode, StateT> states, StateT state, Block current, Block successor, AbstractMergeNode merge) {
 195         ArrayList<StateT> mergedStates = new ArrayList<>(merge.forwardEndCount());
 196         for (Block predecessor : successor.getPredecessors()) {
 197             assert predecessor == current || states.containsKey(predecessor.getEndNode());
 198             StateT endState = predecessor == current ? state : states.removeKey(predecessor.getEndNode());
 199             mergedStates.add(endState);
 200         }
 201         return mergedStates;
 202     }
 203 
 204     private static <StateT> void recurseIntoLoop(BlockIteratorClosure<StateT> closure, Deque<Block> blockQueue, EconomicMap<FixedNode, StateT> states, StateT state, Block successor) {
 205         // recurse into the loop
 206         Loop<Block> loop = successor.getLoop();
 207         LoopBeginNode loopBegin = (LoopBeginNode) loop.getHeader().getBeginNode();
 208         assert successor.getBeginNode() == loopBegin;
 209 
 210         List<StateT> exitStates = closure.processLoop(loop, state);
 211 
 212         int i = 0;
 213         assert loop.getExits().size() == exitStates.size();
 214         for (Block exit : loop.getExits()) {
 215             states.put(exit.getBeginNode(), exitStates.get(i++));
 216             blockQueue.addFirst(exit);
 217         }
 218     }
 219 }


  60 
  61         protected abstract StateT getInitialState();
  62 
  63         protected abstract StateT processBlock(Block block, StateT currentState);
  64 
  65         protected abstract StateT merge(Block merge, List<StateT> states);
  66 
  67         protected abstract StateT cloneState(StateT oldState);
  68 
  69         protected abstract List<StateT> processLoop(Loop<Block> loop, StateT initialState);
  70     }
  71 
  72     private ReentrantBlockIterator() {
  73         // no instances allowed
  74     }
  75 
  76     public static <StateT> LoopInfo<StateT> processLoop(BlockIteratorClosure<StateT> closure, Loop<Block> loop, StateT initialState) {
  77         EconomicMap<FixedNode, StateT> blockEndStates = apply(closure, loop.getHeader(), initialState, block -> !(block.getLoop() == loop || block.isLoopHeader()));
  78 
  79         Block[] predecessors = loop.getHeader().getPredecessors();
  80         LoopInfo<StateT> info = new LoopInfo<>(predecessors.length - 1, loop.getLoopExits().size());
  81         for (int i = 1; i < predecessors.length; i++) {
  82             StateT endState = blockEndStates.get(predecessors[i].getEndNode());
  83             // make sure all end states are unique objects
  84             info.endStates.add(closure.cloneState(endState));
  85         }
  86         for (Block loopExit : loop.getLoopExits()) {
  87             assert loopExit.getPredecessorCount() == 1;
  88             assert blockEndStates.containsKey(loopExit.getBeginNode()) : loopExit.getBeginNode() + " " + blockEndStates;
  89             StateT exitState = blockEndStates.get(loopExit.getBeginNode());
  90             // make sure all exit states are unique objects
  91             info.exitStates.add(closure.cloneState(exitState));
  92         }
  93         return info;
  94     }
  95 
  96     public static <StateT> void apply(BlockIteratorClosure<StateT> closure, Block start) {
  97         apply(closure, start, closure.getInitialState(), null);
  98     }
  99 
 100     public static <StateT> EconomicMap<FixedNode, StateT> apply(BlockIteratorClosure<StateT> closure, Block start, StateT initialState, Predicate<Block> stopAtBlock) {
 101         Deque<Block> blockQueue = new ArrayDeque<>();
 102         /*
 103          * States are stored on EndNodes before merges, and on BeginNodes after ControlSplitNodes.
 104          */
 105         EconomicMap<FixedNode, StateT> states = EconomicMap.create(Equivalence.IDENTITY);
 106 


 193 
 194     private static <StateT> ArrayList<StateT> mergeStates(EconomicMap<FixedNode, StateT> states, StateT state, Block current, Block successor, AbstractMergeNode merge) {
 195         ArrayList<StateT> mergedStates = new ArrayList<>(merge.forwardEndCount());
 196         for (Block predecessor : successor.getPredecessors()) {
 197             assert predecessor == current || states.containsKey(predecessor.getEndNode());
 198             StateT endState = predecessor == current ? state : states.removeKey(predecessor.getEndNode());
 199             mergedStates.add(endState);
 200         }
 201         return mergedStates;
 202     }
 203 
 204     private static <StateT> void recurseIntoLoop(BlockIteratorClosure<StateT> closure, Deque<Block> blockQueue, EconomicMap<FixedNode, StateT> states, StateT state, Block successor) {
 205         // recurse into the loop
 206         Loop<Block> loop = successor.getLoop();
 207         LoopBeginNode loopBegin = (LoopBeginNode) loop.getHeader().getBeginNode();
 208         assert successor.getBeginNode() == loopBegin;
 209 
 210         List<StateT> exitStates = closure.processLoop(loop, state);
 211 
 212         int i = 0;
 213         assert loop.getLoopExits().size() == exitStates.size();
 214         for (Block exit : loop.getLoopExits()) {
 215             states.put(exit.getBeginNode(), exitStates.get(i++));
 216             blockQueue.addFirst(exit);
 217         }
 218     }
 219 }
< prev index next >