Browse Source

Moved some of the optimizations into the while(modified) loop

pull/100/head
David Srbecký 16 years ago
parent
commit
17f68f450f
  1. 57
      ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs
  2. 2
      ICSharpCode.Decompiler/ILAst/ILInlining.cs
  3. 2
      ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs

57
ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

@ -21,7 +21,7 @@ namespace ICSharpCode.Decompiler.ILAst @@ -21,7 +21,7 @@ namespace ICSharpCode.Decompiler.ILAst
SimplifyShortCircuit,
SimplifyTernaryOperator,
SimplifyNullCoalescing,
JointBasicBlocks,
JoinBasicBlocks,
TransformDecimalCtorToConstant,
SimplifyLdObjAndStObj,
TransformArrayInitializers,
@ -101,43 +101,31 @@ namespace ICSharpCode.Decompiler.ILAst @@ -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<ILBlock>()) {
// 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<ILBlock>()) {
new LoopsAndConditions(context).FindLoops(block);
@ -575,6 +563,7 @@ namespace ICSharpCode.Decompiler.ILAst @@ -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;

2
ICSharpCode.Decompiler/ILAst/ILInlining.cs

@ -81,7 +81,7 @@ namespace ICSharpCode.Decompiler.ILAst @@ -81,7 +81,7 @@ namespace ICSharpCode.Decompiler.ILAst
{
bool modified = false;
List<ILNode> 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)) {

2
ICSharpCode.Decompiler/ILAst/SimpleControlFlow.cs

@ -231,7 +231,7 @@ namespace ICSharpCode.Decompiler.ILAst @@ -231,7 +231,7 @@ namespace ICSharpCode.Decompiler.ILAst
}
}
public bool JointBasicBlocks(List<ILNode> body, ILBasicBlock head, int pos)
public bool JoinBasicBlocks(List<ILNode> body, ILBasicBlock head, int pos)
{
ILLabel nextLabel;
ILBasicBlock nextBB;

Loading…
Cancel
Save