diff graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java @ 15778:9ae1d2f3bda6

convert asserts into if tests and check for phis at merge
author Tom Rodriguez <tom.rodriguez@oracle.com>
date Mon, 19 May 2014 14:14:12 -0700
parents c82a77d94067
children c9f913e5a93b
line wrap: on
line diff
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Mon May 19 10:45:01 2014 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Mon May 19 14:14:12 2014 -0700
@@ -65,16 +65,19 @@
         if (predecessor instanceof MergeNode) {
             MergeNode merge = (MergeNode) predecessor;
 
-            // Process each predecessor at the merge, unpacking the reasons as needed.
-            ValueNode reason = deopt.getActionAndReason();
-            List<ValueNode> values = reason instanceof ValuePhiNode ? ((ValuePhiNode) reason).values().snapshot() : Collections.nCopies(merge.forwardEndCount(), reason);
+            if (merge.phis().isEmpty()) {
+                // Process each predecessor at the merge, unpacking the reasons as needed.
+                ValueNode reason = deopt.getActionAndReason();
+                List<ValueNode> values = reason instanceof ValuePhiNode ? ((ValuePhiNode) reason).values().snapshot() : null;
 
-            int index = 0;
-            for (AbstractEndNode end : merge.cfgPredecessors().snapshot()) {
-                ValueNode thisReason = values.get(index++);
-                assert thisReason.isConstant();
-                DeoptimizationReason deoptimizationReason = metaAccessProvider.decodeDeoptReason(thisReason.asConstant());
-                tryUseTrappingNullCheck(deopt, end.predecessor(), deoptimizationReason, null);
+                int index = 0;
+                for (AbstractEndNode end : merge.cfgPredecessors().snapshot()) {
+                    ValueNode thisReason = values != null ? values.get(index++) : reason;
+                    if (thisReason.isConstant()) {
+                        DeoptimizationReason deoptimizationReason = metaAccessProvider.decodeDeoptReason(thisReason.asConstant());
+                        tryUseTrappingNullCheck(deopt, end.predecessor(), deoptimizationReason, null);
+                    }
+                }
             }
         }
     }
@@ -88,10 +91,11 @@
         }
         if (predecessor instanceof MergeNode) {
             MergeNode merge = (MergeNode) predecessor;
-            for (AbstractEndNode end : merge.cfgPredecessors().snapshot()) {
-                checkPredecessor(deopt, end.predecessor(), deoptimizationReason);
+            if (merge.phis().isEmpty()) {
+                for (AbstractEndNode end : merge.cfgPredecessors().snapshot()) {
+                    checkPredecessor(deopt, end.predecessor(), deoptimizationReason);
+                }
             }
-
         } else if (predecessor instanceof BeginNode) {
             checkPredecessor(deopt, predecessor, deoptimizationReason);
         }