Mercurial > hg > truffle
changeset 11304:74ccfb4d39ec
Bailout of iterative conditional elimination phase in case the number of iterations exceeds specific threshold.
author | Thomas Wuerthinger <thomas.wuerthinger@oracle.com> |
---|---|
date | Wed, 14 Aug 2013 14:24:05 +0200 |
parents | 28da427847c5 |
children | edf7e09ad382 |
files | graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java |
diffstat | 1 files changed, 7 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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<PhaseContext> { + private static final int MAX_ITERATIONS = 256; + @Override protected void run(StructuredGraph graph, PhaseContext context) { Set<Node> 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); + } } }