changeset 17369:b3c10156d3d7

Update op fields when inferring stamps for arithmetic nodes.
author Roland Schatz <roland.schatz@oracle.com>
date Wed, 08 Oct 2014 12:18:57 +0200
parents a613bd4e6f67
children 5c06895b1aec 58f45b63b802
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/FloatConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/UnaryArithmeticNode.java
diffstat 4 files changed, 26 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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()));
     }
 
--- 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);
     }
--- 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
--- 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()));
     }