Browse Source

Slightly reduce the number of generated basic blocks

pull/70/head
David Srbecký 15 years ago
parent
commit
194238586d
  1. 16
      ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

16
ICSharpCode.Decompiler/ILAst/ILAstOptimizer.cs

@ -12,6 +12,7 @@ namespace Decompiler.ControlFlow
public enum ILAstOptimizationStep public enum ILAstOptimizationStep
{ {
SplitToMovableBlocks, SplitToMovableBlocks,
ShortCircuits,
FindLoops, FindLoops,
FindConditions, FindConditions,
FlattenNestedMovableBlocks, FlattenNestedMovableBlocks,
@ -33,6 +34,7 @@ namespace Decompiler.ControlFlow
SplitToBasicBlocks(block); SplitToBasicBlocks(block);
} }
if (abortBeforeStep == ILAstOptimizationStep.ShortCircuits) return;
OptimizeShortCircuits(method); OptimizeShortCircuits(method);
if (abortBeforeStep == ILAstOptimizationStep.FindLoops) return; if (abortBeforeStep == ILAstOptimizationStep.FindLoops) return;
@ -100,24 +102,23 @@ namespace Decompiler.ControlFlow
ILNode lastNode = block.Body[i - 1]; ILNode lastNode = block.Body[i - 1];
ILNode currNode = block.Body[i]; ILNode currNode = block.Body[i];
bool added = false;
// Insert split // Insert split
if (currNode is ILLabel || if (currNode is ILLabel ||
lastNode is ILTryCatchBlock || lastNode is ILTryCatchBlock ||
currNode is ILTryCatchBlock || currNode is ILTryCatchBlock ||
(lastNode is ILExpression) && ((ILExpression)lastNode).IsBranch() || (lastNode is ILExpression) && ((ILExpression)lastNode).IsBranch() ||
(currNode is ILExpression) && (((ILExpression)currNode).IsBranch() && basicBlock.Body.Count > 0)) (currNode is ILExpression) && (((ILExpression)currNode).IsBranch() && ((ILExpression)currNode).Code.CanFallThough() && basicBlock.Body.Count > 0))
{ {
ILBasicBlock lastBlock = basicBlock; ILBasicBlock lastBlock = basicBlock;
basicBlock = new ILBasicBlock(); basicBlock = new ILBasicBlock();
basicBlocks.Add(basicBlock); basicBlocks.Add(basicBlock);
if (currNode is ILLabel) { if (currNode is ILLabel) {
// Reuse the first label // Insert as entry label
basicBlock.EntryLabel = (ILLabel)currNode; basicBlock.EntryLabel = (ILLabel)currNode;
added = true;
} else { } else {
basicBlock.EntryLabel = new ILLabel() { Name = "Block_" + (nextBlockIndex++) }; basicBlock.EntryLabel = new ILLabel() { Name = "Block_" + (nextBlockIndex++) };
basicBlock.Body.Add(currNode);
} }
// Explicit branch from one block to other // Explicit branch from one block to other
@ -125,10 +126,9 @@ namespace Decompiler.ControlFlow
if (!(lastNode is ILExpression) || ((ILExpression)lastNode).Code.CanFallThough()) { if (!(lastNode is ILExpression) || ((ILExpression)lastNode).Code.CanFallThough()) {
lastBlock.FallthoughGoto = new ILExpression(ILCode.Br, basicBlock.EntryLabel); lastBlock.FallthoughGoto = new ILExpression(ILCode.Br, basicBlock.EntryLabel);
} }
} else {
basicBlock.Body.Add(currNode);
} }
if (!added)
basicBlock.Body.Add(currNode);
} }
} }

Loading…
Cancel
Save