Index: trunk/vm/jitrino/src/optimizer/inliner.cpp =================================================================== --- trunk/vm/jitrino/src/optimizer/inliner.cpp (revision 568557) +++ trunk/vm/jitrino/src/optimizer/inliner.cpp (working copy) @@ -34,6 +34,7 @@ #include "JavaByteCodeParser.h" #include "StaticProfiler.h" #include "optimizer.h" +#include "deadcodeeliminator.h" namespace Jitrino { @@ -79,7 +80,8 @@ _currentByteSize(irm.getMethodDesc().getByteCodeSize()), _inlineTree(new (mm) InlineNode(irm, 0, 0)), translatorAction(NULL), inlinePragma(NULL), - usePriorityQueue(_usePriorityQueue), inlinerPipelineName(inlinePipeline), connectEarly(true) + usePriorityQueue(_usePriorityQueue), inlinerPipelineName(inlinePipeline), + connectEarly(true), isPseudoThrowInserted(false) { const char* translatorName = argSource->getStringArg("translatorActionName", "translator"); @@ -854,6 +856,7 @@ if (inlinedFlowGraph.getUnwindNode() == NULL) { // Replace original call with PseudoThrow to keep graph topology. callNode->appendInst(_instFactory.makePseudoThrow()); + isPseudoThrowInserted = true; } else { // Inlined graph has exception path so just remove original edge. parentCFG.removeEdge(callNode->getExceptionEdge()); @@ -1153,6 +1156,11 @@ //inline current region inlineRegion(regionNode); } while (true); + + if (isPseudoThrowInserted) { + DeadCodeEliminator dce(_toplevelIRM); + dce.removeExtraPseudoThrow(); + } } void Inliner::compileAndConnectRegion(InlineNode* inlineNode, CompilationContext& inlineCC) { Index: trunk/vm/jitrino/src/optimizer/inliner.h =================================================================== --- trunk/vm/jitrino/src/optimizer/inliner.h (revision 568557) +++ trunk/vm/jitrino/src/optimizer/inliner.h (working copy) @@ -207,6 +207,7 @@ bool usePriorityQueue; const char* inlinerPipelineName; bool connectEarly; + bool isPseudoThrowInserted; };