xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/MIRNamerPass.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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