changeset 10749:e7c0658c2f25

record disjunctive conditions in ConditionalEliminationPhase change suggested by Miguel Garcia <miguelalfredo.garcia@epfl.ch>
author Lukas Stadler <lukas.stadler@jku.at>
date Mon, 15 Jul 2013 13:36:41 +0200
parents a5c9bc1f28fb
children 9f5a4074e36b
files graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java
diffstat 1 files changed, 41 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Jul 15 13:11:34 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/ConditionalEliminationPhase.java	Mon Jul 15 13:36:41 2013 +0200
@@ -315,42 +315,48 @@
         }
 
         private void registerCondition(boolean isTrue, LogicNode condition, ValueNode anchor) {
-            state.addCondition(isTrue, condition, anchor);
+            if (!isTrue && condition instanceof LogicDisjunctionNode) {
+                LogicDisjunctionNode disjunction = (LogicDisjunctionNode) condition;
+                registerCondition(disjunction.isXNegated(), disjunction.getX(), anchor);
+                registerCondition(disjunction.isYNegated(), disjunction.getY(), anchor);
+            } else {
+                state.addCondition(isTrue, condition, anchor);
 
-            if (isTrue && condition instanceof InstanceOfNode) {
-                InstanceOfNode instanceOf = (InstanceOfNode) condition;
-                ValueNode object = instanceOf.object();
-                state.addNullness(false, object);
-                state.addType(instanceOf.type(), object);
-            } else if (condition instanceof IsNullNode) {
-                IsNullNode nullCheck = (IsNullNode) condition;
-                state.addNullness(isTrue, nullCheck.object());
-            } else if (condition instanceof ObjectEqualsNode) {
-                ObjectEqualsNode equals = (ObjectEqualsNode) condition;
-                ValueNode x = equals.x();
-                ValueNode y = equals.y();
-                if (isTrue) {
-                    if (state.isNull(x) && !state.isNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(true, y);
-                    } else if (!state.isNull(x) && state.isNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(true, x);
-                    }
-                    if (state.isNonNull(x) && !state.isNonNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(false, y);
-                    } else if (!state.isNonNull(x) && state.isNonNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(false, x);
-                    }
-                } else {
-                    if (state.isNull(x) && !state.isNonNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(false, y);
-                    } else if (!state.isNonNull(x) && state.isNull(y)) {
-                        metricObjectEqualsRegistered.increment();
-                        state.addNullness(false, x);
+                if (isTrue && condition instanceof InstanceOfNode) {
+                    InstanceOfNode instanceOf = (InstanceOfNode) condition;
+                    ValueNode object = instanceOf.object();
+                    state.addNullness(false, object);
+                    state.addType(instanceOf.type(), object);
+                } else if (condition instanceof IsNullNode) {
+                    IsNullNode nullCheck = (IsNullNode) condition;
+                    state.addNullness(isTrue, nullCheck.object());
+                } else if (condition instanceof ObjectEqualsNode) {
+                    ObjectEqualsNode equals = (ObjectEqualsNode) condition;
+                    ValueNode x = equals.x();
+                    ValueNode y = equals.y();
+                    if (isTrue) {
+                        if (state.isNull(x) && !state.isNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(true, y);
+                        } else if (!state.isNull(x) && state.isNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(true, x);
+                        }
+                        if (state.isNonNull(x) && !state.isNonNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(false, y);
+                        } else if (!state.isNonNull(x) && state.isNonNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(false, x);
+                        }
+                    } else {
+                        if (state.isNull(x) && !state.isNonNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(false, y);
+                        } else if (!state.isNonNull(x) && state.isNull(y)) {
+                            metricObjectEqualsRegistered.increment();
+                            state.addNullness(false, x);
+                        }
                     }
                 }
             }