# HG changeset patch # User Roland Schatz # Date 1393426504 -3600 # Node ID 34c07ef28bc9e8a46287eba17a2e0c9e99aaeee9 # Parent 3be1d30dd40f441396f3f424e2099a8f3c8d32ae Support integer arithmetic for arbitrary types. diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java --- a/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.compiler.test/src/com/oracle/graal/compiler/test/ea/EscapeAnalysisTest.java Wed Feb 26 15:55:04 2014 +0100 @@ -28,6 +28,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.loop.phases.*; import com.oracle.graal.nodes.calc.*; +import com.oracle.graal.nodes.type.*; import com.oracle.graal.nodes.virtual.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.schedule.*; @@ -278,7 +279,7 @@ @SuppressWarnings("unused") public static void testNewNodeSnippet() { - new IntegerAddNode(Kind.Int, null, null); + new IntegerAddNode(new IntegerStamp(32, false, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0xFFFFFFFF), null, null); } /** diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/debug/BenchmarkCounters.java Wed Feb 26 15:55:04 2014 +0100 @@ -336,7 +336,7 @@ ReadNode readArray = graph.add(new ReadNode(thread, arrayLocation, StampFactory.forKind(wordKind), BarrierType.NONE, false)); ConstantLocationNode location = ConstantLocationNode.create(LocationIdentity.ANY_LOCATION, Kind.Long, Unsafe.ARRAY_LONG_INDEX_SCALE * index, graph); ReadNode read = graph.add(new ReadNode(readArray, location, StampFactory.forKind(Kind.Long), BarrierType.NONE, false)); - IntegerAddNode add = graph.unique(new IntegerAddNode(Kind.Long, read, counter.getIncrement())); + IntegerAddNode add = graph.unique(new IntegerAddNode(StampFactory.forKind(Kind.Long), read, counter.getIncrement())); WriteNode write = graph.add(new WriteNode(readArray, add, location, BarrierType.NONE, false)); graph.addBeforeFixed(counter, thread); diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java --- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java Wed Feb 26 15:55:04 2014 +0100 @@ -598,35 +598,35 @@ switch (opcode) { case IADD: case LADD: - v = new IntegerAddNode(result, x, y); + v = new IntegerAddNode(StampFactory.forKind(result), x, y); break; case FADD: case DADD: - v = new FloatAddNode(result, x, y, isStrictFP); + v = new FloatAddNode(StampFactory.forKind(result), x, y, isStrictFP); break; case ISUB: case LSUB: - v = new IntegerSubNode(result, x, y); + v = new IntegerSubNode(StampFactory.forKind(result), x, y); break; case FSUB: case DSUB: - v = new FloatSubNode(result, x, y, isStrictFP); + v = new FloatSubNode(StampFactory.forKind(result), x, y, isStrictFP); break; case IMUL: case LMUL: - v = new IntegerMulNode(result, x, y); + v = new IntegerMulNode(StampFactory.forKind(result), x, y); break; case FMUL: case DMUL: - v = new FloatMulNode(result, x, y, isStrictFP); + v = new FloatMulNode(StampFactory.forKind(result), x, y, isStrictFP); break; case FDIV: case DDIV: - v = new FloatDivNode(result, x, y, isStrictFP); + v = new FloatDivNode(StampFactory.forKind(result), x, y, isStrictFP); break; case FREM: case DREM: - v = new FloatRemNode(result, x, y, isStrictFP); + v = new FloatRemNode(StampFactory.forKind(result), x, y, isStrictFP); break; default: throw new GraalInternalError("should not reach"); @@ -641,11 +641,11 @@ switch (opcode) { case IDIV: case LDIV: - v = new IntegerDivNode(result, x, y); + v = new IntegerDivNode(StampFactory.forKind(result), x, y); break; case IREM: case LREM: - v = new IntegerRemNode(result, x, y); + v = new IntegerRemNode(StampFactory.forKind(result), x, y); break; default: throw new GraalInternalError("should not reach"); @@ -664,15 +664,15 @@ switch (opcode) { case ISHL: case LSHL: - v = new LeftShiftNode(kind, x, s); + v = new LeftShiftNode(StampFactory.forKind(kind), x, s); break; case ISHR: case LSHR: - v = new RightShiftNode(kind, x, s); + v = new RightShiftNode(StampFactory.forKind(kind), x, s); break; case IUSHR: case LUSHR: - v = new UnsignedRightShiftNode(kind, x, s); + v = new UnsignedRightShiftNode(StampFactory.forKind(kind), x, s); break; default: throw new GraalInternalError("should not reach"); @@ -683,19 +683,20 @@ private void genLogicOp(Kind kind, int opcode) { ValueNode y = frameState.pop(kind); ValueNode x = frameState.pop(kind); + Stamp stamp = StampFactory.forKind(kind); BitLogicNode v; switch (opcode) { case IAND: case LAND: - v = new AndNode(kind, x, y); + v = new AndNode(stamp, x, y); break; case IOR: case LOR: - v = new OrNode(kind, x, y); + v = new OrNode(stamp, x, y); break; case IXOR: case LXOR: - v = new XorNode(kind, x, y); + v = new XorNode(stamp, x, y); break; default: throw new GraalInternalError("should not reach"); @@ -740,7 +741,7 @@ int delta = stream().readIncrement(); ValueNode x = frameState.loadLocal(index); ValueNode y = appendConstant(Constant.forInt(delta)); - frameState.storeLocal(index, append(new IntegerAddNode(Kind.Int, x, y))); + frameState.storeLocal(index, append(new IntegerAddNode(StampFactory.forKind(Kind.Int), x, y))); } private void genGoto() { diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/CountedLoopInfo.java Wed Feb 26 15:55:04 2014 +0100 @@ -29,6 +29,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.extended.*; +import com.oracle.graal.nodes.type.*; public class CountedLoopInfo { @@ -52,18 +53,18 @@ public ValueNode maxTripCountNode(boolean assumePositive) { StructuredGraph graph = iv.valueNode().graph(); - Kind kind = iv.valueNode().kind(); + Stamp stamp = iv.valueNode().stamp(); IntegerArithmeticNode range = IntegerArithmeticNode.sub(graph, end, iv.initNode()); if (oneOff) { if (iv.direction() == Direction.Up) { - range = IntegerArithmeticNode.add(graph, range, ConstantNode.forIntegerKind(kind, 1, graph)); + range = IntegerArithmeticNode.add(graph, range, ConstantNode.forIntegerStamp(stamp, 1, graph)); } else { - range = IntegerArithmeticNode.sub(graph, range, ConstantNode.forIntegerKind(kind, 1, graph)); + range = IntegerArithmeticNode.sub(graph, range, ConstantNode.forIntegerStamp(stamp, 1, graph)); } } - IntegerDivNode div = graph.add(new IntegerDivNode(kind, range, iv.strideNode())); + IntegerDivNode div = graph.add(new IntegerDivNode(iv.valueNode().stamp().unrestricted(), range, iv.strideNode())); graph.addBeforeFixed(loop.entryPoint(), div); - ConstantNode zero = ConstantNode.forIntegerKind(kind, 0, graph); + ConstantNode zero = ConstantNode.forIntegerStamp(stamp, 0, graph); if (assumePositive) { return div; } @@ -137,19 +138,19 @@ if (overflowGuard != null) { return overflowGuard; } - Kind kind = iv.valueNode().kind(); + IntegerStamp stamp = (IntegerStamp) iv.valueNode().stamp(); StructuredGraph graph = iv.valueNode().graph(); CompareNode cond; // we use a negated guard with a < condition to achieve a >= - ConstantNode one = ConstantNode.forIntegerKind(kind, 1, graph); + ConstantNode one = ConstantNode.forIntegerStamp(stamp, 1, graph); if (iv.direction() == Direction.Up) { - IntegerArithmeticNode v1 = sub(graph, ConstantNode.forIntegerKind(kind, kind.getMaxValue(), graph), sub(graph, iv.strideNode(), one)); + IntegerArithmeticNode v1 = sub(graph, ConstantNode.forIntegerStamp(stamp, IntegerStamp.defaultMaxValue(stamp.getBits(), stamp.isUnsigned()), graph), sub(graph, iv.strideNode(), one)); if (oneOff) { v1 = sub(graph, v1, one); } cond = graph.unique(new IntegerLessThanNode(v1, end)); } else { assert iv.direction() == Direction.Down; - IntegerArithmeticNode v1 = add(graph, ConstantNode.forIntegerKind(kind, kind.getMinValue(), graph), sub(graph, one, iv.strideNode())); + IntegerArithmeticNode v1 = add(graph, ConstantNode.forIntegerStamp(stamp, IntegerStamp.defaultMinValue(stamp.getBits(), stamp.isUnsigned()), graph), sub(graph, one, iv.strideNode())); if (oneOff) { v1 = add(graph, v1, one); } @@ -161,7 +162,7 @@ return overflowGuard; } - public Kind getKind() { - return iv.valueNode().kind(); + public IntegerStamp getStamp() { + return (IntegerStamp) iv.valueNode().stamp(); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,7 +22,6 @@ */ package com.oracle.graal.loop.phases; -import com.oracle.graal.api.meta.*; import com.oracle.graal.loop.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.cfg.*; @@ -38,7 +37,7 @@ if (context.getOptimisticOptimizations().useLoopLimitChecks()) { loops.detectedCountedLoops(); for (LoopEx loop : loops.countedLoops()) { - if (loop.lirLoop().children.isEmpty() && loop.counted().getKind() == Kind.Int) { + if (loop.lirLoop().children.isEmpty() && loop.counted().getStamp().getBits() <= 32) { boolean hasSafepoint = false; for (LoopEndNode loopEnd : loop.loopBegin().loopEnds()) { hasSafepoint |= loopEnd.canSafepoint(); diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -329,6 +329,13 @@ } } + /** + * Returns a node for a constant double that's compatible to a given stamp. + */ + public static ConstantNode forFloatingStamp(Stamp stamp, double value, StructuredGraph graph) { + return forFloatingKind(stamp.getStackKind(), value, graph); + } + public static ConstantNode defaultForKind(Kind kind, StructuredGraph graph) { switch (kind) { case Boolean: diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/AndNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "&") public final class AndNode extends BitLogicNode implements Canonicalizable { - public AndNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public AndNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,7 +44,7 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() & inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() & inputs[1].asLong()); } @Override @@ -53,28 +53,18 @@ return x(); } if (x().isConstant() && !y().isConstant()) { - return graph().unique(new AndNode(kind(), y(), x())); + return graph().unique(new AndNode(stamp(), y(), x())); } if (x().isConstant()) { - return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); + return ConstantNode.forPrimitive(stamp(), evalConst(x().asConstant(), y().asConstant()), graph()); } else if (y().isConstant()) { - if (kind() == Kind.Int) { - int c = y().asConstant().asInt(); - if (c == -1) { - return x(); - } - if (c == 0) { - return ConstantNode.forInt(0, graph()); - } - } else { - assert kind() == Kind.Long; - long c = y().asConstant().asLong(); - if (c == -1) { - return x(); - } - if (c == 0) { - return ConstantNode.forLong(0, graph()); - } + long rawY = y().asConstant().asLong(); + long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + if ((rawY & mask) == mask) { + return x(); + } + if ((rawY & mask) == 0) { + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } return BinaryNode.reassociate(this, ValueNode.isConstantPredicate()); } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; import com.oracle.graal.nodes.*; @@ -47,12 +46,12 @@ /** * Creates a new BinaryNode instance. * - * @param kind the result type of this instruction + * @param stamp the result type of this instruction * @param x the first input instruction * @param y the second input instruction */ - public BinaryNode(Kind kind, ValueNode x, ValueNode y) { - super(StampFactory.forKind(kind)); + public BinaryNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp); this.x = x; this.y = y; } @@ -84,53 +83,38 @@ } public static BinaryNode add(StructuredGraph graph, ValueNode x, ValueNode y) { - assert x.kind() == y.kind(); - switch (x.kind()) { - case Byte: - case Char: - case Short: - case Int: - case Long: - return IntegerArithmeticNode.add(graph, x, y); - case Float: - case Double: - return graph.unique(new FloatAddNode(x.kind(), x, y, false)); - default: - throw GraalInternalError.shouldNotReachHere(); + assert x.stamp().isCompatible(y.stamp()); + Stamp stamp = x.stamp(); + if (stamp instanceof IntegerStamp) { + return IntegerArithmeticNode.add(graph, x, y); + } else if (stamp instanceof FloatStamp) { + return graph.unique(new FloatAddNode(stamp, x, y, false)); + } else { + throw GraalInternalError.shouldNotReachHere(); } } public static BinaryNode sub(StructuredGraph graph, ValueNode x, ValueNode y) { - assert x.kind() == y.kind(); - switch (x.kind()) { - case Byte: - case Char: - case Short: - case Int: - case Long: - return IntegerArithmeticNode.sub(graph, x, y); - case Float: - case Double: - return graph.unique(new FloatSubNode(x.kind(), x, y, false)); - default: - throw GraalInternalError.shouldNotReachHere(); + assert x.stamp().isCompatible(y.stamp()); + Stamp stamp = x.stamp(); + if (stamp instanceof IntegerStamp) { + return IntegerArithmeticNode.sub(graph, x, y); + } else if (stamp instanceof FloatStamp) { + return graph.unique(new FloatSubNode(stamp, x, y, false)); + } else { + throw GraalInternalError.shouldNotReachHere(); } } public static BinaryNode mul(StructuredGraph graph, ValueNode x, ValueNode y) { - assert x.kind() == y.kind(); - switch (x.kind()) { - case Byte: - case Char: - case Short: - case Int: - case Long: - return IntegerArithmeticNode.mul(graph, x, y); - case Float: - case Double: - return graph.unique(new FloatMulNode(x.kind(), x, y, false)); - default: - throw GraalInternalError.shouldNotReachHere(); + assert x.stamp().isCompatible(y.stamp()); + Stamp stamp = x.stamp(); + if (stamp instanceof IntegerStamp) { + return IntegerArithmeticNode.mul(graph, x, y); + } else if (stamp instanceof FloatStamp) { + return graph.unique(new FloatMulNode(stamp, x, y, false)); + } else { + throw GraalInternalError.shouldNotReachHere(); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BitLogicNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BitLogicNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BitLogicNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,9 +22,9 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; /** * The {@code LogicNode} class definition. @@ -37,44 +37,23 @@ * @param x the first input into this node * @param y the second input into this node */ - public BitLogicNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); - assert kind == Kind.Int || kind == Kind.Long; + public BitLogicNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); + assert stamp instanceof IntegerStamp; } public static BitLogicNode and(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - switch (v1.kind()) { - case Int: - return graph.unique(new AndNode(Kind.Int, v1, v2)); - case Long: - return graph.unique(new AndNode(Kind.Long, v1, v2)); - default: - throw ValueNodeUtil.shouldNotReachHere(); - } + assert v1.stamp().isCompatible(v2.stamp()); + return graph.unique(new AndNode(v1.stamp(), v1, v2)); } public static BitLogicNode or(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - switch (v1.kind()) { - case Int: - return graph.unique(new OrNode(Kind.Int, v1, v2)); - case Long: - return graph.unique(new OrNode(Kind.Long, v1, v2)); - default: - throw ValueNodeUtil.shouldNotReachHere(); - } + assert v1.stamp().isCompatible(v2.stamp()); + return graph.unique(new OrNode(v1.stamp(), v1, v2)); } public static BitLogicNode xor(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - switch (v1.kind()) { - case Int: - return graph.unique(new XorNode(Kind.Int, v1, v2)); - case Long: - return graph.unique(new XorNode(Kind.Long, v1, v2)); - default: - throw ValueNodeUtil.shouldNotReachHere(); - } + assert v1.stamp().isCompatible(v2.stamp()); + return graph.unique(new XorNode(v1.stamp(), v1, v2)); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -49,8 +49,8 @@ } public ConditionalNode(LogicNode condition, ValueNode trueValue, ValueNode falseValue) { - super(trueValue.kind(), trueValue, falseValue); - assert trueValue.kind() == falseValue.kind(); + super(trueValue.stamp().meet(falseValue.stamp()), trueValue, falseValue); + assert trueValue.stamp().isCompatible(falseValue.stamp()); this.condition = condition; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FixedBinaryNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FixedBinaryNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FixedBinaryNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,7 +22,6 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.type.*; @@ -39,8 +38,8 @@ return y; } - public FixedBinaryNode(Kind kind, ValueNode x, ValueNode y) { - super(StampFactory.forKind(kind)); + public FixedBinaryNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp); this.x = x; this.y = y; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatAddNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -27,20 +27,22 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "+") public final class FloatAddNode extends FloatArithmeticNode implements Canonicalizable { - public FloatAddNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y, isStrictFP); + public FloatAddNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y, isStrictFP); } public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - if (kind() == Kind.Float) { + assert inputs[0].getKind() == inputs[1].getKind(); + if (inputs[0].getKind() == Kind.Float) { return Constant.forFloat(inputs[0].asFloat() + inputs[1].asFloat()); } else { - assert kind() == Kind.Double; + assert inputs[0].getKind() == Kind.Double; return Constant.forDouble(inputs[0].asDouble() + inputs[1].asDouble()); } } @@ -48,22 +50,14 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && !y().isConstant()) { - return graph().unique(new FloatAddNode(kind(), y(), x(), isStrictFP())); + return graph().unique(new FloatAddNode(stamp(), y(), x(), isStrictFP())); } if (x().isConstant()) { return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); } else if (y().isConstant()) { - if (kind() == Kind.Float) { - float c = y().asConstant().asFloat(); - if (c == 0.0f) { - return x(); - } - } else { - assert kind() == Kind.Double; - double c = y().asConstant().asDouble(); - if (c == 0.0) { - return x(); - } + Constant c = y().asConstant(); + if ((c.getKind() == Kind.Float && c.asFloat() == 0.0f) || (c.getKind() == Kind.Double && c.asDouble() == 0.0)) { + return x(); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatArithmeticNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatArithmeticNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,17 +22,17 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public abstract class FloatArithmeticNode extends BinaryNode implements ArithmeticLIRLowerable { private final boolean isStrictFP; - public FloatArithmeticNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y); - assert kind.isNumericFloat(); + public FloatArithmeticNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y); + assert stamp instanceof FloatStamp; this.isStrictFP = isStrictFP; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatDivNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -27,20 +27,22 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "/") public final class FloatDivNode extends FloatArithmeticNode implements Canonicalizable { - public FloatDivNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y, isStrictFP); + public FloatDivNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y, isStrictFP); } public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - if (kind() == Kind.Float) { + assert inputs[0].getKind() == inputs[1].getKind(); + if (inputs[0].getKind() == Kind.Float) { return Constant.forFloat(inputs[0].asFloat() / inputs[1].asFloat()); } else { - assert kind() == Kind.Double; + assert inputs[0].getKind() == Kind.Double; return Constant.forDouble(inputs[0].asDouble() / inputs[1].asDouble()); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatEqualsNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,9 +22,9 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "==") public final class FloatEqualsNode extends CompareNode { @@ -37,8 +37,8 @@ */ public FloatEqualsNode(ValueNode x, ValueNode y) { super(x, y); - assert x.kind() == Kind.Double || x.kind() == Kind.Float; - assert y.kind() == Kind.Double || y.kind() == Kind.Float; + assert x.stamp() instanceof FloatStamp && y.stamp() instanceof FloatStamp; + assert x.stamp().isCompatible(y.stamp()); } @Override diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatLessThanNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,10 +22,10 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "<") public final class FloatLessThanNode extends CompareNode { @@ -42,8 +42,8 @@ */ public FloatLessThanNode(ValueNode x, ValueNode y, boolean unorderedIsTrue) { super(x, y); - assert x.kind() == Kind.Double || x.kind() == Kind.Float; - assert y.kind() == Kind.Double || y.kind() == Kind.Float; + assert x.stamp() instanceof FloatStamp && y.stamp() instanceof FloatStamp; + assert x.stamp().isCompatible(y.stamp()); this.unorderedIsTrue = unorderedIsTrue; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatMulNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -27,20 +27,22 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "*") public final class FloatMulNode extends FloatArithmeticNode implements Canonicalizable { - public FloatMulNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y, isStrictFP); + public FloatMulNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y, isStrictFP); } public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - if (kind() == Kind.Float) { + assert inputs[0].getKind() == inputs[1].getKind(); + if (inputs[0].getKind() == Kind.Float) { return Constant.forFloat(inputs[0].asFloat() * inputs[1].asFloat()); } else { - assert kind() == Kind.Double; + assert inputs[0].getKind() == Kind.Double; return Constant.forDouble(inputs[0].asDouble() * inputs[1].asDouble()); } } @@ -48,7 +50,7 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && !y().isConstant()) { - return graph().unique(new FloatMulNode(kind(), y(), x(), isStrictFP())); + return graph().unique(new FloatMulNode(stamp(), y(), x(), isStrictFP())); } if (x().isConstant()) { return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatRemNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -27,20 +27,22 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "%") public final class FloatRemNode extends FloatArithmeticNode implements Canonicalizable { - public FloatRemNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y, isStrictFP); + public FloatRemNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y, isStrictFP); } public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - if (kind() == Kind.Float) { + assert inputs[0].getKind() == inputs[1].getKind(); + if (inputs[0].getKind() == Kind.Float) { return Constant.forFloat(inputs[0].asFloat() % inputs[1].asFloat()); } else { - assert kind() == Kind.Double; + assert inputs[0].getKind() == Kind.Double; return Constant.forDouble(inputs[0].asDouble() % inputs[1].asDouble()); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatSubNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -27,20 +27,22 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "-") public final class FloatSubNode extends FloatArithmeticNode implements Canonicalizable { - public FloatSubNode(Kind kind, ValueNode x, ValueNode y, boolean isStrictFP) { - super(kind, x, y, isStrictFP); + public FloatSubNode(Stamp stamp, ValueNode x, ValueNode y, boolean isStrictFP) { + super(stamp, x, y, isStrictFP); } public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - if (kind() == Kind.Float) { + assert inputs[0].getKind() == inputs[1].getKind(); + if (inputs[0].getKind() == Kind.Float) { return Constant.forFloat(inputs[0].asFloat() - inputs[1].asFloat()); } else { - assert kind() == Kind.Double; + assert inputs[0].getKind() == Kind.Double; return Constant.forDouble(inputs[0].asDouble() - inputs[1].asDouble()); } } @@ -48,24 +50,25 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x() == y()) { - return ConstantNode.forFloatingKind(kind(), 0.0f, graph()); + return ConstantNode.forFloatingStamp(stamp(), 0.0f, graph()); } if (x().isConstant() && y().isConstant()) { return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); } else if (y().isConstant()) { - if (kind() == Kind.Float) { - float c = y().asConstant().asFloat(); - if (c == 0.0f) { + Constant c = y().asConstant(); + if (c.getKind() == Kind.Float) { + float f = c.asFloat(); + if (f == 0.0f) { return x(); } - return graph().unique(new FloatAddNode(kind(), x(), ConstantNode.forFloat(-c, graph()), isStrictFP())); + return graph().unique(new FloatAddNode(stamp(), x(), ConstantNode.forFloat(-f, graph()), isStrictFP())); } else { - assert kind() == Kind.Double; - double c = y().asConstant().asDouble(); - if (c == 0.0) { + assert c.getKind() == Kind.Double; + double d = c.asDouble(); + if (d == 0.0) { return x(); } - return graph().unique(new FloatAddNode(kind(), x(), ConstantNode.forDouble(-c, graph()), isStrictFP())); + return graph().unique(new FloatAddNode(stamp(), x(), ConstantNode.forDouble(-d, graph()), isStrictFP())); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerAddNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "+") public class IntegerAddNode extends IntegerArithmeticNode implements Canonicalizable { - public IntegerAddNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public IntegerAddNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,13 +44,13 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() + inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() + inputs[1].asLong()); } @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && !y().isConstant()) { - return graph().unique(new IntegerAddNode(kind(), y(), x())); + return graph().unique(new IntegerAddNode(stamp(), y(), x())); } if (x() instanceof IntegerSubNode) { IntegerSubNode sub = (IntegerSubNode) x(); @@ -79,12 +79,7 @@ return reassociated; } if (c < 0) { - if (kind() == Kind.Int) { - return IntegerArithmeticNode.sub(graph(), x(), ConstantNode.forInt((int) -c, graph())); - } else { - assert kind() == Kind.Long; - return IntegerArithmeticNode.sub(graph(), x(), ConstantNode.forLong(-c, graph())); - } + return IntegerArithmeticNode.sub(graph(), x(), ConstantNode.forIntegerStamp(stamp(), -c, graph())); } } if (x() instanceof NegateNode) { diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerArithmeticNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,29 +22,27 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; public abstract class IntegerArithmeticNode extends BinaryNode implements ArithmeticLIRLowerable { - public IntegerArithmeticNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); - assert kind.isNumericInteger(); + public IntegerArithmeticNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); + assert stamp instanceof IntegerStamp; } public static IntegerAddNode add(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - return graph.unique(new IntegerAddNode(v1.kind(), v1, v2)); + return graph.unique(new IntegerAddNode(StampTool.add(v1.stamp(), v2.stamp()), v1, v2)); } public static IntegerMulNode mul(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - return graph.unique(new IntegerMulNode(v1.kind(), v1, v2)); + assert v1.stamp().isCompatible(v2.stamp()); + return graph.unique(new IntegerMulNode(v1.stamp().unrestricted(), v1, v2)); } public static IntegerSubNode sub(StructuredGraph graph, ValueNode v1, ValueNode v2) { - assert v1.kind() == v2.kind(); - return graph.unique(new IntegerSubNode(v1.kind(), v1, v2)); + return graph.unique(new IntegerSubNode(StampTool.sub(v1.stamp(), v2.stamp()), v1, v2)); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerDivNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -33,8 +32,8 @@ @NodeInfo(shortName = "/") public class IntegerDivNode extends FixedBinaryNode implements Canonicalizable, Lowerable, LIRLowerable { - public IntegerDivNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public IntegerDivNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -45,16 +44,11 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && y().isConstant()) { - long yConst = y().asConstant().asLong(); - if (yConst == 0) { + long y = y().asConstant().asLong(); + if (y == 0) { return this; // this will trap, can not canonicalize } - if (kind() == Kind.Int) { - return ConstantNode.forInt(x().asConstant().asInt() / (int) yConst, graph()); - } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(x().asConstant().asLong() / yConst, graph()); - } + return ConstantNode.forIntegerStamp(stamp(), x().asConstant().asLong() / y, graph()); } else if (y().isConstant()) { long c = y().asConstant().asLong(); if (c == 1) { @@ -65,23 +59,18 @@ } long abs = Math.abs(c); if (CodeUtil.isPowerOf2(abs) && x().stamp() instanceof IntegerStamp) { + Stamp unrestricted = stamp().unrestricted(); ValueNode dividend = x(); IntegerStamp stampX = (IntegerStamp) x().stamp(); int log2 = CodeUtil.log2(abs); // no rounding if dividend is positive or if its low bits are always 0 if (stampX.canBeNegative() || (stampX.upMask() & (abs - 1)) != 0) { - int bits; - if (kind().getStackKind() == Kind.Int) { - bits = 32; - } else { - assert kind() == Kind.Long; - bits = 64; - } - RightShiftNode sign = graph().unique(new RightShiftNode(kind(), x(), ConstantNode.forInt(bits - 1, graph()))); - UnsignedRightShiftNode round = graph().unique(new UnsignedRightShiftNode(kind(), sign, ConstantNode.forInt(bits - log2, graph()))); + int bits = PrimitiveStamp.getBits(stamp()); + RightShiftNode sign = graph().unique(new RightShiftNode(unrestricted, x(), ConstantNode.forInt(bits - 1, graph()))); + UnsignedRightShiftNode round = graph().unique(new UnsignedRightShiftNode(unrestricted, sign, ConstantNode.forInt(bits - log2, graph()))); dividend = IntegerArithmeticNode.add(graph(), dividend, round); } - RightShiftNode shift = graph().unique(new RightShiftNode(kind(), dividend, ConstantNode.forInt(log2, graph()))); + RightShiftNode shift = graph().unique(new RightShiftNode(unrestricted, dividend, ConstantNode.forInt(log2, graph()))); if (c < 0) { return graph().unique(new NegateNode(shift)); } @@ -94,8 +83,9 @@ IntegerSubNode integerSubNode = (IntegerSubNode) x(); if (integerSubNode.y() instanceof IntegerRemNode) { IntegerRemNode integerRemNode = (IntegerRemNode) integerSubNode.y(); - if (integerSubNode.kind() == this.kind() && integerRemNode.kind() == this.kind() && integerSubNode.x() == integerRemNode.x() && this.y() == integerRemNode.y()) { - return graph().add(new IntegerDivNode(kind(), integerSubNode.x(), this.y())); + if (integerSubNode.stamp().isCompatible(this.stamp()) && integerRemNode.stamp().isCompatible(this.stamp()) && integerSubNode.x() == integerRemNode.x() && + this.y() == integerRemNode.y()) { + return graph().add(new IntegerDivNode(stamp(), integerSubNode.x(), this.y())); } } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerMulNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -28,24 +28,25 @@ import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; @NodeInfo(shortName = "*") public class IntegerMulNode extends IntegerArithmeticNode implements Canonicalizable { - public IntegerMulNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public IntegerMulNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() * inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() * inputs[1].asLong()); } @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && !y().isConstant()) { - return graph().unique(new IntegerMulNode(kind(), y(), x())); + return graph().unique(new IntegerMulNode(stamp(), y(), x())); } if (x().isConstant()) { return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); @@ -55,11 +56,11 @@ return x(); } if (c == 0) { - return ConstantNode.defaultForKind(kind(), graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } long abs = Math.abs(c); if (abs > 0 && CodeUtil.isPowerOf2(abs)) { - LeftShiftNode shift = graph().unique(new LeftShiftNode(kind(), x(), ConstantNode.forInt(CodeUtil.log2(abs), graph()))); + LeftShiftNode shift = graph().unique(new LeftShiftNode(stamp().unrestricted(), x(), ConstantNode.forInt(CodeUtil.log2(abs), graph()))); if (c < 0) { return graph().unique(new NegateNode(shift)); } else { diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerRemNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -33,29 +32,24 @@ @NodeInfo(shortName = "%") public class IntegerRemNode extends FixedBinaryNode implements Canonicalizable, Lowerable, LIRLowerable { - public IntegerRemNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public IntegerRemNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override public Node canonical(CanonicalizerTool tool) { if (x().isConstant() && y().isConstant()) { - long yConst = y().asConstant().asLong(); - if (yConst == 0) { + long y = y().asConstant().asLong(); + if (y == 0) { return this; // this will trap, can not canonicalize } - if (kind() == Kind.Int) { - return ConstantNode.forInt(x().asConstant().asInt() % (int) yConst, graph()); - } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(x().asConstant().asLong() % yConst, graph()); - } + return ConstantNode.forIntegerStamp(stamp(), x().asConstant().asLong() % y, graph()); } else if (y().isConstant()) { long c = y().asConstant().asLong(); if (c == 1 || c == -1) { - return ConstantNode.forIntegerKind(kind(), 0, graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } else if (c > 0 && CodeUtil.isPowerOf2(c) && x().stamp() instanceof IntegerStamp && ((IntegerStamp) x().stamp()).isPositive()) { - return graph().unique(new AndNode(kind(), x(), ConstantNode.forIntegerKind(kind(), c - 1, graph()))); + return graph().unique(new AndNode(stamp(), x(), ConstantNode.forIntegerStamp(stamp(), c - 1, graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerSubNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "-") public class IntegerSubNode extends IntegerArithmeticNode implements Canonicalizable { - public IntegerSubNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public IntegerSubNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,13 +44,13 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() - inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() - inputs[1].asLong()); } @Override public Node canonical(CanonicalizerTool tool) { if (x() == y()) { - return ConstantNode.forIntegerKind(kind(), 0, graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } if (x() instanceof IntegerAddNode) { IntegerAddNode x = (IntegerAddNode) x(); @@ -98,12 +98,7 @@ return reassociated; } if (c < 0) { - if (kind() == Kind.Int) { - return IntegerArithmeticNode.add(graph(), x(), ConstantNode.forInt((int) -c, graph())); - } else { - assert kind() == Kind.Long; - return IntegerArithmeticNode.add(graph(), x(), ConstantNode.forLong(-c, graph())); - } + return IntegerArithmeticNode.add(graph(), x(), ConstantNode.forIntegerStamp(stamp(), -c, graph())); } } else if (x().isConstant()) { long c = x().asConstant().asLong(); diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerTestNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -53,7 +53,7 @@ * @param y the instruction that produces the second input to this instruction */ public IntegerTestNode(ValueNode x, ValueNode y) { - assert (x == null && y == null) || x.kind() == y.kind(); + assert (x == null && y == null) || x.stamp().isCompatible(y.stamp()); this.x = x; this.y = y; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/LeftShiftNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "<<") public final class LeftShiftNode extends ShiftNode implements Canonicalizable { - public LeftShiftNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public LeftShiftNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -79,19 +79,19 @@ if (total != (total & mask)) { return ConstantNode.forIntegerKind(kind(), 0, graph()); } - return graph().unique(new LeftShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph()))); + return graph().unique(new LeftShiftNode(stamp(), other.x(), ConstantNode.forInt(total, graph()))); } else if ((other instanceof RightShiftNode || other instanceof UnsignedRightShiftNode) && otherAmount == amount) { if (kind() == Kind.Long) { - return graph().unique(new AndNode(kind(), other.x(), ConstantNode.forLong(-1L << amount, graph()))); + return graph().unique(new AndNode(stamp(), other.x(), ConstantNode.forLong(-1L << amount, graph()))); } else { assert kind() == Kind.Int; - return graph().unique(new AndNode(kind(), other.x(), ConstantNode.forInt(-1 << amount, graph()))); + return graph().unique(new AndNode(stamp(), other.x(), ConstantNode.forInt(-1 << amount, graph()))); } } } } if (originalAmout != amount) { - return graph().unique(new LeftShiftNode(kind(), x(), ConstantNode.forInt(amount, graph()))); + return graph().unique(new LeftShiftNode(stamp(), x(), ConstantNode.forInt(amount, graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NormalizeCompareNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -25,6 +25,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; /** * Returns -1, 0, or 1 if either x < y, x == y, or x > y. If the comparison is undecided (one of the @@ -43,7 +44,7 @@ * less, false when greater. */ public NormalizeCompareNode(ValueNode x, ValueNode y, boolean isUnorderedLess) { - super(Kind.Int, x, y); + super(StampFactory.forKind(Kind.Int), x, y); this.isUnorderedLess = isUnorderedLess; } @@ -51,7 +52,7 @@ public void lower(LoweringTool tool) { LogicNode equalComp; LogicNode lessComp; - if (x().kind() == Kind.Double || x().kind() == Kind.Float) { + if (x().stamp() instanceof FloatStamp) { equalComp = graph().unique(new FloatEqualsNode(x(), y())); lessComp = graph().unique(new FloatLessThanNode(x(), y(), isUnorderedLess)); } else { diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/NotNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -48,7 +48,7 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 1; - return Constant.forIntegerKind(kind(), ~inputs[0].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), ~inputs[0].asLong()); } /** @@ -58,7 +58,6 @@ */ public NotNode(ValueNode x) { super(StampTool.not(x.stamp())); - assert x.kind() == Kind.Int || x.kind() == Kind.Long; this.x = x; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/OrNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "|") public final class OrNode extends BitLogicNode implements Canonicalizable { - public OrNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public OrNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,7 +44,7 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() | inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() | inputs[1].asLong()); } @Override @@ -53,28 +53,18 @@ return x(); } if (x().isConstant() && !y().isConstant()) { - return graph().unique(new OrNode(kind(), y(), x())); + return graph().unique(new OrNode(stamp(), y(), x())); } if (x().isConstant()) { - return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); + return ConstantNode.forPrimitive(stamp(), evalConst(x().asConstant(), y().asConstant()), graph()); } else if (y().isConstant()) { - if (kind() == Kind.Int) { - int c = y().asConstant().asInt(); - if (c == -1) { - return ConstantNode.forInt(-1, graph()); - } - if (c == 0) { - return x(); - } - } else { - assert kind() == Kind.Long; - long c = y().asConstant().asLong(); - if (c == -1) { - return ConstantNode.forLong(-1, graph()); - } - if (c == 0) { - return x(); - } + long rawY = y().asConstant().asLong(); + long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + if ((rawY & mask) == mask) { + return ConstantNode.forIntegerStamp(stamp(), mask, graph()); + } + if ((rawY & mask) == 0) { + return x(); } return BinaryNode.reassociate(this, ValueNode.isConstantPredicate()); } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/RightShiftNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = ">>") public final class RightShiftNode extends ShiftNode implements Canonicalizable { - public RightShiftNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public RightShiftNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -50,7 +50,7 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x().stamp() instanceof IntegerStamp && ((IntegerStamp) x().stamp()).isPositive()) { - return graph().unique(new UnsignedRightShiftNode(kind(), x(), y())); + return graph().unique(new UnsignedRightShiftNode(stamp(), x(), y())); } if (x().isConstant() && y().isConstant()) { return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); @@ -90,14 +90,14 @@ * full shift for this kind */ assert total >= mask; - return graph().unique(new RightShiftNode(kind(), other.x(), ConstantNode.forInt(mask, graph()))); + return graph().unique(new RightShiftNode(stamp(), other.x(), ConstantNode.forInt(mask, graph()))); } - return graph().unique(new RightShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph()))); + return graph().unique(new RightShiftNode(stamp(), other.x(), ConstantNode.forInt(total, graph()))); } } } if (originalAmout != amount) { - return graph().unique(new RightShiftNode(kind(), x(), ConstantNode.forInt(amount, graph()))); + return graph().unique(new RightShiftNode(stamp(), x(), ConstantNode.forInt(amount, graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ShiftNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -22,9 +22,9 @@ */ package com.oracle.graal.nodes.calc; -import com.oracle.graal.api.meta.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; /** * The {@code ShiftOp} class represents shift operations. @@ -37,7 +37,7 @@ * @param x the first input value * @param s the second input value */ - public ShiftNode(Kind kind, ValueNode x, ValueNode s) { - super(kind, x, s); + public ShiftNode(Stamp stamp, ValueNode x, ValueNode s) { + super(stamp, x, s); } } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedDivNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -33,8 +32,8 @@ @NodeInfo(shortName = "|/|") public class UnsignedDivNode extends FixedBinaryNode implements Canonicalizable, Lowerable, LIRLowerable { - public UnsignedDivNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public UnsignedDivNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,19 +43,14 @@ if (yConst == 0) { return this; // this will trap, cannot canonicalize } - if (kind() == Kind.Int) { - return ConstantNode.forInt(UnsignedMath.divide(x().asConstant().asInt(), (int) yConst), graph()); - } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(UnsignedMath.divide(x().asConstant().asLong(), yConst), graph()); - } + return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.divide(x().asConstant().asLong(), yConst), graph()); } else if (y().isConstant()) { long c = y().asConstant().asLong(); if (c == 1) { return x(); } if (CodeUtil.isPowerOf2(c)) { - return graph().unique(new UnsignedRightShiftNode(kind(), x(), ConstantNode.forInt(CodeUtil.log2(c), graph()))); + return graph().unique(new UnsignedRightShiftNode(stamp(), x(), ConstantNode.forInt(CodeUtil.log2(c), graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRemNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -23,7 +23,6 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.code.*; -import com.oracle.graal.api.meta.*; import com.oracle.graal.graph.*; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodes.*; @@ -33,8 +32,8 @@ @NodeInfo(shortName = "|%|") public class UnsignedRemNode extends FixedBinaryNode implements Canonicalizable, Lowerable, LIRLowerable { - public UnsignedRemNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public UnsignedRemNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,18 +43,13 @@ if (yConst == 0) { return this; // this will trap, cannot canonicalize } - if (kind() == Kind.Int) { - return ConstantNode.forInt(UnsignedMath.remainder(x().asConstant().asInt(), (int) yConst), graph()); - } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(UnsignedMath.remainder(x().asConstant().asLong(), yConst), graph()); - } + return ConstantNode.forIntegerStamp(stamp(), UnsignedMath.remainder(x().asConstant().asLong(), yConst), graph()); } else if (y().isConstant()) { long c = y().asConstant().asLong(); if (c == 1) { - return ConstantNode.forIntegerKind(kind(), 0, graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } else if (CodeUtil.isPowerOf2(c)) { - return graph().unique(new AndNode(kind(), x(), ConstantNode.forIntegerKind(kind(), c - 1, graph()))); + return graph().unique(new AndNode(stamp(), x(), ConstantNode.forIntegerStamp(stamp(), c - 1, graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnsignedRightShiftNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = ">>>") public final class UnsignedRightShiftNode extends ShiftNode implements Canonicalizable { - public UnsignedRightShiftNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public UnsignedRightShiftNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -79,19 +79,19 @@ if (total != (total & mask)) { return ConstantNode.forIntegerKind(kind(), 0, graph()); } - return graph().unique(new UnsignedRightShiftNode(kind(), other.x(), ConstantNode.forInt(total, graph()))); + return graph().unique(new UnsignedRightShiftNode(stamp(), other.x(), ConstantNode.forInt(total, graph()))); } else if (other instanceof LeftShiftNode && otherAmount == amount) { if (kind() == Kind.Long) { - return graph().unique(new AndNode(kind(), other.x(), ConstantNode.forLong(-1L >>> amount, graph()))); + return graph().unique(new AndNode(stamp(), other.x(), ConstantNode.forLong(-1L >>> amount, graph()))); } else { assert kind() == Kind.Int; - return graph().unique(new AndNode(kind(), other.x(), ConstantNode.forInt(-1 >>> amount, graph()))); + return graph().unique(new AndNode(stamp(), other.x(), ConstantNode.forInt(-1 >>> amount, graph()))); } } } } if (originalAmout != amount) { - return graph().unique(new UnsignedRightShiftNode(kind(), x(), ConstantNode.forInt(amount, graph()))); + return graph().unique(new UnsignedRightShiftNode(stamp(), x(), ConstantNode.forInt(amount, graph()))); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/XorNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -32,8 +32,8 @@ @NodeInfo(shortName = "^") public final class XorNode extends BitLogicNode implements Canonicalizable { - public XorNode(Kind kind, ValueNode x, ValueNode y) { - super(kind, x, y); + public XorNode(Stamp stamp, ValueNode x, ValueNode y) { + super(stamp, x, y); } @Override @@ -44,35 +44,26 @@ @Override public Constant evalConst(Constant... inputs) { assert inputs.length == 2; - return Constant.forIntegerKind(kind(), inputs[0].asLong() ^ inputs[1].asLong(), null); + return Constant.forPrimitiveInt(PrimitiveStamp.getBits(stamp()), inputs[0].asLong() ^ inputs[1].asLong()); } @Override public Node canonical(CanonicalizerTool tool) { if (x() == y()) { - return ConstantNode.forIntegerKind(kind(), 0, graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } if (x().isConstant() && !y().isConstant()) { - return graph().unique(new XorNode(kind(), y(), x())); + return graph().unique(new XorNode(stamp(), y(), x())); } if (x().isConstant()) { - return ConstantNode.forPrimitive(evalConst(x().asConstant(), y().asConstant()), graph()); + return ConstantNode.forPrimitive(stamp(), evalConst(x().asConstant(), y().asConstant()), graph()); } else if (y().isConstant()) { - if (kind() == Kind.Int) { - int c = y().asConstant().asInt(); - if (c == 0) { - return x(); - } else if (c == -1) { - return graph().unique(new NotNode(x())); - } - } else { - assert kind() == Kind.Long; - long c = y().asConstant().asLong(); - if (c == 0) { - return x(); - } else if (c == -1) { - return graph().unique(new NotNode(x())); - } + long rawY = y().asConstant().asLong(); + long mask = IntegerStamp.defaultMask(PrimitiveStamp.getBits(stamp())); + if ((rawY & mask) == 0) { + return x(); + } else if ((rawY & mask) == mask) { + return graph().unique(new NotNode(x())); } return BinaryNode.reassociate(this, ValueNode.isConstantPredicate()); } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastDynamicNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -76,7 +76,7 @@ if (ObjectStamp.isObjectAlwaysNull(object())) { return object(); } - if (hub.isConstant() && hub.kind() == Kind.Object && hub.asConstant().asObject() instanceof Class) { + if (hub.isConstant() && hub.asConstant().getKind() == Kind.Object && hub.asConstant().asObject() instanceof Class) { Class clazz = (Class) hub.asConstant().asObject(); ResolvedJavaType t = tool.getMetaAccess().lookupJavaType(clazz); return graph().add(new CheckCastNode(t, object(), null, forStoreCheck)); diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CompareAndSwapNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -64,7 +64,7 @@ public CompareAndSwapNode(ValueNode object, int displacement, ValueNode offset, ValueNode expected, ValueNode newValue) { super(StampFactory.forKind(Kind.Boolean.getStackKind())); - assert expected.kind() == newValue.kind(); + assert expected.stamp().isCompatible(newValue.stamp()); this.object = object; this.offset = offset; this.expected = expected; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitCountNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -37,18 +37,18 @@ @Input private ValueNode value; public BitCountNode(ValueNode value) { - super(StampFactory.forInteger(Kind.Int, 0, value.kind().getBitCount())); + super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits())); this.value = value; } @Override public Node canonical(CanonicalizerTool tool) { if (value.isConstant()) { - long v = value.asConstant().asLong(); - if (value.kind().getStackKind() == Kind.Int) { - return ConstantNode.forInt(Integer.bitCount((int) v), graph()); - } else if (value.kind() == Kind.Long) { - return ConstantNode.forInt(Long.bitCount(v), graph()); + Constant c = value.asConstant(); + if (c.getKind() == Kind.Int) { + return ConstantNode.forInt(Integer.bitCount(c.asInt()), graph()); + } else if (c.getKind() == Kind.Long) { + return ConstantNode.forInt(Long.bitCount(c.asLong()), graph()); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanForwardNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, 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 @@ -37,18 +37,18 @@ @Input private ValueNode value; public BitScanForwardNode(ValueNode value) { - super(StampFactory.forInteger(Kind.Int, 0, value.kind().getBitCount())); + super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits())); this.value = value; } @Override public Node canonical(CanonicalizerTool tool) { if (value.isConstant()) { - long v = value.asConstant().asLong(); - if (value.kind().getStackKind() == Kind.Int) { - return ConstantNode.forInt(Integer.numberOfTrailingZeros((int) v), graph()); - } else if (value.kind() == Kind.Long) { - return ConstantNode.forInt(Long.numberOfTrailingZeros(v), graph()); + Constant c = value.asConstant(); + if (c.getKind() == Kind.Int) { + return ConstantNode.forInt(Integer.numberOfTrailingZeros(c.asInt()), graph()); + } else if (c.getKind() == Kind.Long) { + return ConstantNode.forInt(Long.numberOfTrailingZeros(c.asLong()), graph()); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/BitScanReverseNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2014, 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 @@ -37,18 +37,18 @@ @Input private ValueNode value; public BitScanReverseNode(ValueNode value) { - super(StampFactory.forInteger(Kind.Int, 0, value.kind().getBitCount())); + super(StampFactory.forInteger(Kind.Int, 0, ((PrimitiveStamp) value.stamp()).getBits())); this.value = value; } @Override public Node canonical(CanonicalizerTool tool) { if (value.isConstant()) { - long v = value.asConstant().asLong(); - if (value.kind().getStackKind() == Kind.Int) { - return ConstantNode.forInt(31 - Integer.numberOfLeadingZeros((int) v), graph()); - } else if (value.kind() == Kind.Long) { - return ConstantNode.forInt(63 - Long.numberOfLeadingZeros(v), graph()); + Constant c = value.asConstant(); + if (c.getKind() == Kind.Int) { + return ConstantNode.forInt(31 - Integer.numberOfLeadingZeros(c.asInt()), graph()); + } else if (c.getKind() == Kind.Long) { + return ConstantNode.forInt(63 - Long.numberOfLeadingZeros(c.asLong()), graph()); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java --- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/nodes/MathIntrinsicNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -48,8 +48,8 @@ } public MathIntrinsicNode(ValueNode x, Operation op) { - super(StampFactory.forKind(x.kind())); - assert x.kind() == Kind.Double; + super(StampFactory.forKind(Kind.Double)); + assert x.stamp() instanceof FloatStamp && PrimitiveStamp.getBits(x.stamp()) == 64; this.x = x; this.operation = op; } diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerAddExactNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -38,8 +38,8 @@ public class IntegerAddExactNode extends IntegerAddNode implements Canonicalizable, IntegerExactArithmeticNode { public IntegerAddExactNode(ValueNode x, ValueNode y) { - super(x.kind(), x, y); - assert x.kind() == y.kind() && (x.kind() == Kind.Int || x.kind() == Kind.Long); + super(x.stamp().unrestricted(), x, y); + assert x.stamp().isCompatible(y.stamp()) && x.stamp() instanceof IntegerStamp; } @Override @@ -54,12 +54,15 @@ return graph().unique(new IntegerAddExactNode(y(), x())); } if (x().isConstant()) { + Constant xConst = x().asConstant(); + Constant yConst = y().asConstant(); + assert xConst.getKind() == yConst.getKind(); try { - if (kind() == Kind.Int) { - return ConstantNode.forInt(ExactMath.addExact(x().asConstant().asInt(), y().asConstant().asInt()), graph()); + if (xConst.getKind() == Kind.Int) { + return ConstantNode.forInt(ExactMath.addExact(xConst.asInt(), yConst.asInt()), graph()); } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(ExactMath.addExact(x().asConstant().asLong(), y().asConstant().asLong()), graph()); + assert xConst.getKind() == Kind.Long; + return ConstantNode.forLong(ExactMath.addExact(xConst.asLong(), yConst.asLong()), graph()); } } catch (ArithmeticException ex) { // The operation will result in an overflow exception, so do not canonicalize. diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulExactNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -28,6 +28,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; import com.oracle.truffle.api.*; /** @@ -37,8 +38,8 @@ public class IntegerMulExactNode extends IntegerMulNode implements Canonicalizable, IntegerExactArithmeticNode { public IntegerMulExactNode(ValueNode x, ValueNode y) { - super(x.kind(), x, y); - assert x.kind() == y.kind() && (x.kind() == Kind.Int || x.kind() == Kind.Long); + super(x.stamp().unrestricted(), x, y); + assert x.stamp().isCompatible(y.stamp()) && x.stamp() instanceof IntegerStamp; } @Override @@ -47,12 +48,15 @@ return graph().unique(new IntegerMulExactNode(y(), x())); } if (x().isConstant()) { + Constant xConst = x().asConstant(); + Constant yConst = y().asConstant(); + assert xConst.getKind() == yConst.getKind(); try { - if (kind() == Kind.Int) { - return ConstantNode.forInt(ExactMath.multiplyExact(x().asConstant().asInt(), y().asConstant().asInt()), graph()); + if (xConst.getKind() == Kind.Int) { + return ConstantNode.forInt(ExactMath.multiplyExact(xConst.asInt(), yConst.asInt()), graph()); } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(ExactMath.multiplyExact(x().asConstant().asLong(), y().asConstant().asLong()), graph()); + assert xConst.getKind() == Kind.Long; + return ConstantNode.forLong(ExactMath.multiplyExact(xConst.asLong(), yConst.asLong()), graph()); } } catch (ArithmeticException ex) { // The operation will result in an overflow exception, so do not canonicalize. @@ -63,7 +67,7 @@ return x(); } if (c == 0) { - return ConstantNode.defaultForKind(kind(), graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } } return this; diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactNode.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerSubExactNode.java Wed Feb 26 15:55:04 2014 +0100 @@ -38,8 +38,8 @@ public class IntegerSubExactNode extends IntegerSubNode implements Canonicalizable, IntegerExactArithmeticNode { public IntegerSubExactNode(ValueNode x, ValueNode y) { - super(x.kind(), x, y); - assert x.kind() == y.kind() && (x.kind() == Kind.Int || x.kind() == Kind.Long); + super(StampTool.sub(x.stamp(), y.stamp()), x, y); + assert x.stamp().isCompatible(y.stamp()) && x.stamp() instanceof IntegerStamp; } @Override @@ -51,15 +51,18 @@ @Override public Node canonical(CanonicalizerTool tool) { if (x() == y()) { - return ConstantNode.forIntegerKind(kind(), 0, graph()); + return ConstantNode.forIntegerStamp(stamp(), 0, graph()); } if (x().isConstant() && y().isConstant()) { + Constant xConst = x().asConstant(); + Constant yConst = y().asConstant(); + assert xConst.getKind() == yConst.getKind(); try { - if (kind() == Kind.Int) { - return ConstantNode.forInt(ExactMath.subtractExact(x().asConstant().asInt(), y().asConstant().asInt()), graph()); + if (xConst.getKind() == Kind.Int) { + return ConstantNode.forInt(ExactMath.subtractExact(xConst.asInt(), yConst.asInt()), graph()); } else { - assert kind() == Kind.Long; - return ConstantNode.forLong(ExactMath.subtractExact(x().asConstant().asLong(), y().asConstant().asLong()), graph()); + assert xConst.getKind() == Kind.Long; + return ConstantNode.forLong(ExactMath.subtractExact(xConst.asLong(), yConst.asLong()), graph()); } } catch (ArithmeticException ex) { // The operation will result in an overflow exception, so do not canonicalize. diff -r 3be1d30dd40f -r 34c07ef28bc9 graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java --- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Wed Feb 26 15:53:51 2014 +0100 +++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/phases/WordTypeRewriterPhase.java Wed Feb 26 15:55:04 2014 +0100 @@ -202,7 +202,7 @@ case NOT: assert arguments.size() == 1; - replace(invoke, graph.unique(new XorNode(wordKind, arguments.get(0), ConstantNode.forIntegerKind(wordKind, -1, graph)))); + replace(invoke, graph.unique(new XorNode(StampFactory.forKind(wordKind), arguments.get(0), ConstantNode.forIntegerKind(wordKind, -1, graph)))); break; case READ: { @@ -320,8 +320,8 @@ */ private static ValueNode createBinaryNodeInstance(Class nodeClass, Kind kind, ValueNode left, ValueNode right) { try { - Constructor constructor = nodeClass.getConstructor(Kind.class, ValueNode.class, ValueNode.class); - return constructor.newInstance(kind, left, right); + Constructor constructor = nodeClass.getConstructor(Stamp.class, ValueNode.class, ValueNode.class); + return constructor.newInstance(StampFactory.forKind(kind), left, right); } catch (Throwable ex) { throw new GraalInternalError(ex).addContext(nodeClass.getName()); }