changeset 11268:ac59bdde1194

TruffleCache: do not expand assertion paths by default.
author Andreas Woess <andreas.woess@jku.at>
date Thu, 08 Aug 2013 19:28:42 +0200
parents ceb2703b40b8
children f00c85ee46a2
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java	Thu Aug 08 18:59:09 2013 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java	Thu Aug 08 19:28:42 2013 +0200
@@ -36,6 +36,7 @@
 import com.oracle.graal.graph.Node;
 import com.oracle.graal.java.*;
 import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.java.MethodCallTargetNode.InvokeKind;
 import com.oracle.graal.nodes.spi.*;
@@ -218,6 +219,8 @@
             if (next instanceof InvokeWithExceptionNode) {
                 InvokeWithExceptionNode invokeWithExceptionNode = (InvokeWithExceptionNode) next;
                 next = invokeWithExceptionNode.next();
+            } else if (next instanceof IfNode && isAssertionsEnabledCondition(((IfNode) next).condition())) {
+                next = ((IfNode) next).falseSuccessor();
             } else if (next instanceof ControlSplitNode) {
                 ControlSplitNode controlSplitNode = (ControlSplitNode) next;
                 AbstractBeginNode maxProbNode = null;
@@ -246,6 +249,19 @@
         }
     }
 
+    private static boolean isAssertionsEnabledCondition(LogicNode condition) {
+        if (condition instanceof IntegerEqualsNode) {
+            IntegerEqualsNode equalsNode = (IntegerEqualsNode) condition;
+            if (equalsNode.x() instanceof LoadFieldNode && equalsNode.y().isConstant()) {
+                LoadFieldNode loadFieldNode = (LoadFieldNode) equalsNode.x();
+                if (loadFieldNode.isStatic() && loadFieldNode.field().getName().equals("$assertionsDisabled") && loadFieldNode.field().isSynthetic()) {
+                    return ((ConstantNode) equalsNode.y()).value.equals(Constant.INT_0);
+                }
+            }
+        }
+        return false;
+    }
+
     private FixedNode expandInvoke(Invoke invoke) {
         if (invoke.callTarget() instanceof MethodCallTargetNode) {
             final MethodCallTargetNode methodCallTargetNode = (MethodCallTargetNode) invoke.callTarget();