BasicBlock.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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 bool Reachable => Index == 0 || Predecessors.Count != 0;
  22. public List<BasicBlock> Predecessors { get; }
  23. public HashSet<BasicBlock> DominanceFrontiers { get; }
  24. public BasicBlock ImmediateDominator { get; set; }
  25. public BasicBlock()
  26. {
  27. Operations = new LinkedList<INode>();
  28. Predecessors = new List<BasicBlock>();
  29. DominanceFrontiers = new HashSet<BasicBlock>();
  30. }
  31. public BasicBlock(int index) : this()
  32. {
  33. Index = index;
  34. }
  35. private BasicBlock AddSuccessor(BasicBlock oldBlock, BasicBlock newBlock)
  36. {
  37. oldBlock?.Predecessors.Remove(this);
  38. newBlock?.Predecessors.Add(this);
  39. return newBlock;
  40. }
  41. public INode GetLastOp()
  42. {
  43. return Operations.Last?.Value;
  44. }
  45. }
  46. }