diff options
Diffstat (limited to 'ARMeilleure/Translation/ControlFlowGraph.cs')
-rw-r--r-- | ARMeilleure/Translation/ControlFlowGraph.cs | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/ARMeilleure/Translation/ControlFlowGraph.cs b/ARMeilleure/Translation/ControlFlowGraph.cs index 34963534..ee1a245e 100644 --- a/ARMeilleure/Translation/ControlFlowGraph.cs +++ b/ARMeilleure/Translation/ControlFlowGraph.cs @@ -7,26 +7,37 @@ namespace ARMeilleure.Translation { class ControlFlowGraph { + private BasicBlock[] _postOrderBlocks; + private int[] _postOrderMap; + public BasicBlock Entry { get; } public IntrusiveList<BasicBlock> Blocks { get; } - public BasicBlock[] PostOrderBlocks { get; } - public int[] PostOrderMap { get; } + public BasicBlock[] PostOrderBlocks => _postOrderBlocks; + public int[] PostOrderMap => _postOrderMap; public ControlFlowGraph(BasicBlock entry, IntrusiveList<BasicBlock> blocks) { Entry = entry; Blocks = blocks; - RemoveUnreachableBlocks(blocks); + Update(removeUnreachableBlocks: true); + } + + public void Update(bool removeUnreachableBlocks) + { + if (removeUnreachableBlocks) + { + RemoveUnreachableBlocks(Blocks); + } var visited = new HashSet<BasicBlock>(); var blockStack = new Stack<BasicBlock>(); - PostOrderBlocks = new BasicBlock[blocks.Count]; - PostOrderMap = new int[blocks.Count]; + Array.Resize(ref _postOrderBlocks, Blocks.Count); + Array.Resize(ref _postOrderMap, Blocks.Count); - visited.Add(entry); - blockStack.Push(entry); + visited.Add(Entry); + blockStack.Push(Entry); int index = 0; |