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()) {