| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using System.Collections.Generic;
- namespace ARMeilleure.IntermediateRepresentation
- {
- class BasicBlock
- {
- public int Index { get; set; }
- public LinkedListNode<BasicBlock> Node { get; set; }
- public LinkedList<Node> Operations { get; }
- private BasicBlock _next;
- private BasicBlock _branch;
- public BasicBlock Next
- {
- get => _next;
- set => _next = AddSuccessor(_next, value);
- }
- public BasicBlock Branch
- {
- get => _branch;
- set => _branch = AddSuccessor(_branch, value);
- }
- public List<BasicBlock> Predecessors { get; }
- public HashSet<BasicBlock> DominanceFrontiers { get; }
- public BasicBlock ImmediateDominator { get; set; }
- public BasicBlock()
- {
- Operations = new LinkedList<Node>();
- Predecessors = new List<BasicBlock>();
- DominanceFrontiers = new HashSet<BasicBlock>();
- Index = -1;
- }
- public BasicBlock(int index) : this()
- {
- Index = index;
- }
- private BasicBlock AddSuccessor(BasicBlock oldBlock, BasicBlock newBlock)
- {
- oldBlock?.Predecessors.Remove(this);
- newBlock?.Predecessors.Add(this);
- return newBlock;
- }
- public void Append(Node node)
- {
- // If the branch block is not null, then the list of operations
- // should end with a branch instruction. We insert the new operation
- // before this branch.
- if (_branch != null || (Operations.Last != null && IsLeafBlock()))
- {
- Operations.AddBefore(Operations.Last, node);
- }
- else
- {
- Operations.AddLast(node);
- }
- }
- private bool IsLeafBlock()
- {
- return _branch == null && _next == null;
- }
- public Node GetLastOp()
- {
- return Operations.Last?.Value;
- }
- }
- }
|