# HG changeset patch # User Roland Schatz # Date 1412763537 -7200 # Node ID b3c10156d3d75cd98cb42230364fd996234b2a86 # Parent a613bd4e6f679d8baf35bf769a372d05a5a32fd3 Update op fields when inferring stamps for arithmetic nodes. diff -r a613bd4e6f67 -r b3c10156d3d7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Wed Oct 08 12:18:47 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Wed Oct 08 12:18:57 2014 +0200 @@ -24,6 +24,7 @@ import com.oracle.graal.api.meta.*; import com.oracle.graal.compiler.common.*; +import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.BinaryOp; import com.oracle.graal.graph.*; import com.oracle.graal.graph.iterators.*; @@ -35,7 +36,7 @@ @NodeInfo public abstract class BinaryArithmeticNode extends BinaryNode implements ArithmeticLIRLowerable { - protected final BinaryOp op; + protected BinaryOp op; public BinaryArithmeticNode(BinaryOp op, ValueNode x, ValueNode y) { super(op.foldStamp(x.stamp(), y.stamp()), x, y); @@ -63,6 +64,9 @@ @Override public boolean inferStamp() { + ArithmeticOpTable ops = ArithmeticOpTable.forStamp(getX().stamp()); + assert ops == ArithmeticOpTable.forStamp(getY().stamp()); + op = ops.getBinaryOp(op); return updateStamp(op.foldStamp(getX().stamp(), getY().stamp())); } diff -r a613bd4e6f67 -r b3c10156d3d7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Wed Oct 08 12:18:47 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java Wed Oct 08 12:18:57 2014 +0200 @@ -39,7 +39,7 @@ @NodeInfo public class FloatConvertNode extends UnaryArithmeticNode implements ConvertNode, Lowerable, ArithmeticLIRLowerable { - protected final FloatConvertOp reverseOp; + protected FloatConvertOp reverseOp; public static FloatConvertNode create(FloatConvert op, ValueNode input) { return USE_GENERATED_NODES ? new FloatConvertNodeGen(op, input) : new FloatConvertNode(op, input); @@ -96,6 +96,15 @@ return this; } + @Override + public boolean inferStamp() { + boolean changed = super.inferStamp(); + if (changed) { + reverseOp = ArithmeticOpTable.forStamp(stamp()).getFloatConvertOp(reverseOp); + } + return changed; + } + public void lower(LoweringTool tool) { tool.getLowerer().lower(this, tool); } diff -r a613bd4e6f67 -r b3c10156d3d7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Wed Oct 08 12:18:47 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java Wed Oct 08 12:18:57 2014 +0200 @@ -36,8 +36,8 @@ @NodeInfo public abstract class IntegerConvertNode extends UnaryNode implements ConvertNode, ArithmeticLIRLowerable { - protected final IntegerConvertOp op; - protected final IntegerConvertOp reverseOp; + protected IntegerConvertOp op; + protected IntegerConvertOp reverseOp; protected final int resultBits; @@ -72,7 +72,12 @@ @Override public boolean inferStamp() { - return updateStamp(op.foldStamp(resultBits, getValue().stamp())); + op = ArithmeticOpTable.forStamp(getValue().stamp()).getIntegerConvertOp(op); + boolean changed = updateStamp(op.foldStamp(resultBits, getValue().stamp())); + if (changed) { + reverseOp = ArithmeticOpTable.forStamp(stamp()).getIntegerConvertOp(reverseOp); + } + return changed; } @Override diff -r a613bd4e6f67 -r b3c10156d3d7 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java Wed Oct 08 12:18:47 2014 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java Wed Oct 08 12:18:57 2014 +0200 @@ -23,6 +23,7 @@ package com.oracle.graal.nodes.calc; import com.oracle.graal.api.meta.*; +import com.oracle.graal.compiler.common.type.*; import com.oracle.graal.compiler.common.type.ArithmeticOpTable.UnaryOp; import com.oracle.graal.graph.spi.*; import com.oracle.graal.nodeinfo.*; @@ -32,7 +33,7 @@ @NodeInfo public abstract class UnaryArithmeticNode extends UnaryNode implements ArithmeticLIRLowerable { - protected final UnaryOp op; + protected UnaryOp op; protected UnaryArithmeticNode(UnaryOp op, ValueNode value) { super(op.foldStamp(value.stamp()), value); @@ -50,6 +51,7 @@ @Override public boolean inferStamp() { + op = ArithmeticOpTable.forStamp(getValue().stamp()).getUnaryOp(op); return updateStamp(op.foldStamp(getValue().stamp())); }