| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using System.Collections.Generic;
- namespace ARMeilleure.IntermediateRepresentation
- {
- class BasicBlock : IIntrusiveListNode<BasicBlock>
- {
- public int Index { get; set; }
- public BasicBlock ListPrevious { get; set; }
- public BasicBlock ListNext { get; set; }
- public IntrusiveList<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 IntrusiveList<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;
- }
- }
- }
|