# HG changeset patch # User Lukas Stadler # Date 1353932400 -3600 # Node ID 24950e93b962f64e27f0ba811d7069a969a67edf # Parent be508977fb47a6d0756c6cdf1173c8d71222ea70 only perform PEA iteration if there are analyzable nodes diff -r be508977fb47 -r 24950e93b962 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java Mon Nov 26 13:19:32 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/BoxedVirtualObjectNode.java Mon Nov 26 13:20:00 2012 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ } @Override - public Object fieldName(int index) { + public String fieldName(int index) { assert index == 0; return "value"; } diff -r be508977fb47 -r 24950e93b962 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Mon Nov 26 13:19:32 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualArrayNode.java Mon Nov 26 13:20:00 2012 +0100 @@ -67,7 +67,7 @@ } @Override - public Object fieldName(int index) { + public String fieldName(int index) { return "[" + index + "]"; } } diff -r be508977fb47 -r 24950e93b962 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java Mon Nov 26 13:19:32 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualInstanceNode.java Mon Nov 26 13:20:00 2012 +0100 @@ -67,7 +67,7 @@ } @Override - public Object fieldName(int index) { + public String fieldName(int index) { return fields[index].getName(); } diff -r be508977fb47 -r 24950e93b962 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Mon Nov 26 13:19:32 2012 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java Mon Nov 26 13:20:00 2012 +0100 @@ -52,7 +52,7 @@ // nothing to do... } - public abstract Object fieldName(int i); + public abstract String fieldName(int i); public void materializeAt(@SuppressWarnings("unused") FixedNode fixed) { // nothing to do in here - this method allows subclasses to respond to materialization diff -r be508977fb47 -r 24950e93b962 graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Mon Nov 26 13:19:32 2012 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/PartialEscapeAnalysisPhase.java Mon Nov 26 13:20:00 2012 +0100 @@ -23,12 +23,14 @@ package com.oracle.graal.virtual.phases.ea; import java.util.*; +import java.util.concurrent.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.meta.*; import com.oracle.graal.debug.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.spi.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.graph.*; @@ -65,17 +67,30 @@ return; } - for (int iteration = 0; iteration < GraalOptions.EscapeAnalysisIterations; iteration++) { - Debug.scope("iteration " + iteration, new Runnable() { + boolean analyzableNodes = false; + for (Node node : graph.getNodes()) { + if (node instanceof EscapeAnalyzable) { + analyzableNodes = true; + break; + } + } + if (!analyzableNodes) { + return; + } + + Boolean continueIteration = true; + for (int iteration = 0; iteration < GraalOptions.EscapeAnalysisIterations && continueIteration; iteration++) { + continueIteration = Debug.scope("iteration " + iteration, new Callable() { + @Override - public void run() { + public Boolean call() { SchedulePhase schedule = new SchedulePhase(); schedule.apply(graph, false); PartialEscapeClosure closure = new PartialEscapeClosure(graph.createNodeBitMap(), schedule, runtime); ReentrantBlockIterator.apply(closure, schedule.getCFG().getStartBlock(), new BlockState(), null); if (closure.getVirtualIdCount() == 0) { - return; + return false; } // apply the effects collected during the escape analysis iteration @@ -90,11 +105,12 @@ new DeadCodeEliminationPhase().apply(graph); if (!iterative) { - return; + return false; } if (GraalOptions.OptCanonicalizer) { new CanonicalizerPhase(target, runtime, assumptions).apply(graph); } + return true; } }); }