changeset 2984:f49685081630

Merge
author Gilles Duboscq <gilles.duboscq@oracle.com>
date Wed, 15 Jun 2011 19:54:42 +0200
parents f01de7799e05 (diff) 11dfbb40ca69 (current diff)
children ce38e01aa596
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/If.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java
diffstat 72 files changed, 713 insertions(+), 708 deletions(-) [+]
line wrap: on
line diff
--- a/.hgignore	Wed Jun 15 16:36:37 2011 +0200
+++ b/.hgignore	Wed Jun 15 19:54:42 2011 +0200
@@ -17,6 +17,7 @@
 \.orig$
 output\.txt$
 output\.cfg$
+java\.hprof\.txt$
 /nbproject/private/
 ^graal/hotspot/java$
 ^scratch/
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/GraalOptions.java	Wed Jun 15 19:54:42 2011 +0200
@@ -57,6 +57,8 @@
     public static boolean BailoutOnException                 = ____;
     public static boolean DeoptALot                          = ____;
 
+    public static boolean TestGraphDuplication               = ____;
+
     /**
      * See {@link Filter#Filter(String, Object)}.
      */
@@ -105,7 +107,7 @@
     // Code generator settings
     public static boolean GenLIR                             = true;
     public static boolean GenCode                            = true;
-    public static boolean UseBranchPrediction                = ____;
+    public static boolean UseBranchPrediction                = true;
 
     public static boolean UseConstDirectCall                 = ____;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java	Wed Jun 15 19:54:42 2011 +0200
@@ -25,8 +25,10 @@
 import java.util.*;
 
 import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
+import com.oracle.max.graal.graph.*;
 
 /**
  * This class optimizes moves, particularly those that result from eliminating SSA form.
@@ -190,6 +192,12 @@
         List<LIRInstruction> instructions = block.lir().instructionsList();
 
         assert numSux == 2 : "method should not be called otherwise";
+
+        if ( instructions.get(instructions.size() - 1).code != LIROpcode.Branch) {
+            for (Node n : block.getInstructions()) {
+                TTY.println("instr: " + n);
+            }
+        }
         assert instructions.get(instructions.size() - 1).code == LIROpcode.Branch : "block with successor must end with branch block=B" + block.blockID();
         assert instructions.get(instructions.size() - 1) instanceof LIRBranch : "branch must be LIROpBranch";
         assert ((LIRBranch) instructions.get(instructions.size() - 1)).cond() == Condition.TRUE : "block must end with unconditional branch";
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Wed Jun 15 19:54:42 2011 +0200
@@ -252,10 +252,8 @@
                     }
                 }
             }
-            if (!(instr instanceof Merge) && instr != instr.graph().start()) {
+            if (instr != instr.graph().start()) {
                 walkState(instr, stateAfter);
-            }
-            if (instr instanceof Value) {
                 doRoot((Value) instr);
             }
             if (stateAfter != null) {
@@ -268,9 +266,8 @@
                 }
             }
         }
-        if (block.blockSuccessors().size() >= 1 && (block.getInstructions().size() == 0  || !jumpsToNextBlock(block.getInstructions().get(block.getInstructions().size() - 1)))) {
-            moveToPhi();
-            block.lir().jump(block.blockSuccessors().get(0));
+        if (block.blockSuccessors().size() >= 1 && !jumpsToNextBlock(block.lastInstruction())) {
+            block.lir().jump(getLIRBlock((FixedNode) block.lastInstruction().successors().get(0)));
         }
 
         if (GraalOptions.TraceLIRGeneratorLevel >= 1) {
@@ -282,8 +279,13 @@
         blockDoEpilog();
     }
 
+    @Override
+    public void visitMerge(Merge x) {
+        // Nothing to do.
+    }
+
     private static boolean jumpsToNextBlock(Node node) {
-        return node instanceof BlockEnd || node instanceof Anchor;
+        return node instanceof BlockEnd || node instanceof EndNode || node instanceof LoopEnd;
     }
 
     @Override
@@ -463,12 +465,6 @@
     @Override
     public void visitAnchor(Anchor x) {
         setNoResult(x);
-
-        // emit phi-instruction moves after safepoint since this simplifies
-        // describing the state at the safepoint.
-
-        moveToPhi();
-        lir.jump(getLIRBlock(x.next()));
     }
 
     @Override
@@ -476,7 +472,9 @@
         emitCompare(x.compare());
         emitBranch(x.compare(), getLIRBlock(x.trueSuccessor()), getLIRBlock(x.falseSuccessor()));
         assert x.defaultSuccessor() == x.falseSuccessor() : "wrong destination above";
-        lir.jump(getLIRBlock(x.defaultSuccessor()));
+        LIRBlock block = getLIRBlock(x.defaultSuccessor());
+        assert block != null : x;
+        lir.jump(block);
     }
 
     public void emitBranch(Compare compare, LIRBlock trueSuccessor, LIRBlock falseSucc) {
@@ -705,7 +703,7 @@
         }
     }
 
-    protected LIRBlock getLIRBlock(Instruction b) {
+    protected LIRBlock getLIRBlock(FixedNode b) {
         if (b == null) {
             return null;
         }
@@ -1423,68 +1421,60 @@
         return null;
     }
 
-    protected void moveToPhi() {
-        // Moves all stack values into their phi position
-        LIRBlock bb = currentBlock;
-        if (bb.numberOfSux() == 1) {
-            LIRBlock sux = bb.suxAt(0);
-            assert sux.numberOfPreds() > 0 : "invalid CFG";
-
-            // a block with only one predecessor never has phi functions
-            if (sux.numberOfPreds() > 1) {
+    @Override
+    public void visitEndNode(EndNode end) {
+        setNoResult(end);
+        Merge merge = end.merge();
+        moveToPhi(merge, merge.endIndex(end));
+        lir.jump(getLIRBlock(end.merge()));
+    }
 
 
-                List<Phi> phis = getPhis(sux);
-
-                if (phis != null) {
-
-                    int predIndex = 0;
-                    for (; predIndex < sux.numberOfPreds(); ++predIndex) {
-                        if (sux.predAt(predIndex) == bb) {
-                            break;
-                        }
-                    }
-                    assert predIndex < sux.numberOfPreds();
+    @Override
+    public void visitLoopEnd(LoopEnd x) {
+        setNoResult(x);
+        moveToPhi(x.loopBegin(), x.loopBegin().endCount());
+        lir.jump(getLIRBlock(x.loopBegin()));
+    }
 
-                    PhiResolver resolver = new PhiResolver(this);
-                    for (Phi phi : phis) {
-                        if (!phi.isDead()) {
-                            Value curVal = phi.valueAt(predIndex);
-                            if (curVal != null && curVal != phi) {
-                                if (curVal instanceof Phi) {
-                                    operandForPhi((Phi) curVal);
-                                }
-                                CiValue operand = curVal.operand();
-                                if (operand.isIllegal()) {
-                                    assert curVal instanceof Constant || curVal instanceof Local : "these can be produced lazily" + curVal + "/" + phi;
-                                    operand = operandForInstruction(curVal);
-                                }
-                                resolver.move(operand, operandForPhi(phi));
-                            }
+    private void moveToPhi(Merge merge, int nextSuccIndex) {
+        PhiResolver resolver = new PhiResolver(this);
+        for (Node n : merge.usages()) {
+            if (n instanceof Phi) {
+                Phi phi = (Phi) n;
+                if (!phi.isDead()) {
+                    Value curVal = phi.valueAt(nextSuccIndex);
+                    if (curVal != null && curVal != phi) {
+                        if (curVal instanceof Phi) {
+                            operandForPhi((Phi) curVal);
                         }
+                        CiValue operand = curVal.operand();
+                        if (operand.isIllegal()) {
+                            assert curVal instanceof Constant || curVal instanceof Local : "these can be produced lazily" + curVal + "/" + phi;
+                            operand = operandForInstruction(curVal);
+                        }
+                        resolver.move(operand, operandForPhi(phi));
                     }
-                    resolver.dispose();
-
-                    //TODO (gd) remove that later
-                    Node suxFirstInstr = sux.firstInstruction();
-                    if (suxFirstInstr instanceof LoopBegin) {
-                        for (Node n : suxFirstInstr.usages()) {
-                            if (n instanceof LoopCounter) {
-                                LoopCounter counter = (LoopCounter) n;
-                                if (counter.operand().isIllegal()) {
-                                    createResultVariable(counter);
-                                }
-                                if (predIndex == 0) {
-                                    lir.move(operandForInstruction(counter.init()), counter.operand());
-                                } else {
-                                    if (counter.kind == CiKind.Int) {
-                                        this.arithmeticOpInt(IADD, counter.operand(), counter.operand(), operandForInstruction(counter.stride()), CiValue.IllegalValue);
-                                    } else {
-                                        assert counter.kind == CiKind.Long;
-                                        this.arithmeticOpLong(LADD, counter.operand(), counter.operand(), operandForInstruction(counter.stride()));
-                                    }
-                                }
-                            }
+                }
+            }
+        }
+        resolver.dispose();
+        //TODO (gd) remove that later
+        if (merge instanceof LoopBegin) {
+            for (Node usage : merge.usages()) {
+                if (usage instanceof LoopCounter) {
+                    LoopCounter counter = (LoopCounter) usage;
+                    if (counter.operand().isIllegal()) {
+                        createResultVariable(counter);
+                    }
+                    if (nextSuccIndex == 0) { // (gd) nasty
+                        lir.move(operandForInstruction(counter.init()), counter.operand());
+                    } else {
+                        if (counter.kind == CiKind.Int) {
+                            this.arithmeticOpInt(IADD, counter.operand(), counter.operand(), operandForInstruction(counter.stride()), CiValue.IllegalValue);
+                        } else {
+                            assert counter.kind == CiKind.Long;
+                            this.arithmeticOpLong(LADD, counter.operand(), counter.operand(), operandForInstruction(counter.stride()));
                         }
                     }
                 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Wed Jun 15 19:54:42 2011 +0200
@@ -69,8 +69,14 @@
      */
     public void build() {
         new GraphBuilderPhase(compilation, compilation.method, false, false).apply(compilation.graph);
+
         //printGraph("After GraphBuilding", compilation.graph);
-        //new DuplicationPhase().apply(compilation.graph);
+
+        if (GraalOptions.TestGraphDuplication) {
+            new DuplicationPhase().apply(compilation.graph);
+            //printGraph("After Duplication", compilation.graph);
+        }
+
         new DeadCodeEliminationPhase().apply(compilation.graph);
         //printGraph("After DeadCodeElimination", compilation.graph);
 
@@ -88,15 +94,13 @@
         if (GraalOptions.OptCanonicalizer) {
             new CanonicalizerPhase().apply(graph);
             new DeadCodeEliminationPhase().apply(compilation.graph);
-            //printGraph("After Canonicalization", graph);
+            printGraph("After Canonicalization", graph);
         }
 
         new LoopPhase().apply(graph);
 
         new LoweringPhase().apply(graph);
 
-        new SplitCriticalEdgesPhase().apply(graph);
-
         IdentifyBlocksPhase schedule = new IdentifyBlocksPhase(true);
         schedule.apply(graph);
 
@@ -132,7 +136,7 @@
                 valueToBlock.put(i, b);
             }
         }
-        startBlock = lirBlocks.get(0);
+        startBlock = valueToBlock.get(graph.start());
         assert startBlock != null;
         assert startBlock.blockPredecessors().size() == 0;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java	Wed Jun 15 19:54:42 2011 +0200
@@ -51,14 +51,14 @@
     /**
      * The list of instructions that produce input for this instruction.
      */
-    public Instruction blockSuccessor(int index) {
+    public FixedNode blockSuccessor(int index) {
         assert index >= 0 && index < blockSuccessorCount;
-        return (Instruction) successors().get(super.successorCount() + SUCCESSOR_COUNT + index);
+        return (FixedNode) successors().get(super.successorCount() + SUCCESSOR_COUNT + index);
     }
 
-    public Instruction setBlockSuccessor(int index, Instruction n) {
+    public FixedNode setBlockSuccessor(int index, FixedNode n) {
         assert index >= 0 && index < blockSuccessorCount;
-        return (Merge) successors().set(super.successorCount() + SUCCESSOR_COUNT + index, n);
+        return (FixedNode) successors().set(super.successorCount() + SUCCESSOR_COUNT + index, n);
     }
 
     public int blockSuccessorCount() {
@@ -87,19 +87,6 @@
     }
 
     /**
-     * Gets the block begin associated with this block end.
-     * @return the beginning of this basic block
-     */
-    public Merge begin() {
-        for (Node n : predecessors()) {
-            if (n instanceof Merge) {
-                return (Merge) n;
-            }
-        }
-        return null;
-    }
-
-    /**
      * Substitutes a successor block in this block end's successor list. Note that
      * this method updates all occurrences in the list.
      * @param oldSucc the old successor to replace
@@ -121,7 +108,7 @@
      * Gets the successor corresponding to the default (fall through) case.
      * @return the default successor
      */
-    public Instruction defaultSuccessor() {
+    public FixedNode defaultSuccessor() {
         return blockSuccessor(blockSuccessorCount - 1);
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java	Wed Jun 15 19:54:42 2011 +0200
@@ -121,7 +121,7 @@
             case AT: return BE;
             case AE: return BT;
         }
-        throw new IllegalArgumentException();
+        throw new IllegalArgumentException(this.toString());
     }
 
     /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Wed Jun 15 19:54:42 2011 +0200
@@ -0,0 +1,60 @@
+/*
+ * 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 EndNode extends FixedNode {
+    public static final int SUCCESSOR_COUNT = 0;
+    public static final int INPUT_COUNT = 0;
+    public EndNode(Graph graph) {
+        super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitEndNode(this);
+    }
+
+    @Override
+    public void print(LogStream out) {
+        out.print("end");
+    }
+
+    @Override
+    public Node copy(Graph into) {
+        return new EndNode(into);
+    }
+
+    public Merge merge() {
+        if (usages().size() == 0) {
+            return null;
+        } else {
+            assert usages().size() == 1;
+            return (Merge) usages().get(0);
+        }
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionDispatch.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionDispatch.java	Wed Jun 15 19:54:42 2011 +0200
@@ -64,7 +64,7 @@
     /**
      * Constructs a new ExceptionDispatch instruction.
      */
-    public ExceptionDispatch(Value exception, Instruction catchSuccessor, Instruction otherSuccessor, RiType catchType, Graph graph) {
+    public ExceptionDispatch(Value exception, FixedNode catchSuccessor, FixedNode otherSuccessor, RiType catchType, Graph graph) {
         super(CiKind.Int, 2, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setException(exception);
         setBlockSuccessor(0, otherSuccessor);
@@ -80,7 +80,7 @@
      * Gets the block corresponding to the catch block.
      * @return the true successor
      */
-    public Instruction catchSuccessor() {
+    public FixedNode catchSuccessor() {
         return blockSuccessor(1);
     }
 
@@ -88,7 +88,7 @@
      * Gets the block corresponding to the rest of the dispatch chain.
      * @return the false successor
      */
-    public Instruction otherSuccessor() {
+    public FixedNode otherSuccessor() {
         return blockSuccessor(0);
     }
 
@@ -97,7 +97,7 @@
      * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
      * @return the corresponding successor
      */
-    public Instruction successor(boolean istrue) {
+    public FixedNode successor(boolean istrue) {
         return blockSuccessor(istrue ? 1 : 0);
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/If.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/If.java	Wed Jun 15 19:54:42 2011 +0200
@@ -67,7 +67,7 @@
      * Gets the block corresponding to the true successor.
      * @return the true successor
      */
-    public Instruction trueSuccessor() {
+    public FixedNode trueSuccessor() {
         return blockSuccessor(0);
     }
 
@@ -75,7 +75,7 @@
      * Gets the block corresponding to the false successor.
      * @return the false successor
      */
-    public Instruction falseSuccessor() {
+    public FixedNode falseSuccessor() {
         return blockSuccessor(1);
     }
 
@@ -84,7 +84,7 @@
      * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
      * @return the corresponding successor
      */
-    public Instruction successor(boolean istrue) {
+    public FixedNode successor(boolean istrue) {
         return blockSuccessor(istrue ? 0 : 1);
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Instruction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Instruction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -22,8 +22,6 @@
  */
 package com.oracle.max.graal.compiler.ir;
 
-import java.util.*;
-
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.value.*;
 import com.oracle.max.graal.graph.*;
@@ -62,11 +60,11 @@
      * Links to next instruction in a basic block, to {@code null} if this instruction is the end of a basic block or to
      * itself if not in a block.
      */
-    public Instruction next() {
-        return (Instruction) successors().get(super.successorCount() + SUCCESSOR_NEXT);
+    public FixedNode next() {
+        return (FixedNode) successors().get(super.successorCount() + SUCCESSOR_NEXT);
     }
 
-    public Node setNext(Instruction next) {
+    public Node setNext(FixedNode next) {
         return successors().set(super.successorCount() + SUCCESSOR_NEXT, next);
     }
 
@@ -88,28 +86,6 @@
         GraalMetrics.HIRInstructions++;
     }
 
-
-    /**
-     * Gets the list of predecessors of this block.
-     * @return the predecessor list
-     */
-    @SuppressWarnings({ "unchecked", "rawtypes" })
-    public List<Instruction> blockPredecessors() {
-        return (List) Collections.unmodifiableList(predecessors());
-    }
-
-    /**
-     * Get the number of predecessors.
-     * @return the number of predecessors
-     */
-    public int numberOfPreds() {
-        return predecessors().size();
-    }
-
-    public Instruction predAt(int j) {
-        return (Instruction) predecessors().get(j);
-    }
-
     /**
      * Gets the state after the instruction, if it is recorded.
      * @return the state after the instruction
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java	Wed Jun 15 19:54:42 2011 +0200
@@ -26,7 +26,6 @@
 
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
 
@@ -115,7 +114,7 @@
 
     @Override
     public Node copy(Graph into) {
-        Local x = new Local(kind, index, start(), into);
+        Local x = new Local(kind, index, null, into);
         x.setDeclaredType(declaredType());
         return x;
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java	Wed Jun 15 19:54:42 2011 +0200
@@ -78,4 +78,9 @@
         LoopEnd x = new LoopEnd(into);
         return x;
     }
+
+    @Override
+    public String toString() {
+        return "LoopEnd:" + super.toString();
+    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Wed Jun 15 19:54:42 2011 +0200
@@ -73,6 +73,23 @@
         v.visitMerge(this);
     }
 
+    public int endIndex(EndNode end) {
+        assert inputs().variablePart().contains(end);
+        return inputs().variablePart().indexOf(end);
+    }
+
+    public void addEnd(EndNode end) {
+        inputs().variablePart().add(end);
+    }
+
+    public int endCount() {
+        return inputs().variablePart().size();
+    }
+
+    public EndNode endAt(int index) {
+        return (EndNode) inputs().variablePart().get(index);
+    }
+
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
@@ -96,7 +113,6 @@
             }
             hasSucc = true;
         }
-
         return builder.toString();
     }
 
@@ -263,18 +279,17 @@
     @Override
     public Node copy(Graph into) {
         assert getClass() == Merge.class : "copy of " + getClass();
-        Merge x = new Merge(into);
-        return x;
+        return new Merge(into);
     }
 
-    public void removePhiPredecessor(Node pred) {
-        int predIndex = predecessors().lastIndexOf(pred);
+    public void removeEnd(EndNode pred) {
+        int predIndex = inputs().variablePart().indexOf(pred);
         assert predIndex != -1;
+        inputs().variablePart().remove(predIndex);
 
         for (Node usage : usages()) {
             if (usage instanceof Phi) {
                 Phi phi = (Phi) usage;
-//                assert phi.valueCount() == predecessors().size();
                 phi.removeInput(predIndex);
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Wed Jun 15 19:54:42 2011 +0200
@@ -30,23 +30,20 @@
  * The {@code Phi} instruction represents the merging of dataflow
  * in the instruction graph. It refers to a join block and a variable.
  */
-public class Phi extends FloatingNode {
+public final class Phi extends FloatingNode {
 
     private static final int DEFAULT_MAX_VALUES = 2;
 
     private static final int INPUT_COUNT = 1;
     private static final int INPUT_MERGE = 0;
 
-    private final int maxValues;
-
     private static final int SUCCESSOR_COUNT = 0;
 
-    private int usedInputCount;
     private boolean isDead;
 
     @Override
     protected int inputCount() {
-        return super.inputCount() + INPUT_COUNT + maxValues;
+        return super.inputCount() + INPUT_COUNT;
     }
 
     @Override
@@ -61,24 +58,12 @@
         return (Merge) inputs().get(super.inputCount() + INPUT_MERGE);
     }
 
-    public Value setMerge(Value n) {
-        return (Merge) inputs().set(super.inputCount() + INPUT_MERGE, n);
+    public void setMerge(Value n) {
+        inputs().set(super.inputCount() + INPUT_MERGE, n);
     }
 
-    /**
-     * Create a new Phi for the specified join block and local variable (or operand stack) slot.
-     * @param kind the type of the variable
-     * @param merge the join point
-     * @param graph
-     */
     public Phi(CiKind kind, Merge merge, Graph graph) {
-        this(kind, merge, DEFAULT_MAX_VALUES, graph);
-    }
-
-    public Phi(CiKind kind, Merge merge, int maxValues, Graph graph) {
-        super(kind, INPUT_COUNT + maxValues, SUCCESSOR_COUNT, graph);
-        this.maxValues = maxValues;
-        usedInputCount = 0;
+        super(kind, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setMerge(merge);
     }
 
@@ -89,11 +74,11 @@
      * @return the instruction that produced the value in the i'th predecessor
      */
     public Value valueAt(int i) {
-        return (Value) inputs().get(INPUT_COUNT + i);
+        return (Value) inputs().variablePart().get(i);
     }
 
-    public Value setValueAt(int i, Value x) {
-        return (Value) inputs().set(INPUT_COUNT + i, x);
+    public void setValueAt(int i, Value x) {
+        inputs().set(INPUT_COUNT + i, x);
     }
 
     /**
@@ -101,7 +86,7 @@
      * @return the number of inputs in this phi
      */
     public int valueCount() {
-        return usedInputCount;
+        return inputs().variablePart().size();
     }
 
     @Override
@@ -144,36 +129,17 @@
         return "Phi: (" + str + ")";
     }
 
-    public Phi addInput(Value y) {
-        assert !this.isDeleted() && !y.isDeleted();
-        Phi phi = this;
-        if (usedInputCount == maxValues) {
-            phi = new Phi(kind, merge(), maxValues * 2, graph());
-            for (int i = 0; i < valueCount(); ++i) {
-                phi.addInput(valueAt(i));
-            }
-            phi.addInput(y);
-            this.replace(phi);
-        } else {
-            setValueAt(usedInputCount++, y);
-        }
-        return phi;
+    public void addInput(Node y) {
+        inputs().variablePart().add(y);
     }
 
     public void removeInput(int index) {
-        assert index < valueCount() : "index: " + index + ", valueCount: " + valueCount() + "@phi " + id();
-        setValueAt(index, null);
-        for (int i = index + 1; i < valueCount(); ++i) {
-            setValueAt(i - 1, valueAt(i));
-        }
-        setValueAt(valueCount() - 1, null);
-        usedInputCount--;
+        inputs().variablePart().remove(index);
     }
 
     @Override
     public Node copy(Graph into) {
-        Phi x = new Phi(kind, null, maxValues, into);
-        x.usedInputCount = usedInputCount;
+        Phi x = new Phi(kind, null, into);
         x.isDead = isDead;
         return x;
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Value.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Value.java	Wed Jun 15 19:54:42 2011 +0200
@@ -134,19 +134,6 @@
         return null; // default: unknown declared type
     }
 
-    /**
-     * Apply the specified closure to all the input values of this instruction.
-     * @param closure the closure to apply
-     */
-    public void inputValuesDo(ValueClosure closure) {
-        for (int i = 0; i < inputs().size(); i++) {
-            inputs().set(i, closure.apply((Value) inputs().get(i)));
-        }
-        for (int i = 0; i < successors().size(); i++) {
-            successors().set(i, closure.apply((Value) successors().get(i)));
-        }
-    }
-
     @Override
     public String toString() {
         StringBuilder builder = new StringBuilder();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ValueVisitor.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ValueVisitor.java	Wed Jun 15 19:54:42 2011 +0200
@@ -39,6 +39,7 @@
     public abstract void visitConstant(Constant i);
     public abstract void visitConvert(Convert i);
     public abstract void visitExceptionObject(ExceptionObject i);
+    public abstract void visitEndNode(EndNode i);
     public abstract void visitFrameState(FrameState i);
     public abstract void visitAnchor(Anchor i);
     public abstract void visitIf(If i);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/FrameMap.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/FrameMap.java	Wed Jun 15 19:54:42 2011 +0200
@@ -74,10 +74,6 @@
  * </pre>
  * Note that the size {@link Bytecodes#ALLOCA ALLOCA} blocks and {@code monitor}s in the frame may be greater
  * than the size of a {@linkplain CiTarget#spillSlotSize spill slot}.
- *
- * @author Thomas Wuerthinger
- * @author Ben L. Titzer
- * @author Doug Simon
  */
 public final class FrameMap {
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -43,25 +43,25 @@
         this.brokenLoops = new ArrayList<LoopBegin>();
 
         // remove chained Merges
-        for (Merge merge : graph.getNodes(Merge.class)) {
-            if (merge.predecessors().size() == 1 && merge.usages().size() == 0) {
-                if (merge.successors().get(0) instanceof Merge) {
-                    Node pred = merge.predecessors().get(0);
-                    int predIndex = merge.predecessorsIndex().get(0);
-                    pred.successors().setAndClear(predIndex, merge, 0);
-                    merge.delete();
-                }
-            }
-        }
-        Node startSuccessor = graph.start().successors().get(0);
-        if (startSuccessor instanceof Merge) {
-            Merge startMerge = (Merge) startSuccessor;
-            if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) {
-                int predIndex = startMerge.predecessorsIndex().get(0);
-                graph.start().successors().setAndClear(predIndex, startMerge, 0);
-                startMerge.delete();
-            }
-        }
+//        for (Merge merge : graph.getNodes(Merge.class)) {
+//            if (merge.predecessors().size() == 1 && merge.usages().size() == 0) {
+//                if (merge.successors().get(0) instanceof Merge) {
+//                    Node pred = merge.predecessors().get(0);
+//                    int predIndex = merge.predecessorsIndex().get(0);
+//                    pred.successors().setAndClear(predIndex, merge, 0);
+//                    merge.delete();
+//                }
+//            }
+//        }
+//        Node startSuccessor = graph.start().successors().get(0);
+//        if (startSuccessor instanceof Merge) {
+//            Merge startMerge = (Merge) startSuccessor;
+//            if (startMerge.predecessors().size() == 1 && startMerge.usages().size() == 0) {
+//                int predIndex = startMerge.predecessorsIndex().get(0);
+//                graph.start().successors().setAndClear(predIndex, startMerge, 0);
+//                startMerge.delete();
+//            }
+//        }
 
         flood.add(graph.start());
 
@@ -78,7 +78,6 @@
 
         new PhiSimplifier(graph);
 
-
         if (GraalOptions.TraceDeadCodeElimination) {
             System.out.printf("dead code elimination finished\n");
         }
@@ -90,27 +89,28 @@
 
     private void iterateSuccessors() {
         for (Node current : flood) {
-            for (Node successor : current.successors()) {
-                flood.add(successor);
+            if (current instanceof EndNode) {
+                EndNode end = (EndNode) current;
+                flood.add(end.merge());
+            } else {
+                for (Node successor : current.successors()) {
+                    flood.add(successor);
+                }
             }
         }
     }
 
     private void disconnectCFGNodes() {
         for (Node node : graph.getNodes()) {
+            if (node != Node.Null && !flood.isMarked(node) && node instanceof EndNode) {
+                EndNode end = (EndNode) node;
+                Merge merge = end.merge();
+                merge.removeEnd(end);
+            }
+        }
+
+        for (Node node : graph.getNodes()) {
             if (node != Node.Null && !flood.isMarked(node) && isCFG(node)) {
-                if (node instanceof LoopEnd) {
-                    brokenLoops.add(((LoopEnd) node).loopBegin());
-                }
-                // iterate backwards so that the predecessor indexes in removePhiPredecessor are correct
-                for (int i = node.successors().size() - 1; i >= 0; i--) {
-                    Node successor = node.successors().get(i);
-                    if (successor != Node.Null && flood.isMarked(successor)) {
-                        if (successor instanceof Merge) {
-                            ((Merge) successor).removePhiPredecessor(node);
-                        }
-                    }
-                }
                 node.successors().clearAll();
                 node.inputs().clearAll();
             }
@@ -125,10 +125,11 @@
                 usage.replace(((Phi) usage).valueAt(0));
             }
 
-            Node pred = loop.predecessors().get(0);
-            int predIndex = loop.predecessorsIndex().get(0);
-            pred.successors().setAndClear(predIndex, loop, 0);
-            loop.delete();
+//            Node pred = loop.predecessors().get(0);
+//            int predIndex = loop.predecessorsIndex().get(0);
+//            pred.successors().setAndClear(predIndex, loop, 0);
+//            loop.delete();
+            loop.replace(loop.next());
         }
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -162,7 +162,7 @@
         // 1. create the start block
         Block startBlock = nextBlock(Instruction.SYNCHRONIZATION_ENTRY_BCI);
         markOnWorkList(startBlock);
-        lastInstr = createTarget(startBlock, frameState);
+        lastInstr = (Instruction) createTarget(startBlock, frameState);
         graph.start().setStart(lastInstr);
 
         if (isSynchronized(method.accessFlags())) {
@@ -193,11 +193,7 @@
         for (Node n : graph.getNodes()) {
             if (n instanceof Placeholder) {
                 Placeholder p = (Placeholder) n;
-                assert p.blockPredecessors().size() == 1;
-                Node pred = p.blockPredecessors().get(0);
-                int predIndex = p.predecessorsIndex().get(0);
-                pred.successors().setAndClear(predIndex, p, 0);
-                p.delete();
+                p.replace(p.next());
             }
         }
 
@@ -264,8 +260,7 @@
 
     private void finishStartBlock(Block startBlock) {
         assert bci() == 0;
-        Instruction target = createTargetAt(0, frameState);
-        appendGoto(target);
+        appendGoto(createTargetAt(0, frameState));
     }
 
     public void mergeOrClone(Block target, FrameStateAccess newState) {
@@ -305,9 +300,16 @@
                 assert !target.isLoopHeader;
                 Merge merge = new Merge(graph);
 
+
+
                 Placeholder p = (Placeholder) first;
+                assert p.predecessors().size() == 1;
                 assert p.next() == null;
-                p.replace(merge);
+
+                EndNode end = new EndNode(graph);
+                p.replace(end);
+                merge.addEnd(end);
+                //end.setNext(merge);
                 target.firstInstruction = merge;
                 merge.setStateBefore(existingState);
                 first = merge;
@@ -423,8 +425,7 @@
             }
             FrameState stateWithException = entryState.duplicateModified(bci, CiKind.Void, currentExceptionObject);
 
-            Instruction successor = createTarget(dispatchBlock, stateWithException);
-            currentNext.setNext(successor);
+            currentNext.setNext(createTarget(dispatchBlock, stateWithException));
             return entry;
         }
         return null;
@@ -657,14 +658,14 @@
         If ifNode = new If(new Compare(x, cond, y, graph), graph);
         append(ifNode);
         BlockMap.BranchOverride override = branchOverride.get(bci());
-        Instruction tsucc;
+        FixedNode tsucc;
         if (override == null || override.taken == false) {
             tsucc = createTargetAt(stream().readBranchDest(), frameState);
         } else {
             tsucc = createTarget(override.block, frameState);
         }
         ifNode.setBlockSuccessor(0, tsucc);
-        Instruction fsucc;
+        FixedNode fsucc;
         if (override == null || override.taken == true) {
             fsucc = createTargetAt(stream().nextBCI(), frameState);
         } else {
@@ -1110,11 +1111,11 @@
         return x;
     }
 
-    private Instruction createTargetAt(int bci, FrameStateAccess stateAfter) {
+    private FixedNode createTargetAt(int bci, FrameStateAccess stateAfter) {
         return createTarget(blockFromBci[bci], stateAfter);
     }
 
-    private Instruction createTarget(Block block, FrameStateAccess stateAfter) {
+    private FixedNode createTarget(Block block, FrameStateAccess stateAfter) {
         assert block != null && stateAfter != null;
         assert block.isLoopHeader || block.firstInstruction == null || block.firstInstruction.next() == null :
             "non-loop block must be iterated after all its predecessors. startBci=" + block.startBci + ", " + block.getClass().getSimpleName() + ", " + block.firstInstruction.next();
@@ -1125,8 +1126,6 @@
 
         if (block.firstInstruction == null) {
             if (block.isLoopHeader) {
-//                block.firstInstruction = new Merge(block.startBci, graph);
-
                 LoopBegin loopBegin = new LoopBegin(graph);
                 LoopEnd loopEnd = new LoopEnd(graph);
                 loopEnd.setLoopBegin(loopBegin);
@@ -1138,11 +1137,22 @@
         mergeOrClone(block, stateAfter);
         addToWorkList(block);
 
+        FixedNode result = null;
         if (block.firstInstruction instanceof LoopBegin && isVisited(block)) {
-            return ((LoopBegin) block.firstInstruction).loopEnd();
+            result = ((LoopBegin) block.firstInstruction).loopEnd();
         } else {
-            return block.firstInstruction;
+            result = block.firstInstruction;
         }
+
+        assert result instanceof Merge || result instanceof Placeholder : result;
+
+        if (result instanceof Merge) {
+            EndNode end = new EndNode(graph);
+            //end.setNext(result);
+            ((Merge) result).addEnd(end);
+            result = end;
+        }
+        return result;
     }
 
     private Value synchronizedObject(FrameStateAccess state, RiMethod target) {
@@ -1201,7 +1211,8 @@
                 } else {
                     end.delete();
                     Merge merge = new Merge(graph);
-                    merge.successors().setAndClear(merge.nextIndex(), begin, begin.nextIndex());
+                    merge.setNext(begin.next());
+                    begin.setNext(null);
                     begin.replace(merge);
                 }
             }
@@ -1245,20 +1256,20 @@
 
             Block nextBlock = block.next == null ? unwindBlock() : block.next;
             if (block.handler.catchType().isResolved()) {
-                Instruction catchSuccessor = createTarget(blockFromBci[block.handler.handlerBCI()], frameState);
-                Instruction nextDispatch = createTarget(nextBlock, frameState);
+                FixedNode catchSuccessor = createTarget(blockFromBci[block.handler.handlerBCI()], frameState);
+                FixedNode nextDispatch = createTarget(nextBlock, frameState);
                 append(new ExceptionDispatch(frameState.stackAt(0), catchSuccessor, nextDispatch, block.handler.catchType(), graph));
             } else {
                 Deoptimize deopt = new Deoptimize(DeoptAction.InvalidateRecompile, graph);
                 deopt.setMessage("unresolved " + block.handler.catchType().name());
                 append(deopt);
-                Instruction nextDispatch = createTarget(nextBlock, frameState);
+                FixedNode nextDispatch = createTarget(nextBlock, frameState);
                 appendGoto(nextDispatch);
             }
         }
     }
 
-    private void appendGoto(Instruction target) {
+    private void appendGoto(FixedNode target) {
         lastInstr.setNext(target);
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -236,6 +236,7 @@
             System.out.println("inlining " + name + ": " + frameStates.size() + " frame states, " + nodes.size() + " nodes");
         }
 
+        assert invoke.successors().get(0) != null : invoke;
         assert invoke.predecessors().size() == 1 : "size: " + invoke.predecessors().size();
         Instruction pred;
         if (withReceiver) {
@@ -243,7 +244,7 @@
             clipNode.setNode(new IsNonNull(parameters[0], compilation.graph));
             pred = clipNode;
         } else {
-            pred = new Merge(compilation.graph);
+            pred = new Placeholder(compilation.graph);//(Instruction) invoke.predecessors().get(0);//new Merge(compilation.graph);
         }
         invoke.predecessors().get(0).successors().replace(invoke, pred);
         replacements.put(startNode, pred);
@@ -261,6 +262,10 @@
             }
         }
 
+        if (pred instanceof Placeholder) {
+            pred.replace(((Placeholder)pred).next());
+        }
+
         if (returnNode != null) {
             List<Node> usages = new ArrayList<Node>(invoke.usages());
             for (Node usage : usages) {
@@ -272,18 +277,8 @@
             }
             Node returnDuplicate = duplicates.get(returnNode);
             returnDuplicate.inputs().clearAll();
-
-            Merge mergeAfter = new Merge(compilation.graph);
-
-            assert returnDuplicate.predecessors().size() == 1;
-            Node returnPred = returnDuplicate.predecessors().get(0);
-            int index = returnDuplicate.predecessorsIndex().get(0);
-            mergeAfter.successors().setAndClear(0, invoke, 0);
-            returnPred.successors().set(index, mergeAfter);
-
-            returnDuplicate.delete();
-
-            mergeAfter.setStateBefore(stateAfter);
+            returnDuplicate.replace(invoke.next());
+            invoke.setNext(null);
         }
 
         if (exceptionEdge != null) {
@@ -298,14 +293,7 @@
                     usage.inputs().replace(obj, unwindDuplicate.exception());
                 }
                 unwindDuplicate.inputs().clearAll();
-
-                assert unwindDuplicate.predecessors().size() == 1;
-                Node unwindPred = unwindDuplicate.predecessors().get(0);
-                int index = unwindDuplicate.predecessorsIndex().get(0);
-                unwindPred.successors().setAndClear(index, obj, 0);
-
-                obj.inputs().clearAll();
-                unwindDuplicate.delete();
+                unwindDuplicate.replace(obj.next());
             }
         }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -61,7 +61,7 @@
                     acounters[j] = null;
                     IntegerSub sub = new IntegerSub(c1.kind, c2.init(), c1.init(), graph);
                     IntegerAdd add = new IntegerAdd(c1.kind, c1, sub, graph);
-                    Phi phi = new Phi(c1.kind, loopBegin, 2, graph); // TODO (gd) assumes order on loppBegin preds
+                    Phi phi = new Phi(c1.kind, loopBegin, graph); // TODO (gd) assumes order on loppBegin preds
                     phi.addInput(c2.init());
                     phi.addInput(add);
                     c2.replace(phi);
@@ -141,6 +141,12 @@
             for (Node pred : n.predecessors()) {
                 workCFG.add(pred);
             }
+            if (n instanceof Merge) {
+                Merge merge = (Merge) n;
+                for (int i = 0; i < merge.endCount(); i++) {
+                    workCFG.add(merge.endAt(i));
+                }
+            }
         }
         for (Node n : workData) {
             loopNodes.mark(n);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -24,6 +24,7 @@
 
 import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.schedule.*;
+import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.graph.*;
 
 public class LoweringPhase extends Phase {
@@ -33,21 +34,22 @@
         s.apply(graph);
 
         for (Block b : s.getBlocks()) {
-            final Node firstNode = b.firstNode();
+            //final Node firstNode = b.firstNode();
 
             final LoweringTool loweringTool = new LoweringTool() {
                 @Override
                 public Node createStructuredBlockAnchor() {
-                    if (!(firstNode instanceof Anchor) && !(firstNode instanceof Merge)) {
-                        Anchor a = new Anchor(graph);
-                        assert firstNode.predecessors().size() == 1;
-                        Node pred = firstNode.predecessors().get(0);
-                        int predIndex = firstNode.predecessorsIndex().get(0);
-                        a.successors().setAndClear(Instruction.SUCCESSOR_NEXT, pred, predIndex);
-                        pred.successors().set(predIndex, a);
-                        return a;
-                    }
-                    return firstNode;
+                    throw Util.unimplemented();
+//                    if (!(firstNode instanceof Anchor) && !(firstNode instanceof Merge)) {
+//                        Anchor a = new Anchor(graph);
+//                        assert firstNode.predecessors().size() == 1;
+//                        Node pred = firstNode.predecessors().get(0);
+//                        int predIndex = firstNode.predecessorsIndex().get(0);
+//                        a.successors().setAndClear(Instruction.SUCCESSOR_NEXT, pred, predIndex);
+//                        pred.successors().set(predIndex, a);
+//                        return a;
+//                    }
+//                    return firstNode;
                 }
             };
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/SplitCriticalEdgesPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,51 +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.phases;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.schedule.*;
-import com.oracle.max.graal.graph.*;
-
-
-public class SplitCriticalEdgesPhase extends Phase {
-
-    @Override
-    protected void run(Graph graph) {
-        List<Node> nodes = graph.getNodes();
-        for (int i = 0; i < nodes.size(); ++i) {
-            Node n = nodes.get(i);
-            if (IdentifyBlocksPhase.trueSuccessorCount(n) > 1) {
-                for (int j = 0; j < n.successors().size(); ++j) {
-                    Node succ = n.successors().get(j);
-                    if (IdentifyBlocksPhase.truePredecessorCount(succ) > 1) {
-                        Anchor a = new Anchor(graph);
-                        a.successors().setAndClear(Instruction.SUCCESSOR_NEXT, n, j);
-                        n.successors().set(j, a);
-                    }
-                }
-            }
-        }
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Wed Jun 15 19:54:42 2011 +0200
@@ -78,6 +78,13 @@
     private Block assignBlock(Node n, Block b) {
         assert nodeToBlock.get(n) == null;
         nodeToBlock.set(n, b);
+        for (Node input : n.inputs()) {
+            if (input instanceof FrameState) {
+                assert nodeToBlock.get(n) == null;
+                nodeToBlock.set(n, b);
+            }
+        }
+
         if (b.firstNode() == null) {
             b.setFirstNode(n);
             b.setLastNode(n);
@@ -91,6 +98,26 @@
         return b;
     }
 
+    private Block assignBlockNew(Node n, Block b) {
+        if (b == null) {
+            b = createBlock();
+        }
+
+        assert nodeToBlock.get(n) == null;
+        nodeToBlock.set(n, b);
+        if (b.lastNode() == null) {
+            b.setFirstNode(n);
+            b.setLastNode(n);
+        } else {
+            if (b.firstNode() != b.lastNode()) {
+                b.getInstructions().add(0, b.firstNode());
+            }
+            b.setFirstNode(n);
+        }
+
+        return b;
+    }
+
     public static boolean isFixed(Node n) {
         return n != null && ((n instanceof FixedNode) || n == n.graph().start());
     }
@@ -100,69 +127,51 @@
     }
 
     private void identifyBlocks() {
+
         // Identify blocks.
-        final ArrayList<Node> blockBeginNodes = new ArrayList<Node>();
-        NodeIterator.iterate(EdgeType.SUCCESSORS, graph.start(), null, new NodeVisitor() {
-            @Override
-            public boolean visit(Node n) {
-                if (!isFixed(n)) {
-                    return false;
-                }
-
-                if (n instanceof LoopBegin) {
-                    // a LoopBegin is always a merge
-                    assignBlock(n);
-                    blockBeginNodes.add(n);
-                    return true;
-                }
-
-                Node singlePred = null;
-                for (Node pred : n.predecessors()) {
-                    if (isFixed(pred)) {
-                        if (singlePred == null) {
-                            singlePred = pred;
-                        } else {
-                            // We have more than one predecessor => we are a merge block.
-                            assignBlock(n);
-                            blockBeginNodes.add(n);
-                            return true;
+        for (Node n : graph.getNodes()) {
+            if (n != null) {
+                if (n instanceof EndNode || n instanceof Return || n instanceof Unwind || n instanceof LoopEnd || n instanceof Deoptimize) {
+                    Block block = null;
+                    while (nodeToBlock.get(n) == null) {
+                        if (block != null && IdentifyBlocksPhase.trueSuccessorCount(n) > 1) {
+                            // We are at a split node => start a new block.
+                            block = null;
                         }
+                        block = assignBlockNew(n, block);
+                        if (n.predecessors().size() == 0) {
+                            // Either dead code or at a merge node => stop iteration.
+                            break;
+                        }
+                        assert n.predecessors().size() == 1 : "preds: " + n;
+                        n = n.predecessors().get(0);
                     }
                 }
-
-                if (singlePred == null) {
-                    // We have no predecessor => we are the start block.
-                    assignBlock(n);
-                    blockBeginNodes.add(n);
-                } else {
-                    // We have a single predecessor => check its successor count.
-                    if (isBlockEnd(singlePred)) {
-                        assignBlock(n);
-                        blockBeginNodes.add(n);
-                    } else {
-                        assignBlock(n, nodeToBlock.get(singlePred));
-                    }
-                }
-                return true;
-            }}
-        );
+            }
+        }
 
         // Connect blocks.
-        for (Node n : blockBeginNodes) {
-            Block block = nodeToBlock.get(n);
-            for (Node pred : n.predecessors()) {
-                if (isFixed(pred)) {
-                    Block predBlock = nodeToBlock.get(pred);
-                    predBlock.addSuccessor(block);
-                }
-            }
-
+        for (Block block : blocks) {
+            Node n = block.firstNode();
             if (n instanceof Merge) {
                 for (Node usage : n.usages()) {
                     if (usage instanceof Phi || usage instanceof LoopCounter) {
                         nodeToBlock.set(usage, block);
                     }
                 }
+                Merge m = (Merge) n;
+                for (int i = 0; i < m.endCount(); ++i) {
+                    EndNode end = m.endAt(i);
+                    Block predBlock = nodeToBlock.get(end);
+                    predBlock.addSuccessor(block);
+                }
+            } else {
+                for (Node pred : n.predecessors()) {
+                    if (isFixed(pred)) {
+                        Block predBlock = nodeToBlock.get(pred);
+                        predBlock.addSuccessor(block);
+                    }
+                }
             }
         }
 
@@ -186,8 +195,8 @@
         if (scheduleAllNodes) {
 
             // Add successors of loop end nodes. Makes the graph cyclic.
-            for (Node n : blockBeginNodes) {
-                Block block = nodeToBlock.get(n);
+            for (Block block : blocks) {
+                Node n = block.firstNode();
                 if (n instanceof LoopBegin) {
                     LoopBegin loopBegin = (LoopBegin) n;
                     nodeToBlock.get(loopBegin.loopEnd()).addSuccessor(block);
@@ -295,10 +304,9 @@
                 }
             } else if (usage instanceof FrameState && ((FrameState) usage).block() != null) {
                 Merge merge = ((FrameState) usage).block();
-                for (Node pred : merge.predecessors()) {
-                    if (isFixed(pred)) {
-                        block = getCommonDominator(block, nodeToBlock.get(pred));
-                    }
+                for (int i = 0; i < merge.endCount(); ++i) {
+                    EndNode pred = merge.endAt(i);
+                    block = getCommonDominator(block, nodeToBlock.get(pred));
                 }
             } else if (usage instanceof LoopCounter) {
                 LoopCounter counter = (LoopCounter) usage;
@@ -342,6 +350,8 @@
         assert !map.isMarked(b.firstNode()) && nodeToBlock.get(b.firstNode()) == b;
 
         boolean scheduleFirst = true;
+        assert !instructions.contains(b.lastNode());
+        assert !instructions.contains(b.firstNode());
 
         if (b.firstNode() == b.lastNode()) {
             Node node = b.firstNode();
@@ -356,6 +366,7 @@
             addToSorting(b, i, sortedInstructions, map);
         }
         addToSorting(b, b.lastNode(), sortedInstructions, map);
+        assert sortedInstructions.get(sortedInstructions.size() - 1) == b.lastNode() : "lastNode=" + b.lastNode() + ", firstNode=" + b.firstNode() + ", sorted(sz-1)=" + sortedInstructions.get(sortedInstructions.size() - 1);
         b.setInstructions(sortedInstructions);
     }
 
@@ -364,8 +375,13 @@
             return;
         }
 
+        FrameState state = null;
         for (Node input : i.inputs()) {
-            addToSorting(b, input, sortedInstructions, map);
+//            if (input instanceof FrameState) {
+//               state = (FrameState) input;
+//            } else {
+                addToSorting(b, input, sortedInstructions, map);
+//            }
         }
 
         for (Node pred : i.predecessors()) {
@@ -374,6 +390,10 @@
 
         map.mark(i);
 
+        if (state != null) {
+            addToSorting(b, state, sortedInstructions, map);
+        }
+
         for (Node succ : i.successors()) {
             if (succ instanceof FrameState) {
                 addToSorting(b, succ, sortedInstructions, map);
@@ -465,21 +485,4 @@
         }
         return i;
     }
-
-    public static int truePredecessorCount(Node n) {
-        if (n == null) {
-            return 0;
-        }
-        int i = 0;
-        for (Node s : n.predecessors()) {
-            if (isFixed(s)) {
-                i++;
-            }
-        }
-
-        if (n instanceof LoopBegin) {
-            i++;
-        }
-        return i;
-    }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Wed Jun 15 19:54:42 2011 +0200
@@ -466,11 +466,6 @@
     }
 
     @Override
-    public void visitMerge(Merge x) {
-        // nothing to do for now
-    }
-
-    @Override
     public void visitExceptionDispatch(ExceptionDispatch x) {
         // TODO ls: this needs some more work...
 
@@ -494,13 +489,6 @@
     }
 
     @Override
-    public void visitLoopEnd(LoopEnd x) {
-        setNoResult(x);
-        //moveToPhi();
-        //lir.jump(getLIRBlock(x.loopBegin()));
-    }
-
-    @Override
     public void visitValueAnchor(ValueAnchor valueAnchor) {
         // nothing to do for ValueAnchors
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Wed Jun 15 19:54:42 2011 +0200
@@ -377,28 +377,20 @@
                         phi = setupPhiForStack(block, i - localsSize);
                     }
 
-                    Phi originalPhi = phi;
                     if (phi.valueCount() == 0) {
-                        int size = block.predecessors().size();
+                        int size = block.endCount();
                         for (int j = 0; j < size; ++j) {
-                            phi = phi.addInput(x);
+                            phi.addInput(x);
                         }
-                        phi = phi.addInput((x == y) ? phi : y);
+                        phi.addInput((x == y) ? phi : y);
                     } else {
-                        phi = phi.addInput((x == y) ? phi : y);
-                    }
-                    if (originalPhi != phi) {
-                        for (int j = 0; j < other.localsSize() + other.stackSize(); ++j) {
-                            if (other.valueAt(j) == originalPhi) {
-                                other.setValueAt(j, phi);
-                            }
-                        }
+                        phi.addInput((x == y) ? phi : y);
                     }
 
                     if (block instanceof LoopBegin) {
 //                        assert phi.valueCount() == ((LoopBegin) block).loopEnd().predecessors().size() + 1 : "loop, valueCount=" + phi.valueCount() + " predSize= " + ((LoopBegin) block).loopEnd().predecessors().size();
                     } else {
-                        assert phi.valueCount() == block.predecessors().size() + 1 : "valueCount=" + phi.valueCount() + " predSize= " + block.predecessors().size();
+                        assert phi.valueCount() == block.endCount() + 1 : "valueCount=" + phi.valueCount() + " predSize= " + block.endCount();
                     }
                }
             }
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Graph.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Graph.java	Wed Jun 15 19:54:42 2011 +0200
@@ -171,7 +171,7 @@
                 if (target == null) {
                     target = newNodes.get(input);
                 }
-                node.inputs().set(i, target);
+                node.inputs().setOrExpand(i, target);
             }
         }
         for (Entry<Node, Node> entry : replacements.entrySet()) {
@@ -180,32 +180,31 @@
             for (int i = 0; i < oldNode.inputs().size(); i++) {
                 Node input = oldNode.inputs().get(i);
                 if (newNodes.containsKey(input)) {
-                    node.inputs().set(i, newNodes.get(input));
+                    node.inputs().setOrExpand(i, newNodes.get(input));
                 }
             }
         }
+        
         // re-wire successors
         for (Entry<Node, Node> entry : newNodes.entrySet()) {
             Node oldNode = entry.getKey();
             Node node = entry.getValue();
-            for (int i = 0; i < oldNode.predecessors().size(); i++) {
-                Node pred = oldNode.predecessors().get(i);
-                int predIndex = oldNode.predecessorsIndex().get(i);
-                Node source = replacements.get(pred);
-                if (source == null) {
-                    source = newNodes.get(pred);
+            for (int i = 0; i < oldNode.successors().size(); i++) {
+                Node succ = oldNode.successors().get(i);
+                Node target = replacements.get(succ);
+                if (target == null) {
+                    target = newNodes.get(succ);
                 }
-                source.successors().set(predIndex,  node);
+                node.successors().setOrExpand(i, target);
             }
         }
         for (Entry<Node, Node> entry : replacements.entrySet()) {
             Node oldNode = entry.getKey();
             Node node = entry.getValue();
-            for (int i = 0; i < oldNode.predecessors().size(); i++) {
-                Node pred = oldNode.predecessors().get(i);
-                int predIndex = oldNode.predecessorsIndex().get(i);
-                if (newNodes.containsKey(pred)) {
-                    newNodes.get(pred).successors().set(predIndex, node);
+            for (int i = 0; i < oldNode.successors().size(); i++) {
+                Node succ = oldNode.successors().get(i);
+                if (newNodes.containsKey(succ)) {
+                    node.successors().setOrExpand(i, newNodes.get(succ));
                 }
             }
         }
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/Node.java	Wed Jun 15 19:54:42 2011 +0200
@@ -39,7 +39,6 @@
     final NodeArray successors;
     final ArrayList<Node> usages;
     final ArrayList<Node> predecessors;
-    final ArrayList<Integer> predecessorsIndex;
 
     public Node(int inputCount, int successorCount, Graph graph) {
         assert graph != null : "cannot create a node for a null graph";
@@ -47,19 +46,14 @@
         this.id = graph.register(this);
         this.inputs = new NodeArray(this, inputCount);
         this.successors = new NodeArray(this, successorCount);
-        this.predecessors = new ArrayList<Node>();
-        this.usages = new ArrayList<Node>();
-        this.predecessorsIndex = new ArrayList<Integer>();
+        this.predecessors = new ArrayList<Node>(1);
+        this.usages = new ArrayList<Node>(4);
     }
 
     public List<Node> predecessors() {
         return Collections.unmodifiableList(predecessors);
     }
 
-    public List<Integer> predecessorsIndex() {
-        return Collections.unmodifiableList(predecessorsIndex);
-    }
-
     public List<Node> usages() {
         return Collections.unmodifiableList(usages);
     }
@@ -96,18 +90,19 @@
         }
         int z = 0;
         for (Node predecessor : predecessors) {
-            int predIndex = predecessorsIndex.get(z);
-            predecessor.successors.nodes[predIndex] = other;
+            for (int i=0; i<predecessor.successors.size(); i++) {
+                if (predecessor.successors.get(i) == this) {
+                    predecessor.successors.silentSet(i, other);
+                }
+            }
             ++z;
         }
         if (other != null) {
             other.usages.addAll(usages);
             other.predecessors.addAll(predecessors);
-            other.predecessorsIndex.addAll(predecessorsIndex);
         }
         usages.clear();
         predecessors.clear();
-        predecessorsIndex.clear();
         delete();
         return other;
     }
@@ -125,13 +120,12 @@
         }
         usages.clear();
         predecessors.clear();
-        predecessorsIndex.clear();
     }
 
     public void delete() {
         assert !isDeleted();
-        assert checkDeletion();
-        assert predecessorsIndex.size() == 0;
+        assert checkDeletion() : "Could not delete " + this;
+
         for (int i = 0; i < inputs.size(); ++i) {
             inputs.set(i, Null);
         }
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeArray.java	Wed Jun 15 19:54:42 2011 +0200
@@ -29,11 +29,14 @@
 public class NodeArray extends AbstractList<Node> {
 
     private final Node node;
-    final Node[] nodes;
+    private Node[] nodes;
+    private final int fixedLength;
+    private int variableLength;
 
     public NodeArray(Node node, int length) {
         this.node = node;
         this.nodes = new Node[length];
+        this.fixedLength = length;
     }
 
     @Override
@@ -50,14 +53,84 @@
         nodes[index] = node;
         return result;
     }
+    
+    public AbstractList<Node> variablePart() {
+        return new AbstractList<Node>() {
+
+            @Override
+            public Node get(int index) {
+                checkIndex(index);
+                return NodeArray.this.get(fixedLength + index);
+            }
+
+            @Override
+            public int size() {
+                return variableLength;
+            }
+
+            public Node set(int index, Node element) {
+                checkIndex(index);
+                return NodeArray.this.set(fixedLength + index, element);
+            }
+
+            public void add(int index, Node element) {
+                variableLength++;
+                checkIndex(index);
+                NodeArray.this.ensureSize();
+                for (int i=size() - 1; i > index; i--) {
+                    NodeArray.this.nodes[fixedLength + i] = NodeArray.this.nodes[fixedLength + i-1];
+                }
+                set(index, element);
+            }
+            
+            private void checkIndex(int index) {
+                if (index < 0 || index >= size()) {
+                    throw new IndexOutOfBoundsException();
+                }
+            }
+            
+            @Override
+            public Node remove(int index) {
+                checkIndex(index);
+                Node n = get(index);
+                set(index, Node.Null);
+                for (int i=index; i < size() - 1; i++) {
+                    NodeArray.this.nodes[fixedLength + i] = NodeArray.this.nodes[fixedLength + i + 1];
+                }
+                NodeArray.this.nodes[fixedLength + size() - 1] = Node.Null;
+                variableLength--;
+                assert variableLength >= 0;
+                return n;
+            }
+        };
+    }
+
+    private void ensureSize() {
+        if (size() > nodes.length) {
+            nodes = Arrays.copyOf(nodes, (nodes.length + 1)*2);
+        }
+    }
+    
+    public void setOrExpand(int index, Node node) {
+        if (index < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        
+        while (index >= size()) {
+            variablePart().add(Node.Null);
+        }
+        
+        set(index, node);
+    }
 
     @Override
     public Node set(int index, Node node) {
         assert !self().isDeleted() : "trying to set input/successor of deleted node: " + self().shortName();
         assert node == Node.Null || node.graph == self().graph : "node is from different graph: (this=" + self() + ") and (node=" + node + ")";
         assert node == Node.Null || node.id() != Node.DeletedID : "inserted node must not be deleted";
-        Node old = nodes[index];
-
+        assert node != self() || node.getClass().toString().contains("Phi") : "No direct circles allowed in the graph! " + node;
+        
+        Node old = get(index);
         if (old != node) {
             silentSet(index, node);
             if (self().inputs == this) {
@@ -72,15 +145,14 @@
                 if (old != null) {
                     for (int i = 0; i < old.predecessors.size(); ++i) {
                         Node cur = old.predecessors.get(i);
-                        if (cur == self() && old.predecessorsIndex.get(i) == index) {
+                        if (cur == self()) {
                             old.predecessors.remove(i);
-                            old.predecessorsIndex.remove(i);
+                            break;
                         }
                     }
                 }
                 if (node != null) {
                     node.predecessors.add(self());
-                    node.predecessorsIndex.add(index);
                 }
             }
         }
@@ -94,19 +166,26 @@
             set(i, other.get(i));
         }
     }
+    
+    private void checkIndex(int index) {
+        if (index < 0 || index >= size()) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
 
     @Override
     public Node get(int index) {
+        checkIndex(index);
         return nodes[index];
     }
 
     @Override
     public Node[] toArray() {
-        return Arrays.copyOf(nodes, nodes.length);
+        return Arrays.copyOf(nodes, size());
     }
 
     boolean replaceFirstOccurrence(Node toReplace, Node replacement) {
-        for (int i = 0; i < nodes.length; i++) {
+        for (int i = 0; i < size(); i++) {
             if (nodes[i] == toReplace) {
                 nodes[i] = replacement;
                 return true;
@@ -121,7 +200,7 @@
 
     public int replace(Node toReplace, Node replacement) {
         int result = 0;
-        for (int i = 0; i < nodes.length; i++) {
+        for (int i = 0; i < size(); i++) {
             if (nodes[i] == toReplace) {
                 set(i, replacement);
                 result++;
@@ -136,7 +215,7 @@
 
     int silentReplace(Node toReplace, Node replacement) {
         int result = 0;
-        for (int i = 0; i < nodes.length; i++) {
+        for (int i = 0; i < size(); i++) {
             if (nodes[i] == toReplace) {
                 silentSet(i, replacement);
                 result++;
@@ -145,32 +224,13 @@
         return result;
     }
 
-    public void setAndClear(int index, Node clearedNode, int clearedIndex) {
-        assert !self().isDeleted() : "trying to setAndClear successor of deleted node: " + self().shortName();
-        assert self().successors == this;
-        Node value = clearedNode.successors.get(clearedIndex);
-        assert value != Node.Null;
-        clearedNode.successors.nodes[clearedIndex] = Node.Null;
-        set(index, Node.Null);
-        nodes[index] = value;
-
-        for (int i = 0; i < value.predecessors.size(); ++i) {
-            if (value.predecessors.get(i) == clearedNode && value.predecessorsIndex.get(i) == clearedIndex) {
-                value.predecessors.set(i, self());
-                value.predecessorsIndex.set(i, index);
-                return;
-            }
-        }
-        assert false;
-    }
-
     @Override
     public int size() {
-        return nodes.length;
+        return fixedLength + variableLength;
     }
 
     public void clearAll() {
-        for (int i = 0; i < nodes.length; i++) {
+        for (int i = 0; i < size(); i++) {
             set(i, Node.Null);
         }
     }
--- a/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.graph/src/com/oracle/max/graal/graph/NodeBitMap.java	Wed Jun 15 19:54:42 2011 +0200
@@ -77,6 +77,7 @@
     private void check(Node node) {
         assert node.graph == graph : "this node is not part of the graph";
         assert !isNew(node) : "this node (" + node.id() + ") was added to the graph after creating the node bitmap (" + bitMap.length() + ")";
+        assert !node.isDeleted() : "node " + node + " is deleted!";
     }
 
     @Override
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/Compiler.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/Compiler.java	Wed Jun 15 19:54:42 2011 +0200
@@ -23,11 +23,13 @@
 package com.oracle.max.graal.runtime;
 
 import com.oracle.max.graal.compiler.*;
+import com.sun.cri.ri.*;
 
 public interface Compiler {
 
     VMEntries getVMEntries();
     VMExits getVMExits();
     GraalCompiler getCompiler();
+    RiType lookupType(String returnType, HotSpotTypeResolved accessingClass);
 
 }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/CompilerImpl.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/CompilerImpl.java	Wed Jun 15 19:54:42 2011 +0200
@@ -155,4 +155,42 @@
         return vmExits;
     }
 
+    @Override
+    public RiType lookupType(String returnType, HotSpotTypeResolved accessingClass) {
+        if (returnType.length() == 1 && vmExits instanceof VMExitsNative) {
+            VMExitsNative exitsNative = (VMExitsNative) vmExits;
+            CiKind kind = CiKind.fromPrimitiveOrVoidTypeChar(returnType.charAt(0));
+            switch(kind) {
+                case Boolean:
+                    return exitsNative.typeBoolean;
+                case Byte:
+                    return exitsNative.typeByte;
+                case Char:
+                    return exitsNative.typeChar;
+                case Double:
+                    return exitsNative.typeDouble;
+                case Float:
+                    return exitsNative.typeFloat;
+                case Illegal:
+                    break;
+                case Int:
+                    return exitsNative.typeInt;
+                case Jsr:
+                    break;
+                case Long:
+                    return exitsNative.typeLong;
+                case Object:
+                    break;
+                case Short:
+                    return exitsNative.typeShort;
+                case Void:
+                    return exitsNative.typeVoid;
+                case Word:
+                    break;
+
+            }
+        }
+        return vmEntries.RiSignature_lookupType(returnType, accessingClass);
+    }
+
 }
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotSignature.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotSignature.java	Wed Jun 15 19:54:42 2011 +0200
@@ -117,7 +117,7 @@
         }
         RiType type = argumentTypes[index];
         if (type == null) {
-            type = compiler.getVMEntries().RiSignature_lookupType(arguments.get(index), (HotSpotTypeResolved) accessingClass);
+            type = compiler.lookupType(arguments.get(index), (HotSpotTypeResolved) accessingClass);
             argumentTypes[index] = type;
         }
         return type;
@@ -136,7 +136,7 @@
     @Override
     public RiType returnType(RiType accessingClass) {
         if (returnTypeCache == null) {
-            returnTypeCache = compiler.getVMEntries().RiSignature_lookupType(returnType, (HotSpotTypeResolved) accessingClass);
+            returnTypeCache = compiler.lookupType(returnType, (HotSpotTypeResolved) accessingClass);
         }
         return returnTypeCache;
     }
--- a/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java	Wed Jun 15 19:54:42 2011 +0200
@@ -44,7 +44,7 @@
     private static Method createDefaultMethod;
     private static Method getDOMImplementationMethod;
     private static Method setEmbeddedFontsOnMethod;
-    private static Class classSVGGraphics2D;
+    private static Class<?> classSVGGraphics2D;
 
     /**
      * Creates a graphics object that allows to be exported to SVG data using the {@link #printToStream(Graphics2D, Writer, boolean) printToStream} method.
@@ -54,8 +54,8 @@
         try {
             if (SVGGraphics2DConstructor == null) {
                 ClassLoader cl = BatikSVG.class.getClassLoader();
-                Class classGenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation");
-                Class classSVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext");
+                Class<?> classGenericDOMImplementation = cl.loadClass("org.apache.batik.dom.GenericDOMImplementation");
+                Class<?> classSVGGeneratorContext = cl.loadClass("org.apache.batik.svggen.SVGGeneratorContext");
                 classSVGGraphics2D = cl.loadClass("org.apache.batik.svggen.SVGGraphics2D");
                 getDOMImplementationMethod = classGenericDOMImplementation.getDeclaredMethod("getDOMImplementation", new Class[0]);
                 createDefaultMethod = classSVGGeneratorContext.getDeclaredMethod("createDefault", new Class[]{org.w3c.dom.Document.class});
--- a/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java	Wed Jun 15 19:54:42 2011 +0200
@@ -29,7 +29,6 @@
 import com.sun.hotspot.igv.data.Properties;
 import com.sun.hotspot.igv.data.Properties.StringPropertyMatcher;
 import java.awt.Image;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
@@ -37,7 +36,7 @@
 import org.openide.nodes.AbstractNode;
 import org.openide.nodes.Children;
 import org.openide.nodes.Node;
-import org.openide.util.Utilities;
+import org.openide.util.ImageUtilities;
 
 /**
  *
@@ -70,9 +69,9 @@
     @Override
     public Image getIcon(int i) {
         if (nodes != null) {
-            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif");
+            return ImageUtilities.loadImage("com/sun/hotspot/igv/bytecodes/images/link.gif");
         } else {
-            return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif");
+            return ImageUtilities.loadImage("com/sun/hotspot/igv/bytecodes/images/bytecode.gif");
         }
     }
 
@@ -92,6 +91,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public <T extends Node.Cookie> T getCookie(Class<T> aClass) {
         if (aClass == SelectBytecodesCookie.class && nodes != null) {
             return (T) (new SelectBytecodesCookie(nodes));
--- a/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java	Wed Jun 15 19:54:42 2011 +0200
@@ -128,7 +128,7 @@
 
     @Override
     public void componentOpened() {
-        Lookup.Template tpl = new Lookup.Template(InputGraphProvider.class);
+        Lookup.Template<InputGraphProvider> tpl = new Lookup.Template<InputGraphProvider>(InputGraphProvider.class);
         result = Utilities.actionsGlobalContext().lookup(tpl);
         result.addLookupListener(this);
     }
--- a/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java	Wed Jun 15 19:54:42 2011 +0200
@@ -30,7 +30,7 @@
 import org.openide.nodes.AbstractNode;
 import org.openide.nodes.Children;
 import org.openide.nodes.Node;
-import org.openide.util.Utilities;
+import org.openide.util.ImageUtilities;
 
 /**
  *
@@ -38,7 +38,7 @@
  */
 public class MethodNode extends AbstractNode {
 
-    private static class MethodNodeChildren extends Children.Keys {
+    private static class MethodNodeChildren extends Children.Keys<InputBytecode> {
 
         private InputMethod method;
         private InputGraph graph;
@@ -50,9 +50,7 @@
             this.graph = graph;
         }
 
-        protected Node[] createNodes(Object object) {
-            assert object instanceof InputBytecode;
-            InputBytecode bc = (InputBytecode) object;
+        protected Node[] createNodes(InputBytecode bc) {
             if (bc.getInlined() == null) {
                 return new Node[]{new BytecodeNode(bc, graph, bciString)};
             } else {
@@ -84,7 +82,7 @@
 
     @Override
     public Image getIcon(int i) {
-        return Utilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif");
+        return ImageUtilities.loadImage("com/sun/hotspot/igv/bytecodes/images/method.gif");
     }
 
     @Override
--- a/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java	Wed Jun 15 19:54:42 2011 +0200
@@ -24,7 +24,6 @@
 package com.sun.hotspot.igv.controlflow;
 
 import com.sun.hotspot.igv.data.InputBlock;
-import com.sun.hotspot.igv.controlflow.InputBlockEdge;
 import com.sun.hotspot.igv.data.InputGraph;
 import com.sun.hotspot.igv.data.services.InputGraphProvider;
 import com.sun.hotspot.igv.data.InputNode;
@@ -44,15 +43,14 @@
 import org.netbeans.api.visual.action.WidgetAction;
 import org.netbeans.api.visual.anchor.AnchorFactory;
 import org.netbeans.api.visual.anchor.AnchorShape;
-import org.netbeans.api.visual.layout.LayoutFactory;
 import org.netbeans.api.visual.router.RouterFactory;
 import org.netbeans.api.visual.widget.LayerWidget;
 import org.netbeans.api.visual.widget.Widget;
 import org.netbeans.api.visual.graph.GraphScene;
 import org.netbeans.api.visual.graph.layout.GraphLayout;
+import org.netbeans.api.visual.layout.LayoutFactory;
 import org.netbeans.api.visual.layout.SceneLayout;
 import org.netbeans.api.visual.widget.ConnectionWidget;
-import org.openide.util.Utilities;
 
 /**
  *
@@ -121,7 +119,7 @@
             }
         }
 
-        GraphLayout layout = new HierarchicalGraphLayout();//GridGraphLayout();
+        GraphLayout<InputBlock, InputBlockEdge> layout = new HierarchicalGraphLayout<InputBlock, InputBlockEdge>();//GridGraphLayout();
         SceneLayout sceneLayout = LayoutFactory.createSceneGraphLayout(this, layout);
         sceneLayout.invokeLayout();
 
--- a/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java	Wed Jun 15 19:54:42 2011 +0200
@@ -123,7 +123,7 @@
 
     @Override
     public void componentOpened() {
-        Lookup.Template tpl = new Lookup.Template(InputGraphProvider.class);
+        Lookup.Template<InputGraphProvider> tpl = new Lookup.Template<InputGraphProvider>(InputGraphProvider.class);
         result = Utilities.actionsGlobalContext().lookup(tpl);
         result.addLookupListener(this);
     }
--- a/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java	Wed Jun 15 19:54:42 2011 +0200
@@ -34,7 +34,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -128,6 +127,7 @@
         }
 
         public int compareTo(Vertex o) {
+            @SuppressWarnings("unchecked")
             VertexWrapper vw = (VertexWrapper) o;
             return node.toString().compareTo(vw.node.toString());
         }
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java	Wed Jun 15 19:54:42 2011 +0200
@@ -36,7 +36,7 @@
 import org.openide.nodes.AbstractNode;
 import org.openide.nodes.Children;
 import org.openide.nodes.Node;
-import org.openide.util.Utilities;
+import org.openide.util.ImageUtilities;
 import org.openide.util.lookup.AbstractLookup;
 import org.openide.util.lookup.InstanceContent;
 
@@ -52,7 +52,7 @@
     private List<String> subFolders;
     private FolderChildren children;
 
-    private static class FolderChildren extends Children.Keys implements ChangedListener<Group> {
+    private static class FolderChildren extends Children.Keys<Pair<String, List<Group>>> implements ChangedListener<Group> {
 
         private FolderNode parent;
         private List<Group> registeredGroups;
@@ -68,14 +68,13 @@
         }
 
         @Override
-        protected Node[] createNodes(Object arg0) {
+        protected Node[] createNodes(Pair<String, List<Group>> p) {
 
             for(Group g : registeredGroups) {
                 g.getChangedEvent().removeListener(this);
             }
             registeredGroups.clear();
             
-            Pair<String, List<Group>> p = (Pair<String, List<Group>>) arg0;
             if (p.getLeft().length() == 0) {
 
                 List<Node> curNodes = new ArrayList<Node>();
@@ -116,7 +115,7 @@
 
     @Override
     public Image getIcon(int i) {
-        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif");
+        return ImageUtilities.loadImage("com/sun/hotspot/igv/coordinator/images/folder.gif");
     }
 
     protected FolderNode(GraphDocument document, String name, GroupOrganizer organizer, List<String> subFolders, List<Group> groups) {
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java	Wed Jun 15 19:54:42 2011 +0200
@@ -37,8 +37,8 @@
 import org.openide.nodes.AbstractNode;
 import org.openide.nodes.Children;
 import org.openide.nodes.Sheet;
+import org.openide.util.ImageUtilities;
 import org.openide.util.Lookup;
-import org.openide.util.Utilities;
 import org.openide.util.lookup.AbstractLookup;
 import org.openide.util.lookup.InstanceContent;
 
@@ -98,7 +98,7 @@
 
     @Override
     public Image getIcon(int i) {
-        return Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif");
+        return ImageUtilities.loadImage("com/sun/hotspot/igv/coordinator/images/graph.gif");
     }
 
     @Override
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardConfiguration.xml	Wed Jun 15 19:54:42 2011 +0200
@@ -5,7 +5,6 @@
         <Toolbar name="Edit" position="1" visible="false"/>
         <Toolbar name="File" position="1" visible="false" />
         <Toolbar name="Memory" position="1" visible="false" />
-        <Toolbar name="QuickSearch" position="1" visible="true" />
     </Row>
     <Row>
         <Toolbar name="WorkspaceSwitcher" />
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -51,8 +51,8 @@
 import javax.swing.event.PopupMenuListener;
 import org.openide.awt.DropDownButtonFactory;
 import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
 import org.openide.util.Lookup;
-import org.openide.util.Utilities;
 import org.openide.util.actions.CallableSystemAction;
 
 public class StructuredViewAction extends CallableSystemAction {
@@ -71,7 +71,7 @@
     @Override
     public Component getToolbarPresenter() {
 
-        Image iconImage = Utilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif");
+        Image iconImage = ImageUtilities.loadImage("com/sun/hotspot/igv/coordinator/images/structure.gif");
         ImageIcon icon = new ImageIcon(iconImage);
 
         popup = new JPopupMenu();
--- a/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/layer.xml	Wed Jun 15 19:54:42 2011 +0200
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN" "http://www.netbeans.org/dtds/filesystem-1_2.dtd">
 <filesystem>
     <attr name="Actions\Edit\com-sun-hotspot-igv-bytecodes-SelectBytecodesAction.instance\position" intvalue="200"/>
     <attr name="Actions\Edit\org-netbeans-core-ui-sysopen-SystemOpenAction.instance\position" intvalue="100"/>
@@ -96,19 +96,16 @@
                 <attr name="originalFile" stringvalue="Actions/Window/com-sun-hotspot-igv-coordinator-actions-OutlineAction.instance"/>
             </file>
         </folder>
-    </folder>
-    <folder name="Toolbars">
         
-        <folder name="QuickSearch">
-            <attr name="SystemFileSystem.localizingBundle" stringvalue="com.sun.hotspot.igv.coordinator.Bundle"/>
+        <file name="Spacer.instance">
+            <attr name="instanceCreate" methodvalue="javax.swing.Box.createHorizontalGlue"/>
+            <attr name="position" intvalue="9980"/>
+        </file>
             <file name="org-netbeans-modules-quicksearch-QuickSearchAction.shadow">
-                <attr name="originalFile"
-                stringvalue="Actions/Edit/org-netbeans-modules-quicksearch-QuickSearchAction.instance"/>
+            <attr name="displayName" bundlevalue="com.sun.hotspot.igv.coordinator.Bundle#Toolbars/QuickSearch"/>
+            <attr name="originalFile" stringvalue="Actions/Edit/org-netbeans-modules-quicksearch-QuickSearchAction.instance"/>
             </file>
         </folder>
-        <!--<file name="Standard.xml" url="StandardConfiguration.xml"/>-->
-
-    </folder>
     <folder name="Windows2">
         <folder name="Components">
             <file name="OutlineTopComponent.settings" url="OutlineTopComponentSettings.xml"/>
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java	Wed Jun 15 19:54:42 2011 +0200
@@ -183,8 +183,12 @@
 
         private String name;
         private Pattern valuePattern;
+        
+        public RegexpPropertyMatcher(String name, String value) {
+            this(name, value, 0);
+        }
 
-        public RegexpPropertyMatcher(String name, String value) {
+        public RegexpPropertyMatcher(String name, String value, int flags) {
 
             if (name == null) {
                 throw new IllegalArgumentException("Property name must not be null!");
@@ -197,7 +201,7 @@
             this.name = name;
 
             try {
-                valuePattern = Pattern.compile(value);
+                valuePattern = Pattern.compile(value, flags);
             } catch (PatternSyntaxException e) {
                 throw new IllegalArgumentException("Bad pattern: " + value);
             }
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java	Wed Jun 15 19:54:42 2011 +0200
@@ -32,7 +32,6 @@
 import com.sun.hotspot.igv.data.InputNode;
 import com.sun.hotspot.igv.data.Pair;
 import com.sun.hotspot.igv.data.Properties;
-import com.sun.hotspot.igv.data.Property;
 import com.sun.hotspot.igv.data.services.GroupCallback;
 import com.sun.hotspot.igv.data.serialization.XMLParser.ElementHandler;
 import com.sun.hotspot.igv.data.serialization.XMLParser.HandoverElementHandler;
@@ -92,7 +91,7 @@
     public static final String SUCCESSOR_ELEMENT = "successor";
     public static final String ASSEMBLY_ELEMENT = "assembly";
     public static final String DIFFERENCE_PROPERTY = "difference";
-    private TopElementHandler xmlDocument = new TopElementHandler();
+    private TopElementHandler<GraphDocument> xmlDocument = new TopElementHandler<GraphDocument>();
     private boolean difference;
     private GroupCallback groupCallback;
     private HashMap<String, Integer> idCache = new HashMap<String, Integer>();
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java	Wed Jun 15 19:54:42 2011 +0200
@@ -23,7 +23,6 @@
  */
 package com.sun.hotspot.igv.data.serialization;
 
-import com.sun.hotspot.igv.data.Property;
 import com.sun.hotspot.igv.data.Properties;
 import java.util.HashMap;
 import java.util.Stack;
@@ -209,9 +208,10 @@
     public void endPrefixMapping(String prefix) throws SAXException {
     }
 
+    @SuppressWarnings("unchecked")
     public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+        assert !stack.isEmpty();
 
-        assert !stack.isEmpty();
         ElementHandler parent = stack.peek();
         if (parent != null) {
             ElementHandler child = parent.getChild(qName);
--- a/src/share/tools/IdealGraphVisualizer/Data/test/unit/src/com/sun/hotspot/igv/data/ChangedEventTest.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/test/unit/src/com/sun/hotspot/igv/data/ChangedEventTest.java	Wed Jun 15 19:54:42 2011 +0200
@@ -62,7 +62,7 @@
     @Test
     public void testBase() {
 
-        ChangedEvent<Integer> e = new ChangedEvent(5);
+        ChangedEvent<Integer> e = new ChangedEvent<Integer>(5);
         final int[] fireCount = new int[1];
 
         e.addListener(new ChangedListener<Integer>() {
--- a/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java	Wed Jun 15 19:54:42 2011 +0200
@@ -38,6 +38,7 @@
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.FileSystem;
 import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
 import org.openide.util.Exceptions;
 import org.openide.util.Lookup;
 
@@ -126,8 +127,7 @@
         InputStream is = null;
         StringBuilder sb = new StringBuilder("importPackage(Packages.com.sun.hotspot.igv.filter);importPackage(Packages.com.sun.hotspot.igv.graph);importPackage(Packages.com.sun.hotspot.igv.data);importPackage(Packages.com.sun.hotspot.igv.util);importPackage(java.awt);");
         try {
-            FileSystem fs = Repository.getDefault().getDefaultFileSystem();
-            FileObject fo = fs.getRoot().getFileObject(JAVASCRIPT_HELPER_ID);
+            FileObject fo = FileUtil.getConfigRoot().getFileObject(JAVASCRIPT_HELPER_ID);
             is = fo.getInputStream();
             BufferedReader r = new BufferedReader(new InputStreamReader(is));
             String s;
--- a/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java	Wed Jun 15 19:54:42 2011 +0200
@@ -82,6 +82,7 @@
 import org.openide.filesystems.Repository;
 import org.openide.filesystems.FileSystem;
 import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
 
 /**
  * 
@@ -267,20 +268,18 @@
         }
     }
 
-    private class FilterChildren extends Children.Keys implements ChangedListener<CheckNode> {
+    private class FilterChildren extends Children.Keys<Filter> implements ChangedListener<CheckNode> {
 
-        private HashMap<Object, Node> nodeHash = new HashMap<Object, Node>();
+        private HashMap<Filter, Node> nodeHash = new HashMap<Filter, Node>();
 
-        protected Node[] createNodes(Object object) {
-            if (nodeHash.containsKey(object)) {
-                return new Node[]{nodeHash.get(object)};
+        protected Node[] createNodes(Filter filter) {
+            if (nodeHash.containsKey(filter)) {
+                return new Node[]{nodeHash.get(filter)};
             }
 
-            assert object instanceof Filter;
-            Filter filter = (Filter) object;
             FilterNode node = new FilterNode(filter);
             node.getSelectionChangedEvent().addListener(this);
-            nodeHash.put(object, node);
+            nodeHash.put(filter, node);
             return new Node[]{node};
         }
 
@@ -295,6 +294,7 @@
             setBefore(false);
         }
 
+        @Override
         protected void addNotify() {
             setKeys(sequence.getFilters());
             updateSelection();
@@ -420,9 +420,7 @@
     }
 
     public void initFilters() {
-
-        FileSystem fs = Repository.getDefault().getDefaultFileSystem();
-        FileObject folder = fs.getRoot().getFileObject(FOLDER_ID);
+        FileObject folder = FileUtil.getConfigRoot().getFileObject(FOLDER_ID);
         FileObject[] children = folder.getChildren();
 
         List<CustomFilter> customFilters = new ArrayList<CustomFilter>();
@@ -585,10 +583,10 @@
     }
 
     private FileObject getFileObject(CustomFilter cf) {
-        FileObject fo = Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID + "/" + cf.getName());
+        FileObject fo = FileUtil.getConfigRoot().getFileObject(FOLDER_ID + "/" + cf.getName());
         if (fo == null) {
             try {
-                fo = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject(FOLDER_ID).createData(cf.getName());
+                fo = FileUtil.getConfigRoot().getFileObject(FOLDER_ID).createData(cf.getName());
             } catch (IOException ex) {
                 Exceptions.printStackTrace(ex);
             }
--- a/src/share/tools/IdealGraphVisualizer/GraphTextEditor/src/com/sun/hotspot/igv/graphtexteditor/TextTopComponent.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/GraphTextEditor/src/com/sun/hotspot/igv/graphtexteditor/TextTopComponent.java	Wed Jun 15 19:54:42 2011 +0200
@@ -260,7 +260,7 @@
         DiagramProvider p = LookupHistory.getLast(DiagramProvider.class);
         updateDiagramProvider(p);
 
-        Lookup.Template tpl = new Lookup.Template(DiagramProvider.class);
+        Lookup.Template<DiagramProvider> tpl = new Lookup.Template<DiagramProvider>(DiagramProvider.class);
         result = Utilities.actionsGlobalContext().lookup(tpl);
         result.addLookupListener(this);
     }
--- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java	Wed Jun 15 19:54:42 2011 +0200
@@ -565,12 +565,16 @@
                 n.x = space[n.layer].get(n.pos);
             }
         }
-
-        protected void run() {
-
+        
+        @SuppressWarnings("unchecked")
+        private void createArrays() {
             space = new ArrayList[layers.length];
             downProcessingOrder = new ArrayList[layers.length];
             upProcessingOrder = new ArrayList[layers.length];
+        }
+
+        protected void run() {
+            createArrays();
 
             for (int i = 0; i < layers.length; i++) {
                 space[i] = new ArrayList<Integer>();
@@ -1106,14 +1110,18 @@
                 assert n.layer < layerCount;
             }
         }
-
-        protected void run() {
-
+        
+        @SuppressWarnings("unchecked")
+        private void createLayers() {
             layers = new List[layerCount];
 
             for (int i = 0; i < layerCount; i++) {
                 layers[i] = new ArrayList<LayoutNode>();
             }
+        }
+
+        protected void run() {
+            createLayers();
 
             // Generate initial ordering
             HashSet<LayoutNode> visited = new HashSet<LayoutNode>();
--- a/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java	Wed Jun 15 19:54:42 2011 +0200
@@ -499,7 +499,8 @@
         //}
 
 
-        ArrayList<Node<NodeData, EdgeData>> layers[] = new ArrayList[maxLayer + 1];
+        @SuppressWarnings("unchecked")
+        ArrayList<Node<NodeData, EdgeData>> layers[] = (ArrayList<Node<NodeData, EdgeData>>[]) new ArrayList[maxLayer + 1];
         int layerSizes[] = new int[maxLayer + 1];
         for (int i = 0; i < maxLayer + 1; i++) {
             layers[i] = new ArrayList<Node<NodeData, EdgeData>>();
@@ -1113,7 +1114,7 @@
         int removedCount = 0;
         int reversedCount = 0;
 
-        Graph.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() {
+        Graph<NodeData, EdgeData>.DFSTraversalVisitor visitor = graph.new DFSTraversalVisitor() {
 
             @Override
             public boolean visitEdge(Edge<NodeData, EdgeData> e, boolean backEdge) {
@@ -1159,7 +1160,7 @@
             n.getData().setLayer(-1);
         }
 
-        Graph.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() {
+        Graph<NodeData, EdgeData>.BFSTraversalVisitor traverser = graph.new BFSTraversalVisitor() {
 
             @Override
             public void visitNode(Node<NodeData, EdgeData> n, int depth) {
--- a/src/share/tools/IdealGraphVisualizer/Java6ScriptingProxy/src/com/sun/hotspot/igv/java6scriptingproxy/JavaSE6ScriptEngine.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Java6ScriptingProxy/src/com/sun/hotspot/igv/java6scriptingproxy/JavaSE6ScriptEngine.java	Wed Jun 15 19:54:42 2011 +0200
@@ -43,13 +43,12 @@
 
     public boolean initialize(String jsHelperText) {
         try {
-            
             ClassLoader cl = JavaSE6ScriptEngine.class.getClassLoader();
-            Class managerClass = cl.loadClass("javax.script.ScriptEngineManager");
-            Class engineClass = cl.loadClass("javax.script.ScriptEngine");
-            Class bindingsClass = cl.loadClass("javax.script.Bindings");
-            Class contextClass = cl.loadClass("javax.script.ScriptContext");
-            
+            Class<?> managerClass = cl.loadClass("javax.script.ScriptEngineManager");
+            Class<?> engineClass = cl.loadClass("javax.script.ScriptEngine");
+            Class<?> bindingsClass = cl.loadClass("javax.script.Bindings");
+            Class<?> contextClass = cl.loadClass("javax.script.ScriptContext");
+
             Object manager = managerClass.newInstance();
             Method getEngineByName = managerClass.getMethod("getEngineByName", String.class);
             engine = getEngineByName.invoke(manager, "ECMAScript");
@@ -63,7 +62,7 @@
             bindings = getBindings.invoke(context, f.getInt(null));
             Bindings_put = bindingsClass.getMethod("put", String.class, Object.class);
             Bindings_put.invoke(bindings, "IO", System.out);
-            
+
             /*
              * Non-reflective code: 
             ScriptEngineManager sem = new ScriptEngineManager();
--- a/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,7 +27,6 @@
 import com.sun.hotspot.igv.filter.ScriptEngineAbstraction;
 import com.sun.hotspot.igv.graph.Diagram;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
@@ -45,11 +44,11 @@
 
     public boolean initialize(String s) {
         this.jsHelperText = s;
-        Class importerTopLevel = null;
+        Class<?> importerTopLevel = null;
         try {
             ClassLoader cl = RhinoScriptEngine.class.getClassLoader();
-            Class context = cl.loadClass("org.mozilla.javascript.Context");
-            Class scriptable = cl.loadClass("org.mozilla.javascript.Scriptable");
+            Class<?> context = cl.loadClass("org.mozilla.javascript.Context");
+            Class<?> scriptable = cl.loadClass("org.mozilla.javascript.Scriptable");
             importerTopLevel = cl.loadClass("org.mozilla.javascript.ImporterTopLevel");
             importer = importerTopLevel.getDeclaredConstructor(context);
             scope_put = importerTopLevel.getMethod("put", String.class, scriptable, Object.class);
--- a/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerGraphToTextConverter.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerGraphToTextConverter.java	Wed Jun 15 19:54:42 2011 +0200
@@ -149,7 +149,7 @@
     
     private static final PropertyMatcher MATCHER = new Properties.RegexpPropertyMatcher("name", "Root");
     public boolean canConvert(InputGraph graph) {
-        return new PropertySelector(graph.getNodes()).selectSingle(MATCHER) != null;
+        return new PropertySelector<InputNode>(graph.getNodes()).selectSingle(MATCHER) != null;
     }
 
     private Color calcColor(InputNode node) {
--- a/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,8 +27,8 @@
 import javax.swing.ImageIcon;
 import org.netbeans.spi.options.OptionsCategory;
 import org.netbeans.spi.options.OptionsPanelController;
+import org.openide.util.ImageUtilities;
 import org.openide.util.NbBundle;
-import org.openide.util.Utilities;
 
 /**
  *
@@ -38,7 +38,7 @@
 
     @Override
     public Icon getIcon() {
-        return new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/settings/settings.gif"));
+        return new ImageIcon(ImageUtilities.loadImage("com/sun/hotspot/igv/settings/settings.gif"));
     }
 
     public String getCategoryName() {
--- a/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/LookupHistory.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/LookupHistory.java	Wed Jun 15 19:54:42 2011 +0200
@@ -21,10 +21,9 @@
  * questions.
  *
  */
-
 package com.sun.hotspot.igv.util;
 
-import java.util.Hashtable;
+import java.util.HashMap;
 import java.util.Map;
 import org.openide.util.Lookup.Result;
 import org.openide.util.LookupEvent;
@@ -37,13 +36,12 @@
  */
 public class LookupHistory {
 
-    private static Map<Class, LookupHistoryImpl> cache = new Hashtable<Class, LookupHistoryImpl>();
+    private static Map<Class, LookupHistoryImpl> cache = new HashMap<Class, LookupHistoryImpl>();
 
     private static class LookupHistoryImpl<T> implements LookupListener {
 
         private Class<T> klass;
         private Result<T> result;
-
         private T last;
 
         public LookupHistoryImpl(Class<T> klass) {
@@ -65,20 +63,16 @@
         }
     }
 
-
-    public static void init(Class klass) {
-
+    public static <T> void init(Class<T> klass) {
         if (!cache.containsKey(klass)) {
-            cache.put(klass, new LookupHistoryImpl(klass));
+            cache.put(klass, new LookupHistoryImpl<T>(klass));
         }
     }
 
+    @SuppressWarnings("unchecked")
     public static <T> T getLast(Class<T> klass) {
-
         init(klass);
-
         assert cache.containsKey(klass);
-
         return (T) cache.get(klass).getLast();
     }
 }
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java	Wed Jun 15 19:54:42 2011 +0200
@@ -57,8 +57,6 @@
 import java.awt.Point;
 import java.awt.Rectangle;
 import java.awt.event.ActionEvent;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
@@ -123,6 +121,7 @@
     private DiagramViewModel model;
     private DiagramViewModel modelCopy;
     private WidgetAction zoomAction;
+    private boolean rebuilding;
     
     /**
      * The alpha level of partially visible figures.
@@ -327,6 +326,11 @@
         }
 
         public void selectionChanged(ObjectSceneEvent e, Set<Object> oldSet, Set<Object> newSet) {
+            DiagramScene scene = (DiagramScene) e.getObjectScene();
+            if (scene.isRebuilding()) {
+                return;
+            }
+
             content.set(newSet, null);
 
             Set<Integer> nodeSelection = new HashSet<Integer>();
@@ -507,6 +511,8 @@
     private void update() {
         mainLayer.removeChildren();
         blockLayer.removeChildren();
+        
+        rebuilding = true;
 
         Collection<Object> objects = new ArrayList<Object>(this.getObjects());
         for (Object o : objects) {
@@ -515,7 +521,7 @@
 
         Diagram d = getModel().getDiagramToView();
 
-        if (d.getGraph().getBlocks().size() == 0) {
+        if (d.getGraph().getBlocks().isEmpty()) {
             Scheduler s = Lookup.getDefault().lookup(Scheduler.class);
             d.getGraph().clearBlocks();
             s.schedule(d.getGraph());
@@ -557,9 +563,13 @@
                 blockLayer.addChild(w);
             }
         }
-
+        
+        rebuilding = false;
         this.smallUpdate(true);
-
+    }
+    
+    public boolean isRebuilding() {
+        return rebuilding;
     }
 
     private void smallUpdate(boolean relayout) {
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java	Wed Jun 15 19:54:42 2011 +0200
@@ -249,7 +249,6 @@
                     index++;
                 }
             }
-            this.setColors(colors);
         }
         setColors(colors);
         viewChangedEvent.fire();
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewer.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewer.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,6 +27,7 @@
 import com.sun.hotspot.igv.graph.Figure;
 import java.awt.Component;
 import java.awt.Graphics2D;
+import java.util.Collection;
 import java.util.List;
 import javax.swing.JComponent;
 import org.openide.awt.UndoRedo;
@@ -57,6 +58,8 @@
     public void componentShowing();
 
     public void initialize();
+    
+    public void setSelection(Collection<Figure> list);
 
     public void centerFigures(List<Figure> list);
 
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java	Wed Jun 15 19:54:42 2011 +0200
@@ -46,7 +46,6 @@
 import com.sun.hotspot.igv.data.services.InputGraphProvider;
 import com.sun.hotspot.igv.filter.FilterChainProvider;
 import com.sun.hotspot.igv.graph.services.DiagramProvider;
-import com.sun.hotspot.igv.selectioncoordinator.SelectionCoordinator;
 import com.sun.hotspot.igv.util.RangeSlider;
 import com.sun.hotspot.igv.svg.BatikSVG;
 import com.sun.hotspot.igv.util.LookupHistory;
@@ -54,7 +53,6 @@
 import java.awt.CardLayout;
 import java.awt.Color;
 import java.awt.Graphics2D;
-import java.awt.Point;
 import java.awt.event.HierarchyBoundsListener;
 import java.awt.event.HierarchyEvent;
 import java.awt.event.KeyEvent;
@@ -436,7 +434,7 @@
     }
 
     public void setSelectedFigures(List<Figure> list) {
-        getModel().setSelectedFigures(list);
+        scene.setSelection(list);
         scene.centerFigures(list);
     }
 
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/NodeQuickSearch.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/NodeQuickSearch.java	Wed Jun 15 19:54:42 2011 +0200
@@ -33,11 +33,13 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Pattern;
 import org.netbeans.spi.quicksearch.SearchProvider;
 import org.netbeans.spi.quicksearch.SearchRequest;
 import org.netbeans.spi.quicksearch.SearchResponse;
 import org.openide.DialogDisplayer;
 import org.openide.NotifyDescriptor;
+import org.openide.NotifyDescriptor.Message;
 
 /**
  *
@@ -45,6 +47,8 @@
  */
 public class NodeQuickSearch implements SearchProvider {
 
+    private static final String DEFAULT_PROPERTY = "name";
+
     /**
      * Method is called by infrastructure when search operation was requested.
      * Implementors should evaluate given request and fill response object with
@@ -54,51 +58,67 @@
      * @param response Search response object that stores search results. Note that it's important to react to return value of SearchResponse.addResult(...) method and stop computation if false value is returned.
      */
     public void evaluate(SearchRequest request, SearchResponse response) {
-
-        final String[] parts = request.getText().split("=");
-        if (parts.length == 0) {
+        String query = request.getText();
+        if (query.trim().isEmpty()) {
             return;
         }
 
-        String tmpName = parts[0];
+        final String[] parts = query.split("=", 2);
+
+        String name;
+        String value;
 
-        String value = null;
-        if (parts.length == 2) {
+        if (parts.length == 1) {
+            name = DEFAULT_PROPERTY;
+            value = ".*" + Pattern.quote(parts[0]) + ".*";
+        } else {
+            name = parts[0];
             value = parts[1];
         }
 
-        if (parts.length == 1 && request.getText().endsWith("=")) {
+        if (value.isEmpty()) {
             value = ".*";
         }
 
-        final String name = tmpName;
+        final InputGraphProvider p = LookupHistory.getLast(InputGraphProvider.class);
+        if (p != null && p.getGraph() != null) {
+            List<InputNode> matches = null;
+            try {
+                RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(name, value, Pattern.CASE_INSENSITIVE);
+                Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(p.getGraph().getNodes());
 
-        if (value != null) {
-            final InputGraphProvider p = LookupHistory.getLast(InputGraphProvider.class);//)Utilities.actionsGlobalContext().lookup(InputGraphProvider.class);
-            if (p != null) {
-                final InputGraph graph = p.getGraph();
-                if (graph != null) {
-                    final RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(name, value);
-                    final Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(graph.getNodes());
-                    final List<InputNode> list = selector.selectMultiple(matcher);
-                    final Set<InputNode> set = new HashSet<InputNode>(list);
+                matches = selector.selectMultiple(matcher);
+            } catch (Exception e) {
+                final String msg = e.getMessage();
+                response.addResult(new Runnable() {
+                        public void run() {
+                            Message desc = new NotifyDescriptor.Message("An exception occurred during the search, "
+                                    + "perhaps due to a malformed query string:\n" + msg,
+                                    NotifyDescriptor.WARNING_MESSAGE);
+                            DialogDisplayer.getDefault().notify(desc);
+                        }
+                    },
+                    "(Error during search)"
+                );
+            }
 
-                    response.addResult(new Runnable() {
-
+            if (matches != null) {
+                final Set<InputNode> set = new HashSet<InputNode>(matches);
+                response.addResult(new Runnable() {
                         public void run() {
-
                             final EditorTopComponent comp = EditorTopComponent.getActive();
                             if (comp != null) {
                                 comp.setSelectedNodes(set);
                                 comp.requestActive();
                             }
                         }
-                    }, "All " + list.size() + " matching nodes (" + name + "=" + value + ")");
-                    for (final InputNode n : list) {
+                    },
+                    "All " + matches.size() + " matching nodes (" + name + "=" + value + ")"
+                );
 
-
-                        response.addResult(new Runnable() {
-
+                // Single matches
+                for (final InputNode n : matches) {
+                    response.addResult(new Runnable() {
                             public void run() {
                                 final EditorTopComponent comp = EditorTopComponent.getActive();
                                 if (comp != null) {
@@ -106,68 +126,15 @@
                                     tmpSet.add(n);
                                     comp.setSelectedNodes(tmpSet);
                                     comp.requestActive();
-                                    comp.requestFocus();
                                 }
                             }
-                        }, n.getProperties().get(name) + " (" + n.getId() + " " + n.getProperties().get("name") + ")");
-                    }
-                }
-
-            } else {
-                System.out.println("no input graph provider!");
-            }
-
-        } else if (parts.length == 1) {
-
-            final InputGraphProvider p = LookupHistory.getLast(InputGraphProvider.class);//Utilities.actionsGlobalContext().lookup(InputGraphProvider.class);
-
-            if (p != null) {
-
-                final InputGraph graph = p.getGraph();
-                if (p != null && graph != null) {
-
-                    Set<String> properties = new HashSet<String>();
-                    for (InputNode n : p.getGraph().getNodes()) {
-                        for (Property property : n.getProperties()) {
-                            properties.add(property.getName());
-                        }
-                    }
-
-                    for (final String propertyName : properties) {
-
-                        if (propertyName.startsWith(name)) {
-
-                            response.addResult(new Runnable() {
-
-                                public void run() {
-
-                                    NotifyDescriptor.InputLine d =
-                                            new NotifyDescriptor.InputLine("Value of the property?", "Property Value Input");
-                                    if (DialogDisplayer.getDefault().notify(d) == NotifyDescriptor.OK_OPTION) {
-                                        String value = d.getInputText();
-                                        final RegexpPropertyMatcher matcher = new RegexpPropertyMatcher(propertyName, value);
-                                        final Properties.PropertySelector<InputNode> selector = new Properties.PropertySelector<InputNode>(graph.getNodes());
-                                        final List<InputNode> list = selector.selectMultiple(matcher);
-                                        final Set<InputNode> set = new HashSet<InputNode>(list);
-
-                                        final EditorTopComponent comp = EditorTopComponent.getActive();
-                                        if (comp != null) {
-                                            comp.setSelectedNodes(set);
-                                            comp.requestActive();
-                                        }
-
-                                    }
-
-
-                                }
-                            }, propertyName + "=");
-                        }
-                    }
-
-                } else {
-                    System.out.println("no input graph provider!");
+                        },
+                        n.getProperties().get(name) + " (" + n.getId() + " " + n.getProperties().get("name") + ")"
+                    );
                 }
             }
+        } else {
+            System.out.println("no input graph provider!");
         }
     }
 }
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,6 +27,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.ImageIcon;
+import org.openide.util.ImageUtilities;
 
 /**
  *
@@ -39,7 +40,7 @@
 
     public EnableBlockLayoutAction() {
         state = true;
-        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage(iconResource())));
         putValue(STATE, true);
         putValue(Action.SHORT_DESCRIPTION, "Cluster nodes into blocks");
     }
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -29,6 +29,7 @@
 import javax.swing.Action;
 import javax.swing.ImageIcon;
 import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
 import org.openide.util.Lookup;
 import org.openide.util.NbBundle;
 import org.openide.util.Utilities;
@@ -47,7 +48,7 @@
 
     public NextDiagramAction(Lookup lookup) {
         putValue(Action.SHORT_DESCRIPTION, "Show next graph of current group");
-        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png")));
+        putValue(Action.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage("com/sun/hotspot/igv/view/images/next_diagram.png")));
     }
 
     public String getName() {
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,6 +27,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.ImageIcon;
+import org.openide.util.ImageUtilities;
 
 /**
  *
@@ -38,7 +39,7 @@
     public static final String STATE = "state";
 
     public OverviewAction() {
-        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage(iconResource())));
         putValue(Action.SHORT_DESCRIPTION, "Show satellite view of whole graph");
         setState(false);
     }
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -27,6 +27,7 @@
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.ImageIcon;
+import org.openide.util.ImageUtilities;
 
 /**
  *
@@ -39,7 +40,7 @@
 
     public PredSuccAction() {
         state = true;
-        putValue(AbstractAction.SMALL_ICON, new ImageIcon(org.openide.util.Utilities.loadImage(iconResource())));
+        putValue(AbstractAction.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage(iconResource())));
         putValue(STATE, true);
         putValue(Action.SHORT_DESCRIPTION, "Show neighboring nodes of fully visible nodes semi-transparent");
     }
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java	Wed Jun 15 19:54:42 2011 +0200
@@ -29,6 +29,7 @@
 import javax.swing.Action;
 import javax.swing.ImageIcon;
 import org.openide.util.HelpCtx;
+import org.openide.util.ImageUtilities;
 import org.openide.util.Lookup;
 import org.openide.util.NbBundle;
 import org.openide.util.Utilities;
@@ -47,7 +48,7 @@
 
     public PrevDiagramAction(Lookup lookup) {
         putValue(Action.SHORT_DESCRIPTION, "Show previous graph of current group");
-        putValue(Action.SMALL_ICON, new ImageIcon(Utilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png")));
+        putValue(Action.SMALL_ICON, new ImageIcon(ImageUtilities.loadImage("com/sun/hotspot/igv/view/images/prev_diagram.png")));
     }
 
     public String getName() {
--- a/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java	Wed Jun 15 19:54:42 2011 +0200
@@ -152,9 +152,9 @@
     protected abstract int calculateSlotWidth();
     
     protected int calculateWidth(int count) {
-        return (int)getFigureWidget().getFigure().getWidth() / count;
+        return getFigureWidget().getFigure().getWidth() / count;
     }
-    
+
     public void handleDoubleClick(Widget w, WidgetAction.WidgetMouseEvent e) {
         Set<Integer> hiddenNodes = new HashSet<Integer>(diagramScene.getModel().getHiddenNodes());
         if (diagramScene.isAllVisible()) {
--- a/src/share/tools/IdealGraphVisualizer/nbproject/project.properties	Wed Jun 15 16:36:37 2011 +0200
+++ b/src/share/tools/IdealGraphVisualizer/nbproject/project.properties	Wed Jun 15 19:54:42 2011 +0200
@@ -55,4 +55,3 @@
 project.com.sun.hotspot.igv.util=Util
 project.test=module1
 run.args = -J-client -J-Xms128m -J-Xmx512m -J-ea
-debug.args = -J-client -J-Xms128m -J-Xmx512m -J-ea