Mercurial > hg > truffle
changeset 21279:b8ad48692008
properly prepare phis for initial loop states
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Mon, 11 May 2015 11:11:27 +0200 |
parents | f026cf83c2bb |
children | b97ec8aec2c7 |
files | graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java |
diffstat | 4 files changed, 41 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Mon May 11 11:59:28 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Mon May 11 11:11:27 2015 +0200 @@ -182,7 +182,7 @@ /** * Collects the effects of virtualizing the given node. - * + * * @return {@code true} if the effects include removing the node, {@code false} otherwise. */ protected abstract boolean processNode(Node node, BlockT state, GraphEffectList effects, FixedWithNextNode lastFixedNode); @@ -210,6 +210,7 @@ BlockT loopEntryState = initialState; BlockT lastMergedState = cloneState(initialState); + processInitialLoopState(loop, lastMergedState); MergeProcessor mergeProcessor = createMergeProcessor(loop.getHeader()); for (int iteration = 0; iteration < 10; iteration++) { LoopInfo<BlockT> info = ReentrantBlockIterator.processLoop(this, loop, cloneState(lastMergedState)); @@ -245,6 +246,11 @@ throw new GraalInternalError("too many iterations at %s", loop); } + @SuppressWarnings("unused") + protected void processInitialLoopState(Loop<Block> loop, BlockT initialState) { + // nothing to do + } + private void doMergeWithoutDead(MergeProcessor mergeProcessor, List<BlockT> states) { int alive = 0; for (BlockT state : states) {
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java Mon May 11 11:59:28 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationBlockState.java Mon May 11 11:11:27 2015 +0200 @@ -115,7 +115,7 @@ ValueNode cacheObject; ObjectState obj = closure.getObjectState(this, object); if (obj != null) { - assert !obj.isVirtual(); + assert !obj.isVirtual() : object; cacheObject = obj.getMaterializedValue(); } else { cacheObject = object;
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java Mon May 11 11:59:28 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PEReadEliminationClosure.java Mon May 11 11:11:27 2015 +0200 @@ -27,6 +27,7 @@ import java.util.*; import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.cfg.*; @@ -212,6 +213,23 @@ } @Override + protected void processInitialLoopState(Loop<Block> loop, PEReadEliminationBlockState initialState) { + super.processInitialLoopState(loop, initialState); + + for (PhiNode phi : ((LoopBeginNode) loop.getHeader().getBeginNode()).phis()) { + ValueNode firstValue = phi.valueAt(0); + if (firstValue != null) { + firstValue = GraphUtil.unproxify(firstValue); + for (Map.Entry<ReadCacheEntry, ValueNode> entry : new ArrayList<>(initialState.getReadCache().entrySet())) { + if (entry.getKey().object == firstValue) { + initialState.addReadCache(phi, entry.getKey().identity, entry.getKey().index, entry.getValue(), this); + } + } + } + } + } + + @Override protected void processLoopExit(LoopExitNode exitNode, PEReadEliminationBlockState initialState, PEReadEliminationBlockState exitState, GraphEffectList effects) { super.processLoopExit(exitNode, initialState, exitState, effects);
--- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Mon May 11 11:59:28 2015 +0200 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeClosure.java Mon May 11 11:11:27 2015 +0200 @@ -26,6 +26,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; +import com.oracle.graal.compiler.common.cfg.*; import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.compiler.common.util.*; import com.oracle.graal.debug.*; @@ -359,6 +360,20 @@ } @Override + protected void processInitialLoopState(Loop<Block> loop, BlockT initialState) { + super.processInitialLoopState(loop, initialState); + + for (PhiNode phi : ((LoopBeginNode) loop.getHeader().getBeginNode()).phis()) { + if (phi.valueAt(0) != null) { + ObjectState state = getObjectState(initialState, phi.valueAt(0)); + if (state != null && state.isVirtual()) { + addAndMarkAlias(state.virtual, phi); + } + } + } + } + + @Override protected void processLoopExit(LoopExitNode exitNode, BlockT initialState, BlockT exitState, GraphEffectList effects) { if (exitNode.graph().hasValueProxies()) { Map<VirtualObjectNode, ProxyNode> proxies = Node.newMap();