changeset 16444:843e8efacd13

getDisplacementStamp on LocationNodes
author Lukas Stadler <lukas.stadler@oracle.com>
date Tue, 08 Jul 2014 16:24:46 +0200
parents e941121f096f
children eff9559f4515
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java
diffstat 5 files changed, 30 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java	Tue Jul 08 16:17:30 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java	Tue Jul 08 16:24:46 2014 +0200
@@ -30,6 +30,7 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.type.*;
 
 /**
  * Location node that is the sum of two other location nodes. Can represent locations in the form of
@@ -112,6 +113,11 @@
         return getY().generateAddress(builder, gen, xAddr);
     }
 
+    @Override
+    public IntegerStamp getDisplacementStamp() {
+        return StampTool.add(getX().getDisplacementStamp(), getY().getDisplacementStamp());
+    }
+
     @NodeIntrinsic
     public static native Location addLocation(Location x, Location y);
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java	Tue Jul 08 16:17:30 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java	Tue Jul 08 16:24:46 2014 +0200
@@ -73,4 +73,9 @@
     public Value generateAddress(NodeMappableLIRBuilder builder, LIRGeneratorTool gen, Value base) {
         return gen.emitAddress(base, getDisplacement(), Value.ILLEGAL, 0);
     }
+
+    @Override
+    public IntegerStamp getDisplacementStamp() {
+        return StampFactory.forInteger(64, displacement, displacement);
+    }
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java	Tue Jul 08 16:17:30 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java	Tue Jul 08 16:24:46 2014 +0200
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.nodes.extended;
 
+import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
@@ -29,6 +30,7 @@
 import com.oracle.graal.lir.gen.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.type.*;
 
 /**
  * Location node that has a displacement and a scaled index. Can represent locations in the form of
@@ -101,6 +103,13 @@
     }
 
     @Override
+    public IntegerStamp getDisplacementStamp() {
+        assert indexScaling > 0 && CodeUtil.isPowerOf2(indexScaling);
+        int scale = CodeUtil.log2(indexScaling);
+        return (IntegerStamp) StampTool.add(StampFactory.forInteger(64, displacement, displacement), StampTool.leftShift(index.stamp(), StampFactory.forInteger(64, scale, scale)));
+    }
+
+    @Override
     public Value generateAddress(NodeMappableLIRBuilder builder, LIRGeneratorTool gen, Value base) {
         return gen.emitAddress(base, displacement, builder.operand(getIndex()), getIndexScaling());
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Tue Jul 08 16:17:30 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Tue Jul 08 16:24:46 2014 +0200
@@ -64,4 +64,9 @@
     }
 
     public abstract Value generateAddress(NodeMappableLIRBuilder builder, LIRGeneratorTool gen, Value base);
+
+    /**
+     * @return the range of the displacement as a 64-bit integer stamp
+     */
+    public abstract IntegerStamp getDisplacementStamp();
 }
--- a/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java	Tue Jul 08 16:17:30 2014 +0200
+++ b/graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java	Tue Jul 08 16:24:46 2014 +0200
@@ -113,6 +113,11 @@
         throw new GraalInternalError("locationIdentity must be a constant so that this node can be canonicalized: " + locationIdentity);
     }
 
+    @Override
+    public IntegerStamp getDisplacementStamp() {
+        throw GraalInternalError.shouldNotReachHere();
+    }
+
     @NodeIntrinsic
     public static native Location constantLocation(LocationIdentity identity, Kind kind, long displacement);