# HG changeset patch # User Thomas Wuerthinger # Date 1369224889 -7200 # Node ID 6c1f7b853d356606006543dcdaa99fcd850b9931 # Parent ecd5cd2806e8af704f2c98515ad28110b205103f Generalize the code for detecting invalid stamps in join operations. diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PiNode.java Wed May 22 14:14:49 2013 +0200 @@ -61,12 +61,6 @@ @Override public boolean inferStamp() { - if (stamp() instanceof ObjectStamp && object().objectStamp().alwaysNull() && objectStamp().nonNull()) { - // a null value flowing into a nonNull PiNode should be guarded by a type/isNull guard, - // but the - // compiler might see this situation before the branch is deleted - return false; - } return updateStamp(stamp().join(object().stamp())); } diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ValueNode.java Wed May 22 14:14:49 2013 +0200 @@ -60,7 +60,7 @@ * @return true if the stamp has changed, false otherwise. */ protected final boolean updateStamp(Stamp newStamp) { - if (newStamp.equals(stamp)) { + if (newStamp == null || newStamp.equals(stamp)) { return false; } else { stamp = newStamp; diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/UnsafeCastNode.java Wed May 22 14:14:49 2013 +0200 @@ -52,12 +52,6 @@ if (stamp() == StampFactory.forNodeIntrinsic()) { return false; } - if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) { - // a null value flowing into a nonNull UnsafeCastNode should be guarded by a type/isNull - // guard, but the - // compiler might see this situation before the branch is deleted - return false; - } return updateStamp(stamp().join(object().stamp())); } diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/CheckCastNode.java Wed May 22 14:14:49 2013 +0200 @@ -69,9 +69,6 @@ @Override public boolean inferStamp() { - if (object().objectStamp().alwaysNull() && objectStamp().nonNull()) { - return false; - } return updateStamp(stamp().join(object().stamp())); } diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/ObjectStamp.java Wed May 22 14:14:49 2013 +0200 @@ -22,6 +22,8 @@ */ package com.oracle.graal.nodes.type; +import java.lang.reflect.*; + import com.oracle.graal.api.meta.*; public class ObjectStamp extends Stamp { @@ -33,14 +35,29 @@ public ObjectStamp(ResolvedJavaType type, boolean exactType, boolean nonNull, boolean alwaysNull) { super(Kind.Object); - assert !exactType || type != null; - assert !(nonNull && alwaysNull); + assert isValid(type, exactType, nonNull, alwaysNull); this.type = type; this.exactType = exactType; this.nonNull = nonNull; this.alwaysNull = alwaysNull; } + public static boolean isValid(ResolvedJavaType type, boolean exactType, boolean nonNull, boolean alwaysNull) { + if (exactType && type == null) { + return false; + } + + if (exactType && Modifier.isAbstract(type.getModifiers()) && !type.isArray()) { + return false; + } + + if (nonNull && alwaysNull) { + return false; + } + + return true; + } + @Override public ResolvedJavaType javaType(MetaAccessProvider metaAccess) { if (type != null) { @@ -152,12 +169,19 @@ joinType = type; } } + if (joinType == type && joinExactType == exactType && joinNonNull == nonNull && joinAlwaysNull == alwaysNull) { return this; } else if (joinType == other.type && joinExactType == other.exactType && joinNonNull == other.nonNull && joinAlwaysNull == other.alwaysNull) { return other; } else { - return new ObjectStamp(joinType, joinExactType, joinNonNull, joinAlwaysNull); + if (isValid(joinType, joinExactType, joinNonNull, joinAlwaysNull)) { + return new ObjectStamp(joinType, joinExactType, joinNonNull, joinAlwaysNull); + } else { + // This situation can happen in case the compiler wants to join two contradicting + // stamps. + return null; + } } } diff -r ecd5cd2806e8 -r 6c1f7b853d35 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Wed May 22 14:07:57 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningPhase.java Wed May 22 14:14:49 2013 +0200 @@ -255,7 +255,7 @@ callerHasMoreInformationAboutArguments = true; } else { Stamp joinedStamp = localNode.stamp().join(arg.stamp()); - if (!joinedStamp.equals(localNode.stamp())) { + if (joinedStamp != null && !joinedStamp.equals(localNode.stamp())) { localNode.setStamp(joinedStamp); callerHasMoreInformationAboutArguments = true; }