Mercurial > hg > graal-compiler
changeset 10045:a4e7a7dc74f3
better stamps for OrNodes
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Fri, 14 Jun 2013 16:23:53 +0200 |
parents | a5a89816a157 |
children | 09baba95f1ae |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java |
diffstat | 1 files changed, 10 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Fri Jun 14 16:20:46 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java Fri Jun 14 16:23:53 2013 +0200 @@ -101,6 +101,10 @@ private static final long LONG_SIGN_BIT = 0x8000000000000000L; private static Stamp stampForMask(Kind kind, long mask) { + return stampForMask(kind, mask, 0); + } + + private static Stamp stampForMask(Kind kind, long mask, long alwaysSetBits) { long lowerBound; long upperBound; if (kind == Kind.Int && (mask & INTEGER_SIGN_BIT) != 0) { @@ -112,7 +116,7 @@ lowerBound = Long.MIN_VALUE; upperBound = mask ^ LONG_SIGN_BIT; } else { - lowerBound = 0; + lowerBound = alwaysSetBits; upperBound = mask; } return StampFactory.forInteger(kind, lowerBound, upperBound, mask); @@ -127,7 +131,11 @@ public static Stamp or(IntegerStamp stamp1, IntegerStamp stamp2) { Kind kind = stamp1.kind(); long mask = stamp1.mask() | stamp2.mask(); - return stampForMask(kind, mask); + if (stamp1.lowerBound() >= 0 && stamp2.lowerBound() >= 0) { + return stampForMask(kind, mask, stamp1.lowerBound() | stamp2.lowerBound()); + } else { + return stampForMask(kind, mask); + } } public static Stamp xor(IntegerStamp stamp1, IntegerStamp stamp2) {