Mercurial > hg > truffle
diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java @ 11278:6d28ce8cdeb7
Fix canonicalization of conditional nodes, add a test for this bug
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Sat, 10 Aug 2013 02:44:23 +0200 |
parents | ef6915cf1e59 |
children | dc14bcf752ea |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Fri Aug 09 10:49:18 2013 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Sat Aug 10 02:44:23 2013 +0200 @@ -28,6 +28,7 @@ import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; import com.oracle.graal.nodes.spi.*; +import com.oracle.graal.nodes.type.*; /** * The {@code ConditionalNode} class represents a comparison that yields one of two values. Note @@ -65,9 +66,12 @@ // this optimizes the case where a value that can only be 0 or 1 is materialized to 0 or 1 if (x().isConstant() && y().isConstant() && condition instanceof IntegerEqualsNode) { IntegerEqualsNode equals = (IntegerEqualsNode) condition; - if (equals.y().isConstant() && equals.y().asConstant().equals(Constant.INT_0)) { - if (x().asConstant().equals(Constant.INT_0) && y().asConstant().equals(Constant.INT_1)) { - return equals.x(); + if (equals.y().isConstant() && equals.y().asConstant().equals(Constant.INT_0) && equals.x().stamp() instanceof IntegerStamp) { + IntegerStamp equalsXStamp = (IntegerStamp) equals.x().stamp(); + if (equalsXStamp.mask() == 1) { + if (x().asConstant().equals(Constant.INT_0) && y().asConstant().equals(Constant.INT_1)) { + return equals.x(); + } } } }