# HG changeset patch # User Lukas Stadler # Date 1404829486 -7200 # Node ID 843e8efacd13cb4c0bf67f2c0a737023c00234f1 # Parent e941121f096f0121495a95b8c7c393f91cb916fe getDisplacementStamp on LocationNodes diff -r e941121f096f -r 843e8efacd13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/AddLocationNode.java --- 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); } diff -r e941121f096f -r 843e8efacd13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ConstantLocationNode.java --- 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); + } } diff -r e941121f096f -r 843e8efacd13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/IndexedLocationNode.java --- 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()); } diff -r e941121f096f -r 843e8efacd13 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java --- 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(); } diff -r e941121f096f -r 843e8efacd13 graal/com.oracle.graal.word/src/com/oracle/graal/word/nodes/SnippetLocationNode.java --- 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);