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 19 #include "MIRVRegNamerUtils.h" 20 #include "llvm/ADT/PostOrderIterator.h" 21 #include "llvm/ADT/STLExtras.h" 22 #include "llvm/CodeGen/MachineFunctionPass.h" 23 #include "llvm/CodeGen/MachineInstrBuilder.h" 24 #include "llvm/CodeGen/MachineRegisterInfo.h" 25 #include "llvm/CodeGen/Passes.h" 26 #include "llvm/InitializePasses.h" 27 28 using namespace llvm; 29 30 namespace llvm { 31 extern char &MIRNamerID; 32 } // namespace llvm 33 34 #define DEBUG_TYPE "mir-namer" 35 36 namespace { 37 38 class MIRNamer : public MachineFunctionPass { 39 public: 40 static char ID; 41 MIRNamer() : MachineFunctionPass(ID) {} 42 43 StringRef getPassName() const override { 44 return "Rename virtual register operands"; 45 } 46 47 void getAnalysisUsage(AnalysisUsage &AU) const override { 48 AU.setPreservesCFG(); 49 MachineFunctionPass::getAnalysisUsage(AU); 50 } 51 52 bool runOnMachineFunction(MachineFunction &MF) override { 53 bool Changed = false; 54 55 if (MF.empty()) 56 return Changed; 57 58 VRegRenamer Renamer(MF.getRegInfo()); 59 60 ReversePostOrderTraversal<MachineBasicBlock *> RPOT(&*MF.begin()); 61 for (auto &MBB : RPOT) 62 Changed |= Renamer.renameVRegs(MBB); 63 64 return Changed; 65 } 66 }; 67 68 } // end anonymous namespace 69 70 char MIRNamer::ID; 71 72 char &llvm::MIRNamerID = MIRNamer::ID; 73 74 INITIALIZE_PASS_BEGIN(MIRNamer, "mir-namer", "Rename Register Operands", false, 75 false) 76 77 INITIALIZE_PASS_END(MIRNamer, "mir-namer", "Rename Register Operands", false, 78 false) 79