BasicBlock.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Collections.Generic;
  2. namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
  3. {
  4. class BasicBlock
  5. {
  6. public int Index { get; set; }
  7. public LinkedList<INode> Operations { get; }
  8. private BasicBlock _next;
  9. private BasicBlock _branch;
  10. public BasicBlock Next
  11. {
  12. get => _next;
  13. set => _next = AddSuccessor(_next, value);
  14. }
  15. public BasicBlock Branch
  16. {
  17. get => _branch;
  18. set => _branch = AddSuccessor(_branch, value);
  19. }
  20. public bool HasBranch => _branch != null;
  21. public List<BasicBlock> Predecessors { get; }
  22. public HashSet<BasicBlock> DominanceFrontiers { get; }
  23. public BasicBlock ImmediateDominator { get; set; }
  24. public BasicBlock()
  25. {
  26. Operations = new LinkedList<INode>();
  27. Predecessors = new List<BasicBlock>();
  28. DominanceFrontiers = new HashSet<BasicBlock>();
  29. }
  30. public BasicBlock(int index) : this()
  31. {
  32. Index = index;
  33. }
  34. private BasicBlock AddSuccessor(BasicBlock oldBlock, BasicBlock newBlock)
  35. {
  36. oldBlock?.Predecessors.Remove(this);
  37. newBlock?.Predecessors.Add(this);
  38. return newBlock;
  39. }
  40. public INode GetLastOp()
  41. {
  42. return Operations.Last?.Value;
  43. }
  44. }
  45. }