# HG changeset patch # User Thomas Wuerthinger # Date 1376483045 -7200 # Node ID 74ccfb4d39ec1f6f3ef7ce6ee9ead3a261a3d902 # Parent 28da427847c54a613851ea7c6d6599b88d780a40 Bailout of iterative conditional elimination phase in case the number of iterations exceeds specific threshold. diff -r 28da427847c5 -r 74ccfb4d39ec graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Wed Aug 14 11:52:15 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java Wed Aug 14 14:24:05 2013 +0200 @@ -26,6 +26,7 @@ import java.util.*; +import com.oracle.graal.api.code.*; import com.oracle.graal.graph.Graph.NodeChangedListener; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; @@ -34,11 +35,14 @@ public class IterativeConditionalEliminationPhase extends BasePhase { + private static final int MAX_ITERATIONS = 256; + @Override protected void run(StructuredGraph graph, PhaseContext context) { Set canonicalizationRoots = new HashSet<>(); ConditionalEliminationPhase eliminate = new ConditionalEliminationPhase(context.getRuntime()); Listener listener = new Listener(canonicalizationRoots); + int count = 0; while (true) { graph.trackInputChange(listener); eliminate.apply(graph); @@ -48,6 +52,9 @@ } new CanonicalizerPhase.Instance(context.getRuntime(), context.getAssumptions(), !AOTCompilation.getValue(), canonicalizationRoots, null).apply(graph); canonicalizationRoots.clear(); + if (++count > MAX_ITERATIONS) { + throw new BailoutException("Number of iterations in conditional elimination phase exceeds " + MAX_ITERATIONS); + } } }