# HG changeset patch # User Thomas Wuerthinger # Date 1307633351 -7200 # Node ID c20600a461883a916bb9ce5f935a427ce8951639 # Parent cd4176d590e78009abf4a26e885249bfdf5e9765# Parent 0e3ec0a4eda4fa22df25309173a884b60bea1222 Merge. diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 09 17:29:11 2011 +0200 @@ -397,6 +397,9 @@ DeoptimizationStub stub = new DeoptimizationStub(state); deoptimizationStubs.add(stub); + + emitCompare(x.node()); + //emitBranch(x.node(), stub.label) throw new RuntimeException(); //lir.branch(x.condition.negate(), stub.label, stub.info); } @@ -681,10 +684,14 @@ } @Override - public void visitNullCheck(FixedNullCheck x) { - CiValue value = load(x.object()); - LIRDebugInfo info = stateFor(x); - lir.nullCheck(value, info); + public void visitFixedGuard(FixedGuard fixedGuard) { + Node comp = fixedGuard.node(); + if (comp instanceof IsNonNull) { + IsNonNull x = (IsNonNull) comp; + CiValue value = load(x.object()); + LIRDebugInfo info = stateFor(x); + lir.nullCheck(value, info); + } } @Override diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java Thu Jun 09 17:29:11 2011 +0200 @@ -74,6 +74,8 @@ super(kind, inputCount + INPUT_COUNT, successorCount + SUCCESSOR_COUNT, graph); this.field = field; setObject(object); + assert field.isResolved(); + assert field.holder().isResolved(); } /** @@ -93,18 +95,10 @@ } /** - * Checks whether the class of the field of this access is loaded. - * @return {@code true} if the class is loaded - */ - public boolean isLoaded() { - return field.isResolved(); - } - - /** * Checks whether this field is declared volatile. * @return {@code true} if the field is resolved and declared volatile */ public boolean isVolatile() { - return isLoaded() && Modifier.isVolatile(field.accessFlags()); + return Modifier.isVolatile(field.accessFlags()); } } diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java Thu Jun 09 17:29:11 2011 +0200 @@ -126,9 +126,7 @@ return length; } CiConstant constantValue = null; - if (array instanceof LoadField) { - constantValue = ((LoadField) array).constantValue(); - } else if (array.isConstant()) { + if (array.isConstant()) { constantValue = array.asConstant(); } if (constantValue != null && constantValue.isNonNull()) { diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ClipNode.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ClipNode.java Thu Jun 09 15:25:27 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2011, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.graal.compiler.ir; - -import com.oracle.max.graal.compiler.debug.*; -import com.oracle.max.graal.graph.*; -import com.sun.cri.ci.*; - - -public final class ClipNode extends Instruction { - private static final int INPUT_COUNT = 1; - private static final int INPUT_NODE = 0; - - private static final int SUCCESSOR_COUNT = 0; - - /** - * The instruction that produces the object tested against null. - */ - public FloatingNode node() { - return (FloatingNode) inputs().get(super.inputCount() + INPUT_NODE); - } - - public FloatingNode setNode(FloatingNode n) { - return (FloatingNode) inputs().set(super.inputCount() + INPUT_NODE, n); - } - - public ClipNode(Graph graph) { - super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); - } - - @Override - public void accept(ValueVisitor v) { - // Do nothing. - } - - @Override - public void print(LogStream out) { - out.print("clip node ").print(node()); - } - - @Override - public Node copy(Graph into) { - return new ClipNode(into); - } -} diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java Thu Jun 09 17:29:11 2011 +0200 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.max.graal.compiler.ir; + +import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.graph.*; +import com.sun.cri.ci.*; + + +public final class FixedGuard extends Instruction { + private static final int INPUT_COUNT = 1; + private static final int INPUT_NODE = 0; + + private static final int SUCCESSOR_COUNT = 0; + + /** + * The instruction that produces the object tested against null. + */ + public FloatingNode node() { + return (FloatingNode) inputs().get(super.inputCount() + INPUT_NODE); + } + + public FloatingNode setNode(FloatingNode n) { + return (FloatingNode) inputs().set(super.inputCount() + INPUT_NODE, n); + } + + public FixedGuard(Graph graph) { + super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph); + } + + @Override + public void accept(ValueVisitor v) { + v.visitFixedGuard(this); + } + + @Override + public void print(LogStream out) { + out.print("clip node ").print(node()); + } + + @Override + public Node copy(Graph into) { + return new FixedGuard(into); + } +} diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNullCheck.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNullCheck.java Thu Jun 09 15:25:27 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2009, 2011, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package com.oracle.max.graal.compiler.ir; - -import com.oracle.max.graal.compiler.debug.*; -import com.oracle.max.graal.compiler.util.*; -import com.oracle.max.graal.graph.*; -import com.sun.cri.bytecode.*; -import com.sun.cri.ci.*; -import com.sun.cri.ri.*; - -/** - * The {@code NullCheck} class represents an explicit null check instruction. - */ -public final class FixedNullCheck extends Instruction { - - private static final int INPUT_COUNT = 1; - private static final int INPUT_OBJECT = 0; - - private static final int SUCCESSOR_COUNT = 0; - - @Override - protected int inputCount() { - return super.inputCount() + INPUT_COUNT; - } - - @Override - protected int successorCount() { - return super.successorCount() + SUCCESSOR_COUNT; - } - - /** - * The instruction that produces the object tested against null. - */ - public Value object() { - return (Value) inputs().get(super.inputCount() + INPUT_OBJECT); - } - - public Value setObject(Value n) { - return (Value) inputs().set(super.inputCount() + INPUT_OBJECT, n); - } - - /** - * Constructs a new NullCheck instruction. - * @param object the instruction producing the object to check against null - * @param stateBefore the state before executing the null check - * @param graph - */ - public FixedNullCheck(Value object, Graph graph) { - super(CiKind.Object, INPUT_COUNT, SUCCESSOR_COUNT, graph); - assert object == null || object.kind == CiKind.Object; - setObject(object); - } - - @Override - public void accept(ValueVisitor v) { - v.visitNullCheck(this); - } - - @Override - public int valueNumber() { - return Util.hash1(Bytecodes.IFNONNULL, object()); - } - - @Override - public boolean valueEqual(Node i) { - if (i instanceof FixedNullCheck) { - FixedNullCheck o = (FixedNullCheck) i; - return object() == o.object(); - } - return false; - } - - @Override - public RiType declaredType() { - // null check does not alter the type of the object - return object().declaredType(); - } - - @Override - public RiType exactType() { - // null check does not alter the type of the object - return object().exactType(); - } - - @Override - public void print(LogStream out) { - out.print("null_check(").print(object()).print(')'); - } - - @Override - public Node copy(Graph into) { - return new FixedNullCheck(null, into); - } -} diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java Thu Jun 09 17:29:11 2011 +0200 @@ -36,12 +36,12 @@ /** * The instruction that produces the object tested against null. */ - public FloatingNode node() { - return (FloatingNode) inputs().get(super.inputCount() + INPUT_NODE); + public Compare node() { + return (Compare) inputs().get(super.inputCount() + INPUT_NODE); } - public FloatingNode setNode(FloatingNode n) { - return (FloatingNode) inputs().set(super.inputCount() + INPUT_NODE, n); + public Compare setNode(Compare n) { + return (Compare) inputs().set(super.inputCount() + INPUT_NODE, n); } public GuardNode(Graph graph) { diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java Thu Jun 09 17:29:11 2011 +0200 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2009, 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.max.graal.compiler.ir; + +import com.oracle.max.graal.compiler.debug.*; +import com.oracle.max.graal.compiler.util.*; +import com.oracle.max.graal.graph.*; +import com.sun.cri.bytecode.*; +import com.sun.cri.ci.*; +import com.sun.cri.ri.*; + +/** + * The {@code NullCheck} class represents an explicit null check instruction. + */ +public final class IsNonNull extends FloatingNode { + + private static final int INPUT_COUNT = 1; + private static final int INPUT_OBJECT = 0; + + private static final int SUCCESSOR_COUNT = 0; + + @Override + protected int inputCount() { + return super.inputCount() + INPUT_COUNT; + } + + @Override + protected int successorCount() { + return super.successorCount() + SUCCESSOR_COUNT; + } + + /** + * The instruction that produces the object tested against null. + */ + public Value object() { + return (Value) inputs().get(super.inputCount() + INPUT_OBJECT); + } + + public Value setObject(Value n) { + return (Value) inputs().set(super.inputCount() + INPUT_OBJECT, n); + } + + /** + * Constructs a new NullCheck instruction. + * @param object the instruction producing the object to check against null + * @param stateBefore the state before executing the null check + * @param graph + */ + public IsNonNull(Value object, Graph graph) { + super(CiKind.Object, INPUT_COUNT, SUCCESSOR_COUNT, graph); + assert object == null || object.kind == CiKind.Object; + setObject(object); + } + + @Override + public void accept(ValueVisitor v) { + // Nothing to do. + } + + @Override + public int valueNumber() { + return Util.hash1(Bytecodes.IFNONNULL, object()); + } + + @Override + public boolean valueEqual(Node i) { + if (i instanceof IsNonNull) { + IsNonNull o = (IsNonNull) i; + return object() == o.object(); + } + return false; + } + + @Override + public RiType declaredType() { + // null check does not alter the type of the object + return object().declaredType(); + } + + @Override + public RiType exactType() { + // null check does not alter the type of the object + return object().exactType(); + } + + @Override + public void print(LogStream out) { + out.print("null_check(").print(object()).print(')'); + } + + @Override + public Node copy(Graph into) { + return new IsNonNull(null, into); + } +} diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java Thu Jun 09 17:29:11 2011 +0200 @@ -68,8 +68,8 @@ */ @Override public RiType exactType() { - RiType declaredType = declaredType(); - return declaredType.isResolved() ? declaredType.exactType() : null; + RiType declared = declaredType(); + return declared != null && declared.isResolved() ? declared.exactType() : null; } @Override @@ -97,7 +97,7 @@ * * @return {@code null} if this load cannot be reduced to a constant */ - public CiConstant constantValue() { + private CiConstant constantValue() { if (isStatic()) { return field.constantValue(null); } else if (object().isConstant()) { @@ -108,8 +108,7 @@ @Override public Node copy(Graph into) { - LoadField x = new LoadField(null, field, into); - return x; + return new LoadField(null, field, into); } @SuppressWarnings("unchecked") diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ValueVisitor.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ValueVisitor.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ValueVisitor.java Thu Jun 09 17:29:11 2011 +0200 @@ -58,7 +58,7 @@ public abstract void visitNewMultiArray(NewMultiArray i); public abstract void visitNewObjectArray(NewObjectArray i); public abstract void visitNewTypeArray(NewTypeArray i); - public abstract void visitNullCheck(FixedNullCheck i); + public abstract void visitFixedGuard(FixedGuard fixedGuard); public abstract void visitPhi(Phi i); public abstract void visitRegisterFinalizer(RegisterFinalizer i); public abstract void visitReturn(Return i); diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Thu Jun 09 17:29:11 2011 +0200 @@ -680,7 +680,9 @@ private void genThrow(int bci) { Value exception = frameState.apop(); - append(new FixedNullCheck(exception, graph)); + FixedGuard node = new FixedGuard(graph); + node.setNode(new IsNonNull(exception, graph)); + append(node); Instruction entry = handleException(exception, bci); if (entry != null) { diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java Thu Jun 09 17:29:11 2011 +0200 @@ -239,7 +239,9 @@ assert invoke.predecessors().size() == 1 : "size: " + invoke.predecessors().size(); Instruction pred; if (withReceiver) { - pred = new FixedNullCheck(parameters[0], compilation.graph); + FixedGuard clipNode = new FixedGuard(compilation.graph); + clipNode.setNode(new IsNonNull(parameters[0], compilation.graph)); + pred = clipNode; } else { pred = new Merge(compilation.graph); } diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java Thu Jun 09 17:29:11 2011 +0200 @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2011, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.max.graal.compiler.phases; + +import java.util.*; + +import com.oracle.max.graal.compiler.*; +import com.oracle.max.graal.compiler.ir.*; +import com.oracle.max.graal.compiler.schedule.*; +import com.oracle.max.graal.graph.*; + +public class LoweringPhase extends Phase { + @Override + protected void run(Graph graph) { + NodeMap javaBlockNodes = graph.createNodeMap(); + NodeBitMap nodeBitMap = graph.createNodeBitMap(); + for (Node n : graph.getNodes()) { + if (n instanceof FixedNode) { + LoweringOp op = n.lookup(LoweringOp.class); + if (op != null) { + Node javaBlockNode = getJavaBlockNode(javaBlockNodes, n, nodeBitMap); + } + } + + } + } + + private Node getJavaBlockNode(NodeMap javaBlockNodes, Node n, NodeBitMap nodeBitMap) { + assert n instanceof FixedNode; + if (javaBlockNodes.get(n) == null) { + + Node truePred = null; + int count = 0; + for (Node pred : n.predecessors()) { + if (pred instanceof FixedNode) { + truePred = pred; + count++; + } + } + + assert count > 0; + if (count == 1) { + if (Schedule.trueSuccessorCount(truePred) == 1) { + javaBlockNodes.set(n, getJavaBlockNode(javaBlockNodes, truePred, nodeBitMap)); + } else { + // Single predecessor is a split => we are our own block node. + javaBlockNodes.set(n, n); + } + } else { + Node dominator = null; + for (Node pred : n.predecessors()) { + if (pred instanceof FixedNode) { + dominator = getCommonDominator(dominator, pred, nodeBitMap); + } + } + } + } + + assert Schedule.truePredecessorCount(javaBlockNodes.get(n)) == 1; + return javaBlockNodes.get(n); + } + + private Node getCommonDominator(Node a, Node b, NodeBitMap map) { + if (a == null) { + return b; + } + + if (b == null) { + return a; + } + + + map.clearAll(); + } + + public interface LoweringOp extends Op { + Node lower(Node node); + } +} diff -r 0e3ec0a4eda4 -r c20600a46188 graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java --- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Thu Jun 09 15:25:27 2011 +0200 +++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java Thu Jun 09 17:29:11 2011 +0200 @@ -65,6 +65,10 @@ check(node); bitMap.clear(node.id()); } + + public void clearAll() { + bitMap.clearAll(); + } private void check(Node node) { assert node.graph == graph : "this node is not part of the graph";