From 17f68f450fa3fd0dce653fe234e4f50d9d554151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Srbeck=C3=BD?= Date: Sat, 19 Mar 2011 02:13:49 +0000 Subject: [PATCH] Moved some of the optimizations into the while(modified) loop --- .../ILAst/ILAstOptimizer.cs | 57 ++++++++----------- ICSharpCode.Decompiler/ILAst/ILInlining.cs | 2 +- .../ILAst/SimpleControlFlow.cs | 2 +- 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs index 73022bdf5..bee81e32e 100644 --- a/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs +++ b/ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs @@ -21,7 +21,7 @@ namespace ICSharpCode.Decompiler.ILAst SimplifyShortCircuit, SimplifyTernaryOperator, SimplifyNullCoalescing, - JointBasicBlocks, + JoinBasicBlocks, TransformDecimalCtorToConstant, SimplifyLdObjAndStObj, TransformArrayInitializers, @@ -101,43 +101,31 @@ namespace ICSharpCode.Decompiler.ILAst if (abortBeforeStep == ILAstOptimizationStep.SimplifyNullCoalescing) return; modified |= block.RunOptimization(new SimpleControlFlow(context, method).SimplifyNullCoalescing); - if (abortBeforeStep == ILAstOptimizationStep.JointBasicBlocks) return; - modified |= block.RunOptimization(new SimpleControlFlow(context, method).JointBasicBlocks); + if (abortBeforeStep == ILAstOptimizationStep.JoinBasicBlocks) return; + modified |= block.RunOptimization(new SimpleControlFlow(context, method).JoinBasicBlocks); + + if (abortBeforeStep == ILAstOptimizationStep.TransformDecimalCtorToConstant) return; + modified |= block.RunOptimization(TransformDecimalCtorToConstant); + + if (abortBeforeStep == ILAstOptimizationStep.SimplifyLdObjAndStObj) return; + modified |= block.RunOptimization(SimplifyLdObjAndStObj); + + if (abortBeforeStep == ILAstOptimizationStep.TransformArrayInitializers) return; + modified |= block.RunOptimization(Initializers.TransformArrayInitializers); + + if (abortBeforeStep == ILAstOptimizationStep.TransformCollectionInitializers) return; + modified |= block.RunOptimization(Initializers.TransformCollectionInitializers); + + if (abortBeforeStep == ILAstOptimizationStep.MakeAssignmentExpression) return; + modified |= block.RunOptimization(MakeAssignmentExpression); + + if (abortBeforeStep == ILAstOptimizationStep.InlineVariables2) return; + modified |= new ILInlining(method).InlineAllInBlock(block); + new ILInlining(method).CopyPropagation(); } while(modified); } - ILInlining inlining2 = new ILInlining(method); - inlining2.InlineAllVariables(); - inlining2.CopyPropagation(); - - foreach(ILBlock block in method.GetSelfAndChildrenRecursive()) { - - // Intentionaly outside the while(modifed) loop, - // I will put it there later after more testing - - bool modified = false; - - if (abortBeforeStep == ILAstOptimizationStep.TransformDecimalCtorToConstant) return; - modified |= block.RunOptimization(TransformDecimalCtorToConstant); - - if (abortBeforeStep == ILAstOptimizationStep.SimplifyLdObjAndStObj) return; - modified |= block.RunOptimization(SimplifyLdObjAndStObj); - - if (abortBeforeStep == ILAstOptimizationStep.TransformArrayInitializers) return; - modified |= block.RunOptimization(Initializers.TransformArrayInitializers); - modified |= block.RunOptimization(Initializers.TransformArrayInitializers); - - if (abortBeforeStep == ILAstOptimizationStep.TransformCollectionInitializers) return; - modified |= block.RunOptimization(Initializers.TransformCollectionInitializers); - - if (abortBeforeStep == ILAstOptimizationStep.MakeAssignmentExpression) return; - modified |= block.RunOptimization(MakeAssignmentExpression); - - if (abortBeforeStep == ILAstOptimizationStep.InlineVariables2) return; - modified |= new ILInlining(method).InlineAllInBlock(block); - } - if (abortBeforeStep == ILAstOptimizationStep.FindLoops) return; foreach(ILBlock block in method.GetSelfAndChildrenRecursive()) { new LoopsAndConditions(context).FindLoops(block); @@ -575,6 +563,7 @@ namespace ICSharpCode.Decompiler.ILAst return !mr.Name.StartsWith("get_", StringComparison.Ordinal); case ILCode.Newobj: case ILCode.Newarr: + case ILCode.Stloc: return true; default: return false; diff --git a/ICSharpCode.Decompiler/ILAst/ILInlining.cs b/ICSharpCode.Decompiler/ILAst/ILInlining.cs index 79cf33365..647f035a7 100644 --- a/ICSharpCode.Decompiler/ILAst/ILInlining.cs +++ b/ICSharpCode.Decompiler/ILAst/ILInlining.cs @@ -81,7 +81,7 @@ namespace ICSharpCode.Decompiler.ILAst { bool modified = false; List body = bb.Body; - for(int i = 0; i < body.Count - 1;) { + for(int i = 0; i < body.Count;) { ILVariable locVar; ILExpression expr; if (body[i].Match(ILCode.Stloc, out locVar, out expr) && InlineOneIfPossible(bb.Body, i, aggressive: false)) { diff --git a/ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs b/ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs index c06ecddb8..f8024b5ec 100644 --- a/ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs +++ b/ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs @@ -231,7 +231,7 @@ namespace ICSharpCode.Decompiler.ILAst } } - public bool JointBasicBlocks(List body, ILBasicBlock head, int pos) + public bool JoinBasicBlocks(List body, ILBasicBlock head, int pos) { ILLabel nextLabel; ILBasicBlock nextBB;