Mercurial > hg > graal-compiler
changeset 23105:ffeb971349e1
detect min/max constructs in ConditionalNode
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Fri, 27 Nov 2015 16:46:14 +0100 |
parents | 0ee453f11459 |
children | fd3b0d8cf1f7 |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java |
diffstat | 1 files changed, 29 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Fri Nov 27 11:03:45 2015 +0100 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/ConditionalNode.java Fri Nov 27 16:46:14 2015 +0100 @@ -27,6 +27,8 @@ import com.oracle.graal.compiler.common.calc.Condition; import com.oracle.graal.compiler.common.type.IntegerStamp; +import com.oracle.graal.compiler.common.type.Stamp; +import com.oracle.graal.compiler.common.type.StampFactory; import com.oracle.graal.graph.NodeClass; import com.oracle.graal.graph.spi.Canonicalizable; import com.oracle.graal.graph.spi.CanonicalizerTool; @@ -83,7 +85,33 @@ @Override public boolean inferStamp() { - return updateStamp(trueValue.stamp().meet(falseValue.stamp())); + Stamp valueStamp = trueValue.stamp().meet(falseValue.stamp()); + if (condition instanceof IntegerLessThanNode) { + IntegerLessThanNode lessThan = (IntegerLessThanNode) condition; + if (lessThan.getX() == trueValue && lessThan.getY() == falseValue) { + // this encodes a min operation + JavaConstant constant = lessThan.getX().asJavaConstant(); + if (constant == null) { + constant = lessThan.getY().asJavaConstant(); + } + if (constant != null) { + IntegerStamp bounds = StampFactory.forInteger(constant.getJavaKind(), constant.getJavaKind().getMinValue(), constant.asLong()); + valueStamp = valueStamp.join(bounds); + } + } else if (lessThan.getX() == falseValue && lessThan.getY() == trueValue) { + // this encodes a max operation + JavaConstant constant = lessThan.getX().asJavaConstant(); + if (constant == null) { + constant = lessThan.getY().asJavaConstant(); + } + if (constant != null) { + IntegerStamp bounds = StampFactory.forInteger(constant.getJavaKind(), constant.asLong(), constant.getJavaKind().getMaxValue()); + valueStamp = valueStamp.join(bounds); + } + } + + } + return updateStamp(valueStamp); } public ValueNode trueValue() {