changeset 10809:438dd12ff25b

reset "permanent" flag on ValueAnchorNodes during inlining
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 18 Jul 2013 14:35:12 +0200
parents 4278ab23c66f
children 4e1db4c9d4c5
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java
diffstat 2 files changed, 11 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java	Thu Jul 18 14:34:45 2013 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/ValueAnchorNode.java	Thu Jul 18 14:35:12 2013 +0200
@@ -46,7 +46,7 @@
         this.anchored = new NodeInputList<>(this, values);
     }
 
-    private final boolean permanent;
+    private boolean permanent;
 
     @Override
     public void generate(LIRGeneratorTool gen) {
@@ -67,6 +67,10 @@
         return anchored;
     }
 
+    public void setPermanent(boolean permanent) {
+        this.permanent = permanent;
+    }
+
     public boolean isPermanent() {
         return permanent;
     }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Thu Jul 18 14:34:45 2013 +0200
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/InliningUtil.java	Thu Jul 18 14:35:12 2013 +0200
@@ -1390,6 +1390,12 @@
                             frameState.setOuterFrameState(outerFrameState);
                         }
                     }
+                } else if (node instanceof ValueAnchorNode) {
+                    /*
+                     * Synchronized inlinees have a valid point to deopt to after the monitor exit
+                     * at the end, so there's no need for the value anchor to be permanent anymore.
+                     */
+                    ((ValueAnchorNode) node).setPermanent(false);
                 }
                 if (callerLockDepth != 0 && node instanceof MonitorReference) {
                     MonitorReference monitor = (MonitorReference) node;