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; MIRNamer()41 MIRNamer() : MachineFunctionPass(ID) {} 42 getPassName() const43 StringRef getPassName() const override { 44 return "Rename virtual register operands"; 45 } 46 getAnalysisUsage(AnalysisUsage & AU) const47 void getAnalysisUsage(AnalysisUsage &AU) const override { 48 AU.setPreservesCFG(); 49 MachineFunctionPass::getAnalysisUsage(AU); 50 } 51 runOnMachineFunction(MachineFunction & MF)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 unsigned BBIndex = 0; 61 ReversePostOrderTraversal<MachineBasicBlock *> RPOT(&*MF.begin()); 62 for (auto &MBB : RPOT) 63 Changed |= Renamer.renameVRegs(MBB, BBIndex++); 64 65 return Changed; 66 } 67 }; 68 69 } // end anonymous namespace 70 71 char MIRNamer::ID; 72 73 char &llvm::MIRNamerID = MIRNamer::ID; 74 75 INITIALIZE_PASS_BEGIN(MIRNamer, "mir-namer", "Rename Register Operands", false, 76 false) 77 78 INITIALIZE_PASS_END(MIRNamer, "mir-namer", "Rename Register Operands", false, 79 false) 80