18bcb0991SDimitry Andric //===----------------------- MIRNamer.cpp - MIR Namer ---------------------===// 28bcb0991SDimitry Andric // 38bcb0991SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 48bcb0991SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 58bcb0991SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68bcb0991SDimitry Andric // 78bcb0991SDimitry Andric //===----------------------------------------------------------------------===// 88bcb0991SDimitry Andric // 98bcb0991SDimitry Andric // The purpose of this pass is to rename virtual register operands with the goal 108bcb0991SDimitry Andric // of making it easier to author easier to read tests for MIR. This pass reuses 118bcb0991SDimitry Andric // the vreg renamer used by MIRCanonicalizerPass. 128bcb0991SDimitry Andric // 138bcb0991SDimitry Andric // Basic Usage: 148bcb0991SDimitry Andric // 158bcb0991SDimitry Andric // llc -o - -run-pass mir-namer example.mir 168bcb0991SDimitry Andric // 178bcb0991SDimitry Andric //===----------------------------------------------------------------------===// 188bcb0991SDimitry Andric 198bcb0991SDimitry Andric #include "MIRVRegNamerUtils.h" 208bcb0991SDimitry Andric #include "llvm/ADT/PostOrderIterator.h" 218bcb0991SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 22*480093f4SDimitry Andric #include "llvm/InitializePasses.h" 238bcb0991SDimitry Andric 248bcb0991SDimitry Andric using namespace llvm; 258bcb0991SDimitry Andric 268bcb0991SDimitry Andric namespace llvm { 278bcb0991SDimitry Andric extern char &MIRNamerID; 288bcb0991SDimitry Andric } // namespace llvm 298bcb0991SDimitry Andric 308bcb0991SDimitry Andric #define DEBUG_TYPE "mir-namer" 318bcb0991SDimitry Andric 328bcb0991SDimitry Andric namespace { 338bcb0991SDimitry Andric 348bcb0991SDimitry Andric class MIRNamer : public MachineFunctionPass { 358bcb0991SDimitry Andric public: 368bcb0991SDimitry Andric static char ID; MIRNamer()378bcb0991SDimitry Andric MIRNamer() : MachineFunctionPass(ID) {} 388bcb0991SDimitry Andric getPassName() const398bcb0991SDimitry Andric StringRef getPassName() const override { 408bcb0991SDimitry Andric return "Rename virtual register operands"; 418bcb0991SDimitry Andric } 428bcb0991SDimitry Andric getAnalysisUsage(AnalysisUsage & AU) const438bcb0991SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 448bcb0991SDimitry Andric AU.setPreservesCFG(); 458bcb0991SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 468bcb0991SDimitry Andric } 478bcb0991SDimitry Andric runOnMachineFunction(MachineFunction & MF)488bcb0991SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 498bcb0991SDimitry Andric bool Changed = false; 508bcb0991SDimitry Andric 518bcb0991SDimitry Andric if (MF.empty()) 528bcb0991SDimitry Andric return Changed; 538bcb0991SDimitry Andric 54*480093f4SDimitry Andric VRegRenamer Renamer(MF.getRegInfo()); 558bcb0991SDimitry Andric 56*480093f4SDimitry Andric unsigned BBIndex = 0; 578bcb0991SDimitry Andric ReversePostOrderTraversal<MachineBasicBlock *> RPOT(&*MF.begin()); 588bcb0991SDimitry Andric for (auto &MBB : RPOT) 59*480093f4SDimitry Andric Changed |= Renamer.renameVRegs(MBB, BBIndex++); 608bcb0991SDimitry Andric 618bcb0991SDimitry Andric return Changed; 628bcb0991SDimitry Andric } 638bcb0991SDimitry Andric }; 648bcb0991SDimitry Andric 658bcb0991SDimitry Andric } // end anonymous namespace 668bcb0991SDimitry Andric 678bcb0991SDimitry Andric char MIRNamer::ID; 688bcb0991SDimitry Andric 698bcb0991SDimitry Andric char &llvm::MIRNamerID = MIRNamer::ID; 708bcb0991SDimitry Andric 718bcb0991SDimitry Andric INITIALIZE_PASS_BEGIN(MIRNamer, "mir-namer", "Rename Register Operands", false, 728bcb0991SDimitry Andric false) 738bcb0991SDimitry Andric 748bcb0991SDimitry Andric INITIALIZE_PASS_END(MIRNamer, "mir-namer", "Rename Register Operands", false, 758bcb0991SDimitry Andric false) 76