changeset 16194:7fb828b4c32b

made LoopsData clients clean up dead nodes created during loop analysis
author Doug Simon <doug.simon@oracle.com>
date Thu, 19 Jun 2014 17:33:44 +0200
parents 48f86e56eb75
children e34d8c5fa927
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/DerivedScaledInductionVariable.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariable.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopFullUnrollPhase.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformHighPhase.java graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformLowPhase.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 12 files changed, 49 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/DerivedScaledInductionVariable.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/DerivedScaledInductionVariable.java	Thu Jun 19 17:33:44 2014 +0200
@@ -25,6 +25,7 @@
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
+import com.oracle.graal.nodes.util.*;
 
 public class DerivedScaledInductionVariable extends InductionVariable {
 
@@ -119,4 +120,11 @@
     public long constantExtremum() {
         return base.constantExtremum() * scale.asConstant().asLong();
     }
+
+    @Override
+    public void deleteUnusedNodes() {
+        if (scale.usages().isEmpty()) {
+            GraphUtil.killWithUnusedFloatingInputs(scale);
+        }
+    }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariable.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariable.java	Thu Jun 19 17:33:44 2014 +0200
@@ -62,7 +62,7 @@
     public abstract Direction direction();
 
     /**
-     * Returns the value node that is described by this InductionVariable instance.
+     * Returns the value node that is described by this induction variable.
      */
     public abstract ValueNode valueNode();
 
@@ -104,4 +104,10 @@
      * induction variable at the loop exit.
      */
     public abstract ValueNode exitValueNode();
+
+    /**
+     * Deletes any nodes created within the scope of this object that have no usages.
+     */
+    public void deleteUnusedNodes() {
+    }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/InductionVariables.java	Thu Jun 19 17:33:44 2014 +0200
@@ -121,4 +121,13 @@
         }
         return null;
     }
+
+    /**
+     * Deletes any nodes created within the scope of this object that have no usages.
+     */
+    public void deleteUnusedNodes() {
+        for (InductionVariable iv : ivs.values()) {
+            iv.deleteUnusedNodes();
+        }
+    }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopEx.java	Thu Jun 19 17:33:44 2014 +0200
@@ -253,4 +253,13 @@
         }
         return ivs;
     }
+
+    /**
+     * Deletes any nodes created within the scope of this object that have no usages.
+     */
+    public void deleteUnusedNodes() {
+        if (ivs != null) {
+            ivs.deleteUnusedNodes();
+        }
+    }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopsData.java	Thu Jun 19 17:33:44 2014 +0200
@@ -121,4 +121,13 @@
         }
         return match;
     }
+
+    /**
+     * Deletes any nodes created within the scope of this object that have no usages.
+     */
+    public void deleteUnusedNodes() {
+        for (LoopEx loop : loops()) {
+            loop.deleteUnusedNodes();
+        }
+    }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopFullUnrollPhase.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopFullUnrollPhase.java	Thu Jun 19 17:33:44 2014 +0200
@@ -56,6 +56,7 @@
                         break;
                     }
                 }
+                dataCounted.deleteUnusedNodes();
             } while (peeled);
         }
     }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopSafepointEliminationPhase.java	Thu Jun 19 17:33:44 2014 +0200
@@ -66,5 +66,6 @@
                 }
             }
         }
+        loops.deleteUnusedNodes();
     }
 }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformHighPhase.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformHighPhase.java	Thu Jun 19 17:33:44 2014 +0200
@@ -47,6 +47,7 @@
                         Debug.dump(graph, "After peeling %s", loop);
                     }
                 }
+                data.deleteUnusedNodes();
             }
         }
     }
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformLowPhase.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/phases/LoopTransformLowPhase.java	Thu Jun 19 17:33:44 2014 +0200
@@ -47,6 +47,7 @@
                 } catch (Throwable e) {
                     throw Debug.handle(e);
                 }
+                dataReassociate.deleteUnusedNodes();
             }
             if (LoopUnswitch.getValue()) {
                 boolean unswitched;
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/SnippetTemplate.java	Thu Jun 19 17:33:44 2014 +0200
@@ -618,6 +618,7 @@
                     Mark mark = snippetCopy.getMark();
                     LoopTransformations.fullUnroll(loop, phaseContext, new CanonicalizerPhase(true));
                     new CanonicalizerPhase(true).applyIncremental(snippetCopy, phaseContext, mark);
+                    loop.deleteUnusedNodes();
                 }
                 GraphUtil.removeFixedWithUnusedInputs(explodeLoop);
                 exploded = true;
--- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/PartialEvaluationTest.java	Thu Jun 19 17:33:44 2014 +0200
@@ -120,6 +120,7 @@
                             }
                         }
                     }
+                    loopsData.deleteUnusedNodes();
                 } while (unrolled);
             }
 
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Thu Jun 19 17:13:10 2014 +0200
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Thu Jun 19 17:33:44 2014 +0200
@@ -280,6 +280,7 @@
                             break;
                         }
                     }
+                    loopsData.deleteUnusedNodes();
                 } while (unrolled);
             } catch (Throwable e) {
                 throw Debug.handle(e);