BlockPlacement.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using ARMeilleure.IntermediateRepresentation;
  2. using ARMeilleure.Translation;
  3. using System.Diagnostics;
  4. using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
  5. namespace ARMeilleure.CodeGen.Optimizations
  6. {
  7. static class BlockPlacement
  8. {
  9. public static void RunPass(ControlFlowGraph cfg)
  10. {
  11. bool update = false;
  12. BasicBlock block;
  13. BasicBlock nextBlock;
  14. BasicBlock lastBlock = cfg.Blocks.Last;
  15. // Move cold blocks at the end of the list, so that they are emitted away from hot code.
  16. for (block = cfg.Blocks.First; block != lastBlock; block = nextBlock)
  17. {
  18. nextBlock = block.ListNext;
  19. if (block.Frequency == BasicBlockFrequency.Cold)
  20. {
  21. cfg.Blocks.Remove(block);
  22. cfg.Blocks.AddLast(block);
  23. }
  24. }
  25. for (block = cfg.Blocks.First; block != null; block = nextBlock)
  26. {
  27. nextBlock = block.ListNext;
  28. if (block.SuccessorsCount == 2)
  29. {
  30. Operation branchOp = block.Operations.Last;
  31. Debug.Assert(branchOp.Instruction == Instruction.BranchIf);
  32. BasicBlock falseSucc = block.GetSuccessor(0);
  33. BasicBlock trueSucc = block.GetSuccessor(1);
  34. // If true successor is next block in list, invert the condition. We avoid extra branching by
  35. // making the true side the fallthrough (i.e, convert it to the false side).
  36. if (trueSucc == block.ListNext)
  37. {
  38. Comparison comp = (Comparison)branchOp.GetSource(2).AsInt32();
  39. Comparison compInv = comp.Invert();
  40. branchOp.SetSource(2, Const((int)compInv));
  41. block.SetSuccessor(0, trueSucc);
  42. block.SetSuccessor(1, falseSucc);
  43. update = true;
  44. }
  45. }
  46. }
  47. if (update)
  48. {
  49. cfg.Update();
  50. }
  51. }
  52. }
  53. }