# HG changeset patch # User Bernhard Urban # Date 1375370610 -7200 # Node ID 2cf0785957fb3fef5c232c10b57c338e62c10795 # Parent 3736fb3dcc56d96b1ad51db4e5c96eb5ad46f53a NewMemoryAwareScheduling: handle loop headers different than merges (GRAAL-159) diff -r 3736fb3dcc56 -r 2cf0785957fb 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 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 merge(Block merge, List> states) { + return merge(merge, states, false); + } + + protected Map merge(Block merge, List> states, boolean loopbegin) { assert merge.getBeginNode() instanceof MergeNode; MergeNode mergeNode = (MergeNode) merge.getBeginNode(); - Map initKillMap = cloneState(getBlockToKillMap().get(merge)); + Map initKillMap = new HashMap<>(); + if (loopbegin) { + initKillMap.putAll(getBlockToKillMap().get(merge)); + } for (Map 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> info = ReentrantBlockIterator.processLoop(this, loop, new HashMap<>(state)); assert loop.header.getBeginNode() instanceof LoopBeginNode; - Map headerState = merge(loop.header, info.endStates); + Map headerState = merge(loop.header, info.endStates, true); getBlockToKillMap().put(loop.header, headerState); for (Map exitState : info.exitStates) {