Browse Source

Run optimization loops backwards (bottom-up)

pull/100/head
David Srbecký 15 years ago
parent
commit
1b8a62fb7c
  1. 16
      ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

16
ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

@ -677,12 +677,9 @@ namespace ICSharpCode.Decompiler.ILAst
{ {
bool modified = false; bool modified = false;
List<ILNode> body = block.Body; List<ILNode> body = block.Body;
for (int i = 0; i < body.Count;) { for (int i = body.Count - 1; i >= 0; i--) {
if (optimization(body, (ILBasicBlock)body[i], i)) { if (i < body.Count && optimization(body, (ILBasicBlock)body[i], i)) {
modified = true; modified = true;
i = Math.Max(0, i - 1); // Go back one step
} else {
i++;
} }
} }
return modified; return modified;
@ -692,13 +689,10 @@ namespace ICSharpCode.Decompiler.ILAst
{ {
bool modified = false; bool modified = false;
foreach (ILBasicBlock bb in block.Body) { foreach (ILBasicBlock bb in block.Body) {
for (int j = 0; j < bb.Body.Count;) { for (int i = bb.Body.Count - 1; i >= 0; i--) {
ILExpression expr = bb.Body[j] as ILExpression; ILExpression expr = bb.Body.ElementAtOrDefault(i) as ILExpression;
if (expr != null && optimization(bb.Body, expr, j)) { if (expr != null && optimization(bb.Body, expr, i)) {
modified = true; modified = true;
j = Math.Max(0, j - 1); // Go back one step
} else {
j++;
} }
} }
} }

Loading…
Cancel
Save