Mercurial > hg > truffle
changeset 10919:2cf0785957fb
NewMemoryAwareScheduling: handle loop headers different than merges (GRAAL-159)
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Thu, 01 Aug 2013 17:23:30 +0200 |
parents | 3736fb3dcc56 |
children | 9802c478a26c |
files | graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java |
diffstat | 1 files changed, 12 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Thu Aug 01 17:23:28 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Thu Aug 01 17:23:30 2013 +0200 @@ -202,10 +202,17 @@ @Override protected Map<LocationIdentity, Node> merge(Block merge, List<Map<LocationIdentity, Node>> states) { + return merge(merge, states, false); + } + + protected Map<LocationIdentity, Node> merge(Block merge, List<Map<LocationIdentity, Node>> states, boolean loopbegin) { assert merge.getBeginNode() instanceof MergeNode; MergeNode mergeNode = (MergeNode) merge.getBeginNode(); - Map<LocationIdentity, Node> initKillMap = cloneState(getBlockToKillMap().get(merge)); + Map<LocationIdentity, Node> initKillMap = new HashMap<>(); + if (loopbegin) { + initKillMap.putAll(getBlockToKillMap().get(merge)); + } for (Map<LocationIdentity, Node> state : states) { for (LocationIdentity locid : state.keySet()) { if (initKillMap.containsKey(locid)) { @@ -219,6 +226,9 @@ } getMergeToKillMap().set(mergeNode, cloneState(initKillMap)); + if (!loopbegin) { + initKillMap.putAll(getBlockToKillMap().get(merge)); + } return initKillMap; } @@ -232,7 +242,7 @@ LoopInfo<Map<LocationIdentity, Node>> info = ReentrantBlockIterator.processLoop(this, loop, new HashMap<>(state)); assert loop.header.getBeginNode() instanceof LoopBeginNode; - Map<LocationIdentity, Node> headerState = merge(loop.header, info.endStates); + Map<LocationIdentity, Node> headerState = merge(loop.header, info.endStates, true); getBlockToKillMap().put(loop.header, headerState); for (Map<LocationIdentity, Node> exitState : info.exitStates) {