Mercurial > hg > graal-compiler
changeset 22884:2fe4e3511d97
Look into expressions when performing conditional elimination
author | Tom Rodriguez <tom.rodriguez@oracle.com> |
---|---|
date | Sat, 24 Oct 2015 15:27:58 -0700 |
parents | 39b9743b8274 |
children | dc1551f0833e |
files | graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java |
diffstat | 2 files changed, 24 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Sat Oct 24 12:18:09 2015 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryArithmeticNode.java Sat Oct 24 15:27:58 2015 -0700 @@ -86,6 +86,10 @@ return null; } + public Stamp tryFoldStamp(Stamp xStamp, Stamp yStamp) { + return getOp(getX(), getY()).foldStamp(xStamp, yStamp); + } + @Override public boolean inferStamp() { return updateStamp(getOp(getX(), getY()).foldStamp(getX().stamp(), getY().stamp()));
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Sat Oct 24 12:18:09 2015 -0700 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java Sat Oct 24 15:27:58 2015 -0700 @@ -62,6 +62,7 @@ import com.oracle.graal.nodes.StructuredGraph; import com.oracle.graal.nodes.UnaryOpLogicNode; import com.oracle.graal.nodes.ValueNode; +import com.oracle.graal.nodes.calc.BinaryArithmeticNode; import com.oracle.graal.nodes.cfg.Block; import com.oracle.graal.nodes.cfg.ControlFlowGraph; import com.oracle.graal.nodes.extended.GuardingNode; @@ -416,6 +417,25 @@ return rewireGuards(infoElement.getGuard(), result.toBoolean(), rewireGuardFunction); } } + /* + * For complex expressions involving constants, see if it's possible to fold the + * tests by using stamps one level up in the expression. For instance, (x + n < y) + * might fold if something is known about x and y is a constant. + */ + if (x instanceof BinaryArithmeticNode<?> && y.isConstant()) { + BinaryArithmeticNode<?> binary = (BinaryArithmeticNode<?>) x; + for (InfoElement infoElement : getInfoElements(binary.getX())) { + Stamp newStampX = binary.tryFoldStamp(infoElement.getStamp(), binary.getY().stamp()); + TriState result = binaryOpLogicNode.tryFold(newStampX, y.stamp()); + if (result.isKnown()) { + return rewireGuards(infoElement.getGuard(), result.toBoolean(), rewireGuardFunction); + } + } + /* + * In all the interesting cases binary.getY() seems to be a constant so it's + * doesn't seem worth checking that case here.s + */ + } } else if (node instanceof ShortCircuitOrNode) { final ShortCircuitOrNode shortCircuitOrNode = (ShortCircuitOrNode) node; if (this.loopExits.isEmpty()) {