# HG changeset patch # User Lukas Stadler # Date 1371219833 -7200 # Node ID a4e7a7dc74f3b20fe5ce2a382b7fb1d06f157897 # Parent a5a89816a157caa03b4e8c8c2885dda55db307fb better stamps for OrNodes diff -r a5a89816a157 -r a4e7a7dc74f3 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java --- 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) {