changeset 13668:a5206a3b92f2

UseTrappingNullChecksPhase: do not use trapping null check for a reason which is not null check or has an attached speculation
author Gilles Duboscq <duboscq@ssw.jku.at>
date Fri, 17 Jan 2014 14:01:02 +0100
parents 076e233aec3f
children 034706a93f27
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java
diffstat 2 files changed, 11 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Fri Jan 17 13:58:56 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Fri Jan 17 14:01:02 2014 +0100
@@ -76,6 +76,10 @@
         return ConstantNode.forConstant(speculation, metaAccess, graph());
     }
 
+    public Constant getSpeculation() {
+        return speculation;
+    }
+
     @NodeIntrinsic
     public static native void deopt(@ConstantNodeParameter DeoptimizationAction action, @ConstantNodeParameter DeoptimizationReason reason);
 }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Fri Jan 17 13:58:56 2014 +0100
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/UseTrappingNullChecksPhase.java	Fri Jan 17 14:01:02 2014 +0100
@@ -22,6 +22,7 @@
  */
 package com.oracle.graal.phases.common;
 
+import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.StructuredGraph.GuardsStage;
@@ -46,6 +47,12 @@
     }
 
     private static void tryUseTrappingNullCheck(DeoptimizeNode deopt) {
+        if (deopt.reason() != DeoptimizationReason.NullCheckException) {
+            return;
+        }
+        if (deopt.getSpeculation() != null && deopt.getSpeculation() != Constant.NULL_OBJECT) {
+            return;
+        }
         Node predecessor = deopt.predecessor();
         Node branch = null;
         while (predecessor instanceof AbstractBeginNode) {