TailDuplication.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //===- TailDuplication.cpp - Duplicate blocks into predecessors' tails ----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. /// \file This pass duplicates basic blocks ending in unconditional branches
  10. /// into the tails of their predecessors, using the TailDuplicator utility
  11. /// class.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
  15. #include "llvm/CodeGen/MachineFunction.h"
  16. #include "llvm/CodeGen/MachineFunctionPass.h"
  17. #include "llvm/CodeGen/MachineRegisterInfo.h"
  18. #include "llvm/CodeGen/Passes.h"
  19. #include "llvm/CodeGen/TailDuplicator.h"
  20. #include "llvm/Pass.h"
  21. using namespace llvm;
  22. #define DEBUG_TYPE "tailduplication"
  23. namespace {
  24. class TailDuplicateBase : public MachineFunctionPass {
  25. TailDuplicator Duplicator;
  26. bool PreRegAlloc;
  27. public:
  28. TailDuplicateBase(char &PassID, bool PreRegAlloc)
  29. : MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
  30. bool runOnMachineFunction(MachineFunction &MF) override;
  31. void getAnalysisUsage(AnalysisUsage &AU) const override {
  32. AU.addRequired<MachineBranchProbabilityInfo>();
  33. MachineFunctionPass::getAnalysisUsage(AU);
  34. }
  35. };
  36. class TailDuplicate : public TailDuplicateBase {
  37. public:
  38. static char ID;
  39. TailDuplicate() : TailDuplicateBase(ID, false) {
  40. initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
  41. }
  42. };
  43. class EarlyTailDuplicate : public TailDuplicateBase {
  44. public:
  45. static char ID;
  46. EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
  47. initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
  48. }
  49. };
  50. } // end anonymous namespace
  51. char TailDuplicate::ID;
  52. char EarlyTailDuplicate::ID;
  53. char &llvm::TailDuplicateID = TailDuplicate::ID;
  54. char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
  55. INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
  56. INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
  57. "Early Tail Duplication", false, false)
  58. bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
  59. if (skipFunction(MF.getFunction()))
  60. return false;
  61. auto MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
  62. Duplicator.initMF(MF, PreRegAlloc, MBPI, /*LayoutMode=*/false);
  63. bool MadeChange = false;
  64. while (Duplicator.tailDuplicateBlocks())
  65. MadeChange = true;
  66. return MadeChange;
  67. }