Dominance.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using ARMeilleure.IntermediateRepresentation;
  2. using System.Diagnostics;
  3. namespace ARMeilleure.Translation
  4. {
  5. static class Dominance
  6. {
  7. // Those methods are an implementation of the algorithms on "A Simple, Fast Dominance Algorithm".
  8. // https://www.cs.rice.edu/~keith/EMBED/dom.pdf
  9. public static void FindDominators(ControlFlowGraph cfg)
  10. {
  11. BasicBlock Intersect(BasicBlock block1, BasicBlock block2)
  12. {
  13. while (block1 != block2)
  14. {
  15. while (cfg.PostOrderMap[block1.Index] < cfg.PostOrderMap[block2.Index])
  16. {
  17. block1 = block1.ImmediateDominator;
  18. }
  19. while (cfg.PostOrderMap[block2.Index] < cfg.PostOrderMap[block1.Index])
  20. {
  21. block2 = block2.ImmediateDominator;
  22. }
  23. }
  24. return block1;
  25. }
  26. cfg.Entry.ImmediateDominator = cfg.Entry;
  27. Debug.Assert(cfg.Entry == cfg.PostOrderBlocks[cfg.PostOrderBlocks.Length - 1]);
  28. bool modified;
  29. do
  30. {
  31. modified = false;
  32. for (int blkIndex = cfg.PostOrderBlocks.Length - 2; blkIndex >= 0; blkIndex--)
  33. {
  34. BasicBlock block = cfg.PostOrderBlocks[blkIndex];
  35. BasicBlock newIDom = null;
  36. foreach (BasicBlock predecessor in block.Predecessors)
  37. {
  38. if (predecessor.ImmediateDominator != null)
  39. {
  40. if (newIDom != null)
  41. {
  42. newIDom = Intersect(predecessor, newIDom);
  43. }
  44. else
  45. {
  46. newIDom = predecessor;
  47. }
  48. }
  49. }
  50. if (block.ImmediateDominator != newIDom)
  51. {
  52. block.ImmediateDominator = newIDom;
  53. modified = true;
  54. }
  55. }
  56. }
  57. while (modified);
  58. }
  59. public static void FindDominanceFrontiers(ControlFlowGraph cfg)
  60. {
  61. for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
  62. {
  63. if (block.Predecessors.Count < 2)
  64. {
  65. continue;
  66. }
  67. for (int pBlkIndex = 0; pBlkIndex < block.Predecessors.Count; pBlkIndex++)
  68. {
  69. BasicBlock current = block.Predecessors[pBlkIndex];
  70. while (current != block.ImmediateDominator)
  71. {
  72. current.DominanceFrontiers.Add(block);
  73. current = current.ImmediateDominator;
  74. }
  75. }
  76. }
  77. }
  78. }
  79. }