Index: trunk/vm/jitrino/src/optimizer/optpass.cpp =================================================================== --- trunk/vm/jitrino/src/optimizer/optpass.cpp (revision 601217) +++ trunk/vm/jitrino/src/optimizer/optpass.cpp (working copy) @@ -31,6 +31,7 @@ #include "optimizer.h" #include "FlowGraph.h" #include "StaticProfiler.h" +#include "deadcodeeliminator.h" #ifdef _WIN32 #define snprintf _snprintf @@ -110,6 +111,25 @@ } 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 OptPass::fixupSsa(IRManager& irm) { static CountTime fixupSsaTimer("opt::helper::fixupSsa"); static uint32 globalSsaFixupCounter = 0; Index: trunk/vm/jitrino/src/optimizer/optpass.h =================================================================== --- trunk/vm/jitrino/src/optimizer/optpass.h (revision 601217) +++ trunk/vm/jitrino/src/optimizer/optpass.h (working copy) @@ -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); Index: trunk/vm/jitrino/src/optimizer/throwopt.cpp =================================================================== --- trunk/vm/jitrino/src/optimizer/throwopt.cpp (revision 601217) +++ trunk/vm/jitrino/src/optimizer/throwopt.cpp (working copy) @@ -57,6 +57,7 @@ const Nodes& nodes = flowGraph.getNodes(); StlVector visited_nodes(irManager.getMemoryManager(), flowGraph.getMaxNodeId(), false); StlVector pseudo_insts(irManager.getMemoryManager(), 10); + StlVector exception_edges(irManager.getMemoryManager()); LoopTree * loop_tree = irManager.getLoopTree(); bool restore_ssa = false; @@ -149,6 +150,11 @@ // 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( @@ -205,7 +211,17 @@ } } - if (restore_ssa) { + if (restore_ssa) { + // Remove all remembered exception edges. + for (StlVector::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 +229,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(); + } } }