changeset 3529:d683f8a40c05

Second round of refactoring.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 10 Aug 2011 00:34:29 +0200
parents 6b841b6b2437
children da773e1b6d9f
files .test.txt.swo graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/ComputeLinearScanOrder.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/ControlFlowOptimizer.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/BlockPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/CFGPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/GraphvizPrinterObserver.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/InstructionPrinter.java 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/gen/PhiResolver.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/PhiSimplifier.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/BlockMap.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/CompilerGraph.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/graph/MergeableState.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/PostOrderNodeIterator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractMemoryCheckpointNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessArray.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessIndexed.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessMonitor.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/And.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Arithmetic.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BasicInductionVariable.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Binary.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockClosure.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockList.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BooleanNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CastNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CheckCast.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ComputeLinearScanOrder.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Conditional.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Constant.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ControlSplit.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Convert.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CreateVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/DerivedInductionVariable.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionEdgeInstruction.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionObject.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNodeWithNext.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatAdd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatArithmetic.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatDiv.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatMul.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatRem.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatSub.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatingNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.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/InductionVariable.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InstanceOf.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerAdd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerAddVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerArithmeticNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerDiv.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerMul.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerRem.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerSub.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Invoke.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsType.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LeftShift.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LinearInductionVariable.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadIndexed.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Logic.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LookupSwitch.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopCounter.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/MaterializeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MathIntrinsic.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorAddress.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorEnter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorExit.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Negate.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NegateBooleanNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewMultiArray.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewObjectArray.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewTypeArray.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Or.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/ir/Placeholder.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ReadNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ReadVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Return.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RightShift.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/package-info.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRAssembler.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBlock.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBranch.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIROp2.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/AnchorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/BooleanNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/CastNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ConstantNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ControlSplitNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/DeoptimizeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/EndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedGuardNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedWithNextNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FrameState.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/GuardNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/IfNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/InvokeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LocalNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LoopBeginNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LoopEndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/MaterializeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/MergeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/PhiNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/PlaceholderNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ReturnNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/StateSplit.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/UnwindNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ValueNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/AndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ArithmeticNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/BinaryNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/CompareNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/Condition.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ConditionalNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ConvertNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatAddNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatArithmeticNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatDivNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatMulNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatRemNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatSubNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatingNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerAddNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerAddVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerArithmeticNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerDivNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerMulNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerRemNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerSubNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IsNonNullNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/LeftShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/LogicNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NegateBooleanNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NegateNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NormalizeCompareNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/OrNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/RightShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/UnsignedRightShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/XorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/SwitchNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/TableSwitchNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/WriteMemoryCheckpointNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AbstractMemoryCheckpointNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AbstractVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AccessNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AccessVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/CreateVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/LocationNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/LookupSwitchNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ReadNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ReadVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/StoreFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/StoreIndexedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/SwitchNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/TableSwitchNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/TypeCheckNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/UnsignedRightShiftNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/UnwindNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ValueAnchorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/VirtualObjectFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/VirtualObjectNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteMemoryCheckpointNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteVectorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/XorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessArrayNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessIndexedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessMonitorNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/ArrayLengthNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/CheckCastNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/ExceptionObjectNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/InstanceOfNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/IsTypeNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/LoadFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/LoadIndexedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MathIntrinsicNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorAddressNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorEnterNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorExitNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewArrayNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewInstanceNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewMultiArrayNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewObjectArrayNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewTypeArrayNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/RegisterFinalizerNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/StoreFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/StoreIndexedNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/TypeCheckNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/BasicInductionVariableNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/DerivedInductionVariableNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/InductionVariableNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/LinearInductionVariableNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/LoopCounterNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/EscapeOp.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/ExceptionExit.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/LIRGeneratorTool.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/ValueVisitor.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/virtual/VirtualObjectFieldNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/virtual/VirtualObjectNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/package-info.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.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/phases/LoweringPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/BlockClosure.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/BlockList.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/AMD64LIRAssembler.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/BlockWorkList.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/GraphUtil.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/Util.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/deopt/FrameModifierImpl.java graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/IntrinsifierImpl.java graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/SafeAddNode.java graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/opt/OptimizerImpl.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/ArrayWriteBarrier.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/CurrentThread.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/WriteBarrier.java
diffstat 262 files changed, 9497 insertions(+), 9536 deletions(-) [+]
line wrap: on
line diff
Binary file .test.txt.swo has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/ComputeLinearScanOrder.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,357 @@
+/*
+ * 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.alloc;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
+import com.oracle.max.graal.compiler.lir.*;
+import com.oracle.max.graal.graph.*;
+
+public final class ComputeLinearScanOrder {
+
+    private final int maxBlockId; // the highest blockId of a block
+    private int numBlocks; // total number of blocks (smaller than maxBlockId)
+
+    List<LIRBlock> linearScanOrder; // the resulting list of blocks in correct order
+    List<LIRBlock> codeEmittingOrder;
+
+    final BitMap visitedBlocks; // used for recursive processing of blocks
+    final BitMap activeBlocks; // used for recursive processing of blocks
+    final BitMap dominatorBlocks; // temporary BitMap used for computation of dominator
+    final int[] forwardBranches; // number of incoming forward branches for each block
+    final List<LIRBlock> workList; // temporary list (used in markLoops and computeOrder)
+    final LIRBlock[] loopHeaders;
+
+    // accessors for visitedBlocks and activeBlocks
+    void initVisited() {
+        activeBlocks.clearAll();
+        visitedBlocks.clearAll();
+    }
+
+    boolean isVisited(LIRBlock b) {
+        return visitedBlocks.get(b.blockID());
+    }
+
+    boolean isActive(LIRBlock b) {
+        return activeBlocks.get(b.blockID());
+    }
+
+    void setVisited(LIRBlock b) {
+        assert !isVisited(b) : "already set";
+        visitedBlocks.set(b.blockID());
+    }
+
+    void setActive(LIRBlock b) {
+        assert !isActive(b) : "already set";
+        activeBlocks.set(b.blockID());
+    }
+
+    void clearActive(LIRBlock b) {
+        assert isActive(b) : "not already";
+        activeBlocks.clear(b.blockID());
+    }
+
+    // accessors for forwardBranches
+    void incForwardBranches(LIRBlock b) {
+        forwardBranches[b.blockID()]++;
+    }
+
+    int decForwardBranches(LIRBlock b) {
+        return --forwardBranches[b.blockID()];
+    }
+
+    // accessors for final result
+    public List<LIRBlock> linearScanOrder() {
+        return linearScanOrder;
+    }
+
+    public ComputeLinearScanOrder(int maxBlockId, int loopCount, LIRBlock startBlock) {
+        loopHeaders = new LIRBlock[loopCount];
+
+        this.maxBlockId = maxBlockId;
+        visitedBlocks = new BitMap(maxBlockId);
+        activeBlocks = new BitMap(maxBlockId);
+        dominatorBlocks = new BitMap(maxBlockId);
+        forwardBranches = new int[maxBlockId];
+        workList = new ArrayList<LIRBlock>(8);
+
+        countEdges(startBlock, null);
+        computeOrder(startBlock);
+        printBlocks();
+    }
+
+    /**
+     * Traverses the CFG to analyze block and edge info. The analysis performed is:
+     *
+     * 1. Count of total number of blocks.
+     * 2. Count of all incoming edges and backward incoming edges.
+     * 3. Number loop header blocks.
+     * 4. Create a list with all loop end blocks.
+     */
+    void countEdges(LIRBlock cur, LIRBlock parent) {
+        if (GraalOptions.TraceLinearScanLevel >= 3) {
+            TTY.println("Counting edges for block B%d%s", cur.blockID(), parent == null ? "" : " coming from B" + parent.blockID());
+        }
+
+        if (isActive(cur)) {
+            return;
+        }
+
+        // increment number of incoming forward branches
+        incForwardBranches(cur);
+
+        if (isVisited(cur)) {
+            if (GraalOptions.TraceLinearScanLevel >= 3) {
+                TTY.println("block already visited");
+            }
+            return;
+        }
+
+        numBlocks++;
+        setVisited(cur);
+        setActive(cur);
+
+        // recursive call for all successors
+        int i;
+        for (i = cur.numberOfSux() - 1; i >= 0; i--) {
+            countEdges(cur.suxAt(i), cur);
+        }
+
+        clearActive(cur);
+
+        if (GraalOptions.TraceLinearScanLevel >= 3) {
+            TTY.println("Finished counting edges for block B%d", cur.blockID());
+        }
+    }
+
+    int computeWeight(LIRBlock cur) {
+
+        // limit loop-depth to 15 bit (only for security reason, it will never be so big)
+        int weight = (cur.loopDepth() & 0x7FFF) << 16;
+
+        int curBit = 15;
+
+        // this is necessary for the (very rare) case that two successive blocks have
+        // the same loop depth, but a different loop index (can happen for endless loops
+        // with exception handlers)
+//        if (!cur.isLinearScanLoopHeader()) {
+//            weight |= 1 << curBit;
+//        }
+//        curBit--;
+
+        // loop end blocks (blocks that end with a backward branch) are added
+        // after all other blocks of the loop.
+        if (!cur.isLinearScanLoopEnd()) {
+            weight |= 1 << curBit;
+        }
+        curBit--;
+
+        // critical edge split blocks are preferred because then they have a greater
+        // probability to be completely empty
+        //if (cur.isCriticalEdgeSplit()) {
+        //    weight |= 1 << curBit;
+        //}
+        //curBit--;
+
+        // exceptions should not be thrown in normal control flow, so these blocks
+        // are added as late as possible
+//        if (!(cur.end() instanceof Throw) && (singleSux == null || !(singleSux.end() instanceof Throw))) {
+//            weight |= 1 << curBit;
+//        }
+//        curBit--;
+//        if (!(cur.end() instanceof Return) && (singleSux == null || !(singleSux.end() instanceof Return))) {
+//            weight |= 1 << curBit;
+//        }
+//        curBit--;
+
+        // exceptions handlers are added as late as possible
+        if (!cur.isExceptionEntry()) {
+            weight |= 1 << curBit;
+        }
+        curBit--;
+
+        // guarantee that weight is > 0
+        weight |= 1;
+
+        assert curBit >= 0 : "too many flags";
+        assert weight > 0 : "weight cannot become negative";
+
+        return weight;
+    }
+
+    private boolean readyForProcessing(LIRBlock cur) {
+        // Discount the edge just traveled.
+        // When the number drops to zero, all forward branches were processed
+        if (decForwardBranches(cur) != 0) {
+            return false;
+        }
+
+        assert !linearScanOrder.contains(cur) : "block already processed (block can be ready only once)";
+        assert !workList.contains(cur) : "block already in work-list (block can be ready only once)";
+        return true;
+    }
+
+    private void sortIntoWorkList(LIRBlock cur) {
+        assert !workList.contains(cur) : "block already in work list";
+
+        int curWeight = computeWeight(cur);
+
+        // the linearScanNumber is used to cache the weight of a block
+        cur.setLinearScanNumber(curWeight);
+
+        if (GraalOptions.StressLinearScan) {
+            workList.add(0, cur);
+            return;
+        }
+
+        workList.add(null); // provide space for new element
+
+        int insertIdx = workList.size() - 1;
+        while (insertIdx > 0 && workList.get(insertIdx - 1).linearScanNumber() > curWeight) {
+            workList.set(insertIdx, workList.get(insertIdx - 1));
+            insertIdx--;
+        }
+        workList.set(insertIdx, cur);
+
+        if (GraalOptions.TraceLinearScanLevel >= 3) {
+            TTY.println("Sorted B%d into worklist. new worklist:", cur.blockID());
+            for (int i = 0; i < workList.size(); i++) {
+                TTY.println(String.format("%8d B%02d  weight:%6x", i, workList.get(i).blockID(), workList.get(i).linearScanNumber()));
+            }
+        }
+
+        for (int i = 0; i < workList.size(); i++) {
+            assert workList.get(i).linearScanNumber() > 0 : "weight not set";
+            assert i == 0 || workList.get(i - 1).linearScanNumber() <= workList.get(i).linearScanNumber() : "incorrect order in worklist";
+        }
+    }
+
+    private void appendBlock(LIRBlock cur) {
+        if (GraalOptions.TraceLinearScanLevel >= 3) {
+            TTY.println("appending block B%d (weight 0x%06x) to linear-scan order", cur.blockID(), cur.linearScanNumber());
+        }
+        assert !linearScanOrder.contains(cur) : "cannot add the same block twice";
+
+        // currently, the linear scan order and code emit order are equal.
+        // therefore the linearScanNumber and the weight of a block must also
+        // be equal.
+        cur.setLinearScanNumber(linearScanOrder.size());
+        linearScanOrder.add(cur);
+
+        if (!cur.isLinearScanLoopHeader() || !GraalOptions.OptReorderLoops) {
+            codeEmittingOrder.add(cur);
+
+            if (cur.isLinearScanLoopEnd() && GraalOptions.OptReorderLoops) {
+                LIRBlock loopHeader = loopHeaders[cur.loopIndex()];
+                assert loopHeader != null;
+                codeEmittingOrder.add(loopHeader);
+
+                for (LIRBlock succ : loopHeader.blockSuccessors()) {
+                    if (succ.loopDepth() == loopHeader.loopDepth()) {
+                        succ.setAlign(true);
+                    }
+                }
+            }
+        } else {
+            loopHeaders[cur.loopIndex()] = cur;
+        }
+    }
+
+    private void computeOrder(LIRBlock startBlock) {
+        if (GraalOptions.TraceLinearScanLevel >= 3) {
+            TTY.println("----- computing final block order");
+        }
+
+        // the start block is always the first block in the linear scan order
+        linearScanOrder = new ArrayList<LIRBlock>(numBlocks);
+
+        codeEmittingOrder = new ArrayList<LIRBlock>(numBlocks);
+
+        // start processing with standard entry block
+        assert workList.isEmpty() : "list must be empty before processing";
+
+        assert readyForProcessing(startBlock);
+        sortIntoWorkList(startBlock);
+
+        do {
+            LIRBlock cur = workList.remove(workList.size() - 1);
+            appendBlock(cur);
+
+            int i;
+            int numSux = cur.numberOfSux();
+            // changed loop order to get "intuitive" order of if- and else-blocks
+            for (i = 0; i < numSux; i++) {
+                LIRBlock sux = cur.suxAt(i);
+                if (readyForProcessing(sux)) {
+                    sortIntoWorkList(sux);
+                }
+            }
+        } while (workList.size() > 0);
+    }
+
+    public void printBlocks() {
+        if (GraalOptions.TraceLinearScanLevel >= 2) {
+            TTY.println("----- loop information:");
+            for (LIRBlock cur : linearScanOrder) {
+                TTY.print(String.format("%4d: B%02d: ", cur.linearScanNumber(), cur.blockID()));
+                TTY.println(String.format(" . loopIndex: %2d, loopDepth: %2d", cur.loopIndex(), cur.loopDepth()));
+            }
+        }
+
+        if (GraalOptions.TraceLinearScanLevel >= 1) {
+            TTY.println("----- linear-scan block order:");
+            for (LIRBlock cur : linearScanOrder) {
+                TTY.print(String.format("%4d: B%02d    loop: %2d  depth: %2d", cur.linearScanNumber(), cur.blockID(), cur.loopIndex(), cur.loopDepth()));
+
+                TTY.print(cur.isLinearScanLoopHeader() ? " lh" : "   ");
+                TTY.print(cur.isLinearScanLoopEnd() ? " le" : "   ");
+
+                TTY.print("    dom: null ");
+
+
+                if (cur.numberOfPreds() > 0) {
+                    TTY.print("    preds: ");
+                    for (int j = 0; j < cur.numberOfPreds(); j++) {
+                        LIRBlock pred = cur.predAt(j);
+                        TTY.print("B%d ", pred.blockID());
+                    }
+                }
+                if (cur.numberOfSux() > 0) {
+                    TTY.print("    sux: ");
+                    for (int j = 0; j < cur.numberOfSux(); j++) {
+                        LIRBlock sux = cur.suxAt(j);
+                        TTY.print("B%d ", sux.blockID());
+                    }
+                }
+                TTY.println();
+            }
+        }
+    }
+
+    public List<LIRBlock> codeEmittingOrder() {
+        return codeEmittingOrder;
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/ControlFlowOptimizer.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/ControlFlowOptimizer.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,8 +26,8 @@
 
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.sun.cri.ci.*;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/EdgeMoveOptimizer.java	Wed Aug 10 00:34:29 2011 +0200
@@ -25,8 +25,8 @@
 import java.util.*;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 
 /**
  * This class optimizes moves, particularly those that result from eliminating SSA form.
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Wed Aug 10 00:34:29 2011 +0200
@@ -35,12 +35,12 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
 import com.oracle.max.graal.compiler.lir.LIRInstruction.OperandMode;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.base.FrameState.ValueProcedure;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.extensions.*;
@@ -838,8 +838,8 @@
                 ValueNode instr = operand.isVariable() ? gen.operands.instructionForResult(((CiVariable) operand)) : null;
                 TTY.println(" var %d (HIR instruction %s)", operandNum, instr == null ? " " : instr.toString());
 
-                if (instr instanceof Phi) {
-                    Phi phi = (Phi) instr;
+                if (instr instanceof PhiNode) {
+                    PhiNode phi = (PhiNode) instr;
                     TTY.println("phi block begin: " + phi.merge());
                     TTY.println("pred count on blockbegin: " + phi.merge().phiPredecessorCount());
                     TTY.println("phi values: " + phi.valueCount());
@@ -1887,9 +1887,9 @@
                 return ciObj;
             } else if (value != null && value.operand() != CiValue.IllegalValue) {
                 CiValue operand = value.operand();
-                Constant con = null;
-                if (value instanceof Constant) {
-                    con = (Constant) value;
+                ConstantNode con = null;
+                if (value instanceof ConstantNode) {
+                    con = (ConstantNode) value;
                 }
 
                 assert con == null || operand.isVariable() || operand.isConstant() || operand.isIllegal() : "Constant instructions have only constant operands (or illegal if constant is optimized away)";
@@ -1923,7 +1923,7 @@
                     assert false : "must not reach here";
                     return operand;
                 } else {
-                    assert value instanceof Constant;
+                    assert value instanceof ConstantNode;
                     assert operand.isConstant() : "operand must be constant";
                     return operand;
                 }
@@ -2008,8 +2008,8 @@
                                         }
                                         currentField = ((VirtualObjectFieldNode) currentField).lastState();
                                     } else {
-                                        assert currentField instanceof Phi : currentField;
-                                        currentField = (FloatingNode) ((Phi) currentField).valueAt(0);
+                                        assert currentField instanceof PhiNode : currentField;
+                                        currentField = (FloatingNode) ((PhiNode) currentField).valueAt(0);
                                     }
                                 } while (currentField != null);
                             }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/BlockPrinter.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/BlockPrinter.java	Wed Aug 10 00:34:29 2011 +0200
@@ -23,14 +23,13 @@
 package com.oracle.max.graal.compiler.debug;
 
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.graph.*;
 
 /**
- * Prints a listing for a {@linkplain Merge block}.
+ * Prints a listing for a {@linkplain MergeNode block}.
  */
 public class BlockPrinter implements BlockClosure {
 
@@ -45,7 +44,7 @@
     public void apply(Block block) {
         if (cfgOnly) {
             if (block.getInstructions().size() > 0) {
-                ip.printInstruction((FixedNodeWithNext) block.getInstructions().get(0));
+                ip.printInstruction((FixedWithNextNode) block.getInstructions().get(0));
             } else {
                 ip.out().println("Empty block");
             }
@@ -62,8 +61,8 @@
         ip.printInstructionListingHeader();
 
         for (Node i : block.getInstructions()) {
-            if (i instanceof FixedNodeWithNext) {
-                ip.printInstructionListing((FixedNodeWithNext) i);
+            if (i instanceof FixedWithNextNode) {
+                ip.printInstructionListing((FixedWithNextNode) i);
             }
         }
         out.println();
@@ -87,8 +86,8 @@
                 i++;
             } else {
                 i += value.kind.sizeInSlots();
-                if (value instanceof Phi) {
-                    Phi phi = (Phi) value;
+                if (value instanceof PhiNode) {
+                    PhiNode phi = (PhiNode) value;
                     if (phi.operand() != null) {
                         out.print(" ");
                         out.print(phi.operand().toString());
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/CFGPrinter.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/CFGPrinter.java	Wed Aug 10 00:34:29 2011 +0200
@@ -29,7 +29,6 @@
 import com.oracle.max.graal.compiler.alloc.*;
 import com.oracle.max.graal.compiler.alloc.Interval.UsePosList;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
 import com.oracle.max.graal.compiler.lir.LIRInstruction.OperandFormatter;
 import com.oracle.max.graal.compiler.nodes.base.*;
@@ -409,8 +408,8 @@
         out.println("HIR");
         out.disableIndentation();
         for (Node i : block.getInstructions()) {
-            if (i instanceof FixedNodeWithNext) {
-                printInstructionHIR((FixedNodeWithNext) i);
+            if (i instanceof FixedWithNextNode) {
+                printInstructionHIR((FixedWithNextNode) i);
             }
         }
         out.enableIndentation();
@@ -515,7 +514,7 @@
      *
      * @param i the instruction for which HIR will be printed
      */
-    private void printInstructionHIR(FixedNodeWithNext i) {
+    private void printInstructionHIR(FixedWithNextNode i) {
         out.print("bci ").print(-1).println(COLUMN_END);
         if (i.operand().isLegal()) {
             out.print("result ").print(new CFGOperandFormatter(false).format(i.operand())).println(COLUMN_END);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/GraphvizPrinterObserver.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/GraphvizPrinterObserver.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,9 +26,7 @@
 import java.util.regex.*;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graphviz.*;
@@ -100,10 +98,10 @@
             printer.addOmittedClass(FrameState.class);
         }
         printer.addClassColor(StartNode.class, "snow3");
-        printer.addClassColor(LoopBegin.class, "skyblue");
-        printer.addClassColor(LoopEnd.class, "skyblue3");
+        printer.addClassColor(LoopBeginNode.class, "skyblue");
+        printer.addClassColor(LoopEndNode.class, "skyblue3");
         printer.addClassColor(UnwindNode.class, "red");
-        printer.addClassColor(Return.class, "indianred1");
+        printer.addClassColor(ReturnNode.class, "indianred1");
         printer.begin(name);
         printer.print(graph, true);
         printer.end();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,8 +28,8 @@
 import java.util.Map.Entry;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.loop.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.compiler.util.LoopUtil.Loop;
@@ -272,7 +272,7 @@
             Block block = nodeToBlock == null ? null : nodeToBlock.get(node);
             if (block != null) {
                 stream.printf("    <p name='block'>%d</p>%n", block.blockID());
-                if (!(node instanceof Phi || node instanceof FrameState || node instanceof Local || node instanceof LoopCounter) && !block.getInstructions().contains(node)) {
+                if (!(node instanceof PhiNode || node instanceof FrameState || node instanceof LocalNode || node instanceof LoopCounterNode) && !block.getInstructions().contains(node)) {
                     stream.println("    <p name='notInOwnBlock'>true</p>");
                 }
             } else {
@@ -386,7 +386,7 @@
             // if this is the first block: add all locals to this block
             if (block.getInstructions().size() > 0  && block.getInstructions().get(0) == graph.start()) {
                 for (Node node : graph.getNodes()) {
-                    if (node instanceof Local) {
+                    if (node instanceof LocalNode) {
                         nodes.add(node);
                     }
                 }
@@ -397,9 +397,9 @@
                 if (node instanceof StateSplit && ((StateSplit) node).stateAfter() != null) {
                     nodes.add(((StateSplit) node).stateAfter());
                 }
-                if (node instanceof Merge) {
+                if (node instanceof MergeNode) {
                     for (Node usage : node.usages()) {
-                        if (usage instanceof Phi || usage instanceof LoopCounter) {
+                        if (usage instanceof PhiNode || usage instanceof LoopCounterNode) {
                             nodes.add(usage);
                         }
                     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/InstructionPrinter.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/InstructionPrinter.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,13 +24,12 @@
 
 import static com.oracle.max.graal.compiler.debug.InstructionPrinter.InstructionLineColumn.*;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 
 /**
  * A {@link ValueVisitor} for {@linkplain #printInstruction(ValueNode) printing}
- * an {@link FixedNodeWithNext} as an expression or statement.
+ * an {@link FixedWithNextNode} as an expression or statement.
  *
  * @author Doug Simon
  */
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java	Wed Aug 10 00:34:29 2011 +0200
@@ -37,14 +37,14 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.globalstub.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.lir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.DeoptimizeNode.DeoptAction;
 import com.oracle.max.graal.compiler.nodes.base.FrameState.ValueProcedure;
-import com.oracle.max.graal.compiler.nodes.cfg.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.graph.*;
@@ -321,18 +321,18 @@
     }
 
     @Override
-    public void visitMerge(Merge x) {
-        if (x.next() instanceof LoopBegin) {
-            moveToPhi((LoopBegin) x.next(), x);
+    public void visitMerge(MergeNode x) {
+        if (x.next() instanceof LoopBeginNode) {
+            moveToPhi((LoopBeginNode) x.next(), x);
         }
     }
 
     @Override
-    public void visitArrayLength(ArrayLength x) {
+    public void visitArrayLength(ArrayLengthNode x) {
         emitArrayLength(x);
     }
 
-    public CiValue emitArrayLength(ArrayLength x) {
+    public CiValue emitArrayLength(ArrayLengthNode x) {
         XirArgument array = toXirArgument(x.array());
         XirSnippet snippet = xir.genArrayLength(site(x), array);
         emitXir(snippet, x, stateFor(x), null, true);
@@ -343,7 +343,7 @@
         CiCallingConvention args = compilation.frameMap().incomingArguments();
         int bci = 0;
         if (Modifier.isSynchronized(compilation.method.accessFlags())) {
-            bci = FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI;
+            bci = FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI;
         }
 
         boolean withReceiver = !Modifier.isStatic(compilation.method.accessFlags());
@@ -357,8 +357,8 @@
 
         FrameState fs = new FrameState(compilation.method, bci, compilation.method.maxLocals(), 0, 0, false, compilation.graph);
         for (Node node : compilation.graph.start().usages()) {
-            if (node instanceof Local) {
-                Local local = (Local) node;
+            if (node instanceof LocalNode) {
+                LocalNode local = (LocalNode) node;
                 int i = local.index();
                 fs.storeLocal(argumentSlots[i], local);
 
@@ -388,14 +388,14 @@
     }
 
     @Override
-    public void visitCheckCast(CheckCast x) {
+    public void visitCheckCast(CheckCastNode x) {
         XirArgument obj = toXirArgument(x.object());
         XirSnippet snippet = xir.genCheckCast(site(x), obj, toXirArgument(x.targetClassInstruction()), x.targetClass());
         emitXir(snippet, x, stateFor(x), null, true);
     }
 
     @Override
-    public void visitMonitorEnter(MonitorEnter x) {
+    public void visitMonitorEnter(MonitorEnterNode x) {
         XirArgument obj = toXirArgument(x.object());
         XirArgument lockAddress = toXirArgument(x.lockAddress());
         XirSnippet snippet = xir.genMonitorEnter(site(x), obj, lockAddress);
@@ -403,7 +403,7 @@
     }
 
     @Override
-    public void visitMonitorExit(MonitorExit x) {
+    public void visitMonitorExit(MonitorExitNode x) {
         XirArgument obj = toXirArgument(x.object());
         XirArgument lockAddress = toXirArgument(x.lockAddress());
         XirSnippet snippet = xir.genMonitorExit(site(x), obj, lockAddress);
@@ -421,27 +421,27 @@
     }
 
     @Override
-    public void visitNewInstance(NewInstance x) {
+    public void visitNewInstance(NewInstanceNode x) {
         XirSnippet snippet = xir.genNewInstance(site(x), x.instanceClass());
         emitXir(snippet, x, stateFor(x), null, true);
     }
 
     @Override
-    public void visitNewTypeArray(NewTypeArray x) {
+    public void visitNewTypeArray(NewTypeArrayNode x) {
         XirArgument length = toXirArgument(x.length());
         XirSnippet snippet = xir.genNewArray(site(x), length, x.elementKind(), null, null);
         emitXir(snippet, x, stateFor(x), null, true);
     }
 
     @Override
-    public void visitNewObjectArray(NewObjectArray x) {
+    public void visitNewObjectArray(NewObjectArrayNode x) {
         XirArgument length = toXirArgument(x.length());
         XirSnippet snippet = xir.genNewArray(site(x), length, CiKind.Object, x.elementType(), x.exactType());
         emitXir(snippet, x, stateFor(x), null, true);
     }
 
     @Override
-    public void visitNewMultiArray(NewMultiArray x) {
+    public void visitNewMultiArray(NewMultiArrayNode x) {
         XirArgument[] dims = new XirArgument[x.dimensionCount()];
 
         for (int i = 0; i < dims.length; i++) {
@@ -460,7 +460,7 @@
 
 
     @Override
-    public void visitConstant(Constant x) {
+    public void visitConstant(ConstantNode x) {
         if (!canInlineAsConstant(x)) {
             CiValue res = x.operand();
             if (!(res.isLegal())) {
@@ -476,7 +476,7 @@
     }
 
     @Override
-    public void visitExceptionObject(ExceptionObject x) {
+    public void visitExceptionObject(ExceptionObjectNode x) {
         XirSnippet snippet = xir.genExceptionObject(site(x));
         emitXir(snippet, x, null, null, true);
 //        lastState = lastState.duplicateWithException(lastState.bci, x);
@@ -489,19 +489,19 @@
     }
 
     @Override
-    public void visitAnchor(Anchor x) {
+    public void visitAnchor(AnchorNode x) {
         setNoResult(x);
     }
 
     @Override
-    public void visitIf(If x) {
+    public void visitIf(IfNode x) {
         assert x.defaultSuccessor() == x.falseSuccessor() : "wrong destination";
         emitBooleanBranch(x.compare(), getLIRBlock(x.trueSuccessor()),  getLIRBlock(x.falseSuccessor()), null);
     }
 
     public void emitBranch(BooleanNode n, Condition cond, LIRBlock trueSuccessor, LIRBlock falseSucc) {
-        if (n instanceof Compare) {
-            Compare compare = (Compare) n;
+        if (n instanceof CompareNode) {
+            CompareNode compare = (CompareNode) n;
             if (compare.x().kind.isFloat() || compare.x().kind.isDouble()) {
                 LIRBlock unorderedSuccBlock = falseSucc;
                 if (compare.unorderedIsTrue()) {
@@ -517,20 +517,20 @@
     public void emitBooleanBranch(BooleanNode node, LIRBlock trueSuccessor, LIRBlock falseSuccessor, LIRDebugInfo info) {
         if (node instanceof NegateBooleanNode) {
             emitBooleanBranch(((NegateBooleanNode) node).value(), falseSuccessor, trueSuccessor, info);
-        } else if (node instanceof IsNonNull) {
-            emitIsNonNullBranch((IsNonNull) node, trueSuccessor, falseSuccessor);
-        } else if (node instanceof Compare) {
-            emitCompare((Compare) node, trueSuccessor, falseSuccessor);
-        } else if (node instanceof InstanceOf) {
+        } else if (node instanceof IsNonNullNode) {
+            emitIsNonNullBranch((IsNonNullNode) node, trueSuccessor, falseSuccessor);
+        } else if (node instanceof CompareNode) {
+            emitCompare((CompareNode) node, trueSuccessor, falseSuccessor);
+        } else if (node instanceof InstanceOfNode) {
             emitInstanceOf((TypeCheckNode) node, trueSuccessor, falseSuccessor, info);
-        } else if (node instanceof Constant) {
-            emitConstantBranch(((Constant) node).asConstant().asBoolean(), trueSuccessor, falseSuccessor, info);
+        } else if (node instanceof ConstantNode) {
+            emitConstantBranch(((ConstantNode) node).asConstant().asBoolean(), trueSuccessor, falseSuccessor, info);
         } else {
             throw Util.unimplemented(node.toString());
         }
     }
 
-    private void emitIsNonNullBranch(IsNonNull node, LIRBlock trueSuccessor, LIRBlock falseSuccessor) {
+    private void emitIsNonNullBranch(IsNonNullNode node, LIRBlock trueSuccessor, LIRBlock falseSuccessor) {
         Condition cond = Condition.NE;
         if (trueSuccessor == null) {
             cond = cond.negate();
@@ -580,7 +580,7 @@
         }
     }
 
-    public void emitCompare(Compare compare, LIRBlock trueSuccessorBlock, LIRBlock falseSuccessorBlock) {
+    public void emitCompare(CompareNode compare, LIRBlock trueSuccessorBlock, LIRBlock falseSuccessorBlock) {
         CiKind kind = compare.x().kind;
 
         Condition cond = compare.condition();
@@ -623,16 +623,16 @@
         }
     }
 
-    protected FrameState stateBeforeInvokeReturn(Invoke invoke) {
+    protected FrameState stateBeforeInvokeReturn(InvokeNode invoke) {
         return invoke.stateAfter().duplicateModified(invoke.bci, invoke.stateAfter().rethrowException(), invoke.kind);
     }
 
-    protected FrameState stateBeforeInvokeWithArguments(Invoke invoke) {
+    protected FrameState stateBeforeInvokeWithArguments(InvokeNode invoke) {
         return invoke.stateAfter().duplicateModified(invoke.bci, invoke.stateAfter().rethrowException(), invoke.kind, invoke.arguments().toArray(new ValueNode[0]));
     }
 
     @Override
-    public void visitInvoke(Invoke x) {
+    public void visitInvoke(InvokeNode x) {
         RiMethod target = x.target();
         LIRDebugInfo info = stateFor(x, stateBeforeInvokeWithArguments(x));
         LIRDebugInfo info2 = stateFor(x, stateBeforeInvokeReturn(x));
@@ -695,13 +695,13 @@
         }
     }
 
-    private CiKind[] getSignature(Invoke x) {
+    private CiKind[] getSignature(InvokeNode x) {
         CiKind receiver = x.isStatic() ? null : x.target.holder().kind();
         return Util.signatureToKinds(x.target.signature(), receiver);
     }
 
     @Override
-    public void visitMonitorAddress(MonitorAddress x) {
+    public void visitMonitorAddress(MonitorAddressNode x) {
         CiValue result = createResultVariable(x);
         lir.monitorAddress(x.monitorIndex(), result);
     }
@@ -710,7 +710,7 @@
      * For note on volatile fields, see {@link #visitStoreField(StoreField)}.
      */
     @Override
-    public void visitLoadField(LoadField x) {
+    public void visitLoadField(LoadFieldNode x) {
         RiField field = x.field();
         LIRDebugInfo info = stateFor(x);
         XirArgument receiver = toXirArgument(x.object());
@@ -723,7 +723,7 @@
     }
 
     @Override
-    public void visitLoadIndexed(LoadIndexed x) {
+    public void visitLoadIndexed(LoadIndexedNode x) {
         XirArgument array = toXirArgument(x.array());
         XirArgument index = toXirArgument(x.index());
         XirArgument length = toXirArgument(x.length());
@@ -750,14 +750,14 @@
     }
 
     @Override
-    public void visitLocal(Local x) {
+    public void visitLocal(LocalNode x) {
         if (x.operand().isIllegal()) {
             createResultVariable(x);
         }
     }
 
     @Override
-    public void visitLookupSwitch(LookupSwitch x) {
+    public void visitLookupSwitch(LookupSwitchNode x) {
         CiValue tag = load(x.value());
         setNoResult(x);
 
@@ -785,7 +785,7 @@
     }
 
     @Override
-    public void visitFixedGuard(FixedGuard fixedGuard) {
+    public void visitFixedGuard(FixedGuardNode fixedGuard) {
         for (Node n : fixedGuard.inputs()) {
             if (n != null) {
                 emitGuardComp((BooleanNode) n);
@@ -794,20 +794,20 @@
     }
 
     public void emitGuardComp(BooleanNode comp) {
-        if (comp instanceof IsNonNull) {
-            IsNonNull x = (IsNonNull) comp;
+        if (comp instanceof IsNonNullNode) {
+            IsNonNullNode x = (IsNonNullNode) comp;
             CiValue value = load(x.object());
             LIRDebugInfo info = stateFor(x);
             lir.nullCheck(value, info);
-        } else if (comp instanceof IsType) {
-            IsType x = (IsType) comp;
+        } else if (comp instanceof IsTypeNode) {
+            IsTypeNode x = (IsTypeNode) comp;
             load(x.object());
             LIRDebugInfo info = stateFor(x);
             XirArgument clazz = toXirArgument(x.type().getEncoding(Representation.ObjectHub));
             XirSnippet typeCheck = xir.genTypeCheck(site(x), toXirArgument(x.object()), clazz, x.type());
             emitXir(typeCheck, x, info, compilation.method, false);
         } else {
-            if (comp instanceof Constant && comp.asConstant().asBoolean()) {
+            if (comp instanceof ConstantNode && comp.asConstant().asBoolean()) {
                 // Nothing to emit.
             } else {
                 DeoptimizationStub stub = createDeoptStub();
@@ -836,12 +836,12 @@
 
 
     @Override
-    public void visitPhi(Phi i) {
+    public void visitPhi(PhiNode i) {
         Util.shouldNotReachHere();
     }
 
     @Override
-    public void visitReturn(Return x) {
+    public void visitReturn(ReturnNode x) {
         if (x.kind.isVoid()) {
             XirSnippet epilogue = xir.genEpilogue(site(x), compilation.method);
             if (epilogue != null) {
@@ -1093,9 +1093,9 @@
     }
 
     @Override
-    public void visitDeoptimize(Deoptimize deoptimize) {
+    public void visitDeoptimize(DeoptimizeNode deoptimize) {
         assert lastState != null : "deoptimize always needs a state";
-        assert lastState.bci != FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI : "bci must not be -1 for deopt framestate";
+        assert lastState.bci != FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI : "bci must not be -1 for deopt framestate";
         DeoptimizationStub stub = new DeoptimizationStub(deoptimize.action(), lastState);
         addDeoptimizationStub(stub);
         lir.branch(Condition.TRUE, stub.label, stub.info);
@@ -1150,7 +1150,7 @@
         return operand;
     }
 
-    private CiVariable loadConstant(Constant x) {
+    private CiVariable loadConstant(ConstantNode x) {
         return loadConstant(x.asConstant(), x.kind);
     }
 
@@ -1185,7 +1185,7 @@
     }
 
     @Override
-    public void visitRegisterFinalizer(RegisterFinalizer x) {
+    public void visitRegisterFinalizer(RegisterFinalizerNode x) {
         CiValue receiver = load(x.object());
         LIRDebugInfo info = stateFor(x);
         callRuntime(CiRuntimeCall.RegisterFinalizer, info, receiver);
@@ -1375,7 +1375,7 @@
         return result;
     }
 
-    SwitchRange[] createLookupRanges(LookupSwitch x) {
+    SwitchRange[] createLookupRanges(LookupSwitchNode x) {
         // we expect the keys to be sorted by increasing value
         List<SwitchRange> res = new ArrayList<SwitchRange>(x.numberOfCases());
         int len = x.numberOfCases();
@@ -1536,7 +1536,7 @@
 
 
     @Override
-    public void visitLoopEnd(LoopEnd x) {
+    public void visitLoopEnd(LoopEndNode x) {
         setNoResult(x);
         moveToPhi(x.loopBegin(), x);
         if (GraalOptions.GenSafepoints) {
@@ -1545,22 +1545,22 @@
         lir.jump(getLIRBlock(x.loopBegin()));
     }
 
-    private void moveToPhi(Merge merge, Node pred) {
+    private void moveToPhi(MergeNode merge, Node pred) {
         if (GraalOptions.TraceLIRGeneratorLevel >= 1) {
             TTY.println("MOVE TO PHI from " + pred + " to " + merge);
         }
         int nextSuccIndex = merge.phiPredecessorIndex(pred);
         PhiResolver resolver = new PhiResolver(this);
-        for (Phi phi : merge.phis()) {
+        for (PhiNode phi : merge.phis()) {
             if (phi.type() == PhiType.Value) {
                 ValueNode curVal = phi.valueAt(nextSuccIndex);
                 if (curVal != null && curVal != phi) {
-                    if (curVal instanceof Phi) {
-                        operandForPhi((Phi) curVal);
+                    if (curVal instanceof PhiNode) {
+                        operandForPhi((PhiNode) curVal);
                     }
                     CiValue operand = curVal.operand();
                     if (operand.isIllegal()) {
-                        assert curVal instanceof Constant || curVal instanceof Local : "these can be produced lazily" + curVal + "/" + phi;
+                        assert curVal instanceof ConstantNode || curVal instanceof LocalNode : "these can be produced lazily" + curVal + "/" + phi;
                         operand = operandForInstruction(curVal);
                     }
                     resolver.move(operand, operandForPhi(phi));
@@ -1584,10 +1584,10 @@
     CiValue operandForInstruction(ValueNode x) {
         CiValue operand = x.operand();
         if (operand.isIllegal()) {
-            if (x instanceof Constant) {
+            if (x instanceof ConstantNode) {
                 x.setOperand(x.asConstant());
             } else {
-                assert x instanceof Phi || x instanceof Local : "only for Phi and Local : " + x;
+                assert x instanceof PhiNode || x instanceof LocalNode : "only for Phi and Local : " + x;
                 // allocate a variable for this local or phi
                 createResultVariable(x);
             }
@@ -1595,7 +1595,7 @@
         return x.operand();
     }
 
-    private CiValue operandForPhi(Phi phi) {
+    private CiValue operandForPhi(PhiNode phi) {
         assert phi.type() == PhiType.Value : "wrong phi type: " + phi.id();
         if (phi.operand().isIllegal()) {
             // allocate a variable for this phi
@@ -1661,9 +1661,9 @@
             public void doValue(ValueNode value) {
                 if (value == x) {
                     // nothing to do, will be visited shortly
-                } else if (value instanceof Phi && ((Phi) value).type() == PhiType.Value) {
+                } else if (value instanceof PhiNode && ((PhiNode) value).type() == PhiType.Value) {
                     // phi's are special
-                    operandForPhi((Phi) value);
+                    operandForPhi((PhiNode) value);
                 } else if (value.operand().isIllegal()) {
                     // instruction doesn't have an operand yet
                     CiValue operand = makeOperand(value);
@@ -1685,7 +1685,7 @@
         return new LIRDebugInfo(state);
     }
 
-    List<CiValue> visitInvokeArguments(CiCallingConvention cc, Invoke x, List<CiValue> pointerSlots) {
+    List<CiValue> visitInvokeArguments(CiCallingConvention cc, InvokeNode x, List<CiValue> pointerSlots) {
         // for each argument, load it into the correct location
         List<CiValue> argList = new ArrayList<CiValue>();
         int j = 0;
@@ -1730,10 +1730,10 @@
         }
         CiValue operand = instruction.operand();
         if (operand.isIllegal()) {
-            if (instruction instanceof Phi) {
+            if (instruction instanceof PhiNode) {
                 // a phi may not have an operand yet if it is for an exception block
-                operand = operandForPhi((Phi) instruction);
-            } else if (instruction instanceof Constant) {
+                operand = operandForPhi((PhiNode) instruction);
+            } else if (instruction instanceof ConstantNode) {
                 operand = operandForInstruction(instruction);
             }
         }
@@ -1858,7 +1858,7 @@
     public abstract Condition floatingPointCondition(Condition cond);
 
     @Override
-    public void visitConditional(Conditional conditional) {
+    public void visitConditional(ConditionalNode conditional) {
 
         BooleanNode condition = conditional.condition();
         LIRGenerator generator = this;
@@ -1874,8 +1874,8 @@
             negate = !negate;
             condition = ((NegateBooleanNode) condition).value();
         }
-        if (condition instanceof Compare) {
-            Compare compare = (Compare) condition;
+        if (condition instanceof CompareNode) {
+            CompareNode compare = (CompareNode) condition;
             ValueNode x = compare.x();
             ValueNode y = compare.y();
             cond = compare.condition();
@@ -1890,14 +1890,14 @@
             } else {
                 right = generator.makeOperand(y);
             }
-        } else if (condition instanceof IsNonNull) {
-            IsNonNull isNonNull = (IsNonNull) condition;
+        } else if (condition instanceof IsNonNullNode) {
+            IsNonNullNode isNonNull = (IsNonNullNode) condition;
             left = generator.load(isNonNull.object());
             right = CiConstant.NULL_OBJECT;
             cond = Condition.NE;
-        } else if (condition instanceof Constant) {
+        } else if (condition instanceof ConstantNode) {
             generator.lir().move(condition.asConstant(), generator.createResultVariable(conditional));
-        } else if (condition instanceof InstanceOf) {
+        } else if (condition instanceof InstanceOfNode) {
             if (conditional instanceof MaterializeNode && !negate) {
                 generator.emitMaterializeInstanceOf((MaterializeNode) conditional, conditional, null);
             } else {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/PhiResolver.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/PhiResolver.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,11 +26,11 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.sun.cri.ci.*;
 
 /**
- * Converts {@link Phi} instructions into moves.
+ * Converts {@link PhiNode} instructions into moves.
  *
  * Resolves cycles:
  * <pre>
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/PhiSimplifier.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/PhiSimplifier.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,7 +22,6 @@
  */
 package com.oracle.max.graal.compiler.gen;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.collections.*;
@@ -40,17 +39,17 @@
         cannotSimplify = graph.createNodeBitMap();
 
         for (Node n : graph.getNodes()) {
-            if (n instanceof Phi) {
-                simplify((Phi) n);
+            if (n instanceof PhiNode) {
+                simplify((PhiNode) n);
             }
         }
     }
 
     private ValueNode simplify(ValueNode x) {
-        if (x == null || !(x instanceof Phi)) {
+        if (x == null || !(x instanceof PhiNode)) {
             return x;
         }
-        Phi phi = (Phi) x;
+        PhiNode phi = (PhiNode) x;
 
         if (phi.valueCount() == 1 && !cannotSimplify.isMarked(phi)) {
             ValueNode result = phi.valueAt(0);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/BlockMap.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/BlockMap.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,7 +28,7 @@
 
 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.nodes.base.*;
 import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -121,7 +121,7 @@
         public boolean isLoopHeader;
         public int blockID;
 
-        public FixedNodeWithNext firstInstruction;
+        public FixedWithNextNode firstInstruction;
 
         final HashSet<Block> successors = new LinkedHashSet<Block>();
         private boolean visited;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/CompilerGraph.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/CompilerGraph.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,8 +22,7 @@
  */
 package com.oracle.max.graal.compiler.graph;
 
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -32,7 +31,7 @@
 public class CompilerGraph extends Graph {
 
     private RiRuntime runtime;
-    private Return returnSingleton;
+    private ReturnNode returnSingleton;
     private UnwindNode unwindSingleton;
     private CiAssumptions assumptions = new CiAssumptions();
 
@@ -40,12 +39,12 @@
         this.runtime = runtime;
     }
 
-    public void setReturn(Return returnNode) {
+    public void setReturn(ReturnNode returnNode) {
         assert returnSingleton == null;
         returnSingleton = returnNode;
     }
 
-    public Return getReturn() {
+    public ReturnNode getReturn() {
         return returnSingleton;
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/IR.java	Wed Aug 10 00:34:29 2011 +0200
@@ -25,7 +25,7 @@
 import java.util.*;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.alloc.*;
 import com.oracle.max.graal.compiler.lir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.observer.*;
@@ -289,7 +289,7 @@
         return maxLocks;
     }
 
-    public FixedNodeWithNext getHIRStartBlock() {
-        return (FixedNodeWithNext) compilation.graph.start().successors().first();
+    public FixedWithNextNode getHIRStartBlock() {
+        return (FixedWithNextNode) compilation.graph.start().successors().first();
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/MergeableState.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/MergeableState.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,12 +24,12 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 
 public interface MergeableState <T> {
     T clone();
-    boolean merge(Merge merge, Collection<T> withStates);
-    void loopBegin(LoopBegin loopBegin);
-    void loopEnd(LoopEnd loopEnd, T loopEndState);
+    boolean merge(MergeNode merge, Collection<T> withStates);
+    void loopBegin(LoopBeginNode loopBegin);
+    void loopEnd(LoopEndNode loopEnd, T loopEndState);
     void afterSplit(FixedNode node);
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/PostOrderNodeIterator.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/graph/PostOrderNodeIterator.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,8 +24,7 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.collections.*;
 
@@ -50,30 +49,30 @@
         FixedNode current = start;
 
         do {
-            if (current instanceof Invoke) {
-                invoke((Invoke) current);
+            if (current instanceof InvokeNode) {
+                invoke((InvokeNode) current);
                 queueSuccessors(current);
                 current = nextQueuedNode();
-            } else if (current instanceof LoopBegin) {
-                state.loopBegin((LoopBegin) current);
+            } else if (current instanceof LoopBeginNode) {
+                state.loopBegin((LoopBeginNode) current);
                 nodeStates.put(current, state);
                 state = state.clone();
-                loopBegin((LoopBegin) current);
-                current = ((LoopBegin) current).next();
+                loopBegin((LoopBeginNode) current);
+                current = ((LoopBeginNode) current).next();
                 assert current != null;
-            } else if (current instanceof LoopEnd) {
-                T loopBeginState = nodeStates.get(((LoopEnd) current).loopBegin());
+            } else if (current instanceof LoopEndNode) {
+                T loopBeginState = nodeStates.get(((LoopEndNode) current).loopBegin());
                 if (loopBeginState != null) {
-                    loopBeginState.loopEnd((LoopEnd) current, state);
+                    loopBeginState.loopEnd((LoopEndNode) current, state);
                 }
-                loopEnd((LoopEnd) current);
+                loopEnd((LoopEndNode) current);
                 current = nextQueuedNode();
-            } else if (current instanceof Merge) {
-                merge((Merge) current);
-                current = ((Merge) current).next();
+            } else if (current instanceof MergeNode) {
+                merge((MergeNode) current);
+                current = ((MergeNode) current).next();
                 assert current != null;
-            } else if (current instanceof FixedNodeWithNext) {
-                FixedNode next = ((FixedNodeWithNext) current).next();
+            } else if (current instanceof FixedWithNextNode) {
+                FixedNode next = ((FixedWithNextNode) current).next();
                 node(current);
                 current = next;
                 assert current != null;
@@ -81,17 +80,17 @@
                 end((EndNode) current);
                 queueMerge((EndNode) current);
                 current = nextQueuedNode();
-            } else if (current instanceof Deoptimize) {
-                deoptimize((Deoptimize) current);
+            } else if (current instanceof DeoptimizeNode) {
+                deoptimize((DeoptimizeNode) current);
                 current = nextQueuedNode();
-            } else if (current instanceof Return) {
-                returnNode((Return) current);
+            } else if (current instanceof ReturnNode) {
+                returnNode((ReturnNode) current);
                 current = nextQueuedNode();
             } else if (current instanceof UnwindNode) {
                 unwind((UnwindNode) current);
                 current = nextQueuedNode();
-            } else if (current instanceof ControlSplit) {
-                controlSplit((ControlSplit) current);
+            } else if (current instanceof ControlSplitNode) {
+                controlSplit((ControlSplitNode) current);
                 queueSuccessors(current);
                 current = nextQueuedNode();
             } else {
@@ -113,8 +112,8 @@
         int maxIterations = nodeQueue.size();
         while (maxIterations-- > 0) {
             FixedNode node = nodeQueue.removeFirst();
-            if (node instanceof Merge) {
-                Merge merge = (Merge) node;
+            if (node instanceof MergeNode) {
+                MergeNode merge = (MergeNode) node;
                 state = nodeStates.get(merge.endAt(0)).clone();
                 ArrayList<T> states = new ArrayList<T>(merge.endCount() - 1);
                 for (int i = 1; i < merge.endCount(); i++) {
@@ -143,7 +142,7 @@
         assert !nodeStates.containsKey(end);
         nodeStates.put(end, state);
         visitedEnds.mark(end);
-        Merge merge = end.merge();
+        MergeNode merge = end.merge();
         boolean endsVisited = true;
         for (int i = 0; i < merge.endCount(); i++) {
             if (!visitedEnds.isMarked(merge.endAt(i))) {
@@ -162,31 +161,31 @@
         node(endNode);
     }
 
-    protected void merge(Merge merge) {
+    protected void merge(MergeNode merge) {
         node(merge);
     }
 
-    protected void loopBegin(LoopBegin loopBegin) {
+    protected void loopBegin(LoopBeginNode loopBegin) {
         node(loopBegin);
     }
 
-    protected void loopEnd(LoopEnd loopEnd) {
+    protected void loopEnd(LoopEndNode loopEnd) {
         node(loopEnd);
     }
 
-    protected void deoptimize(Deoptimize deoptimize) {
+    protected void deoptimize(DeoptimizeNode deoptimize) {
         node(deoptimize);
     }
 
-    protected void controlSplit(ControlSplit controlSplit) {
+    protected void controlSplit(ControlSplitNode controlSplit) {
         node(controlSplit);
     }
 
-    protected void returnNode(Return returnNode) {
+    protected void returnNode(ReturnNode returnNode) {
         node(returnNode);
     }
 
-    protected void invoke(Invoke invoke) {
+    protected void invoke(InvokeNode invoke) {
         node(invoke);
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractMemoryCheckpointNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class AbstractMemoryCheckpointNode extends StateSplit {
-
-    @Input    private final NodeInputList<Node> mergedNodes = new NodeInputList<Node>(this);
-
-    private static final int SUCCESSOR_COUNT = 0;
-    private static final int INPUT_COUNT = 0;
-
-    public AbstractMemoryCheckpointNode(Graph graph) {
-        this(CiKind.Illegal, graph);
-    }
-
-    public AbstractMemoryCheckpointNode(CiKind result, Graph graph) {
-        super(result, graph);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> debugProperties = super.getDebugProperties();
-        debugProperties.put("memoryCheckpoint", "true");
-        return debugProperties;
-    }
-
-    public NodeInputList<Node> mergedNodes() {
-        return mergedNodes;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class AbstractVectorNode extends StateSplit {
-    @Input private AbstractVectorNode vector;
-
-    public AbstractVectorNode vector() {
-        return vector;
-    }
-
-    public void setVector(AbstractVectorNode x) {
-        updateUsages(vector, x);
-        vector = x;
-    }
-
-    public AbstractVectorNode(CiKind kind, AbstractVectorNode vector, Graph graph) {
-        super(kind, graph);
-        setVector(vector);
-    }
-
-    protected static AbstractVectorNode findCommonNode(AbstractVectorNode left, AbstractVectorNode right, List<AbstractVectorNode> leftList, List<AbstractVectorNode> rightList) {
-        Set<AbstractVectorNode> occured = new HashSet<AbstractVectorNode>();
-        AbstractVectorNode common = null;
-        AbstractVectorNode cur = left;
-        while (cur != null) {
-            occured.add(cur);
-            cur = cur.vector();
-        }
-
-        cur = right;
-        while (cur != null) {
-            if (occured.contains(cur)) {
-                common = cur;
-                break;
-            }
-            cur = cur.vector();
-        }
-
-        fillUntil(left, cur, leftList);
-        fillUntil(right, cur, rightList);
-        return common;
-    }
-
-    private static void fillUntil(AbstractVectorNode left, AbstractVectorNode until, List<AbstractVectorNode> leftList) {
-        AbstractVectorNode cur = left;
-        while (cur != null && cur != until) {
-            leftList.add(cur);
-            cur = cur.vector();
-        }
-    }
-
-    public void addToLoop(LoopBegin loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
-        throw new IllegalStateException("unimplemented");
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessArray.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * This the base class of all array operations.
- */
-public abstract class AccessArray extends StateSplit {
-
-    @Input    private ValueNode array;
-
-    public ValueNode array() {
-        return array;
-    }
-
-    public void setArray(ValueNode x) {
-        updateUsages(array, x);
-        array = x;
-    }
-
-    /**
-     * Creates a new AccessArray instruction.
-     * @param kind the type of the result of this instruction
-     * @param array the instruction that produces the array object value
-     * @param graph
-     */
-    public AccessArray(CiKind kind, ValueNode array, Graph graph) {
-        super(kind, graph);
-        setArray(array);
-    }
-
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessField.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.lang.reflect.*;
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The base class of all instructions that access fields.
- */
-public abstract class AccessField extends StateSplit {
-
-    @Input    private ValueNode object;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    protected final RiField field;
-
-    /**
-     * Constructs a new access field object.
-     * @param kind the result kind of the access
-     * @param object the instruction producing the receiver object
-     * @param field the compiler interface representation of the field
-     * @param graph
-     */
-    public AccessField(CiKind kind, ValueNode object, RiField field, Graph graph) {
-        super(kind, graph);
-        this.field = field;
-        setObject(object);
-        assert field.isResolved();
-        assert field.holder().isInitialized();
-    }
-
-    /**
-     * Gets the compiler interface field for this field access.
-     * @return the compiler interface field for this field access
-     */
-    public RiField field() {
-        return field;
-    }
-
-    /**
-     * Checks whether this field access is an access to a static field.
-     * @return {@code true} if this field access is to a static field
-     */
-    public boolean isStatic() {
-        return Modifier.isStatic(field.accessFlags());
-    }
-
-    /**
-     * Checks whether this field is declared volatile.
-     * @return {@code true} if the field is resolved and declared volatile
-     */
-    public boolean isVolatile() {
-        return Modifier.isVolatile(field.accessFlags());
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("field", field);
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessIndexed.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code AccessIndexed} class is the base class of instructions that read or write
- * elements of an array.
- */
-public abstract class AccessIndexed extends AccessArray {
-
-    @Input    private ValueNode index;
-
-    @Input    private ValueNode length;
-
-    public ValueNode index() {
-        return index;
-    }
-
-    public void setIndex(ValueNode x) {
-        updateUsages(index, x);
-        index = x;
-    }
-
-    public ValueNode length() {
-        return length;
-    }
-
-    public void setLength(ValueNode x) {
-        updateUsages(length, x);
-        length = x;
-    }
-
-    private final CiKind elementType;
-
-    /**
-     * Create an new AccessIndexed instruction.
-     * @param kind the result kind of the access
-     * @param array the instruction producing the array
-     * @param index the instruction producing the index
-     * @param length the instruction producing the length (used in bounds check elimination?)
-     * @param elementKind the type of the elements of the array
-     * @param graph
-     */
-    protected AccessIndexed(CiKind kind, ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, Graph graph) {
-        super(kind, array, graph);
-        setIndex(index);
-        setLength(length);
-        this.elementType = elementKind;
-    }
-
-    /**
-     * Gets the element type of the array.
-     * @return the element type
-     */
-    public CiKind elementKind() {
-        return elementType;
-    }
-
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessMonitor.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code AccessMonitor} instruction is the base class of both monitor acquisition and release.
- */
-public abstract class AccessMonitor extends AbstractMemoryCheckpointNode {
-
-    @Input    private ValueNode object;
-
-    @Input    private ValueNode lockAddress;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public ValueNode lockAddress() {
-        return lockAddress;
-    }
-
-    public void setLockAddress(ValueNode x) {
-        updateUsages(lockAddress, x);
-        lockAddress = x;
-    }
-
-    /**
-     * The lock number of this monitor access.
-     */
-    public final int lockNumber;
-
-    /**
-     * Creates a new AccessMonitor instruction.
-     *
-     * @param object the instruction producing the object
-     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
-     * @param lockNumber the number of the lock being acquired
-     * @param graph
-     */
-    public AccessMonitor(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
-        super(CiKind.Illegal, graph);
-        this.lockNumber = lockNumber;
-        setObject(object);
-        setLockAddress(lockAddress);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class AccessNode extends AbstractMemoryCheckpointNode {
-    @Input private ValueNode object;
-    @Input private GuardNode guard;
-    @Input private LocationNode location;
-    @Input private final NodeInputList<Node> dependencies = new NodeInputList<Node>(this);
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public GuardNode guard() {
-        return guard;
-    }
-
-    public void setGuard(GuardNode x) {
-        updateUsages(guard, x);
-        guard = x;
-    }
-
-    public LocationNode location() {
-        return location;
-    }
-
-    public void setLocation(LocationNode x) {
-        updateUsages(location, x);
-        location = x;
-    }
-
-    public AccessNode(CiKind kind, ValueNode object, LocationNode location, Graph graph) {
-        super(kind, graph);
-        setLocation(location);
-        setObject(object);
-    }
-
-    public void addDependency(Node x) {
-        dependencies.add(x);
-    }
-
-    public NodeInputList<Node> dependencies() {
-        return dependencies;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class AccessVectorNode extends AbstractVectorNode {
-    @Input private ValueNode object;
-    @Input private LocationNode location;
-    @Input private final NodeInputList<Node> dependencies = new NodeInputList<Node>(this);
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public LocationNode location() {
-        return location;
-    }
-
-    public void setLocation(LocationNode x) {
-        updateUsages(location, x);
-        location = x;
-    }
-
-    public AccessVectorNode(CiKind kind, AbstractVectorNode vector, ValueNode object, LocationNode location, Graph graph) {
-        super(kind, vector, graph);
-        setObject(object);
-        setLocation(location);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Anchor} instruction represents the end of a block with an unconditional jump to another block.
- */
-public final class Anchor extends FixedNodeWithNext {
-
-    @Input private final NodeInputList<GuardNode> guards = new NodeInputList<GuardNode>(this);
-
-    public Anchor(Graph graph) {
-        super(CiKind.Illegal, graph);
-    }
-
-    public void addGuard(GuardNode x) {
-        guards.add(x);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitAnchor(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/And.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "&")
-public final class And extends Logic implements Canonicalizable {
-
-    public And(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IAND : Bytecodes.LAND, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x() == y()) {
-            return x();
-        }
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() & y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() & y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Int) {
-                int c = y().asConstant().asInt();
-                if (c == -1) {
-                    return x();
-                }
-                if (c == 0) {
-                    return Constant.forInt(0, graph());
-                }
-            } else {
-                assert kind == CiKind.Long;
-                long c = y().asConstant().asLong();
-                if (c == -1) {
-                    return x();
-                }
-                if (c == 0) {
-                    return Constant.forLong(0, graph());
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Arithmetic.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code ArithmeticOp} class represents arithmetic operations such as addition, subtraction, etc.
- */
-public abstract class Arithmetic extends Binary {
-
-    private final boolean isStrictFP;
-
-    /**
-     * Creates a new arithmetic operation.
-     * @param opcode the bytecode opcode
-     * @param kind the result kind of the operation
-     * @param x the first input instruction
-     * @param y the second input instruction
-     * @param isStrictFP indicates this operation has strict rounding semantics
-     */
-    public Arithmetic(CiKind kind, int opcode, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, opcode, x, y, graph);
-        this.isStrictFP = isStrictFP;
-    }
-
-    /**
-     * Checks whether this instruction has strict fp semantics.
-     * @return {@code true} if this instruction has strict fp semantics
-     */
-    public boolean isStrictFP() {
-        return isStrictFP;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitArithmetic(this);
-    }
-
-    public boolean isCommutative() {
-        return Bytecodes.isCommutative(opcode);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ArrayLength.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code ArrayLength} instruction gets the length of an array.
- */
-public final class ArrayLength extends FloatingNode implements Canonicalizable {
-
-    @Input private ValueNode array;
-
-    public ValueNode array() {
-        return array;
-    }
-
-    public void setArray(ValueNode x) {
-        updateUsages(array, x);
-        array = x;
-    }
-
-    /**
-     * Constructs a new ArrayLength instruction.
-     *
-     * @param array the instruction producing the array
-     * @param newFrameState the state after executing this instruction
-     */
-    public ArrayLength(ValueNode array, Graph graph) {
-        super(CiKind.Int, graph);
-        setArray(array);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitArrayLength(this);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (array() instanceof NewArray) {
-            ValueNode length = ((NewArray) array()).dimension(0);
-            assert length != null;
-            return length;
-        }
-        CiConstant constantValue = null;
-        if (array().isConstant()) {
-            constantValue = array().asConstant();
-            if (constantValue != null && constantValue.isNonNull()) {
-                if (graph() instanceof CompilerGraph) {
-                    RiRuntime runtime = ((CompilerGraph) graph()).runtime();
-                    return Constant.forInt(runtime.getArrayLength(constantValue), graph());
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BasicInductionVariable.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-/**
- * LinearInductionVariable that is computed in the loops thanks to Phi(init, this + stride).
- * This will keep at least one register busy in the whole loop body
- */
-public class BasicInductionVariable extends LinearInductionVariable implements Canonicalizable{
-    public static final BIVLoweringOp LOWERING = new BIVLoweringOp();
-    @Input private LoopCounter loopCounter;
-
-    public BasicInductionVariable(CiKind kind, ValueNode init, ValueNode stride, LoopCounter counter, Graph graph) {
-        super(kind, init, stride, graph);
-        setLoopCounter(counter);
-    }
-
-    public LoopCounter loopCounter() {
-        return loopCounter;
-    }
-
-    public void setLoopCounter(LoopCounter loopCounter) {
-        updateUsages(this.loopCounter, loopCounter);
-        this.loopCounter = loopCounter;
-    }
-
-    public ValueNode init() {
-        return a();
-    }
-
-    public void setInit(ValueNode init) {
-        setA(init);
-    }
-
-    public ValueNode stride() {
-        return b();
-    }
-
-    public void setStride(ValueNode stride) {
-        setB(stride);
-    }
-
-    @Override
-    public LoopBegin loopBegin() {
-        return loopCounter().loopBegin();
-    }
-
-    @Override
-    public void peelOneIteration() {
-        this.setInit(IntegerArithmeticNode.add(init(), stride()));
-    }
-
-    /**
-     * Will lessen the register pressure but augment the code complexity with a multiplication.
-     * @return the new DerivedInductionVariable
-     */
-    public DerivedInductionVariable toDerivedInductionVariable() {
-        DerivedInductionVariable newDIV = new DerivedInductionVariable(kind, init(), stride(), loopCounter(), graph());
-        this.replaceAndDelete(newDIV);
-        return newDIV;
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (this.init().isConstant() && this.init().asConstant().asLong() == 0
-                        && this.stride().isConstant() && this.stride().asConstant().asLong() == 1) {
-            return this.loopCounter();
-        }
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) LOWERING;
-        }
-        return super.lookup(clazz);
-    }
-
-    public static class BIVLoweringOp implements LoweringOp {
-        @Override
-        public void lower(Node n, CiLoweringTool tool) {
-            BasicInductionVariable biv = (BasicInductionVariable) n;
-            Phi phi = this.ivToPhi(biv.loopBegin(), biv.init(), biv.stride(), biv.kind);
-            biv.replaceAtNonIVUsages(phi);
-        }
-
-        public Phi ivToPhi(LoopBegin loopBegin, ValueNode init, ValueNode stride, CiKind kind) {
-            Phi phi = new Phi(kind, loopBegin, PhiType.Value, loopBegin.graph());
-            IntegerArithmeticNode after = IntegerArithmeticNode.add(phi, stride);
-            phi.addInput(init);
-            phi.addInput(after);
-            return phi;
-        }
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Binary.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Op2} class is the base of arithmetic and logic operations with two inputs.
- */
-public abstract class Binary extends FloatingNode {
-
-    @Input private ValueNode x;
-    @Input private ValueNode y;
-    @Data public final int opcode;
-
-    public ValueNode x() {
-        return x;
-    }
-
-    public void setX(ValueNode x) {
-        updateUsages(this.x, x);
-        this.x = x;
-    }
-
-    public ValueNode y() {
-        return y;
-    }
-
-    public void setY(ValueNode x) {
-        updateUsages(y, x);
-        this.y = x;
-    }
-
-    /**
-     * Creates a new Op2 instance.
-     * @param kind the result type of this instruction
-     * @param opcode the bytecode opcode
-     * @param x the first input instruction
-     * @param y the second input instruction
-     */
-    public Binary(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, graph);
-        this.opcode = opcode;
-        setX(x);
-        setY(y);
-    }
-
-    /**
-     * Swaps the operands of this instruction. This is only legal for commutative operations.
-     */
-    public void swapOperands() {
-        assert Bytecodes.isCommutative(opcode);
-        ValueNode t = x();
-        setX(y());
-        setY(t);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockClosure.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2009, 2010, 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.schedule.*;
-
-/**
- * The {@code BlockClosure} interface represents a closure for iterating over blocks.
- */
-public interface BlockClosure {
-    void apply(Block block);
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockList.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-/*
- * Copyright (c) 2009, 2010, 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 java.util.*;
-
-/**
- * The {@code BlockList} class implements a specialized list data structure for representing
- * the predecessor and successor lists of basic blocks.
- */
-public class BlockList implements Iterable<Merge> {
-
-    private Merge[] array;
-    private int cursor;
-
-    BlockList(int sizeHint) {
-        if (sizeHint > 0) {
-            array = new Merge[sizeHint];
-        } else {
-            array = new Merge[2];
-        }
-    }
-
-    public void remove(int index) {
-        if (index < 0 || index >= cursor) {
-            throw new IndexOutOfBoundsException();
-        }
-        for (int i = index; i < cursor; i++) {
-            array[i] = array[i + 1];
-        }
-        cursor--;
-    }
-
-    public void remove(Merge block) {
-        int j = 0;
-        for (int i = 0; i < cursor; i++) {
-            if (i != j) {
-                array[j] = array[i];
-            }
-            if (array[i] != block) {
-                j++;
-            }
-        }
-        cursor = j;
-    }
-
-    public void exchange(int index1, int index2) {
-        if (index1 < 0 || index1 >= cursor) {
-            throw new IndexOutOfBoundsException();
-        }
-        if (index2 < 0 || index2 >= cursor) {
-            throw new IndexOutOfBoundsException();
-        }
-        Merge t = array[index2];
-        array[index2] = array[index1];
-        array[index1] = t;
-    }
-
-    public void insert(int index, Merge block) {
-        if (index < 0 || index >= cursor) {
-            throw new IndexOutOfBoundsException();
-        }
-        growOne();
-        for (int i = cursor; i > index; i--) {
-            array[i] = array[i - 1];
-        }
-        array[cursor++] = block;
-    }
-
-    public void append(Merge block) {
-        growOne();
-        array[cursor++] = block;
-    }
-
-    public Merge get(int index) {
-        if (index < 0 || index >= cursor) {
-            throw new IndexOutOfBoundsException();
-        }
-        return array[index];
-    }
-
-    public void replace(Merge oldBlock, Merge newBlock) {
-        for (int i = 0; i < cursor; i++) {
-            if (array[i] == oldBlock) {
-                array[i] = newBlock;
-            }
-        }
-    }
-
-    public boolean checkForSameBlock() {
-        if (cursor == 0) {
-            return true;
-        }
-        Merge b = array[0];
-        for (int i = 1; i < cursor; i++) {
-            if (array[i] != b) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    public Iterator<Merge> iterator() {
-        return new Iter();
-    }
-
-    private void growOne() {
-        if (cursor == array.length) {
-            array = Arrays.copyOf(array, array.length * 3);
-        }
-    }
-
-    private class Iter implements Iterator<Merge> {
-        private int pos;
-
-        public boolean hasNext() {
-            return pos < cursor;
-        }
-
-        public Merge next() {
-            return array[pos++];
-        }
-
-        public void remove() {
-            BlockList.this.remove(pos);
-        }
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BooleanNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class BooleanNode extends FloatingNode {
-
-    public BooleanNode(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CastNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class CastNode extends FloatingNode {
-    @Input private ValueNode value;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    public CastNode(CiKind kind, ValueNode n, Graph graph) {
-        super(kind, graph);
-        setValue(n);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-    }
-
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return (T) new LIRGeneratorOp() {
-                @Override
-                public void generate(Node n, LIRGeneratorTool generator) {
-                    CastNode conv = (CastNode) n;
-                    conv.setOperand(generator.load(conv.value()));
-                }
-            };
-        }
-        return super.lookup(clazz);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CheckCast.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code CheckCast} instruction represents a {@link Bytecodes#CHECKCAST}.
- */
-public final class CheckCast extends TypeCheckNode implements Canonicalizable {
-
-    /**
-     * Creates a new CheckCast instruction.
-     *
-     * @param targetClass the class being cast to
-     * @param object the instruction producing the object
-     * @param graph
-     */
-    public CheckCast(ValueNode targetClassInstruction, ValueNode object, Graph graph) {
-        super(targetClassInstruction, object, CiKind.Object, graph);
-    }
-
-    /**
-     * Gets the declared type of the result of this instruction.
-     *
-     * @return the declared type of the result
-     */
-    @Override
-    public RiType declaredType() {
-        return targetClass();
-    }
-
-    /**
-     * Gets the exact type of the result of this instruction.
-     *
-     * @return the exact type of the result
-     */
-    @Override
-    public RiType exactType() {
-        return targetClass().isResolved() ? targetClass().exactType() : null;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitCheckCast(this);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (object().exactType() != null) {
-            return object();
-        }
-        CiConstant constant = object().asConstant();
-        if (constant != null) {
-            assert constant.kind == CiKind.Object;
-            if (constant.isNull()) {
-                return object();
-            } else {
-                // this should never happen - non-null constants are always expected to provide an exactType
-                assert false;
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,212 +0,0 @@
-/*
- * Copyright (c) 2011, 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 java.util.*;
-
-import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.compiler.util.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/* (tw/gd) For high-level optimization purpose the compare node should be a boolean *value* (it is currently only a helper node)
- * But in the back-end the comparison should not always be materialized (for example in x86 the comparison result will not be in a register but in a flag)
- *
- * Compare should probably be made a value (so that it can be canonicalized for example) and in later stages some Compare usage should be transformed
- * into variants that do not materialize the value (CompareIf, CompareGuard...)
- *
- */
-public final class Compare extends BooleanNode implements Canonicalizable {
-
-    @Input private ValueNode x;
-    @Input private ValueNode y;
-
-    @Data private Condition condition;
-    @Data private boolean unorderedIsTrue;
-
-    public ValueNode x() {
-        return x;
-    }
-
-    public void setX(ValueNode x) {
-        updateUsages(this.x, x);
-        this.x = x;
-    }
-
-    public ValueNode y() {
-        return y;
-    }
-
-    public void setY(ValueNode x) {
-        updateUsages(y, x);
-        this.y = x;
-    }
-
-    /**
-     * Constructs a new Compare instruction.
-     *
-     * @param x the instruction producing the first input to the instruction
-     * @param condition the condition (comparison operation)
-     * @param y the instruction that produces the second input to this instruction
-     * @param graph
-     */
-    public Compare(ValueNode x, Condition condition, ValueNode y, Graph graph) {
-        super(CiKind.Illegal, graph);
-        assert (x == null && y == null) || Util.archKindsEqual(x, y);
-        this.condition = condition;
-        setX(x);
-        setY(y);
-    }
-
-    /**
-     * Gets the condition (comparison operation) for this instruction.
-     *
-     * @return the condition
-     */
-    public Condition condition() {
-        return condition;
-    }
-
-    /**
-     * Checks whether unordered inputs mean true or false.
-     *
-     * @return {@code true} if unordered inputs produce true
-     */
-    public boolean unorderedIsTrue() {
-        return unorderedIsTrue;
-    }
-
-    public void setUnorderedIsTrue(boolean unorderedIsTrue) {
-        this.unorderedIsTrue = unorderedIsTrue;
-    }
-
-    /**
-     * Swaps the operands to this if and mirrors the condition (e.g. > becomes <).
-     *
-     * @see Condition#mirror()
-     */
-    public void swapOperands() {
-        condition = condition.mirror();
-        ValueNode t = x();
-        setX(y());
-        setY(t);
-    }
-
-    public void negate() {
-        condition = condition.negate();
-        unorderedIsTrue = !unorderedIsTrue;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-    }
-
-    @Override
-    public String shortName() {
-        return "Comp " + condition.operator;
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("unorderedIsTrue", unorderedIsTrue());
-        return properties;
-    }
-
-    private Node optimizeMaterialize(CiConstant constant, MaterializeNode materializeNode) {
-        if (constant.kind == CiKind.Int) {
-            boolean isFalseCheck = (constant.asInt() == 0);
-            if (condition == Condition.EQ || condition == Condition.NE) {
-                if (condition == Condition.NE) {
-                    isFalseCheck = !isFalseCheck;
-                }
-                BooleanNode result = materializeNode.condition();
-                if (isFalseCheck) {
-                    result = new NegateBooleanNode(result, graph());
-                }
-                return result;
-            }
-        }
-        return this;
-    }
-
-    private Node optimizeNormalizeCmp(CiConstant constant, NormalizeCompare normalizeNode) {
-        if (constant.kind == CiKind.Int && constant.asInt() == 0) {
-            Condition condition = condition();
-            if (normalizeNode == y()) {
-                condition = condition.mirror();
-            }
-            Compare result = new Compare(normalizeNode.x(), condition, normalizeNode.y(), graph());
-            boolean isLess = condition == Condition.LE || condition == Condition.LT || condition == Condition.BE || condition == Condition.BT;
-            result.unorderedIsTrue = condition != Condition.EQ && (condition == Condition.NE || !(isLess ^ normalizeNode.isUnorderedLess()));
-            return result;
-        }
-        return this;
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && !y().isConstant()) { // move constants to the left (y)
-            swapOperands();
-        } else if (x().isConstant() && y().isConstant()) {
-            CiConstant constX = x().asConstant();
-            CiConstant constY = y().asConstant();
-            Boolean result = condition().foldCondition(constX, constY, ((CompilerGraph) graph()).runtime(), unorderedIsTrue());
-            if (result != null) {
-                return Constant.forBoolean(result, graph());
-            }
-        }
-
-        if (y().isConstant()) {
-            if (x() instanceof MaterializeNode) {
-                return optimizeMaterialize(y().asConstant(), (MaterializeNode) x());
-            } else if (x() instanceof NormalizeCompare) {
-                return optimizeNormalizeCmp(y().asConstant(), (NormalizeCompare) x());
-            }
-        }
-
-        if (x() == y() && x().kind != CiKind.Float && x().kind != CiKind.Double) {
-            return Constant.forBoolean(condition().check(1, 1), graph());
-        }
-        if ((condition == Condition.NE || condition == Condition.EQ) && x().kind == CiKind.Object) {
-            ValueNode object = null;
-            if (x().isNullConstant()) {
-                object = y();
-            } else if (y().isNullConstant()) {
-                object = x();
-            }
-            if (object != null) {
-                IsNonNull nonNull = new IsNonNull(object, graph());
-                if (condition == Condition.NE) {
-                    return nonNull;
-                } else {
-                    assert condition == Condition.EQ;
-                    return new NegateBooleanNode(nonNull, graph());
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ComputeLinearScanOrder.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,357 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.lir.*;
-import com.oracle.max.graal.graph.*;
-
-public final class ComputeLinearScanOrder {
-
-    private final int maxBlockId; // the highest blockId of a block
-    private int numBlocks; // total number of blocks (smaller than maxBlockId)
-
-    List<LIRBlock> linearScanOrder; // the resulting list of blocks in correct order
-    List<LIRBlock> codeEmittingOrder;
-
-    final BitMap visitedBlocks; // used for recursive processing of blocks
-    final BitMap activeBlocks; // used for recursive processing of blocks
-    final BitMap dominatorBlocks; // temporary BitMap used for computation of dominator
-    final int[] forwardBranches; // number of incoming forward branches for each block
-    final List<LIRBlock> workList; // temporary list (used in markLoops and computeOrder)
-    final LIRBlock[] loopHeaders;
-
-    // accessors for visitedBlocks and activeBlocks
-    void initVisited() {
-        activeBlocks.clearAll();
-        visitedBlocks.clearAll();
-    }
-
-    boolean isVisited(LIRBlock b) {
-        return visitedBlocks.get(b.blockID());
-    }
-
-    boolean isActive(LIRBlock b) {
-        return activeBlocks.get(b.blockID());
-    }
-
-    void setVisited(LIRBlock b) {
-        assert !isVisited(b) : "already set";
-        visitedBlocks.set(b.blockID());
-    }
-
-    void setActive(LIRBlock b) {
-        assert !isActive(b) : "already set";
-        activeBlocks.set(b.blockID());
-    }
-
-    void clearActive(LIRBlock b) {
-        assert isActive(b) : "not already";
-        activeBlocks.clear(b.blockID());
-    }
-
-    // accessors for forwardBranches
-    void incForwardBranches(LIRBlock b) {
-        forwardBranches[b.blockID()]++;
-    }
-
-    int decForwardBranches(LIRBlock b) {
-        return --forwardBranches[b.blockID()];
-    }
-
-    // accessors for final result
-    public List<LIRBlock> linearScanOrder() {
-        return linearScanOrder;
-    }
-
-    public ComputeLinearScanOrder(int maxBlockId, int loopCount, LIRBlock startBlock) {
-        loopHeaders = new LIRBlock[loopCount];
-
-        this.maxBlockId = maxBlockId;
-        visitedBlocks = new BitMap(maxBlockId);
-        activeBlocks = new BitMap(maxBlockId);
-        dominatorBlocks = new BitMap(maxBlockId);
-        forwardBranches = new int[maxBlockId];
-        workList = new ArrayList<LIRBlock>(8);
-
-        countEdges(startBlock, null);
-        computeOrder(startBlock);
-        printBlocks();
-    }
-
-    /**
-     * Traverses the CFG to analyze block and edge info. The analysis performed is:
-     *
-     * 1. Count of total number of blocks.
-     * 2. Count of all incoming edges and backward incoming edges.
-     * 3. Number loop header blocks.
-     * 4. Create a list with all loop end blocks.
-     */
-    void countEdges(LIRBlock cur, LIRBlock parent) {
-        if (GraalOptions.TraceLinearScanLevel >= 3) {
-            TTY.println("Counting edges for block B%d%s", cur.blockID(), parent == null ? "" : " coming from B" + parent.blockID());
-        }
-
-        if (isActive(cur)) {
-            return;
-        }
-
-        // increment number of incoming forward branches
-        incForwardBranches(cur);
-
-        if (isVisited(cur)) {
-            if (GraalOptions.TraceLinearScanLevel >= 3) {
-                TTY.println("block already visited");
-            }
-            return;
-        }
-
-        numBlocks++;
-        setVisited(cur);
-        setActive(cur);
-
-        // recursive call for all successors
-        int i;
-        for (i = cur.numberOfSux() - 1; i >= 0; i--) {
-            countEdges(cur.suxAt(i), cur);
-        }
-
-        clearActive(cur);
-
-        if (GraalOptions.TraceLinearScanLevel >= 3) {
-            TTY.println("Finished counting edges for block B%d", cur.blockID());
-        }
-    }
-
-    int computeWeight(LIRBlock cur) {
-
-        // limit loop-depth to 15 bit (only for security reason, it will never be so big)
-        int weight = (cur.loopDepth() & 0x7FFF) << 16;
-
-        int curBit = 15;
-
-        // this is necessary for the (very rare) case that two successive blocks have
-        // the same loop depth, but a different loop index (can happen for endless loops
-        // with exception handlers)
-//        if (!cur.isLinearScanLoopHeader()) {
-//            weight |= 1 << curBit;
-//        }
-//        curBit--;
-
-        // loop end blocks (blocks that end with a backward branch) are added
-        // after all other blocks of the loop.
-        if (!cur.isLinearScanLoopEnd()) {
-            weight |= 1 << curBit;
-        }
-        curBit--;
-
-        // critical edge split blocks are preferred because then they have a greater
-        // probability to be completely empty
-        //if (cur.isCriticalEdgeSplit()) {
-        //    weight |= 1 << curBit;
-        //}
-        //curBit--;
-
-        // exceptions should not be thrown in normal control flow, so these blocks
-        // are added as late as possible
-//        if (!(cur.end() instanceof Throw) && (singleSux == null || !(singleSux.end() instanceof Throw))) {
-//            weight |= 1 << curBit;
-//        }
-//        curBit--;
-//        if (!(cur.end() instanceof Return) && (singleSux == null || !(singleSux.end() instanceof Return))) {
-//            weight |= 1 << curBit;
-//        }
-//        curBit--;
-
-        // exceptions handlers are added as late as possible
-        if (!cur.isExceptionEntry()) {
-            weight |= 1 << curBit;
-        }
-        curBit--;
-
-        // guarantee that weight is > 0
-        weight |= 1;
-
-        assert curBit >= 0 : "too many flags";
-        assert weight > 0 : "weight cannot become negative";
-
-        return weight;
-    }
-
-    private boolean readyForProcessing(LIRBlock cur) {
-        // Discount the edge just traveled.
-        // When the number drops to zero, all forward branches were processed
-        if (decForwardBranches(cur) != 0) {
-            return false;
-        }
-
-        assert !linearScanOrder.contains(cur) : "block already processed (block can be ready only once)";
-        assert !workList.contains(cur) : "block already in work-list (block can be ready only once)";
-        return true;
-    }
-
-    private void sortIntoWorkList(LIRBlock cur) {
-        assert !workList.contains(cur) : "block already in work list";
-
-        int curWeight = computeWeight(cur);
-
-        // the linearScanNumber is used to cache the weight of a block
-        cur.setLinearScanNumber(curWeight);
-
-        if (GraalOptions.StressLinearScan) {
-            workList.add(0, cur);
-            return;
-        }
-
-        workList.add(null); // provide space for new element
-
-        int insertIdx = workList.size() - 1;
-        while (insertIdx > 0 && workList.get(insertIdx - 1).linearScanNumber() > curWeight) {
-            workList.set(insertIdx, workList.get(insertIdx - 1));
-            insertIdx--;
-        }
-        workList.set(insertIdx, cur);
-
-        if (GraalOptions.TraceLinearScanLevel >= 3) {
-            TTY.println("Sorted B%d into worklist. new worklist:", cur.blockID());
-            for (int i = 0; i < workList.size(); i++) {
-                TTY.println(String.format("%8d B%02d  weight:%6x", i, workList.get(i).blockID(), workList.get(i).linearScanNumber()));
-            }
-        }
-
-        for (int i = 0; i < workList.size(); i++) {
-            assert workList.get(i).linearScanNumber() > 0 : "weight not set";
-            assert i == 0 || workList.get(i - 1).linearScanNumber() <= workList.get(i).linearScanNumber() : "incorrect order in worklist";
-        }
-    }
-
-    private void appendBlock(LIRBlock cur) {
-        if (GraalOptions.TraceLinearScanLevel >= 3) {
-            TTY.println("appending block B%d (weight 0x%06x) to linear-scan order", cur.blockID(), cur.linearScanNumber());
-        }
-        assert !linearScanOrder.contains(cur) : "cannot add the same block twice";
-
-        // currently, the linear scan order and code emit order are equal.
-        // therefore the linearScanNumber and the weight of a block must also
-        // be equal.
-        cur.setLinearScanNumber(linearScanOrder.size());
-        linearScanOrder.add(cur);
-
-        if (!cur.isLinearScanLoopHeader() || !GraalOptions.OptReorderLoops) {
-            codeEmittingOrder.add(cur);
-
-            if (cur.isLinearScanLoopEnd() && GraalOptions.OptReorderLoops) {
-                LIRBlock loopHeader = loopHeaders[cur.loopIndex()];
-                assert loopHeader != null;
-                codeEmittingOrder.add(loopHeader);
-
-                for (LIRBlock succ : loopHeader.blockSuccessors()) {
-                    if (succ.loopDepth() == loopHeader.loopDepth()) {
-                        succ.setAlign(true);
-                    }
-                }
-            }
-        } else {
-            loopHeaders[cur.loopIndex()] = cur;
-        }
-    }
-
-    private void computeOrder(LIRBlock startBlock) {
-        if (GraalOptions.TraceLinearScanLevel >= 3) {
-            TTY.println("----- computing final block order");
-        }
-
-        // the start block is always the first block in the linear scan order
-        linearScanOrder = new ArrayList<LIRBlock>(numBlocks);
-
-        codeEmittingOrder = new ArrayList<LIRBlock>(numBlocks);
-
-        // start processing with standard entry block
-        assert workList.isEmpty() : "list must be empty before processing";
-
-        assert readyForProcessing(startBlock);
-        sortIntoWorkList(startBlock);
-
-        do {
-            LIRBlock cur = workList.remove(workList.size() - 1);
-            appendBlock(cur);
-
-            int i;
-            int numSux = cur.numberOfSux();
-            // changed loop order to get "intuitive" order of if- and else-blocks
-            for (i = 0; i < numSux; i++) {
-                LIRBlock sux = cur.suxAt(i);
-                if (readyForProcessing(sux)) {
-                    sortIntoWorkList(sux);
-                }
-            }
-        } while (workList.size() > 0);
-    }
-
-    public void printBlocks() {
-        if (GraalOptions.TraceLinearScanLevel >= 2) {
-            TTY.println("----- loop information:");
-            for (LIRBlock cur : linearScanOrder) {
-                TTY.print(String.format("%4d: B%02d: ", cur.linearScanNumber(), cur.blockID()));
-                TTY.println(String.format(" . loopIndex: %2d, loopDepth: %2d", cur.loopIndex(), cur.loopDepth()));
-            }
-        }
-
-        if (GraalOptions.TraceLinearScanLevel >= 1) {
-            TTY.println("----- linear-scan block order:");
-            for (LIRBlock cur : linearScanOrder) {
-                TTY.print(String.format("%4d: B%02d    loop: %2d  depth: %2d", cur.linearScanNumber(), cur.blockID(), cur.loopIndex(), cur.loopDepth()));
-
-                TTY.print(cur.isLinearScanLoopHeader() ? " lh" : "   ");
-                TTY.print(cur.isLinearScanLoopEnd() ? " le" : "   ");
-
-                TTY.print("    dom: null ");
-
-
-                if (cur.numberOfPreds() > 0) {
-                    TTY.print("    preds: ");
-                    for (int j = 0; j < cur.numberOfPreds(); j++) {
-                        LIRBlock pred = cur.predAt(j);
-                        TTY.print("B%d ", pred.blockID());
-                    }
-                }
-                if (cur.numberOfSux() > 0) {
-                    TTY.print("    sux: ");
-                    for (int j = 0; j < cur.numberOfSux(); j++) {
-                        LIRBlock sux = cur.suxAt(j);
-                        TTY.print("B%d ", sux.blockID());
-                    }
-                }
-                TTY.println();
-            }
-        }
-    }
-
-    public List<LIRBlock> codeEmittingOrder() {
-        return codeEmittingOrder;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Condition.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * Condition codes used in conditionals.
- */
-public enum Condition {
-    /**
-     * Equal.
-     */
-    EQ("=="),
-
-    /**
-     * Not equal.
-     */
-    NE("!="),
-
-    /**
-     * Signed less than.
-     */
-    LT("<"),
-
-    /**
-     * Signed less than or equal.
-     */
-    LE("<="),
-
-    /**
-     * Signed greater than.
-     */
-    GT(">"),
-
-    /**
-     * Signed greater than or equal.
-     */
-    GE(">="),
-
-    /**
-     * Unsigned greater than or equal ("above than or equal").
-     */
-    AE("|>=|"),
-
-    /**
-     * Unsigned less than or equal ("below than or equal").
-     */
-    BE("|<=|"),
-
-    /**
-     * Unsigned greater than ("above than").
-     */
-    AT("|>|"),
-
-    /**
-     * Unsigned less than ("below than").
-     */
-    BT("|<|"),
-
-    /**
-     * Operation produced an overflow.
-     */
-    OF("overflow"),
-
-    /**
-     * Operation did not produce an overflow.
-     */
-    NOF("noOverflow"),
-
-    TRUE("TRUE");
-
-    public final String operator;
-
-    private Condition(String operator) {
-        this.operator = operator;
-    }
-
-    public boolean check(int left, int right) {
-        switch (this) {
-            case EQ: return left == right;
-            case NE: return left != right;
-            case LT: return left < right;
-            case LE: return left <= right;
-            case GT: return left > right;
-            case GE: return left >= right;
-            case BT: return (left & 0xffffffffL) < (right & 0xffffffffL);
-            case BE: return (left & 0xffffffffL) <= (right & 0xffffffffL);
-            case AT: return (left & 0xffffffffL) > (right & 0xffffffffL);
-            case AE: return (left & 0xffffffffL) >= (right & 0xffffffffL);
-        }
-        throw new IllegalArgumentException();
-    }
-
-    /**
-     * Negate this conditional.
-     * @return the condition that represents the negation
-     */
-    public final Condition negate() {
-        switch (this) {
-            case EQ: return NE;
-            case NE: return EQ;
-            case LT: return GE;
-            case LE: return GT;
-            case GT: return LE;
-            case GE: return LT;
-            case BT: return AE;
-            case BE: return AT;
-            case AT: return BE;
-            case AE: return BT;
-            case OF: return NOF;
-            case NOF: return OF;
-        }
-        throw new IllegalArgumentException(this.toString());
-    }
-
-    /**
-     * Mirror this conditional (i.e. commute "a op b" to "b op' a")
-     * @return the condition representing the equivalent commuted operation
-     */
-    public final Condition mirror() {
-        switch (this) {
-            case EQ: return EQ;
-            case NE: return NE;
-            case LT: return GT;
-            case LE: return GE;
-            case GT: return LT;
-            case GE: return LE;
-            case BT: return AT;
-            case BE: return AE;
-            case AT: return BT;
-            case AE: return BE;
-        }
-        throw new IllegalArgumentException();
-    }
-
-    /**
-     * Checks if this conditional operation is commutative.
-     * @return {@code true} if this operation is commutative
-     */
-    public final boolean isCommutative() {
-        return this == EQ || this == NE;
-    }
-
-    /**
-     * Attempts to fold a comparison between two constants and return the result.
-     * @param lt the constant on the left side of the comparison
-     * @param rt the constant on the right side of the comparison
-     * @param runtime the RiRuntime (might be needed to compare runtime-specific types)
-     * @return {@link Boolean#TRUE} if the comparison is known to be true,
-     * {@link Boolean#FALSE} if the comparison is known to be false, {@code null} otherwise.
-     */
-    public Boolean foldCondition(CiConstant lt, CiConstant rt, RiRuntime runtime, boolean unorderedIsTrue) {
-        switch (lt.kind) {
-            case Boolean:
-            case Int: {
-                int x = lt.asInt();
-                int y = rt.asInt();
-                switch (this) {
-                    case EQ: return x == y;
-                    case NE: return x != y;
-                    case LT: return x < y;
-                    case LE: return x <= y;
-                    case GT: return x > y;
-                    case GE: return x >= y;
-                    case AE: return toUnsigned(x) >= toUnsigned(y);
-                    case BE: return toUnsigned(x) <= toUnsigned(y);
-                    case AT: return toUnsigned(x) > toUnsigned(y);
-                    case BT: return toUnsigned(x) < toUnsigned(y);
-                }
-                break;
-            }
-            case Long: {
-                long x = lt.asLong();
-                long y = rt.asLong();
-                switch (this) {
-                    case EQ: return x == y;
-                    case NE: return x != y;
-                    case LT: return x < y;
-                    case LE: return x <= y;
-                    case GT: return x > y;
-                    case GE: return x >= y;
-                }
-                break;
-            }
-            case Object: {
-                switch (this) {
-                    case EQ: return runtime.areConstantObjectsEqual(lt, rt);
-                    case NE: return !runtime.areConstantObjectsEqual(lt, rt);
-                }
-                break;
-            }
-            case Float: {
-                float x = lt.asFloat();
-                float y = rt.asFloat();
-                if (Float.isNaN(x) || Float.isNaN(y)) {
-                    return unorderedIsTrue;
-                }
-                switch (this) {
-                    case EQ: return x == y;
-                    case NE: return x != y;
-                    case BT:
-                    case LT: return x < y;
-                    case BE:
-                    case LE: return x <= y;
-                    case AT:
-                    case GT: return x > y;
-                    case AE:
-                    case GE: return x >= y;
-                }
-            }
-            case Double: {
-                double x = lt.asDouble();
-                double y = rt.asDouble();
-                if (Double.isNaN(x) || Double.isNaN(y)) {
-                    return unorderedIsTrue;
-                }
-                switch (this) {
-                    case EQ: return x == y;
-                    case NE: return x != y;
-                    case BT:
-                    case LT: return x < y;
-                    case BE:
-                    case LE: return x <= y;
-                    case AT:
-                    case GT: return x > y;
-                    case AE:
-                    case GE: return x >= y;
-                }
-            }
-        }
-        return null;
-    }
-
-    private long toUnsigned(int x) {
-        if (x < 0) {
-            return ((long) (x & 0x7FFFFFFF)) + ((long) Integer.MAX_VALUE) + 1;
-        }
-        return x;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Conditional.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Conditional} class represents a comparison that yields one of two values. Note that these nodes are not
- * built directly from the bytecode but are introduced by conditional expression elimination.
- */
-public class Conditional extends Binary implements Canonicalizable {
-
-    @Input private BooleanNode condition;
-
-    public BooleanNode condition() {
-        return condition;
-    }
-
-    public void setCondition(BooleanNode n) {
-        updateUsages(condition, n);
-        condition = n;
-    }
-
-    /**
-     * Constructs a new IfOp.
-     *
-     * @param x the instruction producing the first value to be compared
-     * @param condition the condition of the comparison
-     * @param y the instruction producing the second value to be compared
-     * @param trueValue the value produced if the condition is true
-     * @param falseValue the value produced if the condition is false
-     */
-    public Conditional(BooleanNode condition, ValueNode trueValue, ValueNode falseValue, Graph graph) {
-        // TODO: return the appropriate bytecode IF_ICMPEQ, etc
-        super(trueValue.kind.meet(falseValue.kind), Bytecodes.ILLEGAL, trueValue, falseValue, graph);
-        setCondition(condition);
-    }
-
-    // for copying
-    private Conditional(CiKind kind, Graph graph) {
-        super(kind, Bytecodes.ILLEGAL, null, null, graph);
-    }
-
-    public ValueNode trueValue() {
-        return x();
-    }
-
-    public ValueNode falseValue() {
-        return y();
-    }
-
-    public void setTrueValue(ValueNode value) {
-        setX(value);
-    }
-
-    public void setFalseValue(ValueNode value) {
-        setY(value);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return (T) LIRGEN;
-        }
-        return super.lookup(clazz);
-    }
-
-    public static class ConditionalStructure {
-
-        public final If ifNode;
-        public final Phi phi;
-        public final Merge merge;
-
-        public ConditionalStructure(If ifNode, Phi phi, Merge merge) {
-            this.ifNode = ifNode;
-            this.phi = phi;
-            this.merge = merge;
-        }
-    }
-
-    public static ConditionalStructure createConditionalStructure(BooleanNode condition, ValueNode trueValue, ValueNode falseValue) {
-        return createConditionalStructure(condition, trueValue, falseValue, 0.5);
-    }
-
-    public static ConditionalStructure createConditionalStructure(BooleanNode condition, ValueNode trueValue, ValueNode falseValue, double trueProbability) {
-        Graph graph = condition.graph();
-        CiKind kind = trueValue.kind.meet(falseValue.kind);
-        If ifNode = new If(condition, trueProbability, graph);
-        EndNode trueEnd = new EndNode(graph);
-        EndNode falseEnd = new EndNode(graph);
-        ifNode.setTrueSuccessor(trueEnd);
-        ifNode.setFalseSuccessor(falseEnd);
-        Merge merge = new Merge(graph);
-        merge.addEnd(trueEnd);
-        merge.addEnd(falseEnd);
-        Phi phi = new Phi(kind, merge, PhiType.Value, graph);
-        phi.addInput(trueValue);
-        phi.addInput(falseValue);
-        return new ConditionalStructure(ifNode, phi, merge);
-    }
-
-    private static final LIRGeneratorOp LIRGEN = new LIRGeneratorOp() {
-
-        @Override
-        public void generate(Node n, LIRGeneratorTool generator) {
-            generator.visitConditional((Conditional) n);
-        }
-    };
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (condition instanceof Constant) {
-            Constant c = (Constant) condition;
-            if (c.asConstant().asBoolean()) {
-                return trueValue();
-            } else {
-                return falseValue();
-            }
-        }
-        if (trueValue() == falseValue()) {
-            return trueValue();
-        }
-        if (!(this instanceof MaterializeNode) && trueValue() instanceof Constant && falseValue() instanceof Constant && trueValue().kind == CiKind.Int && falseValue().kind == CiKind.Int) {
-            int trueInt = trueValue().asConstant().asInt();
-            int falseInt = falseValue().asConstant().asInt();
-            if (trueInt == 0 && falseInt == 1) {
-                reProcess.reProccess(condition); // because we negate it
-                return new MaterializeNode(new NegateBooleanNode(condition, graph()), graph());
-            } else if (trueInt == 1 && falseInt == 0) {
-                return new MaterializeNode(condition, graph());
-            }
-        } else if (falseValue() instanceof Constant && !(trueValue() instanceof Constant)) {
-            ValueNode temp = trueValue();
-            setTrueValue(falseValue());
-            setFalseValue(temp);
-            condition = new NegateBooleanNode(condition, graph());
-            setCondition(condition);
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Constant.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import static com.oracle.max.graal.compiler.GraalCompilation.*;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code Constant} instruction represents a constant such as an integer value,
- * long, float, object reference, address, etc.
- */
-public final class Constant extends BooleanNode {
-
-    @Data public final CiConstant value;
-
-    /**
-     * Constructs a new instruction representing the specified constant.
-     * @param value the constant
-     * @param graph
-     */
-    public Constant(CiConstant value, Graph graph) {
-        super(value.kind.stackKind(), graph);
-        this.value = value;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitConstant(this);
-    }
-
-    /**
-     * Creates an instruction for a double constant.
-     * @param d the double value for which to create the instruction
-     * @param graph
-     * @return an instruction representing the double
-     */
-    public static Constant forDouble(double d, Graph graph) {
-        return new Constant(CiConstant.forDouble(d), graph);
-    }
-
-    /**
-     * Creates an instruction for a float constant.
-     * @param f the float value for which to create the instruction
-     * @return an instruction representing the float
-     */
-    public static Constant forFloat(float f, Graph graph) {
-        return new Constant(CiConstant.forFloat(f), graph);
-    }
-
-    /**
-     * Creates an instruction for an long constant.
-     * @param i the long value for which to create the instruction
-     * @return an instruction representing the long
-     */
-    public static Constant forLong(long i, Graph graph) {
-        return new Constant(CiConstant.forLong(i), graph);
-    }
-
-    /**
-     * Creates an instruction for an integer constant.
-     * @param i the integer value for which to create the instruction
-     * @return an instruction representing the integer
-     */
-    public static Constant forInt(int i, Graph graph) {
-        return new Constant(CiConstant.forInt(i), graph);
-    }
-
-    /**
-     * Creates an instruction for a boolean constant.
-     * @param i the boolean value for which to create the instruction
-     * @return an instruction representing the boolean
-     */
-    public static Constant forBoolean(boolean i, Graph graph) {
-        return new Constant(CiConstant.forBoolean(i), graph);
-    }
-
-    /**
-     * Creates an instruction for an address (jsr/ret address) constant.
-     * @param i the address value for which to create the instruction
-     * @return an instruction representing the address
-     */
-    public static Constant forJsr(int i, Graph graph) {
-        return new Constant(CiConstant.forJsr(i), graph);
-    }
-
-    /**
-     * Creates an instruction for an object constant.
-     * @param o the object value for which to create the instruction
-     * @return an instruction representing the object
-     */
-    public static Constant forObject(Object o, Graph graph) {
-        return new Constant(CiConstant.forObject(o), graph);
-    }
-
-    /**
-     * Creates an instruction for a word constant.
-     * @param val the word value for which to create the instruction
-     * @return an instruction representing the word
-     */
-    public static Constant forWord(long val, Graph graph) {
-        return new Constant(CiConstant.forWord(val), graph);
-    }
-
-    public static Constant defaultForKind(CiKind kind, Graph graph) {
-        switch(kind) {
-            case Boolean:
-                return Constant.forBoolean(false, graph);
-            case Byte:
-            case Char:
-            case Short:
-            case Int:
-                return Constant.forInt(0, graph);
-            case Double:
-                return Constant.forDouble(0.0, graph);
-            case Float:
-                return Constant.forFloat(0.0f, graph);
-            case Long:
-                return Constant.forLong(0L, graph);
-            case Object:
-                return Constant.forObject(null, graph);
-            case Word:
-                return Constant.forWord(0L, graph);
-            default:
-                return null;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return super.toString() + "(" + value + ")";
-    }
-
-    @Override
-    public int valueNumber() {
-        return 0x50000000 | value.hashCode();
-    }
-
-    @Override
-    public RiType declaredType() {
-        RiRuntime runtime = compilation().runtime;
-        if (kind.isPrimitive()) {
-            return runtime.asRiType(kind);
-        }
-        return runtime.getTypeOf(asConstant());
-    }
-
-    @Override
-    public RiType exactType() {
-        return declaredType();
-    }
-
-    @Override
-    public String shortName() {
-        return value.name();
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ControlSplit.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code BlockEnd} instruction is a base class for all instructions that end a basic
- * block, including branches, switches, throws, and goto's.
- */
-public abstract class ControlSplit extends FixedNode {
-
-    @Successor    private final NodeSuccessorList<FixedNode> blockSuccessors;
-
-    public FixedNode blockSuccessor(int index) {
-        return blockSuccessors.get(index);
-    }
-
-    public void setBlockSuccessor(int index, FixedNode x) {
-        blockSuccessors.set(index, x);
-    }
-
-    public int blockSuccessorCount() {
-        return blockSuccessors.size();
-    }
-
-    protected final double[] branchProbability;
-
-    /**
-     * Constructs a new block end with the specified value type.
-     * @param kind the type of the value produced by this instruction
-     * @param successors the list of successor blocks. If {@code null}, a new one will be created.
-     */
-    public ControlSplit(CiKind kind, List<? extends FixedNode> blockSuccessors, double[] branchProbability, Graph graph) {
-        this(kind, blockSuccessors.size(), branchProbability, graph);
-        for (int i = 0; i < blockSuccessors.size(); i++) {
-            setBlockSuccessor(i, blockSuccessors.get(i));
-        }
-    }
-
-    public ControlSplit(CiKind kind, int blockSuccessorCount, double[] branchProbability, Graph graph) {
-        super(kind, graph);
-        this.blockSuccessors = new NodeSuccessorList<FixedNode>(this, blockSuccessorCount);
-        assert branchProbability.length == blockSuccessorCount;
-        this.branchProbability = branchProbability;
-    }
-
-    public double probability(int successorIndex) {
-        return branchProbability[successorIndex];
-    }
-
-    public void setProbability(int successorIndex, double x) {
-        branchProbability[successorIndex] = x;
-    }
-
-    /**
-     * Gets the successor corresponding to the default (fall through) case.
-     * @return the default successor
-     */
-    public FixedNode defaultSuccessor() {
-        return blockSuccessor(blockSuccessorCount() - 1);
-    }
-
-    public Iterable<FixedNode> blockSuccessors() {
-        return new Iterable<FixedNode>() {
-            @Override
-            public Iterator<FixedNode> iterator() {
-                return new Iterator<FixedNode>() {
-                    int i = 0;
-                    @Override
-                    public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-                    @Override
-                    public FixedNode next() {
-                        return ControlSplit.this.blockSuccessor(i++);
-                    }
-
-                    @Override
-                    public boolean hasNext() {
-                        return i < ControlSplit.this.blockSuccessorCount();
-                    }
-                };
-            }
-        };
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        StringBuilder str = new StringBuilder();
-        for (int i = 0; i < branchProbability.length; i++) {
-            str.append(i == 0 ? "" : ", ").append(String.format("%7.5f", branchProbability[i]));
-        }
-        properties.put("branchProbability", str.toString());
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Convert.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Convert} class represents a conversion between primitive types.
- */
-public final class Convert extends FloatingNode {
-    @Input private ValueNode value;
-
-    @Data public final int opcode;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    /**
-     * Constructs a new Convert instance.
-     * @param opcode the bytecode representing the operation
-     * @param value the instruction producing the input value
-     * @param kind the result type of this instruction
-     * @param graph
-     */
-    public Convert(int opcode, ValueNode value, CiKind kind, Graph graph) {
-        super(kind, graph);
-        this.opcode = opcode;
-        setValue(value);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitConvert(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/CreateVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,153 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class CreateVectorNode extends AbstractVectorNode {
-    @Input private ValueNode length;
-
-    public ValueNode length() {
-        return length;
-    }
-
-    public void setLength(ValueNode x) {
-        updateUsages(length, x);
-        length = x;
-    }
-
-    private boolean reversed;
-
-    public boolean reversed() {
-        return reversed;
-    }
-
-    public void setReversed(boolean r) {
-        reversed = r;
-    }
-
-    public CreateVectorNode(boolean reversed, ValueNode length, Graph graph) {
-        super(CiKind.Illegal, null, graph);
-        setLength(length);
-        setReversed(reversed);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> debugProperties = super.getDebugProperties();
-        debugProperties.put("reversed", reversed);
-        return debugProperties;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return null;
-        } else if (clazz == LoweringOp.class) {
-            return (T) LOWERING_OP;
-        }
-        return super.lookup(clazz);
-    }
-
-    private LoopBegin createLoop(Map<AbstractVectorNode, ValueNode> map) {
-        EndNode end = new EndNode(graph());
-        LoopBegin loopBegin = new LoopBegin(graph());
-        loopBegin.addEnd(end);
-        Phi loopVariable = new Phi(CiKind.Int, loopBegin, PhiType.Value, graph());
-
-        if (reversed) {
-            IntegerSub add = new IntegerSub(CiKind.Int, loopVariable, Constant.forInt(1, graph()), graph());
-            loopVariable.addInput(new IntegerSub(CiKind.Int, length(), Constant.forInt(1, graph()), graph()));
-            loopVariable.addInput(add);
-        } else {
-            IntegerAdd add = new IntegerAdd(CiKind.Int, loopVariable, Constant.forInt(1, graph()), graph());
-            loopVariable.addInput(Constant.forInt(0, graph()));
-            loopVariable.addInput(add);
-        }
-
-        LoopEnd loopEnd = new LoopEnd(graph());
-        loopEnd.setLoopBegin(loopBegin);
-        loopBegin.setStateAfter(stateAfter());
-        Compare condition;
-        if (reversed) {
-            condition = new Compare(loopVariable, Condition.GE, Constant.forInt(0, graph()), graph());
-        } else {
-            condition = new Compare(loopVariable, Condition.LT, length(), graph());
-        }
-        int expectedLength = 100; // TODO: it may be possible to get a more accurate estimate...?
-        if (length().isConstant()) {
-            expectedLength = length().asConstant().asInt();
-        }
-        If ifNode = new If(condition, 1.0 / expectedLength, graph());
-        loopBegin.setNext(ifNode);
-        ifNode.setTrueSuccessor(loopEnd);
-        this.replaceAtPredecessors(end);
-        ifNode.setFalseSuccessor(this);
-        map.put(this, loopVariable);
-        return loopBegin;
-    }
-
-    private static final LoweringOp LOWERING_OP = new LoweringOp() {
-        @Override
-        public void lower(Node n, CiLoweringTool tool) {
-            CreateVectorNode vectorNode = (CreateVectorNode) n;
-
-            IdentityHashMap<AbstractVectorNode, ValueNode> nodes = new IdentityHashMap<AbstractVectorNode, ValueNode>();
-            LoopBegin begin = vectorNode.createLoop(nodes);
-            for (Node use : vectorNode.usages()) {
-                processUse(begin, use, nodes);
-            }
-        }
-
-        private void processUse(LoopBegin loop, Node use, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
-            AbstractVectorNode vectorNode = (AbstractVectorNode) use;
-            if (nodes.containsKey(vectorNode)) {
-                return;
-            }
-            nodes.put(vectorNode, null);
-
-            // Make sure inputs are evaluated.
-            for (Node input : use.inputs()) {
-                if (input instanceof AbstractVectorNode) {
-                    AbstractVectorNode abstractVectorNodeInput = (AbstractVectorNode) input;
-                    processUse(loop, abstractVectorNodeInput, nodes);
-                }
-            }
-
-            vectorNode.addToLoop(loop, nodes);
-
-            // Go on to usages.
-            for (Node usage : use.usages()) {
-                processUse(loop, usage, nodes);
-            }
-        }
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Deoptimize.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "Deopt")
-public class Deoptimize extends FixedNode {
-
-    public static enum DeoptAction {
-        None,                           // just interpret, do not invalidate nmethod
-        Recompile,                      // recompile the nmethod; need not invalidate
-        InvalidateReprofile,            // invalidate the nmethod, reset IC, maybe recompile
-        InvalidateRecompile,            // invalidate the nmethod, recompile (probably)
-        InvalidateStopCompiling,        // invalidate the nmethod and do not compile
-    }
-
-    private String message;
-    private final DeoptAction action;
-
-    public Deoptimize(DeoptAction action, Graph graph) {
-        super(CiKind.Illegal, graph);
-        this.action = action;
-    }
-
-    public void setMessage(String message) {
-        this.message = message;
-    }
-
-    public String message() {
-        return message;
-    }
-
-    public DeoptAction action() {
-        return action;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitDeoptimize(this);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("message", message);
-        properties.put("action", action);
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/DerivedInductionVariable.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,124 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-/**
- * LinearInductionVariable that is computed in the loops with offset + scale * base.
- * This is computed in the loop only when necessary, puts less pressure on registers.
- */
-public class DerivedInductionVariable extends LinearInductionVariable {
-    @Input private InductionVariable base;
-
-    public DerivedInductionVariable(CiKind kind, ValueNode offset, ValueNode scale, InductionVariable base, Graph graph) {
-        super(kind, offset, scale, graph);
-        setBase(base);
-    }
-
-    public InductionVariable base() {
-        return base;
-    }
-
-    public void setBase(InductionVariable base) {
-        updateUsages(this.base, base);
-        this.base = base;
-    }
-
-    public ValueNode offset() {
-        return a();
-    }
-
-    public void setOffset(ValueNode offset) {
-        setA(offset);
-    }
-
-    public ValueNode scale() {
-        return b();
-    }
-
-    public void setScale(ValueNode scale) {
-        setB(scale);
-    }
-
-    @Override
-    public LoopBegin loopBegin() {
-        return base().loopBegin();
-    }
-
-    @Override
-    public void peelOneIteration() {
-        // nop
-    }
-
-    /**
-     * This will apply strength reduction to this induction variable but will augment register pressure in the loop.
-     * @return the new BasicInductionVariable
-     */
-    public BasicInductionVariable toBasicInductionVariable() {
-        InductionVariable base = base();
-        if (base instanceof DerivedInductionVariable) {
-            base = ((DerivedInductionVariable) base).toBasicInductionVariable();
-        }
-        ValueNode init;
-        ValueNode stride;
-        LoopCounter counter;
-        if (base instanceof BasicInductionVariable) {
-            BasicInductionVariable basic = (BasicInductionVariable) base;
-            // let the canonicalizer do its job with this
-            init = IntegerArithmeticNode.add(offset(), IntegerArithmeticNode.mul(scale(), basic.init()));
-            stride = IntegerArithmeticNode.mul(scale(), basic.stride());
-            counter = basic.loopCounter();
-        } else {
-            assert base instanceof LoopCounter;
-            init = offset();
-            stride = scale();
-            counter = (LoopCounter) base;
-        }
-        BasicInductionVariable newBIV = new BasicInductionVariable(kind, init, stride, counter, graph());
-        this.replaceAndDelete(newBIV);
-        return newBIV;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) LOWERING;
-        }
-        return super.lookup(clazz);
-    }
-
-    private static final LoweringOp LOWERING = new LoweringOp() {
-        @Override
-        public void lower(Node n, CiLoweringTool tool) {
-            DerivedInductionVariable div = (DerivedInductionVariable) n;
-            IntegerArithmeticNode computed = IntegerArithmeticNode.add(div.offset(), IntegerArithmeticNode.mul(div.scale(), div.base()));
-            div.replaceAtNonIVUsages(computed);
-        }
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class EndNode extends FixedNode {
-
-    public EndNode(Graph graph) {
-        super(CiKind.Illegal, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitEndNode(this);
-    }
-
-    public Merge merge() {
-        if (usages().size() == 0) {
-            return null;
-        } else {
-            assert usages().size() == 1;
-            return (Merge) usages().iterator().next();
-        }
-    }
-
-    @Override
-    public boolean verify() {
-        assertTrue(usages().size() <= 1, "at most one usage");
-        return true;
-    }
-
-    @Override
-    public Iterable< ? extends Node> dataUsages() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public Iterable< ? extends Node> cfgSuccessors() {
-        Merge merge = this.merge();
-        if (merge == null) {
-            return Collections.emptyList();
-        }
-        return Arrays.asList(merge);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionEdgeInstruction.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-
-public interface ExceptionEdgeInstruction {
-    FixedNode exceptionEdge();
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ExceptionObject.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code ExceptionObject} instruction represents the incoming exception object to an exception handler.
- */
-public final class ExceptionObject extends StateSplit {
-
-    /**
-     * Constructs a new ExceptionObject instruction.
-     * @param graph
-     */
-    public ExceptionObject(Graph graph) {
-        super(CiKind.Object, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitExceptionObject(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public final class FixedGuard extends FixedNodeWithNext implements Canonicalizable {
-
-    @Input private final NodeInputList<BooleanNode> conditions = new NodeInputList<BooleanNode>(this);
-
-    public FixedGuard(BooleanNode node, Graph graph) {
-        this(graph);
-        addNode(node);
-    }
-
-    public FixedGuard(Graph graph) {
-        super(CiKind.Illegal, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitFixedGuard(this);
-    }
-
-    public void addNode(BooleanNode x) {
-        conditions.add(x);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        for (BooleanNode n : conditions.snapshot()) {
-            if (n instanceof Constant) {
-                Constant c = (Constant) n;
-                if (c.asConstant().asBoolean()) {
-                    conditions.remove(n);
-                } else {
-                    return new Deoptimize(DeoptAction.InvalidateRecompile, graph());
-                }
-            }
-        }
-
-        if (conditions.isEmpty()) {
-            return next();
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public abstract class FixedNode extends ValueNode {
-
-    private double probability;
-
-    public FixedNode(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-
-    public double probability() {
-        return probability;
-    }
-
-    public void setProbability(double probability) {
-        this.probability = probability;
-    }
-
-    protected void copyInto(FixedNode newNode) {
-        newNode.setProbability(probability);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("probability", String.format(Locale.ENGLISH, "%7.5f", probability));
-        return properties;
-    }
-
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedNodeWithNext.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2009, 2010, 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.graph.*;
-import com.sun.cri.ci.*;
-
-public abstract class FixedNodeWithNext extends FixedNode {
-
-    @Successor    private FixedNode next;
-
-    public FixedNode next() {
-        return next;
-    }
-
-    public void setNext(FixedNode x) {
-        updatePredecessors(next, x);
-        next = x;
-    }
-
-    public static final int SYNCHRONIZATION_ENTRY_BCI = -1;
-
-    /**
-     * Constructs a new instruction with the specified value type.
-     * @param kind the value type for this instruction
-     */
-    public FixedNodeWithNext(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatAdd.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "+")
-public final class FloatAdd extends FloatArithmetic implements Canonicalizable {
-
-    public FloatAdd(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, kind == CiKind.Double ? Bytecodes.DADD : Bytecodes.FADD, x, y, isStrictFP, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(x().asConstant().asFloat() + y().asConstant().asFloat(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(x().asConstant().asDouble() + y().asConstant().asDouble(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Float) {
-                float c = y().asConstant().asFloat();
-                if (c == 0.0f) {
-                    return x();
-                }
-            } else {
-                assert kind == CiKind.Double;
-                double c = y().asConstant().asDouble();
-                if (c == 0.0) {
-                    return x();
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatArithmetic.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public abstract class FloatArithmetic extends Arithmetic {
-
-    public FloatArithmetic(CiKind kind, int opcode, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, opcode, x, y, isStrictFP, graph);
-    }
-
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatDiv.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "/")
-public final class FloatDiv extends FloatArithmetic implements Canonicalizable {
-
-    public FloatDiv(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, kind == CiKind.Double ? Bytecodes.DDIV : Bytecodes.FDIV, x, y, isStrictFP, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && y().isConstant()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(x().asConstant().asFloat() / y().asConstant().asFloat(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(x().asConstant().asDouble() / y().asConstant().asDouble(), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatMul.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "*")
-public final class FloatMul extends FloatArithmetic implements Canonicalizable {
-
-    public FloatMul(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, kind == CiKind.Double ? Bytecodes.DMUL : Bytecodes.FMUL, x, y, isStrictFP, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(x().asConstant().asFloat() * y().asConstant().asFloat(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(x().asConstant().asDouble() * y().asConstant().asDouble(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Float) {
-                float c = y().asConstant().asFloat();
-                if (c == 0.0f) {
-                    return Constant.forFloat(0.0f, graph());
-                }
-            } else {
-                assert kind == CiKind.Double;
-                double c = y().asConstant().asDouble();
-                if (c == 0.0) {
-                    return Constant.forDouble(0.0, graph());
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatRem.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "%")
-public final class FloatRem extends FloatArithmetic implements Canonicalizable {
-
-    public FloatRem(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, kind == CiKind.Double ? Bytecodes.DREM : Bytecodes.FREM, x, y, isStrictFP, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && y().isConstant()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(x().asConstant().asFloat() % y().asConstant().asFloat(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(x().asConstant().asDouble() % y().asConstant().asDouble(), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatSub.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "-")
-public final class FloatSub extends FloatArithmetic implements Canonicalizable {
-
-    public FloatSub(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
-        super(kind, kind == CiKind.Double ? Bytecodes.DSUB : Bytecodes.FSUB, x, y, isStrictFP, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x() == y()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(0.0f, graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(0.0, graph());
-            }
-        }
-        if (x().isConstant() && y().isConstant()) {
-            if (kind == CiKind.Float) {
-                return Constant.forFloat(x().asConstant().asFloat() - y().asConstant().asFloat(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                return Constant.forDouble(x().asConstant().asDouble() - y().asConstant().asDouble(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Float) {
-                float c = y().asConstant().asFloat();
-                if (c == 0.0f) {
-                    return x();
-                }
-                return new FloatAdd(kind, x(), Constant.forFloat(-c, graph()), isStrictFP(), graph());
-            } else {
-                assert kind == CiKind.Double;
-                double c = y().asConstant().asDouble();
-                if (c == 0.0) {
-                    return x();
-                }
-                return new FloatAdd(kind, x(), Constant.forDouble(-c, graph()), isStrictFP(), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FloatingNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public abstract class FloatingNode extends ValueNode implements Node.ValueNumberable {
-    public FloatingNode(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/GuardNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public final class GuardNode extends FloatingNode implements Canonicalizable {
-
-    @Input private FixedNode anchor;
-    @Input private BooleanNode node;
-
-    public FixedNode anchor() {
-        return anchor;
-    }
-
-    public void setAnchor(FixedNode x) {
-        updateUsages(anchor, x);
-        anchor = x;
-    }
-
-    /**
-     * The instruction that produces the tested boolean value.
-     */
-    public BooleanNode node() {
-        return node;
-    }
-
-    public void setNode(BooleanNode x) {
-        updateUsages(node, x);
-        node = x;
-    }
-
-    public GuardNode(BooleanNode node, Graph graph) {
-        super(CiKind.Illegal, graph);
-        setNode(node);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitGuardNode(this);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (node() instanceof Constant) {
-            Constant c = (Constant) node();
-            if (c.asConstant().asBoolean()) {
-                if (GraalOptions.TraceCanonicalizer) {
-                    TTY.println("Removing redundant floating guard " + this);
-                }
-                return Node.Null;
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/If.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code If} instruction represents a branch that can go one of two directions depending on the outcome of a
- * comparison.
- */
-public final class If extends ControlSplit implements Canonicalizable {
-
-    @Input private BooleanNode compare;
-
-    public BooleanNode compare() {
-        return compare;
-    }
-
-    public void setCompare(BooleanNode x) {
-        updateUsages(compare, x);
-        compare = x;
-    }
-
-    public If(BooleanNode condition, double probability, Graph graph) {
-        super(CiKind.Illegal, 2, new double[] {probability, 1 - probability}, graph);
-        setCompare(condition);
-    }
-
-    /**
-     * Gets the block corresponding to the true successor.
-     *
-     * @return the true successor
-     */
-    public FixedNode trueSuccessor() {
-        return blockSuccessor(0);
-    }
-
-    /**
-     * Gets the block corresponding to the false successor.
-     *
-     * @return the false successor
-     */
-    public FixedNode falseSuccessor() {
-        return blockSuccessor(1);
-    }
-
-    public void setTrueSuccessor(FixedNode node) {
-        setBlockSuccessor(0, node);
-    }
-
-    public void setFalseSuccessor(FixedNode node) {
-        setBlockSuccessor(1, node);
-    }
-
-    /**
-     * Gets the block corresponding to the specified outcome of the branch.
-     *
-     * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
-     * @return the corresponding successor
-     */
-    public FixedNode successor(boolean istrue) {
-        return blockSuccessor(istrue ? 0 : 1);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitIf(this);
-    }
-
-    @Override
-    public boolean verify() {
-        assertTrue(compare() != null);
-        assertTrue(trueSuccessor() != null);
-        assertTrue(falseSuccessor() != null);
-        return true;
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (compare() instanceof Constant) {
-            Constant c = (Constant) compare();
-            if (c.asConstant().asBoolean()) {
-                return trueSuccessor();
-            } else {
-                return falseSuccessor();
-            }
-        }
-        if (trueSuccessor() instanceof EndNode && falseSuccessor() instanceof EndNode) {
-            EndNode trueEnd = (EndNode) trueSuccessor();
-            EndNode falseEnd = (EndNode) falseSuccessor();
-            Merge merge = trueEnd.merge();
-            if (merge == falseEnd.merge() && merge.phis().size() == 0 && merge.endCount() == 2) {
-                FixedNode next = merge.next();
-                merge.setNext(null); // disconnect to avoid next from having 2 preds
-                return next;
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InductionVariable.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,52 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public abstract class InductionVariable extends FloatingNode {
-
-    public InductionVariable(CiKind kind, Graph graph) {
-        super(kind, graph);
-        assert kind.isInt() || kind.isLong();
-    }
-
-    public abstract LoopBegin loopBegin();
-
-    public abstract void peelOneIteration();
-
-    public void replaceAtNonIVUsages(Node other) {
-        for (Node usage : this.usages().snapshot()) {
-            if (!(usage instanceof InductionVariable)) {
-                usage.replaceFirstInput(this, other);
-            }
-        }
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        // nop
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/InstanceOf.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code InstanceOf} instruction represents an instanceof test.
- */
-public final class InstanceOf extends TypeCheckNode implements Canonicalizable {
-
-    /**
-     * Constructs a new InstanceOf instruction.
-     *
-     * @param targetClass the target class of the instanceof check
-     * @param object the instruction producing the object input to this instruction
-     * @param graph
-     */
-    public InstanceOf(Constant targetClassInstruction, ValueNode object, boolean nullIsTrue, Graph graph) {
-        super(targetClassInstruction, object, CiKind.Illegal, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (object().exactType() != null) {
-            return Constant.forBoolean(object().exactType().isSubtypeOf(targetClass()), graph());
-        }
-        CiConstant constant = object().asConstant();
-        if (constant != null) {
-            assert constant.kind == CiKind.Object;
-            if (constant.isNull()) {
-                return Constant.forBoolean(false, graph());
-            } else {
-                // this should never happen - non-null constants are always expected to provide an exactType
-                assert false;
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerAdd.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2011, 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.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "+")
-public final class IntegerAdd extends IntegerArithmeticNode implements Canonicalizable {
-
-    public IntegerAdd(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IADD : Bytecodes.LADD, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() + y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() + y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Int) {
-                int c = y().asConstant().asInt();
-                if (c == 0) {
-                    return x();
-                }
-            } else {
-                assert kind == CiKind.Long;
-                long c = y().asConstant().asLong();
-                if (c == 0) {
-                    return x();
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerAddVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class IntegerAddVectorNode extends AbstractVectorNode {
-    @Input private ValueNode value;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    public IntegerAddVectorNode(AbstractVectorNode vector, ValueNode value, Graph graph) {
-        super(CiKind.Illegal, vector, graph);
-        setValue(value);
-    }
-
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return null;
-        }
-        return super.lookup(clazz);
-    }
-
-    @Override
-    public void addToLoop(LoopBegin loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
-        nodes.put(this, new IntegerAdd(CiKind.Int, nodes.get(vector()), value(), graph()));
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerArithmeticNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2011, 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.nodes.base.*;
-import com.oracle.max.graal.compiler.util.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public abstract class IntegerArithmeticNode extends Arithmetic {
-
-    public IntegerArithmeticNode(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, opcode, x, y, false, graph);
-        assert kind == CiKind.Int || kind == CiKind.Long;
-    }
-
-    public static IntegerArithmeticNode add(ValueNode v1, ValueNode v2) {
-        assert v1.kind == v2.kind && v1.graph() == v2.graph();
-        Graph graph = v1.graph();
-        //TODO (gd) handle conversions here instead of strong assert ?
-        switch(v1.kind) {
-            case Int:
-                return new IntegerAdd(CiKind.Int, v1, v2, graph);
-            case Long:
-                return new IntegerAdd(CiKind.Long, v1, v2, graph);
-            default:
-                throw Util.shouldNotReachHere();
-        }
-    }
-
-    public static IntegerArithmeticNode mul(ValueNode v1, ValueNode v2) {
-        assert v1.kind == v2.kind && v1.graph() == v2.graph();
-        Graph graph = v1.graph();
-        //TODO (gd) handle conversions here instead of strong assert ?
-        switch(v1.kind) {
-            case Int:
-                return new IntegerMul(CiKind.Int, v1, v2, graph);
-            case Long:
-                return new IntegerMul(CiKind.Long, v1, v2, graph);
-            default:
-                throw Util.shouldNotReachHere();
-        }
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerDiv.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "/")
-public final class IntegerDiv extends IntegerArithmeticNode implements Canonicalizable {
-
-    public IntegerDiv(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IDIV : Bytecodes.LDIV, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && y().isConstant()) {
-            long yConst = y().asConstant().asLong();
-            if (yConst == 0) {
-                return this; // this will trap, can not canonicalize
-            }
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() / (int) yConst, graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() / yConst, graph());
-            }
-        } else if (y().isConstant()) {
-            long c = y().asConstant().asLong();
-            if (c == 1) {
-                return x();
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerMul.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "*")
-public final class IntegerMul extends IntegerArithmeticNode implements Canonicalizable {
-
-    public IntegerMul(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IMUL : Bytecodes.LMUL, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() * y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() * y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            long c = y().asConstant().asLong();
-            if (c == 1) {
-                return x();
-            }
-            if (c == 0) {
-                return Constant.forInt(0, graph());
-            }
-            if (c > 0 && CiUtil.isPowerOf2(c)) {
-                return new LeftShift(kind, x(), Constant.forInt(CiUtil.log2(c), graph()), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerRem.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "%")
-public final class IntegerRem extends IntegerArithmeticNode implements Canonicalizable {
-
-    public IntegerRem(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IREM : Bytecodes.LREM, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant() && y().isConstant()) {
-            long yConst = y().asConstant().asLong();
-            if (yConst == 0) {
-                return this; // this will trap, can not canonicalize
-            }
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() % (int) yConst, graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() % yConst, graph());
-            }
-        } else if (y().isConstant()) {
-            long c = y().asConstant().asLong();
-            if (c == 1 || c == -1) {
-                if (kind == CiKind.Int) {
-                    return Constant.forInt(0, graph());
-                } else {
-                    assert kind == CiKind.Long;
-                    return Constant.forLong(0, graph());
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IntegerSub.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "-")
-public final class IntegerSub extends IntegerArithmeticNode implements Canonicalizable {
-
-    public IntegerSub(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.ISUB : Bytecodes.LSUB, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x() == y()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(0, graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(0, graph());
-            }
-        }
-        if (x().isConstant() && y().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() - y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() - y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            long c = y().asConstant().asLong();
-            if (c == 0) {
-                return x();
-            }
-            if (kind == CiKind.Int) {
-                return new IntegerAdd(kind, x(), Constant.forInt((int) -c, graph()), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return new IntegerAdd(kind, x(), Constant.forLong(-c, graph()), graph());
-            }
-        } else if (x().isConstant()) {
-            long c = x().asConstant().asLong();
-            if (c == 0) {
-                return new Negate(y(), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Invoke.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code Invoke} instruction represents all kinds of method calls.
- */
-public final class Invoke extends AbstractMemoryCheckpointNode implements ExceptionEdgeInstruction {
-
-    @Successor private FixedNode exceptionEdge;
-
-    @Input private final NodeInputList<ValueNode> arguments;
-
-    @Override
-    public FixedNode exceptionEdge() {
-        return exceptionEdge;
-    }
-
-    public void setExceptionEdge(FixedNode x) {
-        updatePredecessors(exceptionEdge, x);
-        exceptionEdge = x;
-    }
-
-    private final int argumentCount;
-
-    private boolean canInline = true;
-
-    public boolean canInline() {
-        return canInline;
-    }
-
-    public void setCanInline(boolean b) {
-        canInline = b;
-    }
-
-    public NodeInputList<ValueNode> arguments() {
-        return arguments;
-    }
-
-    public final int opcode;
-    public final RiMethod target;
-    public final RiType returnType;
-    public final int bci; // XXX needed because we can not compute the bci from the sateBefore bci of this Invoke was optimized from INVOKEINTERFACE to INVOKESPECIAL
-
-    /**
-     * Constructs a new Invoke instruction.
-     *
-     * @param opcode the opcode of the invoke
-     * @param result the result type
-     * @param args the list of instructions producing arguments to the invocation, including the receiver object
-     * @param isStatic {@code true} if this call is static (no receiver object)
-     * @param target the target method being called
-     */
-    public Invoke(int bci, int opcode, CiKind result, ValueNode[] args, RiMethod target, RiType returnType, Graph graph) {
-        super(result, graph);
-        arguments = new NodeInputList<ValueNode>(this, args.length);
-        this.opcode = opcode;
-        this.target = target;
-        this.returnType = returnType;
-        this.bci = bci;
-
-        this.argumentCount = args.length;
-        for (int i = 0; i < args.length; i++) {
-            arguments().set(i, args[i]);
-        }
-    }
-
-    /**
-     * Gets the opcode of this invoke instruction.
-     * @return the opcode
-     */
-    public int opcode() {
-        return opcode;
-    }
-
-    /**
-     * Checks whether this is an invocation of a static method.
-     * @return {@code true} if the invocation is a static invocation
-     */
-    public boolean isStatic() {
-        return opcode == Bytecodes.INVOKESTATIC;
-    }
-
-    @Override
-    public RiType declaredType() {
-        return returnType;
-    }
-
-    /**
-     * Gets the instruction that produces the receiver object for this invocation, if any.
-     * @return the instruction that produces the receiver object for this invocation if any, {@code null} if this
-     *         invocation does not take a receiver object
-     */
-    public ValueNode receiver() {
-        assert !isStatic();
-        return arguments().get(0);
-    }
-
-    /**
-     * Gets the target method for this invocation instruction.
-     * @return the target method
-     */
-    public RiMethod target() {
-        return target;
-    }
-
-    /**
-     * Checks whether this invocation has a receiver object.
-     * @return {@code true} if this invocation has a receiver object; {@code false} otherwise, if this is a
-     *         static call
-     */
-    public boolean hasReceiver() {
-        return !isStatic();
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitInvoke(this);
-    }
-
-    @Override
-    public String toString() {
-        return super.toString() + target;
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("opcode", Bytecodes.nameOf(opcode));
-        properties.put("target", CiUtil.format("%H.%n(%p):%r", target, false));
-        properties.put("bci", bci);
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsNonNull.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code NullCheck} class represents an explicit null check instruction.
- */
-public final class IsNonNull extends BooleanNode implements Canonicalizable {
-
-    @Input private ValueNode object;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    /**
-     * Constructs a new NullCheck instruction.
-     *
-     * @param object the instruction producing the object to check against null
-     * @param graph
-     */
-    public IsNonNull(ValueNode object, Graph graph) {
-        super(CiKind.Object, graph);
-        assert object == null || object.kind == CiKind.Object : object;
-        setObject(object);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        // Nothing to do.
-    }
-
-    @Override
-    public RiType declaredType() {
-        // null check does not alter the type of the object
-        return object().declaredType();
-    }
-
-    @Override
-    public RiType exactType() {
-        // null check does not alter the type of the object
-        return object().exactType();
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (object() instanceof NewInstance || object() instanceof NewArray) {
-            return Constant.forBoolean(true, graph());
-        }
-        CiConstant constant = object().asConstant();
-        if (constant != null) {
-            assert constant.kind == CiKind.Object;
-            return Constant.forBoolean(constant.isNonNull(), graph());
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/IsType.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,100 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code TypeCheck} class represents an explicit type check instruction.
- */
-public final class IsType extends BooleanNode implements Canonicalizable {
-
-    @Input private ValueNode object;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    private final RiType type;
-
-    /**
-     * Constructs a new IsType instruction.
-     *
-     * @param object the instruction producing the object to check against the given type
-     * @param graph
-     */
-    public IsType(ValueNode object, RiType type, Graph graph) {
-        super(CiKind.Object, graph);
-        assert type.isResolved();
-        assert object == null || object.kind == CiKind.Object;
-        this.type = type;
-        setObject(object);
-    }
-
-    public RiType type() {
-        return type;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        // Nothing to do.
-    }
-
-    @Override
-    public RiType declaredType() {
-        // type check does not alter the type of the object
-        return object().declaredType();
-    }
-
-    @Override
-    public RiType exactType() {
-        return type;
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("type", type);
-        return properties;
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (object().exactType() != null) {
-            return Constant.forBoolean(object().exactType() == type(), graph());
-        }
-        // constants return the correct exactType, so they are handled by the code above
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LeftShift.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "<<")
-public final class LeftShift extends ShiftNode implements Canonicalizable {
-
-    public LeftShift(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.ISHL : Bytecodes.LSHL, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (y().isConstant()) {
-            int amount = y().asConstant().asInt();
-            int originalAmout = amount;
-            int mask;
-            if (kind == CiKind.Int) {
-                mask = 0x1f;
-            } else {
-                assert kind == CiKind.Long;
-                mask = 0x3f;
-            }
-            amount &= mask;
-            if (x().isConstant()) {
-                if (kind == CiKind.Int) {
-                    return Constant.forInt(x().asConstant().asInt() << amount, graph());
-                } else {
-                    assert kind == CiKind.Long;
-                    return Constant.forLong(x().asConstant().asLong() << amount, graph());
-                }
-            }
-            if (amount == 0) {
-                return x();
-            }
-            if (x() instanceof ShiftNode) {
-                ShiftNode other = (ShiftNode) x();
-                if (other.y().isConstant()) {
-                    int otherAmount = other.y().asConstant().asInt() & mask;
-                    if (other instanceof LeftShift) {
-                        int total = amount + otherAmount;
-                        if (total != (total & mask)) {
-                            return Constant.forInt(0, graph());
-                        }
-                        return new LeftShift(kind, other.x(), Constant.forInt(total, graph()), graph());
-                    } else if ((other instanceof RightShift || other instanceof UnsignedRightShiftNode) && otherAmount == amount) {
-                        if (kind == CiKind.Long) {
-                            return new And(kind, other.x(), Constant.forLong(-1L << amount, graph()), graph());
-                        } else {
-                            assert kind == CiKind.Int;
-                            return new And(kind, other.x(), Constant.forInt(-1 << amount, graph()), graph());
-                        }
-                    }
-                }
-            }
-            if (originalAmout != amount) {
-                return new LeftShift(kind, x(), Constant.forInt(amount, graph()), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LinearInductionVariable.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * InductionVariable of the form a+b*x.
- */
-public abstract class LinearInductionVariable extends InductionVariable {
-    @Input private ValueNode a;
-    @Input private ValueNode b;
-
-    public LinearInductionVariable(CiKind kind, ValueNode a, ValueNode b, Graph graph) {
-        super(kind, graph);
-        setA(a);
-        setB(b);
-    }
-
-    protected ValueNode a() {
-        return a;
-    }
-
-    protected ValueNode b() {
-        return b;
-    }
-
-    protected void setA(ValueNode a) {
-        updateUsages(this.a, a);
-        this.a = a;
-    }
-
-
-    protected void setB(ValueNode b) {
-        updateUsages(this.b, b);
-        this.b = b;
-    }
-
-    public boolean isLinearInductionVariableInput(Node n) {
-        return n == a() || n == b();
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadField.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code LoadField} instruction represents a read of a static or instance field.
- */
-public final class LoadField extends AccessField implements Canonicalizable {
-
-    /**
-     * Creates a new LoadField instance.
-     *
-     * @param object the receiver object
-     * @param field the compiler interface field
-     * @param isStatic indicates if the field is static
-     * @param stateAfter the state after the field access
-     * @param graph
-     * @param isLoaded indicates if the class is loaded
-     */
-    public LoadField(ValueNode object, RiField field, Graph graph) {
-        super(field.kind().stackKind(), object, field, graph);
-    }
-
-    /**
-     * Gets the declared type of the field being accessed.
-     *
-     * @return the declared type of the field being accessed.
-     */
-    @Override
-    public RiType declaredType() {
-        return field().type();
-    }
-
-    /**
-     * Gets the exact type of the field being accessed. If the field type is a primitive array or an instance class and
-     * the class is loaded and final, then the exact type is the same as the declared type. Otherwise it is {@code null}
-     *
-     * @return the exact type of the field if known; {@code null} otherwise
-     */
-    @Override
-    public RiType exactType() {
-        RiType declared = declaredType();
-        return declared != null && declared.isResolved() ? declared.exactType() : null;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLoadField(this);
-    }
-
-    @Override
-    public boolean needsStateAfter() {
-        return false;
-    }
-
-    /**
-     * Gets a constant value to which this load can be reduced.
-     *
-     * @return {@code null} if this load cannot be reduced to a constant
-     */
-    private CiConstant constantValue() {
-        if (isStatic()) {
-            return field.constantValue(null);
-        } else if (object().isConstant()) {
-            return field.constantValue(object().asConstant());
-        }
-        return null;
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        CiConstant constant = null;
-        if (isStatic()) {
-            constant = field().constantValue(null);
-        } else if (object().isConstant()) {
-            constant = field().constantValue(object().asConstant());
-        }
-        if (constant != null) {
-            return new Constant(constant, graph());
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoadIndexed.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code LoadIndexed} instruction represents a read from an element of an array.
- */
-public final class LoadIndexed extends AccessIndexed {
-
-    /**
-     * Creates a new LoadIndexed instruction.
-     * @param array the instruction producing the array
-     * @param index the instruction producing the index
-     * @param length the instruction producing the length
-     * @param elementKind the element type
-     * @param graph
-     */
-    public LoadIndexed(ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, Graph graph) {
-        super(elementKind.stackKind(), array, index, length, elementKind, graph);
-    }
-
-    /**
-     * Gets the declared type of this instruction's result.
-     * @return the declared type
-     */
-    @Override
-    public RiType declaredType() {
-        RiType arrayType = array().declaredType();
-        if (arrayType == null) {
-            return null;
-        }
-        return arrayType.componentType();
-    }
-
-    /**
-     * Gets the exact type of this instruction's result.
-     * @return the exact type
-     */
-    @Override
-    public RiType exactType() {
-        RiType declared = declaredType();
-        return declared != null && declared.isResolved() ? declared.exactType() : null;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLoadIndexed(this);
-    }
-
-    @Override
-    public boolean needsStateAfter() {
-        return false;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) DELEGATE_TO_RUNTIME;
-        }
-        return super.lookup(clazz);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Local.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code Local} instruction is a placeholder for an incoming argument
- * to a function call.
- */
-public final class Local extends FloatingNode {
-
-    @Input    private StartNode start;
-
-    public StartNode start() {
-        return start;
-    }
-
-    public void setStart(StartNode x) {
-        updateUsages(start, x);
-        start = x;
-    }
-
-    private final int index;
-    private RiType declaredType;
-
-    public Local(CiKind kind, int javaIndex, Graph graph) {
-        super(kind, graph);
-        this.index = javaIndex;
-        setStart(graph.start());
-    }
-
-    /**
-     * Gets the index of this local.
-     * @return the index
-     */
-    public int index() {
-        return index;
-    }
-
-    /**
-     * Sets the declared type of this local, e.g. derived from the signature of the method.
-     * @param declaredType the declared type of the local variable
-     */
-    public void setDeclaredType(RiType declaredType) {
-        this.declaredType = declaredType;
-    }
-
-    /**
-     * Computes the declared type of the result of this instruction, if possible.
-     * @return the declared type of the result of this instruction, if it is known; {@code null} otherwise
-     */
-    @Override
-    public RiType declaredType() {
-        return declaredType;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLocal(this);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("index", index());
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LocationNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ci.CiAddress.Scale;
-
-
-public final class LocationNode extends FloatingNode {
-    @Input private ValueNode index;
-
-    @Data private int displacement;
-    @Data private boolean indexScalingEnabled = true;
-    @Data private CiKind valueKind;
-    @Data private Object locationIdentity;
-
-    public ValueNode index() {
-        return index;
-    }
-
-    public void setIndex(ValueNode x) {
-        updateUsages(index, x);
-        index = x;
-    }
-
-    public static final Object UNSAFE_ACCESS_LOCATION = new Object();
-    public static final Object FINAL_LOCATION = new Object();
-
-    public static Object getArrayLocation(CiKind elementKind) {
-        return elementKind;
-    }
-
-    public int displacement() {
-        return displacement;
-    }
-
-    /**
-     * @return whether scaling of the index by the value kind's size is enabled (the default) or disabled.
-     */
-    public boolean indexScalingEnabled() {
-        return indexScalingEnabled;
-    }
-
-    /**
-     * Enables or disables scaling of the index by the value kind's size. Has no effect if the index input is not used.
-     */
-    public void setIndexScalingEnabled(boolean enable) {
-        this.indexScalingEnabled = enable;
-    }
-
-    public static LocationNode create(Object identity, CiKind kind, int displacement, Graph graph) {
-        LocationNode result = new LocationNode(identity, kind, displacement, graph);
-        return graph.value(result);
-    }
-
-    private LocationNode(Object identity, CiKind kind, int displacement, Graph graph) {
-        super(CiKind.Illegal, graph);
-        this.displacement = displacement;
-        this.valueKind = kind;
-        this.locationIdentity = identity;
-    }
-
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return null;
-        }
-        return super.lookup(clazz);
-    }
-
-    public CiKind getValueKind() {
-        return valueKind;
-    }
-
-    public CiAddress createAddress(LIRGeneratorTool lirGenerator, ValueNode object) {
-        CiValue indexValue = CiValue.IllegalValue;
-        Scale indexScale = Scale.Times1;
-        if (this.index() != null) {
-            indexValue = lirGenerator.load(this.index());
-            if (indexScalingEnabled) {
-                indexScale = Scale.fromInt(valueKind.sizeInBytes(lirGenerator.target().wordSize));
-            }
-        }
-        return new CiAddress(valueKind, lirGenerator.load(object), indexValue, indexScale, displacement);
-    }
-
-    public Object locationIdentity() {
-        return locationIdentity;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Logic.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code LogicOp} class definition.
- */
-public abstract class Logic extends Binary {
-
-    /**
-     * Constructs a new logic operation instruction.
-     * @param opcode the opcode of the logic operation
-     * @param x the first input into this instruction
-     * @param y the second input into this instruction
-     */
-    public Logic(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, opcode, x, y, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLogic(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LookupSwitch.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.cfg.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-
-/**
- * The {@code LookupSwitch} instruction represents a lookup switch bytecode, which has a sorted
- * array of key values.
- */
-public final class LookupSwitch extends SwitchNode {
-
-    private static final int INPUT_COUNT = 0;
-    private static final int SUCCESSOR_COUNT = 0;
-
-    final int[] keys;
-
-    /**
-     * Constructs a new LookupSwitch instruction.
-     * @param value the instruction producing the value being switched on
-     * @param successors the list of successors
-     * @param keys the list of keys, sorted
-     * @param stateAfter the state after the switch
-     * @param graph
-     */
-    public LookupSwitch(ValueNode value, List<? extends FixedNode> successors, int[] keys, double[] probability, Graph graph) {
-        super(value, successors, probability, INPUT_COUNT, SUCCESSOR_COUNT, graph);
-        this.keys = keys;
-    }
-
-    /**
-     * Gets the key at the specified index.
-     * @param i the index
-     * @return the key at that index
-     */
-    public int keyAt(int i) {
-        return keys[i];
-    }
-
-    public int keysLength() {
-        return keys.length;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLookupSwitch(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopBegin.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.compiler.util.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public class LoopBegin extends Merge {
-
-    private double loopFrequency;
-
-    public LoopBegin(Graph graph) {
-        super(graph);
-        loopFrequency = 1;
-    }
-
-    public double loopFrequency() {
-        return loopFrequency;
-    }
-
-    public void setLoopFrequency(double loopFrequency) {
-        this.loopFrequency = loopFrequency;
-    }
-
-    public LoopEnd loopEnd() {
-        for (Node usage : usages()) {
-            if (usage instanceof LoopEnd) {
-                LoopEnd end = (LoopEnd) usage;
-                if (end.loopBegin() == this) {
-                    return end;
-                }
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLoopBegin(this);
-    }
-
-    @Override
-    public int phiPredecessorCount() {
-        return 2;
-    }
-
-    @Override
-    public int phiPredecessorIndex(Node pred) {
-        if (pred == forwardEdge()) {
-            return 0;
-        } else if (pred == this.loopEnd()) {
-            return 1;
-        }
-        throw Util.shouldNotReachHere("unknown pred : " + pred + "(sp=" + forwardEdge() + ", le=" + this.loopEnd() + ")");
-    }
-
-    @Override
-    public Node phiPredecessorAt(int index) {
-        if (index == 0) {
-            return forwardEdge();
-        } else if (index == 1) {
-            return loopEnd();
-        }
-        throw Util.shouldNotReachHere();
-    }
-
-    public Collection<InductionVariable> inductionVariables() {
-        return Util.filter(this.usages(), InductionVariable.class);
-    }
-
-    @Override
-    public Iterable<? extends Node> phiPredecessors() {
-        return Arrays.asList(new Node[]{this.forwardEdge(), this.loopEnd()});
-    }
-
-    public EndNode forwardEdge() {
-        return this.endAt(0);
-    }
-
-    public LoopCounter loopCounter() {
-        return loopCounter(CiKind.Long);
-    }
-
-    public LoopCounter loopCounter(CiKind kind) {
-        for (Node usage : usages()) {
-            if (usage instanceof LoopCounter && ((LoopCounter) usage).kind == kind) {
-                return (LoopCounter) usage;
-            }
-        }
-        return new LoopCounter(kind, this, graph());
-    }
-
-    @Override
-    public boolean verify() {
-        assertTrue(loopEnd() != null);
-        assertTrue(forwardEdge() != null);
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "LoopBegin: " + super.toString();
-    }
-
-    @Override
-    public Iterable< ? extends Node> dataUsages() {
-        final Iterator< ? extends Node> dataUsages = super.dataUsages().iterator();
-        return new Iterable<Node>() {
-            @Override
-            public Iterator<Node> iterator() {
-                return new StateSplit.FilteringIterator(dataUsages, LoopEnd.class);
-            }
-        };
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("loopFrequency", String.format("%7.1f", loopFrequency));
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopCounter.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * Counts loop iterations from 0 to Niter.
- * If used directly (and not just by BasicInductionVariables) computed with Phi(0, this + 1)
- */
-public final class LoopCounter extends InductionVariable {
-    @Input private LoopBegin loopBegin;
-
-    @Override
-    public LoopBegin loopBegin() {
-        return loopBegin;
-    }
-
-    public void setLoopBegin(LoopBegin x) {
-        updateUsages(loopBegin, x);
-        loopBegin = x;
-    }
-
-    public LoopCounter(CiKind kind, LoopBegin loop, Graph graph) {
-        super(kind, graph);
-        setLoopBegin(loop);
-    }
-
-    @Override
-    public void peelOneIteration() {
-        BasicInductionVariable biv = null;
-        for (Node usage : usages()) {
-            if (!(usage instanceof InductionVariable && ((InductionVariable) usage).loopBegin() == this.loopBegin())) {
-                if (biv == null) {
-                    biv = createBasicInductionVariable();
-                    biv.peelOneIteration();
-                }
-                usage.inputs().replace(this, biv);
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) LOWERING;
-        }
-        return super.lookup(clazz);
-    }
-
-    private BasicInductionVariable createBasicInductionVariable() {
-        Graph graph = graph();
-        return new BasicInductionVariable(kind, Constant.forInt(0, graph), Constant.forInt(1, graph), this, graph);
-    }
-
-    private static final LoweringOp LOWERING = new LoweringOp() {
-        @Override
-        public void lower(Node n, CiLoweringTool tool) {
-            LoopCounter loopCounter = (LoopCounter) n;
-            Graph graph = n.graph();
-            Phi phi = BasicInductionVariable.LOWERING.ivToPhi(loopCounter.loopBegin(), Constant.forInt(0, graph), Constant.forInt(1, graph), loopCounter.kind);
-            loopCounter.replaceAtNonIVUsages(phi);
-        }
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/LoopEnd.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public class LoopEnd extends FixedNode {
-
-    @Input    private LoopBegin loopBegin;
-
-    public LoopBegin loopBegin() {
-        return loopBegin;
-    }
-
-    public void setLoopBegin(LoopBegin x) {
-        updateUsages(this.loopBegin, x);
-        this.loopBegin = x;
-    }
-
-    public LoopEnd(Graph graph) {
-        super(CiKind.Illegal, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitLoopEnd(this);
-    }
-
-    @Override
-    public Iterable< ? extends Node> dataInputs() {
-        return Collections.emptyList();
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.graph.*;
-
-public final class MaterializeNode extends Conditional {
-    public MaterializeNode(BooleanNode value, Graph graph) {
-        super(value, Constant.forInt(1, graph), Constant.forInt(0, graph), graph);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MathIntrinsic.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-
-public class MathIntrinsic extends FloatingNode {
-
-    @Input private ValueNode x;
-    @Data private final Operation operation;
-
-    public enum Operation {
-        ABS, SQRT,
-    }
-
-    public ValueNode x() {
-        return x;
-    }
-
-    private void setX(ValueNode x) {
-        updateUsages(this.x, x);
-        this.x = x;
-    }
-
-    public Operation operation() {
-        return operation;
-    }
-
-    public MathIntrinsic(ValueNode x, Operation op, Graph graph) {
-        super(x.kind, graph);
-        setX(x);
-        this.operation = op;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMathIntrinsic(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,220 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.compiler.util.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * Denotes the beginning of a basic block, and holds information
- * about the basic block, including the successor and
- * predecessor blocks, exception handlers, liveness information, etc.
- */
-public class Merge extends StateSplit {
-
-    @Input    private final NodeInputList<EndNode> ends = new NodeInputList<EndNode>(this);
-
-    public Merge(Graph graph) {
-        super(CiKind.Illegal, graph);
-    }
-
-    @Override
-    public boolean needsStateAfter() {
-        return false;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMerge(this);
-    }
-
-    public int endIndex(EndNode end) {
-        return ends.indexOf(end);
-    }
-
-    public void addEnd(EndNode end) {
-        ends.add(end);
-    }
-
-    public int endCount() {
-        return ends.size();
-    }
-
-    public EndNode endAt(int index) {
-        return ends.get(index);
-    }
-
-    public Iterable<? extends Node> phiPredecessors() {
-        return ends;
-    }
-
-    @Override
-    public Iterable<EndNode> cfgPredecessors() {
-        return ends;
-    }
-
-    @Override
-    public Iterable< ? extends Node> dataInputs() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("merge #");
-        builder.append(id());
-        builder.append(" [");
-
-        builder.append("]");
-
-        builder.append(" -> ");
-        boolean hasSucc = false;
-        for (Node s : this.successors()) {
-            if (hasSucc) {
-                builder.append(", ");
-            }
-            builder.append("#");
-            if (s != null) {
-                builder.append(s.id());
-            } else {
-                builder.append("null");
-            }
-            hasSucc = true;
-        }
-        return builder.toString();
-    }
-
-    public void printWithoutPhis(LogStream out) {
-        // print block id
-        out.print("B").print(id()).print(" ");
-
-        // print flags
-        StringBuilder sb = new StringBuilder(8);
-        if (sb.length() != 0) {
-            out.print('(').print(sb.toString()).print(')');
-        }
-
-        // print block bci range
-        out.print('[').print(-1).print(", ").print(-1).print(']');
-
-        // print block successors
-        //if (end != null && end.blockSuccessors().size() > 0) {
-            out.print(" .");
-            for (Node successor : this.successors()) {
-                if (successor instanceof ValueNode) {
-                    out.print((ValueNode) successor);
-                } else {
-                    out.print(successor.toString());
-                }
-            }
-        //}
-
-        // print predecessors
-//        if (!blockPredecessors().isEmpty()) {
-//            out.print(" pred:");
-//            for (Instruction pred : blockPredecessors()) {
-//                out.print(pred.block());
-//            }
-//        }
-    }
-
-    /**
-     * Determines if a given instruction is a phi whose {@linkplain Phi#merge() join block} is a given block.
-     *
-     * @param value the instruction to test
-     * @param block the block that may be the join block of {@code value} if {@code value} is a phi
-     * @return {@code true} if {@code value} is a phi and its join block is {@code block}
-     */
-    private boolean isPhiAtBlock(ValueNode value) {
-        return value instanceof Phi && ((Phi) value).merge() == this;
-    }
-
-
-    /**
-     * Formats a given instruction as a value in a {@linkplain FrameState frame state}. If the instruction is a phi defined at a given
-     * block, its {@linkplain Phi#valueCount() inputs} are appended to the returned string.
-     *
-     * @param index the index of the value in the frame state
-     * @param value the frame state value
-     * @param block if {@code value} is a phi, then its inputs are formatted if {@code block} is its
-     *            {@linkplain Phi#merge() join point}
-     * @return the instruction representation as a string
-     */
-    public String stateString(int index, ValueNode value) {
-        StringBuilder sb = new StringBuilder(30);
-        sb.append(String.format("%2d  %s", index, Util.valueString(value)));
-        if (value instanceof Phi) {
-            Phi phi = (Phi) value;
-            // print phi operands
-            if (phi.merge() == this) {
-                sb.append(" [");
-                for (int j = 0; j < phi.valueCount(); j++) {
-                    sb.append(' ');
-                    ValueNode operand = phi.valueAt(j);
-                    if (operand != null) {
-                        sb.append(Util.valueString(operand));
-                    } else {
-                        sb.append("NULL");
-                    }
-                }
-                sb.append("] ");
-            }
-        }
-        return sb.toString();
-    }
-
-    public void removeEnd(EndNode pred) {
-        int predIndex = ends.indexOf(pred);
-        assert predIndex != -1;
-        ends.remove(predIndex);
-
-        for (Node usage : usages()) {
-            if (usage instanceof Phi) {
-                ((Phi) usage).removeInput(predIndex);
-            }
-        }
-    }
-
-    public int phiPredecessorCount() {
-        return endCount();
-    }
-
-    public int phiPredecessorIndex(Node pred) {
-        EndNode end = (EndNode) pred;
-        return endIndex(end);
-    }
-
-    public Node phiPredecessorAt(int index) {
-        return endAt(index);
-    }
-
-    public Collection<Phi> phis() {
-        return Util.filter(this.usages(), Phi.class);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorAddress.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2010, 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 java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * Instruction that is used to refer to the address of an on-stack monitor.
- */
-public final class MonitorAddress extends ValueNode {
-
-    private int monitorIndex;
-
-    public MonitorAddress(int monitorIndex, Graph graph) {
-        super(CiKind.Word, graph);
-        this.monitorIndex = monitorIndex;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMonitorAddress(this);
-    }
-
-    public int monitorIndex() {
-        return monitorIndex;
-    }
-
-    public void setMonitorIndex(int monitorIndex) {
-        this.monitorIndex = monitorIndex;
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("monitorIndex", monitorIndex);
-        return properties;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorEnter.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-
-/**
- * The {@code MonitorEnter} instruction represents the acquisition of a monitor.
- */
-public final class MonitorEnter extends AccessMonitor {
-
-    /**
-     * Creates a new MonitorEnter instruction.
-     *
-     * @param object the instruction producing the object
-     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
-     * @param lockNumber the number of the lock
-     * @param graph
-     */
-    public MonitorEnter(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
-        super(object, lockAddress, lockNumber, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMonitorEnter(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MonitorExit.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-
-/**
- * The {@code MonitorExit} instruction represents a monitor release.
- */
-public final class MonitorExit extends AccessMonitor {
-
-    /**
-     * Creates a new MonitorExit instruction.
-     *
-     * @param object the instruction produces the object value
-     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
-     * @param lockNumber the number of the lock
-     * @param graph
-     */
-    public MonitorExit(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
-        super(object, lockAddress, lockNumber, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMonitorExit(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Negate.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code NegateOp} instruction negates its operand.
- */
-public final class Negate extends FloatingNode implements Canonicalizable {
-
-    @Input
-    private ValueNode x;
-
-    public ValueNode x() {
-        return x;
-    }
-
-    public void setX(ValueNode x) {
-        updateUsages(this.x, x);
-        this.x = x;
-    }
-
-    /**
-     * Creates new NegateOp instance.
-     *
-     * @param x the instruction producing the value that is input to this instruction
-     */
-    public Negate(ValueNode x, Graph graph) {
-        super(x.kind, graph);
-        setX(x);
-    }
-
-    // for copying
-    private Negate(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNegate(this);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x().isConstant()) {
-            switch (x().kind) {
-                case Int:
-                    return Constant.forInt(-x().asConstant().asInt(), graph());
-                case Long:
-                    return Constant.forLong(-x().asConstant().asLong(), graph());
-                case Float:
-                    return Constant.forFloat(-x().asConstant().asFloat(), graph());
-                case Double:
-                    return Constant.forDouble(-x().asConstant().asDouble(), graph());
-            }
-        }
-        if (x() instanceof Negate) {
-            return ((Negate) x()).x();
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NegateBooleanNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-public final class NegateBooleanNode extends BooleanNode implements Canonicalizable {
-
-    @Input private BooleanNode value;
-
-    public BooleanNode value() {
-        return value;
-    }
-
-    public void setValue(BooleanNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    public NegateBooleanNode(BooleanNode value, Graph graph) {
-        super(CiKind.Int, graph);
-        setValue(value);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (value() instanceof NegateBooleanNode) {
-            return ((NegateBooleanNode) value()).value();
-        } else if (value() instanceof Constant) {
-            return Constant.forBoolean(!value().asConstant().asBoolean(), graph());
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,179 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code NewArray} class is the base of all instructions that allocate arrays.
- */
-public abstract class NewArray extends FixedNodeWithNext {
-
-    @Input    private ValueNode length;
-
-    public ValueNode length() {
-        return length;
-    }
-
-    public void setLength(ValueNode x) {
-        updateUsages(this.length, x);
-        this.length = x;
-    }
-
-    /**
-     * Constructs a new NewArray instruction.
-     * @param length the instruction that produces the length for this allocation
-     * @param graph
-     */
-    NewArray(ValueNode length, Graph graph) {
-        super(CiKind.Object, graph);
-        setLength(length);
-    }
-
-    /**
-     * The list of instructions which produce input for this instruction.
-     */
-    public ValueNode dimension(int index) {
-        assert index == 0;
-        return length();
-    }
-
-    /**
-     * The rank of the array allocated by this instruction, i.e. how many array dimensions.
-     */
-    public int dimensionCount() {
-        return 1;
-    }
-
-    public abstract CiKind elementKind();
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("exactType", exactType());
-        return properties;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == EscapeOp.class) {
-            return (T) ESCAPE;
-        }
-        return super.lookup(clazz);
-    }
-
-    private static final EscapeOp ESCAPE = new EscapeOp() {
-
-        @Override
-        public boolean canAnalyze(Node node) {
-            NewArray x = (NewArray) node;
-            CiConstant length = x.dimension(0).asConstant();
-            return length != null && length.asInt() >= 0 && length.asInt() < GraalOptions.MaximumEscapeAnalysisArrayLength;
-        }
-
-        @Override
-        public boolean escape(Node node, Node usage) {
-            if (usage instanceof LoadIndexed) {
-                LoadIndexed x = (LoadIndexed) usage;
-                assert x.array() == node;
-                CiConstant index = x.index().asConstant();
-                CiConstant length = ((NewArray) node).dimension(0).asConstant();
-                if (index == null || length == null || index.asInt() < 0 || index.asInt() >= length.asInt()) {
-                    return true;
-                }
-                return false;
-            } else if (usage instanceof StoreFieldNode) {
-                StoreFieldNode x = (StoreFieldNode) usage;
-                assert x.value() == node;
-                return true;
-            } else if (usage instanceof StoreIndexedNode) {
-                StoreIndexedNode x = (StoreIndexedNode) usage;
-                CiConstant index = x.index().asConstant();
-                CiConstant length = ((NewArray) node).dimension(0).asConstant();
-                if (index == null || length == null || index.asInt() < 0 || index.asInt() >= length.asInt()) {
-                    return true;
-                }
-                return x.value() == node && x.array() != node;
-            } else if (usage instanceof ArrayLength) {
-                ArrayLength x = (ArrayLength) usage;
-                assert x.array() == node;
-                return false;
-            } else if (usage instanceof VirtualObjectFieldNode) {
-                return false;
-            } else {
-                return super.escape(node, usage);
-            }
-        }
-
-        @Override
-        public EscapeField[] fields(Node node) {
-            NewArray x = (NewArray) node;
-            int length = x.dimension(0).asConstant().asInt();
-            EscapeField[] fields = new EscapeField[length];
-            for (int i = 0; i < length; i++) {
-                Integer representation = i;
-                fields[i] = new EscapeField("[" + i + "]", representation, ((NewArray) node).elementKind());
-            }
-            return fields;
-        }
-
-        @Override
-        public void beforeUpdate(Node node, Node usage) {
-            if (usage instanceof ArrayLength) {
-                ArrayLength x = (ArrayLength) usage;
-                x.replaceAndDelete(((NewArray) node).dimension(0));
-            } else {
-                super.beforeUpdate(node, usage);
-            }
-        }
-
-        @Override
-        public int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) {
-            if (current instanceof AccessIndexed) {
-                AccessIndexed x = (AccessIndexed) current;
-                if (x.array() == node) {
-                    int index = ((AccessIndexed) current).index().asConstant().asInt();
-                    if (current instanceof LoadIndexed) {
-                        x.replaceAtUsages(fieldState[index]);
-                        assert x.usages().size() == 0;
-                        x.replaceAndDelete(x.next());
-                    } else if (current instanceof StoreIndexedNode) {
-                        fieldState[index] = ((StoreIndexedNode) x).value();
-                        assert x.usages().size() == 0;
-                        x.replaceAndDelete(x.next());
-                        return index;
-                    }
-                }
-            }
-            return -1;
-        }
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code NewInstance} instruction represents the allocation of an instance class object.
- */
-public final class NewInstance extends FixedNodeWithNext {
-
-    final RiType instanceClass;
-    public final int cpi;
-    public final RiConstantPool constantPool;
-
-    /**
-     * Constructs a NewInstance instruction.
-     * @param type the class being allocated
-     * @param cpi the constant pool index
-     * @param graph
-     */
-    public NewInstance(RiType type, int cpi, RiConstantPool constantPool, Graph graph) {
-        super(CiKind.Object, graph);
-        this.instanceClass = type;
-        this.cpi = cpi;
-        this.constantPool = constantPool;
-    }
-
-    /**
-     * Gets the instance class being allocated by this instruction.
-     * @return the instance class allocated
-     */
-    public RiType instanceClass() {
-        return instanceClass;
-    }
-
-    /**
-     * Gets the exact type produced by this instruction. For allocations of instance classes, this is
-     * always the class allocated.
-     * @return the exact type produced by this instruction
-     */
-    @Override
-    public RiType exactType() {
-        return instanceClass;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNewInstance(this);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("instanceClass", instanceClass);
-        properties.put("cpi", cpi);
-        return properties;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == EscapeOp.class) {
-            return (T) ESCAPE;
-        }
-        return super.lookup(clazz);
-    }
-
-    private static final EscapeOp ESCAPE = new EscapeOp() {
-
-        @Override
-        public boolean canAnalyze(Node node) {
-            return ((NewInstance) node).instanceClass().isResolved();
-        }
-
-        @Override
-        public boolean escape(Node node, Node usage) {
-            if (usage instanceof LoadField) {
-                LoadField x = (LoadField) usage;
-                assert x.object() == node;
-                return x.field().isResolved() == false;
-            } else if (usage instanceof StoreFieldNode) {
-                StoreFieldNode x = (StoreFieldNode) usage;
-                return x.value() == node && x.object() != node;
-            } else if (usage instanceof StoreIndexedNode) {
-                StoreIndexedNode x = (StoreIndexedNode) usage;
-                assert x.value() == node;
-                return true;
-            } else if (usage instanceof VirtualObjectFieldNode) {
-                return false;
-            } else if (usage instanceof RegisterFinalizer) {
-                RegisterFinalizer x = (RegisterFinalizer) usage;
-                assert x.object() == node;
-                return false;
-            } else {
-                return super.escape(node, usage);
-            }
-        }
-
-        @Override
-        public EscapeField[] fields(Node node) {
-            NewInstance x = (NewInstance) node;
-            RiField[] riFields = x.instanceClass().fields();
-            EscapeField[] fields = new EscapeField[riFields.length];
-            for (int i = 0; i < riFields.length; i++) {
-                RiField field = riFields[i];
-                fields[i] = new EscapeField(field.name(), field, field.kind().stackKind());
-            }
-            return fields;
-        }
-
-        @Override
-        public void beforeUpdate(Node node, Node usage) {
-            if (usage instanceof RegisterFinalizer) {
-                RegisterFinalizer x = (RegisterFinalizer) usage;
-                x.replaceAndDelete(x.next());
-            } else {
-                super.beforeUpdate(node, usage);
-            }
-        }
-
-        @Override
-        public int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) {
-            if (current instanceof AccessField) {
-                AccessField x = (AccessField) current;
-                if (x.object() == node) {
-                    int field = fieldIndex.get(((AccessField) current).field());
-                    if (current instanceof LoadField) {
-                        assert fieldState[field] != null : field + ", " + ((AccessField) current).field();
-                        x.replaceAtUsages(fieldState[field]);
-                        assert x.usages().size() == 0;
-                        x.replaceAndDelete(x.next());
-                    } else if (current instanceof StoreFieldNode) {
-                        fieldState[field] = ((StoreFieldNode) x).value();
-                        assert x.usages().size() == 0;
-                        x.replaceAndDelete(x.next());
-                        return field;
-                    }
-                }
-            }
-            return -1;
-        }
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewMultiArray.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,107 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code NewMultiArray} instruction represents an allocation of a multi-dimensional object
- * array.
- */
-public final class NewMultiArray extends NewArray {
-
-    @Input private final NodeInputList<ValueNode> dimensions;
-
-    @Override
-    public ValueNode dimension(int index) {
-        return dimensions.get(index);
-    }
-
-    public void setDimension(int index, ValueNode x) {
-        dimensions.set(index, x);
-    }
-
-    /**
-     * The rank of the array allocated by this instruction, i.e. how many array dimensions.
-     */
-    @Override
-    public int dimensionCount() {
-        return dimensions.size();
-    }
-
-    public final RiType elementType;
-    public final int cpi;
-    public final RiConstantPool constantPool;
-
-    /**
-     * Constructs a new NewMultiArray instruction.
-     * @param elementType the element type of the array
-     * @param dimensions the instructions which produce the dimensions for this array
-     * @param cpi the constant pool index for resolution
-     * @param riConstantPool the constant pool for resolution
-     * @param graph
-     */
-    public NewMultiArray(RiType elementType, ValueNode[] dimensions, int cpi, RiConstantPool riConstantPool, Graph graph) {
-        super(null, graph);
-        this.constantPool = riConstantPool;
-        this.elementType = elementType;
-        this.cpi = cpi;
-
-        this.dimensions = new NodeInputList<ValueNode>(this, dimensions.length);
-        for (int i = 0; i < dimensions.length; i++) {
-            setDimension(i, dimensions[i]);
-        }
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNewMultiArray(this);
-    }
-
-    /**
-     * Gets the element type of the array.
-     * @return the element type of the array
-     */
-    public RiType elementType() {
-        return elementType;
-    }
-
-    @Override
-    public CiKind elementKind() {
-        return elementType.kind();
-    }
-
-    @Override
-    public RiType exactType() {
-        return elementType.arrayOf();
-    }
-
-    @Override
-    public RiType declaredType() {
-        return exactType();
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewObjectArray.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code NewObjectArray} instruction represents an allocation of an object array.
- */
-public final class NewObjectArray extends NewArray {
-
-    final RiType elementClass;
-
-    /**
-     * Constructs a new NewObjectArray instruction.
-     * @param elementClass the class of elements in this array
-     * @param length the instruction producing the length of the array
-     * @param graph
-     */
-    public NewObjectArray(RiType elementClass, ValueNode length, Graph graph) {
-        super(length, graph);
-        this.elementClass = elementClass;
-    }
-
-    /**
-     * Gets the type of the elements of the array.
-     * @return the element type of the array
-     */
-    public RiType elementType() {
-        return elementClass;
-    }
-
-    @Override
-    public CiKind elementKind() {
-        return elementClass.kind();
-    }
-
-    @Override
-    public RiType exactType() {
-        return elementClass.arrayOf();
-    }
-
-    @Override
-    public RiType declaredType() {
-        return exactType();
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNewObjectArray(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewTypeArray.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code NewTypeArray} class definition.
- */
-public final class NewTypeArray extends NewArray {
-
-    final RiType elementType;
-
-    public NewTypeArray(ValueNode length, RiType elementType, Graph graph) {
-        super(length, graph);
-        this.elementType = elementType;
-    }
-
-    @Override
-    public CiKind elementKind() {
-        return elementType.kind();
-    }
-
-    @Override
-    public RiType declaredType() {
-        return elementType.arrayOf();
-    }
-
-    @Override
-    public RiType exactType() {
-        return elementType.arrayOf();
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNewTypeArray(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NormalizeCompare.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-/**
- * Returns -1, 0, or 1 if either x > y, x == y, or x < y.
- */
-public final class NormalizeCompare extends Binary {
-
-    /**
-     * Creates a new compare operation.
-     * @param opcode the bytecode opcode
-     * @param kind the result kind
-     * @param x the first input
-     * @param y the second input
-     */
-    public NormalizeCompare(int opcode, CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, opcode, x, y, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitNormalizeCompare(this);
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("isUnorderedLess", isUnorderedLess());
-        return properties;
-    }
-
-    public boolean isUnorderedLess() {
-        return this.opcode == Bytecodes.FCMPL || this.opcode == Bytecodes.DCMPL;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Or.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "|")
-public final class Or extends Logic implements Canonicalizable {
-
-    public Or(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IOR : Bytecodes.LOR, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x() == y()) {
-            return x();
-        }
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() | y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() | y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Int) {
-                int c = y().asConstant().asInt();
-                if (c == -1) {
-                    return Constant.forInt(-1, graph());
-                }
-                if (c == 0) {
-                    return x();
-                }
-            } else {
-                assert kind == CiKind.Long;
-                long c = y().asConstant().asLong();
-                if (c == -1) {
-                    return Constant.forLong(-1, graph());
-                }
-                if (c == 0) {
-                    return x();
-                }
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,186 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.nodes.base.StateSplit.FilteringIterator;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Phi} instruction represents the merging of dataflow in the instruction graph. It refers to a join block
- * and a variable.
- */
-public final class Phi extends FloatingNode implements Canonicalizable {
-
-    @Input private Merge merge;
-
-    @Input private final NodeInputList<ValueNode> values = new NodeInputList<ValueNode>(this);
-
-    public Merge merge() {
-        return merge;
-    }
-
-    public void setMerge(Merge x) {
-        updateUsages(merge, x);
-        merge = x;
-    }
-
-    public static enum PhiType {
-        Value, // normal value phis
-        Memory, // memory phis
-        Virtual // phis used for VirtualObjectField merges
-    }
-
-    private final PhiType type;
-
-    public Phi(CiKind kind, Merge merge, PhiType type, Graph graph) {
-        super(kind, graph);
-        this.type = type;
-        setMerge(merge);
-    }
-
-    private Phi(CiKind kind, PhiType type, Graph graph) {
-        super(kind, graph);
-        this.type = type;
-    }
-
-    public PhiType type() {
-        return type;
-    }
-
-    @Override
-    public boolean verify() {
-        assertTrue(merge() != null);
-        assertTrue(merge().phiPredecessorCount() == valueCount(), merge().phiPredecessorCount() + "==" + valueCount());
-        return true;
-    }
-
-    /**
-     * Get the instruction that produces the value associated with the i'th predecessor of the join block.
-     *
-     * @param i the index of the predecessor
-     * @return the instruction that produced the value in the i'th predecessor
-     */
-    public ValueNode valueAt(int i) {
-        return values.get(i);
-    }
-
-    public void setValueAt(int i, ValueNode x) {
-        values.set(i, x);
-    }
-
-    /**
-     * Get the number of inputs to this phi (i.e. the number of predecessors to the join block).
-     *
-     * @return the number of inputs in this phi
-     */
-    public int valueCount() {
-        return values.size();
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitPhi(this);
-    }
-
-    @Override
-    public String shortName() {
-        StringBuilder str = new StringBuilder();
-        for (int i = 0; i < valueCount(); ++i) {
-            if (i != 0) {
-                str.append(' ');
-            }
-            str.append(valueAt(i) == null ? "-" : valueAt(i).id());
-        }
-        if (type == PhiType.Value) {
-            return "Phi: (" + str + ")";
-        } else {
-            return type + "Phi: (" + str + ")";
-        }
-    }
-
-    public void addInput(ValueNode x) {
-        values.add(x);
-    }
-
-    public void removeInput(int index) {
-        values.remove(index);
-    }
-
-    @Override
-    public Iterable< ? extends Node> dataInputs() {
-        final Iterator< ? extends Node> input = super.dataInputs().iterator();
-        return new Iterable<Node>() {
-
-            @Override
-            public Iterator<Node> iterator() {
-                return new FilteringIterator(input, Merge.class);
-            }
-        };
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (valueCount() != 2 || merge().endCount() != 2) {
-            return this;
-        }
-        if (merge().phis().size() > 1) { // XXX (gd) disable canonicalization of multiple conditional while we are not able to fuse them and the potentially leftover If in the backend
-            return this;
-        }
-        Node end0 = merge().endAt(0);
-        Node end1 = merge().endAt(1);
-        Node endPred0 = end0.predecessor();
-        Node endPred1 = end1.predecessor();
-        if (endPred0 != endPred1 || !(endPred0 instanceof If)) {
-            return this;
-        }
-        If ifNode = (If) endPred0;
-        boolean inverted = ifNode.trueSuccessor() == end1;
-        ValueNode trueValue = valueAt(inverted ? 1 : 0);
-        ValueNode falseValue = valueAt(inverted ? 0 : 1);
-        if ((trueValue.kind != CiKind.Int && trueValue.kind != CiKind.Long) || (falseValue.kind != CiKind.Int && falseValue.kind != CiKind.Long)) {
-            return this;
-        }
-        if ((!(trueValue instanceof Constant) && trueValue.usages().size() == 1) || (!(falseValue instanceof Constant) && falseValue.usages().size() == 1)) {
-            return this;
-        }
-        BooleanNode compare = ifNode.compare();
-        while (compare instanceof NegateBooleanNode) {
-            compare = ((NegateBooleanNode) compare).value();
-        }
-        if (!(compare instanceof Compare || compare instanceof IsNonNull || compare instanceof NegateBooleanNode || compare instanceof Constant)) {
-            return this;
-        }
-        if (GraalOptions.TraceCanonicalizer) {
-            TTY.println("> Phi canon'ed to Conditional");
-        }
-        reProcess.reProccess(ifNode);
-        return new Conditional(ifNode.compare(), trueValue, falseValue, graph());
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Placeholder.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public class Placeholder extends StateSplit {
-
-    public Placeholder(Graph graph) {
-        super(CiKind.Void, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        //assert false;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ReadNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class ReadNode extends AccessNode implements Node.ValueNumberable {
-
-    public ReadNode(CiKind kind, ValueNode object, LocationNode location, Graph graph) {
-        super(kind, object, location, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitMemoryRead(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/ReadVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class ReadVectorNode extends AccessVectorNode {
-
-    public ReadVectorNode(AbstractVectorNode vector, ValueNode object, LocationNode location, Graph graph) {
-        super(CiKind.Illegal, vector, object, location, graph);
-    }
-
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return null;
-        }
-        return super.lookup(clazz);
-    }
-
-    @Override
-    public void addToLoop(LoopBegin loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
-        LocationNode newLocation = LocationNode.create(LocationNode.getArrayLocation(location().getValueKind()), location().getValueKind(), location().displacement(), graph());
-        ValueNode index = nodes.get(vector());
-        assert index != null;
-        newLocation.setIndex(index);
-        ReadNode readNode = new ReadNode(location().getValueKind().stackKind(), object(), newLocation, graph());
-        loop.loopEnd().replaceAtPredecessors(readNode);
-        readNode.setNext(loop.loopEnd());
-        nodes.put(this, readNode);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2011, 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.*;
-import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * This instruction is used to perform the finalizer registration at the end of the java.lang.Object constructor.
- */
-public final class RegisterFinalizer extends StateSplit implements Canonicalizable {
-
-    @Input private ValueNode object;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public RegisterFinalizer(ValueNode object, Graph graph) {
-        super(CiKind.Void, graph);
-        setObject(object);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitRegisterFinalizer(this);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        RiType declaredType = object.declaredType();
-        RiType exactType = object.exactType();
-        if (exactType == null && declaredType != null) {
-            exactType = declaredType.exactType();
-        }
-
-        boolean needsCheck = true;
-        if (exactType != null) {
-            // we have an exact type
-            needsCheck = exactType.hasFinalizer();
-        } else {
-            // if either the declared type of receiver or the holder can be assumed to have no finalizers
-            if (declaredType != null && !declaredType.hasFinalizableSubclass()) {
-                if (((CompilerGraph) graph()).assumptions().recordNoFinalizableSubclassAssumption(declaredType)) {
-                    needsCheck = false;
-                }
-            }
-        }
-
-        if (needsCheck) {
-            if (GraalOptions.TraceCanonicalizer) {
-                TTY.println("Could not canonicalize finalizer " + object + " (declaredType=" + declaredType + ", exactType=" + exactType + ")");
-            }
-        } else {
-            if (GraalOptions.TraceCanonicalizer) {
-                TTY.println("Canonicalized finalizer for object " + object);
-            }
-            return next();
-        }
-
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Return.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-/*
- * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Return} class definition.
- */
-public final class Return extends FixedNode {
-
-    @Input private ValueNode result;
-
-    public ValueNode result() {
-        return result;
-    }
-
-    public void setResult(ValueNode x) {
-        updateUsages(this.result, x);
-        this.result = x;
-    }
-
-    /**
-     * Constructs a new Return instruction.
-     * @param result the instruction producing the result for this return; {@code null} if this
-     * is a void return
-     * @param graph
-     */
-    public Return(ValueNode result, Graph graph) {
-        super(result == null ? CiKind.Void : result.kind, graph);
-        setResult(result);
-    }
-
-    // for copying
-    private Return(CiKind kind, Graph graph) {
-        super(kind, graph);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitReturn(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RightShift.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.ir;
-
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = ">>")
-public final class RightShift extends ShiftNode implements Canonicalizable {
-
-    public RightShift(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.ISHR : Bytecodes.LSHR, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (y().isConstant()) {
-            int amount = y().asConstant().asInt();
-            int originalAmout = amount;
-            int mask;
-            if (kind == CiKind.Int) {
-                mask = 0x1f;
-            } else {
-                assert kind == CiKind.Long;
-                mask = 0x3f;
-            }
-            amount &= mask;
-            if (x().isConstant()) {
-                if (kind == CiKind.Int) {
-                    return Constant.forInt(x().asConstant().asInt() >> amount, graph());
-                } else {
-                    assert kind == CiKind.Long;
-                    return Constant.forLong(x().asConstant().asLong() >> amount, graph());
-                }
-            }
-            if (amount == 0) {
-                return x();
-            }
-            if (x() instanceof ShiftNode) {
-                ShiftNode other = (ShiftNode) x();
-                if (other.y().isConstant()) {
-                    int otherAmount = other.y().asConstant().asInt() & mask;
-                    if (other instanceof RightShift) {
-                        int total = amount + otherAmount;
-                        if (total != (total & mask)) {
-                            return Constant.forInt(0, graph());
-                        }
-                        return new RightShift(kind, other.x(), Constant.forInt(total, graph()), graph());
-                    }
-                }
-            }
-            if (originalAmout != amount) {
-                return new RightShift(kind, x(), Constant.forInt(amount, graph()), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/package-info.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2010, 2010, 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.
- */
-
-/**
- * High-level intermediate representation (HIR).
- */
-package com.oracle.max.graal.compiler.ir;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRAssembler.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRAssembler.java	Wed Aug 10 00:34:29 2011 +0200
@@ -29,8 +29,8 @@
 import com.oracle.max.graal.compiler.asm.*;
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.FrameMap.StackBlock;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ci.CiTargetMethod.Mark;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBlock.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBlock.java	Wed Aug 10 00:34:29 2011 +0200
@@ -27,8 +27,8 @@
 import com.oracle.max.asm.*;
 import com.oracle.max.graal.compiler.alloc.*;
 import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.graph.*;
 
@@ -295,6 +295,6 @@
     }
 
     public boolean isExceptionEntry() {
-        return firstInstruction() instanceof ExceptionObject;
+        return firstInstruction() instanceof ExceptionObjectNode;
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBranch.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRBranch.java	Wed Aug 10 00:34:29 2011 +0200
@@ -23,7 +23,7 @@
 package com.oracle.max.graal.compiler.lir;
 
 import com.oracle.max.asm.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.sun.cri.ci.*;
 
 /**
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIRList.java	Wed Aug 10 00:34:29 2011 +0200
@@ -30,7 +30,7 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.*;
 import com.oracle.max.graal.compiler.globalstub.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ci.CiTargetMethod.Mark;
 import com.sun.cri.ri.*;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIROp2.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/lir/LIROp2.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,7 +22,7 @@
  */
 package com.oracle.max.graal.compiler.lir;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.sun.cri.ci.*;
 
 /**
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/AnchorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,48 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Anchor} instruction represents the end of a block with an unconditional jump to another block.
+ */
+public final class AnchorNode extends FixedWithNextNode {
+
+    @Input private final NodeInputList<GuardNode> guards = new NodeInputList<GuardNode>(this);
+
+    public AnchorNode(Graph graph) {
+        super(CiKind.Illegal, graph);
+    }
+
+    public void addGuard(GuardNode x) {
+        guards.add(x);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitAnchor(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/BooleanNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class BooleanNode extends FloatingNode {
+
+    public BooleanNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/CastNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class CastNode extends FloatingNode {
+    @Input private ValueNode value;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    public CastNode(CiKind kind, ValueNode n, Graph graph) {
+        super(kind, graph);
+        setValue(n);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+    }
+
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return (T) new LIRGeneratorOp() {
+                @Override
+                public void generate(Node n, LIRGeneratorTool generator) {
+                    CastNode conv = (CastNode) n;
+                    conv.setOperand(generator.load(conv.value()));
+                }
+            };
+        }
+        return super.lookup(clazz);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ConstantNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,180 @@
+/*
+ * 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.nodes.base;
+
+import static com.oracle.max.graal.compiler.GraalCompilation.*;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code Constant} instruction represents a constant such as an integer value,
+ * long, float, object reference, address, etc.
+ */
+public final class ConstantNode extends BooleanNode {
+
+    @Data public final CiConstant value;
+
+    /**
+     * Constructs a new instruction representing the specified constant.
+     * @param value the constant
+     * @param graph
+     */
+    public ConstantNode(CiConstant value, Graph graph) {
+        super(value.kind.stackKind(), graph);
+        this.value = value;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitConstant(this);
+    }
+
+    /**
+     * Creates an instruction for a double constant.
+     * @param d the double value for which to create the instruction
+     * @param graph
+     * @return an instruction representing the double
+     */
+    public static ConstantNode forDouble(double d, Graph graph) {
+        return new ConstantNode(CiConstant.forDouble(d), graph);
+    }
+
+    /**
+     * Creates an instruction for a float constant.
+     * @param f the float value for which to create the instruction
+     * @return an instruction representing the float
+     */
+    public static ConstantNode forFloat(float f, Graph graph) {
+        return new ConstantNode(CiConstant.forFloat(f), graph);
+    }
+
+    /**
+     * Creates an instruction for an long constant.
+     * @param i the long value for which to create the instruction
+     * @return an instruction representing the long
+     */
+    public static ConstantNode forLong(long i, Graph graph) {
+        return new ConstantNode(CiConstant.forLong(i), graph);
+    }
+
+    /**
+     * Creates an instruction for an integer constant.
+     * @param i the integer value for which to create the instruction
+     * @return an instruction representing the integer
+     */
+    public static ConstantNode forInt(int i, Graph graph) {
+        return new ConstantNode(CiConstant.forInt(i), graph);
+    }
+
+    /**
+     * Creates an instruction for a boolean constant.
+     * @param i the boolean value for which to create the instruction
+     * @return an instruction representing the boolean
+     */
+    public static ConstantNode forBoolean(boolean i, Graph graph) {
+        return new ConstantNode(CiConstant.forBoolean(i), graph);
+    }
+
+    /**
+     * Creates an instruction for an address (jsr/ret address) constant.
+     * @param i the address value for which to create the instruction
+     * @return an instruction representing the address
+     */
+    public static ConstantNode forJsr(int i, Graph graph) {
+        return new ConstantNode(CiConstant.forJsr(i), graph);
+    }
+
+    /**
+     * Creates an instruction for an object constant.
+     * @param o the object value for which to create the instruction
+     * @return an instruction representing the object
+     */
+    public static ConstantNode forObject(Object o, Graph graph) {
+        return new ConstantNode(CiConstant.forObject(o), graph);
+    }
+
+    /**
+     * Creates an instruction for a word constant.
+     * @param val the word value for which to create the instruction
+     * @return an instruction representing the word
+     */
+    public static ConstantNode forWord(long val, Graph graph) {
+        return new ConstantNode(CiConstant.forWord(val), graph);
+    }
+
+    public static ConstantNode defaultForKind(CiKind kind, Graph graph) {
+        switch(kind) {
+            case Boolean:
+                return ConstantNode.forBoolean(false, graph);
+            case Byte:
+            case Char:
+            case Short:
+            case Int:
+                return ConstantNode.forInt(0, graph);
+            case Double:
+                return ConstantNode.forDouble(0.0, graph);
+            case Float:
+                return ConstantNode.forFloat(0.0f, graph);
+            case Long:
+                return ConstantNode.forLong(0L, graph);
+            case Object:
+                return ConstantNode.forObject(null, graph);
+            case Word:
+                return ConstantNode.forWord(0L, graph);
+            default:
+                return null;
+        }
+    }
+
+    @Override
+    public String toString() {
+        return super.toString() + "(" + value + ")";
+    }
+
+    @Override
+    public int valueNumber() {
+        return 0x50000000 | value.hashCode();
+    }
+
+    @Override
+    public RiType declaredType() {
+        RiRuntime runtime = compilation().runtime;
+        if (kind.isPrimitive()) {
+            return runtime.asRiType(kind);
+        }
+        return runtime.getTypeOf(asConstant());
+    }
+
+    @Override
+    public RiType exactType() {
+        return declaredType();
+    }
+
+    @Override
+    public String shortName() {
+        return value.name();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ControlSplitNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,121 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code BlockEnd} instruction is a base class for all instructions that end a basic
+ * block, including branches, switches, throws, and goto's.
+ */
+public abstract class ControlSplitNode extends FixedNode {
+
+    @Successor    private final NodeSuccessorList<FixedNode> blockSuccessors;
+
+    public FixedNode blockSuccessor(int index) {
+        return blockSuccessors.get(index);
+    }
+
+    public void setBlockSuccessor(int index, FixedNode x) {
+        blockSuccessors.set(index, x);
+    }
+
+    public int blockSuccessorCount() {
+        return blockSuccessors.size();
+    }
+
+    protected final double[] branchProbability;
+
+    /**
+     * Constructs a new block end with the specified value type.
+     * @param kind the type of the value produced by this instruction
+     * @param successors the list of successor blocks. If {@code null}, a new one will be created.
+     */
+    public ControlSplitNode(CiKind kind, List<? extends FixedNode> blockSuccessors, double[] branchProbability, Graph graph) {
+        this(kind, blockSuccessors.size(), branchProbability, graph);
+        for (int i = 0; i < blockSuccessors.size(); i++) {
+            setBlockSuccessor(i, blockSuccessors.get(i));
+        }
+    }
+
+    public ControlSplitNode(CiKind kind, int blockSuccessorCount, double[] branchProbability, Graph graph) {
+        super(kind, graph);
+        this.blockSuccessors = new NodeSuccessorList<FixedNode>(this, blockSuccessorCount);
+        assert branchProbability.length == blockSuccessorCount;
+        this.branchProbability = branchProbability;
+    }
+
+    public double probability(int successorIndex) {
+        return branchProbability[successorIndex];
+    }
+
+    public void setProbability(int successorIndex, double x) {
+        branchProbability[successorIndex] = x;
+    }
+
+    /**
+     * Gets the successor corresponding to the default (fall through) case.
+     * @return the default successor
+     */
+    public FixedNode defaultSuccessor() {
+        return blockSuccessor(blockSuccessorCount() - 1);
+    }
+
+    public Iterable<FixedNode> blockSuccessors() {
+        return new Iterable<FixedNode>() {
+            @Override
+            public Iterator<FixedNode> iterator() {
+                return new Iterator<FixedNode>() {
+                    int i = 0;
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                    @Override
+                    public FixedNode next() {
+                        return ControlSplitNode.this.blockSuccessor(i++);
+                    }
+
+                    @Override
+                    public boolean hasNext() {
+                        return i < ControlSplitNode.this.blockSuccessorCount();
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < branchProbability.length; i++) {
+            str.append(i == 0 ? "" : ", ").append(String.format("%7.5f", branchProbability[i]));
+        }
+        properties.put("branchProbability", str.toString());
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/DeoptimizeNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "Deopt")
+public class DeoptimizeNode extends FixedNode {
+
+    public static enum DeoptAction {
+        None,                           // just interpret, do not invalidate nmethod
+        Recompile,                      // recompile the nmethod; need not invalidate
+        InvalidateReprofile,            // invalidate the nmethod, reset IC, maybe recompile
+        InvalidateRecompile,            // invalidate the nmethod, recompile (probably)
+        InvalidateStopCompiling,        // invalidate the nmethod and do not compile
+    }
+
+    private String message;
+    private final DeoptAction action;
+
+    public DeoptimizeNode(DeoptAction action, Graph graph) {
+        super(CiKind.Illegal, graph);
+        this.action = action;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public DeoptAction action() {
+        return action;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitDeoptimize(this);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("message", message);
+        properties.put("action", action);
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/EndNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class EndNode extends FixedNode {
+
+    public EndNode(Graph graph) {
+        super(CiKind.Illegal, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitEndNode(this);
+    }
+
+    public MergeNode merge() {
+        if (usages().size() == 0) {
+            return null;
+        } else {
+            assert usages().size() == 1;
+            return (MergeNode) usages().iterator().next();
+        }
+    }
+
+    @Override
+    public boolean verify() {
+        assertTrue(usages().size() <= 1, "at most one usage");
+        return true;
+    }
+
+    @Override
+    public Iterable< ? extends Node> dataUsages() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public Iterable< ? extends Node> cfgSuccessors() {
+        MergeNode merge = this.merge();
+        if (merge == null) {
+            return Collections.emptyList();
+        }
+        return Arrays.asList(merge);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedGuardNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,70 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.base.DeoptimizeNode.DeoptAction;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public final class FixedGuardNode extends FixedWithNextNode implements Canonicalizable {
+
+    @Input private final NodeInputList<BooleanNode> conditions = new NodeInputList<BooleanNode>(this);
+
+    public FixedGuardNode(BooleanNode node, Graph graph) {
+        this(graph);
+        addNode(node);
+    }
+
+    public FixedGuardNode(Graph graph) {
+        super(CiKind.Illegal, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitFixedGuard(this);
+    }
+
+    public void addNode(BooleanNode x) {
+        conditions.add(x);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        for (BooleanNode n : conditions.snapshot()) {
+            if (n instanceof ConstantNode) {
+                ConstantNode c = (ConstantNode) n;
+                if (c.asConstant().asBoolean()) {
+                    conditions.remove(n);
+                } else {
+                    return new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph());
+                }
+            }
+        }
+
+        if (conditions.isEmpty()) {
+            return next();
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public abstract class FixedNode extends ValueNode {
+
+    private double probability;
+
+    public FixedNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+
+    public double probability() {
+        return probability;
+    }
+
+    public void setProbability(double probability) {
+        this.probability = probability;
+    }
+
+    protected void copyInto(FixedNode newNode) {
+        newNode.setProbability(probability);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("probability", String.format(Locale.ENGLISH, "%7.5f", probability));
+        return properties;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FixedWithNextNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2009, 2010, 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.nodes.base;
+
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public abstract class FixedWithNextNode extends FixedNode {
+
+    @Successor    private FixedNode next;
+
+    public FixedNode next() {
+        return next;
+    }
+
+    public void setNext(FixedNode x) {
+        updatePredecessors(next, x);
+        next = x;
+    }
+
+    public static final int SYNCHRONIZATION_ENTRY_BCI = -1;
+
+    /**
+     * Constructs a new instruction with the specified value type.
+     * @param kind the value type for this instruction
+     */
+    public FixedWithNextNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FrameState.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/FrameState.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,10 +26,10 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
 import com.oracle.max.graal.compiler.value.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -124,7 +124,7 @@
     }
 
     public void addVirtualObjectMapping(Node virtualObject) {
-        assert virtualObject instanceof VirtualObjectFieldNode || virtualObject instanceof Phi : virtualObject;
+        assert virtualObject instanceof VirtualObjectFieldNode || virtualObject instanceof PhiNode : virtualObject;
         virtualObjectMappings.add(virtualObject);
     }
 
@@ -330,16 +330,16 @@
      * @param block the block begin for which we are creating the phi
      * @param i the index into the stack for which to create a phi
      */
-    public Phi setupPhiForStack(Merge block, int i) {
+    public PhiNode setupPhiForStack(MergeNode block, int i) {
         ValueNode p = stackAt(i);
         if (p != null) {
-            if (p instanceof Phi) {
-                Phi phi = (Phi) p;
+            if (p instanceof PhiNode) {
+                PhiNode phi = (PhiNode) p;
                 if (phi.merge() == block) {
                     return phi;
                 }
             }
-            Phi phi = new Phi(p.kind, block, PhiType.Value, graph());
+            PhiNode phi = new PhiNode(p.kind, block, PhiType.Value, graph());
             setValueAt(localsSize + i, phi);
             return phi;
         }
@@ -351,15 +351,15 @@
      * @param block the block begin for which we are creating the phi
      * @param i the index of the local variable for which to create the phi
      */
-    public Phi setupPhiForLocal(Merge block, int i) {
+    public PhiNode setupPhiForLocal(MergeNode block, int i) {
         ValueNode p = localAt(i);
-        if (p instanceof Phi) {
-            Phi phi = (Phi) p;
+        if (p instanceof PhiNode) {
+            PhiNode phi = (PhiNode) p;
             if (phi.merge() == block) {
                 return phi;
             }
         }
-        Phi phi = new Phi(p.kind, block, PhiType.Value, graph());
+        PhiNode phi = new PhiNode(p.kind, block, PhiType.Value, graph());
         storeLocal(i, phi);
         return phi;
     }
@@ -399,22 +399,22 @@
         }
     }
 
-    public void merge(Merge block, FrameStateAccess other) {
+    public void merge(MergeNode block, FrameStateAccess other) {
         checkSize(other);
         for (int i = 0; i < valuesSize(); i++) {
             ValueNode x = valueAt(i);
             if (x != null) {
                 ValueNode y = other.valueAt(i);
-                if (x != y || ((x instanceof Phi) && ((Phi) x).merge() == block)) {
+                if (x != y || ((x instanceof PhiNode) && ((PhiNode) x).merge() == block)) {
                     if (typeMismatch(x, y)) {
-                        if ((x instanceof Phi) && ((Phi) x).merge() == block) {
+                        if ((x instanceof PhiNode) && ((PhiNode) x).merge() == block) {
                             x.replaceAtUsages(null);
                             x.delete();
                         }
                         setValueAt(i, null);
                         continue;
                     }
-                    Phi phi = null;
+                    PhiNode phi = null;
                     if (i < localsSize) {
                         // this a local
                         phi = setupPhiForLocal(block, i);
@@ -433,16 +433,16 @@
                         phi.addInput((x == y) ? phi : y);
                     }
 
-                    assert phi.valueCount() == block.phiPredecessorCount() + (block instanceof LoopBegin ? 0 : 1) : "valueCount=" + phi.valueCount() + " predSize= " + block.phiPredecessorCount();
+                    assert phi.valueCount() == block.phiPredecessorCount() + (block instanceof LoopBeginNode ? 0 : 1) : "valueCount=" + phi.valueCount() + " predSize= " + block.phiPredecessorCount();
                }
             }
         }
     }
 
-    public Merge block() {
+    public MergeNode block() {
         for (Node n : usages()) {
-            if (n instanceof Merge) {
-                return (Merge) n;
+            if (n instanceof MergeNode) {
+                return (MergeNode) n;
             }
         }
         return null;
@@ -494,20 +494,20 @@
     }
 
     /**
-     * The interface implemented by a client of {@link FrameState#forEachPhi(Merge, PhiProcedure)} and
-     * {@link FrameState#forEachLivePhi(Merge, PhiProcedure)}.
+     * The interface implemented by a client of {@link FrameState#forEachPhi(MergeNode, PhiProcedure)} and
+     * {@link FrameState#forEachLivePhi(MergeNode, PhiProcedure)}.
      */
     public static interface PhiProcedure {
-        boolean doPhi(Phi phi);
+        boolean doPhi(PhiNode phi);
     }
 
     /**
-     * Checks whether this frame state has any {@linkplain Phi phi} statements.
+     * Checks whether this frame state has any {@linkplain PhiNode phi} statements.
      */
     public boolean hasPhis() {
         for (int i = 0; i < valuesSize(); i++) {
             ValueNode value = valueAt(i);
-            if (value instanceof Phi) {
+            if (value instanceof PhiNode) {
                 return true;
             }
         }
@@ -580,8 +580,8 @@
                                 }
                                 currentField = ((VirtualObjectFieldNode) currentField).lastState();
                             } else {
-                                assert currentField instanceof Phi : currentField;
-                                currentField = (FloatingNode) ((Phi) currentField).valueAt(0);
+                                assert currentField instanceof PhiNode : currentField;
+                                currentField = (FloatingNode) ((PhiNode) currentField).valueAt(0);
                             }
                         } while (currentField != null);
                     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/GuardNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,81 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public final class GuardNode extends FloatingNode implements Canonicalizable {
+
+    @Input private FixedNode anchor;
+    @Input private BooleanNode node;
+
+    public FixedNode anchor() {
+        return anchor;
+    }
+
+    public void setAnchor(FixedNode x) {
+        updateUsages(anchor, x);
+        anchor = x;
+    }
+
+    /**
+     * The instruction that produces the tested boolean value.
+     */
+    public BooleanNode node() {
+        return node;
+    }
+
+    public void setNode(BooleanNode x) {
+        updateUsages(node, x);
+        node = x;
+    }
+
+    public GuardNode(BooleanNode node, Graph graph) {
+        super(CiKind.Illegal, graph);
+        setNode(node);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitGuardNode(this);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (node() instanceof ConstantNode) {
+            ConstantNode c = (ConstantNode) node();
+            if (c.asConstant().asBoolean()) {
+                if (GraalOptions.TraceCanonicalizer) {
+                    TTY.println("Removing redundant floating guard " + this);
+                }
+                return Node.Null;
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/IfNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,122 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code If} instruction represents a branch that can go one of two directions depending on the outcome of a
+ * comparison.
+ */
+public final class IfNode extends ControlSplitNode implements Canonicalizable {
+
+    @Input private BooleanNode compare;
+
+    public BooleanNode compare() {
+        return compare;
+    }
+
+    public void setCompare(BooleanNode x) {
+        updateUsages(compare, x);
+        compare = x;
+    }
+
+    public IfNode(BooleanNode condition, double probability, Graph graph) {
+        super(CiKind.Illegal, 2, new double[] {probability, 1 - probability}, graph);
+        setCompare(condition);
+    }
+
+    /**
+     * Gets the block corresponding to the true successor.
+     *
+     * @return the true successor
+     */
+    public FixedNode trueSuccessor() {
+        return blockSuccessor(0);
+    }
+
+    /**
+     * Gets the block corresponding to the false successor.
+     *
+     * @return the false successor
+     */
+    public FixedNode falseSuccessor() {
+        return blockSuccessor(1);
+    }
+
+    public void setTrueSuccessor(FixedNode node) {
+        setBlockSuccessor(0, node);
+    }
+
+    public void setFalseSuccessor(FixedNode node) {
+        setBlockSuccessor(1, node);
+    }
+
+    /**
+     * Gets the block corresponding to the specified outcome of the branch.
+     *
+     * @param istrue {@code true} if the true successor is requested, {@code false} otherwise
+     * @return the corresponding successor
+     */
+    public FixedNode successor(boolean istrue) {
+        return blockSuccessor(istrue ? 0 : 1);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitIf(this);
+    }
+
+    @Override
+    public boolean verify() {
+        assertTrue(compare() != null);
+        assertTrue(trueSuccessor() != null);
+        assertTrue(falseSuccessor() != null);
+        return true;
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (compare() instanceof ConstantNode) {
+            ConstantNode c = (ConstantNode) compare();
+            if (c.asConstant().asBoolean()) {
+                return trueSuccessor();
+            } else {
+                return falseSuccessor();
+            }
+        }
+        if (trueSuccessor() instanceof EndNode && falseSuccessor() instanceof EndNode) {
+            EndNode trueEnd = (EndNode) trueSuccessor();
+            EndNode falseEnd = (EndNode) falseSuccessor();
+            MergeNode merge = trueEnd.merge();
+            if (merge == falseEnd.merge() && merge.phis().size() == 0 && merge.endCount() == 2) {
+                FixedNode next = merge.next();
+                merge.setNext(null); // disconnect to avoid next from having 2 preds
+                return next;
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/InvokeNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,163 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code Invoke} instruction represents all kinds of method calls.
+ */
+public final class InvokeNode extends AbstractMemoryCheckpointNode implements ExceptionExit {
+
+    @Successor private FixedNode exceptionEdge;
+
+    @Input private final NodeInputList<ValueNode> arguments;
+
+    @Override
+    public FixedNode exceptionEdge() {
+        return exceptionEdge;
+    }
+
+    public void setExceptionEdge(FixedNode x) {
+        updatePredecessors(exceptionEdge, x);
+        exceptionEdge = x;
+    }
+
+    private final int argumentCount;
+
+    private boolean canInline = true;
+
+    public boolean canInline() {
+        return canInline;
+    }
+
+    public void setCanInline(boolean b) {
+        canInline = b;
+    }
+
+    public NodeInputList<ValueNode> arguments() {
+        return arguments;
+    }
+
+    public final int opcode;
+    public final RiMethod target;
+    public final RiType returnType;
+    public final int bci; // XXX needed because we can not compute the bci from the sateBefore bci of this Invoke was optimized from INVOKEINTERFACE to INVOKESPECIAL
+
+    /**
+     * Constructs a new Invoke instruction.
+     *
+     * @param opcode the opcode of the invoke
+     * @param result the result type
+     * @param args the list of instructions producing arguments to the invocation, including the receiver object
+     * @param isStatic {@code true} if this call is static (no receiver object)
+     * @param target the target method being called
+     */
+    public InvokeNode(int bci, int opcode, CiKind result, ValueNode[] args, RiMethod target, RiType returnType, Graph graph) {
+        super(result, graph);
+        arguments = new NodeInputList<ValueNode>(this, args.length);
+        this.opcode = opcode;
+        this.target = target;
+        this.returnType = returnType;
+        this.bci = bci;
+
+        this.argumentCount = args.length;
+        for (int i = 0; i < args.length; i++) {
+            arguments().set(i, args[i]);
+        }
+    }
+
+    /**
+     * Gets the opcode of this invoke instruction.
+     * @return the opcode
+     */
+    public int opcode() {
+        return opcode;
+    }
+
+    /**
+     * Checks whether this is an invocation of a static method.
+     * @return {@code true} if the invocation is a static invocation
+     */
+    public boolean isStatic() {
+        return opcode == Bytecodes.INVOKESTATIC;
+    }
+
+    @Override
+    public RiType declaredType() {
+        return returnType;
+    }
+
+    /**
+     * Gets the instruction that produces the receiver object for this invocation, if any.
+     * @return the instruction that produces the receiver object for this invocation if any, {@code null} if this
+     *         invocation does not take a receiver object
+     */
+    public ValueNode receiver() {
+        assert !isStatic();
+        return arguments().get(0);
+    }
+
+    /**
+     * Gets the target method for this invocation instruction.
+     * @return the target method
+     */
+    public RiMethod target() {
+        return target;
+    }
+
+    /**
+     * Checks whether this invocation has a receiver object.
+     * @return {@code true} if this invocation has a receiver object; {@code false} otherwise, if this is a
+     *         static call
+     */
+    public boolean hasReceiver() {
+        return !isStatic();
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitInvoke(this);
+    }
+
+    @Override
+    public String toString() {
+        return super.toString() + target;
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("opcode", Bytecodes.nameOf(opcode));
+        properties.put("target", CiUtil.format("%H.%n(%p):%r", target, false));
+        properties.put("bci", bci);
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LocalNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,95 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code Local} instruction is a placeholder for an incoming argument
+ * to a function call.
+ */
+public final class LocalNode extends FloatingNode {
+
+    @Input    private StartNode start;
+
+    public StartNode start() {
+        return start;
+    }
+
+    public void setStart(StartNode x) {
+        updateUsages(start, x);
+        start = x;
+    }
+
+    private final int index;
+    private RiType declaredType;
+
+    public LocalNode(CiKind kind, int javaIndex, Graph graph) {
+        super(kind, graph);
+        this.index = javaIndex;
+        setStart(graph.start());
+    }
+
+    /**
+     * Gets the index of this local.
+     * @return the index
+     */
+    public int index() {
+        return index;
+    }
+
+    /**
+     * Sets the declared type of this local, e.g. derived from the signature of the method.
+     * @param declaredType the declared type of the local variable
+     */
+    public void setDeclaredType(RiType declaredType) {
+        this.declaredType = declaredType;
+    }
+
+    /**
+     * Computes the declared type of the result of this instruction, if possible.
+     * @return the declared type of the result of this instruction, if it is known; {@code null} otherwise
+     */
+    @Override
+    public RiType declaredType() {
+        return declaredType;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLocal(this);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("index", index());
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LoopBeginNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,147 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.loop.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.util.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public class LoopBeginNode extends MergeNode {
+
+    private double loopFrequency;
+
+    public LoopBeginNode(Graph graph) {
+        super(graph);
+        loopFrequency = 1;
+    }
+
+    public double loopFrequency() {
+        return loopFrequency;
+    }
+
+    public void setLoopFrequency(double loopFrequency) {
+        this.loopFrequency = loopFrequency;
+    }
+
+    public LoopEndNode loopEnd() {
+        for (Node usage : usages()) {
+            if (usage instanceof LoopEndNode) {
+                LoopEndNode end = (LoopEndNode) usage;
+                if (end.loopBegin() == this) {
+                    return end;
+                }
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLoopBegin(this);
+    }
+
+    @Override
+    public int phiPredecessorCount() {
+        return 2;
+    }
+
+    @Override
+    public int phiPredecessorIndex(Node pred) {
+        if (pred == forwardEdge()) {
+            return 0;
+        } else if (pred == this.loopEnd()) {
+            return 1;
+        }
+        throw Util.shouldNotReachHere("unknown pred : " + pred + "(sp=" + forwardEdge() + ", le=" + this.loopEnd() + ")");
+    }
+
+    @Override
+    public Node phiPredecessorAt(int index) {
+        if (index == 0) {
+            return forwardEdge();
+        } else if (index == 1) {
+            return loopEnd();
+        }
+        throw Util.shouldNotReachHere();
+    }
+
+    public Collection<InductionVariableNode> inductionVariables() {
+        return Util.filter(this.usages(), InductionVariableNode.class);
+    }
+
+    @Override
+    public Iterable<? extends Node> phiPredecessors() {
+        return Arrays.asList(new Node[]{this.forwardEdge(), this.loopEnd()});
+    }
+
+    public EndNode forwardEdge() {
+        return this.endAt(0);
+    }
+
+    public LoopCounterNode loopCounter() {
+        return loopCounter(CiKind.Long);
+    }
+
+    public LoopCounterNode loopCounter(CiKind kind) {
+        for (Node usage : usages()) {
+            if (usage instanceof LoopCounterNode && ((LoopCounterNode) usage).kind == kind) {
+                return (LoopCounterNode) usage;
+            }
+        }
+        return new LoopCounterNode(kind, this, graph());
+    }
+
+    @Override
+    public boolean verify() {
+        assertTrue(loopEnd() != null);
+        assertTrue(forwardEdge() != null);
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "LoopBegin: " + super.toString();
+    }
+
+    @Override
+    public Iterable< ? extends Node> dataUsages() {
+        final Iterator< ? extends Node> dataUsages = super.dataUsages().iterator();
+        return new Iterable<Node>() {
+            @Override
+            public Iterator<Node> iterator() {
+                return new StateSplit.FilteringIterator(dataUsages, LoopEndNode.class);
+            }
+        };
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("loopFrequency", String.format("%7.1f", loopFrequency));
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/LoopEndNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public class LoopEndNode extends FixedNode {
+
+    @Input    private LoopBeginNode loopBegin;
+
+    public LoopBeginNode loopBegin() {
+        return loopBegin;
+    }
+
+    public void setLoopBegin(LoopBeginNode x) {
+        updateUsages(this.loopBegin, x);
+        this.loopBegin = x;
+    }
+
+    public LoopEndNode(Graph graph) {
+        super(CiKind.Illegal, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLoopEnd(this);
+    }
+
+    @Override
+    public Iterable< ? extends Node> dataInputs() {
+        return Collections.emptyList();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/MaterializeNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.graph.*;
+
+public final class MaterializeNode extends ConditionalNode {
+    public MaterializeNode(BooleanNode value, Graph graph) {
+        super(value, ConstantNode.forInt(1, graph), ConstantNode.forInt(0, graph), graph);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/MergeNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,219 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.debug.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.util.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * Denotes the beginning of a basic block, and holds information
+ * about the basic block, including the successor and
+ * predecessor blocks, exception handlers, liveness information, etc.
+ */
+public class MergeNode extends StateSplit {
+
+    @Input    private final NodeInputList<EndNode> ends = new NodeInputList<EndNode>(this);
+
+    public MergeNode(Graph graph) {
+        super(CiKind.Illegal, graph);
+    }
+
+    @Override
+    public boolean needsStateAfter() {
+        return false;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMerge(this);
+    }
+
+    public int endIndex(EndNode end) {
+        return ends.indexOf(end);
+    }
+
+    public void addEnd(EndNode end) {
+        ends.add(end);
+    }
+
+    public int endCount() {
+        return ends.size();
+    }
+
+    public EndNode endAt(int index) {
+        return ends.get(index);
+    }
+
+    public Iterable<? extends Node> phiPredecessors() {
+        return ends;
+    }
+
+    @Override
+    public Iterable<EndNode> cfgPredecessors() {
+        return ends;
+    }
+
+    @Override
+    public Iterable< ? extends Node> dataInputs() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder builder = new StringBuilder();
+        builder.append("merge #");
+        builder.append(id());
+        builder.append(" [");
+
+        builder.append("]");
+
+        builder.append(" -> ");
+        boolean hasSucc = false;
+        for (Node s : this.successors()) {
+            if (hasSucc) {
+                builder.append(", ");
+            }
+            builder.append("#");
+            if (s != null) {
+                builder.append(s.id());
+            } else {
+                builder.append("null");
+            }
+            hasSucc = true;
+        }
+        return builder.toString();
+    }
+
+    public void printWithoutPhis(LogStream out) {
+        // print block id
+        out.print("B").print(id()).print(" ");
+
+        // print flags
+        StringBuilder sb = new StringBuilder(8);
+        if (sb.length() != 0) {
+            out.print('(').print(sb.toString()).print(')');
+        }
+
+        // print block bci range
+        out.print('[').print(-1).print(", ").print(-1).print(']');
+
+        // print block successors
+        //if (end != null && end.blockSuccessors().size() > 0) {
+            out.print(" .");
+            for (Node successor : this.successors()) {
+                if (successor instanceof ValueNode) {
+                    out.print((ValueNode) successor);
+                } else {
+                    out.print(successor.toString());
+                }
+            }
+        //}
+
+        // print predecessors
+//        if (!blockPredecessors().isEmpty()) {
+//            out.print(" pred:");
+//            for (Instruction pred : blockPredecessors()) {
+//                out.print(pred.block());
+//            }
+//        }
+    }
+
+    /**
+     * Determines if a given instruction is a phi whose {@linkplain PhiNode#merge() join block} is a given block.
+     *
+     * @param value the instruction to test
+     * @param block the block that may be the join block of {@code value} if {@code value} is a phi
+     * @return {@code true} if {@code value} is a phi and its join block is {@code block}
+     */
+    private boolean isPhiAtBlock(ValueNode value) {
+        return value instanceof PhiNode && ((PhiNode) value).merge() == this;
+    }
+
+
+    /**
+     * Formats a given instruction as a value in a {@linkplain FrameState frame state}. If the instruction is a phi defined at a given
+     * block, its {@linkplain PhiNode#valueCount() inputs} are appended to the returned string.
+     *
+     * @param index the index of the value in the frame state
+     * @param value the frame state value
+     * @param block if {@code value} is a phi, then its inputs are formatted if {@code block} is its
+     *            {@linkplain PhiNode#merge() join point}
+     * @return the instruction representation as a string
+     */
+    public String stateString(int index, ValueNode value) {
+        StringBuilder sb = new StringBuilder(30);
+        sb.append(String.format("%2d  %s", index, Util.valueString(value)));
+        if (value instanceof PhiNode) {
+            PhiNode phi = (PhiNode) value;
+            // print phi operands
+            if (phi.merge() == this) {
+                sb.append(" [");
+                for (int j = 0; j < phi.valueCount(); j++) {
+                    sb.append(' ');
+                    ValueNode operand = phi.valueAt(j);
+                    if (operand != null) {
+                        sb.append(Util.valueString(operand));
+                    } else {
+                        sb.append("NULL");
+                    }
+                }
+                sb.append("] ");
+            }
+        }
+        return sb.toString();
+    }
+
+    public void removeEnd(EndNode pred) {
+        int predIndex = ends.indexOf(pred);
+        assert predIndex != -1;
+        ends.remove(predIndex);
+
+        for (Node usage : usages()) {
+            if (usage instanceof PhiNode) {
+                ((PhiNode) usage).removeInput(predIndex);
+            }
+        }
+    }
+
+    public int phiPredecessorCount() {
+        return endCount();
+    }
+
+    public int phiPredecessorIndex(Node pred) {
+        EndNode end = (EndNode) pred;
+        return endIndex(end);
+    }
+
+    public Node phiPredecessorAt(int index) {
+        return endAt(index);
+    }
+
+    public Collection<PhiNode> phis() {
+        return Util.filter(this.usages(), PhiNode.class);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/PhiNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,186 @@
+/*
+ * 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.nodes.base;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
+import com.oracle.max.graal.compiler.nodes.base.StateSplit.FilteringIterator;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Phi} instruction represents the merging of dataflow in the instruction graph. It refers to a join block
+ * and a variable.
+ */
+public final class PhiNode extends FloatingNode implements Canonicalizable {
+
+    @Input private MergeNode merge;
+
+    @Input private final NodeInputList<ValueNode> values = new NodeInputList<ValueNode>(this);
+
+    public MergeNode merge() {
+        return merge;
+    }
+
+    public void setMerge(MergeNode x) {
+        updateUsages(merge, x);
+        merge = x;
+    }
+
+    public static enum PhiType {
+        Value, // normal value phis
+        Memory, // memory phis
+        Virtual // phis used for VirtualObjectField merges
+    }
+
+    private final PhiType type;
+
+    public PhiNode(CiKind kind, MergeNode merge, PhiType type, Graph graph) {
+        super(kind, graph);
+        this.type = type;
+        setMerge(merge);
+    }
+
+    private PhiNode(CiKind kind, PhiType type, Graph graph) {
+        super(kind, graph);
+        this.type = type;
+    }
+
+    public PhiType type() {
+        return type;
+    }
+
+    @Override
+    public boolean verify() {
+        assertTrue(merge() != null);
+        assertTrue(merge().phiPredecessorCount() == valueCount(), merge().phiPredecessorCount() + "==" + valueCount());
+        return true;
+    }
+
+    /**
+     * Get the instruction that produces the value associated with the i'th predecessor of the join block.
+     *
+     * @param i the index of the predecessor
+     * @return the instruction that produced the value in the i'th predecessor
+     */
+    public ValueNode valueAt(int i) {
+        return values.get(i);
+    }
+
+    public void setValueAt(int i, ValueNode x) {
+        values.set(i, x);
+    }
+
+    /**
+     * Get the number of inputs to this phi (i.e. the number of predecessors to the join block).
+     *
+     * @return the number of inputs in this phi
+     */
+    public int valueCount() {
+        return values.size();
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitPhi(this);
+    }
+
+    @Override
+    public String shortName() {
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < valueCount(); ++i) {
+            if (i != 0) {
+                str.append(' ');
+            }
+            str.append(valueAt(i) == null ? "-" : valueAt(i).id());
+        }
+        if (type == PhiType.Value) {
+            return "Phi: (" + str + ")";
+        } else {
+            return type + "Phi: (" + str + ")";
+        }
+    }
+
+    public void addInput(ValueNode x) {
+        values.add(x);
+    }
+
+    public void removeInput(int index) {
+        values.remove(index);
+    }
+
+    @Override
+    public Iterable< ? extends Node> dataInputs() {
+        final Iterator< ? extends Node> input = super.dataInputs().iterator();
+        return new Iterable<Node>() {
+
+            @Override
+            public Iterator<Node> iterator() {
+                return new FilteringIterator(input, MergeNode.class);
+            }
+        };
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (valueCount() != 2 || merge().endCount() != 2) {
+            return this;
+        }
+        if (merge().phis().size() > 1) { // XXX (gd) disable canonicalization of multiple conditional while we are not able to fuse them and the potentially leftover If in the backend
+            return this;
+        }
+        Node end0 = merge().endAt(0);
+        Node end1 = merge().endAt(1);
+        Node endPred0 = end0.predecessor();
+        Node endPred1 = end1.predecessor();
+        if (endPred0 != endPred1 || !(endPred0 instanceof IfNode)) {
+            return this;
+        }
+        IfNode ifNode = (IfNode) endPred0;
+        boolean inverted = ifNode.trueSuccessor() == end1;
+        ValueNode trueValue = valueAt(inverted ? 1 : 0);
+        ValueNode falseValue = valueAt(inverted ? 0 : 1);
+        if ((trueValue.kind != CiKind.Int && trueValue.kind != CiKind.Long) || (falseValue.kind != CiKind.Int && falseValue.kind != CiKind.Long)) {
+            return this;
+        }
+        if ((!(trueValue instanceof ConstantNode) && trueValue.usages().size() == 1) || (!(falseValue instanceof ConstantNode) && falseValue.usages().size() == 1)) {
+            return this;
+        }
+        BooleanNode compare = ifNode.compare();
+        while (compare instanceof NegateBooleanNode) {
+            compare = ((NegateBooleanNode) compare).value();
+        }
+        if (!(compare instanceof CompareNode || compare instanceof IsNonNullNode || compare instanceof NegateBooleanNode || compare instanceof ConstantNode)) {
+            return this;
+        }
+        if (GraalOptions.TraceCanonicalizer) {
+            TTY.println("> Phi canon'ed to Conditional");
+        }
+        reProcess.reProccess(ifNode);
+        return new ConditionalNode(ifNode.compare(), trueValue, falseValue, graph());
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/PlaceholderNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public class PlaceholderNode extends StateSplit {
+
+    public PlaceholderNode(Graph graph) {
+        super(CiKind.Void, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        //assert false;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ReturnNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,65 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Return} class definition.
+ */
+public final class ReturnNode extends FixedNode {
+
+    @Input private ValueNode result;
+
+    public ValueNode result() {
+        return result;
+    }
+
+    public void setResult(ValueNode x) {
+        updateUsages(this.result, x);
+        this.result = x;
+    }
+
+    /**
+     * Constructs a new Return instruction.
+     * @param result the instruction producing the result for this return; {@code null} if this
+     * is a void return
+     * @param graph
+     */
+    public ReturnNode(ValueNode result, Graph graph) {
+        super(result == null ? CiKind.Void : result.kind, graph);
+        setResult(result);
+    }
+
+    // for copying
+    private ReturnNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitReturn(this);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/StateSplit.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/StateSplit.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,7 +24,6 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 
@@ -32,7 +31,7 @@
  * The {@code StateSplit} class is the abstract base class of all instructions
  * that store an immutable copy of the frame state.
  */
-public abstract class StateSplit extends FixedNodeWithNext {
+public abstract class StateSplit extends FixedWithNextNode {
 
     @Input private FrameState stateAfter;
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/UnwindNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,55 @@
+/*
+ * 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.nodes.base;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * Unwind takes an exception object, destroys the current stack frame and passes the exception object to the system's exception dispatch code.
+ */
+public final class UnwindNode extends FixedNode {
+
+    @Input private ValueNode exception;
+
+    public ValueNode exception() {
+        return exception;
+    }
+
+    public void setException(ValueNode x) {
+        assert x == null || x.kind == CiKind.Object;
+        updateUsages(this.exception, x);
+        this.exception = x;
+    }
+
+    public UnwindNode(ValueNode exception, Graph graph) {
+        super(CiKind.Object, graph);
+        setException(exception);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitUnwind(this);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ValueNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/base/ValueNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,9 +24,8 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -59,11 +58,11 @@
     }
 
     /**
-     * Checks whether this value is a constant (i.e. it is of type {@link Constant}.
+     * Checks whether this value is a constant (i.e. it is of type {@link ConstantNode}.
      * @return {@code true} if this value is a constant
      */
     public final boolean isConstant() {
-        return this instanceof Constant;
+        return this instanceof ConstantNode;
     }
 
     /**
@@ -71,7 +70,7 @@
      * @return {@code true} if this value represents the null constant
      */
     public final boolean isNullConstant() {
-        return this instanceof Constant && ((Constant) this).value.isNull();
+        return this instanceof ConstantNode && ((ConstantNode) this).value.isNull();
     }
 
     /**
@@ -80,8 +79,8 @@
      * otherwise
      */
     public final CiConstant asConstant() {
-        if (this instanceof Constant) {
-            return ((Constant) this).value;
+        if (this instanceof ConstantNode) {
+            return ((ConstantNode) this).value;
         }
         return null;
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/AndNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "&")
+public final class AndNode extends LogicNode implements Canonicalizable {
+
+    public AndNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IAND : Bytecodes.LAND, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x() == y()) {
+            return x();
+        }
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() & y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() & y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Int) {
+                int c = y().asConstant().asInt();
+                if (c == -1) {
+                    return x();
+                }
+                if (c == 0) {
+                    return ConstantNode.forInt(0, graph());
+                }
+            } else {
+                assert kind == CiKind.Long;
+                long c = y().asConstant().asLong();
+                if (c == -1) {
+                    return x();
+                }
+                if (c == 0) {
+                    return ConstantNode.forLong(0, graph());
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ArithmeticNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code ArithmeticOp} class represents arithmetic operations such as addition, subtraction, etc.
+ */
+public abstract class ArithmeticNode extends BinaryNode {
+
+    private final boolean isStrictFP;
+
+    /**
+     * Creates a new arithmetic operation.
+     * @param opcode the bytecode opcode
+     * @param kind the result kind of the operation
+     * @param x the first input instruction
+     * @param y the second input instruction
+     * @param isStrictFP indicates this operation has strict rounding semantics
+     */
+    public ArithmeticNode(CiKind kind, int opcode, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, opcode, x, y, graph);
+        this.isStrictFP = isStrictFP;
+    }
+
+    /**
+     * Checks whether this instruction has strict fp semantics.
+     * @return {@code true} if this instruction has strict fp semantics
+     */
+    public boolean isStrictFP() {
+        return isStrictFP;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitArithmetic(this);
+    }
+
+    public boolean isCommutative() {
+        return Bytecodes.isCommutative(opcode);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/BinaryNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,80 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Op2} class is the base of arithmetic and logic operations with two inputs.
+ */
+public abstract class BinaryNode extends FloatingNode {
+
+    @Input private ValueNode x;
+    @Input private ValueNode y;
+    @Data public final int opcode;
+
+    public ValueNode x() {
+        return x;
+    }
+
+    public void setX(ValueNode x) {
+        updateUsages(this.x, x);
+        this.x = x;
+    }
+
+    public ValueNode y() {
+        return y;
+    }
+
+    public void setY(ValueNode x) {
+        updateUsages(y, x);
+        this.y = x;
+    }
+
+    /**
+     * Creates a new Op2 instance.
+     * @param kind the result type of this instruction
+     * @param opcode the bytecode opcode
+     * @param x the first input instruction
+     * @param y the second input instruction
+     */
+    public BinaryNode(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, graph);
+        this.opcode = opcode;
+        setX(x);
+        setY(y);
+    }
+
+    /**
+     * Swaps the operands of this instruction. This is only legal for commutative operations.
+     */
+    public void swapOperands() {
+        assert Bytecodes.isCommutative(opcode);
+        ValueNode t = x();
+        setX(y());
+        setY(t);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/CompareNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2011, 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.nodes.calc;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.graph.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.util.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/* (tw/gd) For high-level optimization purpose the compare node should be a boolean *value* (it is currently only a helper node)
+ * But in the back-end the comparison should not always be materialized (for example in x86 the comparison result will not be in a register but in a flag)
+ *
+ * Compare should probably be made a value (so that it can be canonicalized for example) and in later stages some Compare usage should be transformed
+ * into variants that do not materialize the value (CompareIf, CompareGuard...)
+ *
+ */
+public final class CompareNode extends BooleanNode implements Canonicalizable {
+
+    @Input private ValueNode x;
+    @Input private ValueNode y;
+
+    @Data private Condition condition;
+    @Data private boolean unorderedIsTrue;
+
+    public ValueNode x() {
+        return x;
+    }
+
+    public void setX(ValueNode x) {
+        updateUsages(this.x, x);
+        this.x = x;
+    }
+
+    public ValueNode y() {
+        return y;
+    }
+
+    public void setY(ValueNode x) {
+        updateUsages(y, x);
+        this.y = x;
+    }
+
+    /**
+     * Constructs a new Compare instruction.
+     *
+     * @param x the instruction producing the first input to the instruction
+     * @param condition the condition (comparison operation)
+     * @param y the instruction that produces the second input to this instruction
+     * @param graph
+     */
+    public CompareNode(ValueNode x, Condition condition, ValueNode y, Graph graph) {
+        super(CiKind.Illegal, graph);
+        assert (x == null && y == null) || Util.archKindsEqual(x, y);
+        this.condition = condition;
+        setX(x);
+        setY(y);
+    }
+
+    /**
+     * Gets the condition (comparison operation) for this instruction.
+     *
+     * @return the condition
+     */
+    public Condition condition() {
+        return condition;
+    }
+
+    /**
+     * Checks whether unordered inputs mean true or false.
+     *
+     * @return {@code true} if unordered inputs produce true
+     */
+    public boolean unorderedIsTrue() {
+        return unorderedIsTrue;
+    }
+
+    public void setUnorderedIsTrue(boolean unorderedIsTrue) {
+        this.unorderedIsTrue = unorderedIsTrue;
+    }
+
+    /**
+     * Swaps the operands to this if and mirrors the condition (e.g. > becomes <).
+     *
+     * @see Condition#mirror()
+     */
+    public void swapOperands() {
+        condition = condition.mirror();
+        ValueNode t = x();
+        setX(y());
+        setY(t);
+    }
+
+    public void negate() {
+        condition = condition.negate();
+        unorderedIsTrue = !unorderedIsTrue;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+    }
+
+    @Override
+    public String shortName() {
+        return "Comp " + condition.operator;
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("unorderedIsTrue", unorderedIsTrue());
+        return properties;
+    }
+
+    private Node optimizeMaterialize(CiConstant constant, MaterializeNode materializeNode) {
+        if (constant.kind == CiKind.Int) {
+            boolean isFalseCheck = (constant.asInt() == 0);
+            if (condition == Condition.EQ || condition == Condition.NE) {
+                if (condition == Condition.NE) {
+                    isFalseCheck = !isFalseCheck;
+                }
+                BooleanNode result = materializeNode.condition();
+                if (isFalseCheck) {
+                    result = new NegateBooleanNode(result, graph());
+                }
+                return result;
+            }
+        }
+        return this;
+    }
+
+    private Node optimizeNormalizeCmp(CiConstant constant, NormalizeCompareNode normalizeNode) {
+        if (constant.kind == CiKind.Int && constant.asInt() == 0) {
+            Condition condition = condition();
+            if (normalizeNode == y()) {
+                condition = condition.mirror();
+            }
+            CompareNode result = new CompareNode(normalizeNode.x(), condition, normalizeNode.y(), graph());
+            boolean isLess = condition == Condition.LE || condition == Condition.LT || condition == Condition.BE || condition == Condition.BT;
+            result.unorderedIsTrue = condition != Condition.EQ && (condition == Condition.NE || !(isLess ^ normalizeNode.isUnorderedLess()));
+            return result;
+        }
+        return this;
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && !y().isConstant()) { // move constants to the left (y)
+            swapOperands();
+        } else if (x().isConstant() && y().isConstant()) {
+            CiConstant constX = x().asConstant();
+            CiConstant constY = y().asConstant();
+            Boolean result = condition().foldCondition(constX, constY, ((CompilerGraph) graph()).runtime(), unorderedIsTrue());
+            if (result != null) {
+                return ConstantNode.forBoolean(result, graph());
+            }
+        }
+
+        if (y().isConstant()) {
+            if (x() instanceof MaterializeNode) {
+                return optimizeMaterialize(y().asConstant(), (MaterializeNode) x());
+            } else if (x() instanceof NormalizeCompareNode) {
+                return optimizeNormalizeCmp(y().asConstant(), (NormalizeCompareNode) x());
+            }
+        }
+
+        if (x() == y() && x().kind != CiKind.Float && x().kind != CiKind.Double) {
+            return ConstantNode.forBoolean(condition().check(1, 1), graph());
+        }
+        if ((condition == Condition.NE || condition == Condition.EQ) && x().kind == CiKind.Object) {
+            ValueNode object = null;
+            if (x().isNullConstant()) {
+                object = y();
+            } else if (y().isNullConstant()) {
+                object = x();
+            }
+            if (object != null) {
+                IsNonNullNode nonNull = new IsNonNullNode(object, graph());
+                if (condition == Condition.NE) {
+                    return nonNull;
+                } else {
+                    assert condition == Condition.EQ;
+                    return new NegateBooleanNode(nonNull, graph());
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/Condition.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,262 @@
+/*
+ * 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.nodes.calc;
+
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * Condition codes used in conditionals.
+ */
+public enum Condition {
+    /**
+     * Equal.
+     */
+    EQ("=="),
+
+    /**
+     * Not equal.
+     */
+    NE("!="),
+
+    /**
+     * Signed less than.
+     */
+    LT("<"),
+
+    /**
+     * Signed less than or equal.
+     */
+    LE("<="),
+
+    /**
+     * Signed greater than.
+     */
+    GT(">"),
+
+    /**
+     * Signed greater than or equal.
+     */
+    GE(">="),
+
+    /**
+     * Unsigned greater than or equal ("above than or equal").
+     */
+    AE("|>=|"),
+
+    /**
+     * Unsigned less than or equal ("below than or equal").
+     */
+    BE("|<=|"),
+
+    /**
+     * Unsigned greater than ("above than").
+     */
+    AT("|>|"),
+
+    /**
+     * Unsigned less than ("below than").
+     */
+    BT("|<|"),
+
+    /**
+     * Operation produced an overflow.
+     */
+    OF("overflow"),
+
+    /**
+     * Operation did not produce an overflow.
+     */
+    NOF("noOverflow"),
+
+    TRUE("TRUE");
+
+    public final String operator;
+
+    private Condition(String operator) {
+        this.operator = operator;
+    }
+
+    public boolean check(int left, int right) {
+        switch (this) {
+            case EQ: return left == right;
+            case NE: return left != right;
+            case LT: return left < right;
+            case LE: return left <= right;
+            case GT: return left > right;
+            case GE: return left >= right;
+            case BT: return (left & 0xffffffffL) < (right & 0xffffffffL);
+            case BE: return (left & 0xffffffffL) <= (right & 0xffffffffL);
+            case AT: return (left & 0xffffffffL) > (right & 0xffffffffL);
+            case AE: return (left & 0xffffffffL) >= (right & 0xffffffffL);
+        }
+        throw new IllegalArgumentException();
+    }
+
+    /**
+     * Negate this conditional.
+     * @return the condition that represents the negation
+     */
+    public final Condition negate() {
+        switch (this) {
+            case EQ: return NE;
+            case NE: return EQ;
+            case LT: return GE;
+            case LE: return GT;
+            case GT: return LE;
+            case GE: return LT;
+            case BT: return AE;
+            case BE: return AT;
+            case AT: return BE;
+            case AE: return BT;
+            case OF: return NOF;
+            case NOF: return OF;
+        }
+        throw new IllegalArgumentException(this.toString());
+    }
+
+    /**
+     * Mirror this conditional (i.e. commute "a op b" to "b op' a")
+     * @return the condition representing the equivalent commuted operation
+     */
+    public final Condition mirror() {
+        switch (this) {
+            case EQ: return EQ;
+            case NE: return NE;
+            case LT: return GT;
+            case LE: return GE;
+            case GT: return LT;
+            case GE: return LE;
+            case BT: return AT;
+            case BE: return AE;
+            case AT: return BT;
+            case AE: return BE;
+        }
+        throw new IllegalArgumentException();
+    }
+
+    /**
+     * Checks if this conditional operation is commutative.
+     * @return {@code true} if this operation is commutative
+     */
+    public final boolean isCommutative() {
+        return this == EQ || this == NE;
+    }
+
+    /**
+     * Attempts to fold a comparison between two constants and return the result.
+     * @param lt the constant on the left side of the comparison
+     * @param rt the constant on the right side of the comparison
+     * @param runtime the RiRuntime (might be needed to compare runtime-specific types)
+     * @return {@link Boolean#TRUE} if the comparison is known to be true,
+     * {@link Boolean#FALSE} if the comparison is known to be false, {@code null} otherwise.
+     */
+    public Boolean foldCondition(CiConstant lt, CiConstant rt, RiRuntime runtime, boolean unorderedIsTrue) {
+        switch (lt.kind) {
+            case Boolean:
+            case Int: {
+                int x = lt.asInt();
+                int y = rt.asInt();
+                switch (this) {
+                    case EQ: return x == y;
+                    case NE: return x != y;
+                    case LT: return x < y;
+                    case LE: return x <= y;
+                    case GT: return x > y;
+                    case GE: return x >= y;
+                    case AE: return toUnsigned(x) >= toUnsigned(y);
+                    case BE: return toUnsigned(x) <= toUnsigned(y);
+                    case AT: return toUnsigned(x) > toUnsigned(y);
+                    case BT: return toUnsigned(x) < toUnsigned(y);
+                }
+                break;
+            }
+            case Long: {
+                long x = lt.asLong();
+                long y = rt.asLong();
+                switch (this) {
+                    case EQ: return x == y;
+                    case NE: return x != y;
+                    case LT: return x < y;
+                    case LE: return x <= y;
+                    case GT: return x > y;
+                    case GE: return x >= y;
+                }
+                break;
+            }
+            case Object: {
+                switch (this) {
+                    case EQ: return runtime.areConstantObjectsEqual(lt, rt);
+                    case NE: return !runtime.areConstantObjectsEqual(lt, rt);
+                }
+                break;
+            }
+            case Float: {
+                float x = lt.asFloat();
+                float y = rt.asFloat();
+                if (Float.isNaN(x) || Float.isNaN(y)) {
+                    return unorderedIsTrue;
+                }
+                switch (this) {
+                    case EQ: return x == y;
+                    case NE: return x != y;
+                    case BT:
+                    case LT: return x < y;
+                    case BE:
+                    case LE: return x <= y;
+                    case AT:
+                    case GT: return x > y;
+                    case AE:
+                    case GE: return x >= y;
+                }
+            }
+            case Double: {
+                double x = lt.asDouble();
+                double y = rt.asDouble();
+                if (Double.isNaN(x) || Double.isNaN(y)) {
+                    return unorderedIsTrue;
+                }
+                switch (this) {
+                    case EQ: return x == y;
+                    case NE: return x != y;
+                    case BT:
+                    case LT: return x < y;
+                    case BE:
+                    case LE: return x <= y;
+                    case AT:
+                    case GT: return x > y;
+                    case AE:
+                    case GE: return x >= y;
+                }
+            }
+        }
+        return null;
+    }
+
+    private long toUnsigned(int x) {
+        if (x < 0) {
+            return ((long) (x & 0x7FFFFFFF)) + ((long) Integer.MAX_VALUE) + 1;
+        }
+        return x;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ConditionalNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,167 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Conditional} class represents a comparison that yields one of two values. Note that these nodes are not
+ * built directly from the bytecode but are introduced by conditional expression elimination.
+ */
+public class ConditionalNode extends BinaryNode implements Canonicalizable {
+
+    @Input private BooleanNode condition;
+
+    public BooleanNode condition() {
+        return condition;
+    }
+
+    public void setCondition(BooleanNode n) {
+        updateUsages(condition, n);
+        condition = n;
+    }
+
+    /**
+     * Constructs a new IfOp.
+     *
+     * @param x the instruction producing the first value to be compared
+     * @param condition the condition of the comparison
+     * @param y the instruction producing the second value to be compared
+     * @param trueValue the value produced if the condition is true
+     * @param falseValue the value produced if the condition is false
+     */
+    public ConditionalNode(BooleanNode condition, ValueNode trueValue, ValueNode falseValue, Graph graph) {
+        // TODO: return the appropriate bytecode IF_ICMPEQ, etc
+        super(trueValue.kind.meet(falseValue.kind), Bytecodes.ILLEGAL, trueValue, falseValue, graph);
+        setCondition(condition);
+    }
+
+    // for copying
+    private ConditionalNode(CiKind kind, Graph graph) {
+        super(kind, Bytecodes.ILLEGAL, null, null, graph);
+    }
+
+    public ValueNode trueValue() {
+        return x();
+    }
+
+    public ValueNode falseValue() {
+        return y();
+    }
+
+    public void setTrueValue(ValueNode value) {
+        setX(value);
+    }
+
+    public void setFalseValue(ValueNode value) {
+        setY(value);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return (T) LIRGEN;
+        }
+        return super.lookup(clazz);
+    }
+
+    public static class ConditionalStructure {
+
+        public final IfNode ifNode;
+        public final PhiNode phi;
+        public final MergeNode merge;
+
+        public ConditionalStructure(IfNode ifNode, PhiNode phi, MergeNode merge) {
+            this.ifNode = ifNode;
+            this.phi = phi;
+            this.merge = merge;
+        }
+    }
+
+    public static ConditionalStructure createConditionalStructure(BooleanNode condition, ValueNode trueValue, ValueNode falseValue) {
+        return createConditionalStructure(condition, trueValue, falseValue, 0.5);
+    }
+
+    public static ConditionalStructure createConditionalStructure(BooleanNode condition, ValueNode trueValue, ValueNode falseValue, double trueProbability) {
+        Graph graph = condition.graph();
+        CiKind kind = trueValue.kind.meet(falseValue.kind);
+        IfNode ifNode = new IfNode(condition, trueProbability, graph);
+        EndNode trueEnd = new EndNode(graph);
+        EndNode falseEnd = new EndNode(graph);
+        ifNode.setTrueSuccessor(trueEnd);
+        ifNode.setFalseSuccessor(falseEnd);
+        MergeNode merge = new MergeNode(graph);
+        merge.addEnd(trueEnd);
+        merge.addEnd(falseEnd);
+        PhiNode phi = new PhiNode(kind, merge, PhiType.Value, graph);
+        phi.addInput(trueValue);
+        phi.addInput(falseValue);
+        return new ConditionalStructure(ifNode, phi, merge);
+    }
+
+    private static final LIRGeneratorOp LIRGEN = new LIRGeneratorOp() {
+
+        @Override
+        public void generate(Node n, LIRGeneratorTool generator) {
+            generator.visitConditional((ConditionalNode) n);
+        }
+    };
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (condition instanceof ConstantNode) {
+            ConstantNode c = (ConstantNode) condition;
+            if (c.asConstant().asBoolean()) {
+                return trueValue();
+            } else {
+                return falseValue();
+            }
+        }
+        if (trueValue() == falseValue()) {
+            return trueValue();
+        }
+        if (!(this instanceof MaterializeNode) && trueValue() instanceof ConstantNode && falseValue() instanceof ConstantNode && trueValue().kind == CiKind.Int && falseValue().kind == CiKind.Int) {
+            int trueInt = trueValue().asConstant().asInt();
+            int falseInt = falseValue().asConstant().asInt();
+            if (trueInt == 0 && falseInt == 1) {
+                reProcess.reProccess(condition); // because we negate it
+                return new MaterializeNode(new NegateBooleanNode(condition, graph()), graph());
+            } else if (trueInt == 1 && falseInt == 0) {
+                return new MaterializeNode(condition, graph());
+            }
+        } else if (falseValue() instanceof ConstantNode && !(trueValue() instanceof ConstantNode)) {
+            ValueNode temp = trueValue();
+            setTrueValue(falseValue());
+            setFalseValue(temp);
+            condition = new NegateBooleanNode(condition, graph());
+            setCondition(condition);
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ConvertNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Convert} class represents a conversion between primitive types.
+ */
+public final class ConvertNode extends FloatingNode {
+    @Input private ValueNode value;
+
+    @Data public final int opcode;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    /**
+     * Constructs a new Convert instance.
+     * @param opcode the bytecode representing the operation
+     * @param value the instruction producing the input value
+     * @param kind the result type of this instruction
+     * @param graph
+     */
+    public ConvertNode(int opcode, ValueNode value, CiKind kind, Graph graph) {
+        super(kind, graph);
+        this.opcode = opcode;
+        setValue(value);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitConvert(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatAddNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,66 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "+")
+public final class FloatAddNode extends FloatArithmeticNode implements Canonicalizable {
+
+    public FloatAddNode(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, kind == CiKind.Double ? Bytecodes.DADD : Bytecodes.FADD, x, y, isStrictFP, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(x().asConstant().asFloat() + y().asConstant().asFloat(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(x().asConstant().asDouble() + y().asConstant().asDouble(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Float) {
+                float c = y().asConstant().asFloat();
+                if (c == 0.0f) {
+                    return x();
+                }
+            } else {
+                assert kind == CiKind.Double;
+                double c = y().asConstant().asDouble();
+                if (c == 0.0) {
+                    return x();
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatArithmeticNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,35 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public abstract class FloatArithmeticNode extends ArithmeticNode {
+
+    public FloatArithmeticNode(CiKind kind, int opcode, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, opcode, x, y, isStrictFP, graph);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatDivNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "/")
+public final class FloatDivNode extends FloatArithmeticNode implements Canonicalizable {
+
+    public FloatDivNode(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, kind == CiKind.Double ? Bytecodes.DDIV : Bytecodes.FDIV, x, y, isStrictFP, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && y().isConstant()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(x().asConstant().asFloat() / y().asConstant().asFloat(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(x().asConstant().asDouble() / y().asConstant().asDouble(), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatMulNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,66 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "*")
+public final class FloatMulNode extends FloatArithmeticNode implements Canonicalizable {
+
+    public FloatMulNode(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, kind == CiKind.Double ? Bytecodes.DMUL : Bytecodes.FMUL, x, y, isStrictFP, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(x().asConstant().asFloat() * y().asConstant().asFloat(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(x().asConstant().asDouble() * y().asConstant().asDouble(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Float) {
+                float c = y().asConstant().asFloat();
+                if (c == 0.0f) {
+                    return ConstantNode.forFloat(0.0f, graph());
+                }
+            } else {
+                assert kind == CiKind.Double;
+                double c = y().asConstant().asDouble();
+                if (c == 0.0) {
+                    return ConstantNode.forDouble(0.0, graph());
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatRemNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "%")
+public final class FloatRemNode extends FloatArithmeticNode implements Canonicalizable {
+
+    public FloatRemNode(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, kind == CiKind.Double ? Bytecodes.DREM : Bytecodes.FREM, x, y, isStrictFP, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && y().isConstant()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(x().asConstant().asFloat() % y().asConstant().asFloat(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(x().asConstant().asDouble() % y().asConstant().asDouble(), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatSubNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "-")
+public final class FloatSubNode extends FloatArithmeticNode implements Canonicalizable {
+
+    public FloatSubNode(CiKind kind, ValueNode x, ValueNode y, boolean isStrictFP, Graph graph) {
+        super(kind, kind == CiKind.Double ? Bytecodes.DSUB : Bytecodes.FSUB, x, y, isStrictFP, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x() == y()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(0.0f, graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(0.0, graph());
+            }
+        }
+        if (x().isConstant() && y().isConstant()) {
+            if (kind == CiKind.Float) {
+                return ConstantNode.forFloat(x().asConstant().asFloat() - y().asConstant().asFloat(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                return ConstantNode.forDouble(x().asConstant().asDouble() - y().asConstant().asDouble(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Float) {
+                float c = y().asConstant().asFloat();
+                if (c == 0.0f) {
+                    return x();
+                }
+                return new FloatAddNode(kind, x(), ConstantNode.forFloat(-c, graph()), isStrictFP(), graph());
+            } else {
+                assert kind == CiKind.Double;
+                double c = y().asConstant().asDouble();
+                if (c == 0.0) {
+                    return x();
+                }
+                return new FloatAddNode(kind, x(), ConstantNode.forDouble(-c, graph()), isStrictFP(), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/FloatingNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,33 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public abstract class FloatingNode extends ValueNode implements Node.ValueNumberable {
+    public FloatingNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerAddNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2011, 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "+")
+public final class IntegerAddNode extends IntegerArithmeticNode implements Canonicalizable {
+
+    public IntegerAddNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IADD : Bytecodes.LADD, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() + y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() + y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Int) {
+                int c = y().asConstant().asInt();
+                if (c == 0) {
+                    return x();
+                }
+            } else {
+                assert kind == CiKind.Long;
+                long c = y().asConstant().asLong();
+                if (c == 0) {
+                    return x();
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerAddVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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.nodes.calc;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class IntegerAddVectorNode extends AbstractVectorNode {
+    @Input private ValueNode value;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    public IntegerAddVectorNode(AbstractVectorNode vector, ValueNode value, Graph graph) {
+        super(CiKind.Illegal, vector, graph);
+        setValue(value);
+    }
+
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return null;
+        }
+        return super.lookup(clazz);
+    }
+
+    @Override
+    public void addToLoop(LoopBeginNode loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
+        nodes.put(this, new IntegerAddNode(CiKind.Int, nodes.get(vector()), value(), graph()));
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerArithmeticNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2011, 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.util.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class IntegerArithmeticNode extends ArithmeticNode {
+
+    public IntegerArithmeticNode(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, opcode, x, y, false, graph);
+        assert kind == CiKind.Int || kind == CiKind.Long;
+    }
+
+    public static IntegerArithmeticNode add(ValueNode v1, ValueNode v2) {
+        assert v1.kind == v2.kind && v1.graph() == v2.graph();
+        Graph graph = v1.graph();
+        //TODO (gd) handle conversions here instead of strong assert ?
+        switch(v1.kind) {
+            case Int:
+                return new IntegerAddNode(CiKind.Int, v1, v2, graph);
+            case Long:
+                return new IntegerAddNode(CiKind.Long, v1, v2, graph);
+            default:
+                throw Util.shouldNotReachHere();
+        }
+    }
+
+    public static IntegerArithmeticNode mul(ValueNode v1, ValueNode v2) {
+        assert v1.kind == v2.kind && v1.graph() == v2.graph();
+        Graph graph = v1.graph();
+        //TODO (gd) handle conversions here instead of strong assert ?
+        switch(v1.kind) {
+            case Int:
+                return new IntegerMulNode(CiKind.Int, v1, v2, graph);
+            case Long:
+                return new IntegerMulNode(CiKind.Long, v1, v2, graph);
+            default:
+                throw Util.shouldNotReachHere();
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerDivNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,59 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "/")
+public final class IntegerDivNode extends IntegerArithmeticNode implements Canonicalizable {
+
+    public IntegerDivNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IDIV : Bytecodes.LDIV, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && y().isConstant()) {
+            long yConst = y().asConstant().asLong();
+            if (yConst == 0) {
+                return this; // this will trap, can not canonicalize
+            }
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() / (int) yConst, graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() / yConst, graph());
+            }
+        } else if (y().isConstant()) {
+            long c = y().asConstant().asLong();
+            if (c == 1) {
+                return x();
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerMulNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "*")
+public final class IntegerMulNode extends IntegerArithmeticNode implements Canonicalizable {
+
+    public IntegerMulNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IMUL : Bytecodes.LMUL, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() * y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() * y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            long c = y().asConstant().asLong();
+            if (c == 1) {
+                return x();
+            }
+            if (c == 0) {
+                return ConstantNode.forInt(0, graph());
+            }
+            if (c > 0 && CiUtil.isPowerOf2(c)) {
+                return new LeftShiftNode(kind, x(), ConstantNode.forInt(CiUtil.log2(c), graph()), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerRemNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "%")
+public final class IntegerRemNode extends IntegerArithmeticNode implements Canonicalizable {
+
+    public IntegerRemNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IREM : Bytecodes.LREM, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant() && y().isConstant()) {
+            long yConst = y().asConstant().asLong();
+            if (yConst == 0) {
+                return this; // this will trap, can not canonicalize
+            }
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() % (int) yConst, graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() % yConst, graph());
+            }
+        } else if (y().isConstant()) {
+            long c = y().asConstant().asLong();
+            if (c == 1 || c == -1) {
+                if (kind == CiKind.Int) {
+                    return ConstantNode.forInt(0, graph());
+                } else {
+                    assert kind == CiKind.Long;
+                    return ConstantNode.forLong(0, graph());
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IntegerSubNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "-")
+public final class IntegerSubNode extends IntegerArithmeticNode implements Canonicalizable {
+
+    public IntegerSubNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.ISUB : Bytecodes.LSUB, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x() == y()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(0, graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(0, graph());
+            }
+        }
+        if (x().isConstant() && y().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() - y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() - y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            long c = y().asConstant().asLong();
+            if (c == 0) {
+                return x();
+            }
+            if (kind == CiKind.Int) {
+                return new IntegerAddNode(kind, x(), ConstantNode.forInt((int) -c, graph()), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return new IntegerAddNode(kind, x(), ConstantNode.forLong(-c, graph()), graph());
+            }
+        } else if (x().isConstant()) {
+            long c = x().asConstant().asLong();
+            if (c == 0) {
+                return new NegateNode(y(), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/IsNonNullNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,89 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code NullCheck} class represents an explicit null check instruction.
+ */
+public final class IsNonNullNode extends BooleanNode implements Canonicalizable {
+
+    @Input private ValueNode object;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    /**
+     * Constructs a new NullCheck instruction.
+     *
+     * @param object the instruction producing the object to check against null
+     * @param graph
+     */
+    public IsNonNullNode(ValueNode object, Graph graph) {
+        super(CiKind.Object, graph);
+        assert object == null || object.kind == CiKind.Object : object;
+        setObject(object);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        // Nothing to do.
+    }
+
+    @Override
+    public RiType declaredType() {
+        // null check does not alter the type of the object
+        return object().declaredType();
+    }
+
+    @Override
+    public RiType exactType() {
+        // null check does not alter the type of the object
+        return object().exactType();
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (object() instanceof NewInstanceNode || object() instanceof NewArrayNode) {
+            return ConstantNode.forBoolean(true, graph());
+        }
+        CiConstant constant = object().asConstant();
+        if (constant != null) {
+            assert constant.kind == CiKind.Object;
+            return ConstantNode.forBoolean(constant.isNonNull(), graph());
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/LeftShiftNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,88 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "<<")
+public final class LeftShiftNode extends ShiftNode implements Canonicalizable {
+
+    public LeftShiftNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.ISHL : Bytecodes.LSHL, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (y().isConstant()) {
+            int amount = y().asConstant().asInt();
+            int originalAmout = amount;
+            int mask;
+            if (kind == CiKind.Int) {
+                mask = 0x1f;
+            } else {
+                assert kind == CiKind.Long;
+                mask = 0x3f;
+            }
+            amount &= mask;
+            if (x().isConstant()) {
+                if (kind == CiKind.Int) {
+                    return ConstantNode.forInt(x().asConstant().asInt() << amount, graph());
+                } else {
+                    assert kind == CiKind.Long;
+                    return ConstantNode.forLong(x().asConstant().asLong() << amount, graph());
+                }
+            }
+            if (amount == 0) {
+                return x();
+            }
+            if (x() instanceof ShiftNode) {
+                ShiftNode other = (ShiftNode) x();
+                if (other.y().isConstant()) {
+                    int otherAmount = other.y().asConstant().asInt() & mask;
+                    if (other instanceof LeftShiftNode) {
+                        int total = amount + otherAmount;
+                        if (total != (total & mask)) {
+                            return ConstantNode.forInt(0, graph());
+                        }
+                        return new LeftShiftNode(kind, other.x(), ConstantNode.forInt(total, graph()), graph());
+                    } else if ((other instanceof RightShiftNode || other instanceof UnsignedRightShiftNode) && otherAmount == amount) {
+                        if (kind == CiKind.Long) {
+                            return new AndNode(kind, other.x(), ConstantNode.forLong(-1L << amount, graph()), graph());
+                        } else {
+                            assert kind == CiKind.Int;
+                            return new AndNode(kind, other.x(), ConstantNode.forInt(-1 << amount, graph()), graph());
+                        }
+                    }
+                }
+            }
+            if (originalAmout != amount) {
+                return new LeftShiftNode(kind, x(), ConstantNode.forInt(amount, graph()), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/LogicNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,49 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code LogicOp} class definition.
+ */
+public abstract class LogicNode extends BinaryNode {
+
+    /**
+     * Constructs a new logic operation instruction.
+     * @param opcode the opcode of the logic operation
+     * @param x the first input into this instruction
+     * @param y the second input into this instruction
+     */
+    public LogicNode(CiKind kind, int opcode, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, opcode, x, y, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLogic(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NegateBooleanNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,61 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public final class NegateBooleanNode extends BooleanNode implements Canonicalizable {
+
+    @Input private BooleanNode value;
+
+    public BooleanNode value() {
+        return value;
+    }
+
+    public void setValue(BooleanNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    public NegateBooleanNode(BooleanNode value, Graph graph) {
+        super(CiKind.Int, graph);
+        setValue(value);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (value() instanceof NegateBooleanNode) {
+            return ((NegateBooleanNode) value()).value();
+        } else if (value() instanceof ConstantNode) {
+            return ConstantNode.forBoolean(!value().asConstant().asBoolean(), graph());
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NegateNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,86 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code NegateOp} instruction negates its operand.
+ */
+public final class NegateNode extends FloatingNode implements Canonicalizable {
+
+    @Input
+    private ValueNode x;
+
+    public ValueNode x() {
+        return x;
+    }
+
+    public void setX(ValueNode x) {
+        updateUsages(this.x, x);
+        this.x = x;
+    }
+
+    /**
+     * Creates new NegateOp instance.
+     *
+     * @param x the instruction producing the value that is input to this instruction
+     */
+    public NegateNode(ValueNode x, Graph graph) {
+        super(x.kind, graph);
+        setX(x);
+    }
+
+    // for copying
+    private NegateNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNegate(this);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x().isConstant()) {
+            switch (x().kind) {
+                case Int:
+                    return ConstantNode.forInt(-x().asConstant().asInt(), graph());
+                case Long:
+                    return ConstantNode.forLong(-x().asConstant().asLong(), graph());
+                case Float:
+                    return ConstantNode.forFloat(-x().asConstant().asFloat(), graph());
+                case Double:
+                    return ConstantNode.forDouble(-x().asConstant().asDouble(), graph());
+            }
+        }
+        if (x() instanceof NegateNode) {
+            return ((NegateNode) x()).x();
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/NormalizeCompareNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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.nodes.calc;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+/**
+ * Returns -1, 0, or 1 if either x > y, x == y, or x < y.
+ */
+public final class NormalizeCompareNode extends BinaryNode {
+
+    /**
+     * Creates a new compare operation.
+     * @param opcode the bytecode opcode
+     * @param kind the result kind
+     * @param x the first input
+     * @param y the second input
+     */
+    public NormalizeCompareNode(int opcode, CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, opcode, x, y, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNormalizeCompare(this);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("isUnorderedLess", isUnorderedLess());
+        return properties;
+    }
+
+    public boolean isUnorderedLess() {
+        return this.opcode == Bytecodes.FCMPL || this.opcode == Bytecodes.DCMPL;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/OrNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "|")
+public final class OrNode extends LogicNode implements Canonicalizable {
+
+    public OrNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IOR : Bytecodes.LOR, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x() == y()) {
+            return x();
+        }
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() | y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() | y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Int) {
+                int c = y().asConstant().asInt();
+                if (c == -1) {
+                    return ConstantNode.forInt(-1, graph());
+                }
+                if (c == 0) {
+                    return x();
+                }
+            } else {
+                assert kind == CiKind.Long;
+                long c = y().asConstant().asLong();
+                if (c == -1) {
+                    return ConstantNode.forLong(-1, graph());
+                }
+                if (c == 0) {
+                    return x();
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/RightShiftNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,81 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = ">>")
+public final class RightShiftNode extends ShiftNode implements Canonicalizable {
+
+    public RightShiftNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.ISHR : Bytecodes.LSHR, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (y().isConstant()) {
+            int amount = y().asConstant().asInt();
+            int originalAmout = amount;
+            int mask;
+            if (kind == CiKind.Int) {
+                mask = 0x1f;
+            } else {
+                assert kind == CiKind.Long;
+                mask = 0x3f;
+            }
+            amount &= mask;
+            if (x().isConstant()) {
+                if (kind == CiKind.Int) {
+                    return ConstantNode.forInt(x().asConstant().asInt() >> amount, graph());
+                } else {
+                    assert kind == CiKind.Long;
+                    return ConstantNode.forLong(x().asConstant().asLong() >> amount, graph());
+                }
+            }
+            if (amount == 0) {
+                return x();
+            }
+            if (x() instanceof ShiftNode) {
+                ShiftNode other = (ShiftNode) x();
+                if (other.y().isConstant()) {
+                    int otherAmount = other.y().asConstant().asInt() & mask;
+                    if (other instanceof RightShiftNode) {
+                        int total = amount + otherAmount;
+                        if (total != (total & mask)) {
+                            return ConstantNode.forInt(0, graph());
+                        }
+                        return new RightShiftNode(kind, other.x(), ConstantNode.forInt(total, graph()), graph());
+                    }
+                }
+            }
+            if (originalAmout != amount) {
+                return new RightShiftNode(kind, x(), ConstantNode.forInt(amount, graph()), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/ShiftNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code ShiftOp} class represents shift operations.
+ */
+public abstract class ShiftNode extends BinaryNode {
+
+    /**
+     * Creates a new shift operation.
+     * @param opcode the opcode of the shift
+     * @param x the first input value
+     * @param s the second input value
+     */
+    public ShiftNode(CiKind kind, int opcode, ValueNode x, ValueNode s, Graph graph) {
+        super(kind, opcode, x, s, graph);
+        assert x == null || x.kind == kind;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitShift(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/UnsignedRightShiftNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,88 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = ">>>")
+public final class UnsignedRightShiftNode extends ShiftNode implements Canonicalizable {
+
+    public UnsignedRightShiftNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IUSHR : Bytecodes.LUSHR, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (y().isConstant()) {
+            int amount = y().asConstant().asInt();
+            int originalAmout = amount;
+            int mask;
+            if (kind == CiKind.Int) {
+                mask = 0x1f;
+            } else {
+                assert kind == CiKind.Long;
+                mask = 0x3f;
+            }
+            amount &= mask;
+            if (x().isConstant()) {
+                if (kind == CiKind.Int) {
+                    return ConstantNode.forInt(x().asConstant().asInt() >>> amount, graph());
+                } else {
+                    assert kind == CiKind.Long;
+                    return ConstantNode.forLong(x().asConstant().asLong() >>> amount, graph());
+                }
+            }
+            if (amount == 0) {
+                return x();
+            }
+            if (x() instanceof ShiftNode) {
+                ShiftNode other = (ShiftNode) x();
+                if (other.y().isConstant()) {
+                    int otherAmount = other.y().asConstant().asInt() & mask;
+                    if (other instanceof UnsignedRightShiftNode) {
+                        int total = amount + otherAmount;
+                        if (total != (total & mask)) {
+                            return ConstantNode.forInt(0, graph());
+                        }
+                        return new UnsignedRightShiftNode(kind, other.x(), ConstantNode.forInt(total, graph()), graph());
+                    } else if (other instanceof LeftShiftNode && otherAmount == amount) {
+                        if (kind == CiKind.Long) {
+                            return new AndNode(kind, other.x(), ConstantNode.forLong(-1L >>> amount, graph()), graph());
+                        } else {
+                            assert kind == CiKind.Int;
+                            return new AndNode(kind, other.x(), ConstantNode.forInt(-1 >>> amount, graph()), graph());
+                        }
+                    }
+                }
+            }
+            if (originalAmout != amount) {
+                return new UnsignedRightShiftNode(kind, x(), ConstantNode.forInt(amount, graph()), graph());
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/calc/XorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.nodes.calc;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+
+@NodeInfo(shortName = "^")
+public final class XorNode extends LogicNode implements Canonicalizable {
+
+    public XorNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
+        super(kind, kind == CiKind.Int ? Bytecodes.IXOR : Bytecodes.LXOR, x, y, graph);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (x() == y()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(0, graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(0L, graph());
+            }
+        }
+        if (x().isConstant() && !y().isConstant()) {
+            swapOperands();
+        }
+        if (x().isConstant()) {
+            if (kind == CiKind.Int) {
+                return ConstantNode.forInt(x().asConstant().asInt() ^ y().asConstant().asInt(), graph());
+            } else {
+                assert kind == CiKind.Long;
+                return ConstantNode.forLong(x().asConstant().asLong() ^ y().asConstant().asLong(), graph());
+            }
+        } else if (y().isConstant()) {
+            if (kind == CiKind.Int) {
+                int c = y().asConstant().asInt();
+                if (c == 0) {
+                    return x();
+                }
+            } else {
+                assert kind == CiKind.Long;
+                long c = y().asConstant().asLong();
+                if (c == 0) {
+                    return x();
+                }
+            }
+        }
+        return this;
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/SwitchNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2009, 2010, 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.nodes.cfg;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code Switch} class is the base of both lookup and table switches.
- */
-public abstract class SwitchNode extends ControlSplit {
-
-    @Input    private ValueNode value;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    /**
-     * Constructs a new Switch.
-     * @param value the instruction that provides the value to be switched over
-     * @param successors the list of successors of this switch
-     * @param stateAfter the state after the switch
-     * @param graph
-     */
-    public SwitchNode(ValueNode value, List<? extends FixedNode> successors, double[] probability, int inputCount, int successorCount, Graph graph) {
-        super(CiKind.Illegal, successors, probability, graph);
-        setValue(value);
-    }
-
-    /**
-     * Gets the number of cases that this switch covers (excluding the default case).
-     * @return the number of cases
-     */
-    public int numberOfCases() {
-        return blockSuccessorCount() - 1;
-    }
-
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/TableSwitchNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +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.nodes.cfg;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-
-/**
- * The {@code TableSwitch} instruction represents a table switch.
- */
-public final class TableSwitchNode extends SwitchNode {
-
-    private static final int INPUT_COUNT = 0;
-    private static final int SUCCESSOR_COUNT = 0;
-
-    final int lowKey;
-
-    /**
-     * Constructs a new TableSwitch instruction.
-     * @param value the instruction producing the value being switched on
-     * @param successors the list of successors
-     * @param lowKey the lowest integer key in the table
-     * @param stateAfter the state after the switch
-     * @param graph
-     */
-    public TableSwitchNode(ValueNode value, List<? extends FixedNode> successors, int lowKey, double[] probability, Graph graph) {
-        super(value, successors, probability, INPUT_COUNT, SUCCESSOR_COUNT, graph);
-        this.lowKey = lowKey;
-    }
-
-    /**
-     * Gets the lowest key in the table switch (inclusive).
-     * @return the low key
-     */
-    public int lowKey() {
-        return lowKey;
-    }
-
-    /**
-     * Gets the highest key in the table switch (exclusive).
-     * @return the high key
-     */
-    public int highKey() {
-        return lowKey + numberOfCases();
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitTableSwitch(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/cfg/WriteMemoryCheckpointNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.cfg;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public final class WriteMemoryCheckpointNode extends AbstractMemoryCheckpointNode {
-
-    public WriteMemoryCheckpointNode(Graph graph) {
-        this(CiKind.Illegal, graph);
-    }
-
-    public WriteMemoryCheckpointNode(CiKind result, Graph graph) {
-        super(result, graph);
-    }
-
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LIRGeneratorOp.class) {
-            return null;
-        }
-        return super.lookup(clazz);
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AbstractMemoryCheckpointNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,57 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class AbstractMemoryCheckpointNode extends StateSplit {
+
+    @Input    private final NodeInputList<Node> mergedNodes = new NodeInputList<Node>(this);
+
+    private static final int SUCCESSOR_COUNT = 0;
+    private static final int INPUT_COUNT = 0;
+
+    public AbstractMemoryCheckpointNode(Graph graph) {
+        this(CiKind.Illegal, graph);
+    }
+
+    public AbstractMemoryCheckpointNode(CiKind result, Graph graph) {
+        super(result, graph);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> debugProperties = super.getDebugProperties();
+        debugProperties.put("memoryCheckpoint", "true");
+        return debugProperties;
+    }
+
+    public NodeInputList<Node> mergedNodes() {
+        return mergedNodes;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AbstractVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,83 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class AbstractVectorNode extends StateSplit {
+    @Input private AbstractVectorNode vector;
+
+    public AbstractVectorNode vector() {
+        return vector;
+    }
+
+    public void setVector(AbstractVectorNode x) {
+        updateUsages(vector, x);
+        vector = x;
+    }
+
+    public AbstractVectorNode(CiKind kind, AbstractVectorNode vector, Graph graph) {
+        super(kind, graph);
+        setVector(vector);
+    }
+
+    protected static AbstractVectorNode findCommonNode(AbstractVectorNode left, AbstractVectorNode right, List<AbstractVectorNode> leftList, List<AbstractVectorNode> rightList) {
+        Set<AbstractVectorNode> occured = new HashSet<AbstractVectorNode>();
+        AbstractVectorNode common = null;
+        AbstractVectorNode cur = left;
+        while (cur != null) {
+            occured.add(cur);
+            cur = cur.vector();
+        }
+
+        cur = right;
+        while (cur != null) {
+            if (occured.contains(cur)) {
+                common = cur;
+                break;
+            }
+            cur = cur.vector();
+        }
+
+        fillUntil(left, cur, leftList);
+        fillUntil(right, cur, rightList);
+        return common;
+    }
+
+    private static void fillUntil(AbstractVectorNode left, AbstractVectorNode until, List<AbstractVectorNode> leftList) {
+        AbstractVectorNode cur = left;
+        while (cur != null && cur != until) {
+            leftList.add(cur);
+            cur = cur.vector();
+        }
+    }
+
+    public void addToLoop(LoopBeginNode loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
+        throw new IllegalStateException("unimplemented");
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AccessNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.nodes.extended;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class AccessNode extends AbstractMemoryCheckpointNode {
+    @Input private ValueNode object;
+    @Input private GuardNode guard;
+    @Input private LocationNode location;
+    @Input private final NodeInputList<Node> dependencies = new NodeInputList<Node>(this);
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public GuardNode guard() {
+        return guard;
+    }
+
+    public void setGuard(GuardNode x) {
+        updateUsages(guard, x);
+        guard = x;
+    }
+
+    public LocationNode location() {
+        return location;
+    }
+
+    public void setLocation(LocationNode x) {
+        updateUsages(location, x);
+        location = x;
+    }
+
+    public AccessNode(CiKind kind, ValueNode object, LocationNode location, Graph graph) {
+        super(kind, graph);
+        setLocation(location);
+        setObject(object);
+    }
+
+    public void addDependency(Node x) {
+        dependencies.add(x);
+    }
+
+    public NodeInputList<Node> dependencies() {
+        return dependencies;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/AccessVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.nodes.extended;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public abstract class AccessVectorNode extends AbstractVectorNode {
+    @Input private ValueNode object;
+    @Input private LocationNode location;
+    @Input private final NodeInputList<Node> dependencies = new NodeInputList<Node>(this);
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public LocationNode location() {
+        return location;
+    }
+
+    public void setLocation(LocationNode x) {
+        updateUsages(location, x);
+        location = x;
+    }
+
+    public AccessVectorNode(CiKind kind, AbstractVectorNode vector, ValueNode object, LocationNode location, Graph graph) {
+        super(kind, vector, graph);
+        setObject(object);
+        setLocation(location);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/CreateVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,154 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class CreateVectorNode extends AbstractVectorNode {
+    @Input private ValueNode length;
+
+    public ValueNode length() {
+        return length;
+    }
+
+    public void setLength(ValueNode x) {
+        updateUsages(length, x);
+        length = x;
+    }
+
+    private boolean reversed;
+
+    public boolean reversed() {
+        return reversed;
+    }
+
+    public void setReversed(boolean r) {
+        reversed = r;
+    }
+
+    public CreateVectorNode(boolean reversed, ValueNode length, Graph graph) {
+        super(CiKind.Illegal, null, graph);
+        setLength(length);
+        setReversed(reversed);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> debugProperties = super.getDebugProperties();
+        debugProperties.put("reversed", reversed);
+        return debugProperties;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return null;
+        } else if (clazz == LoweringOp.class) {
+            return (T) LOWERING_OP;
+        }
+        return super.lookup(clazz);
+    }
+
+    private LoopBeginNode createLoop(Map<AbstractVectorNode, ValueNode> map) {
+        EndNode end = new EndNode(graph());
+        LoopBeginNode loopBegin = new LoopBeginNode(graph());
+        loopBegin.addEnd(end);
+        PhiNode loopVariable = new PhiNode(CiKind.Int, loopBegin, PhiType.Value, graph());
+
+        if (reversed) {
+            IntegerSubNode add = new IntegerSubNode(CiKind.Int, loopVariable, ConstantNode.forInt(1, graph()), graph());
+            loopVariable.addInput(new IntegerSubNode(CiKind.Int, length(), ConstantNode.forInt(1, graph()), graph()));
+            loopVariable.addInput(add);
+        } else {
+            IntegerAddNode add = new IntegerAddNode(CiKind.Int, loopVariable, ConstantNode.forInt(1, graph()), graph());
+            loopVariable.addInput(ConstantNode.forInt(0, graph()));
+            loopVariable.addInput(add);
+        }
+
+        LoopEndNode loopEnd = new LoopEndNode(graph());
+        loopEnd.setLoopBegin(loopBegin);
+        loopBegin.setStateAfter(stateAfter());
+        CompareNode condition;
+        if (reversed) {
+            condition = new CompareNode(loopVariable, Condition.GE, ConstantNode.forInt(0, graph()), graph());
+        } else {
+            condition = new CompareNode(loopVariable, Condition.LT, length(), graph());
+        }
+        int expectedLength = 100; // TODO: it may be possible to get a more accurate estimate...?
+        if (length().isConstant()) {
+            expectedLength = length().asConstant().asInt();
+        }
+        IfNode ifNode = new IfNode(condition, 1.0 / expectedLength, graph());
+        loopBegin.setNext(ifNode);
+        ifNode.setTrueSuccessor(loopEnd);
+        this.replaceAtPredecessors(end);
+        ifNode.setFalseSuccessor(this);
+        map.put(this, loopVariable);
+        return loopBegin;
+    }
+
+    private static final LoweringOp LOWERING_OP = new LoweringOp() {
+        @Override
+        public void lower(Node n, CiLoweringTool tool) {
+            CreateVectorNode vectorNode = (CreateVectorNode) n;
+
+            IdentityHashMap<AbstractVectorNode, ValueNode> nodes = new IdentityHashMap<AbstractVectorNode, ValueNode>();
+            LoopBeginNode begin = vectorNode.createLoop(nodes);
+            for (Node use : vectorNode.usages()) {
+                processUse(begin, use, nodes);
+            }
+        }
+
+        private void processUse(LoopBeginNode loop, Node use, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
+            AbstractVectorNode vectorNode = (AbstractVectorNode) use;
+            if (nodes.containsKey(vectorNode)) {
+                return;
+            }
+            nodes.put(vectorNode, null);
+
+            // Make sure inputs are evaluated.
+            for (Node input : use.inputs()) {
+                if (input instanceof AbstractVectorNode) {
+                    AbstractVectorNode abstractVectorNodeInput = (AbstractVectorNode) input;
+                    processUse(loop, abstractVectorNodeInput, nodes);
+                }
+            }
+
+            vectorNode.addToLoop(loop, nodes);
+
+            // Go on to usages.
+            for (Node usage : use.usages()) {
+                processUse(loop, usage, nodes);
+            }
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/LocationNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,114 @@
+/*
+ * 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.nodes.extended;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ci.CiAddress.Scale;
+
+
+public final class LocationNode extends FloatingNode {
+    @Input private ValueNode index;
+
+    @Data private int displacement;
+    @Data private boolean indexScalingEnabled = true;
+    @Data private CiKind valueKind;
+    @Data private Object locationIdentity;
+
+    public ValueNode index() {
+        return index;
+    }
+
+    public void setIndex(ValueNode x) {
+        updateUsages(index, x);
+        index = x;
+    }
+
+    public static final Object UNSAFE_ACCESS_LOCATION = new Object();
+    public static final Object FINAL_LOCATION = new Object();
+
+    public static Object getArrayLocation(CiKind elementKind) {
+        return elementKind;
+    }
+
+    public int displacement() {
+        return displacement;
+    }
+
+    /**
+     * @return whether scaling of the index by the value kind's size is enabled (the default) or disabled.
+     */
+    public boolean indexScalingEnabled() {
+        return indexScalingEnabled;
+    }
+
+    /**
+     * Enables or disables scaling of the index by the value kind's size. Has no effect if the index input is not used.
+     */
+    public void setIndexScalingEnabled(boolean enable) {
+        this.indexScalingEnabled = enable;
+    }
+
+    public static LocationNode create(Object identity, CiKind kind, int displacement, Graph graph) {
+        LocationNode result = new LocationNode(identity, kind, displacement, graph);
+        return graph.value(result);
+    }
+
+    private LocationNode(Object identity, CiKind kind, int displacement, Graph graph) {
+        super(CiKind.Illegal, graph);
+        this.displacement = displacement;
+        this.valueKind = kind;
+        this.locationIdentity = identity;
+    }
+
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return null;
+        }
+        return super.lookup(clazz);
+    }
+
+    public CiKind getValueKind() {
+        return valueKind;
+    }
+
+    public CiAddress createAddress(LIRGeneratorTool lirGenerator, ValueNode object) {
+        CiValue indexValue = CiValue.IllegalValue;
+        Scale indexScale = Scale.Times1;
+        if (this.index() != null) {
+            indexValue = lirGenerator.load(this.index());
+            if (indexScalingEnabled) {
+                indexScale = Scale.fromInt(valueKind.sizeInBytes(lirGenerator.target().wordSize));
+            }
+        }
+        return new CiAddress(valueKind, lirGenerator.load(object), indexValue, indexScale, displacement);
+    }
+
+    public Object locationIdentity() {
+        return locationIdentity;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/LookupSwitchNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,72 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+
+/**
+ * The {@code LookupSwitch} instruction represents a lookup switch bytecode, which has a sorted
+ * array of key values.
+ */
+public final class LookupSwitchNode extends SwitchNode {
+
+    private static final int INPUT_COUNT = 0;
+    private static final int SUCCESSOR_COUNT = 0;
+
+    final int[] keys;
+
+    /**
+     * Constructs a new LookupSwitch instruction.
+     * @param value the instruction producing the value being switched on
+     * @param successors the list of successors
+     * @param keys the list of keys, sorted
+     * @param stateAfter the state after the switch
+     * @param graph
+     */
+    public LookupSwitchNode(ValueNode value, List<? extends FixedNode> successors, int[] keys, double[] probability, Graph graph) {
+        super(value, successors, probability, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+        this.keys = keys;
+    }
+
+    /**
+     * Gets the key at the specified index.
+     * @param i the index
+     * @return the key at that index
+     */
+    public int keyAt(int i) {
+        return keys[i];
+    }
+
+    public int keysLength() {
+        return keys.length;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLookupSwitch(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ReadNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,41 @@
+/*
+ * 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.nodes.extended;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class ReadNode extends AccessNode implements Node.ValueNumberable {
+
+    public ReadNode(CiKind kind, ValueNode object, LocationNode location, Graph graph) {
+        super(kind, object, location, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMemoryRead(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ReadVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,58 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class ReadVectorNode extends AccessVectorNode {
+
+    public ReadVectorNode(AbstractVectorNode vector, ValueNode object, LocationNode location, Graph graph) {
+        super(CiKind.Illegal, vector, object, location, graph);
+    }
+
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return null;
+        }
+        return super.lookup(clazz);
+    }
+
+    @Override
+    public void addToLoop(LoopBeginNode loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
+        LocationNode newLocation = LocationNode.create(LocationNode.getArrayLocation(location().getValueKind()), location().getValueKind(), location().displacement(), graph());
+        ValueNode index = nodes.get(vector());
+        assert index != null;
+        newLocation.setIndex(index);
+        ReadNode readNode = new ReadNode(location().getValueKind().stackKind(), object(), newLocation, graph());
+        loop.loopEnd().replaceAtPredecessors(readNode);
+        readNode.setNext(loop.loopEnd());
+        nodes.put(this, readNode);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ShiftNode.java	Tue Aug 09 23:56:10 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.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code ShiftOp} class represents shift operations.
- */
-public abstract class ShiftNode extends Binary {
-
-    /**
-     * Creates a new shift operation.
-     * @param opcode the opcode of the shift
-     * @param x the first input value
-     * @param s the second input value
-     */
-    public ShiftNode(CiKind kind, int opcode, ValueNode x, ValueNode s, Graph graph) {
-        super(kind, opcode, x, s, graph);
-        assert x == null || x.kind == kind;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitShift(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/StoreFieldNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,74 +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.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code StoreField} instruction represents a write to a static or instance field.
- */
-public final class StoreFieldNode extends AccessField {
-
-    @Input private ValueNode value;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    /**
-     * Creates a new LoadField instance.
-     * @param object the receiver object
-     * @param field the compiler interface field
-     * @param value the instruction representing the value to store to the field
-     * @param stateAfter the state after the field access
-     * @param graph
-     */
-    public StoreFieldNode(ValueNode object, RiField field, ValueNode value, Graph graph) {
-        super(CiKind.Void, object, field, graph);
-        setValue(value);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitStoreField(this);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(java.lang.Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) DELEGATE_TO_RUNTIME;
-        }
-        return super.lookup(clazz);
-    };
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/StoreIndexedNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +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.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * The {@code StoreIndexed} instruction represents a write to an array element.
- */
-public final class StoreIndexedNode extends AccessIndexed {
-
-    @Input private ValueNode value;
-
-    public ValueNode value() {
-        return value;
-    }
-
-    public void setValue(ValueNode x) {
-        updateUsages(value, x);
-        value = x;
-    }
-
-    /**
-     * Creates a new StoreIndexed instruction.
-     * @param array the instruction producing the array
-     * @param index the instruction producing the index
-     * @param length the instruction producing the length
-     * @param elementKind the element type
-     * @param value the value to store into the array
-     * @param stateAfter the state after executing this instruction
-     * @param graph
-     */
-    public StoreIndexedNode(ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, ValueNode value, Graph graph) {
-        super(CiKind.Void, array, index, length, elementKind, graph);
-        setValue(value);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitStoreIndexed(this);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <T extends Op> T lookup(Class<T> clazz) {
-        if (clazz == LoweringOp.class) {
-            return (T) DELEGATE_TO_RUNTIME;
-        }
-        return super.lookup(clazz);
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/SwitchNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2009, 2010, 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code Switch} class is the base of both lookup and table switches.
+ */
+public abstract class SwitchNode extends ControlSplitNode {
+
+    @Input    private ValueNode value;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    /**
+     * Constructs a new Switch.
+     * @param value the instruction that provides the value to be switched over
+     * @param successors the list of successors of this switch
+     * @param stateAfter the state after the switch
+     * @param graph
+     */
+    public SwitchNode(ValueNode value, List<? extends FixedNode> successors, double[] probability, int inputCount, int successorCount, Graph graph) {
+        super(CiKind.Illegal, successors, probability, graph);
+        setValue(value);
+    }
+
+    /**
+     * Gets the number of cases that this switch covers (excluding the default case).
+     * @return the number of cases
+     */
+    public int numberOfCases() {
+        return blockSuccessorCount() - 1;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/TableSwitchNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.nodes.extended;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+
+/**
+ * The {@code TableSwitch} instruction represents a table switch.
+ */
+public final class TableSwitchNode extends SwitchNode {
+
+    private static final int INPUT_COUNT = 0;
+    private static final int SUCCESSOR_COUNT = 0;
+
+    final int lowKey;
+
+    /**
+     * Constructs a new TableSwitch instruction.
+     * @param value the instruction producing the value being switched on
+     * @param successors the list of successors
+     * @param lowKey the lowest integer key in the table
+     * @param stateAfter the state after the switch
+     * @param graph
+     */
+    public TableSwitchNode(ValueNode value, List<? extends FixedNode> successors, int lowKey, double[] probability, Graph graph) {
+        super(value, successors, probability, INPUT_COUNT, SUCCESSOR_COUNT, graph);
+        this.lowKey = lowKey;
+    }
+
+    /**
+     * Gets the lowest key in the table switch (inclusive).
+     * @return the low key
+     */
+    public int lowKey() {
+        return lowKey;
+    }
+
+    /**
+     * Gets the highest key in the table switch (exclusive).
+     * @return the high key
+     */
+    public int highKey() {
+        return lowKey + numberOfCases();
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitTableSwitch(this);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/TypeCheckNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +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.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-/**
- * The {@code TypeCheck} instruction is the base class of casts and instanceof tests.
- */
-public abstract class TypeCheckNode extends BooleanNode {
-    @Input private ValueNode object;
-    @Input private ValueNode targetClassInstruction;
-
-    public ValueNode object() {
-        return object;
-    }
-
-    public void setObject(ValueNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public ValueNode targetClassInstruction() {
-        return targetClassInstruction;
-    }
-
-    public void setTargetClassInstruction(ValueNode x) {
-        updateUsages(targetClassInstruction, x);
-        targetClassInstruction = x;
-    }
-
-    /**
-     * Gets the target class, i.e. the class being cast to, or the class being tested against.
-     * @return the target class
-     */
-    public RiType targetClass() {
-        return targetClassInstruction() instanceof Constant ? (RiType) targetClassInstruction().asConstant().asObject() : null;
-    }
-
-    /**
-     * Creates a new TypeCheck instruction.
-     * @param targetClass the class which is being casted to or checked against
-     * @param object the instruction which produces the object
-     * @param kind the result type of this instruction
-     * @param graph
-     */
-    public TypeCheckNode(ValueNode targetClassInstruction, ValueNode object, CiKind kind, Graph graph) {
-        super(kind, graph);
-        setObject(object);
-        setTargetClassInstruction(targetClassInstruction);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/UnsignedRightShiftNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = ">>>")
-public final class UnsignedRightShiftNode extends ShiftNode implements Canonicalizable {
-
-    public UnsignedRightShiftNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IUSHR : Bytecodes.LUSHR, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (y().isConstant()) {
-            int amount = y().asConstant().asInt();
-            int originalAmout = amount;
-            int mask;
-            if (kind == CiKind.Int) {
-                mask = 0x1f;
-            } else {
-                assert kind == CiKind.Long;
-                mask = 0x3f;
-            }
-            amount &= mask;
-            if (x().isConstant()) {
-                if (kind == CiKind.Int) {
-                    return Constant.forInt(x().asConstant().asInt() >>> amount, graph());
-                } else {
-                    assert kind == CiKind.Long;
-                    return Constant.forLong(x().asConstant().asLong() >>> amount, graph());
-                }
-            }
-            if (amount == 0) {
-                return x();
-            }
-            if (x() instanceof ShiftNode) {
-                ShiftNode other = (ShiftNode) x();
-                if (other.y().isConstant()) {
-                    int otherAmount = other.y().asConstant().asInt() & mask;
-                    if (other instanceof UnsignedRightShiftNode) {
-                        int total = amount + otherAmount;
-                        if (total != (total & mask)) {
-                            return Constant.forInt(0, graph());
-                        }
-                        return new UnsignedRightShiftNode(kind, other.x(), Constant.forInt(total, graph()), graph());
-                    } else if (other instanceof LeftShift && otherAmount == amount) {
-                        if (kind == CiKind.Long) {
-                            return new And(kind, other.x(), Constant.forLong(-1L >>> amount, graph()), graph());
-                        } else {
-                            assert kind == CiKind.Int;
-                            return new And(kind, other.x(), Constant.forInt(-1 >>> amount, graph()), graph());
-                        }
-                    }
-                }
-            }
-            if (originalAmout != amount) {
-                return new UnsignedRightShiftNode(kind, x(), Constant.forInt(amount, graph()), graph());
-            }
-        }
-        return this;
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/UnwindNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-/**
- * Unwind takes an exception object, destroys the current stack frame and passes the exception object to the system's exception dispatch code.
- */
-public final class UnwindNode extends FixedNode {
-
-    @Input private ValueNode exception;
-
-    public ValueNode exception() {
-        return exception;
-    }
-
-    public void setException(ValueNode x) {
-        assert x == null || x.kind == CiKind.Object;
-        updateUsages(this.exception, x);
-        this.exception = x;
-    }
-
-    public UnwindNode(ValueNode exception, Graph graph) {
-        super(CiKind.Object, graph);
-        setException(exception);
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        v.visitUnwind(this);
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ValueAnchorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/ValueAnchorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,7 +22,6 @@
  */
 package com.oracle.max.graal.compiler.nodes.extended;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
@@ -31,7 +30,7 @@
 /**
  * The ValueAnchor instruction keeps non-CFG nodes above a certain point in the graph.
  */
-public final class ValueAnchorNode extends FixedNodeWithNext {
+public final class ValueAnchorNode extends FixedWithNextNode {
     @Input private ValueNode object;
 
     public ValueNode object() {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/VirtualObjectFieldNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.extended;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-
-
-public class VirtualObjectFieldNode extends FloatingNode {
-
-    @Input private VirtualObjectNode object;
-    @Input private FloatingNode lastState;
-    @Input private ValueNode input;
-
-    public VirtualObjectNode object() {
-        return object;
-    }
-
-    public void setObject(VirtualObjectNode x) {
-        updateUsages(object, x);
-        object = x;
-    }
-
-    public FloatingNode lastState() {
-        return lastState;
-    }
-
-    public void setLastState(FloatingNode x) {
-        updateUsages(lastState, x);
-        lastState = x;
-    }
-
-    public ValueNode input() {
-        return input;
-    }
-
-    public void setInput(ValueNode x) {
-        updateUsages(input, x);
-        input = x;
-    }
-
-    private int index;
-
-    /**
-     * Constructs a new ArrayLength instruction.
-     * @param array the instruction producing the array
-     * @param newFrameState the state after executing this instruction
-     */
-    public VirtualObjectFieldNode(VirtualObjectNode object, FloatingNode lastState, ValueNode input, int index, Graph graph) {
-        super(CiKind.Int, graph);
-        this.index = index;
-        setObject(object);
-        setLastState(lastState);
-        setInput(input);
-    }
-
-    public int index() {
-        return index;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        // nothing to do...
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("index", index);
-        return properties;
-    }
-
-    @Override
-    public String shortName() {
-        return "VirtualObjectField " + object().fields()[index].name();
-    }
-}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/VirtualObjectNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.extended;
-
-import java.util.*;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.ci.*;
-import com.sun.cri.ri.*;
-
-
-public class VirtualObjectNode extends FloatingNode {
-
-
-
-    private EscapeField[] fields;
-    private RiType type;
-
-    public VirtualObjectNode(RiType type, EscapeField[] fields, Graph graph) {
-        super(CiKind.Int, graph);
-        this.type = type;
-        this.fields = fields;
-    }
-
-    public RiType type() {
-        return type;
-    }
-
-    public EscapeField[] fields() {
-        return fields;
-    }
-
-    @Override
-    public void accept(ValueVisitor v) {
-        // nothing to do...
-    }
-
-    @Override
-    public Map<Object, Object> getDebugProperties() {
-        Map<Object, Object> properties = super.getDebugProperties();
-        properties.put("type", type);
-        return properties;
-    }
-
-    @Override
-    public String shortName() {
-        return "VirtualObject " + type.name();
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteMemoryCheckpointNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.nodes.extended;
+
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public final class WriteMemoryCheckpointNode extends AbstractMemoryCheckpointNode {
+
+    public WriteMemoryCheckpointNode(Graph graph) {
+        this(CiKind.Illegal, graph);
+    }
+
+    public WriteMemoryCheckpointNode(CiKind result, Graph graph) {
+        super(result, graph);
+    }
+
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LIRGeneratorOp.class) {
+            return null;
+        }
+        return super.lookup(clazz);
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,7 +22,6 @@
  */
 package com.oracle.max.graal.compiler.nodes.extended;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteVectorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/WriteVectorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,7 +24,6 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
@@ -57,7 +56,7 @@
     }
 
     @Override
-    public void addToLoop(LoopBegin loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
+    public void addToLoop(LoopBeginNode loop, IdentityHashMap<AbstractVectorNode, ValueNode> nodes) {
         LocationNode newLocation = LocationNode.create(LocationNode.getArrayLocation(location().getValueKind()), location().getValueKind(), location().displacement(), graph());
         ValueNode index = nodes.get(vector());
         ValueNode value = nodes.get(values());
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/extended/XorNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-package com.oracle.max.graal.compiler.nodes.extended;
-
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.graph.*;
-import com.sun.cri.bytecode.*;
-import com.sun.cri.ci.*;
-
-@NodeInfo(shortName = "^")
-public final class XorNode extends Logic implements Canonicalizable {
-
-    public XorNode(CiKind kind, ValueNode x, ValueNode y, Graph graph) {
-        super(kind, kind == CiKind.Int ? Bytecodes.IXOR : Bytecodes.LXOR, x, y, graph);
-    }
-
-    @Override
-    public Node canonical(NotifyReProcess reProcess) {
-        if (x() == y()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(0, graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(0L, graph());
-            }
-        }
-        if (x().isConstant() && !y().isConstant()) {
-            swapOperands();
-        }
-        if (x().isConstant()) {
-            if (kind == CiKind.Int) {
-                return Constant.forInt(x().asConstant().asInt() ^ y().asConstant().asInt(), graph());
-            } else {
-                assert kind == CiKind.Long;
-                return Constant.forLong(x().asConstant().asLong() ^ y().asConstant().asLong(), graph());
-            }
-        } else if (y().isConstant()) {
-            if (kind == CiKind.Int) {
-                int c = y().asConstant().asInt();
-                if (c == 0) {
-                    return x();
-                }
-            } else {
-                assert kind == CiKind.Long;
-                long c = y().asConstant().asLong();
-                if (c == 0) {
-                    return x();
-                }
-            }
-        }
-        return this;
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessArrayNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,56 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * This the base class of all array operations.
+ */
+public abstract class AccessArrayNode extends StateSplit {
+
+    @Input    private ValueNode array;
+
+    public ValueNode array() {
+        return array;
+    }
+
+    public void setArray(ValueNode x) {
+        updateUsages(array, x);
+        array = x;
+    }
+
+    /**
+     * Creates a new AccessArray instruction.
+     * @param kind the type of the result of this instruction
+     * @param array the instruction that produces the array object value
+     * @param graph
+     */
+    public AccessArrayNode(CiKind kind, ValueNode array, Graph graph) {
+        super(kind, graph);
+        setArray(array);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessFieldNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,96 @@
+/*
+ * 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.nodes.java;
+
+import java.lang.reflect.*;
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The base class of all instructions that access fields.
+ */
+public abstract class AccessFieldNode extends StateSplit {
+
+    @Input    private ValueNode object;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    protected final RiField field;
+
+    /**
+     * Constructs a new access field object.
+     * @param kind the result kind of the access
+     * @param object the instruction producing the receiver object
+     * @param field the compiler interface representation of the field
+     * @param graph
+     */
+    public AccessFieldNode(CiKind kind, ValueNode object, RiField field, Graph graph) {
+        super(kind, graph);
+        this.field = field;
+        setObject(object);
+        assert field.isResolved();
+        assert field.holder().isInitialized();
+    }
+
+    /**
+     * Gets the compiler interface field for this field access.
+     * @return the compiler interface field for this field access
+     */
+    public RiField field() {
+        return field;
+    }
+
+    /**
+     * Checks whether this field access is an access to a static field.
+     * @return {@code true} if this field access is to a static field
+     */
+    public boolean isStatic() {
+        return Modifier.isStatic(field.accessFlags());
+    }
+
+    /**
+     * Checks whether this field is declared volatile.
+     * @return {@code true} if the field is resolved and declared volatile
+     */
+    public boolean isVolatile() {
+        return Modifier.isVolatile(field.accessFlags());
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("field", field);
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessIndexedNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,83 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code AccessIndexed} class is the base class of instructions that read or write
+ * elements of an array.
+ */
+public abstract class AccessIndexedNode extends AccessArrayNode {
+
+    @Input    private ValueNode index;
+
+    @Input    private ValueNode length;
+
+    public ValueNode index() {
+        return index;
+    }
+
+    public void setIndex(ValueNode x) {
+        updateUsages(index, x);
+        index = x;
+    }
+
+    public ValueNode length() {
+        return length;
+    }
+
+    public void setLength(ValueNode x) {
+        updateUsages(length, x);
+        length = x;
+    }
+
+    private final CiKind elementType;
+
+    /**
+     * Create an new AccessIndexed instruction.
+     * @param kind the result kind of the access
+     * @param array the instruction producing the array
+     * @param index the instruction producing the index
+     * @param length the instruction producing the length (used in bounds check elimination?)
+     * @param elementKind the type of the elements of the array
+     * @param graph
+     */
+    protected AccessIndexedNode(CiKind kind, ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, Graph graph) {
+        super(kind, array, graph);
+        setIndex(index);
+        setLength(length);
+        this.elementType = elementKind;
+    }
+
+    /**
+     * Gets the element type of the array.
+     * @return the element type
+     */
+    public CiKind elementKind() {
+        return elementType;
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/AccessMonitorNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code AccessMonitor} instruction is the base class of both monitor acquisition and release.
+ */
+public abstract class AccessMonitorNode extends AbstractMemoryCheckpointNode {
+
+    @Input private ValueNode object;
+    @Input private ValueNode lockAddress;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public ValueNode lockAddress() {
+        return lockAddress;
+    }
+
+    public void setLockAddress(ValueNode x) {
+        updateUsages(lockAddress, x);
+        lockAddress = x;
+    }
+
+    /**
+     * The lock number of this monitor access.
+     */
+    public final int lockNumber;
+
+    /**
+     * Creates a new AccessMonitor instruction.
+     *
+     * @param object the instruction producing the object
+     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
+     * @param lockNumber the number of the lock being acquired
+     * @param graph
+     */
+    public AccessMonitorNode(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
+        super(CiKind.Illegal, graph);
+        this.lockNumber = lockNumber;
+        setObject(object);
+        setLockAddress(lockAddress);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/ArrayLengthNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,84 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.graph.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code ArrayLength} instruction gets the length of an array.
+ */
+public final class ArrayLengthNode extends FloatingNode implements Canonicalizable {
+
+    @Input private ValueNode array;
+
+    public ValueNode array() {
+        return array;
+    }
+
+    public void setArray(ValueNode x) {
+        updateUsages(array, x);
+        array = x;
+    }
+
+    /**
+     * Constructs a new ArrayLength instruction.
+     *
+     * @param array the instruction producing the array
+     * @param newFrameState the state after executing this instruction
+     */
+    public ArrayLengthNode(ValueNode array, Graph graph) {
+        super(CiKind.Int, graph);
+        setArray(array);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitArrayLength(this);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (array() instanceof NewArrayNode) {
+            ValueNode length = ((NewArrayNode) array()).dimension(0);
+            assert length != null;
+            return length;
+        }
+        CiConstant constantValue = null;
+        if (array().isConstant()) {
+            constantValue = array().asConstant();
+            if (constantValue != null && constantValue.isNonNull()) {
+                if (graph() instanceof CompilerGraph) {
+                    RiRuntime runtime = ((CompilerGraph) graph()).runtime();
+                    return ConstantNode.forInt(runtime.getArrayLength(constantValue), graph());
+                }
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/CheckCastNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,90 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.bytecode.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code CheckCast} instruction represents a {@link Bytecodes#CHECKCAST}.
+ */
+public final class CheckCastNode extends TypeCheckNode implements Canonicalizable {
+
+    /**
+     * Creates a new CheckCast instruction.
+     *
+     * @param targetClass the class being cast to
+     * @param object the instruction producing the object
+     * @param graph
+     */
+    public CheckCastNode(ValueNode targetClassInstruction, ValueNode object, Graph graph) {
+        super(targetClassInstruction, object, CiKind.Object, graph);
+    }
+
+    /**
+     * Gets the declared type of the result of this instruction.
+     *
+     * @return the declared type of the result
+     */
+    @Override
+    public RiType declaredType() {
+        return targetClass();
+    }
+
+    /**
+     * Gets the exact type of the result of this instruction.
+     *
+     * @return the exact type of the result
+     */
+    @Override
+    public RiType exactType() {
+        return targetClass().isResolved() ? targetClass().exactType() : null;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitCheckCast(this);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (object().exactType() != null) {
+            return object();
+        }
+        CiConstant constant = object().asConstant();
+        if (constant != null) {
+            assert constant.kind == CiKind.Object;
+            if (constant.isNull()) {
+                return object();
+            } else {
+                // this should never happen - non-null constants are always expected to provide an exactType
+                assert false;
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/ExceptionObjectNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,47 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code ExceptionObject} instruction represents the incoming exception object to an exception handler.
+ */
+public final class ExceptionObjectNode extends StateSplit {
+
+    /**
+     * Constructs a new ExceptionObject instruction.
+     * @param graph
+     */
+    public ExceptionObjectNode(Graph graph) {
+        super(CiKind.Object, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitExceptionObject(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/InstanceOfNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,67 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code InstanceOf} instruction represents an instanceof test.
+ */
+public final class InstanceOfNode extends TypeCheckNode implements Canonicalizable {
+
+    /**
+     * Constructs a new InstanceOf instruction.
+     *
+     * @param targetClass the target class of the instanceof check
+     * @param object the instruction producing the object input to this instruction
+     * @param graph
+     */
+    public InstanceOfNode(ConstantNode targetClassInstruction, ValueNode object, boolean nullIsTrue, Graph graph) {
+        super(targetClassInstruction, object, CiKind.Illegal, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (object().exactType() != null) {
+            return ConstantNode.forBoolean(object().exactType().isSubtypeOf(targetClass()), graph());
+        }
+        CiConstant constant = object().asConstant();
+        if (constant != null) {
+            assert constant.kind == CiKind.Object;
+            if (constant.isNull()) {
+                return ConstantNode.forBoolean(false, graph());
+            } else {
+                // this should never happen - non-null constants are always expected to provide an exactType
+                assert false;
+            }
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/IsTypeNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,100 @@
+/*
+ * 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.nodes.java;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code TypeCheck} class represents an explicit type check instruction.
+ */
+public final class IsTypeNode extends BooleanNode implements Canonicalizable {
+
+    @Input private ValueNode object;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    private final RiType type;
+
+    /**
+     * Constructs a new IsType instruction.
+     *
+     * @param object the instruction producing the object to check against the given type
+     * @param graph
+     */
+    public IsTypeNode(ValueNode object, RiType type, Graph graph) {
+        super(CiKind.Object, graph);
+        assert type.isResolved();
+        assert object == null || object.kind == CiKind.Object;
+        this.type = type;
+        setObject(object);
+    }
+
+    public RiType type() {
+        return type;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        // Nothing to do.
+    }
+
+    @Override
+    public RiType declaredType() {
+        // type check does not alter the type of the object
+        return object().declaredType();
+    }
+
+    @Override
+    public RiType exactType() {
+        return type;
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("type", type);
+        return properties;
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (object().exactType() != null) {
+            return ConstantNode.forBoolean(object().exactType() == type(), graph());
+        }
+        // constants return the correct exactType, so they are handled by the code above
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/LoadFieldNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,109 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code LoadField} instruction represents a read of a static or instance field.
+ */
+public final class LoadFieldNode extends AccessFieldNode implements Canonicalizable {
+
+    /**
+     * Creates a new LoadField instance.
+     *
+     * @param object the receiver object
+     * @param field the compiler interface field
+     * @param isStatic indicates if the field is static
+     * @param stateAfter the state after the field access
+     * @param graph
+     * @param isLoaded indicates if the class is loaded
+     */
+    public LoadFieldNode(ValueNode object, RiField field, Graph graph) {
+        super(field.kind().stackKind(), object, field, graph);
+    }
+
+    /**
+     * Gets the declared type of the field being accessed.
+     *
+     * @return the declared type of the field being accessed.
+     */
+    @Override
+    public RiType declaredType() {
+        return field().type();
+    }
+
+    /**
+     * Gets the exact type of the field being accessed. If the field type is a primitive array or an instance class and
+     * the class is loaded and final, then the exact type is the same as the declared type. Otherwise it is {@code null}
+     *
+     * @return the exact type of the field if known; {@code null} otherwise
+     */
+    @Override
+    public RiType exactType() {
+        RiType declared = declaredType();
+        return declared != null && declared.isResolved() ? declared.exactType() : null;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLoadField(this);
+    }
+
+    @Override
+    public boolean needsStateAfter() {
+        return false;
+    }
+
+    /**
+     * Gets a constant value to which this load can be reduced.
+     *
+     * @return {@code null} if this load cannot be reduced to a constant
+     */
+    private CiConstant constantValue() {
+        if (isStatic()) {
+            return field.constantValue(null);
+        } else if (object().isConstant()) {
+            return field.constantValue(object().asConstant());
+        }
+        return null;
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        CiConstant constant = null;
+        if (isStatic()) {
+            constant = field().constantValue(null);
+        } else if (object().isConstant()) {
+            constant = field().constantValue(object().asConstant());
+        }
+        if (constant != null) {
+            return new ConstantNode(constant, graph());
+        }
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/LoadIndexedNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,89 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code LoadIndexed} instruction represents a read from an element of an array.
+ */
+public final class LoadIndexedNode extends AccessIndexedNode {
+
+    /**
+     * Creates a new LoadIndexed instruction.
+     * @param array the instruction producing the array
+     * @param index the instruction producing the index
+     * @param length the instruction producing the length
+     * @param elementKind the element type
+     * @param graph
+     */
+    public LoadIndexedNode(ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, Graph graph) {
+        super(elementKind.stackKind(), array, index, length, elementKind, graph);
+    }
+
+    /**
+     * Gets the declared type of this instruction's result.
+     * @return the declared type
+     */
+    @Override
+    public RiType declaredType() {
+        RiType arrayType = array().declaredType();
+        if (arrayType == null) {
+            return null;
+        }
+        return arrayType.componentType();
+    }
+
+    /**
+     * Gets the exact type of this instruction's result.
+     * @return the exact type
+     */
+    @Override
+    public RiType exactType() {
+        RiType declared = declaredType();
+        return declared != null && declared.isResolved() ? declared.exactType() : null;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitLoadIndexed(this);
+    }
+
+    @Override
+    public boolean needsStateAfter() {
+        return false;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) DELEGATE_TO_RUNTIME;
+        }
+        return super.lookup(clazz);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MathIntrinsicNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+
+public class MathIntrinsicNode extends FloatingNode {
+
+    @Input private ValueNode x;
+    @Data private final Operation operation;
+
+    public enum Operation {
+        ABS, SQRT,
+    }
+
+    public ValueNode x() {
+        return x;
+    }
+
+    private void setX(ValueNode x) {
+        updateUsages(this.x, x);
+        this.x = x;
+    }
+
+    public Operation operation() {
+        return operation;
+    }
+
+    public MathIntrinsicNode(ValueNode x, Operation op, Graph graph) {
+        super(x.kind, graph);
+        setX(x);
+        this.operation = op;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMathIntrinsic(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorAddressNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2010, 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.nodes.java;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * Instruction that is used to refer to the address of an on-stack monitor.
+ */
+public final class MonitorAddressNode extends ValueNode {
+
+    private int monitorIndex;
+
+    public MonitorAddressNode(int monitorIndex, Graph graph) {
+        super(CiKind.Word, graph);
+        this.monitorIndex = monitorIndex;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMonitorAddress(this);
+    }
+
+    public int monitorIndex() {
+        return monitorIndex;
+    }
+
+    public void setMonitorIndex(int monitorIndex) {
+        this.monitorIndex = monitorIndex;
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("monitorIndex", monitorIndex);
+        return properties;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorEnterNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+
+/**
+ * The {@code MonitorEnter} instruction represents the acquisition of a monitor.
+ */
+public final class MonitorEnterNode extends AccessMonitorNode {
+
+    /**
+     * Creates a new MonitorEnter instruction.
+     *
+     * @param object the instruction producing the object
+     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
+     * @param lockNumber the number of the lock
+     * @param graph
+     */
+    public MonitorEnterNode(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
+        super(object, lockAddress, lockNumber, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMonitorEnter(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/MonitorExitNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+
+/**
+ * The {@code MonitorExit} instruction represents a monitor release.
+ */
+public final class MonitorExitNode extends AccessMonitorNode {
+
+    /**
+     * Creates a new MonitorExit instruction.
+     *
+     * @param object the instruction produces the object value
+     * @param lockAddress the address of the on-stack lock object or {@code null} if the runtime does not place locks on the stack
+     * @param lockNumber the number of the lock
+     * @param graph
+     */
+    public MonitorExitNode(ValueNode object, ValueNode lockAddress, int lockNumber, Graph graph) {
+        super(object, lockAddress, lockNumber, graph);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitMonitorExit(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewArrayNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,179 @@
+/*
+ * 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.nodes.java;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code NewArray} class is the base of all instructions that allocate arrays.
+ */
+public abstract class NewArrayNode extends FixedWithNextNode {
+
+    @Input    private ValueNode length;
+
+    public ValueNode length() {
+        return length;
+    }
+
+    public void setLength(ValueNode x) {
+        updateUsages(this.length, x);
+        this.length = x;
+    }
+
+    /**
+     * Constructs a new NewArray instruction.
+     * @param length the instruction that produces the length for this allocation
+     * @param graph
+     */
+    protected NewArrayNode(ValueNode length, Graph graph) {
+        super(CiKind.Object, graph);
+        setLength(length);
+    }
+
+    /**
+     * The list of instructions which produce input for this instruction.
+     */
+    public ValueNode dimension(int index) {
+        assert index == 0;
+        return length();
+    }
+
+    /**
+     * The rank of the array allocated by this instruction, i.e. how many array dimensions.
+     */
+    public int dimensionCount() {
+        return 1;
+    }
+
+    public abstract CiKind elementKind();
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("exactType", exactType());
+        return properties;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == EscapeOp.class) {
+            return (T) ESCAPE;
+        }
+        return super.lookup(clazz);
+    }
+
+    private static final EscapeOp ESCAPE = new EscapeOp() {
+
+        @Override
+        public boolean canAnalyze(Node node) {
+            NewArrayNode x = (NewArrayNode) node;
+            CiConstant length = x.dimension(0).asConstant();
+            return length != null && length.asInt() >= 0 && length.asInt() < GraalOptions.MaximumEscapeAnalysisArrayLength;
+        }
+
+        @Override
+        public boolean escape(Node node, Node usage) {
+            if (usage instanceof LoadIndexedNode) {
+                LoadIndexedNode x = (LoadIndexedNode) usage;
+                assert x.array() == node;
+                CiConstant index = x.index().asConstant();
+                CiConstant length = ((NewArrayNode) node).dimension(0).asConstant();
+                if (index == null || length == null || index.asInt() < 0 || index.asInt() >= length.asInt()) {
+                    return true;
+                }
+                return false;
+            } else if (usage instanceof StoreFieldNode) {
+                StoreFieldNode x = (StoreFieldNode) usage;
+                assert x.value() == node;
+                return true;
+            } else if (usage instanceof StoreIndexedNode) {
+                StoreIndexedNode x = (StoreIndexedNode) usage;
+                CiConstant index = x.index().asConstant();
+                CiConstant length = ((NewArrayNode) node).dimension(0).asConstant();
+                if (index == null || length == null || index.asInt() < 0 || index.asInt() >= length.asInt()) {
+                    return true;
+                }
+                return x.value() == node && x.array() != node;
+            } else if (usage instanceof ArrayLengthNode) {
+                ArrayLengthNode x = (ArrayLengthNode) usage;
+                assert x.array() == node;
+                return false;
+            } else if (usage instanceof VirtualObjectFieldNode) {
+                return false;
+            } else {
+                return super.escape(node, usage);
+            }
+        }
+
+        @Override
+        public EscapeField[] fields(Node node) {
+            NewArrayNode x = (NewArrayNode) node;
+            int length = x.dimension(0).asConstant().asInt();
+            EscapeField[] fields = new EscapeField[length];
+            for (int i = 0; i < length; i++) {
+                Integer representation = i;
+                fields[i] = new EscapeField("[" + i + "]", representation, ((NewArrayNode) node).elementKind());
+            }
+            return fields;
+        }
+
+        @Override
+        public void beforeUpdate(Node node, Node usage) {
+            if (usage instanceof ArrayLengthNode) {
+                ArrayLengthNode x = (ArrayLengthNode) usage;
+                x.replaceAndDelete(((NewArrayNode) node).dimension(0));
+            } else {
+                super.beforeUpdate(node, usage);
+            }
+        }
+
+        @Override
+        public int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) {
+            if (current instanceof AccessIndexedNode) {
+                AccessIndexedNode x = (AccessIndexedNode) current;
+                if (x.array() == node) {
+                    int index = ((AccessIndexedNode) current).index().asConstant().asInt();
+                    if (current instanceof LoadIndexedNode) {
+                        x.replaceAtUsages(fieldState[index]);
+                        assert x.usages().size() == 0;
+                        x.replaceAndDelete(x.next());
+                    } else if (current instanceof StoreIndexedNode) {
+                        fieldState[index] = ((StoreIndexedNode) x).value();
+                        assert x.usages().size() == 0;
+                        x.replaceAndDelete(x.next());
+                        return index;
+                    }
+                }
+            }
+            return -1;
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewInstanceNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,171 @@
+/*
+ * 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.nodes.java;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code NewInstance} instruction represents the allocation of an instance class object.
+ */
+public final class NewInstanceNode extends FixedWithNextNode {
+
+    final RiType instanceClass;
+    public final int cpi;
+    public final RiConstantPool constantPool;
+
+    /**
+     * Constructs a NewInstance instruction.
+     * @param type the class being allocated
+     * @param cpi the constant pool index
+     * @param graph
+     */
+    public NewInstanceNode(RiType type, int cpi, RiConstantPool constantPool, Graph graph) {
+        super(CiKind.Object, graph);
+        this.instanceClass = type;
+        this.cpi = cpi;
+        this.constantPool = constantPool;
+    }
+
+    /**
+     * Gets the instance class being allocated by this instruction.
+     * @return the instance class allocated
+     */
+    public RiType instanceClass() {
+        return instanceClass;
+    }
+
+    /**
+     * Gets the exact type produced by this instruction. For allocations of instance classes, this is
+     * always the class allocated.
+     * @return the exact type produced by this instruction
+     */
+    @Override
+    public RiType exactType() {
+        return instanceClass;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNewInstance(this);
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("instanceClass", instanceClass);
+        properties.put("cpi", cpi);
+        return properties;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == EscapeOp.class) {
+            return (T) ESCAPE;
+        }
+        return super.lookup(clazz);
+    }
+
+    private static final EscapeOp ESCAPE = new EscapeOp() {
+
+        @Override
+        public boolean canAnalyze(Node node) {
+            return ((NewInstanceNode) node).instanceClass().isResolved();
+        }
+
+        @Override
+        public boolean escape(Node node, Node usage) {
+            if (usage instanceof LoadFieldNode) {
+                LoadFieldNode x = (LoadFieldNode) usage;
+                assert x.object() == node;
+                return x.field().isResolved() == false;
+            } else if (usage instanceof StoreFieldNode) {
+                StoreFieldNode x = (StoreFieldNode) usage;
+                return x.value() == node && x.object() != node;
+            } else if (usage instanceof StoreIndexedNode) {
+                StoreIndexedNode x = (StoreIndexedNode) usage;
+                assert x.value() == node;
+                return true;
+            } else if (usage instanceof VirtualObjectFieldNode) {
+                return false;
+            } else if (usage instanceof RegisterFinalizerNode) {
+                RegisterFinalizerNode x = (RegisterFinalizerNode) usage;
+                assert x.object() == node;
+                return false;
+            } else {
+                return super.escape(node, usage);
+            }
+        }
+
+        @Override
+        public EscapeField[] fields(Node node) {
+            NewInstanceNode x = (NewInstanceNode) node;
+            RiField[] riFields = x.instanceClass().fields();
+            EscapeField[] fields = new EscapeField[riFields.length];
+            for (int i = 0; i < riFields.length; i++) {
+                RiField field = riFields[i];
+                fields[i] = new EscapeField(field.name(), field, field.kind().stackKind());
+            }
+            return fields;
+        }
+
+        @Override
+        public void beforeUpdate(Node node, Node usage) {
+            if (usage instanceof RegisterFinalizerNode) {
+                RegisterFinalizerNode x = (RegisterFinalizerNode) usage;
+                x.replaceAndDelete(x.next());
+            } else {
+                super.beforeUpdate(node, usage);
+            }
+        }
+
+        @Override
+        public int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, ValueNode[] fieldState) {
+            if (current instanceof AccessFieldNode) {
+                AccessFieldNode x = (AccessFieldNode) current;
+                if (x.object() == node) {
+                    int field = fieldIndex.get(((AccessFieldNode) current).field());
+                    if (current instanceof LoadFieldNode) {
+                        assert fieldState[field] != null : field + ", " + ((AccessFieldNode) current).field();
+                        x.replaceAtUsages(fieldState[field]);
+                        assert x.usages().size() == 0;
+                        x.replaceAndDelete(x.next());
+                    } else if (current instanceof StoreFieldNode) {
+                        fieldState[field] = ((StoreFieldNode) x).value();
+                        assert x.usages().size() == 0;
+                        x.replaceAndDelete(x.next());
+                        return field;
+                    }
+                }
+            }
+            return -1;
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewMultiArrayNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,107 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code NewMultiArray} instruction represents an allocation of a multi-dimensional object
+ * array.
+ */
+public final class NewMultiArrayNode extends NewArrayNode {
+
+    @Input private final NodeInputList<ValueNode> dimensions;
+
+    @Override
+    public ValueNode dimension(int index) {
+        return dimensions.get(index);
+    }
+
+    public void setDimension(int index, ValueNode x) {
+        dimensions.set(index, x);
+    }
+
+    /**
+     * The rank of the array allocated by this instruction, i.e. how many array dimensions.
+     */
+    @Override
+    public int dimensionCount() {
+        return dimensions.size();
+    }
+
+    public final RiType elementType;
+    public final int cpi;
+    public final RiConstantPool constantPool;
+
+    /**
+     * Constructs a new NewMultiArray instruction.
+     * @param elementType the element type of the array
+     * @param dimensions the instructions which produce the dimensions for this array
+     * @param cpi the constant pool index for resolution
+     * @param riConstantPool the constant pool for resolution
+     * @param graph
+     */
+    public NewMultiArrayNode(RiType elementType, ValueNode[] dimensions, int cpi, RiConstantPool riConstantPool, Graph graph) {
+        super(null, graph);
+        this.constantPool = riConstantPool;
+        this.elementType = elementType;
+        this.cpi = cpi;
+
+        this.dimensions = new NodeInputList<ValueNode>(this, dimensions.length);
+        for (int i = 0; i < dimensions.length; i++) {
+            setDimension(i, dimensions[i]);
+        }
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNewMultiArray(this);
+    }
+
+    /**
+     * Gets the element type of the array.
+     * @return the element type of the array
+     */
+    public RiType elementType() {
+        return elementType;
+    }
+
+    @Override
+    public CiKind elementKind() {
+        return elementType.kind();
+    }
+
+    @Override
+    public RiType exactType() {
+        return elementType.arrayOf();
+    }
+
+    @Override
+    public RiType declaredType() {
+        return exactType();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewObjectArrayNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,76 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code NewObjectArray} instruction represents an allocation of an object array.
+ */
+public final class NewObjectArrayNode extends NewArrayNode {
+
+    final RiType elementClass;
+
+    /**
+     * Constructs a new NewObjectArray instruction.
+     * @param elementClass the class of elements in this array
+     * @param length the instruction producing the length of the array
+     * @param graph
+     */
+    public NewObjectArrayNode(RiType elementClass, ValueNode length, Graph graph) {
+        super(length, graph);
+        this.elementClass = elementClass;
+    }
+
+    /**
+     * Gets the type of the elements of the array.
+     * @return the element type of the array
+     */
+    public RiType elementType() {
+        return elementClass;
+    }
+
+    @Override
+    public CiKind elementKind() {
+        return elementClass.kind();
+    }
+
+    @Override
+    public RiType exactType() {
+        return elementClass.arrayOf();
+    }
+
+    @Override
+    public RiType declaredType() {
+        return exactType();
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNewObjectArray(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/NewTypeArrayNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,62 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code NewTypeArray} class definition.
+ */
+public final class NewTypeArrayNode extends NewArrayNode {
+
+    final RiType elementType;
+
+    public NewTypeArrayNode(ValueNode length, RiType elementType, Graph graph) {
+        super(length, graph);
+        this.elementType = elementType;
+    }
+
+    @Override
+    public CiKind elementKind() {
+        return elementType.kind();
+    }
+
+    @Override
+    public RiType declaredType() {
+        return elementType.arrayOf();
+    }
+
+    @Override
+    public RiType exactType() {
+        return elementType.arrayOf();
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitNewTypeArray(this);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/RegisterFinalizerNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2011, 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.nodes.java;
+
+import com.oracle.max.graal.compiler.*;
+import com.oracle.max.graal.compiler.debug.*;
+import com.oracle.max.graal.compiler.graph.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * This instruction is used to perform the finalizer registration at the end of the java.lang.Object constructor.
+ */
+public final class RegisterFinalizerNode extends StateSplit implements Canonicalizable {
+
+    @Input private ValueNode object;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public RegisterFinalizerNode(ValueNode object, Graph graph) {
+        super(CiKind.Void, graph);
+        setObject(object);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitRegisterFinalizer(this);
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        RiType declaredType = object.declaredType();
+        RiType exactType = object.exactType();
+        if (exactType == null && declaredType != null) {
+            exactType = declaredType.exactType();
+        }
+
+        boolean needsCheck = true;
+        if (exactType != null) {
+            // we have an exact type
+            needsCheck = exactType.hasFinalizer();
+        } else {
+            // if either the declared type of receiver or the holder can be assumed to have no finalizers
+            if (declaredType != null && !declaredType.hasFinalizableSubclass()) {
+                if (((CompilerGraph) graph()).assumptions().recordNoFinalizableSubclassAssumption(declaredType)) {
+                    needsCheck = false;
+                }
+            }
+        }
+
+        if (needsCheck) {
+            if (GraalOptions.TraceCanonicalizer) {
+                TTY.println("Could not canonicalize finalizer " + object + " (declaredType=" + declaredType + ", exactType=" + exactType + ")");
+            }
+        } else {
+            if (GraalOptions.TraceCanonicalizer) {
+                TTY.println("Canonicalized finalizer for object " + object);
+            }
+            return next();
+        }
+
+        return this;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/StoreFieldNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,73 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code StoreField} instruction represents a write to a static or instance field.
+ */
+public final class StoreFieldNode extends AccessFieldNode {
+
+    @Input private ValueNode value;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    /**
+     * Creates a new LoadField instance.
+     * @param object the receiver object
+     * @param field the compiler interface field
+     * @param value the instruction representing the value to store to the field
+     * @param stateAfter the state after the field access
+     * @param graph
+     */
+    public StoreFieldNode(ValueNode object, RiField field, ValueNode value, Graph graph) {
+        super(CiKind.Void, object, field, graph);
+        setValue(value);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitStoreField(this);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(java.lang.Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) DELEGATE_TO_RUNTIME;
+        }
+        return super.lookup(clazz);
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/StoreIndexedNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,74 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * The {@code StoreIndexed} instruction represents a write to an array element.
+ */
+public final class StoreIndexedNode extends AccessIndexedNode {
+
+    @Input private ValueNode value;
+
+    public ValueNode value() {
+        return value;
+    }
+
+    public void setValue(ValueNode x) {
+        updateUsages(value, x);
+        value = x;
+    }
+
+    /**
+     * Creates a new StoreIndexed instruction.
+     * @param array the instruction producing the array
+     * @param index the instruction producing the index
+     * @param length the instruction producing the length
+     * @param elementKind the element type
+     * @param value the value to store into the array
+     * @param stateAfter the state after executing this instruction
+     * @param graph
+     */
+    public StoreIndexedNode(ValueNode array, ValueNode index, ValueNode length, CiKind elementKind, ValueNode value, Graph graph) {
+        super(CiKind.Void, array, index, length, elementKind, graph);
+        setValue(value);
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        v.visitStoreIndexed(this);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) DELEGATE_TO_RUNTIME;
+        }
+        return super.lookup(clazz);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/java/TypeCheckNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,75 @@
+/*
+ * 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.nodes.java;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+/**
+ * The {@code TypeCheck} instruction is the base class of casts and instanceof tests.
+ */
+public abstract class TypeCheckNode extends BooleanNode {
+    @Input private ValueNode object;
+    @Input private ValueNode targetClassInstruction;
+
+    public ValueNode object() {
+        return object;
+    }
+
+    public void setObject(ValueNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public ValueNode targetClassInstruction() {
+        return targetClassInstruction;
+    }
+
+    public void setTargetClassInstruction(ValueNode x) {
+        updateUsages(targetClassInstruction, x);
+        targetClassInstruction = x;
+    }
+
+    /**
+     * Gets the target class, i.e. the class being cast to, or the class being tested against.
+     * @return the target class
+     */
+    public RiType targetClass() {
+        return targetClassInstruction() instanceof ConstantNode ? (RiType) targetClassInstruction().asConstant().asObject() : null;
+    }
+
+    /**
+     * Creates a new TypeCheck instruction.
+     * @param targetClass the class which is being casted to or checked against
+     * @param object the instruction which produces the object
+     * @param kind the result type of this instruction
+     * @param graph
+     */
+    public TypeCheckNode(ValueNode targetClassInstruction, ValueNode object, CiKind kind, Graph graph) {
+        super(kind, graph);
+        setObject(object);
+        setTargetClassInstruction(targetClassInstruction);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/BasicInductionVariableNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,125 @@
+/*
+ * 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.nodes.loop;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+/**
+ * LinearInductionVariable that is computed in the loops thanks to Phi(init, this + stride).
+ * This will keep at least one register busy in the whole loop body
+ */
+public class BasicInductionVariableNode extends LinearInductionVariableNode implements Canonicalizable{
+    public static final BIVLoweringOp LOWERING = new BIVLoweringOp();
+    @Input private LoopCounterNode loopCounter;
+
+    public BasicInductionVariableNode(CiKind kind, ValueNode init, ValueNode stride, LoopCounterNode counter, Graph graph) {
+        super(kind, init, stride, graph);
+        setLoopCounter(counter);
+    }
+
+    public LoopCounterNode loopCounter() {
+        return loopCounter;
+    }
+
+    public void setLoopCounter(LoopCounterNode loopCounter) {
+        updateUsages(this.loopCounter, loopCounter);
+        this.loopCounter = loopCounter;
+    }
+
+    public ValueNode init() {
+        return a();
+    }
+
+    public void setInit(ValueNode init) {
+        setA(init);
+    }
+
+    public ValueNode stride() {
+        return b();
+    }
+
+    public void setStride(ValueNode stride) {
+        setB(stride);
+    }
+
+    @Override
+    public LoopBeginNode loopBegin() {
+        return loopCounter().loopBegin();
+    }
+
+    @Override
+    public void peelOneIteration() {
+        this.setInit(IntegerArithmeticNode.add(init(), stride()));
+    }
+
+    /**
+     * Will lessen the register pressure but augment the code complexity with a multiplication.
+     * @return the new DerivedInductionVariable
+     */
+    public DerivedInductionVariableNode toDerivedInductionVariable() {
+        DerivedInductionVariableNode newDIV = new DerivedInductionVariableNode(kind, init(), stride(), loopCounter(), graph());
+        this.replaceAndDelete(newDIV);
+        return newDIV;
+    }
+
+    @Override
+    public Node canonical(NotifyReProcess reProcess) {
+        if (this.init().isConstant() && this.init().asConstant().asLong() == 0
+                        && this.stride().isConstant() && this.stride().asConstant().asLong() == 1) {
+            return this.loopCounter();
+        }
+        return this;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) LOWERING;
+        }
+        return super.lookup(clazz);
+    }
+
+    public static class BIVLoweringOp implements LoweringOp {
+        @Override
+        public void lower(Node n, CiLoweringTool tool) {
+            BasicInductionVariableNode biv = (BasicInductionVariableNode) n;
+            PhiNode phi = this.ivToPhi(biv.loopBegin(), biv.init(), biv.stride(), biv.kind);
+            biv.replaceAtNonIVUsages(phi);
+        }
+
+        public PhiNode ivToPhi(LoopBeginNode loopBegin, ValueNode init, ValueNode stride, CiKind kind) {
+            PhiNode phi = new PhiNode(kind, loopBegin, PhiType.Value, loopBegin.graph());
+            IntegerArithmeticNode after = IntegerArithmeticNode.add(phi, stride);
+            phi.addInput(init);
+            phi.addInput(after);
+            return phi;
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/DerivedInductionVariableNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,125 @@
+/*
+ * 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.nodes.loop;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+/**
+ * LinearInductionVariable that is computed in the loops with offset + scale * base.
+ * This is computed in the loop only when necessary, puts less pressure on registers.
+ */
+public class DerivedInductionVariableNode extends LinearInductionVariableNode {
+    @Input private InductionVariableNode base;
+
+    public DerivedInductionVariableNode(CiKind kind, ValueNode offset, ValueNode scale, InductionVariableNode base, Graph graph) {
+        super(kind, offset, scale, graph);
+        setBase(base);
+    }
+
+    public InductionVariableNode base() {
+        return base;
+    }
+
+    public void setBase(InductionVariableNode base) {
+        updateUsages(this.base, base);
+        this.base = base;
+    }
+
+    public ValueNode offset() {
+        return a();
+    }
+
+    public void setOffset(ValueNode offset) {
+        setA(offset);
+    }
+
+    public ValueNode scale() {
+        return b();
+    }
+
+    public void setScale(ValueNode scale) {
+        setB(scale);
+    }
+
+    @Override
+    public LoopBeginNode loopBegin() {
+        return base().loopBegin();
+    }
+
+    @Override
+    public void peelOneIteration() {
+        // nop
+    }
+
+    /**
+     * This will apply strength reduction to this induction variable but will augment register pressure in the loop.
+     * @return the new BasicInductionVariable
+     */
+    public BasicInductionVariableNode toBasicInductionVariable() {
+        InductionVariableNode base = base();
+        if (base instanceof DerivedInductionVariableNode) {
+            base = ((DerivedInductionVariableNode) base).toBasicInductionVariable();
+        }
+        ValueNode init;
+        ValueNode stride;
+        LoopCounterNode counter;
+        if (base instanceof BasicInductionVariableNode) {
+            BasicInductionVariableNode basic = (BasicInductionVariableNode) base;
+            // let the canonicalizer do its job with this
+            init = IntegerArithmeticNode.add(offset(), IntegerArithmeticNode.mul(scale(), basic.init()));
+            stride = IntegerArithmeticNode.mul(scale(), basic.stride());
+            counter = basic.loopCounter();
+        } else {
+            assert base instanceof LoopCounterNode;
+            init = offset();
+            stride = scale();
+            counter = (LoopCounterNode) base;
+        }
+        BasicInductionVariableNode newBIV = new BasicInductionVariableNode(kind, init, stride, counter, graph());
+        this.replaceAndDelete(newBIV);
+        return newBIV;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) LOWERING;
+        }
+        return super.lookup(clazz);
+    }
+
+    private static final LoweringOp LOWERING = new LoweringOp() {
+        @Override
+        public void lower(Node n, CiLoweringTool tool) {
+            DerivedInductionVariableNode div = (DerivedInductionVariableNode) n;
+            IntegerArithmeticNode computed = IntegerArithmeticNode.add(div.offset(), IntegerArithmeticNode.mul(div.scale(), div.base()));
+            div.replaceAtNonIVUsages(computed);
+        }
+    };
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/InductionVariableNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,54 @@
+/*
+ * 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.nodes.loop;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+public abstract class InductionVariableNode extends FloatingNode {
+
+    public InductionVariableNode(CiKind kind, Graph graph) {
+        super(kind, graph);
+        assert kind.isInt() || kind.isLong();
+    }
+
+    public abstract LoopBeginNode loopBegin();
+
+    public abstract void peelOneIteration();
+
+    public void replaceAtNonIVUsages(Node other) {
+        for (Node usage : this.usages().snapshot()) {
+            if (!(usage instanceof InductionVariableNode)) {
+                usage.replaceFirstInput(this, other);
+            }
+        }
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        // nop
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/LinearInductionVariableNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,64 @@
+/*
+ * 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.nodes.loop;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * InductionVariable of the form a+b*x.
+ */
+public abstract class LinearInductionVariableNode extends InductionVariableNode {
+    @Input private ValueNode a;
+    @Input private ValueNode b;
+
+    public LinearInductionVariableNode(CiKind kind, ValueNode a, ValueNode b, Graph graph) {
+        super(kind, graph);
+        setA(a);
+        setB(b);
+    }
+
+    protected ValueNode a() {
+        return a;
+    }
+
+    protected ValueNode b() {
+        return b;
+    }
+
+    protected void setA(ValueNode a) {
+        updateUsages(this.a, a);
+        this.a = a;
+    }
+
+
+    protected void setB(ValueNode b) {
+        updateUsages(this.b, b);
+        this.b = b;
+    }
+
+    public boolean isLinearInductionVariableInput(Node n) {
+        return n == a() || n == b();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/loop/LoopCounterNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,89 @@
+/*
+ * 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.nodes.loop;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+/**
+ * Counts loop iterations from 0 to Niter.
+ * If used directly (and not just by BasicInductionVariables) computed with Phi(0, this + 1)
+ */
+public final class LoopCounterNode extends InductionVariableNode {
+    @Input private LoopBeginNode loopBegin;
+
+    @Override
+    public LoopBeginNode loopBegin() {
+        return loopBegin;
+    }
+
+    public void setLoopBegin(LoopBeginNode x) {
+        updateUsages(loopBegin, x);
+        loopBegin = x;
+    }
+
+    public LoopCounterNode(CiKind kind, LoopBeginNode loop, Graph graph) {
+        super(kind, graph);
+        setLoopBegin(loop);
+    }
+
+    @Override
+    public void peelOneIteration() {
+        BasicInductionVariableNode biv = null;
+        for (Node usage : usages()) {
+            if (!(usage instanceof InductionVariableNode && ((InductionVariableNode) usage).loopBegin() == this.loopBegin())) {
+                if (biv == null) {
+                    biv = createBasicInductionVariable();
+                    biv.peelOneIteration();
+                }
+                usage.inputs().replace(this, biv);
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == LoweringOp.class) {
+            return (T) LOWERING;
+        }
+        return super.lookup(clazz);
+    }
+
+    private BasicInductionVariableNode createBasicInductionVariable() {
+        Graph graph = graph();
+        return new BasicInductionVariableNode(kind, ConstantNode.forInt(0, graph), ConstantNode.forInt(1, graph), this, graph);
+    }
+
+    private static final LoweringOp LOWERING = new LoweringOp() {
+        @Override
+        public void lower(Node n, CiLoweringTool tool) {
+            LoopCounterNode loopCounter = (LoopCounterNode) n;
+            Graph graph = n.graph();
+            PhiNode phi = BasicInductionVariableNode.LOWERING.ivToPhi(loopCounter.loopBegin(), ConstantNode.forInt(0, graph), ConstantNode.forInt(1, graph), loopCounter.kind);
+            loopCounter.replaceAtNonIVUsages(phi);
+        }
+    };
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/EscapeOp.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/EscapeOp.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,8 +24,9 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.graph.*;
 
 
@@ -34,20 +35,20 @@
     public abstract boolean canAnalyze(Node node);
 
     public boolean escape(Node node, Node usage) {
-        if (usage instanceof IsNonNull) {
-            IsNonNull x = (IsNonNull) usage;
+        if (usage instanceof IsNonNullNode) {
+            IsNonNullNode x = (IsNonNullNode) usage;
             assert x.object() == node;
             return false;
-        } else if (usage instanceof IsType) {
-            IsType x = (IsType) usage;
+        } else if (usage instanceof IsTypeNode) {
+            IsTypeNode x = (IsTypeNode) usage;
             assert x.object() == node;
             return false;
         } else if (usage instanceof FrameState) {
             FrameState x = (FrameState) usage;
             assert x.inputContains(node);
             return true;
-        } else if (usage instanceof AccessMonitor) {
-            AccessMonitor x = (AccessMonitor) usage;
+        } else if (usage instanceof AccessMonitorNode) {
+            AccessMonitorNode x = (AccessMonitorNode) usage;
             assert x.object() == node;
             return false;
         } else {
@@ -58,17 +59,17 @@
     public abstract EscapeField[] fields(Node node);
 
     public void beforeUpdate(Node node, Node usage) {
-        if (usage instanceof IsNonNull) {
-            IsNonNull x = (IsNonNull) usage;
+        if (usage instanceof IsNonNullNode) {
+            IsNonNullNode x = (IsNonNullNode) usage;
             // TODO (ls) not sure about this...
-            x.replaceAndDelete(Constant.forBoolean(true, node.graph()));
-        } else if (usage instanceof IsType) {
-            IsType x = (IsType) usage;
+            x.replaceAndDelete(ConstantNode.forBoolean(true, node.graph()));
+        } else if (usage instanceof IsTypeNode) {
+            IsTypeNode x = (IsTypeNode) usage;
             assert x.type() == ((ValueNode) node).exactType();
             // TODO (ls) not sure about this...
-            x.replaceAndDelete(Constant.forBoolean(true, node.graph()));
-        } else if (usage instanceof AccessMonitor) {
-            AccessMonitor x = (AccessMonitor) usage;
+            x.replaceAndDelete(ConstantNode.forBoolean(true, node.graph()));
+        } else if (usage instanceof AccessMonitorNode) {
+            AccessMonitorNode x = (AccessMonitorNode) usage;
             x.replaceAndDelete(x.next());
         }
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/ExceptionExit.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,30 @@
+/*
+ * 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.nodes.spi;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+
+
+public interface ExceptionExit {
+    FixedNode exceptionEdge();
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/LIRGeneratorTool.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/LIRGeneratorTool.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,8 +22,8 @@
  */
 package com.oracle.max.graal.compiler.nodes.spi;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.sun.cri.ci.*;
 
 public abstract class LIRGeneratorTool extends ValueVisitor {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/ValueVisitor.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/spi/ValueVisitor.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,10 +22,10 @@
  */
 package com.oracle.max.graal.compiler.nodes.spi;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.cfg.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 
 /**
  * The {@link ValueVisitor} implements one half of the visitor
@@ -34,48 +34,48 @@
  */
 public abstract class ValueVisitor {
     // Checkstyle: stop
-    public abstract void visitArithmetic(Arithmetic i);
-    public abstract void visitArrayLength(ArrayLength i);
-    public abstract void visitMerge(Merge i);
-    public abstract void visitCheckCast(CheckCast i);
-    public abstract void visitNormalizeCompare(NormalizeCompare i);
-    public abstract void visitConstant(Constant i);
-    public abstract void visitConvert(Convert i);
-    public abstract void visitConditional(Conditional i);
-    public abstract void visitExceptionObject(ExceptionObject i);
+    public abstract void visitArithmetic(ArithmeticNode i);
+    public abstract void visitArrayLength(ArrayLengthNode i);
+    public abstract void visitMerge(MergeNode i);
+    public abstract void visitCheckCast(CheckCastNode i);
+    public abstract void visitNormalizeCompare(NormalizeCompareNode i);
+    public abstract void visitConstant(ConstantNode i);
+    public abstract void visitConvert(ConvertNode i);
+    public abstract void visitConditional(ConditionalNode i);
+    public abstract void visitExceptionObject(ExceptionObjectNode 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);
-    public abstract void visitInvoke(Invoke i);
-    public abstract void visitLoadField(LoadField i);
-    public abstract void visitLoadIndexed(LoadIndexed i);
-    public abstract void visitLocal(Local i);
-    public abstract void visitLogic(Logic i);
-    public abstract void visitLookupSwitch(LookupSwitch i);
+    public abstract void visitAnchor(AnchorNode i);
+    public abstract void visitIf(IfNode i);
+    public abstract void visitInvoke(InvokeNode i);
+    public abstract void visitLoadField(LoadFieldNode i);
+    public abstract void visitLoadIndexed(LoadIndexedNode i);
+    public abstract void visitLocal(LocalNode i);
+    public abstract void visitLogic(LogicNode i);
+    public abstract void visitLookupSwitch(LookupSwitchNode i);
     public abstract void visitMemoryRead(ReadNode i);
     public abstract void visitMemoryWrite(WriteNode i);
-    public abstract void visitMonitorAddress(MonitorAddress monitorAddress);
-    public abstract void visitMonitorEnter(MonitorEnter i);
-    public abstract void visitMonitorExit(MonitorExit i);
-    public abstract void visitNegate(Negate i);
-    public abstract void visitNewInstance(NewInstance i);
-    public abstract void visitNewMultiArray(NewMultiArray i);
-    public abstract void visitNewObjectArray(NewObjectArray i);
-    public abstract void visitNewTypeArray(NewTypeArray i);
-    public abstract void visitFixedGuard(FixedGuard fixedGuard);
-    public abstract void visitPhi(Phi i);
-    public abstract void visitRegisterFinalizer(RegisterFinalizer i);
-    public abstract void visitReturn(Return i);
+    public abstract void visitMonitorAddress(MonitorAddressNode monitorAddress);
+    public abstract void visitMonitorEnter(MonitorEnterNode i);
+    public abstract void visitMonitorExit(MonitorExitNode i);
+    public abstract void visitNegate(NegateNode i);
+    public abstract void visitNewInstance(NewInstanceNode i);
+    public abstract void visitNewMultiArray(NewMultiArrayNode i);
+    public abstract void visitNewObjectArray(NewObjectArrayNode i);
+    public abstract void visitNewTypeArray(NewTypeArrayNode i);
+    public abstract void visitFixedGuard(FixedGuardNode fixedGuard);
+    public abstract void visitPhi(PhiNode i);
+    public abstract void visitRegisterFinalizer(RegisterFinalizerNode i);
+    public abstract void visitReturn(ReturnNode i);
     public abstract void visitShift(ShiftNode i);
     public abstract void visitStoreField(StoreFieldNode i);
     public abstract void visitStoreIndexed(StoreIndexedNode i);
     public abstract void visitTableSwitch(TableSwitchNode i);
-    public abstract void visitDeoptimize(Deoptimize deoptimize);
+    public abstract void visitDeoptimize(DeoptimizeNode deoptimize);
     public abstract void visitUnwind(UnwindNode unwind);
-    public abstract void visitLoopBegin(LoopBegin loopBegin);
-    public abstract void visitLoopEnd(LoopEnd loopEnd);
+    public abstract void visitLoopBegin(LoopBeginNode loopBegin);
+    public abstract void visitLoopEnd(LoopEndNode loopEnd);
     public abstract void visitValueAnchor(ValueAnchorNode valueAnchor);
     public abstract void visitGuardNode(GuardNode guardNode);
-    public abstract void visitMathIntrinsic(MathIntrinsic node);
+    public abstract void visitMathIntrinsic(MathIntrinsicNode node);
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/virtual/VirtualObjectFieldNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,102 @@
+/*
+ * 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.nodes.virtual;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+
+
+public class VirtualObjectFieldNode extends FloatingNode {
+
+    @Input private VirtualObjectNode object;
+    @Input private FloatingNode lastState;
+    @Input private ValueNode input;
+
+    public VirtualObjectNode object() {
+        return object;
+    }
+
+    public void setObject(VirtualObjectNode x) {
+        updateUsages(object, x);
+        object = x;
+    }
+
+    public FloatingNode lastState() {
+        return lastState;
+    }
+
+    public void setLastState(FloatingNode x) {
+        updateUsages(lastState, x);
+        lastState = x;
+    }
+
+    public ValueNode input() {
+        return input;
+    }
+
+    public void setInput(ValueNode x) {
+        updateUsages(input, x);
+        input = x;
+    }
+
+    private int index;
+
+    /**
+     * Constructs a new ArrayLength instruction.
+     * @param array the instruction producing the array
+     * @param newFrameState the state after executing this instruction
+     */
+    public VirtualObjectFieldNode(VirtualObjectNode object, FloatingNode lastState, ValueNode input, int index, Graph graph) {
+        super(CiKind.Int, graph);
+        this.index = index;
+        setObject(object);
+        setLastState(lastState);
+        setInput(input);
+    }
+
+    public int index() {
+        return index;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        // nothing to do...
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("index", index);
+        return properties;
+    }
+
+    @Override
+    public String shortName() {
+        return "VirtualObjectField " + object().fields()[index].name();
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/nodes/virtual/VirtualObjectNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,71 @@
+/*
+ * 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.nodes.virtual;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.graph.*;
+import com.sun.cri.ci.*;
+import com.sun.cri.ri.*;
+
+
+public class VirtualObjectNode extends FloatingNode {
+
+
+
+    private EscapeField[] fields;
+    private RiType type;
+
+    public VirtualObjectNode(RiType type, EscapeField[] fields, Graph graph) {
+        super(CiKind.Int, graph);
+        this.type = type;
+        this.fields = fields;
+    }
+
+    public RiType type() {
+        return type;
+    }
+
+    public EscapeField[] fields() {
+        return fields;
+    }
+
+    @Override
+    public void accept(ValueVisitor v) {
+        // nothing to do...
+    }
+
+    @Override
+    public Map<Object, Object> getDebugProperties() {
+        Map<Object, Object> properties = super.getDebugProperties();
+        properties.put("type", type);
+        return properties;
+    }
+
+    @Override
+    public String shortName() {
+        return "VirtualObject " + type.name();
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/package-info.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/package-info.java	Wed Aug 10 00:34:29 2011 +0200
@@ -75,7 +75,7 @@
  *
  * <li>
  * Add a field to optionally store an {@link com.oracle.max.graal.compiler.ir.Info} object for each HIR node, and remove the
- * {@link com.oracle.max.graal.compiler.ir.FixedNodeWithNext#exceptionHandlers} field, the {@link com.oracle.max.graal.compiler.ir.FixedNodeWithNext#bci} field, and any fields to store the Java
+ * {@link com.oracle.max.graal.compiler.nodes.base.FixedWithNextNode#exceptionHandlers} field, the {@link com.oracle.max.graal.compiler.nodes.base.FixedWithNextNode#bci} field, and any fields to store the Java
  * frame state in subclasses. Benefit: saves space if most HIR nodes do not have exception handlers, a bci or Java frame
  * state. Removes virtual dispatch on accessing debug information for nodes. Allows any node, regardless of its type, to
  * have info attached.</li>
@@ -113,7 +113,7 @@
  * <li>
  * Tiered compilation support. C1 supported the ability to add instrumentation to branches, invocations, and checkcasts
  * in order to feed profile information to the C2 compiler in a tiered compilation setup. It relied on adding some
- * information to the HIR nodes that represent these operations ({@link Invoke}, {@link CheckCast}, etc). All of this
+ * information to the HIR nodes that represent these operations ({@link InvokeNode}, {@link CheckCastNode}, etc). All of this
  * logic was removed to simplify both the front end and back end in anticipation of designing a future instrumentation
  * API. XIR should be general enough to allow instrumentation code to be added to invocation and checkcast sites, but
  * currently has no support for adding code at branches.
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ComputeProbabilityPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -27,7 +27,7 @@
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.graph.*;
 
@@ -85,14 +85,14 @@
     }
 
     public static class LoopInfo {
-        public final LoopBegin loopBegin;
+        public final LoopBeginNode loopBegin;
 
         public final Set<LoopInfo> requires = new HashSet<LoopInfo>(4);
 
         private double loopFrequency = -1;
         public boolean ended = false;
 
-        public LoopInfo(LoopBegin loopBegin) {
+        public LoopInfo(LoopBeginNode loopBegin) {
             this.loopBegin = loopBegin;
         }
 
@@ -121,7 +121,7 @@
     }
 
     public Set<LoopInfo> loopInfos = new HashSet<LoopInfo>();
-    public Map<Merge, Set<LoopInfo>> mergeLoops = new HashMap<Merge, Set<LoopInfo>>();
+    public Map<MergeNode, Set<LoopInfo>> mergeLoops = new HashMap<MergeNode, Set<LoopInfo>>();
 
     private class Probability implements MergeableState<Probability> {
         public double probability;
@@ -142,7 +142,7 @@
         }
 
         @Override
-        public boolean merge(Merge merge, Collection<Probability> withStates) {
+        public boolean merge(MergeNode merge, Collection<Probability> withStates) {
             if (merge.endCount() > 1) {
                 HashSet<LoopInfo> intersection = new HashSet<LoopInfo>(loops);
                 for (Probability other : withStates) {
@@ -183,14 +183,14 @@
         }
 
         @Override
-        public void loopBegin(LoopBegin loopBegin) {
+        public void loopBegin(LoopBeginNode loopBegin) {
             loopInfo = new LoopInfo(loopBegin);
             loopInfos.add(loopInfo);
             loops.add(loopInfo);
         }
 
         @Override
-        public void loopEnd(LoopEnd loopEnd, Probability loopEndState) {
+        public void loopEnd(LoopEndNode loopEnd, Probability loopEndState) {
             assert loopInfo != null;
             for (LoopInfo innerLoop : loopEndState.loops) {
                 if (innerLoop != loopInfo && !loops.contains(innerLoop)) {
@@ -204,14 +204,14 @@
         public void afterSplit(FixedNode node) {
             assert node.predecessor() != null;
             Node pred = node.predecessor();
-            if (pred instanceof Invoke) {
-                Invoke x = (Invoke) pred;
+            if (pred instanceof InvokeNode) {
+                InvokeNode x = (InvokeNode) pred;
                 if (x.next() != node) {
                     probability = 0;
                 }
             } else {
-                assert pred instanceof ControlSplit;
-                ControlSplit x = (ControlSplit) pred;
+                assert pred instanceof ControlSplitNode;
+                ControlSplitNode x = (ControlSplitNode) pred;
                 double sum = 0;
                 for (int i = 0; i < x.blockSuccessorCount(); i++) {
                     if (x.blockSuccessor(i) == node) {
@@ -249,7 +249,7 @@
         }
 
         @Override
-        public boolean merge(Merge merge, Collection<LoopCount> withStates) {
+        public boolean merge(MergeNode merge, Collection<LoopCount> withStates) {
             assert merge.endCount() == withStates.size() + 1;
             if (merge.endCount() > 1) {
                 Set<LoopInfo> loops = mergeLoops.get(merge);
@@ -265,12 +265,12 @@
         }
 
         @Override
-        public void loopBegin(LoopBegin loopBegin) {
+        public void loopBegin(LoopBeginNode loopBegin) {
             count *= loopBegin.loopFrequency();
         }
 
         @Override
-        public void loopEnd(LoopEnd loopEnd, LoopCount loopEndState) {
+        public void loopEnd(LoopEndNode loopEnd, LoopCount loopEndState) {
             // nothing to do...
         }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -25,7 +25,8 @@
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.collections.*;
 
@@ -47,8 +48,8 @@
         deleteNodes();
 
         // remove chained Merges
-        for (Merge merge : graph.getNodes(Merge.class)) {
-            if (merge.endCount() == 1 && !(merge instanceof LoopBegin)) {
+        for (MergeNode merge : graph.getNodes(MergeNode.class)) {
+            if (merge.endCount() == 1 && !(merge instanceof LoopBeginNode)) {
                 replacePhis(merge);
                 EndNode endNode = merge.endAt(0);
                 FixedNode next = merge.next();
@@ -84,18 +85,18 @@
             if (!flood.isMarked(node)) {
                 if (node instanceof EndNode) {
                     EndNode end = (EndNode) node;
-                    Merge merge = end.merge();
+                    MergeNode merge = end.merge();
                     if (merge != null && flood.isMarked(merge)) {
                         // We are a dead end node leading to a live merge.
                         merge.removeEnd(end);
                     }
-                } else if (node instanceof LoopEnd) {
-                    LoopBegin loop = ((LoopEnd) node).loopBegin();
+                } else if (node instanceof LoopEndNode) {
+                    LoopBeginNode loop = ((LoopEndNode) node).loopBegin();
                     if (flood.isMarked(loop)) {
                         if (GraalOptions.TraceDeadCodeElimination) {
                             TTY.println("Removing loop with unreachable end: " + loop);
                         }
-                        ((LoopEnd) node).setLoopBegin(null);
+                        ((LoopEndNode) node).setLoopBegin(null);
                         EndNode endNode = loop.endAt(0);
                         assert endNode.predecessor() != null;
                         replacePhis(loop);
@@ -111,10 +112,10 @@
         }
     }
 
-    private void replacePhis(Merge merge) {
+    private void replacePhis(MergeNode merge) {
         for (Node usage : merge.usages().snapshot()) {
-            assert usage instanceof Phi;
-            usage.replaceAndDelete(((Phi) usage).valueAt(0));
+            assert usage instanceof PhiNode;
+            usage.replaceAndDelete(((PhiNode) usage).valueAt(0));
         }
     }
 
@@ -133,7 +134,7 @@
 
     private void iterateInputs() {
         for (Node node : graph.getNodes()) {
-            if (node instanceof Local) {
+            if (node instanceof LocalNode) {
                 flood.add(node);
             }
             if (flood.isMarked(node)) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,11 +28,11 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.graph.*;
@@ -51,7 +51,7 @@
             this.virtualObject = virtualObject;
             this.virtualObjectField = null;
             for (int i = 0; i < fields.length; i++) {
-                fieldState[i] = Constant.defaultForKind(fields[i].kind(), virtualObject.graph());
+                fieldState[i] = ConstantNode.defaultForKind(fields[i].kind(), virtualObject.graph());
                 virtualObjectField = new VirtualObjectFieldNode(virtualObject, virtualObjectField, fieldState[i], i, virtualObject.graph());
             }
         }
@@ -72,18 +72,18 @@
         }
 
         @Override
-        public boolean merge(Merge merge, Collection<BlockExitState> withStates) {
-            Phi vobjPhi = null;
-            Phi[] valuePhis = new Phi[fieldState.length];
+        public boolean merge(MergeNode merge, Collection<BlockExitState> withStates) {
+            PhiNode vobjPhi = null;
+            PhiNode[] valuePhis = new PhiNode[fieldState.length];
             for (BlockExitState other : withStates) {
                 if (virtualObjectField != other.virtualObjectField && vobjPhi == null) {
-                    vobjPhi = new Phi(CiKind.Illegal, merge, PhiType.Virtual, virtualObject.graph());
+                    vobjPhi = new PhiNode(CiKind.Illegal, merge, PhiType.Virtual, virtualObject.graph());
                     vobjPhi.addInput(virtualObjectField);
                     virtualObjectField = vobjPhi;
                 }
                 for (int i2 = 0; i2 < fieldState.length; i2++) {
                     if (fieldState[i2] != other.fieldState[i2] && valuePhis[i2] == null) {
-                        valuePhis[i2] = new Phi(fieldState[i2].kind, merge, PhiType.Value, virtualObject.graph());
+                        valuePhis[i2] = new PhiNode(fieldState[i2].kind, merge, PhiType.Value, virtualObject.graph());
                         valuePhis[i2].addInput(fieldState[i2]);
                         fieldState[i2] = valuePhis[i2];
                     }
@@ -110,13 +110,13 @@
         }
 
         @Override
-        public void loopBegin(LoopBegin loopBegin) {
-            Phi vobjPhi = null;
-            vobjPhi = new Phi(CiKind.Illegal, loopBegin, PhiType.Virtual, virtualObject.graph());
+        public void loopBegin(LoopBeginNode loopBegin) {
+            PhiNode vobjPhi = null;
+            vobjPhi = new PhiNode(CiKind.Illegal, loopBegin, PhiType.Virtual, virtualObject.graph());
             vobjPhi.addInput(virtualObjectField);
             virtualObjectField = vobjPhi;
             for (int i2 = 0; i2 < fieldState.length; i2++) {
-                Phi valuePhi = new Phi(fieldState[i2].kind, loopBegin, PhiType.Value, virtualObject.graph());
+                PhiNode valuePhi = new PhiNode(fieldState[i2].kind, loopBegin, PhiType.Value, virtualObject.graph());
                 valuePhi.addInput(fieldState[i2]);
                 fieldState[i2] = valuePhi;
                 updateField(i2);
@@ -124,15 +124,15 @@
         }
 
         @Override
-        public void loopEnd(LoopEnd x, BlockExitState loopEndState) {
-            while (!(virtualObjectField instanceof Phi)) {
+        public void loopEnd(LoopEndNode x, BlockExitState loopEndState) {
+            while (!(virtualObjectField instanceof PhiNode)) {
                 virtualObjectField = ((VirtualObjectFieldNode) virtualObjectField).lastState();
             }
-            ((Phi) virtualObjectField).addInput(loopEndState.virtualObjectField);
-            assert ((Phi) virtualObjectField).valueCount() == 2;
+            ((PhiNode) virtualObjectField).addInput(loopEndState.virtualObjectField);
+            assert ((PhiNode) virtualObjectField).valueCount() == 2;
             for (int i2 = 0; i2 < fieldState.length; i2++) {
-                ((Phi) fieldState[i2]).addInput(loopEndState.fieldState[i2]);
-                assert ((Phi) fieldState[i2]).valueCount() == 2;
+                ((PhiNode) fieldState[i2]).addInput(loopEndState.fieldState[i2]);
+                assert ((PhiNode) fieldState[i2]).valueCount() == 2;
             }
         }
 
@@ -166,7 +166,7 @@
         }
 
         public void removeAllocation() {
-            assert node instanceof FixedNodeWithNext;
+            assert node instanceof FixedWithNextNode;
 
             escapeFields = op.fields(node);
             for (int i = 0; i < escapeFields.length; i++) {
@@ -177,7 +177,7 @@
                 TTY.println("new virtual object: " + virtual);
             }
             node.replaceAtUsages(virtual);
-            final FixedNode next = ((FixedNodeWithNext) node).next();
+            final FixedNode next = ((FixedWithNextNode) node).next();
             node.replaceAndDelete(next);
 
             final BlockExitState startState = new BlockExitState(escapeFields, virtual);
@@ -219,7 +219,7 @@
             EscapeOp op = node.lookup(EscapeOp.class);
             if (op != null && op.canAnalyze(node)) {
                 Set<Node> exits = new HashSet<Node>();
-                Set<Invoke> invokes = new HashSet<Invoke>();
+                Set<InvokeNode> invokes = new HashSet<InvokeNode>();
                 int iterations = 0;
 
                 int minimumWeight = GraalOptions.ForcedInlineEscapeWeight;
@@ -283,15 +283,15 @@
         }
     }
 
-    private double analyze(EscapeOp op, Node node, Collection<Node> exits, Collection<Invoke> invokes) {
+    private double analyze(EscapeOp op, Node node, Collection<Node> exits, Collection<InvokeNode> invokes) {
         double weight = 0;
         for (Node usage : node.usages()) {
             boolean escapes = op.escape(node, usage);
             if (escapes) {
                 if (usage instanceof FrameState) {
                     // nothing to do...
-                } else if (usage instanceof Invoke) {
-                    invokes.add((Invoke) usage);
+                } else if (usage instanceof InvokeNode) {
+                    invokes.add((InvokeNode) usage);
                 } else {
                     exits.add(usage);
                     if (!GraalOptions.TraceEscapeAnalysis) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -35,11 +35,11 @@
 import com.oracle.max.graal.compiler.graph.BlockMap.BranchOverride;
 import com.oracle.max.graal.compiler.graph.BlockMap.DeoptBlock;
 import com.oracle.max.graal.compiler.graph.BlockMap.ExceptionBlock;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.cfg.*;
+import com.oracle.max.graal.compiler.nodes.base.DeoptimizeNode.DeoptAction;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.compiler.util.LoopUtil.Loop;
@@ -105,7 +105,7 @@
         }
     });
 
-    private FixedNodeWithNext lastInstr;                 // the last instruction added
+    private FixedWithNextNode lastInstr;                 // the last instruction added
 
     private final Set<Block> blocksOnWorklist = new HashSet<Block>();
     private final Set<Block> blocksVisited = new HashSet<Block>();
@@ -175,20 +175,20 @@
         }
 
         // 1. create the start block
-        Block startBlock = nextBlock(FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI);
+        Block startBlock = nextBlock(FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI);
         markOnWorkList(startBlock);
-        lastInstr = (FixedNodeWithNext) createTarget(startBlock, frameState);
+        lastInstr = (FixedWithNextNode) createTarget(startBlock, frameState);
         graph.start().setNext(lastInstr);
 
         if (isSynchronized(method.accessFlags())) {
             // 4A.1 add a monitor enter to the start block
             methodSynchronizedObject = synchronizedObject(frameState, method);
-            genMonitorEnter(methodSynchronizedObject, FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI);
+            genMonitorEnter(methodSynchronizedObject, FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI);
         }
 
         // 4B.1 simply finish the start block
         finishStartBlock(startBlock);
-        unwindHandler = new CiExceptionHandler(0, method.code().length, FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI, 0, null);
+        unwindHandler = new CiExceptionHandler(0, method.code().length, FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI, 0, null);
 
         // 5. SKIPPED: look for intrinsics
 
@@ -204,8 +204,8 @@
 
         // remove Placeholders
         for (Node n : graph.getNodes()) {
-            if (n instanceof Placeholder && !loopExits.isMarked(n)) {
-                Placeholder p = (Placeholder) n;
+            if (n instanceof PlaceholderNode && !loopExits.isMarked(n)) {
+                PlaceholderNode p = (PlaceholderNode) n;
                 p.replaceAndDelete(p.next());
             }
         }
@@ -314,13 +314,13 @@
             assert existingState.localsSize() == newState.localsSize();
             assert existingState.stackSize() == newState.stackSize();
 
-            if (first instanceof Placeholder) {
-                Placeholder p = (Placeholder) first;
+            if (first instanceof PlaceholderNode) {
+                PlaceholderNode p = (PlaceholderNode) first;
                 if (p.predecessor() == null) {
                     p.setStateAfter(newState.duplicate(bci));
                     return;
                 } else {
-                    Merge merge = new Merge(graph);
+                    MergeNode merge = new MergeNode(graph);
                     FixedNode next = p.next();
                     EndNode end = new EndNode(graph);
                     p.setNext(end);
@@ -328,18 +328,18 @@
                     merge.addEnd(end);
                     merge.setStateAfter(existingState);
                     p.setStateAfter(existingState.duplicate(bci));
-                    if (!(next instanceof LoopEnd)) {
+                    if (!(next instanceof LoopEndNode)) {
                         target.firstInstruction = merge;
                     }
                     first = merge;
                 }
             }
 
-            existingState.merge((Merge) first, newState);
+            existingState.merge((MergeNode) first, newState);
         }
     }
 
-    private void insertLoopPhis(LoopBegin loopBegin, FrameState newState) {
+    private void insertLoopPhis(LoopBeginNode loopBegin, FrameState newState) {
         int stackSize = newState.stackSize();
         for (int i = 0; i < stackSize; i++) {
             // always insert phis for the stack
@@ -382,7 +382,7 @@
     }
 
     private FixedNode handleException(ValueNode exceptionObject, int bci) {
-        assert bci == FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci";
+        assert bci == FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI || bci == bci() : "invalid bci";
 
         if (GraalOptions.UseExceptionProbability && method.invocationCount() > GraalOptions.MatureInvocationCount) {
             if (exceptionObject == null && method.exceptionProbability(bci) == 0) {
@@ -423,19 +423,19 @@
             if (dispatchBlock == null) {
                 assert isCatchAll(firstHandler);
                 int handlerBCI = firstHandler.handlerBCI();
-                if (handlerBCI == FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI) {
+                if (handlerBCI == FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI) {
                     dispatchBlock = unwindBlock(bci);
                 } else {
                     dispatchBlock = blockFromBci[handlerBCI];
                 }
             }
-            Placeholder p = new Placeholder(graph);
+            PlaceholderNode p = new PlaceholderNode(graph);
             p.setStateAfter(frameState.duplicateWithoutStack(bci));
 
             ValueNode currentExceptionObject;
-            ExceptionObject newObj = null;
+            ExceptionObjectNode newObj = null;
             if (exceptionObject == null) {
-                newObj = new ExceptionObject(graph);
+                newObj = new ExceptionObjectNode(graph);
                 currentExceptionObject = newObj;
             } else {
                 currentExceptionObject = exceptionObject;
@@ -446,7 +446,7 @@
             }
             FixedNode target = createTarget(dispatchBlock, stateWithException);
             if (exceptionObject == null) {
-                ExceptionObject eObj = (ExceptionObject) currentExceptionObject;
+                ExceptionObjectNode eObj = (ExceptionObjectNode) currentExceptionObject;
                 eObj.setNext(target);
                 p.setNext(eObj);
             } else {
@@ -465,10 +465,10 @@
             RiType riType = (RiType) con;
             if (!riType.isResolved()) {
                 storeResultGraph = false;
-                append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
-                frameState.push(CiKind.Object, append(Constant.forObject(null, graph)));
+                append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
+                frameState.push(CiKind.Object, append(ConstantNode.forObject(null, graph)));
             } else {
-                frameState.push(CiKind.Object, append(new Constant(riType.getEncoding(Representation.JavaClass), graph)));
+                frameState.push(CiKind.Object, append(new ConstantNode(riType.getEncoding(Representation.JavaClass), graph)));
             }
         } else if (con instanceof CiConstant) {
             CiConstant constant = (CiConstant) con;
@@ -481,8 +481,8 @@
     private void genLoadIndexed(CiKind kind) {
         ValueNode index = frameState.ipop();
         ValueNode array = frameState.apop();
-        ValueNode length = append(new ArrayLength(array, graph));
-        ValueNode v = append(new LoadIndexed(array, index, length, kind, graph));
+        ValueNode length = append(new ArrayLengthNode(array, graph));
+        ValueNode v = append(new LoadIndexedNode(array, index, length, kind, graph));
         frameState.push(kind.stackKind(), v);
     }
 
@@ -490,7 +490,7 @@
         ValueNode value = frameState.pop(kind.stackKind());
         ValueNode index = frameState.ipop();
         ValueNode array = frameState.apop();
-        ValueNode length = append(new ArrayLength(array, graph));
+        ValueNode length = append(new ArrayLengthNode(array, graph));
         StoreIndexedNode result = new StoreIndexedNode(array, index, length, kind, value, graph);
         append(result);
     }
@@ -584,28 +584,28 @@
         ValueNode y = frameState.pop(result);
         ValueNode x = frameState.pop(result);
         boolean isStrictFP = isStrict(method.accessFlags());
-        Arithmetic v;
+        ArithmeticNode v;
         switch(opcode){
             case IADD:
-            case LADD: v = new IntegerAdd(result, x, y, graph); break;
+            case LADD: v = new IntegerAddNode(result, x, y, graph); break;
             case FADD:
-            case DADD: v = new FloatAdd(result, x, y, isStrictFP, graph); break;
+            case DADD: v = new FloatAddNode(result, x, y, isStrictFP, graph); break;
             case ISUB:
-            case LSUB: v = new IntegerSub(result, x, y, graph); break;
+            case LSUB: v = new IntegerSubNode(result, x, y, graph); break;
             case FSUB:
-            case DSUB: v = new FloatSub(result, x, y, isStrictFP, graph); break;
+            case DSUB: v = new FloatSubNode(result, x, y, isStrictFP, graph); break;
             case IMUL:
-            case LMUL: v = new IntegerMul(result, x, y, graph); break;
+            case LMUL: v = new IntegerMulNode(result, x, y, graph); break;
             case FMUL:
-            case DMUL: v = new FloatMul(result, x, y, isStrictFP, graph); break;
+            case DMUL: v = new FloatMulNode(result, x, y, isStrictFP, graph); break;
             case IDIV:
-            case LDIV: v = new IntegerDiv(result, x, y, graph); break;
+            case LDIV: v = new IntegerDivNode(result, x, y, graph); break;
             case FDIV:
-            case DDIV: v = new FloatDiv(result, x, y, isStrictFP, graph); break;
+            case DDIV: v = new FloatDivNode(result, x, y, isStrictFP, graph); break;
             case IREM:
-            case LREM: v = new IntegerRem(result, x, y, graph); break;
+            case LREM: v = new IntegerRemNode(result, x, y, graph); break;
             case FREM:
-            case DREM: v = new FloatRem(result, x, y, isStrictFP, graph); break;
+            case DREM: v = new FloatRemNode(result, x, y, isStrictFP, graph); break;
             default:
                 throw new CiBailout("should not reach");
         }
@@ -617,7 +617,7 @@
     }
 
     private void genNegateOp(CiKind kind) {
-        frameState.push(kind, append(new Negate(frameState.pop(kind), graph)));
+        frameState.push(kind, append(new NegateNode(frameState.pop(kind), graph)));
     }
 
     private void genShiftOp(CiKind kind, int opcode) {
@@ -626,9 +626,9 @@
         ShiftNode v;
         switch(opcode){
             case ISHL:
-            case LSHL: v = new LeftShift(kind, x, s, graph); break;
+            case LSHL: v = new LeftShiftNode(kind, x, s, graph); break;
             case ISHR:
-            case LSHR: v = new RightShift(kind, x, s, graph); break;
+            case LSHR: v = new RightShiftNode(kind, x, s, graph); break;
             case IUSHR:
             case LUSHR: v = new UnsignedRightShiftNode(kind, x, s, graph); break;
             default:
@@ -640,12 +640,12 @@
     private void genLogicOp(CiKind kind, int opcode) {
         ValueNode y = frameState.pop(kind);
         ValueNode x = frameState.pop(kind);
-        Logic v;
+        LogicNode v;
         switch(opcode){
             case IAND:
-            case LAND: v = new And(kind, x, y, graph); break;
+            case LAND: v = new AndNode(kind, x, y, graph); break;
             case IOR:
-            case LOR: v = new Or(kind, x, y, graph); break;
+            case LOR: v = new OrNode(kind, x, y, graph); break;
             case IXOR:
             case LXOR: v = new XorNode(kind, x, y, graph); break;
             default:
@@ -657,7 +657,7 @@
     private void genCompareOp(CiKind kind, int opcode, CiKind resultKind) {
         ValueNode y = frameState.pop(kind);
         ValueNode x = frameState.pop(kind);
-        ValueNode value = append(new NormalizeCompare(opcode, resultKind, x, y, graph));
+        ValueNode value = append(new NormalizeCompareNode(opcode, resultKind, x, y, graph));
         if (!resultKind.isVoid()) {
             frameState.ipush(value);
         }
@@ -665,15 +665,15 @@
 
     private void genConvert(int opcode, CiKind from, CiKind to) {
         CiKind tt = to.stackKind();
-        frameState.push(tt, append(new Convert(opcode, frameState.pop(from.stackKind()), tt, graph)));
+        frameState.push(tt, append(new ConvertNode(opcode, frameState.pop(from.stackKind()), tt, graph)));
     }
 
     private void genIncrement() {
         int index = stream().readLocalIndex();
         int delta = stream().readIncrement();
         ValueNode x = frameState.localAt(index);
-        ValueNode y = append(Constant.forInt(delta, graph));
-        frameState.storeLocal(index, append(new IntegerAdd(CiKind.Int, x, y, graph)));
+        ValueNode y = append(ConstantNode.forInt(delta, graph));
+        frameState.storeLocal(index, append(new IntegerAddNode(CiKind.Int, x, y, graph)));
     }
 
     private void genGoto(int fromBCI, int toBCI) {
@@ -690,7 +690,7 @@
             probability = 0.5;
         }
 
-        If ifNode = new If(new Compare(x, cond, y, graph), probability, graph);
+        IfNode ifNode = new IfNode(new CompareNode(x, cond, y, graph), probability, graph);
         append(ifNode);
         BlockMap.BranchOverride override = branchOverride.get(bci());
         FixedNode tsucc;
@@ -730,7 +730,7 @@
 
     private void genThrow(int bci) {
         ValueNode exception = frameState.apop();
-        FixedGuard node = new FixedGuard(new IsNonNull(exception, graph), graph);
+        FixedGuardNode node = new FixedGuardNode(new IsNonNullNode(exception, graph), graph);
         append(node);
 
         FixedNode entry = handleException(exception, bci);
@@ -744,7 +744,7 @@
     private void genCheckCast() {
         int cpi = stream().readCPI();
         RiType type = constantPool.lookupType(cpi, CHECKCAST);
-        Constant typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, type.isResolved());
+        ConstantNode typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, type.isResolved());
         ValueNode object = frameState.apop();
         if (typeInstruction != null) {
 //            InstanceOf instanceOf = new InstanceOf(typeInstruction, object, true, graph);
@@ -753,7 +753,7 @@
 //            CastNode castNode = new CastNode(object.kind, object, graph);
 //            castNode.inputs().add(fixedGuard);
 //            frameState.apush(castNode);
-            frameState.apush(new CheckCast(typeInstruction, object, graph));
+            frameState.apush(new CheckCastNode(typeInstruction, object, graph));
         } else {
             frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
         }
@@ -762,10 +762,10 @@
     private void genInstanceOf() {
         int cpi = stream().readCPI();
         RiType type = constantPool.lookupType(cpi, INSTANCEOF);
-        Constant typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, type.isResolved());
+        ConstantNode typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, type, type.isResolved());
         ValueNode object = frameState.apop();
         if (typeInstruction != null) {
-            frameState.ipush(append(new MaterializeNode(new InstanceOf(typeInstruction, object, false, graph), graph)));
+            frameState.ipush(append(new MaterializeNode(new InstanceOfNode(typeInstruction, object, false, graph), graph)));
         } else {
             frameState.ipush(appendConstant(CiConstant.INT_0));
         }
@@ -774,11 +774,11 @@
     void genNewInstance(int cpi) {
         RiType type = constantPool.lookupType(cpi, NEW);
         if (type.isResolved()) {
-            NewInstance n = new NewInstance(type, cpi, constantPool, graph);
+            NewInstanceNode n = new NewInstanceNode(type, cpi, constantPool, graph);
             frameState.apush(append(n));
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
             frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
         }
     }
@@ -786,7 +786,7 @@
     private void genNewTypeArray(int typeCode) {
         CiKind kind = CiKind.fromArrayTypeCode(typeCode);
         RiType elementType = runtime.asRiType(kind);
-        NewTypeArray nta = new NewTypeArray(frameState.ipop(), elementType, graph);
+        NewTypeArrayNode nta = new NewTypeArrayNode(frameState.ipop(), elementType, graph);
         frameState.apush(append(nta));
     }
 
@@ -794,11 +794,11 @@
         RiType type = constantPool.lookupType(cpi, ANEWARRAY);
         ValueNode length = frameState.ipop();
         if (type.isResolved()) {
-            NewArray n = new NewObjectArray(type, length, graph);
+            NewArrayNode n = new NewObjectArrayNode(type, length, graph);
             frameState.apush(append(n));
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
             frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
         }
 
@@ -812,11 +812,11 @@
             dims[i] = frameState.ipop();
         }
         if (type.isResolved()) {
-            NewArray n = new NewMultiArray(type, dims, cpi, constantPool, graph);
+            NewArrayNode n = new NewMultiArrayNode(type, dims, cpi, constantPool, graph);
             frameState.apush(append(n));
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
             frameState.apush(appendConstant(CiConstant.NULL_OBJECT));
         }
     }
@@ -825,12 +825,12 @@
         CiKind kind = field.kind();
         ValueNode receiver = frameState.apop();
         if (field.isResolved() && field.holder().isInitialized()) {
-            LoadField load = new LoadField(receiver, field, graph);
+            LoadFieldNode load = new LoadFieldNode(receiver, field, graph);
             appendOptimizedLoadField(kind, load);
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
-            frameState.push(kind.stackKind(), append(Constant.defaultForKind(kind, graph)));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
+            frameState.push(kind.stackKind(), append(ConstantNode.defaultForKind(kind, graph)));
         }
     }
 
@@ -842,7 +842,7 @@
             appendOptimizedStoreField(store);
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
         }
     }
 
@@ -859,11 +859,11 @@
             ValueNode container = genTypeOrDeopt(RiType.Representation.StaticFields, holder, isInitialized);
             CiKind kind = field.kind();
             if (container != null) {
-                LoadField load = new LoadField(container, field, graph);
+                LoadFieldNode load = new LoadFieldNode(container, field, graph);
                 appendOptimizedLoadField(kind, load);
             } else {
                 // deopt will be generated by genTypeOrDeopt, not needed here
-                frameState.push(kind.stackKind(), append(Constant.defaultForKind(kind, graph)));
+                frameState.push(kind.stackKind(), append(ConstantNode.defaultForKind(kind, graph)));
             }
         }
     }
@@ -880,12 +880,12 @@
         }
     }
 
-    private Constant genTypeOrDeopt(RiType.Representation representation, RiType holder, boolean initialized) {
+    private ConstantNode genTypeOrDeopt(RiType.Representation representation, RiType holder, boolean initialized) {
         if (initialized) {
             return appendConstant(holder.getEncoding(representation));
         } else {
             storeResultGraph = false;
-            append(new Deoptimize(DeoptAction.InvalidateRecompile, graph));
+            append(new DeoptimizeNode(DeoptAction.InvalidateRecompile, graph));
             return null;
         }
     }
@@ -894,7 +894,7 @@
         append(store);
     }
 
-    private void appendOptimizedLoadField(CiKind kind, LoadField load) {
+    private void appendOptimizedLoadField(CiKind kind, LoadFieldNode load) {
         // append the load to the instruction
         ValueNode optimized = append(load);
         frameState.push(kind.stackKind(), optimized);
@@ -969,12 +969,12 @@
         CiKind resultType = returnKind(target);
         if (GraalOptions.DeoptALot) {
             storeResultGraph = false;
-            Deoptimize deoptimize = new Deoptimize(DeoptAction.None, graph);
+            DeoptimizeNode deoptimize = new DeoptimizeNode(DeoptAction.None, graph);
             deoptimize.setMessage("invoke " + target.name());
             append(deoptimize);
-            frameState.pushReturn(resultType, Constant.defaultForKind(resultType, graph));
+            frameState.pushReturn(resultType, ConstantNode.defaultForKind(resultType, graph));
         } else {
-            Invoke invoke = new Invoke(bci(), opcode, resultType.stackKind(), args, target, target.signature().returnType(method.holder()), graph);
+            InvokeNode invoke = new InvokeNode(bci(), opcode, resultType.stackKind(), args, target, target.signature().returnType(method.holder()), graph);
             ValueNode result = appendWithBCI(invoke);
             invoke.setExceptionEdge(handleException(null, bci()));
 //            if (invoke.exceptionEdge() == null) {
@@ -1003,7 +1003,7 @@
 
     private void callRegisterFinalizer() {
         // append a call to the finalizer registration
-        append(new RegisterFinalizer(frameState.loadLocal(0), graph));
+        append(new RegisterFinalizerNode(frameState.loadLocal(0), graph));
     }
 
     private void genReturn(ValueNode x) {
@@ -1016,15 +1016,15 @@
 
     private void genMonitorEnter(ValueNode x, int bci) {
         int lockNumber = frameState.locksSize();
-        MonitorAddress lockAddress = null;
+        MonitorAddressNode lockAddress = null;
         if (runtime.sizeOfBasicObjectLock() != 0) {
-            lockAddress = new MonitorAddress(lockNumber, graph);
+            lockAddress = new MonitorAddressNode(lockNumber, graph);
             append(lockAddress);
         }
-        MonitorEnter monitorEnter = new MonitorEnter(x, lockAddress, lockNumber, graph);
+        MonitorEnterNode monitorEnter = new MonitorEnterNode(x, lockAddress, lockNumber, graph);
         appendWithBCI(monitorEnter);
         frameState.lock(x);
-        if (bci == FixedNodeWithNext.SYNCHRONIZATION_ENTRY_BCI) {
+        if (bci == FixedWithNextNode.SYNCHRONIZATION_ENTRY_BCI) {
             monitorEnter.setStateAfter(frameState.create(0));
         }
     }
@@ -1034,12 +1034,12 @@
         if (lockNumber < 0) {
             throw new CiBailout("monitor stack underflow");
         }
-        MonitorAddress lockAddress = null;
+        MonitorAddressNode lockAddress = null;
         if (runtime.sizeOfBasicObjectLock() != 0) {
-            lockAddress = new MonitorAddress(lockNumber, graph);
+            lockAddress = new MonitorAddressNode(lockNumber, graph);
             append(lockAddress);
         }
-        appendWithBCI(new MonitorExit(x, lockAddress, lockNumber, graph));
+        appendWithBCI(new MonitorExitNode(x, lockAddress, lockNumber, graph));
         frameState.unlock();
     }
 
@@ -1056,7 +1056,7 @@
         ValueNode value = frameState.ipop();
         BytecodeTableSwitch ts = new BytecodeTableSwitch(stream(), bci);
         int max = ts.numberOfCases();
-        List<FixedNodeWithNext> list = new ArrayList<FixedNodeWithNext>(max + 1);
+        List<FixedWithNextNode> list = new ArrayList<FixedWithNextNode>(max + 1);
         List<Integer> offsetList = new ArrayList<Integer>(max + 1);
         for (int i = 0; i < max; i++) {
             // add all successors to the successor list
@@ -1095,7 +1095,7 @@
         ValueNode value = frameState.ipop();
         BytecodeLookupSwitch ls = new BytecodeLookupSwitch(stream(), bci);
         int max = ls.numberOfCases();
-        List<FixedNodeWithNext> list = new ArrayList<FixedNodeWithNext>(max + 1);
+        List<FixedWithNextNode> list = new ArrayList<FixedWithNextNode>(max + 1);
         List<Integer> offsetList = new ArrayList<Integer>(max + 1);
         int[] keys = new int[max];
         for (int i = 0; i < max; i++) {
@@ -1108,22 +1108,22 @@
         int offset = ls.defaultOffset();
         list.add(null);
         offsetList.add(offset);
-        LookupSwitch lookupSwitch = new LookupSwitch(value, list, keys, switchProbability(list.size(), bci), graph);
+        LookupSwitchNode lookupSwitch = new LookupSwitchNode(value, list, keys, switchProbability(list.size(), bci), graph);
         for (int i = 0; i < offsetList.size(); ++i) {
             lookupSwitch.setBlockSuccessor(i, createTargetAt(bci + offsetList.get(i), frameState));
         }
         append(lookupSwitch);
     }
 
-    private Constant appendConstant(CiConstant constant) {
-        return new Constant(constant, graph);
+    private ConstantNode appendConstant(CiConstant constant) {
+        return new ConstantNode(constant, graph);
     }
 
     private ValueNode append(FixedNode fixed) {
-        if (fixed instanceof Deoptimize && lastInstr.predecessor() != null) {
+        if (fixed instanceof DeoptimizeNode && lastInstr.predecessor() != null) {
             Node cur = lastInstr;
             Node prev = cur;
-            while (cur != cur.graph().start() && !(cur instanceof ControlSplit)) {
+            while (cur != cur.graph().start() && !(cur instanceof ControlSplitNode)) {
                 assert cur.predecessor() != null;
                 prev = cur;
                 cur = cur.predecessor();
@@ -1131,18 +1131,18 @@
                     break;
                 }
 
-                if (cur instanceof ExceptionObject) {
+                if (cur instanceof ExceptionObjectNode) {
                     break;
                 }
             }
 
-            if (cur instanceof If) {
-                If ifNode = (If) cur;
+            if (cur instanceof IfNode) {
+                IfNode ifNode = (IfNode) cur;
                 if (ifNode.falseSuccessor() == prev) {
                     FixedNode successor = ifNode.trueSuccessor();
                     ifNode.setTrueSuccessor(null);
                     BooleanNode condition = ifNode.compare();
-                    FixedGuard fixedGuard = new FixedGuard(condition, graph);
+                    FixedGuardNode fixedGuard = new FixedGuardNode(condition, graph);
                     fixedGuard.setNext(successor);
                     ifNode.replaceAndDelete(fixedGuard);
                     lastInstr = null;
@@ -1159,7 +1159,7 @@
         return fixed;
     }
 
-    private ValueNode append(FixedNodeWithNext x) {
+    private ValueNode append(FixedWithNextNode x) {
         return appendWithBCI(x);
     }
 
@@ -1167,7 +1167,7 @@
         return v;
     }
 
-    private ValueNode appendWithBCI(FixedNodeWithNext x) {
+    private ValueNode appendWithBCI(FixedWithNextNode x) {
         assert x.predecessor() == null : "instruction should not have been appended yet";
         assert lastInstr.next() == null : "cannot append instruction to instruction which isn't end (" + lastInstr + "->" + lastInstr.next() + ")";
         lastInstr.setNext(x);
@@ -1190,18 +1190,18 @@
 
         if (block.firstInstruction == null) {
             if (block.isLoopHeader) {
-                LoopBegin loopBegin = new LoopBegin(graph);
+                LoopBeginNode loopBegin = new LoopBeginNode(graph);
                 loopBegin.addEnd(new EndNode(graph));
-                LoopEnd loopEnd = new LoopEnd(graph);
+                LoopEndNode loopEnd = new LoopEndNode(graph);
                 loopEnd.setLoopBegin(loopBegin);
-                Placeholder pBegin = new Placeholder(graph);
+                PlaceholderNode pBegin = new PlaceholderNode(graph);
                 pBegin.setNext(loopBegin.forwardEdge());
-                Placeholder pEnd = new Placeholder(graph);
+                PlaceholderNode pEnd = new PlaceholderNode(graph);
                 pEnd.setNext(loopEnd);
                 loopBegin.setStateAfter(stateAfter.duplicate(block.startBci));
                 block.firstInstruction = pBegin;
             } else {
-                block.firstInstruction = new Placeholder(graph);
+                block.firstInstruction = new PlaceholderNode(graph);
             }
         }
         mergeOrClone(block, stateAfter);
@@ -1214,15 +1214,15 @@
             result = block.firstInstruction;
         }
 
-        assert result instanceof Merge || result instanceof Placeholder : result;
+        assert result instanceof MergeNode || result instanceof PlaceholderNode : result;
 
-        if (result instanceof Merge) {
-            if (result instanceof LoopBegin) {
-                result = ((LoopBegin) result).forwardEdge();
+        if (result instanceof MergeNode) {
+            if (result instanceof LoopBeginNode) {
+                result = ((LoopBeginNode) result).forwardEdge();
             } else {
                 EndNode end = new EndNode(graph);
-                ((Merge) result).addEnd(end);
-                Placeholder p = new Placeholder(graph);
+                ((MergeNode) result).addEnd(end);
+                PlaceholderNode p = new PlaceholderNode(graph);
                 int bci = block.startBci;
                 if (block instanceof ExceptionBlock) {
                     bci = ((ExceptionBlock) block).deoptBci;
@@ -1232,13 +1232,13 @@
                 result = p;
             }
         }
-        assert !(result instanceof LoopBegin || result instanceof Merge);
+        assert !(result instanceof LoopBeginNode || result instanceof MergeNode);
         return result;
     }
 
     private ValueNode synchronizedObject(FrameStateAccess state, RiMethod target) {
         if (isStatic(target.accessFlags())) {
-            Constant classConstant = new Constant(target.holder().getEncoding(Representation.JavaClass), graph);
+            ConstantNode classConstant = new ConstantNode(target.holder().getEncoding(Representation.JavaClass), graph);
             return append(classConstant);
         } else {
             return state.localAt(0);
@@ -1259,7 +1259,7 @@
                 markVisited(block);
                 // now parse the block
                 if (block.isLoopHeader) {
-                    LoopBegin begin = loopBegin(block);
+                    LoopBeginNode begin = loopBegin(block);
                     FrameState preLoopState = ((StateSplit) block.firstInstruction).stateAfter();
                     assert preLoopState != null;
                     FrameState duplicate = preLoopState.duplicate(preLoopState.bci);
@@ -1288,8 +1288,8 @@
         }
         for (Block b : blocksVisited) {
             if (b.isLoopHeader) {
-                LoopBegin begin = loopBegin(b);
-                LoopEnd loopEnd = begin.loopEnd();
+                LoopBeginNode begin = loopBegin(b);
+                LoopEndNode loopEnd = begin.loopEnd();
                 StateSplit loopEndPred = (StateSplit) loopEnd.predecessor();
 
 //              This can happen with degenerated loops like this one:
@@ -1306,7 +1306,7 @@
                 } else {
                     loopEndPred.delete();
                     loopEnd.delete();
-                    Merge merge = new Merge(graph);
+                    MergeNode merge = new MergeNode(graph);
                     merge.addEnd(begin.forwardEdge());
                     FixedNode next = begin.next();
                     begin.setNext(null);
@@ -1318,15 +1318,15 @@
         }
     }
 
-    private static LoopBegin loopBegin(Block block) {
+    private static LoopBeginNode loopBegin(Block block) {
         EndNode endNode = (EndNode) block.firstInstruction.next();
-        LoopBegin loopBegin = (LoopBegin) endNode.merge();
+        LoopBeginNode loopBegin = (LoopBeginNode) endNode.merge();
         return loopBegin;
     }
 
     private void createDeoptBlock(DeoptBlock block) {
         storeResultGraph = false;
-        append(new Deoptimize(DeoptAction.InvalidateReprofile, graph));
+        append(new DeoptimizeNode(DeoptAction.InvalidateReprofile, graph));
     }
 
     private void createUnwindBlock(Block block) {
@@ -1349,7 +1349,7 @@
         if (Modifier.isSynchronized(method.accessFlags())) {
             genMonitorExit(methodSynchronizedObject);
         }
-        Return returnNode = new Return(x, graph);
+        ReturnNode returnNode = new ReturnNode(x, graph);
         graph.setReturn(returnNode);
         append(returnNode);
     }
@@ -1365,12 +1365,12 @@
 
 
             RiType catchType = block.handler.catchType();
-            Constant typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, catchType, catchType.isResolved());
+            ConstantNode typeInstruction = genTypeOrDeopt(RiType.Representation.ObjectHub, catchType, catchType.isResolved());
             if (typeInstruction != null) {
                 FixedNode catchSuccessor = createTarget(blockFromBci[block.handler.handlerBCI()], frameState);
                 FixedNode nextDispatch = createTarget(nextBlock, frameState);
                 ValueNode exception = frameState.stackAt(0);
-                If ifNode = new If(new InstanceOf(typeInstruction, exception, false, graph), 0.5, graph);
+                IfNode ifNode = new IfNode(new InstanceOfNode(typeInstruction, exception, false, graph), 0.5, graph);
                 append(ifNode);
                 ifNode.setTrueSuccessor(catchSuccessor);
                 ifNode.setFalseSuccessor(nextDispatch);
@@ -1670,7 +1670,7 @@
     }
 
     private void genArrayLength() {
-        frameState.ipush(append(new ArrayLength(frameState.apop(), graph)));
+        frameState.ipush(append(new ArrayLengthNode(frameState.apop(), graph)));
     }
 
     /**
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/InliningPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,10 +28,10 @@
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.base.DeoptimizeNode.DeoptAction;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.extensions.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.bytecode.*;
@@ -53,15 +53,15 @@
     private final IR ir;
 
     private int inliningSize;
-    private final Collection<Invoke> hints;
+    private final Collection<InvokeNode> hints;
 
-    public InliningPhase(GraalCompilation compilation, IR ir, Collection<Invoke> hints) {
+    public InliningPhase(GraalCompilation compilation, IR ir, Collection<InvokeNode> hints) {
         this.compilation = compilation;
         this.ir = ir;
         this.hints = hints;
     }
 
-    private Queue<Invoke> newInvokes = new ArrayDeque<Invoke>();
+    private Queue<InvokeNode> newInvokes = new ArrayDeque<InvokeNode>();
     private CompilerGraph graph;
 
     @Override
@@ -74,15 +74,15 @@
         if (hints != null) {
             newInvokes.addAll(hints);
         } else {
-            for (Invoke invoke : graph.getNodes(Invoke.class)) {
+            for (InvokeNode invoke : graph.getNodes(InvokeNode.class)) {
                 newInvokes.add(invoke);
             }
         }
 
         for (int iterations = 0; iterations < MAX_ITERATIONS; iterations++) {
-            Queue<Invoke> queue = newInvokes;
-            newInvokes = new ArrayDeque<Invoke>();
-            for (Invoke invoke : queue) {
+            Queue<InvokeNode> queue = newInvokes;
+            newInvokes = new ArrayDeque<InvokeNode>();
+            for (InvokeNode invoke : queue) {
                 if (!invoke.isDeleted()) {
                     if (GraalOptions.Meter) {
                         GraalMetrics.InlineConsidered++;
@@ -136,7 +136,7 @@
         }
     }
 
-    private RiMethod inlineInvoke(Invoke invoke, int iterations, float ratio) {
+    private RiMethod inlineInvoke(InvokeNode invoke, int iterations, float ratio) {
         RiMethod parent = invoke.stateAfter().method();
         RiTypeProfile profile = parent.typeProfile(invoke.bci);
         if (GraalOptions.Intrinsify) {
@@ -195,8 +195,8 @@
                 // type check and inlining...
                 concrete = profile.types[0].resolveMethodImpl(invoke.target);
                 if (concrete != null && checkTargetConditions(concrete, iterations) && checkSizeConditions(parent, iterations, concrete, invoke, profile, ratio)) {
-                    IsType isType = new IsType(invoke.receiver(), profile.types[0], compilation.graph);
-                    FixedGuard guard = new FixedGuard(isType, graph);
+                    IsTypeNode isType = new IsTypeNode(invoke.receiver(), profile.types[0], compilation.graph);
+                    FixedGuardNode guard = new FixedGuardNode(isType, graph);
                     assert invoke.predecessor() != null;
                     invoke.predecessor().replaceFirstSuccessor(invoke, guard);
                     guard.setNext(invoke);
@@ -225,7 +225,7 @@
         return CiUtil.format("%H.%n(%p):%r", method, false) + " (" + method.codeSize() + " bytes)";
     }
 
-    private String methodName(RiMethod method, Invoke invoke) {
+    private String methodName(RiMethod method, InvokeNode invoke) {
         if (invoke != null) {
             RiMethod parent = invoke.stateAfter().method();
             return parent.name() + "@" + invoke.bci + ": " + CiUtil.format("%H.%n(%p):%r", method, false) + " (" + method.codeSize() + " bytes)";
@@ -234,7 +234,7 @@
         }
     }
 
-    private boolean checkInvokeConditions(Invoke invoke) {
+    private boolean checkInvokeConditions(InvokeNode invoke) {
         if (!invoke.canInline()) {
             if (GraalOptions.TraceInlining) {
                 TTY.println("not inlining %s because the invoke is manually set to be non-inlinable", methodName(invoke.target, invoke));
@@ -301,7 +301,7 @@
         return true;
     }
 
-    private boolean checkStaticSizeConditions(RiMethod method, Invoke invoke) {
+    private boolean checkStaticSizeConditions(RiMethod method, InvokeNode invoke) {
         int maximumSize = GraalOptions.MaximumInlineSize;
         if (hints != null && hints.contains(invoke)) {
             maximumSize = GraalOptions.MaximumFreqInlineSize;
@@ -315,7 +315,7 @@
         return true;
     }
 
-    private boolean checkSizeConditions(RiMethod caller, int iterations, RiMethod method, Invoke invoke, RiTypeProfile profile, float adjustedRatio) {
+    private boolean checkSizeConditions(RiMethod caller, int iterations, RiMethod method, InvokeNode invoke, RiTypeProfile profile, float adjustedRatio) {
         int maximumSize = GraalOptions.MaximumTrivialSize;
         int maximumCompiledSize = GraalOptions.MaximumTrivialCompSize;
         double ratio = 0;
@@ -424,12 +424,12 @@
         return null;
     }
 
-    private void inlineMethod(Invoke invoke, RiMethod method) {
+    private void inlineMethod(InvokeNode invoke, RiMethod method) {
         RiMethod parent = invoke.stateAfter().method();
         FrameState stateAfter = invoke.stateAfter();
         FixedNode exceptionEdge = invoke.exceptionEdge();
-        if (exceptionEdge instanceof Placeholder) {
-            exceptionEdge = ((Placeholder) exceptionEdge).next();
+        if (exceptionEdge instanceof PlaceholderNode) {
+            exceptionEdge = ((PlaceholderNode) exceptionEdge).next();
         }
 
         boolean withReceiver = !invoke.isStatic();
@@ -484,18 +484,18 @@
         HashMap<Node, Node> replacements = new HashMap<Node, Node>();
         ArrayList<Node> nodes = new ArrayList<Node>();
         ArrayList<Node> frameStates = new ArrayList<Node>();
-        Return returnNode = null;
+        ReturnNode returnNode = null;
         UnwindNode unwindNode = null;
         StartNode startNode = graph.start();
         for (Node node : graph.getNodes()) {
             if (node instanceof StartNode) {
                 assert startNode == node;
-            } else if (node instanceof Local) {
-                replacements.put(node, parameters[((Local) node).index()]);
+            } else if (node instanceof LocalNode) {
+                replacements.put(node, parameters[((LocalNode) node).index()]);
             } else {
                 nodes.add(node);
-                if (node instanceof Return) {
-                    returnNode = (Return) node;
+                if (node instanceof ReturnNode) {
+                    returnNode = (ReturnNode) node;
                 } else if (node instanceof UnwindNode) {
                     unwindNode = (UnwindNode) node;
                 } else if (node instanceof FrameState) {
@@ -510,11 +510,11 @@
 
         assert invoke.successors().first() != null : invoke;
         assert invoke.predecessor() != null;
-        FixedNodeWithNext pred;
+        FixedWithNextNode pred;
         if (withReceiver) {
-            pred = new FixedGuard(new IsNonNull(parameters[0], compilation.graph), compilation.graph);
+            pred = new FixedGuardNode(new IsNonNullNode(parameters[0], compilation.graph), compilation.graph);
         } else {
-            pred = new Placeholder(compilation.graph);
+            pred = new PlaceholderNode(compilation.graph);
         }
         invoke.replaceAtPredecessors(pred);
         replacements.put(startNode, pred);
@@ -530,8 +530,8 @@
                     fixed.setProbability(fixed.probability() * invokeProbability);
                 }
             }
-            if (node instanceof Invoke && ((Invoke) node).canInline()) {
-                newInvokes.add((Invoke) node);
+            if (node instanceof InvokeNode && ((InvokeNode) node).canInline()) {
+                newInvokes.add((InvokeNode) node);
             } else if (node instanceof FrameState) {
                 FrameState frameState = (FrameState) node;
                 if (frameState.bci == FrameState.BEFORE_BCI) {
@@ -548,22 +548,22 @@
         int monitorIndexDelta = stateAfter.locksSize();
         if (monitorIndexDelta > 0) {
             for (Map.Entry<Node, Node> entry : duplicates.entrySet()) {
-                if (entry.getValue() instanceof MonitorAddress) {
-                    MonitorAddress address = (MonitorAddress) entry.getValue();
+                if (entry.getValue() instanceof MonitorAddressNode) {
+                    MonitorAddressNode address = (MonitorAddressNode) entry.getValue();
                     address.setMonitorIndex(address.monitorIndex() + monitorIndexDelta);
                 }
             }
         }
 
-        if (pred instanceof Placeholder) {
-            FixedNode next = ((Placeholder) pred).next();
-            ((Placeholder) pred).setNext(null);
+        if (pred instanceof PlaceholderNode) {
+            FixedNode next = ((PlaceholderNode) pred).next();
+            ((PlaceholderNode) pred).setNext(null);
             pred.replaceAndDelete(next);
         }
 
         if (returnNode != null) {
             for (Node usage : invoke.usages().snapshot()) {
-                if (returnNode.result() instanceof Local) {
+                if (returnNode.result() instanceof LocalNode) {
                     usage.replaceFirstInput(invoke, replacements.get(returnNode.result()));
                 } else {
                     usage.replaceFirstInput(invoke, duplicates.get(returnNode.result()));
@@ -580,7 +580,7 @@
             if (unwindNode != null) {
                 assert unwindNode.predecessor() != null;
                 assert exceptionEdge.successors().explicitCount() == 1;
-                ExceptionObject obj = (ExceptionObject) exceptionEdge;
+                ExceptionObjectNode obj = (ExceptionObjectNode) exceptionEdge;
 
                 UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode);
                 for (Node usage : obj.usages().snapshot()) {
@@ -594,7 +594,7 @@
         } else {
             if (unwindNode != null) {
                 UnwindNode unwindDuplicate = (UnwindNode) duplicates.get(unwindNode);
-                unwindDuplicate.replaceAndDelete(new Deoptimize(DeoptAction.InvalidateRecompile, compilation.graph));
+                unwindDuplicate.replaceAndDelete(new DeoptimizeNode(DeoptAction.InvalidateRecompile, compilation.graph));
             }
         }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -25,8 +25,9 @@
 import java.util.*;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.loop.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.compiler.util.LoopUtil.Loop;
@@ -55,14 +56,14 @@
                     continue;
                 }
                 boolean canInvert = false;
-                if (GraalOptions.LoopInversion  && loop.loopBegin().next() instanceof If) {
-                    If ifNode = (If) loop.loopBegin().next();
+                if (GraalOptions.LoopInversion  && loop.loopBegin().next() instanceof IfNode) {
+                    IfNode ifNode = (IfNode) loop.loopBegin().next();
                     if (loop.exits().isMarked(ifNode.trueSuccessor()) || loop.exits().isMarked(ifNode.falseSuccessor())) {
                         canInvert = true;
                     }
                 }
                 if (canInvert) {
-                    LoopUtil.inverseLoop(loop, (If) loop.loopBegin().next());
+                    LoopUtil.inverseLoop(loop, (IfNode) loop.loopBegin().next());
                 } else if (GraalOptions.LoopPeeling) {
                     GraalCompilation compilation = GraalCompilation.compilation();
                     if (compilation.compiler.isObserved()) {
@@ -84,21 +85,21 @@
     }
 
     private void findInductionVariables(Loop loop) {
-        LoopBegin loopBegin = loop.loopBegin();
+        LoopBeginNode loopBegin = loop.loopBegin();
         NodeBitMap loopNodes = loop.nodes();
-        List<Phi> phis = new ArrayList<Phi>(loopBegin.phis());
+        List<PhiNode> phis = new ArrayList<PhiNode>(loopBegin.phis());
         int backIndex = loopBegin.phiPredecessorIndex(loopBegin.loopEnd());
         int initIndex = loopBegin.phiPredecessorIndex(loopBegin.forwardEdge());
-        for (Phi phi : phis) {
+        for (PhiNode phi : phis) {
             ValueNode init = phi.valueAt(initIndex);
             ValueNode backEdge = phi.valueAt(backIndex);
             if (loopNodes.isNew(init) || loopNodes.isNew(backEdge)) {
                 continue;
             }
             if (loopNodes.isMarked(backEdge)) {
-                Binary binary;
-                if (backEdge instanceof IntegerAdd || backEdge instanceof IntegerSub) {
-                    binary = (Binary) backEdge;
+                BinaryNode binary;
+                if (backEdge instanceof IntegerAddNode || backEdge instanceof IntegerSubNode) {
+                    binary = (BinaryNode) backEdge;
                 } else {
                     continue;
                 }
@@ -112,22 +113,22 @@
                 }
                 if (loopNodes.isNotNewNotMarked(stride)) {
                     Graph graph = loopBegin.graph();
-                    if (backEdge instanceof IntegerSub) {
-                        stride = new Negate(stride, graph);
+                    if (backEdge instanceof IntegerSubNode) {
+                        stride = new NegateNode(stride, graph);
                     }
                     CiKind kind = phi.kind;
-                    LoopCounter counter = loopBegin.loopCounter(kind);
-                    BasicInductionVariable biv1 = null;
-                    BasicInductionVariable biv2 = null;
+                    LoopCounterNode counter = loopBegin.loopCounter(kind);
+                    BasicInductionVariableNode biv1 = null;
+                    BasicInductionVariableNode biv2 = null;
                     if (phi.usages().size() > 1) {
-                        biv1 = new BasicInductionVariable(kind, init, stride, counter, graph);
+                        biv1 = new BasicInductionVariableNode(kind, init, stride, counter, graph);
                         phi.replaceAndDelete(biv1);
                     } else {
                         phi.replaceFirstInput(binary, null);
                         phi.delete();
                     }
                     if (backEdge.usages().size() > 0) {
-                        biv2 = new BasicInductionVariable(kind, IntegerArithmeticNode.add(init, stride), stride, counter, graph);
+                        biv2 = new BasicInductionVariableNode(kind, IntegerArithmeticNode.add(init, stride), stride, counter, graph);
                         backEdge.replaceAndDelete(biv2);
                     } else {
                         backEdge.delete();
@@ -142,14 +143,14 @@
             }
         }
     }
-    private void findDerivedInductionVariable(BasicInductionVariable biv, CiKind kind, NodeBitMap loopNodes) {
+    private void findDerivedInductionVariable(BasicInductionVariableNode biv, CiKind kind, NodeBitMap loopNodes) {
         for (Node usage : biv.usages().snapshot()) {
             ValueNode scale = scale(usage, biv, loopNodes);
             ValueNode offset = null;
             Node node = null;
             if (scale == null) {
-                if (usage instanceof IntegerAdd) {
-                    IntegerAdd add = (IntegerAdd) usage;
+                if (usage instanceof IntegerAddNode) {
+                    IntegerAddNode add = (IntegerAddNode) usage;
                     if (add.x() == biv || (scale = scale(add.x(), biv, loopNodes)) != null) {
                         offset = add.y();
                     } else if (add.y() == biv || (scale = scale(add.y(), biv, loopNodes)) != null) {
@@ -168,19 +169,19 @@
             }
             if (scale != null || offset != null) {
                 if (scale == null) {
-                    scale = Constant.forInt(1, biv.graph());
+                    scale = ConstantNode.forInt(1, biv.graph());
                 } else if (offset == null) {
-                    offset = Constant.forInt(0, biv.graph());
+                    offset = ConstantNode.forInt(0, biv.graph());
                 }
-                DerivedInductionVariable div = new DerivedInductionVariable(kind, offset, scale, biv, biv.graph());
+                DerivedInductionVariableNode div = new DerivedInductionVariableNode(kind, offset, scale, biv, biv.graph());
                 node.replaceAndDelete(div);
             }
         }
     }
 
-    private ValueNode scale(Node n, BasicInductionVariable biv, NodeBitMap loopNodes) {
-        if (n instanceof IntegerMul) {
-            IntegerMul mul = (IntegerMul) n;
+    private ValueNode scale(Node n, BasicInductionVariableNode biv, NodeBitMap loopNodes) {
+        if (n instanceof IntegerMulNode) {
+            IntegerMulNode mul = (IntegerMulNode) n;
             ValueNode scale = null;
             if (mul.x() == biv) {
                 scale = mul.y();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoweringPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,7 +24,7 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.graph.*;
@@ -93,7 +93,7 @@
 
             @Override
             public Node createGuard(Node condition) {
-                Anchor anchor = (Anchor) getGuardAnchor();
+                AnchorNode anchor = (AnchorNode) getGuardAnchor();
                 GuardNode newGuard = new GuardNode((BooleanNode) condition, anchor.graph());
                 newGuard.setAnchor(anchor);
                 return newGuard;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -27,10 +27,8 @@
 
 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.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.nodes.base.*;
-import com.oracle.max.graal.compiler.nodes.cfg.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
 import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.graph.*;
@@ -52,7 +50,7 @@
 
         public MemoryMap(Block b, MemoryMap memoryMap) {
             this(b);
-            if (b.firstNode() instanceof LoopBegin) {
+            if (b.firstNode() instanceof LoopBeginNode) {
                 loopCheckPoint = new WriteMemoryCheckpointNode(b.firstNode().graph());
                 mergeForWrite = loopCheckPoint;
                 mergeForRead = loopCheckPoint;
@@ -117,7 +115,7 @@
                         TTY.println("Only right map " + e.getKey());
                     }
                     Node leftNode = mergeLeft;
-                    if (leftNode instanceof Phi && ((Phi) leftNode).merge() == block.firstNode()) {
+                    if (leftNode instanceof PhiNode && ((PhiNode) leftNode).merge() == block.firstNode()) {
                         leftNode = leftNode.copyWithEdges();
                     }
                     locationLeft.put(e.getKey(), leftNode);
@@ -151,9 +149,9 @@
                 }
                 return original;
             }
-            Merge m = (Merge) block.firstNode();
-            if (original instanceof Phi && ((Phi) original).merge() == m) {
-                Phi phi = (Phi) original;
+            MergeNode m = (MergeNode) block.firstNode();
+            if (original instanceof PhiNode && ((PhiNode) original).merge() == m) {
+                PhiNode phi = (PhiNode) original;
                 phi.addInput((ValueNode) newValue);
                 if (GraalOptions.TraceMemoryMaps) {
                     TTY.println("Add new input to phi " + original.id());
@@ -161,7 +159,7 @@
                 assert phi.valueCount() <= phi.merge().endCount();
                 return original;
             } else {
-                Phi phi = new Phi(CiKind.Illegal, m, PhiType.Memory, m.graph());
+                PhiNode phi = new PhiNode(CiKind.Illegal, m, PhiType.Memory, m.graph());
                 for (int i = 0; i < mergeOperationCount + 1; ++i) {
                     phi.addInput((ValueNode) original);
                 }
@@ -169,7 +167,7 @@
                 if (GraalOptions.TraceMemoryMaps) {
                     TTY.println("Creating new phi " + phi.id());
                 }
-                assert phi.valueCount() <= phi.merge().endCount() + ((phi.merge() instanceof LoopBegin) ? 1 : 0) : phi.merge() + "/" + phi.valueCount() + "/" + phi.merge().endCount() + "/" + mergeOperationCount;
+                assert phi.valueCount() <= phi.merge().endCount() + ((phi.merge() instanceof LoopBeginNode) ? 1 : 0) : phi.merge() + "/" + phi.valueCount() + "/" + phi.merge().endCount() + "/" + mergeOperationCount;
                 return phi;
             }
         }
@@ -285,7 +283,7 @@
         } else {
             map = new MemoryMap(b, memoryMaps[b.getPredecessors().get(0).blockID()]);
             for (int i = 1; i < b.getPredecessors().size(); ++i) {
-                assert b.firstNode() instanceof Merge : b.firstNode();
+                assert b.firstNode() instanceof MergeNode : b.firstNode();
                 Block block = b.getPredecessors().get(i);
                 map.mergeWith(memoryMaps[block.blockID()], b);
             }
@@ -316,9 +314,9 @@
         }
 
         memoryMaps[b.blockID()] = map;
-        if (b.lastNode() instanceof LoopEnd) {
-            LoopEnd end = (LoopEnd) b.lastNode();
-            LoopBegin begin = end.loopBegin();
+        if (b.lastNode() instanceof LoopEndNode) {
+            LoopEndNode end = (LoopEndNode) b.lastNode();
+            LoopBeginNode begin = end.loopBegin();
             Block beginBlock = nodeMap.get(begin);
             MemoryMap memoryMap = memoryMaps[beginBlock.blockID()];
             assert memoryMap != null : beginBlock.name();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,7 +24,6 @@
 
 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.nodes.extended.*;
 import com.oracle.max.graal.graph.*;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/Block.java	Wed Aug 10 00:34:29 2011 +0200
@@ -24,7 +24,8 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.graph.*;
 
 
@@ -37,7 +38,7 @@
     private List<Node> instructions = new ArrayList<Node>();
     private Block dominator;
     private Block javaBlock;
-    private Anchor anchor;
+    private AnchorNode anchor;
     private EndNode end;
     private int loopDepth = 0;
     private int loopIndex = -1;
@@ -102,35 +103,35 @@
         }
     }
 
-    public Anchor createAnchor() {
+    public AnchorNode createAnchor() {
         if (anchor == null) {
-            if (firstNode instanceof Anchor) {
-                this.anchor = (Anchor) firstNode;
+            if (firstNode instanceof AnchorNode) {
+                this.anchor = (AnchorNode) firstNode;
             } else if (firstNode == firstNode.graph().start()) {
                 StartNode start = (StartNode) firstNode;
-                if (start.next() instanceof Anchor) {
-                    this.anchor = (Anchor) start.next();
+                if (start.next() instanceof AnchorNode) {
+                    this.anchor = (AnchorNode) start.next();
                 } else {
-                    Anchor a = new Anchor(firstNode.graph());
+                    AnchorNode a = new AnchorNode(firstNode.graph());
                     FixedNode oldStart = (FixedNode) firstNode.graph().start().next();
                     firstNode.graph().start().setNext(a);
                     a.setNext(oldStart);
                     this.anchor = a;
                 }
-            } else if (firstNode instanceof Merge || firstNode instanceof ExceptionObject) {
-                FixedNodeWithNext fixedNode = (FixedNodeWithNext) firstNode;
-                if (fixedNode.next() instanceof Anchor) {
-                    this.anchor = (Anchor) fixedNode.next();
+            } else if (firstNode instanceof MergeNode || firstNode instanceof ExceptionObjectNode) {
+                FixedWithNextNode fixedNode = (FixedWithNextNode) firstNode;
+                if (fixedNode.next() instanceof AnchorNode) {
+                    this.anchor = (AnchorNode) fixedNode.next();
                 } else {
-                    Anchor a = new Anchor(firstNode.graph());
+                    AnchorNode a = new AnchorNode(firstNode.graph());
                     FixedNode next = fixedNode.next();
                     fixedNode.setNext(a);
                     a.setNext(next);
                     this.anchor = a;
                 }
             } else {
-                assert !(firstNode instanceof Anchor);
-                Anchor a = new Anchor(firstNode.graph());
+                assert !(firstNode instanceof AnchorNode);
+                AnchorNode a = new AnchorNode(firstNode.graph());
                 assert firstNode.predecessor() != null : firstNode;
                 Node pred = firstNode.predecessor();
                 pred.replaceFirstSuccessor(firstNode, a);
@@ -212,11 +213,11 @@
     }
 
     public boolean isLoopHeader() {
-        return firstNode instanceof LoopBegin;
+        return firstNode instanceof LoopBeginNode;
     }
 
     public boolean isLoopEnd() {
-        return lastNode instanceof LoopEnd;
+        return lastNode instanceof LoopEndNode;
     }
 
     public Block dominator() {
@@ -254,7 +255,7 @@
                 if (!visited.get(succ.blockID())) {
                     boolean delay = false;
                     for (Block pred : succ.getPredecessors()) {
-                        if (!visited.get(pred.blockID()) && !(pred.lastNode instanceof LoopEnd)) {
+                        if (!visited.get(pred.blockID()) && !(pred.lastNode instanceof LoopEndNode)) {
                             delay = true;
                             break;
                         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/BlockClosure.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2009, 2010, 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.schedule;
+
+/**
+ * The {@code BlockClosure} interface represents a closure for iterating over blocks.
+ */
+public interface BlockClosure {
+    void apply(Block block);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/BlockList.java	Wed Aug 10 00:34:29 2011 +0200
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2009, 2010, 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.schedule;
+
+import java.util.*;
+
+import com.oracle.max.graal.compiler.nodes.base.*;
+
+/**
+ * The {@code BlockList} class implements a specialized list data structure for representing
+ * the predecessor and successor lists of basic blocks.
+ */
+public class BlockList implements Iterable<MergeNode> {
+
+    private MergeNode[] array;
+    private int cursor;
+
+    BlockList(int sizeHint) {
+        if (sizeHint > 0) {
+            array = new MergeNode[sizeHint];
+        } else {
+            array = new MergeNode[2];
+        }
+    }
+
+    public void remove(int index) {
+        if (index < 0 || index >= cursor) {
+            throw new IndexOutOfBoundsException();
+        }
+        for (int i = index; i < cursor; i++) {
+            array[i] = array[i + 1];
+        }
+        cursor--;
+    }
+
+    public void remove(MergeNode block) {
+        int j = 0;
+        for (int i = 0; i < cursor; i++) {
+            if (i != j) {
+                array[j] = array[i];
+            }
+            if (array[i] != block) {
+                j++;
+            }
+        }
+        cursor = j;
+    }
+
+    public void exchange(int index1, int index2) {
+        if (index1 < 0 || index1 >= cursor) {
+            throw new IndexOutOfBoundsException();
+        }
+        if (index2 < 0 || index2 >= cursor) {
+            throw new IndexOutOfBoundsException();
+        }
+        MergeNode t = array[index2];
+        array[index2] = array[index1];
+        array[index1] = t;
+    }
+
+    public void insert(int index, MergeNode block) {
+        if (index < 0 || index >= cursor) {
+            throw new IndexOutOfBoundsException();
+        }
+        growOne();
+        for (int i = cursor; i > index; i--) {
+            array[i] = array[i - 1];
+        }
+        array[cursor++] = block;
+    }
+
+    public void append(MergeNode block) {
+        growOne();
+        array[cursor++] = block;
+    }
+
+    public MergeNode get(int index) {
+        if (index < 0 || index >= cursor) {
+            throw new IndexOutOfBoundsException();
+        }
+        return array[index];
+    }
+
+    public void replace(MergeNode oldBlock, MergeNode newBlock) {
+        for (int i = 0; i < cursor; i++) {
+            if (array[i] == oldBlock) {
+                array[i] = newBlock;
+            }
+        }
+    }
+
+    public boolean checkForSameBlock() {
+        if (cursor == 0) {
+            return true;
+        }
+        MergeNode b = array[0];
+        for (int i = 1; i < cursor; i++) {
+            if (array[i] != b) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public Iterator<MergeNode> iterator() {
+        return new Iter();
+    }
+
+    private void growOne() {
+        if (cursor == array.length) {
+            array = Arrays.copyOf(array, array.length * 3);
+        }
+    }
+
+    private class Iter implements Iterator<MergeNode> {
+        private int pos;
+
+        public boolean hasNext() {
+            return pos < cursor;
+        }
+
+        public MergeNode next() {
+            return array[pos++];
+        }
+
+        public void remove() {
+            BlockList.this.remove(pos);
+        }
+    }
+}
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,9 +26,10 @@
 
 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.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.loop.*;
+import com.oracle.max.graal.compiler.nodes.virtual.*;
 import com.oracle.max.graal.compiler.phases.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.NodeClass.NodeClassIterator;
@@ -97,14 +98,14 @@
         assert nodeToBlock.get(n) == null;
         nodeToBlock.set(n, b);
 
-        if (n instanceof Merge) {
+        if (n instanceof MergeNode) {
             for (Node usage : n.usages()) {
 
-                if (usage instanceof Phi) {
+                if (usage instanceof PhiNode) {
                     nodeToBlock.set(usage, b);
                 }
 
-                if (usage instanceof LoopCounter) {
+                if (usage instanceof LoopCounterNode) {
                     nodeToBlock.set(usage, b);
                 }
 
@@ -131,7 +132,7 @@
     }
 
     public static boolean isBlockEnd(Node n) {
-        return trueSuccessorCount(n) > 1 || n instanceof Return || n instanceof UnwindNode || n instanceof Deoptimize;
+        return trueSuccessorCount(n) > 1 || n instanceof ReturnNode || n instanceof UnwindNode || n instanceof DeoptimizeNode;
     }
 
     private void print() {
@@ -154,11 +155,11 @@
 
         // Identify blocks.
         for (Node n : graph.getNodes()) {
-            if (n instanceof EndNode || n instanceof Return || n instanceof UnwindNode || n instanceof LoopEnd || n instanceof Deoptimize) {
+            if (n instanceof EndNode || n instanceof ReturnNode || n instanceof UnwindNode || n instanceof LoopEndNode || n instanceof DeoptimizeNode) {
                 Block block = null;
                 Node currentNode = n;
                 while (nodeToBlock.get(currentNode) == null) {
-                    if (block != null && (currentNode instanceof ControlSplit || trueSuccessorCount(currentNode) > 1)) {
+                    if (block != null && (currentNode instanceof ControlSplitNode || trueSuccessorCount(currentNode) > 1)) {
                         // We are at a split node => start a new block.
                         block = null;
                     }
@@ -181,8 +182,8 @@
         // Connect blocks.
         for (Block block : blocks) {
             Node n = block.firstNode();
-            if (n instanceof Merge) {
-                Merge m = (Merge) n;
+            if (n instanceof MergeNode) {
+                MergeNode m = (MergeNode) n;
                 for (Node pred : m.cfgPredecessors()) {
                     Block predBlock = nodeToBlock.get(pred);
                     predBlock.addSuccessor(block);
@@ -214,8 +215,8 @@
         // Add successors of loop end nodes. Makes the graph cyclic.
         for (Block block : blocks) {
             Node n = block.lastNode();
-            if (n instanceof LoopEnd) {
-                LoopEnd loopEnd = (LoopEnd) n;
+            if (n instanceof LoopEndNode) {
+                LoopEndNode loopEnd = (LoopEndNode) n;
                 assert loopEnd.loopBegin() != null;
                 Block loopBeginBlock = nodeToBlock.get(loopEnd.loopBegin());
                 block.addSuccessor(loopBeginBlock);
@@ -251,7 +252,7 @@
         }
 
         if (block.isLoopHeader()) {
-            markBlocks(nodeToBlock.get(((LoopBegin) block.firstNode()).loopEnd()), endBlock, map, loopIndex, initialDepth);
+            markBlocks(nodeToBlock.get(((LoopBeginNode) block.firstNode()).loopEnd()), endBlock, map, loopIndex, initialDepth);
         }
     }
 
@@ -513,9 +514,9 @@
     }
 
     private void blocksForUsage(Node node, Node usage, BlockClosure closure) {
-        if (usage instanceof Phi) {
-            Phi phi = (Phi) usage;
-            Merge merge = phi.merge();
+        if (usage instanceof PhiNode) {
+            PhiNode phi = (PhiNode) usage;
+            MergeNode merge = phi.merge();
             Block mergeBlock = nodeToBlock.get(merge);
             assert mergeBlock != null : "no block for merge " + merge.id();
             for (int i = 0; i < phi.valueCount(); ++i) {
@@ -531,16 +532,16 @@
                 }
             }
         } else if (usage instanceof FrameState && ((FrameState) usage).block() != null) {
-            Merge merge = ((FrameState) usage).block();
+            MergeNode merge = ((FrameState) usage).block();
             Block block = null;
             for (Node pred : merge.cfgPredecessors()) {
                 block = getCommonDominator(block, nodeToBlock.get(pred));
             }
             closure.apply(block);
-        } else if (usage instanceof LinearInductionVariable) {
-            LinearInductionVariable liv = (LinearInductionVariable) usage;
+        } else if (usage instanceof LinearInductionVariableNode) {
+            LinearInductionVariableNode liv = (LinearInductionVariableNode) usage;
             if (liv.isLinearInductionVariableInput(node)) {
-                LoopBegin loopBegin = liv.loopBegin();
+                LoopBeginNode loopBegin = liv.loopBegin();
                 Block mergeBlock = nodeToBlock.get(loopBegin);
                 closure.apply(mergeBlock.dominator());
             }
@@ -551,12 +552,12 @@
     }
 
     private void patch(Usage usage, Node original, Node patch) {
-        if (usage.node instanceof Phi) {
-            Phi phi = (Phi) usage.node;
+        if (usage.node instanceof PhiNode) {
+            PhiNode phi = (PhiNode) usage.node;
             Node pred;
             Block phiBlock = nodeToBlock.get(phi);
             if (phiBlock.isLoopHeader()) {
-                LoopBegin loopBegin = (LoopBegin) phiBlock.firstNode();
+                LoopBeginNode loopBegin = (LoopBeginNode) phiBlock.firstNode();
                 if (usage.block == phiBlock.dominator()) {
                     pred = loopBegin.forwardEdge();
                 } else {
@@ -629,7 +630,7 @@
     }
 
     private boolean noRematerialization(Node n) {
-        return n instanceof Local || n instanceof LocationNode || n instanceof Constant || n instanceof StateSplit || n instanceof FrameState || n instanceof VirtualObjectNode ||
+        return n instanceof LocalNode || n instanceof LocationNode || n instanceof ConstantNode || n instanceof StateSplit || n instanceof FrameState || n instanceof VirtualObjectNode ||
                         n instanceof VirtualObjectFieldNode;
     }
 
@@ -703,7 +704,7 @@
                 }
             }
             if (canNotMove) {
-                assert !(b.lastNode() instanceof ControlSplit);
+                assert !(b.lastNode() instanceof ControlSplitNode);
                 //b.setLastNode(lastSorted);
             } else {
                 sortedInstructions.remove(b.lastNode());
@@ -719,7 +720,7 @@
     }
 
     private void addToSorting(Block b, Node i, List<Node> sortedInstructions, NodeBitMap map) {
-        if (i == null || map.isMarked(i) || nodeToBlock.get(i) != b || i instanceof Phi || i instanceof Local || i instanceof LoopCounter) {
+        if (i == null || map.isMarked(i) || nodeToBlock.get(i) != b || i instanceof PhiNode || i instanceof LocalNode || i instanceof LoopCounterNode) {
             return;
         }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRAssembler.java	Wed Aug 10 00:34:29 2011 +0200
@@ -38,9 +38,9 @@
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.gen.LIRGenerator.DeoptimizationStub;
 import com.oracle.max.graal.compiler.globalstub.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.FrameMap.StackBlock;
 import com.oracle.max.graal.compiler.lir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ci.CiAddress.Scale;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/target/amd64/AMD64LIRGenerator.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,10 +28,11 @@
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.gen.*;
 import com.oracle.max.graal.compiler.globalstub.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.lir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
@@ -69,7 +70,7 @@
             // there is no immediate move of word values in asemblerI486.?pp
             return false;
         }
-        return v instanceof Constant;
+        return v instanceof ConstantNode;
     }
 
     @Override
@@ -123,7 +124,7 @@
     }
 
     @Override
-    public void visitNegate(Negate x) {
+    public void visitNegate(NegateNode x) {
         LIRItem value = new LIRItem(x.x(), this);
         value.setDestroysRegister();
         value.loadItem();
@@ -137,7 +138,7 @@
         return false;
     }
 
-    public void visitArithmeticOpFloat(Arithmetic x) {
+    public void visitArithmeticOpFloat(ArithmeticNode x) {
         LIRItem left = new LIRItem(x.x(), this);
         LIRItem right = new LIRItem(x.y(), this);
         assert !left.isStack() || !right.isStack() : "can't both be memory operands";
@@ -178,7 +179,7 @@
         setResult(x, reg);
     }
 
-    public void visitArithmeticOpLong(Arithmetic x) {
+    public void visitArithmeticOpLong(ArithmeticNode x) {
         int opcode = x.opcode;
         if (opcode == Bytecodes.LDIV || opcode == Bytecodes.LREM) {
             // emit inline 64-bit code
@@ -221,7 +222,7 @@
         }
     }
 
-    public void visitArithmeticOpInt(Arithmetic x) {
+    public void visitArithmeticOpInt(ArithmeticNode x) {
         int opcode = x.opcode;
         if (opcode == Bytecodes.IDIV || opcode == Bytecodes.IREM) {
             // emit code for integer division or modulus
@@ -299,7 +300,7 @@
         }
     }
 
-    public void visitArithmeticOpWord(Arithmetic x) {
+    public void visitArithmeticOpWord(ArithmeticNode x) {
         int opcode = x.opcode;
         if (opcode == Bytecodes.WDIV || opcode == Bytecodes.WREM || opcode == Bytecodes.WDIVI || opcode == Bytecodes.WREMI) {
             // emit code for long division or modulus
@@ -352,7 +353,7 @@
     }
 
     @Override
-    public void visitArithmetic(Arithmetic x) {
+    public void visitArithmetic(ArithmeticNode x) {
         trySwap(x);
 
         if (x.kind.isWord() || x.opcode == Bytecodes.WREMI) {
@@ -393,7 +394,7 @@
     }
 
     @Override
-    public void visitLogic(Logic x) {
+    public void visitLogic(LogicNode x) {
         trySwap(x);
 
         LIRItem right = new LIRItem(x.y(), this);
@@ -405,12 +406,12 @@
         logicOp(x.opcode, reg, left, right.result());
     }
 
-    private void trySwap(Binary x) {
+    private void trySwap(BinaryNode x) {
         // (tw) TODO: Check what this is for?
     }
 
     @Override
-    public void visitNormalizeCompare(NormalizeCompare x) {
+    public void visitNormalizeCompare(NormalizeCompareNode x) {
         LIRItem left = new LIRItem(x.x(), this);
         LIRItem right = new LIRItem(x.y(), this);
         if (!x.kind.isVoid() && x.x().kind.isLong()) {
@@ -433,7 +434,7 @@
     }
 
     @Override
-    public void visitConvert(Convert x) {
+    public void visitConvert(ConvertNode x) {
         CiValue input = load(x.value());
         CiVariable result = newVariable(x.kind);
         // arguments of lirConvert
@@ -458,7 +459,7 @@
     }
 
     @Override
-    public void visitLoopBegin(LoopBegin x) {
+    public void visitLoopBegin(LoopBeginNode x) {
     }
 
     @Override
@@ -467,7 +468,7 @@
     }
 
     @Override
-    public void visitMathIntrinsic(MathIntrinsic node) {
+    public void visitMathIntrinsic(MathIntrinsicNode node) {
         assert node.kind == CiKind.Double;
         LIRItem opd = new LIRItem(node.x(), this);
         opd.setDestroysRegister();
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/BlockWorkList.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/BlockWorkList.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,7 +22,7 @@
  */
 package com.oracle.max.graal.compiler.util;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 
 /**
  * This class implements a worklist for dealing with blocks. The worklist can
@@ -38,7 +38,7 @@
  * @author Ben L. Titzer
  */
 public class BlockWorkList {
-    Merge[] workList;
+    MergeNode[] workList;
     int[] workListNumbers;
     int workListIndex;
 
@@ -46,7 +46,7 @@
      * Adds a block to this list in an unsorted fashion, like a stack.
      * @param block the block to add
      */
-    public void add(Merge block) {
+    public void add(MergeNode block) {
         if (workList == null) {
             // worklist not allocated yet
             allocate();
@@ -64,7 +64,7 @@
      * @param block the block to add
      * @param number the number used to sort the block
      */
-    public void addSorted(Merge block, int number) {
+    public void addSorted(MergeNode block, int number) {
         if (workList == null) {
             // worklist not allocated yet
             allocate();
@@ -96,7 +96,7 @@
      * the last block added is returned.
      * @return the next block in the list
      */
-    public Merge removeFromWorkList() {
+    public MergeNode removeFromWorkList() {
         if (workListIndex != 0) {
             return workList[--workListIndex];
         }
@@ -112,13 +112,13 @@
     }
 
     private void allocate() {
-        workList = new Merge[5];
+        workList = new MergeNode[5];
         workListNumbers = new int[5];
     }
 
     private void grow() {
         int prevLength = workList.length;
-        Merge[] nworkList = new Merge[prevLength * 3];
+        MergeNode[] nworkList = new MergeNode[prevLength * 3];
         System.arraycopy(workList, 0, nworkList, 0, prevLength);
         workList = nworkList;
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/GraphUtil.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/GraphUtil.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,9 +26,9 @@
 import java.util.Map.Entry;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.graph.NodeClass.NodeClassIterator;
@@ -39,18 +39,18 @@
 public class GraphUtil {
 
     public static interface ColoringLambda<T> {
-        T color(Iterable<T> incomming, Merge merge);
-        T danglingColor(Iterable<T> incomming, Merge merge);
+        T color(Iterable<T> incomming, MergeNode merge);
+        T danglingColor(Iterable<T> incomming, MergeNode merge);
     }
 
     /**
      * colors down, applying the lambda at merge points, starting at the pre-colored points.
      */
     public static <T> void colorCFGDown(NodeMap<T> colors, ColoringLambda<T> lambda) {
-        Set<Merge> delayed = new HashSet<Merge>();
+        Set<MergeNode> delayed = new HashSet<MergeNode>();
         Set<Node> currentPoints = new HashSet<Node>();
         Set<Node> otherPoints = new HashSet<Node>();
-        Set<Merge> otherMerges = new HashSet<Merge>();
+        Set<MergeNode> otherMerges = new HashSet<MergeNode>();
         for (Entry<Node, T> entry : colors.entries()) {
             currentPoints.add(entry.getKey());
         }
@@ -59,7 +59,7 @@
             for (Node node : currentPoints) {
                 otherMerges.addAll(colorCFGDownToMerge(node, colors.get(node), colors));
             }
-            for (Merge merge : otherMerges) {
+            for (MergeNode merge : otherMerges) {
                 incomming.clear();
                 for (EndNode end : merge.cfgPredecessors()) {
                     incomming.add(colors.get(end));
@@ -80,7 +80,7 @@
             otherPoints.clear();
             otherMerges.clear();
         }
-        for (Merge merge : delayed) {
+        for (MergeNode merge : delayed) {
             T color = lambda.danglingColor(incomming, merge);
             if (color != null) {
                 colors.set(merge, color);
@@ -88,29 +88,29 @@
         }
     }
 
-    private static <T> Collection<Merge> colorCFGDownToMerge(Node from, T color, NodeMap<T> colors) {
+    private static <T> Collection<MergeNode> colorCFGDownToMerge(Node from, T color, NodeMap<T> colors) {
         NodeFlood work = from.graph().createNodeFlood();
-        Collection<Merge> merges = new LinkedList<Merge>();
+        Collection<MergeNode> merges = new LinkedList<MergeNode>();
         work.add(from);
         for (Node node : work) {
             Node current = node;
             while (current != null) {
-                if (current instanceof Merge) {
-                    merges.add((Merge) current);
+                if (current instanceof MergeNode) {
+                    merges.add((MergeNode) current);
                     break;
                 }
                 colors.set(current, color);
-                if (current instanceof FixedNodeWithNext && !(current instanceof AbstractVectorNode) && !(current instanceof Invoke && ((Invoke) current).exceptionEdge() != null)) {
-                    current = ((FixedNodeWithNext) current).next();
+                if (current instanceof FixedWithNextNode && !(current instanceof AbstractVectorNode) && !(current instanceof InvokeNode && ((InvokeNode) current).exceptionEdge() != null)) {
+                    current = ((FixedWithNextNode) current).next();
                 } else if (current instanceof EndNode) {
                     current = ((EndNode) current).merge();
                 } else {
-                    if (current instanceof ControlSplit) {
+                    if (current instanceof ControlSplitNode) {
                         for (Node sux : current.cfgSuccessors()) {
                             work.add(sux);
                         }
-                    } else if (current instanceof Invoke && ((Invoke) current).exceptionEdge() != null) {
-                        Invoke invoke = (Invoke) current;
+                    } else if (current instanceof InvokeNode && ((InvokeNode) current).exceptionEdge() != null) {
+                        InvokeNode invoke = (InvokeNode) current;
                         work.add(invoke.next());
                         work.add(invoke.exceptionEdge());
                     } else if (current instanceof AbstractVectorNode) {
@@ -132,7 +132,7 @@
         ValueNode fixPhiInput(ValueNode input, T color);
         boolean explore(Node n);
         List<T> parentColors(T color);
-        Merge merge(T color);
+        MergeNode merge(T color);
     }
 
     // TODO (gd) rework that code around Phi handling : too complicated
@@ -148,9 +148,9 @@
         Set<T> colors = new HashSet<T>();
         try {
             for (Node node : work) {
-                if (node instanceof Phi) {
-                    Phi phi = (Phi) node;
-                    Merge merge = phi.merge();
+                if (node instanceof PhiNode) {
+                    PhiNode phi = (PhiNode) node;
+                    MergeNode merge = phi.merge();
                     for (int i = 0; i < phi.valueCount(); i++) {
                         ValueNode v = phi.valueAt(i);
                         if (v != null) {
@@ -176,9 +176,9 @@
                     }
                     if (originalColoringColor == null) {
                         for (Node usage : node.dataUsages()) {
-                            if (usage instanceof Phi) {
-                                Phi phi = (Phi) usage;
-                                Merge merge = phi.merge();
+                            if (usage instanceof PhiNode) {
+                                PhiNode phi = (PhiNode) usage;
+                                MergeNode merge = phi.merge();
                                 for (int i = 0; i < phi.valueCount(); i++) {
                                     ValueNode v = phi.valueAt(i);
                                     if (v == node) {
@@ -230,7 +230,7 @@
                                     colorQueue.offer(color);
                                     continue;
                                 }
-                                Phi phi = new Phi(((ValueNode) node).kind, lambda.merge(color), PhiType.Value, node.graph());
+                                PhiNode phi = new PhiNode(((ValueNode) node).kind, lambda.merge(color), PhiType.Value, node.graph());
                                 for (T parentColor : parentColors) {
                                     Node input = newNodes.get(parentColor);
                                     phi.addInput((ValueNode) input);
@@ -255,9 +255,9 @@
                                 dataUsages.add(usage);
                             }
                             for (Node usage : dataUsages) {
-                                if (usage instanceof Phi) {
-                                    Phi phi = (Phi) usage;
-                                    Merge merge = phi.merge();
+                                if (usage instanceof PhiNode) {
+                                    PhiNode phi = (PhiNode) usage;
+                                    MergeNode merge = phi.merge();
                                     for (int i = 0; i < phi.valueCount(); i++) {
                                         ValueNode v = phi.valueAt(i);
                                         if (v == node) {
@@ -280,13 +280,13 @@
                     if (node instanceof StateSplit) {
                         FrameState stateAfter = ((StateSplit) node).stateAfter();
                         if (stateAfter != null && lambda.explore(stateAfter) && !work.isNew(stateAfter)) {
-                            if (!(node instanceof Merge && coloring.get(((Merge) node).next()) == null)) { // not dangling colored merge
+                            if (!(node instanceof MergeNode && coloring.get(((MergeNode) node).next()) == null)) { // not dangling colored merge
                                 work.add(stateAfter);
                             }
                         }
                     }
 
-                    if (node instanceof Merge) {
+                    if (node instanceof MergeNode) {
                         for (Node usage : node.usages()) {
                             if (!work.isNew(usage)) {
                                 work.add(usage);
@@ -294,8 +294,8 @@
                         }
                     }
 
-                    if (node instanceof LoopEnd) {
-                        work.add(((LoopEnd) node).loopBegin());
+                    if (node instanceof LoopEndNode) {
+                        work.add(((LoopEndNode) node).loopBegin());
                     }
 
                     for (Node input : node.dataInputs()) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/LoopUtil.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,9 +26,10 @@
 import java.util.Map.Entry;
 
 import com.oracle.max.graal.compiler.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
+import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.loop.*;
 import com.oracle.max.graal.compiler.observer.*;
 import com.oracle.max.graal.compiler.schedule.*;
 import com.oracle.max.graal.compiler.util.GraphUtil.ColorSplitingLambda;
@@ -42,20 +43,20 @@
 public class LoopUtil {
 
     public static class Loop {
-        private final LoopBegin loopBegin;
+        private final LoopBeginNode loopBegin;
         private NodeBitMap cfgNodes;
         private Loop parent;
         private NodeBitMap exits;
         private NodeBitMap inOrBefore;
         private NodeBitMap inOrAfter;
         private NodeBitMap nodes;
-        public Loop(LoopBegin loopBegin, NodeBitMap nodes, NodeBitMap exits) {
+        public Loop(LoopBeginNode loopBegin, NodeBitMap nodes, NodeBitMap exits) {
             this.loopBegin = loopBegin;
             this.cfgNodes = nodes;
             this.exits = exits;
         }
 
-        public LoopBegin loopBegin() {
+        public LoopBeginNode loopBegin() {
             return loopBegin;
         }
 
@@ -119,12 +120,12 @@
         public final FixedNode end;
         public final NodeMap<StateSplit> exits;
         public final NodeBitMap unaffectedExits;
-        public final NodeMap<Placeholder> phis;
+        public final NodeMap<PlaceholderNode> phis;
         public final NodeMap<Node> phiInits;
         public final NodeMap<Node> dataOut;
         public final NodeBitMap exitFrameStates;
         public final NodeBitMap peeledNodes;
-        public PeelingResult(FixedNode begin, FixedNode end, NodeMap<StateSplit> exits, NodeMap<Placeholder> phis, NodeMap<Node> phiInits, NodeMap<Node> dataOut, NodeBitMap unaffectedExits, NodeBitMap exitFrameStates, NodeBitMap peeledNodes) {
+        public PeelingResult(FixedNode begin, FixedNode end, NodeMap<StateSplit> exits, NodeMap<PlaceholderNode> phis, NodeMap<Node> phiInits, NodeMap<Node> dataOut, NodeBitMap unaffectedExits, NodeBitMap exitFrameStates, NodeBitMap peeledNodes) {
             this.begin = begin;
             this.end = end;
             this.exits = exits;
@@ -139,7 +140,7 @@
 
     public static List<Loop> computeLoops(Graph graph) {
         List<Loop> loops = new LinkedList<LoopUtil.Loop>();
-        for (LoopBegin loopBegin : graph.getNodes(LoopBegin.class)) {
+        for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.class)) {
             NodeBitMap cfgNodes = markUpCFG(loopBegin, loopBegin.loopEnd()); // computeLoopNodes(loopBegin);
             cfgNodes.mark(loopBegin);
             NodeBitMap exits = computeLoopExits(loopBegin, cfgNodes);
@@ -157,7 +158,7 @@
         return loops;
     }
 
-    public static NodeBitMap computeLoopExits(LoopBegin loopBegin, NodeBitMap cfgNodes) {
+    public static NodeBitMap computeLoopExits(LoopBeginNode loopBegin, NodeBitMap cfgNodes) {
         Graph graph = loopBegin.graph();
         NodeBitMap exits = graph.createNodeBitMap();
         for (Node n : cfgNodes) {
@@ -174,7 +175,7 @@
 
     private static boolean recurse = false;
     public static NodeBitMap computeLoopNodesFrom(Loop loop, FixedNode from) {
-        LoopBegin loopBegin = loop.loopBegin();
+        LoopBeginNode loopBegin = loop.loopBegin();
         NodeBitMap loopNodes = markUpCFG(loopBegin, from);
         loopNodes.mark(loopBegin);
         NodeBitMap inOrAfter = inOrAfter(loop, loopNodes, false);
@@ -199,11 +200,11 @@
         return loopNodes;
     }
 
-    public static NodeBitMap markUpCFG(LoopBegin loopBegin) {
+    public static NodeBitMap markUpCFG(LoopBeginNode loopBegin) {
         return markUpCFG(loopBegin, loopBegin.loopEnd());
     }
 
-    public static NodeBitMap markUpCFG(LoopBegin loopBegin, FixedNode from) {
+    public static NodeBitMap markUpCFG(LoopBeginNode loopBegin, FixedNode from) {
         NodeFlood workCFG = loopBegin.graph().createNodeFlood();
         workCFG.add(from);
         NodeBitMap loopNodes = loopBegin.graph().createNodeBitMap();
@@ -212,8 +213,8 @@
                 continue;
             }
             loopNodes.mark(n);
-            if (n instanceof LoopBegin) {
-                workCFG.add(((LoopBegin) n).loopEnd());
+            if (n instanceof LoopBeginNode) {
+                workCFG.add(((LoopBeginNode) n).loopEnd());
             }
             for (Node pred : n.cfgPredecessors()) {
                 workCFG.add(pred);
@@ -222,7 +223,7 @@
         return loopNodes;
     }
 
-    public static void inverseLoop(Loop loop, If split) {
+    public static void inverseLoop(Loop loop, IfNode split) {
         assert loop.cfgNodes().isMarked(split);
         FixedNode noExit = split.trueSuccessor();
         FixedNode exit = split.falseSuccessor();
@@ -238,8 +239,8 @@
         rewireInversion(peeling, loop, split);
 
         // move peeled part to the end
-        LoopBegin loopBegin = loop.loopBegin();
-        LoopEnd loopEnd = loopBegin.loopEnd();
+        LoopBeginNode loopBegin = loop.loopBegin();
+        LoopEndNode loopEnd = loopBegin.loopEnd();
         FixedNode lastNode = (FixedNode) loopEnd.predecessor();
         if (loopBegin.next() != lastNode) {
             lastNode.successors().replace(loopEnd, loopBegin.next());
@@ -249,7 +250,7 @@
 
         //rewire phi usage in peeled part
         int backIndex = loopBegin.phiPredecessorIndex(loopBegin.loopEnd());
-        for (Phi phi : loopBegin.phis()) {
+        for (PhiNode phi : loopBegin.phis()) {
             ValueNode backValue = phi.valueAt(backIndex);
             if (loop.nodes().isMarked(backValue) && peeling.peeledNodes.isNotNewNotMarked(backValue)) {
                 for (Node usage : phi.usages().snapshot()) {
@@ -275,7 +276,7 @@
     }
 
     public static void peelLoop(Loop loop) {
-        LoopEnd loopEnd = loop.loopBegin().loopEnd();
+        LoopEndNode loopEnd = loop.loopBegin().loopEnd();
         PeelingResult peeling = preparePeeling(loop, loopEnd);
         GraalCompilation compilation = GraalCompilation.compilation();
 
@@ -306,7 +307,7 @@
     }
 
     private static void rewirePeeling(PeelingResult peeling, Loop loop, FixedNode from, boolean inversion) {
-        LoopBegin loopBegin = loop.loopBegin();
+        LoopBeginNode loopBegin = loop.loopBegin();
         Graph graph = loopBegin.graph();
         Node loopPred = loopBegin.predecessor();
         loopPred.successors().replace(loopBegin.forwardEdge(), peeling.begin);
@@ -330,9 +331,9 @@
         }
         assert found;
         int phiInitIndex = loopBegin.phiPredecessorIndex(loopBegin.forwardEdge());
-        for (Entry<Node, Placeholder> entry : peeling.phis.entries()) {
-            Phi phi = (Phi) entry.getKey();
-            Placeholder p = entry.getValue();
+        for (Entry<Node, PlaceholderNode> entry : peeling.phis.entries()) {
+            PhiNode phi = (PhiNode) entry.getKey();
+            PlaceholderNode p = entry.getValue();
             ValueNode init = phi.valueAt(phiInitIndex);
             p.replaceAndDelete(init);
             for (Entry<Node, Node> dataEntry : peeling.dataOut.entries()) {
@@ -342,13 +343,13 @@
             }
         }
         for (Entry<Node, Node> entry : peeling.phiInits.entries()) {
-            Phi phi = (Phi) entry.getKey();
+            PhiNode phi = (PhiNode) entry.getKey();
             Node newInit = entry.getValue();
             phi.setValueAt(phiInitIndex, (ValueNode) newInit);
         }
 
         if (from == loopBegin.loopEnd()) {
-            for (InductionVariable iv : loopBegin.inductionVariables()) {
+            for (InductionVariableNode iv : loopBegin.inductionVariables()) {
                 iv.peelOneIteration();
             }
         }
@@ -363,7 +364,7 @@
             StateSplit newExit = entry.getValue();
             EndNode oEnd = new EndNode(graph);
             EndNode nEnd = new EndNode(graph);
-            Merge merge = new Merge(graph);
+            MergeNode merge = new MergeNode(graph);
             FrameState originalState = original.stateAfter();
             merge.addEnd(nEnd);
             merge.addEnd(oEnd);
@@ -379,7 +380,7 @@
         for (Entry<Node, StateSplit> entry : peeling.exits.entries()) {
             StateSplit original = (StateSplit) entry.getKey();
             EndNode oEnd = (EndNode) original.next();
-            Merge merge = oEnd.merge();
+            MergeNode merge = oEnd.merge();
             EndNode nEnd = merge.endAt(1 - merge.phiPredecessorIndex(oEnd));
             Node newExit = nEnd.predecessor();
             for (Entry<Node, Node> dataEntry : peeling.dataOut.entries()) {
@@ -391,8 +392,8 @@
                     newExitValues.set(originalValue, phiMap);
                 }
                 ValueNode backValue = null;
-                if (inversion && originalValue instanceof Phi && ((Phi) originalValue).merge() == loopBegin) {
-                    backValue = ((Phi) originalValue).valueAt(phiBackIndex);
+                if (inversion && originalValue instanceof PhiNode && ((PhiNode) originalValue).merge() == loopBegin) {
+                    backValue = ((PhiNode) originalValue).valueAt(phiBackIndex);
                     if (peeling.peeledNodes.isNotNewMarked(backValue)) {
                         backValue = null;
                     }
@@ -411,24 +412,24 @@
             NodeBitMap exitMergesPhis = graph.createNodeBitMap();
             for (Entry<Node, StateSplit> entry : peeling.exits.entries()) {
                 StateSplit newExit = entry.getValue();
-                Merge merge = ((EndNode) newExit.next()).merge();
+                MergeNode merge = ((EndNode) newExit.next()).merge();
                 exitMergesPhis.markAll(merge.phis());
             }
             for (Entry<Node, Node> entry : peeling.dataOut.entries()) {
                 ValueNode originalValue = (ValueNode) entry.getKey();
-                if (originalValue instanceof Phi && ((Phi) originalValue).merge() == loopBegin) {
+                if (originalValue instanceof PhiNode && ((PhiNode) originalValue).merge() == loopBegin) {
                     continue;
                 }
                 ValueNode newValue = (ValueNode) entry.getValue();
-                Phi phi = null;
+                PhiNode phi = null;
                 for (Node usage : originalValue.usages().snapshot()) {
                     if (exitMergesPhis.isMarked(usage) || (
                                     loop.nodes().isNotNewMarked(usage)
                                     && peeling.peeledNodes.isNotNewNotMarked(usage)
-                                    && !(usage instanceof Phi && ((Phi) usage).merge() == loopBegin))
+                                    && !(usage instanceof PhiNode && ((PhiNode) usage).merge() == loopBegin))
                                     && !(usage instanceof FrameState && ((FrameState) usage).block() == loopBegin)) {
                         if (phi == null) {
-                            phi = new Phi(originalValue.kind, loopBegin, PhiType.Value, graph);
+                            phi = new PhiNode(originalValue.kind, loopBegin, PhiType.Value, graph);
                             phi.addInput(newValue);
                             phi.addInput(originalValue);
                             NodeMap<ValueNode> exitMap = newExitValues.get(originalValue);
@@ -468,7 +469,7 @@
         // color
         GraphUtil.colorCFGDown(colors, new ColoringLambda<Node>() {
             @Override
-            public Node color(Iterable<Node> incomming, Merge merge) {
+            public Node color(Iterable<Node> incomming, MergeNode merge) {
                 Node color = null;
                 for (Node c : incomming) {
                     if (c == null) {
@@ -483,7 +484,7 @@
                 return color;
             }
             @Override
-            public Node danglingColor(Iterable<Node> incomming, Merge merge) {
+            public Node danglingColor(Iterable<Node> incomming, MergeNode merge) {
                 Node color = null;
                 for (Node c : incomming) {
                     if (color == null) {
@@ -523,7 +524,7 @@
                 if (value != null) {
                     return value;
                 }
-                Merge merge = (Merge) point;
+                MergeNode merge = (MergeNode) point;
                 ArrayList<ValueNode> values = new ArrayList<ValueNode>(merge.phiPredecessorCount());
                 ValueNode v = null;
                 boolean createPhi = false;
@@ -537,7 +538,7 @@
                     values.add(valueAt);
                 }
                 if (createPhi) {
-                    Phi phi = new Phi(kind, merge, PhiType.Value, merge.graph());
+                    PhiNode phi = new PhiNode(kind, merge, PhiType.Value, merge.graph());
                     valueMap.set(point, phi);
                     for (EndNode end : merge.cfgPredecessors()) {
                         phi.addInput(getValueAt(colors.get(end), valueMap, kind));
@@ -558,7 +559,7 @@
                     return false;
                 }
                 final FrameState frameState = (FrameState) n;
-                Merge block = frameState.block();
+                MergeNode block = frameState.block();
                 if (block != null) {
                     return colors.get(block.next()) == null;
                 }
@@ -609,10 +610,10 @@
             }
             @Override
             public List<Node> parentColors(Node color) {
-                if (!(color instanceof Merge)) {
+                if (!(color instanceof MergeNode)) {
                     return Collections.emptyList();
                 }
-                Merge merge = (Merge) color;
+                MergeNode merge = (MergeNode) color;
                 List<Node> parentColors = new ArrayList<Node>(merge.phiPredecessorCount());
                 for (EndNode pred : merge.cfgPredecessors()) {
                     parentColors.add(colors.get(pred));
@@ -620,14 +621,14 @@
                 return parentColors;
             }
             @Override
-            public Merge merge(Node color) {
-                return (Merge) color;
+            public MergeNode merge(Node color) {
+                return (MergeNode) color;
             }
         });
     }
 
     private static PeelingResult preparePeeling(Loop loop, FixedNode from) {
-        LoopBegin loopBegin = loop.loopBegin();
+        LoopBeginNode loopBegin = loop.loopBegin();
         Graph graph = loopBegin.graph();
         NodeBitMap marked = computeLoopNodesFrom(loop, from);
         if (from == loopBegin.loopEnd()) {
@@ -635,7 +636,7 @@
         }
         clearWithState(loopBegin, marked);
         Map<Node, Node> replacements = new HashMap<Node, Node>();
-        NodeMap<Placeholder> phis = graph.createNodeMap();
+        NodeMap<PlaceholderNode> phis = graph.createNodeMap();
         NodeMap<StateSplit> exits = graph.createNodeMap();
         NodeBitMap unaffectedExits = graph.createNodeBitMap();
         NodeBitMap clonedExits = graph.createNodeBitMap();
@@ -659,7 +660,7 @@
         for (Node n : marked) {
             if (!(n instanceof FrameState)) {
                 for (Node usage : n.dataUsages()) {
-                    if ((!marked.isMarked(usage) && !((usage instanceof Phi) && ((Phi) usage).merge() != loopBegin))
+                    if ((!marked.isMarked(usage) && !((usage instanceof PhiNode) && ((PhiNode) usage).merge() != loopBegin))
                                     || (marked.isMarked(usage) && exitFrameStates.isMarked(usage))) {
                         dataOut.mark(n);
                         break;
@@ -669,14 +670,14 @@
         }
 
         for (Node n : marked) {
-            if (n instanceof Phi && ((Phi) n).merge() == loopBegin) {
-                Placeholder p = new Placeholder(graph);
+            if (n instanceof PhiNode && ((PhiNode) n).merge() == loopBegin) {
+                PlaceholderNode p = new PlaceholderNode(graph);
                 replacements.put(n, p);
                 phis.set(n, p);
                 marked.clear(n);
             }
             for (Node input : n.dataInputs()) {
-                if (!marked.isMarked(input) && (!(input instanceof Phi) || ((Phi) input).merge() != loopBegin) && replacements.get(input) == null) {
+                if (!marked.isMarked(input) && (!(input instanceof PhiNode) || ((PhiNode) input).merge() != loopBegin) && replacements.get(input) == null) {
                     replacements.put(input, input);
                 }
             }
@@ -701,13 +702,13 @@
         NodeMap<Node> phiInits = graph.createNodeMap();
         int backIndex = loopBegin.phiPredecessorIndex(loopBegin.loopEnd());
         int fowardIndex = loopBegin.phiPredecessorIndex(loopBegin.forwardEdge());
-        for (Phi phi : loopBegin.phis()) {
+        for (PhiNode phi : loopBegin.phis()) {
             ValueNode backValue = phi.valueAt(backIndex);
             if (marked.isMarked(backValue)) {
                 phiInits.set(phi, duplicates.get(backValue));
             } else if (from == loopBegin.loopEnd()) {
-                if (backValue instanceof Phi && ((Phi) backValue).merge() == loopBegin) {
-                    Phi backPhi = (Phi) backValue;
+                if (backValue instanceof PhiNode && ((PhiNode) backValue).merge() == loopBegin) {
+                    PhiNode backPhi = (PhiNode) backValue;
                     phiInits.set(phi, backPhi.valueAt(fowardIndex));
                 } else {
                     phiInits.set(phi, backValue);
@@ -760,11 +761,11 @@
                 }
             }
             for (Node usage : n.usages()) {
-                if (usage instanceof Phi) { // filter out data graph cycles
-                    Phi phi = (Phi) usage;
-                    Merge merge = phi.merge();
-                    if (merge instanceof LoopBegin) {
-                        LoopBegin phiLoop = (LoopBegin) merge;
+                if (usage instanceof PhiNode) { // filter out data graph cycles
+                    PhiNode phi = (PhiNode) usage;
+                    MergeNode merge = phi.merge();
+                    if (merge instanceof LoopBeginNode) {
+                        LoopBeginNode phiLoop = (LoopBeginNode) merge;
                         int backIndex = phiLoop.phiPredecessorIndex(phiLoop.loopEnd());
                         if (phi.valueAt(backIndex) == n) {
                             continue;
@@ -801,13 +802,13 @@
                     work.add(n.predecessor());
                 }
             }
-            if (n instanceof Phi) { // filter out data graph cycles
-                Phi phi = (Phi) n;
+            if (n instanceof PhiNode) { // filter out data graph cycles
+                PhiNode phi = (PhiNode) n;
                 if (phi.type() == PhiType.Value) {
                     int backIndex = -1;
-                    Merge merge = phi.merge();
-                    if (merge instanceof LoopBegin && cfgNodes.isNotNewNotMarked(((LoopBegin) merge).loopEnd())) {
-                        LoopBegin phiLoop = (LoopBegin) merge;
+                    MergeNode merge = phi.merge();
+                    if (merge instanceof LoopBeginNode && cfgNodes.isNotNewNotMarked(((LoopBeginNode) merge).loopEnd())) {
+                        LoopBeginNode phiLoop = (LoopBeginNode) merge;
                         backIndex = phiLoop.phiPredecessorIndex(phiLoop.loopEnd());
                     }
                     for (int i = 0; i < phi.valueCount(); i++) {
@@ -828,7 +829,7 @@
                             work.add(sux);
                         }
                     }
-                    if (n instanceof LoopBegin && n != loop.loopBegin()) {
+                    if (n instanceof LoopBeginNode && n != loop.loopBegin()) {
                         Loop p = loop.parent;
                         boolean isParent = false;
                         while (p != null) {
@@ -839,7 +840,7 @@
                             p = p.parent;
                         }
                         if (!isParent) {
-                            work.add(((LoopBegin) n).loopEnd());
+                            work.add(((LoopBeginNode) n).loopEnd());
                         }
                     }
                 }
@@ -858,9 +859,9 @@
                         }
                     }
                 }
-                if (n instanceof Merge) { //add phis & counters
+                if (n instanceof MergeNode) { //add phis & counters
                     for (Node usage : n.dataUsages()) {
-                        if (!(usage instanceof LoopEnd)) {
+                        if (!(usage instanceof LoopEndNode)) {
                             work.add(usage);
                         }
                     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/Util.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/util/Util.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,7 +26,6 @@
 
 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.nodes.base.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -403,7 +402,7 @@
      * @param compareConstants {@code true} if equivalent constants should be considered equivalent
      * @return {@code true} if the instructions are equivalent; {@code false} otherwise
      */
-    public static boolean equivalent(FixedNodeWithNext x, FixedNodeWithNext y, boolean compareConstants) {
+    public static boolean equivalent(FixedWithNextNode x, FixedWithNextNode y, boolean compareConstants) {
         if (x == y) {
             return true;
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameStateBuilder.java	Wed Aug 10 00:34:29 2011 +0200
@@ -27,9 +27,8 @@
 
 import java.util.*;
 
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Phi.PhiType;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.base.PhiNode.PhiType;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 import com.sun.cri.ri.*;
@@ -71,7 +70,7 @@
         int index = 0;
         if (!isStatic(method.accessFlags())) {
             // add the receiver and assume it is non null
-            Local local = new Local(method.holder().kind(), javaIndex, graph);
+            LocalNode local = new LocalNode(method.holder().kind(), javaIndex, graph);
             local.setDeclaredType(method.holder());
             storeLocal(javaIndex, local);
             javaIndex = 1;
@@ -83,7 +82,7 @@
         for (int i = 0; i < max; i++) {
             RiType type = sig.argumentTypeAt(i, accessingClass);
             CiKind kind = type.kind().stackKind();
-            Local local = new Local(kind, index, graph);
+            LocalNode local = new LocalNode(kind, index, graph);
             if (type.isResolved()) {
                 local.setDeclaredType(type);
             }
@@ -346,13 +345,13 @@
     public ValueNode loadLocal(int i) {
         ValueNode x = locals[i];
         if (x != null) {
-            if (x instanceof Phi) {
-                assert ((Phi) x).type() == PhiType.Value;
+            if (x instanceof PhiNode) {
+                assert ((PhiNode) x).type() == PhiType.Value;
                 if (x.isDeleted()) {
                     return null;
                 }
             }
-            assert x.kind.isSingleWord() || locals[i + 1] == null || locals[i + 1] instanceof Phi;
+            assert x.kind.isSingleWord() || locals[i + 1] == null || locals[i + 1] instanceof PhiNode;
         }
         return x;
     }
--- a/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/deopt/FrameModifierImpl.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/deopt/FrameModifierImpl.java	Wed Aug 10 00:34:29 2011 +0200
@@ -26,7 +26,7 @@
 
 import com.oracle.max.graal.extensions.*;
 import com.sun.cri.ci.*;
-import com.sun.cri.ci.CiVirtualObject.*;
+import com.sun.cri.ci.CiVirtualObject.CiVirtualObjectFactory;
 import com.sun.cri.ri.*;
 
 
--- a/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/IntrinsifierImpl.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/IntrinsifierImpl.java	Wed Aug 10 00:34:29 2011 +0200
@@ -25,7 +25,7 @@
 import java.util.*;
 
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.extensions.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -38,7 +38,7 @@
     public Graph intrinsicGraph(RiRuntime runtime, RiMethod caller, int bci, RiMethod method, List<? extends Node> parameters) {
         if (method.holder().name().equals("Lcom/oracle/max/graal/examples/intrinsics/SafeAddExample;") && method.name().equals("safeAdd")) {
             CompilerGraph graph = new CompilerGraph(runtime);
-            Return returnNode = new Return(new SafeAddNode(new Local(CiKind.Long, 0, graph), new Local(CiKind.Long, 1, graph), graph), graph);
+            ReturnNode returnNode = new ReturnNode(new SafeAddNode(new LocalNode(CiKind.Long, 0, graph), new LocalNode(CiKind.Long, 1, graph), graph), graph);
             graph.start().setNext(returnNode);
             graph.setReturn(returnNode);
             return graph;
--- a/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/SafeAddNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/intrinsics/SafeAddNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,9 +22,9 @@
  */
 package com.oracle.max.graal.examples.intrinsics;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
-import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.bytecode.*;
 import com.sun.cri.ci.*;
--- a/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/opt/OptimizerImpl.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.examples/src/com/oracle/max/graal/examples/opt/OptimizerImpl.java	Wed Aug 10 00:34:29 2011 +0200
@@ -23,8 +23,8 @@
 package com.oracle.max.graal.examples.opt;
 
 import com.oracle.max.graal.compiler.debug.*;
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.util.*;
 import com.oracle.max.graal.examples.intrinsics.*;
 import com.oracle.max.graal.extensions.*;
@@ -42,7 +42,7 @@
         for (SafeAddNode safeAdd : graph.getNodes(SafeAddNode.class)) {
             if (!canOverflow(safeAdd)) {
                 // if an overflow is impossible: replace with normal add
-                IntegerAdd add = new IntegerAdd(CiKind.Int, safeAdd.x(), safeAdd.y(), graph);
+                IntegerAddNode add = new IntegerAddNode(CiKind.Int, safeAdd.x(), safeAdd.y(), graph);
                 safeAdd.replaceAndDelete(add);
             }
         }
@@ -52,11 +52,11 @@
         // if this SafeAddNode always adds 1 ...
         if (safeAdd.y().isConstant() && safeAdd.y().asConstant().asLong() == 1) {
             // ... to a phi ...
-            if (safeAdd.x() instanceof Phi) {
-                Phi phi = (Phi) safeAdd.x();
+            if (safeAdd.x() instanceof PhiNode) {
+                PhiNode phi = (PhiNode) safeAdd.x();
                 // ... that belongs to a loop and merges into itself ...
-                if (phi.merge() instanceof LoopBegin && phi.valueAt(1) == safeAdd) {
-                    LoopBegin loopBegin = (LoopBegin) phi.merge();
+                if (phi.merge() instanceof LoopBeginNode && phi.valueAt(1) == safeAdd) {
+                    LoopBeginNode loopBegin = (LoopBeginNode) phi.merge();
                     // ... then do the heavy analysis.
                     return canOverflow(phi, loopBegin);
                 }
@@ -65,7 +65,7 @@
         return true;
     }
 
-    private boolean canOverflow(Phi phi, LoopBegin loopBegin) {
+    private boolean canOverflow(PhiNode phi, LoopBeginNode loopBegin) {
         NodeBitMap nodes = LoopUtil.markUpCFG(loopBegin);
         NodeBitMap exits = LoopUtil.computeLoopExits(loopBegin, nodes);
         // look at all loop exits:
@@ -73,11 +73,11 @@
             TTY.println("exit: " + exit);
             Node pred = exit.predecessor();
             // if this exit is an If node ...
-            if (pred instanceof If) {
-                If ifNode = (If) pred;
+            if (pred instanceof IfNode) {
+                IfNode ifNode = (IfNode) pred;
                 // ... which compares ...
-                if (ifNode.compare() instanceof Compare) {
-                    Compare compare = (Compare) ifNode.compare();
+                if (ifNode.compare() instanceof CompareNode) {
+                    CompareNode compare = (CompareNode) ifNode.compare();
                     Condition cond = compare.condition();
                     ValueNode x = compare.x();
                     ValueNode y = compare.y();
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Wed Aug 10 00:34:29 2011 +0200
@@ -28,10 +28,11 @@
 
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.graph.*;
-import com.oracle.max.graal.compiler.ir.*;
-import com.oracle.max.graal.compiler.ir.Conditional.ConditionalStructure;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
+import com.oracle.max.graal.compiler.nodes.calc.ConditionalNode.ConditionalStructure;
 import com.oracle.max.graal.compiler.nodes.extended.*;
+import com.oracle.max.graal.compiler.nodes.java.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.runtime.nodes.*;
 import com.sun.cri.bytecode.*;
@@ -257,8 +258,8 @@
             return;
         }
 
-        if (n instanceof LoadField) {
-            LoadField field = (LoadField) n;
+        if (n instanceof LoadFieldNode) {
+            LoadFieldNode field = (LoadFieldNode) n;
             if (field.isVolatile()) {
                 return;
             }
@@ -266,7 +267,7 @@
             int displacement = ((HotSpotField) field.field()).offset();
             assert field.kind != CiKind.Illegal;
             ReadNode memoryRead = new ReadNode(field.field().kind().stackKind(), field.object(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph);
-            memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph)));
+            memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNullNode(field.object(), graph)));
             FixedNode next = field.next();
             field.setNext(null);
             memoryRead.setNext(next);
@@ -279,7 +280,7 @@
             Graph graph = field.graph();
             int displacement = ((HotSpotField) field.field()).offset();
             WriteNode memoryWrite = new WriteNode(CiKind.Illegal, field.object(), field.value(), LocationNode.create(field.field(), field.field().kind(), displacement, graph), graph);
-            memoryWrite.setGuard((GuardNode) tool.createGuard(new IsNonNull(field.object(), graph)));
+            memoryWrite.setGuard((GuardNode) tool.createGuard(new IsNonNullNode(field.object(), graph)));
             memoryWrite.setStateAfter(field.stateAfter());
             FixedNode next = field.next();
             field.setNext(null);
@@ -291,8 +292,8 @@
                 memoryWrite.setNext(next);
             }
             field.replaceAndDelete(memoryWrite);
-        } else if (n instanceof LoadIndexed) {
-            LoadIndexed loadIndexed = (LoadIndexed) n;
+        } else if (n instanceof LoadIndexedNode) {
+            LoadIndexedNode loadIndexed = (LoadIndexedNode) n;
             Graph graph = loadIndexed.graph();
             GuardNode boundsCheck = createBoundsCheck(loadIndexed, tool);
 
@@ -308,7 +309,7 @@
         } else if (n instanceof StoreIndexedNode) {
             StoreIndexedNode storeIndexed = (StoreIndexedNode) n;
             Graph graph = storeIndexed.graph();
-            Anchor anchor = new Anchor(graph);
+            AnchorNode anchor = new AnchorNode(graph);
             GuardNode boundsCheck = createBoundsCheck(storeIndexed, tool);
             anchor.addGuard(boundsCheck);
 
@@ -323,14 +324,14 @@
                 if (array.exactType() != null) {
                     RiType elementType = array.exactType().componentType();
                     if (elementType.superType() != null) {
-                        Constant type = new Constant(elementType.getEncoding(Representation.ObjectHub), graph);
-                        value = new CheckCast(type, value, graph);
+                        ConstantNode type = new ConstantNode(elementType.getEncoding(Representation.ObjectHub), graph);
+                        value = new CheckCastNode(type, value, graph);
                     } else {
                         assert elementType.name().equals("Ljava/lang/Object;") : elementType.name();
                     }
                 } else {
                     ReadNode arrayElementKlass = readArrayElementKlass(graph, array);
-                    value = new CheckCast(arrayElementKlass, value, graph);
+                    value = new CheckCastNode(arrayElementKlass, value, graph);
                 }
             }
             WriteNode memoryWrite = new WriteNode(elementKind.stackKind(), array, value, arrayLocation, graph);
@@ -356,7 +357,7 @@
             location.setIndex(load.offset());
             location.setIndexScalingEnabled(false);
             ReadNode memoryRead = new ReadNode(load.kind.stackKind(), load.object(), location, graph);
-            memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNull(load.object(), graph)));
+            memoryRead.setGuard((GuardNode) tool.createGuard(new IsNonNullNode(load.object(), graph)));
             FixedNode next = load.next();
             load.setNext(null);
             memoryRead.setNext(next);
@@ -390,8 +391,8 @@
         return LocationNode.create(LocationNode.getArrayLocation(elementKind), elementKind, config.getArrayOffset(elementKind), graph);
     }
 
-    private GuardNode createBoundsCheck(AccessIndexed n, CiLoweringTool tool) {
-        return (GuardNode) tool.createGuard(new Compare(n.index(), Condition.BT, n.length(), n.graph()));
+    private GuardNode createBoundsCheck(AccessIndexedNode n, CiLoweringTool tool) {
+        return (GuardNode) tool.createGuard(new CompareNode(n.index(), Condition.BT, n.length(), n.graph()));
     }
 
     @Override
@@ -403,9 +404,9 @@
             if (holderName.equals("Ljava/lang/Object;")) {
                 if (fullName.equals("getClass()Ljava/lang/Class;")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local receiver = new Local(CiKind.Object, 0, graph);
+                    LocalNode receiver = new LocalNode(CiKind.Object, 0, graph);
                     ReadNode klassOop = readHub(graph, receiver);
-                    Return ret = new Return(new ReadNode(CiKind.Object, klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.classMirrorOffset, graph), graph), graph);
+                    ReturnNode ret = new ReturnNode(new ReadNode(CiKind.Object, klassOop, LocationNode.create(LocationNode.FINAL_LOCATION, CiKind.Object, config.classMirrorOffset, graph), graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
@@ -413,11 +414,11 @@
             } else if (holderName.equals("Ljava/lang/System;")) {
                 if (fullName.equals("arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local src = new Local(CiKind.Object, 0, graph);
-                    Local srcPos = new Local(CiKind.Int, 1, graph);
-                    Local dest = new Local(CiKind.Object, 2, graph);
-                    Local destPos = new Local(CiKind.Int, 3, graph);
-                    ValueNode length = new Local(CiKind.Int, 4, graph);
+                    LocalNode src = new LocalNode(CiKind.Object, 0, graph);
+                    LocalNode srcPos = new LocalNode(CiKind.Int, 1, graph);
+                    LocalNode dest = new LocalNode(CiKind.Object, 2, graph);
+                    LocalNode destPos = new LocalNode(CiKind.Int, 3, graph);
+                    ValueNode length = new LocalNode(CiKind.Int, 4, graph);
                     src.setDeclaredType(((ValueNode) parameters.get(0)).declaredType());
                     dest.setDeclaredType(((ValueNode) parameters.get(2)).declaredType());
 
@@ -442,16 +443,16 @@
                     FrameState stateAfter = new FrameState(method, FrameState.AFTER_BCI, 0, 0, 0, false, graph);
 
                     // Add preconditions.
-                    FixedGuard guard = new FixedGuard(graph);
-                    ArrayLength srcLength = new ArrayLength(src, graph);
-                    ArrayLength destLength = new ArrayLength(dest, graph);
-                    IntegerAdd upperLimitSrc = new IntegerAdd(CiKind.Int, srcPos, length, graph);
-                    IntegerAdd upperLimitDest = new IntegerAdd(CiKind.Int, destPos, length, graph);
-                    guard.addNode(new Compare(srcPos, Condition.BE, srcLength, graph));
-                    guard.addNode(new Compare(destPos, Condition.BE, destLength, graph));
-                    guard.addNode(new Compare(length, Condition.GE, Constant.forInt(0, graph), graph));
-                    guard.addNode(new Compare(upperLimitSrc, Condition.LE, srcLength, graph));
-                    guard.addNode(new Compare(upperLimitDest, Condition.LE, destLength, graph));
+                    FixedGuardNode guard = new FixedGuardNode(graph);
+                    ArrayLengthNode srcLength = new ArrayLengthNode(src, graph);
+                    ArrayLengthNode destLength = new ArrayLengthNode(dest, graph);
+                    IntegerAddNode upperLimitSrc = new IntegerAddNode(CiKind.Int, srcPos, length, graph);
+                    IntegerAddNode upperLimitDest = new IntegerAddNode(CiKind.Int, destPos, length, graph);
+                    guard.addNode(new CompareNode(srcPos, Condition.BE, srcLength, graph));
+                    guard.addNode(new CompareNode(destPos, Condition.BE, destLength, graph));
+                    guard.addNode(new CompareNode(length, Condition.GE, ConstantNode.forInt(0, graph), graph));
+                    guard.addNode(new CompareNode(upperLimitSrc, Condition.LE, srcLength, graph));
+                    guard.addNode(new CompareNode(upperLimitDest, Condition.LE, destLength, graph));
                     graph.start().setNext(guard);
 
                     LocationNode location = LocationNode.create(LocationNode.FINAL_LOCATION, componentType, config.getArrayOffset(componentType), graph);
@@ -468,27 +469,27 @@
                     new WriteVectorNode(new IntegerAddVectorNode(reverseVector, destPos, graph), dest, location, reverseValues, graph);
                     reverseVector.setStateAfter(stateAfter);
 
-                    If ifNode = new If(new Compare(src, Condition.EQ, dest, graph), 0.5, graph);
+                    IfNode ifNode = new IfNode(new CompareNode(src, Condition.EQ, dest, graph), 0.5, graph);
                     guard.setNext(ifNode);
 
-                    If secondIf = new If(new Compare(srcPos, Condition.LT, destPos, graph), 0.5, graph);
+                    IfNode secondIf = new IfNode(new CompareNode(srcPos, Condition.LT, destPos, graph), 0.5, graph);
                     ifNode.setTrueSuccessor(secondIf);
 
                     secondIf.setTrueSuccessor(reverseVector);
 
-                    Merge merge1 = new Merge(graph);
+                    MergeNode merge1 = new MergeNode(graph);
                     merge1.addEnd(new EndNode(graph));
                     merge1.addEnd(new EndNode(graph));
                     merge1.setStateAfter(stateBefore);
 
 
-                    Invoke newInvoke = null;
+                    InvokeNode newInvoke = null;
                     if (componentType == CiKind.Object) {
                         ValueNode srcClass = readHub(graph, src);
                         ValueNode destClass = readHub(graph, dest);
-                        If elementClassIf = new If(new Compare(srcClass, Condition.EQ, destClass, graph), 0.5, graph);
+                        IfNode elementClassIf = new IfNode(new CompareNode(srcClass, Condition.EQ, destClass, graph), 0.5, graph);
                         ifNode.setFalseSuccessor(elementClassIf);
-                        newInvoke = new Invoke(bci, Bytecodes.INVOKESTATIC, CiKind.Void, new ValueNode[]{src, srcPos, dest, destPos, length}, method, method.signature().returnType(method.holder()), graph);
+                        newInvoke = new InvokeNode(bci, Bytecodes.INVOKESTATIC, CiKind.Void, new ValueNode[]{src, srcPos, dest, destPos, length}, method, method.signature().returnType(method.holder()), graph);
                         newInvoke.setCanInline(false);
                         newInvoke.setStateAfter(stateAfter);
                         elementClassIf.setFalseSuccessor(newInvoke);
@@ -500,7 +501,7 @@
                     secondIf.setFalseSuccessor(merge1.endAt(1));
                     merge1.setNext(normalVector);
 
-                    Merge merge2 = new Merge(graph);
+                    MergeNode merge2 = new MergeNode(graph);
                     merge2.addEnd(new EndNode(graph));
                     merge2.addEnd(new EndNode(graph));
                     merge2.setStateAfter(stateAfter);
@@ -513,7 +514,7 @@
                         newInvoke.setNext(merge2.endAt(2));
                     }
 
-                    Return ret = new Return(null, graph);
+                    ReturnNode ret = new ReturnNode(null, graph);
                     merge2.setNext(ret);
                     graph.setReturn(ret);
                     return graph;
@@ -521,25 +522,25 @@
             } else if (holderName.equals("Ljava/lang/Float;")) { //XXX (gd) the non-raw versions of (F/D)2(I/L) should return a sanitized NaN in the NaN case.
                 if (fullName.equals("floatToRawIntBits(F)I")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Return ret = new Return(new FPConversionNode(CiKind.Int, new Local(CiKind.Float, 0, graph), graph), graph);
+                    ReturnNode ret = new ReturnNode(new FPConversionNode(CiKind.Int, new LocalNode(CiKind.Float, 0, graph), graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 } else if (fullName.equals("floatToIntBits(F)I")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local arg = new Local(CiKind.Float, 0, graph);
-                    Compare isNan = new Compare(arg, Condition.NE, arg, graph);
+                    LocalNode arg = new LocalNode(CiKind.Float, 0, graph);
+                    CompareNode isNan = new CompareNode(arg, Condition.NE, arg, graph);
                     isNan.setUnorderedIsTrue(true);
                     FPConversionNode fpConv = new FPConversionNode(CiKind.Int, arg, graph);
-                    ConditionalStructure conditionalStructure = Conditional.createConditionalStructure(isNan, Constant.forInt(FLOATNAN_RAW_INT_BITS, graph), fpConv, 0.1);
-                    Return ret = new Return(conditionalStructure.phi, graph);
+                    ConditionalStructure conditionalStructure = ConditionalNode.createConditionalStructure(isNan, ConstantNode.forInt(FLOATNAN_RAW_INT_BITS, graph), fpConv, 0.1);
+                    ReturnNode ret = new ReturnNode(conditionalStructure.phi, graph);
                     graph.start().setNext(conditionalStructure.ifNode);
                     conditionalStructure.merge.setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 } else if (fullName.equals("intBitsToFloat(I)F")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Return ret = new Return(new FPConversionNode(CiKind.Float, new Local(CiKind.Int, 0, graph), graph), graph);
+                    ReturnNode ret = new ReturnNode(new FPConversionNode(CiKind.Float, new LocalNode(CiKind.Int, 0, graph), graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
@@ -547,25 +548,25 @@
             } else if (holderName.equals("Ljava/lang/Double;")) {
                 if (fullName.equals("doubleToRawLongBits(D)J")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Return ret = new Return(new FPConversionNode(CiKind.Long, new Local(CiKind.Double, 0, graph), graph), graph);
+                    ReturnNode ret = new ReturnNode(new FPConversionNode(CiKind.Long, new LocalNode(CiKind.Double, 0, graph), graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 } else if (fullName.equals("doubleToLongBits(D)J")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local arg = new Local(CiKind.Double, 0, graph);
-                    Compare isNan = new Compare(arg, Condition.NE, arg, graph);
+                    LocalNode arg = new LocalNode(CiKind.Double, 0, graph);
+                    CompareNode isNan = new CompareNode(arg, Condition.NE, arg, graph);
                     isNan.setUnorderedIsTrue(true);
                     FPConversionNode fpConv = new FPConversionNode(CiKind.Long, arg, graph);
-                    ConditionalStructure conditionalStructure = Conditional.createConditionalStructure(isNan, Constant.forLong(DOUBLENAN_RAW_LONG_BITS, graph), fpConv, 0.1);
-                    Return ret = new Return(conditionalStructure.phi, graph);
+                    ConditionalStructure conditionalStructure = ConditionalNode.createConditionalStructure(isNan, ConstantNode.forLong(DOUBLENAN_RAW_LONG_BITS, graph), fpConv, 0.1);
+                    ReturnNode ret = new ReturnNode(conditionalStructure.phi, graph);
                     graph.start().setNext(conditionalStructure.ifNode);
                     conditionalStructure.merge.setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 } else if (fullName.equals("longBitsToDouble(J)D")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Return ret = new Return(new FPConversionNode(CiKind.Double, new Local(CiKind.Long, 0, graph), graph), graph);
+                    ReturnNode ret = new ReturnNode(new FPConversionNode(CiKind.Double, new LocalNode(CiKind.Long, 0, graph), graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
@@ -573,7 +574,7 @@
             } else if (holderName.equals("Ljava/lang/Thread;")) {
                 if (fullName.equals("currentThread()Ljava/lang/Thread;")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Return ret = new Return(new CurrentThread(config.threadObjectOffset, graph), graph);
+                    ReturnNode ret = new ReturnNode(new CurrentThread(config.threadObjectOffset, graph), graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
@@ -581,40 +582,40 @@
             } else if (holderName.equals("Lsun/misc/Unsafe;")) {
                 if (fullName.equals("getObject(Ljava/lang/Object;J)Ljava/lang/Object;")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local object = new Local(CiKind.Object, 1, graph);
-                    Local offset = new Local(CiKind.Long, 2, graph);
+                    LocalNode object = new LocalNode(CiKind.Object, 1, graph);
+                    LocalNode offset = new LocalNode(CiKind.Long, 2, graph);
                     UnsafeLoad load = new UnsafeLoad(object, offset, CiKind.Object, graph);
-                    Return ret = new Return(load, graph);
+                    ReturnNode ret = new ReturnNode(load, graph);
                     load.setNext(ret);
                     graph.start().setNext(load);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 } else if (fullName.equals("putObject(Ljava/lang/Object;JLjava/lang/Object;)V")) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local object = new Local(CiKind.Object, 1, graph);
-                    Local offset = new Local(CiKind.Long, 2, graph);
-                    Local value = new Local(CiKind.Object, 3, graph);
+                    LocalNode object = new LocalNode(CiKind.Object, 1, graph);
+                    LocalNode offset = new LocalNode(CiKind.Long, 2, graph);
+                    LocalNode value = new LocalNode(CiKind.Object, 3, graph);
                     UnsafeStore store = new UnsafeStore(object, offset, value, CiKind.Object, graph);
                     FrameState frameState = new FrameState(method, FrameState.AFTER_BCI, 0, 0, 0, false, graph);
                     store.setStateAfter(frameState);
-                    Return ret = new Return(null, graph);
+                    ReturnNode ret = new ReturnNode(null, graph);
                     store.setNext(ret);
                     graph.start().setNext(store);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
                 }
             } else if (holderName.equals("Ljava/lang/Math;")) {
-                MathIntrinsic.Operation op = null;
+                MathIntrinsicNode.Operation op = null;
                 if (fullName.equals("abs(D)D")) {
-                    op = MathIntrinsic.Operation.ABS;
+                    op = MathIntrinsicNode.Operation.ABS;
                 } else if (fullName.equals("sqrt(D)D")) {
-                    op = MathIntrinsic.Operation.SQRT;
+                    op = MathIntrinsicNode.Operation.SQRT;
                 }
                 if (op != null) {
                     CompilerGraph graph = new CompilerGraph(this);
-                    Local value = new Local(CiKind.Double, 0, graph);
-                    MathIntrinsic min = new MathIntrinsic(value, op, graph);
-                    Return ret = new Return(min, graph);
+                    LocalNode value = new LocalNode(CiKind.Double, 0, graph);
+                    MathIntrinsicNode min = new MathIntrinsicNode(value, op, graph);
+                    ReturnNode ret = new ReturnNode(min, graph);
                     graph.start().setNext(ret);
                     graph.setReturn(ret);
                     intrinsicGraphs.put(method, graph);
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/ArrayWriteBarrier.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/ArrayWriteBarrier.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,8 +22,8 @@
  */
 package com.oracle.max.graal.runtime.nodes;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.extended.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/CurrentThread.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/CurrentThread.java	Wed Aug 10 00:34:29 2011 +0200
@@ -23,7 +23,7 @@
 package com.oracle.max.graal.runtime.nodes;
 
 import com.oracle.max.asm.target.amd64.*;
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/FPConversionNode.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,8 +22,8 @@
  */
 package com.oracle.max.graal.runtime.nodes;
 
-import com.oracle.max.graal.compiler.ir.*;
 import com.oracle.max.graal.compiler.nodes.base.*;
+import com.oracle.max.graal.compiler.nodes.calc.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -70,16 +70,16 @@
 
     @Override
     public Node canonical(NotifyReProcess reProcess) {
-        if (value instanceof Constant) {
+        if (value instanceof ConstantNode) {
             CiKind fromKind = value.kind;
             if (kind == CiKind.Int && fromKind == CiKind.Float) {
-                return Constant.forInt(Float.floatToRawIntBits(((Constant) value).asConstant().asFloat()), graph());
+                return ConstantNode.forInt(Float.floatToRawIntBits(((ConstantNode) value).asConstant().asFloat()), graph());
             } else if (kind == CiKind.Long && fromKind == CiKind.Double) {
-                return Constant.forLong(Double.doubleToRawLongBits(((Constant) value).asConstant().asDouble()), graph());
+                return ConstantNode.forLong(Double.doubleToRawLongBits(((ConstantNode) value).asConstant().asDouble()), graph());
             } else if (kind == CiKind.Float && fromKind == CiKind.Int) {
-                return Constant.forFloat(Float.intBitsToFloat(((Constant) value).asConstant().asInt()), graph());
+                return ConstantNode.forFloat(Float.intBitsToFloat(((ConstantNode) value).asConstant().asInt()), graph());
             } else if (kind == CiKind.Double && fromKind == CiKind.Long) {
-                return Constant.forDouble(Double.longBitsToDouble(((Constant) value).asConstant().asLong()), graph());
+                return ConstantNode.forDouble(Double.longBitsToDouble(((ConstantNode) value).asConstant().asLong()), graph());
             }
         }
         return this;
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/WriteBarrier.java	Tue Aug 09 23:56:10 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/nodes/WriteBarrier.java	Wed Aug 10 00:34:29 2011 +0200
@@ -22,14 +22,14 @@
  */
 package com.oracle.max.graal.runtime.nodes;
 
-import com.oracle.max.graal.compiler.ir.*;
+import com.oracle.max.graal.compiler.nodes.base.*;
 import com.oracle.max.graal.compiler.nodes.spi.*;
 import com.oracle.max.graal.graph.*;
 import com.oracle.max.graal.runtime.*;
 import com.sun.cri.ci.*;
 
 
-public abstract class WriteBarrier extends FixedNodeWithNext {
+public abstract class WriteBarrier extends FixedWithNextNode {
 
     public WriteBarrier(Graph graph) {
         super(CiKind.Illegal, graph);