You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/12/06 11:34:50 UTC

svn commit: r601683 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer: optpass.cpp optpass.h throwopt.cpp

Author: varlax
Date: Thu Dec  6 02:34:49 2007
New Revision: 601683

URL: http://svn.apache.org/viewvc?rev=601683&view=rev
Log:
Applied HARMONY-4784 [drlvm][jit][opt] Loop peeling segfaults on smoke perf/ThrowMany

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/throwopt.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.cpp?rev=601683&r1=601682&r2=601683&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.cpp Thu Dec  6 02:34:49 2007
@@ -31,6 +31,7 @@
 #include "optimizer.h"
 #include "FlowGraph.h"
 #include "StaticProfiler.h"
+#include "deadcodeeliminator.h"
 
 #ifdef _WIN32
   #define snprintf _snprintf
@@ -107,6 +108,22 @@
     computeDominators(irm);
     computeLoops(irm, normalizeLoops);
     computeDominators(irm);
+}
+
+void
+OptPass::dce(IRManager& irm) {
+    DeadCodeEliminator dce(irm);
+    dce.eliminateDeadCode(false);
+}
+
+void
+OptPass::uce(IRManager& irm, bool fixup_ssa) {
+    DeadCodeEliminator dce(irm);
+    dce.eliminateUnreachableCode();
+
+    if (irm.getInSsa() && fixup_ssa) {
+        OptPass::fixupSsa(irm);
+    }    
 }
 
 void

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h?rev=601683&r1=601682&r2=601683&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optpass.h Thu Dec  6 02:34:49 2007
@@ -61,6 +61,8 @@
     static void computeDominators(IRManager& irm);
     static void computeLoops(IRManager& irm, bool normalize = true);
     static void computeDominatorsAndLoops(IRManager& irm, bool normalizeLoops = true);
+    static void dce(IRManager& irm);
+    static void uce(IRManager& irm, bool fixup_ssa);
     static void fixupSsa(IRManager& irm);
     static void splitCriticalEdges(IRManager& irm);
     static bool isProfileConsistent(IRManager& irm);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/throwopt.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/throwopt.cpp?rev=601683&r1=601682&r2=601683&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/throwopt.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/throwopt.cpp Thu Dec  6 02:34:49 2007
@@ -57,6 +57,7 @@
     const Nodes& nodes = flowGraph.getNodes();
     StlVector<bool> visited_nodes(irManager.getMemoryManager(), flowGraph.getMaxNodeId(), false);
     StlVector<Inst *> pseudo_insts(irManager.getMemoryManager(), 10);
+    StlVector<Edge *> exception_edges(irManager.getMemoryManager());
     LoopTree * loop_tree = irManager.getLoopTree();    
     bool restore_ssa = false;
 
@@ -149,6 +150,10 @@
             // Add direct jump.
             flowGraph.addEdge(throw_node, target_node);
 
+            // Remember exception edge here to remove them all at once at the end.
+            // Removing exception edge right now will generate unreachable code.
+            exception_edges.push_back(throw_node->getExceptionEdge());
+
             // Add pseudo instructions from exeption path.            
             if (pseudo_insts.size() > 0) {
                 Node * pseudo_node = flowGraph.spliceBlockOnEdge(
@@ -206,6 +211,16 @@
     }
 
     if (restore_ssa) {
+        // Remove all remembered exception edges.
+        for (StlVector<Edge *>::iterator it = exception_edges.begin(); it != exception_edges.end(); it++) {
+            flowGraph.removeEdge(*it);
+        }
+
+        // Clean up dead code.
+        OptPass::dce(irManager);
+        OptPass::uce(irManager, false);
+
+        // Restrore SSA form.
         OptPass::computeDominators(irManager);
         DominatorTree* dominatorTree = irManager.getDominatorTree();
         
@@ -213,8 +228,9 @@
         SSABuilder ssaBuilder(opndManager, instFactory, frontier, &flowGraph, irManager.getOptimizerFlags());
         bool phiInserted = ssaBuilder.fixupVars(&flowGraph, irManager.getMethodDesc());
         irManager.setInSsa(true);
-        if (phiInserted)
+        if (phiInserted) {
             irManager.setSsaUpdated();
+        }
     }
 }