MIRNamerPass.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. //===----------------------- MIRNamer.cpp - MIR Namer ---------------------===//
  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. // The purpose of this pass is to rename virtual register operands with the goal
  10. // of making it easier to author easier to read tests for MIR. This pass reuses
  11. // the vreg renamer used by MIRCanonicalizerPass.
  12. //
  13. // Basic Usage:
  14. //
  15. // llc -o - -run-pass mir-namer example.mir
  16. //
  17. //===----------------------------------------------------------------------===//
  18. #include "MIRVRegNamerUtils.h"
  19. #include "llvm/ADT/PostOrderIterator.h"
  20. #include "llvm/ADT/STLExtras.h"
  21. #include "llvm/CodeGen/MachineFunctionPass.h"
  22. #include "llvm/CodeGen/MachineInstrBuilder.h"
  23. #include "llvm/CodeGen/MachineRegisterInfo.h"
  24. #include "llvm/CodeGen/Passes.h"
  25. using namespace llvm;
  26. namespace llvm {
  27. extern char &MIRNamerID;
  28. } // namespace llvm
  29. #define DEBUG_TYPE "mir-namer"
  30. namespace {
  31. class MIRNamer : public MachineFunctionPass {
  32. public:
  33. static char ID;
  34. MIRNamer() : MachineFunctionPass(ID) {}
  35. StringRef getPassName() const override {
  36. return "Rename virtual register operands";
  37. }
  38. void getAnalysisUsage(AnalysisUsage &AU) const override {
  39. AU.setPreservesCFG();
  40. MachineFunctionPass::getAnalysisUsage(AU);
  41. }
  42. bool runOnMachineFunction(MachineFunction &MF) override {
  43. bool Changed = false;
  44. if (MF.empty())
  45. return Changed;
  46. NamedVRegCursor NVC(MF.getRegInfo());
  47. ReversePostOrderTraversal<MachineBasicBlock *> RPOT(&*MF.begin());
  48. for (auto &MBB : RPOT)
  49. Changed |= NVC.renameVRegs(MBB);
  50. return Changed;
  51. }
  52. };
  53. } // end anonymous namespace
  54. char MIRNamer::ID;
  55. char &llvm::MIRNamerID = MIRNamer::ID;
  56. INITIALIZE_PASS_BEGIN(MIRNamer, "mir-namer", "Rename Register Operands", false,
  57. false)
  58. INITIALIZE_PASS_END(MIRNamer, "mir-namer", "Rename Register Operands", false,
  59. false)