changeset 19712:055a095424a7

Fixes for new conditional elimination phase. Make it default.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 09 Mar 2015 01:24:00 +0100
parents 69369fd52245
children 95d0385ec788
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java
diffstat 3 files changed, 40 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Mon Mar 09 01:23:20 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/InstanceOfNode.java	Mon Mar 09 01:24:00 2015 +0100
@@ -164,7 +164,7 @@
     @Override
     public Stamp getSucceedingStampForValue(boolean negated) {
         if (negated) {
-            return StampFactory.object();
+            return null;
         } else {
             return StampFactory.declaredTrustedNonNull(type);
         }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java	Mon Mar 09 01:23:20 2015 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/DominatorConditionalEliminationPhase.java	Mon Mar 09 01:24:00 2015 +0100
@@ -22,6 +22,9 @@
  */
 package com.oracle.graal.phases.common;
 
+import static com.oracle.graal.api.meta.DeoptimizationAction.*;
+import static com.oracle.graal.api.meta.DeoptimizationReason.*;
+
 import java.util.*;
 import java.util.function.*;
 
@@ -182,6 +185,10 @@
                     node.replaceAtUsages(piNode);
                     GraphUtil.unlinkFixedNode(node);
                     node.safeDelete();
+                } else {
+                    DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(InvalidateReprofile, UnreachedCode));
+                    node.replaceAtPredecessor(deopt);
+                    GraphUtil.killCFG(node);
                 }
             });
         }
@@ -246,33 +253,29 @@
                 while (proxiedGuard instanceof GuardProxyNode) {
                     proxiedGuard = ((GuardProxyNode) proxiedGuard).value();
                 }
-                ValueNode initialProxiedGuard = proxiedGuard;
                 Block guardBlock = nodeToBlock.apply(proxiedGuard);
                 assert guardBlock != null;
                 Block curBlock = block;
                 if (guardBlock != curBlock) {
-                    int loopExitIndex = loopExits.size() - 1;
-                    GuardProxyNode lastProxy = null;
+                    int loopExitIndex = loopExits.size();
                     do {
-                        LoopExitNode loopExitNode = loopExits.get(loopExitIndex);
+                        LoopExitNode loopExitNode = loopExits.get(loopExitIndex - 1);
                         Block loopExitBlock = nodeToBlock.apply(loopExitNode);
                         assert loopExitBlock != null;
                         if (loopExitBlock == curBlock) {
                             assert curBlock != guardBlock;
-                            GuardProxyNode guardProxy = proxiedGuard.graph().unique(new GuardProxyNode((GuardingNode) initialProxiedGuard, loopExitNode));
-                            if (lastProxy == null) {
-                                proxiedGuard = guardProxy;
-                            } else {
-                                lastProxy.setValue(guardProxy);
-                            }
-                            lastProxy = guardProxy;
                             loopExitIndex--;
-                            if (loopExitIndex < 0) {
+                            if (loopExitIndex <= 0) {
                                 break;
                             }
                         }
                         curBlock = curBlock.getDominator();
                     } while (guardBlock != curBlock);
+
+                    for (int i = loopExitIndex; i < loopExits.size(); ++i) {
+                        LoopExitNode loopExitNode = loopExits.get(i);
+                        proxiedGuard = proxiedGuard.graph().unique(new GuardProxyNode((GuardingNode) proxiedGuard, loopExitNode));
+                    }
                 }
             }
             return proxiedGuard;
@@ -324,17 +327,19 @@
                 }
             } else if (node instanceof ShortCircuitOrNode) {
                 final ShortCircuitOrNode shortCircuitOrNode = (ShortCircuitOrNode) node;
-                tryProofCondition(shortCircuitOrNode.getX(), block, (guard, result) -> {
-                    if (result == !shortCircuitOrNode.isXNegated()) {
-                        rewireGuards(guard, result, block, rewireGuardFunction);
-                    } else {
-                        tryProofCondition(shortCircuitOrNode.getY(), block, (innerGuard, innerResult) -> {
-                            if (innerGuard == guard) {
-                                rewireGuards(guard, shortCircuitOrNode.isYNegated() ? !innerResult : innerResult, block, rewireGuardFunction);
-                            }
-                        });
-                    }
-                });
+                if (this.loopExits.isEmpty()) {
+                    tryProofCondition(shortCircuitOrNode.getX(), block, (guard, result) -> {
+                        if (result == !shortCircuitOrNode.isXNegated()) {
+                            rewireGuards(guard, result, block, rewireGuardFunction);
+                        } else {
+                            tryProofCondition(shortCircuitOrNode.getY(), block, (innerGuard, innerResult) -> {
+                                if (innerGuard == guard) {
+                                    rewireGuards(guard, shortCircuitOrNode.isYNegated() ? !innerResult : innerResult, block, rewireGuardFunction);
+                                }
+                            });
+                        }
+                    });
+                }
             }
 
             return false;
@@ -361,6 +366,10 @@
                     node.replaceAtUsages(guard);
                     GraphUtil.unlinkFixedNode(node);
                     GraphUtil.killWithUnusedFloatingInputs(node);
+                } else {
+                    ValueAnchorNode valueAnchor = node.graph().add(new ValueAnchorNode(null));
+                    node.replaceAtUsages(valueAnchor);
+                    node.graph().replaceFixedWithFixed(node, valueAnchor);
                 }
             });
         }
@@ -369,6 +378,11 @@
             if (!tryProofCondition(node.condition(), block, (guard, result) -> {
                 if (result != node.isNegated()) {
                     node.replaceAndDelete(guard);
+                } else {
+                    DeoptimizeNode deopt = node.graph().add(new DeoptimizeNode(node.action(), node.reason()));
+                    FixedNode next = block.getBeginNode().next();
+                    block.getBeginNode().setNext(deopt);
+                    GraphUtil.killCFG(next);
                 }
             })) {
                 registerNewCondition(node.condition(), node.isNegated(), node, undoOperations);
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java	Mon Mar 09 01:23:20 2015 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/IterativeConditionalEliminationPhase.java	Mon Mar 09 01:24:00 2015 +0100
@@ -45,14 +45,11 @@
 
     @Override
     protected void run(StructuredGraph graph, PhaseContext context) {
-
-        ConditionalEliminationPhase eliminate = new ConditionalEliminationPhase();
-        HashSetNodeEventListener listener = new HashSetNodeEventListener().exclude(NODE_ADDED);
+        HashSetNodeEventListener listener = new HashSetNodeEventListener().exclude(NODE_ADDED).exclude(ZERO_USAGES);
         int count = 0;
         while (true) {
-            new DominatorConditionalEliminationPhase().apply(graph);
             try (NodeEventScope nes = graph.trackNodeEvents(listener)) {
-                eliminate.apply(graph);
+                new DominatorConditionalEliminationPhase().apply(graph);
             }
             if (listener.getNodes().isEmpty()) {
                 break;